통계적 유의성
고친 사람 github-actions[bot]
통계적 유의성은 두 값의 차이가 우연한 흔들림만으로는 생기기 어렵다는 판정입니다. 배포 전과 후의 응답 시간처럼 잴 때마다 흔들리는 값을 비교할 때 씁니다. 이 판정이 서야 「정말 달라졌다」고 말할 근거가 생깁니다.
쉽고 빠른 이해
통계적 유의성은 눈에 보인 차이가 우연으로 설명되기 어려운지를 가리는 판정입니다. 새 버전을 올린 뒤 평균 응답 시간이 0.20초에서 0.21초가 됐다고 해 봅니다. 이 0.01초가 코드 탓인지, 잴 때마다 생기는 흔들림인지를 이 판정이 가립니다.
이 판정이 없으면 흔들림을 개선이나 회귀로 잘못 읽습니다. 같은 코드를 두 번 재도 값은 매번 조금씩 다르게 나오기 때문입니다.
- 먼저 「차이가 없다」고 가정합니다
- 그 가정 아래서 지금만큼 큰 차이가 우연히 나올 확률을 계산합니다
- 그 확률이 미리 정한 기준보다 작으면 유의하다고 판정합니다
유의하다는 판정은 차이가 크다는 뜻이 아닙니다. 우연만으로는 설명되기 어렵다는 뜻일 뿐입니다.
판정이 틀릴 때도 있습니다. 기준은 확률 하나로 잡습니다. 이 기준을 0.05로 잡으면 차이가 전혀 없을 때도 스무 번에 한 번꼴로 유의하다는 판정이 나옵니다.
상세
동전을 열 번 던져 앞면이 여섯 번 나오면 아무도 동전을 의심하지 않습니다. 열 번 모두 앞면이 나오면 이야기가 달라집니다. 누구나 한쪽으로 쏠린 동전이 아닌지 들여다봅니다.
통계적 유의성은 이 「의심해 볼 만하다」를 수로 정한 판정입니다. 관찰한 차이가 우연만으로는 좀처럼 나오지 않을 만큼 크면, 그 차이는 통계적으로 유의하다고 말합니다. 우연으로도 흔히 나올 만한 크기면 유의하지 않다고 말합니다.
이 절은 동전 던지기와 응답 시간 두 예를 가지고 판정이 서는 순서를 따라갑니다. 먼저 값이 왜 흔들리는지 봅니다. 그다음 「차이가 없다」는 가정과 그 아래서 계산하는 확률을 봅니다. 이어서 판정이 틀리는 두 방식과 유의성이 말해 주지 않는 것을 봅니다.
잴 때마다 흔들리는 값
같은 서버에 같은 요청을 백 번 보내도 응답 시간은 매번 조금씩 다릅니다. 그 순간 함께 돌던 작업과 네트워크 상태가 매번 다르기 때문입니다. 이런 흔들림은 코드를 한 줄도 안 바꿔도 생깁니다.
그래서 잰 값의 평균도 흔들립니다. 오늘 잰 백 번의 평균과 내일 잰 백 번의 평균은 같은 코드여도 다릅니다. 이렇게 전체 가운데 일부만 뽑아 잰 값의 묶음이 표본입니다. 표본에서 계산한 값은 표본마다 달라집니다.
새 버전을 올린 뒤 평균 응답 시간이 0.20초에서 0.21초가 됐다고 해 봅시다. 이 0.01초가 코드 탓인지 흔들림 탓인지는 차이만 봐서는 모릅니다. 평소 흔들림이 0.001초 안팎이면 0.01초는 큰 차이입니다. 평소 0.05초씩 오르내린다면 0.01초는 흔들림 속에 묻힙니다.
차이의 크기는 평소 흔들림의 폭과 비교해야 뜻이 생깁니다. 잰 값 하나하나가 흩어진 폭은 흔히 표준편차로 잽니다. 통계적 유의성은 이 비교를 확률 하나로 바꿔 판정합니다.
차이가 없다는 가정
판정은 거꾸로 된 질문에서 시작합니다. 「새 버전이 느려졌나」를 바로 묻지 않습니다. 먼저 「아무것도 안 달라졌다」고 가정합니다. 이 가정을 귀무가설이라고 부릅니다.
거꾸로 묻는 까닭은 계산에 있습니다. 「안 달라졌다」는 한 가지 상태로 정해져 있습니다. 그래서 그 상태에서 우연이 어떤 차이를 만드는지 계산할 수 있습니다. 「느려졌다」는 얼마나 느려졌는지가 안 정해져 있어 계산의 출발점이 못 됩니다.
동전에서는 「이 동전은 앞뒤가 반반으로 나온다」가 귀무가설입니다. 응답 시간에서는 「새 버전과 옛 버전의 평균 응답 시간이 같다」가 귀무가설입니다. 반대편인 「달라졌다」는 대립가설이라고 합니다.
가정을 세우고 그 가정을 버릴지 정하는 절차 전체가 가설 검정입니다. 통계적 유의성은 이 절차가 내놓는 판정입니다.
우연으로 그만한 차이가 나올 확률
귀무가설이 맞다고 치고 확률 하나를 계산합니다. 지금 본 결과만큼, 또는 그보다 더 한쪽으로 쏠린 결과가 나올 확률입니다. 이 확률이 p값(p-value)입니다. p 는 확률을 뜻하는 영어 probability 의 머리글자입니다.
동전으로 계산해 봅니다. 반반인 동전을 열 번 던지면 앞뒤가 나오는 순서는 2를 열 번 곱한 1024가지입니다. 그 순서들이 나올 확률은 모두 같습니다. 앞면이 몇 번 이상인 순서가 몇 가지인지 세어 1024로 나누면 p값이 나옵니다.
| 앞면 수 | 그 수 이상인 순서 | p값 |
|---|---|---|
| 6번 | 386가지 | 약 0.38 |
| 8번 | 56가지 | 약 0.055 |
| 9번 | 11가지 | 약 0.011 |
| 10번 | 1가지 | 약 0.001 |
표의 첫 줄과 마지막 줄을 봅니다. 앞면 여섯 번 이상은 반반인 동전으로도 열 번에 네 번꼴로 나옵니다. 열 번 모두 앞면은 천 번에 한 번꼴입니다. p값이 작을수록 「차이가 없다」는 가정 아래서는 보기 드문 결과입니다.
응답 시간처럼 이어진 값은 동전처럼 경우를 셀 수 없습니다. 그 대신 평균이 얼마나 흔들리는지를 씁니다.
평균의 흔들림은 앞에서 본 표준편차와 다릅니다. 표준편차는 잰 값 하나하나가 흩어진 폭입니다. 평균의 흔들림은 표본을 다시 뽑을 때마다 평균이 오르내리는 폭입니다. 이 폭은 표본이 클수록 작아집니다.
두 평균의 차이를 이 평균의 흔들림 폭으로 나눈 값을 만듭니다. 차이가 평소 흔들림의 몇 배인지를 나타내는 값입니다. 이렇게 판정에 쓰려고 만든 값을 검정 통계량이라고 합니다.
차이가 없다면 이 값은 대개 0 가까이에 떨어집니다. 어느 범위에 주로 떨어지는지도 계산으로 미리 알려져 있습니다. 지금 값이 그 범위에서 바깥쪽으로 멀수록 p값이 작아집니다. 두 평균을 비교할 때 흔히 쓰는 이 방법이 t 검정입니다.
미리 정하는 기준
p값이 얼마나 작아야 유의하다고 할지는 따로 정합니다. 이 기준이 유의 수준입니다. 그리스 문자 알파(α)로 적습니다. p값이 유의 수준보다 작으면 귀무가설을 버립니다. 그리고 차이가 유의하다고 판정합니다.
유의 수준은 관례로 0.05를 가장 많이 씁니다. 더 엄격하게 볼 때는 0.01을 씁니다. 동전 표에 0.05를 대 보면 앞면 아홉 번과 열 번은 기준보다 작아 유의합니다. 여덟 번은 약 0.055라서 기준을 조금 넘습니다. 그래서 유의하지 않습니다.
기준은 결과를 보기 전에 정합니다. p값을 보고 나서 선을 옮기면 원하는 결론에 맞춰 선을 긋게 됩니다. 그러면 판정이 아무것도 걸러 내지 못합니다.
지금까지 본 순서를 그림 하나로 모읍니다.
flowchart TD
A["차이가 없다고 가정한다 · 귀무가설"] --> B["그 가정 아래서 p값을 계산한다"]
B --> C{"p값이 유의 수준보다 작은가"}
C -->|"작다"| D["귀무가설을 버린다 · 유의하다"]
C -->|"작지 않다"| E["흔들림으로도 설명된다 · 유의하지 않다"]
판정이 틀리는 두 방식
p값으로 내린 판정도 틀릴 수 있습니다. 차이가 없는데 유의하다고 판정하는 것이 1종 오류입니다. 차이가 있는데 유의하지 않다고 판정하는 것이 2종 오류입니다.
| 판정 | 진짜 차이가 없을 때 | 진짜 차이가 있을 때 |
|---|---|---|
| 유의하다 | 1종 오류 | 맞게 잡았다 |
| 유의하지 않다 | 맞게 넘겼다 | 2종 오류 |
표에서 오류 두 칸은 대각선으로 놓입니다. 1종 오류가 날 확률은 유의 수준과 같습니다. 유의 수준을 0.05로 잡으면 차이가 없을 때도 스무 번에 한 번꼴로 유의하다는 판정이 나옵니다. 성능 감시라면 이것이 오경보입니다.
유의 수준을 낮추면 1종 오류는 줄어듭니다. 그 대신 작은 차이를 놓치는 2종 오류가 늘어납니다. 한쪽을 줄이면 다른 쪽이 늘어나는 관계입니다.
차이가 있을 때 그것을 잡아내는 확률이 검정력입니다. 유의 수준을 그대로 두고 표본을 늘리면 검정력이 올라갑니다. 표본이 클수록 평균의 흔들림이 줄어 작은 차이도 드러나기 때문입니다.
유의성이 말해 주지 않는 것
유의하다는 판정은 차이가 크다는 뜻이 아닙니다. 차이가 우연만으로는 설명되기 어렵다는 뜻일 뿐입니다. 표본이 아주 크면 평균의 흔들림이 아주 작아집니다. 그러면 0.0001초 같은 작은 차이도 유의하게 나옵니다.
그래서 차이가 얼마나 큰지는 따로 봅니다. 차이의 크기를 재는 값이 효과 크기입니다. 평균이 0.20초에서 0.21초가 됐다면 두 평균의 차이 0.01초가 가장 단순한 효과 크기입니다.
통계적 유의성과 구별해, 차이가 실제로 문제 될 만큼 큰지를 실무적 유의성이라고 합니다. 성능이라면 사용자가 느낄 만큼 큰지가 기준입니다. 통계적으로도 유의하고 실무적으로도 유의할 때 대응할 일이 됩니다.
차이의 크기와 흔들림을 한 번에 보여 주는 방법이 신뢰 구간입니다. 「느려진 정도는 0.005초에서 0.015초 사이일 것이다」처럼 범위로 적습니다. 차이가 0이면 안 달라졌다는 뜻입니다. 그래서 이 범위가 0을 포함하지 않으면 차이가 유의하다는 판정과 대개 같은 결론이 나옵니다.
유의하지 않다는 판정도 차이가 없다는 뜻이 아닙니다. 표본이 작아 흔들림이 크면 있는 차이도 못 잡습니다. 「이번 측정으로는 차이를 가려내지 못했다」가 맞는 읽기입니다.
p값을 「귀무가설이 맞을 확률」로 읽는 것도 흔한 오해입니다. p값 0.05는 「차이가 없을 확률이 0.05」가 아닙니다. 「차이가 없다면 이만한 결과가 나올 확률이 0.05」입니다. 조건과 결과의 방향이 반대입니다.
여러 번 검사할 때
지표 스무 개를 한꺼번에 검사한다고 해 봅시다. 하나하나를 유의 수준 0.05로 판정하면, 아무것도 안 달라졌어도 지표마다 스무 번에 한 번꼴로 1종 오류가 납니다. 지표끼리 서로 영향을 주지 않는다고 치면, 스무 개 가운데 적어도 하나가 유의하게 나올 확률은 약 0.64입니다.
검사를 여러 번 할수록 1종 오류가 쌓이는 이 문제를 다중 비교 문제라고 부릅니다. 검사가 많을수록 어딘가 하나는 우연만으로 유의하게 나옵니다.
가장 단순한 대응은 기준을 검사 수로 나누는 것입니다. 스무 개를 검사하면 0.05를 20으로 나눈 0.0025를 기준으로 씁니다. 이 방법이 본페로니 보정입니다.
성능 측정에서 쓰는 모습
성능 회귀를 가려낼 때 통계적 유의성은 흔들림을 걸러 냅니다. 바꾸기 전과 후를 한 번씩만 재면 흔들림의 폭을 알 수 없습니다. 그래서 양쪽을 여러 번 재 두 표본을 만듭니다. 그리고 그 차이가 유의한지 봅니다.
유의하다고 바로 회귀로 치지는 않습니다. 앞에서 본 대로 유의성은 차이의 크기를 말하지 않습니다. 차이가 유의하면서 미리 정한 허용 폭도 넘을 때 회귀로 봅니다.
제품의 두 판을 사용자에게 나눠 보여 주는 A/B 테스트도 같은 판정을 씁니다. 두 판의 전환율이 얼마나 다른지 비교합니다. 전환율은 구매나 가입까지 간 사용자의 비율입니다. 그 차이가 흔들림을 넘는지를 이 판정으로 가립니다.
관련 항목
통계적 유의성을 판정하는 절차와 값
가설 검정 · 귀무가설 · 대립가설 · p값 · 유의 수준 · 검정 통계량
통계적 유의성 판정에 쓰는 검정 방법
t 검정 · 카이제곱 검정 · 맨-휘트니 U 검정 · 순열 검정 · 부트스트랩
통계적 유의성 판정이 빠지는 오류와 보정
1종 오류 · 2종 오류 · 검정력 · 다중 비교 · 본페로니 보정 · p-해킹
통계적 유의성과 함께 읽는 차이의 크기 지표
효과 크기 · 신뢰 구간 · 실무적 유의성 · 표준 오차 · 표본 크기
통계적 유의성으로 흔들림을 걸러 내는 측정
벤치마크 · 성능 회귀 · A/B 테스트 · 응답 시간 · 측정 오차 · 성능 기준선
통계적 유의성 판정의 바탕이 되는 개념
표본 · 모집단 · 평균 · 표준편차 · 확률 분포 · 정규 분포 · 중심 극한 정리
통계적 유의성이 속하는 상위 분야
다른 이름: statistical significance · 유의성 · 통계적으로 유의하다 · 유의미한 차이