19강 / 20강

p값을 손으로 만들기 — 순열검정

공식을 믿지 못하겠다면 섞어 보면 된다

p값을 손으로 만들기 — 순열검정
라벨을 마구 섞어 "아무 관계도 없을 때" 의 세상을 수천 개 만들고, 우리 결과가 그중 어디쯤인지 봅니다.

14강에서 z 를 구하고 2 × norm.sf(|z|) 로 p값을 얻었습니다. 이 한 줄에는 큰 가정이 숨어 있어요 — z 가 표준정규분포를 따른다는 가정입니다.

이 가정은 표본이 충분히 크고 조건이 맞을 때 성립합니다. 그런데 우리 자료가 그런지 어떻게 알까요?

직접 만들어 보면 됩니다.

위암은 14강에서 p = 0.87 이었습니다 — 아무것도 없는 자리예요. 귀무가설이 참인 상황을 관찰하기에 좋습니다.
Python 브라우저에서 실행
평균 0.01, 표준편차 0.95, 꼬리 4.5%. 이론값(0, 1, 5%)에 충분히 가깝습니다 — 정규 근사를 써도 되겠다는 증거를 우리 손으로 만든 셈이에요.
Python 브라우저에서 실행
"섞은 뒤" 를 눌러 보세요. 보라색 선이 실제 z, 붉은 칸이 그만큼 극단적인 결과들입니다.
불러오는 중…
흑색종의 z 는 섞은 1,000번 중 한 번도 나오지 않습니다. 순열 p < 0.001.
Python 브라우저에서 실행

순열검정의 진짜 힘은 여기에 있습니다 — 어떤 절차든 통째로 섞어 넣을 수 있다는 점.

15강의 cutoff hacking 을 기억하세요. 열일곱 자리에서 잘라 보고 가장 좋은 p 를 고르는 절차 말입니다. 그 절차의 p값은 공식으로 구할 수 없어요. 하지만 순열로는 구할 수 있습니다 —

  1. 라벨을 섞는다
  2. 섞은 자료에서 열일곱 자리를 다 시험하고 가장 작은 p 를 고른다
  3. 이것을 1,000번 되풀이해 "최선의 p" 들의 분포를 얻는다
  4. 우리의 "최선의 p" 가 그 분포에서 얼마나 극단적인지 본다

이렇게 하면 탐색까지 포함한 정직한 p값이 나옵니다. 계산은 오래 걸리지만, 원리는 위에서 한 것과 똑같아요.

🤔 확인 문제
순열검정에서 라벨을 섞는 행위가 만들어 내는 세상은?
🤔 확인 문제
순열검정을 써야 할 이유로 가장 강한 것은?