178강부터 180강까지는 결과가 수인 자료를 다뤘습니다. 이제 결과가 범주입니다.
평균도 순위도 못 씁니다. 합격에 을 주고 평균을 내는 것이 아주 이상한 일은 아니지만, 등급이 셋 이상이면 번호를 매기는 순간 없는 간격을 만들어 냅니다.
셀 수만 있는 자료에서 무엇을 견줄지가 이 강의의 물음입니다.
| 무엇이 있는가 | 무엇을 견주는가 |
|---|---|
| 관측도수 | 실제로 몇 개가 어디에 |
| 기대도수 | 무관하다면 몇 개였을지 |
둘의 거리를 재는 것이 전부입니다. 167강에서 만든 교차표로 돌아가, 무관하다면 각 칸에 몇 개가 있었어야 하는지 계산하고 실제와 견줍니다.
그리고 그 거리가 왜 카이제곱 분포를 따르는지를 문제 2에서 확인합니다.
문제. 교차표를 검정합니다.
(1) 기대도수를 계산하세요.
(2) 카이제곱 통계량과 값을 구하세요.
(3) 자유도가 왜 그 값인지 설명하세요.
생각의 실마리. "무관하다"를 수식으로 적으면 입니다. 각 칸의 확률이 행 확률과 열 확률의 곱이라는 뜻이며, 거기에 전체 수를 곱하면 기대도수가 나옵니다.
풀이. (1) 나이대와 클릭 여부의 교차표입니다.
| 나이대 | 클릭 | 이탈 | 합 |
|---|---|---|---|
| 대 | |||
| 대 | |||
| 대 | |||
| 합 |
전체 클릭률은 입니다. 무관하다면 **모든 나이대에서 클릭률이 **여야 합니다.
| 칸 | 관측 | 기대 | 차이 | 차이제곱/기대 |
|---|---|---|---|---|
| 대 클릭 | ||||
| 대 이탈 | ||||
| 대 클릭 | ||||
| 대 이탈 | ||||
| 대 클릭 | ||||
| 대 이탈 |
같은 행의 두 차이가 크기는 같고 부호만 반대입니다. 행합이 고정되어 있으므로 한쪽이 넘치면 다른 쪽이 모자랍니다.
(2) 마지막 열을 전부 더합니다.
자유도는 이고 값은 입니다. 기각에 필요한 값이 이므로 기각하지 못합니다.
기대도수로 나누는 것이 핵심입니다. 기대가 인 칸에서 가 어긋나는 것과 기대가 인 칸에서 가 어긋나는 것은 전혀 다른 일이며, 나눗셈이 그것을 반영합니다.
(3) 자유도를 셉니다.
| 무엇이 정해져 있는가 | 몇 개 |
|---|---|
| 칸의 수 | |
| 행합 제약을 뺌 | |
| 열합 제약을 뺌 | |
| 겹치는 제약 하나를 되돌림 | |
| 남는 자유도 |
입니다. 행합과 열합을 자료에서 추정했으므로 그만큼 자유도를 빼는데, 행합의 합과 열합의 합이 둘 다 전체합이라 제약 하나가 겹칩니다.
칸 두 개만 정하면 나머지 네 개가 자동으로 채워집니다. 이것이 자유도가 라는 말의 뜻입니다.
이 문제에서 배우는 것. 기대도수는 가설이 만든 숫자이지 자료에 있는 숫자가 아닙니다. 이 구분이 흐려지면 "기대도수가 인데 사람이 명일 수 있느냐"는 혼란이 생기는데, 그것은 사람 수가 아니라 무관하다는 가정 아래의 평균입니다. 그리고 기대도수를 행합과 열합에서 만든다는 사실이 자유도를 정하며, 이 구조는 184강의 회귀에서 추정한 계수마다 자유도를 잃는 것과 같습니다.
바로 확인 1.
확인 1-1. 기대도수를 식으로 쓰세요.
답. 행합과 열합을 곱해 전체로 나눈 값입니다.
확인 1-2. 검산에서 카이제곱과 자유도와 값을 쓰세요.
답. 이고 자유도 이며 는 입니다.
확인 1-3. 자유도가 인 이유를 셈으로 쓰세요.
답. 칸 개에서 제약 과 를 빼고 겹치는 하나를 되돌려 입니다.
문제. 근사를 검사합니다.
(1) 모의 분포와 이론 분포를 견주세요.
(2) 평균과 분산을 확인하세요.
(3) 근사가 깨지는 지점을 찾으세요.
생각의 실마리. 각 칸의 가 대략 표준정규를 따르면, 그 제곱의 합이 카이제곱이 됩니다. 자유도만큼의 독립한 정규가 남습니다.
풀이. (1) 독립인 모집단에서 명을 뽑아 만 번 되풀이합니다.
| 분위수 | 모의값 | 이론값 |
|---|---|---|
소수 둘째 자리까지 맞습니다. 근사가 통합니다.
(2) 평균과 분산도 봅니다.
| 무엇 | 모의 | 이론 |
|---|---|---|
| 평균 | ||
| 분산 |
평균이 자유도이고 분산이 자유도의 두 배입니다. 그래서 통계량이 자유도와 비슷하면 놀랄 일이 아니고, 자유도의 몇 배가 되어야 의심스럽습니다.
(3) 기대도수를 줄여 가며 실제 오류율을 잽니다.
| 전체 표본 | 한쪽 비율 | 가장 작은 기대도수 | 실제 오류율 | 목표 |
|---|---|---|---|---|
기대도수가 까지는 목표를 지킵니다. 그 아래로 내려가면 와 로 아래쪽으로 무너집니다.
도수가 정수라 통계량이 띄엄띄엄한 값만 가지기 때문입니다. 연속인 카이제곱 분포로 근사하는데 실제로는 몇 개의 값만 나올 수 있어, 기준을 넘는 일이 드물어집니다.
전통적인 기준이 모든 칸의 기대도수가 이상이라는 것입니다. 에서는 그보다 엄격하게 보고, 작으면 문제 4의 정확검정을 씁니다.
이 문제에서 배우는 것. 근사가 깨지는 방향이 아래쪽이라는 것이 실무에서 덜 위험한 쪽입니다. 없는 관계를 있다고 말하는 것이 아니라 있는 관계를 못 찾는 쪽이므로, 카이제곱이 유의하게 나왔다면 기대도수가 작아도 그 결론 자체는 보수적입니다. 위험한 것은 반대 방향인데, 179강 문제 3에서 순위 검정이 분산이 다를 때 헤펐던 것이 그런 경우였습니다. 어느 방향으로 틀리는지를 아는 것이 얼마나 틀리는지를 아는 것만큼 중요합니다.
바로 확인 2.
확인 2-1. 카이제곱 분포의 평균과 분산을 자유도로 쓰세요.
답. 평균은 자유도이고 분산은 자유도의 두 배입니다.
확인 2-2. 검산에서 분위수의 모의값과 이론값을 쓰세요.
답. 와 입니다.
확인 2-3. 검산에서 기대도수가 일 때의 오류율과 방향을 쓰세요.
답. 이며 목표보다 아래로 보수적인 쪽입니다.
문제. 관계의 세기를 잽니다.
(1) 표를 키워 가며 통계량과 세기 지표를 견주세요.
(2) 차이와 비와 오즈비를 구분하세요.
생각의 실마리. 178강 문제 4에서 가, 180강 문제 5에서 가 표본 크기에 끌려다녔습니다. 카이제곱도 그런지 확인합니다.
풀이. (1) 같은 비율을 유지한 채 표를 통째로 곱합니다.
| 몇 배로 키우는가 | 전체 | 카이제곱 | 값 | 크래머 |
|---|---|---|---|---|
카이제곱이 표본 크기에 정확히 비례합니다. 배로 키우면 이 가 되며, 비율이 하나도 안 변했는데 값이 에서 로 넘어갑니다.
크래머 는 소수 여섯째 자리까지 꼼짝 안 합니다. 통계량을 크기로 나눈 값이며, 에서 사이입니다.
(2) 대와 대만 떼어 로 봅니다.
| 무엇 | 값 |
|---|---|
| 대 클릭률 | |
| 대 클릭률 | |
| 차이 | |
| 비 | |
| 오즈비 |
셋이 서로 다른 이야기를 합니다. 차이가 같아도 나머지 둘이 크게 달라집니다.
| 두 비율 | 차이 | 비 | 오즈비 |
|---|---|---|---|
| 대 | |||
| 대 | |||
| 대 | |||
| 대 |
차이가 모두 인데 비는 에서 까지 벌어집니다.
드문 사건에서는 비가 커 보이고 흔한 사건에서는 작아 보입니다. 둘째 줄의 "배"와 셋째 줄의 "배"가 같은 퍼센트포인트입니다.
셋째 줄에서 오즈비만 로 큽니다. 근처에서는 확률의 여지가 작아 오즈가 크게 흔들리기 때문입니다.
이 문제에서 배우는 것. "위험이 배"라는 헤드라인이 아무것도 말하지 않을 수 있습니다. 가 가 된 것인지 가 가 된 것인지에 따라 실무의 뜻이 완전히 다른데, 비만 보고하면 그 구분이 사라집니다. 그래서 기저 비율을 함께 적어야 하며, 의학 보고에서 상대위험과 절대위험을 같이 쓰는 이유가 이것입니다. 오즈비는 190강에서 로지스틱 회귀의 계수로 다시 나오는데, 거기서는 해석이 아니라 계산의 편의로 쓰입니다.
바로 확인 3.
확인 3-1. 검산에서 표를 배로 키웠을 때 카이제곱과 크래머 를 쓰세요.
답. 카이제곱은 이고 는 로 그대로입니다.
확인 3-2. 크래머 를 식으로 쓰세요.
답. 카이제곱을 과 의 곱으로 나눈 값의 제곱근입니다.
확인 3-3. 검산에서 차이가 일 때 비의 범위를 쓰세요.
답. 에서 까지 벌어집니다.
문제. 작은 표를 다룹니다.
(1) 정확검정을 직접 계산하세요.
(2) 근사와 견주세요.
(3) 통계량과 비교하세요.
생각의 실마리. 문제 2에서 기대도수가 작으면 근사가 깨졌습니다. 근사 없이 확률을 직접 셀 수 있으면 그럴 필요가 없습니다.
풀이. (1) 작은 표 하나를 봅니다.
| 열1 | 열2 | 합 | |
|---|---|---|---|
| 행1 | |||
| 행2 | |||
| 합 |
가장 작은 기대도수가 밖에 안 되어 근사를 못 믿습니다.
행합과 열합을 고정하면 가능한 표가 가지뿐입니다. 왼쪽 위 칸이 부터 까지 갈 수 있고, 나머지 세 칸은 자동으로 정해집니다. 문제 1에서 본 자유도 이 여기서 가능한 표의 수로 나타납니다.
| 왼쪽 위 칸 | 확률 | 관측만큼 드문가 |
|---|---|---|
| 예 | ||
| 아니오 | ||
| 아니오 | ||
| 예 | ||
| 예 |
관측된 표의 확률은 이고 그만큼 드문 것을 모두 더하면 입니다.
확률이 관측보다 작거나 같은 표를 다 더하는 것이 피셔 정확검정의 양측 값입니다.
(2) 근사와 견줍니다.
카이제곱 근사로 하면 이라 답이 크게 다릅니다.
근사가 너무 작은 값을 줍니다. 근처에서 판단한다면 없는 관계를 있다고 말할 뻔했습니다.
문제 2에서 근사가 보수적이라고 했는데 여기서는 반대입니다. 문제 2는 오류율을 평균해서 잰 것이고, 여기는 특정한 표 하나입니다. 띄엄띄엄한 분포에서는 표마다 방향이 다르며, 평균이 보수적이라고 개별 표가 안전한 것이 아닙니다.
(3) 다른 통계량도 있습니다.
| 무엇 | 문제 1 자료 | 작은 표 |
|---|---|---|
| 카이제곱 | ||
| 통계량 |
우도비에서 나온 통계량이며 같은 자유도의 카이제곱 분포를 따릅니다.
큰 표에서는 둘이 거의 같고 작은 표에서는 갈립니다. 과 은 가깝고, 작은 표에서는 과 로 벌어집니다.
는 강의 KL 발산과 같은 모양입니다. 관측 분포와 기대 분포의 거리를 재는 정보이론의 양이며, 그때 다시 만납니다.
이 문제에서 배우는 것. 정확검정이 언제나 정답인 것은 아닙니다. 피셔 정확검정은 행합과 열합을 둘 다 고정하고 계산하는데, 실제 실험에서 그 둘이 다 고정된 경우는 드뭅니다. 표본을 뽑아 두 변수를 관측했다면 전체 크기만 고정이고, 처리를 배정했다면 행합만 고정입니다. 조건을 더 걸었으므로 피셔 검정은 필요 이상으로 보수적이며, 그것이 이라는 큰 값의 일부입니다. 계산이 정확하다는 것과 물음이 맞다는 것은 다른 이야기이며, 179강 문제 4에서 네 방법의 귀무가설이 달랐던 것과 같은 구조입니다.
바로 확인 4.
확인 4-1. 정확검정의 양측 값을 만드는 방식을 쓰세요.
답. 확률이 관측보다 작거나 같은 표를 모두 더합니다.
확인 4-2. 검산에서 정확검정과 근사의 값을 쓰세요.
답. 과 이며 근사가 너무 작습니다.
확인 4-3. 통계량을 식으로 쓰세요.
답. 관측에 관측 나누기 기대의 로그를 곱해 더한 뒤 를 곱합니다.
문제. 검정의 종류를 가릅니다.
(1) 세 가지 검정을 구분하세요.
(2) 적합도 검정을 해 보세요.
(3) 어느 칸이 어긋났는지 보고 한계를 정리하세요.
생각의 실마리. 문제 1의 계산은 한 가지였는데, 그 계산이 쓰이는 자리는 여럿입니다. 무엇이 고정이냐가 이름을 정합니다.
풀이. (1) 셋을 구분합니다.
| 이름 | 무엇이 고정인가 | 무엇을 묻는가 |
|---|---|---|
| 독립성 검정 | 전체 크기만 | 두 변수가 무관한가 |
| 동질성 검정 | 각 행의 합 | 집단마다 분포가 같은가 |
| 적합도 검정 | 전체 크기만 | 정해진 분포와 맞는가 |
앞의 둘은 계산이 완전히 같고 표집 설계만 다릅니다. 명을 뽑아 나이와 클릭을 관측했으면 독립성이고, 나이대마다 명씩 정해 놓고 뽑았으면 동질성입니다.
셋째는 기대도수를 자료가 아니라 밖에서 가져옵니다. 그래서 자유도가 다릅니다.
(2) 적합도 검정을 해 봅니다. 네 등급의 관측도수와 정해진 비율을 견줍니다.
| 등급 | 관측 | 기대 | 기여 |
|---|---|---|---|
카이제곱은 이고 자유도는 이며 값은 입니다.
자유도가 입니다. 비율을 자료에서 추정하지 않았으므로 전체 크기 하나만 빼면 됩니다.
마지막 등급의 기대도수가 으로 관례적 하한에 딱 걸립니다. 관측이 라서 이 칸 하나가 전체 기여의 퍼센트를 차지합니다.
(3) 어느 칸이 어긋났는지 봅니다. 문제 1의 표에서 칸마다의 표준화 잔차입니다.
| 칸 | 표준화 잔차 | 전체 기여 비율 |
|---|---|---|
| 대 클릭 | ||
| 대 이탈 | ||
| 대 클릭 | ||
| 대 이탈 | ||
| 대 클릭 | ||
| 대 이탈 |
대 클릭의 잔차가 로 가장 크고 전체 기여의 퍼센트입니다.
다만 이 표는 가 이라 유의하지 않습니다. 잔차는 참고일 뿐이며, 유의했다면 이 칸부터 봤을 것입니다.
카이제곱이 유의하다는 것만으로는 어느 칸인지 모릅니다. 180강 문제 4와 같은 구조이며, 칸마다 볼 때도 다중비교가 따라옵니다.
마지막으로 이 검정이 답하지 않는 것을 정리합니다.
| 물음 | 이 검정이 답하는가 |
|---|---|
| 두 변수가 무관한가 | 답합니다 |
| 관계가 얼마나 센가 | 크래머 로 따로 봅니다 |
| 어느 칸이 다른가 | 잔차로 따로 봅니다 |
| 어느 쪽이 원인인가 | 답하지 않습니다 |
| 다른 변수 때문은 아닌가 | 답하지 않습니다 |
마지막 두 줄이 177강의 결론입니다. 검정은 인과를 말하지 않습니다.
이 문제에서 배우는 것. 다섯째 줄이 범주형 자료에서 특히 자주 무시됩니다. 나이대와 클릭이 관계있다고 나왔을 때 성별이나 기기나 유입 경로가 뒤에 있을 수 있으며, 153강의 심슨 역설이 교차표에서 가장 극적으로 나타납니다. 그리고 표를 층별로 쪼개면 방향이 뒤집힐 수 있는데, 그것을 다루려면 표를 층으로 나눠 합치는 방법이나 190강의 로지스틱 회귀가 필요합니다. 교차표 하나는 다른 변수를 통제할 자리가 없는 도구입니다.
바로 확인 5.
확인 5-1. 독립성 검정과 동질성 검정의 차이를 쓰세요.
답. 계산은 같고 무엇이 고정된 표집인지만 다릅니다.
확인 5-2. 검산에서 적합도 검정의 통계량과 자유도를 쓰세요.
답. 이고 자유도는 입니다.
확인 5-3. 검산에서 가장 크게 어긋난 칸과 그 기여 비율을 쓰세요.
답. 대 클릭이며 잔차 에 기여 입니다.
| 상황 | 무엇을 쓰는가 |
|---|---|
| 교차표이고 기대도수가 충분 | 카이제곱 |
| 기대도수가 미만 | 정확검정 |
| 정해진 비율과 견줌 | 적합도 검정 |
| 관계의 세기가 필요 | 크래머 , 오즈비 |
| 다른 변수를 통제해야 함 | 로지스틱 회귀 |
| 무엇을 보고할 것인가 | 왜 |
|---|---|
| 교차표 원본 | 무엇이든 다시 계산됩니다 |
| 각 집단의 비율 | 방향과 크기를 봅니다 |
| 크래머 나 오즈비 | 크기와 무관한 세기입니다 |
| 표준화 잔차 | 어느 칸이 어긋났는지 |
| 카이제곱과 | 위가 있으면 덤입니다 |
| 자주 하는 실수 | 바로잡기 |
|---|---|
| 등급에 번호를 매겨 평균을 냅니다 | 없는 간격을 만듭니다 |
| 카이제곱이 크니 관계가 세다고 봅니다 | 표본 크기에 그대로 비례합니다 |
| 비만 보고합니다 | 기저 비율이 있어야 뜻이 생깁니다 |
| 기대도수가 작은데 근사를 씁니다 | 개별 표는 어느 방향이든 틀립니다 |
| 정확검정이 언제나 옳다고 봅니다 | 조건을 더 걸어 보수적입니다 |
| 교차표로 인과를 말합니다 | 통제할 자리가 없습니다 |
문제 6. 기대도수를 식으로 쓰세요.
답. 행합과 열합을 곱해 전체로 나눈 값입니다.
문제 7. 검산에서 카이제곱과 자유도와 값을 쓰세요.
답. 이고 자유도 이며 는 입니다.
문제 8. 자유도가 인 이유를 셈으로 쓰세요.
답. 칸 개에서 제약 과 를 빼고 겹치는 하나를 되돌려 입니다.
문제 9. 카이제곱 분포의 평균과 분산을 자유도로 쓰세요.
답. 평균은 자유도이고 분산은 자유도의 두 배입니다.
문제 10. 검산에서 기대도수가 일 때의 오류율과 방향을 쓰세요.
답. 이며 목표보다 아래로 보수적인 쪽입니다.
문제 11. 검산에서 표를 배로 키웠을 때 카이제곱과 크래머 를 쓰세요.
답. 과 이며 는 그대로입니다.
문제 12. 크래머 를 식으로 쓰세요.
답. 카이제곱을 과 의 곱으로 나눈 값의 제곱근입니다.
문제 13. 검산에서 차이가 일 때 비의 범위를 쓰세요.
답. 에서 까지 벌어집니다.
문제 14. 정확검정의 양측 값을 만드는 방식을 쓰세요.
답. 확률이 관측보다 작거나 같은 표를 모두 더합니다.
문제 15. 검산에서 정확검정과 근사의 값을 쓰세요.
답. 과 입니다.
문제 16. 통계량을 식으로 쓰세요.
답. 관측에 관측 나누기 기대의 로그를 곱해 더한 뒤 를 곱합니다.
문제 17. 독립성 검정과 동질성 검정의 차이를 쓰세요.
답. 계산은 같고 무엇이 고정된 표집인지만 다릅니다.
문제 18. 검산에서 가장 크게 어긋난 칸과 그 기여 비율을 쓰세요.
답. 대 클릭이며 잔차 에 기여 입니다.
심화 1. 연속성 보정을 정리하세요.
문제 2에서 도수가 정수라 근사가 깨진다고 했습니다. 그 간격을 절반 메우는 보정이 있습니다.
| 언제 쓰는가 | 무엇이 바뀌는가 |
|---|---|
| 표 | 통계량이 작아집니다 |
| 자유도 일 때만 | 값이 커집니다 |
| 큰 표본 | 차이가 사라집니다 |
예이츠 보정이라 부르며 논란이 많습니다. 문제 4에서 봤듯 피셔 검정 쪽으로 끌어가는데, 피셔 검정 자체가 이미 보수적이므로 두 번 조심하는 셈이 됩니다.
요즘은 잘 안 씁니다. 대신 표본이 작으면 정확검정을, 크면 보정 없는 카이제곱을 쓰는 편입니다.
심화 2. 층별 분석을 정리하세요.
문제 5에서 교차표에 다른 변수를 통제할 자리가 없다고 했습니다. 층으로 나누면 됩니다.
층마다 표를 만들고 오즈비를 합치는 것이 맨텔-헨첼 방법입니다.
| 무엇을 얻는가 | 조건 |
|---|---|
| 층 변수를 통제한 오즈비 | 층마다 오즈비가 비슷해야 합니다 |
| 층별 표본이 작아도 씀 | 층 안에서 정확검정을 안 해도 됩니다 |
| 심슨 역설을 드러냄 | 층별과 전체가 다르면 보입니다 |
첫째 줄의 조건이 깨지면 합치면 안 됩니다. 층마다 방향이 다른데 하나로 합치면 평균이 아무것도 대표하지 않습니다. 그 검사가 브레슬로-데이 검정입니다.
177강 문제 3의 규칙이 그대로 적용됩니다. 층 변수가 교란이면 나눠야 하고 충돌부면 나누면 안 됩니다.
심화 3. 순서가 있는 범주를 정리하세요.
문제 5에서 등급에 번호를 매기지 말라고 했는데, 순서가 진짜로 있으면 다릅니다.
| 무엇을 쓰는가 | 언제 |
|---|---|
| 일반 카이제곱 | 순서를 무시합니다 |
| 추세 검정 | 순서를 따라 단조로 변하는가 |
| 순서형 로지스틱 | 순서를 모형에 넣습니다 |
둘째 줄이 자유도를 아낍니다. 등급이 다섯이면 일반 카이제곱은 자유도가 인데, 추세 검정은 입니다. 찾는 것이 단조 추세라면 검출력이 훨씬 좋습니다.
대신 단조가 아니면 못 찾습니다. 가운데가 높은 U자 관계는 추세 검정이 놓치며, 그때는 일반 카이제곱이 낫습니다.
심화 4. 표본 크기 설계를 정리하세요.
183강의 검정력 계산이 교차표에도 있습니다.
| 무엇이 을 키우는가 | 왜 |
|---|---|
| 차이가 작음 | 분모가 작아집니다 |
| 비율이 근처 | 분산이 최대입니다 |
| 비율이 아주 작음 | 사건 수가 모자랍니다 |
둘째와 셋째 줄이 반대 방향처럼 보입니다. 분산은 에서 최대인데, 드문 사건은 절대 차이가 작아 결국 더 큰 표본이 필요합니다.
전환율이 퍼센트인 A/B 테스트가 그래서 어렵습니다. 을 로 올리는 것을 잡으려면 수십만 명이 필요하며, 174강 문제 2의 계산이 그대로 적용됩니다.
심화 5. 여러 표를 한꺼번에 볼 때를 정리하세요.
지표를 여럿 두고 교차표를 여러 개 만드는 것이 실무의 흔한 모습입니다.
| 무엇이 늘어나는가 | 결과 |
|---|---|
| 표의 수 | 180강 문제 1의 문제 |
| 표 안의 칸 | 잔차마다 다중비교 |
| 층의 수 | 층마다 또 반복 |
세 축이 곱해집니다. 지표 개를 층 개로 나눠 각각 표를 보면 개의 칸을 들여다보는 것이며, 그중 우연히 어긋난 칸이 반드시 있습니다.
182강의 보정이 필요하지만 그것으로 부족합니다. 보정은 미리 정한 비교에 대해서만 뜻이 있고, 표를 그려 놓고 눈에 띄는 칸을 고르는 것은 비교의 수를 셀 수조차 없습니다.
대시보드가 위험한 이유가 여기 있습니다. 누구도 검정을 하지 않았는데 눈으로 하는 다중비교가 매일 일어납니다.
심화 6. 이 강의가 어디에 쓰이는지 정리하세요.
| 분야 | 쓰임 | 이어지는 강의 |
|---|---|---|
| 여러 비교 | 보정 전반 | 182강 |
| 표본 설계 | 사건 수 계산 | 183강 |
| 범주형 결과 모형 | 로지스틱 회귀 | 190강 |
| 정보이론 | 와 KL 발산 | 203강 |
셋째 줄이 이 강의의 자연스러운 확장입니다. 교차표는 설명변수가 하나뿐인 로지스틱 회귀이며, 변수를 더 넣으면 층별 분석이 자동으로 됩니다.
의 지수가 문제 3의 오즈비 과 같은 값입니다. 190강에서 그 사실을 확인하며, 그때 다른 변수를 함께 넣는 것이 이 강의가 못 한 일을 해결합니다.
정답.
| 기호 | 읽는 법 | 뜻 |
|---|---|---|
| O_ | 관측도수 | 실제로 센 수입니다 |
| E_ | 기대도수 | 무관하다면 나왔을 수입니다 |
| \chi^ | 카이제곱 | 차이제곱을 기대로 나눠 더한 값입니다 |
| 자유도 | degrees of freedom | 자유롭게 정할 수 있는 칸의 수입니다 |
| 크래머 | Cramer's V | 크기로 나눈 관계의 세기입니다 |
| 오즈 | odds | 일어날 확률을 안 일어날 확률로 나눈 값입니다 |
| 오즈비 | odds ratio | 두 오즈의 비입니다 |
| 상대위험 | relative risk | 두 확률의 비입니다 |
| 피셔 정확검정 | Fisher's exact test | 가능한 표를 모두 세는 검정입니다 |
| 초기하분포 | hypergeometric | 행합과 열합을 고정한 분포입니다 |
| 통계량 | G-statistic | 우도비에서 나온 통계량입니다 |
| 표준화 잔차 | standardized residual | 차이를 기대의 제곱근으로 나눈 값입니다 |
| 예이츠 보정 | Yates' correction | 정수 간격을 절반 메웁니다 |
| 맨텔-헨첼 | Mantel-Haenszel | 층별 오즈비를 합칩니다 |
다음은 182강 다중비교 보정입니다. 이 강의와 180강에서 같은 문제가 두 번 나왔습니다.
180강 문제 4에서 본페로니와 홀름을 썼고, 이 강의 심화 5에서 표가 여럿이면 그것으로도 부족하다고 했습니다. 182강은 전체 오류율을 지키는 것과 발견의 비율을 지키는 것이 다른 목표라는 데서 출발해, 유전체나 A/B 테스트처럼 수천 번 검정하는 자리에서 무엇을 지켜야 하는지를 다룹니다.
import numpy as np
rng = np.random.default_rng(20260918)
def pw(s, n):
k = n - sum(2 if ord(c) > 0x2FFF else 1 for c in str(s))
return str(s) + " " * max(k, 0)
def rw(s, n):
k = n - sum(2 if ord(c) > 0x2FFF else 1 for c in str(s))
return " " * max(k, 0) + str(s)
def gammaln(z):
g = [676.5203681218851, -1259.1392167224028, 771.32342877765313,
-176.61502916214059, 12.507343278686905, -0.13857109526572012,
9.9843695780195716e-6, 1.5056327351493116e-7]
if z < 0.5:
return np.log(np.pi / np.sin(np.pi * z)) - gammaln(1.0 - z)
z -= 1.0
x = 0.99999999999980993
for i, gi in enumerate(g):
x += gi / (z + i + 1.0)
t = z + 7.5
return 0.5 * np.log(2 * np.pi) + (z + 0.5) * np.log(t) - t + np.log(x)
def gser(a, x):
ap, s, d = a, 1.0 / a, 1.0 / a
for _ in range(2000):
ap += 1.0
d *= x / ap
s += d
if abs(d) < abs(s) * 1e-16:
break
return s * np.exp(-x + a * np.log(x) - gammaln(a))
def gcf(a, x):
b, c = x + 1.0 - a, 1e300
d = 1.0 / b
h = d
for i in range(1, 2000):
an = -i * (i - a)
b += 2.0
d = an * d + b
if abs(d) < 1e-300:
d = 1e-300
c = b + an / c
if abs(c) < 1e-300:
c = 1e-300
d = 1.0 / d
de = d * c
h *= de
if abs(de - 1.0) < 1e-16:
break
return np.exp(-x + a * np.log(x) - gammaln(a)) * h
def chi2_sf(x, df):
if x <= 0.0:
return 1.0
a = 0.5 * df
y = 0.5 * x
return 1.0 - gser(a, y) if y < a + 1.0 else gcf(a, y)
def chi2_crit(df, alpha=0.05):
lo, hi = 0.0, 500.0
for _ in range(200):
mid = 0.5 * (lo + hi)
if chi2_sf(mid, df) > alpha:
lo = mid
else:
hi = mid
return 0.5 * (lo + hi)
def expected(O):
r = O.sum(1, keepdims=True)
c = O.sum(0, keepdims=True)
return r * c / O.sum()
def chi2_stat(O):
E = expected(O)
return float(((O - E) ** 2 / E).sum())
def g_stat(O):
E = expected(O)
m = O > 0
return float(2.0 * (O[m] * np.log(O[m] / E[m])).sum())
# --- 문제 1: 교차표에서 무엇을 기대하는가 --------------------------------
print(" 167강에서 만든 교차표로 돌아갑니다")
O = np.array([[42.0, 58.0], [78.0, 122.0], [30.0, 70.0]])
rows = ["20대", "30대", "40대"]
cols = ["클릭", "이탈"]
print(" 나이대와 클릭 여부의 교차표입니다")
print(" %s %s %s %s" % (pw("나이대", 10), rw("클릭", 10), rw("이탈", 10), rw("합", 10)))
for nm, r in zip(rows, O):
print(" %s %10.0f %10.0f %10.0f" % (pw(nm, 10), r[0], r[1], r.sum()))
print(" %s %10.0f %10.0f %10.0f"
% (pw("합", 10), O[:, 0].sum(), O[:, 1].sum(), O.sum()))
print(" 전체 클릭률은 %.4f 입니다" % (O[:, 0].sum() / O.sum()))
print(" 독립이면 각 칸의 기대도수가 정해집니다")
E = expected(O)
print(" 기대도수 = 행합 x 열합 / 전체 입니다")
print(" %s %s %s %s %s" % (pw("칸", 14), rw("관측", 10), rw("기대", 12),
rw("차이", 10), rw("차이제곱/기대", 16)))
for i, nm in enumerate(rows):
for j, cn in enumerate(cols):
print(" %s %10.0f %12.4f %10.4f %16.6f"
% (pw(nm + " " + cn, 14), O[i, j], E[i, j], O[i, j] - E[i, j],
(O[i, j] - E[i, j]) ** 2 / E[i, j]))
X2 = chi2_stat(O)
df = (O.shape[0] - 1) * (O.shape[1] - 1)
print(" 전부 더하면 카이제곱 통계량 %.6f 입니다" % X2)
print(" 자유도는 (3-1)(2-1) = %d 이고 p 값은 %.6f 입니다" % (df, chi2_sf(X2, df)))
print(" 기각에 필요한 값은 %.4f 입니다" % chi2_crit(df))
print(" 왜 자유도가 행과 열의 곱에서 하나씩 뺀 값인가")
print(" %s %s" % (pw("무엇이 정해져 있는가", 26), rw("몇 개", 12)))
for a, b in [("칸의 수", 6), ("행합 제약을 뺌", -3), ("열합 제약을 뺌", -2),
("겹치는 제약 하나를 되돌림", 1), ("남는 자유도", 2)]:
print(" %s %12d" % (pw(a, 26), b))
print(" 6 - 3 - 2 + 1 = 2 입니다. 행합과 열합을 자료에서 추정했기 때문입니다")
print(" 행합의 합과 열합의 합이 둘 다 전체합이라 제약 하나가 겹칩니다")
print(" 칸 두 개만 정하면 나머지 네 개가 자동으로 채워집니다")
# --- 문제 2: 왜 카이제곱 분포인가 ---------------------------------------
print(" 통계량이 정말 카이제곱 분포를 따르는지 확인합니다")
R2 = 60000
p_row = O.sum(1) / O.sum()
p_col = O.sum(0) / O.sum()
Ntot = int(O.sum())
print(" 독립인 모집단에서 400 명을 뽑아 6 만 번 되풀이합니다")
pj = np.outer(p_row, p_col).ravel()
sim = rng.multinomial(Ntot, pj, size=R2).reshape(R2, 3, 2).astype(float)
Es = sim.sum(2, keepdims=True) * sim.sum(1, keepdims=True) / Ntot
with np.errstate(divide="ignore", invalid="ignore"):
stat = np.where(Es > 0, (sim - Es) ** 2 / np.maximum(Es, 1e-12), 0.0).sum((1, 2))
print(" %s %s %s" % (pw("분위수", 12), rw("모의값", 14), rw("이론값", 14)))
for q in [0.5, 0.9, 0.95, 0.99]:
lo, hi = 0.0, 500.0
for _ in range(200):
mid = 0.5 * (lo + hi)
if chi2_sf(mid, df) > 1.0 - q:
lo = mid
else:
hi = mid
print(" %s %14.4f %14.4f"
% (pw("%.2f" % q, 12), float(np.quantile(stat, q)), 0.5 * (lo + hi)))
print(" 모의값과 이론값이 잘 맞습니다. 근사가 통합니다")
print(" %s %s %s" % (pw("무엇", 16), rw("모의", 12), rw("이론", 12)))
print(" %s %12.4f %12.4f" % (pw("평균", 16), float(stat.mean()), float(df)))
print(" %s %12.4f %12.4f" % (pw("분산", 16), float(stat.var()), float(2 * df)))
print(" 카이제곱 분포의 평균은 자유도이고 분산은 자유도의 두 배입니다")
print(" 근사는 기대도수가 작으면 깨집니다")
print(" 2 x 2 표에서 기대도수를 줄여 가며 실제 오류율을 잽니다")
R3 = 40000
c2 = chi2_crit(1)
print(" %s %s %s %s %s" % (pw("전체 표본", 12), rw("한쪽 비율", 12),
rw("가장 작은 기대도수", 20), rw("실제 오류율", 14),
rw("목표", 8)))
for n, p in [(400, 0.5), (100, 0.5), (40, 0.5), (100, 0.1), (100, 0.03), (40, 0.05)]:
pj2 = np.array([0.5 * p, 0.5 * (1 - p), 0.5 * p, 0.5 * (1 - p)])
t = rng.multinomial(n, pj2, size=R3).reshape(R3, 2, 2).astype(float)
Ee = t.sum(2, keepdims=True) * t.sum(1, keepdims=True) / n
ok = (Ee > 0).all((1, 2))
st = np.zeros(R3)
st[ok] = ((t[ok] - Ee[ok]) ** 2 / Ee[ok]).sum((1, 2))
print(" %s %12.2f %20.2f %14.4f %8.2f"
% (pw("%d" % n, 12), p, n * 0.5 * p, float((st > c2).mean()), 0.05))
print(" 기대도수가 5 까지는 목표를 지킵니다. 그 아래로 내려가면 무너집니다")
print(" 방향은 아래쪽입니다. 1.5 에서 0.0242 이고 1.0 에서 0.0164 입니다")
print(" 도수가 정수라 통계량이 띄엄띄엄한 값만 가져 기각이 드물어지기 때문입니다")
print(" 전통적인 기준이 모든 칸의 기대도수가 5 이상이라는 것입니다")
print(" 2 x 2 에서는 그보다 엄격하게 보고 작으면 정확검정을 씁니다")
# --- 문제 3: 얼마나 센 관계인가 -----------------------------------------
print(" 카이제곱은 표본 크기에 그대로 비례합니다")
base = np.array([[42.0, 58.0], [78.0, 122.0], [30.0, 70.0]])
print(" 같은 비율을 유지한 채 표를 통째로 곱해 봅니다")
print(" %s %s %s %s %s" % (pw("몇 배로 키우는가", 18), rw("전체", 10),
rw("카이제곱", 12), rw("p 값", 14), rw("크래머 V", 12)))
for mul in [1, 2, 5, 20]:
T = base * mul
x2 = chi2_stat(T)
v = np.sqrt(x2 / (T.sum() * min(T.shape[0] - 1, T.shape[1] - 1)))
print(" %s %10.0f %12.4f %14.8f %12.6f"
% (pw("%d" % mul, 18), T.sum(), x2, chi2_sf(x2, df), v))
print(" 카이제곱과 p 값은 크게 움직이는데 크래머 V 는 꼼짝 안 합니다")
print(" V = sqrt(카이제곱 / (N x min(r-1, c-1))) 이며 크기로 나눈 값입니다")
print(" 관계의 세기를 재는 다른 방법들도 봅니다")
a, b, c, d = 42.0, 58.0, 78.0, 122.0
print(" 20대와 30대만 떼어 2 x 2 로 봅니다")
print(" %s %s" % (pw("무엇", 22), rw("값", 14)))
print(" %s %14.6f" % (pw("20대 클릭률", 22), a / (a + b)))
print(" %s %14.6f" % (pw("30대 클릭률", 22), c / (c + d)))
print(" %s %14.6f" % (pw("차이", 22), a / (a + b) - c / (c + d)))
print(" %s %14.6f" % (pw("비", 22), (a / (a + b)) / (c / (c + d))))
print(" %s %14.6f" % (pw("오즈비", 22), (a / b) / (c / d)))
print(" 차이와 비와 오즈비가 서로 다른 이야기를 합니다")
print(" %s %s %s %s" % (pw("두 비율", 20), rw("차이", 12), rw("비", 12), rw("오즈비", 12)))
for p1, p2 in [(0.42, 0.39), (0.05, 0.02), (0.95, 0.92), (0.50, 0.47)]:
print(" %s %12.4f %12.4f %12.4f"
% (pw("%.2f 대 %.2f" % (p1, p2), 20), p1 - p2, p1 / p2,
(p1 / (1 - p1)) / (p2 / (1 - p2))))
print(" 차이가 모두 0.03 인데 비는 1.03 에서 2.50 까지 벌어집니다")
print(" 드문 사건에서는 비가 커 보이고 흔한 사건에서는 작아 보입니다")
print(" 오즈비는 190강에서 로지스틱 회귀의 계수로 다시 나옵니다")
# --- 문제 4: 근사가 깨질 때 --------------------------------------------
print(" 표가 작으면 정확검정을 씁니다")
T = np.array([[3.0, 1.0], [1.0, 5.0]])
print(" 작은 표 하나를 봅니다")
print(" %s %s %s %s" % (pw("", 8), rw("열1", 8), rw("열2", 8), rw("합", 8)))
for i in range(2):
print(" %s %8.0f %8.0f %8.0f"
% (pw("행%d" % (i + 1), 8), T[i, 0], T[i, 1], T[i].sum()))
print(" %s %8.0f %8.0f %8.0f" % (pw("합", 8), T[:, 0].sum(), T[:, 1].sum(), T.sum()))
Ee = expected(T)
print(" 가장 작은 기대도수가 %.4f 밖에 안 되어 근사를 못 믿습니다" % Ee.min())
def logfact(n):
return gammaln(n + 1.0)
def hyper_p(a11, r1, r2, c1, c2):
return np.exp(logfact(r1) + logfact(r2) + logfact(c1) + logfact(c2)
- logfact(r1 + r2) - logfact(a11) - logfact(r1 - a11)
- logfact(c1 - a11) - logfact(r2 - c1 + a11))
r1, r2 = T[0].sum(), T[1].sum()
c1, c2 = T[:, 0].sum(), T[:, 1].sum()
lo = int(max(0, c1 - r2))
hi = int(min(r1, c1))
p_obs = hyper_p(T[0, 0], r1, r2, c1, c2)
print(" 행합과 열합을 고정하면 가능한 표가 %d 가지뿐입니다" % (hi - lo + 1))
print(" %s %s %s" % (pw("왼쪽 위 칸", 12), rw("확률", 14), rw("관측만큼 드문가", 20)))
tot = 0.0
for k in range(lo, hi + 1):
pk = hyper_p(float(k), r1, r2, c1, c2)
rare = "예" if pk <= p_obs + 1e-12 else "아니오"
if pk <= p_obs + 1e-12:
tot += pk
print(" %s %14.6f %s" % (pw("%d" % k, 12), pk, rw(rare, 20)))
print(" 관측된 표의 확률은 %.6f 이고 그만큼 드문 것을 모두 더하면 %.6f 입니다"
% (p_obs, tot))
x2s = chi2_stat(T)
print(" 카이제곱 근사로 하면 %.6f 이라 답이 크게 다릅니다" % chi2_sf(x2s, 1))
print(" 근사가 너무 작은 p 값을 줍니다. 작은 표에서 위험한 방향입니다")
print(" 다른 통계량도 있습니다")
print(" %s %s %s" % (pw("무엇", 18), rw("문제 1 자료", 16), rw("작은 표", 14)))
print(" %s %16.6f %14.6f" % (pw("카이제곱", 18), X2, x2s))
print(" %s %16.6f %14.6f" % (pw("G 통계량", 18), g_stat(O), g_stat(T)))
print(" G = 2 x sum(관측 x log(관측/기대)) 이며 우도비에서 나옵니다")
print(" 큰 표에서는 둘이 거의 같고 작은 표에서는 갈립니다")
print(" G 는 203강의 KL 발산과 같은 모양입니다. 그때 다시 만납니다")
# --- 문제 5: 무엇을 검정하고 있는가 -------------------------------------
print(" 같은 계산이 세 가지 다른 물음에 쓰입니다")
print(" %s %s %s" % (pw("이름", 18), rw("무엇이 고정인가", 22), rw("무엇을 묻는가", 26)))
for a, b, c in [("독립성 검정", "전체 크기만", "두 변수가 무관한가"),
("동질성 검정", "각 행의 합", "집단마다 분포가 같은가"),
("적합도 검정", "전체 크기만", "정해진 분포와 맞는가")]:
print(" %s %s %s" % (pw(a, 18), rw(b, 22), rw(c, 26)))
print(" 앞의 둘은 계산이 완전히 같고 표집 설계만 다릅니다")
print(" 셋째는 기대도수를 자료가 아니라 밖에서 가져옵니다")
print(" 적합도 검정을 해 봅니다")
obs = np.array([48.0, 35.0, 15.0, 2.0])
pr = np.array([0.45, 0.35, 0.15, 0.05])
exp = pr * obs.sum()
print(" 네 등급의 관측도수와 정해진 비율을 견줍니다")
print(" %s %s %s %s" % (pw("등급", 10), rw("관측", 10), rw("기대", 12), rw("기여", 12)))
for i in range(4):
print(" %s %10.0f %12.4f %12.6f"
% (pw("%d" % (i + 1), 10), obs[i], exp[i], (obs[i] - exp[i]) ** 2 / exp[i]))
gof = float(((obs - exp) ** 2 / exp).sum())
print(" 카이제곱은 %.6f 이고 자유도는 %d 입니다" % (gof, len(obs) - 1))
print(" p 값은 %.6f 입니다" % chi2_sf(gof, len(obs) - 1))
print(" 마지막 등급의 기대도수가 %.1f 으로 관례적 하한에 딱 걸립니다" % exp[3])
print(" 관측이 2 라서 이 칸 하나가 전체 기여의 %.0f 퍼센트를 차지합니다"
% (100.0 * (obs[3] - exp[3]) ** 2 / exp[3] / gof))
print(" 기여도를 보면 어느 칸이 문제인지 알 수 있습니다")
Ed = expected(O)
res = (O - Ed) / np.sqrt(Ed)
print(" 문제 1 의 표에서 칸마다의 표준화 잔차를 봅니다")
print(" %s %s %s" % (pw("칸", 14), rw("표준화 잔차", 14), rw("전체 기여 비율", 18)))
for i, nm in enumerate(rows):
for j, cn in enumerate(cols):
print(" %s %14.4f %18.4f"
% (pw(nm + " " + cn, 14), res[i, j], res[i, j] ** 2 / X2))
print(" 40대 클릭의 잔차가 -1.2247 로 가장 크고 전체 기여의 43 퍼센트입니다")
print(" 다만 이 표는 p 가 0.1776 이라 유의하지 않습니다. 잔차는 참고일 뿐입니다")
print(" 유의했다면 이 칸부터 봤을 것입니다. 카이제곱만으로는 어느 칸인지 모릅니다")
print(" 180강 문제 4 와 같은 구조이며 칸마다 볼 때도 다중비교가 따라옵니다")
print(" 독립성 검정이 답하지 않는 것을 정리합니다")
print(" %s %s" % (pw("물음", 28), rw("이 검정이 답하는가", 22)))
for a, b in [("두 변수가 무관한가", "답합니다"),
("관계가 얼마나 센가", "크래머 V 로 따로 봅니다"),
("어느 칸이 다른가", "잔차로 따로 봅니다"),
("어느 쪽이 원인인가", "답하지 않습니다"),
("다른 변수 때문은 아닌가", "답하지 않습니다")]:
print(" %s %s" % (pw(a, 28), rw(b, 22)))
print(" 마지막 두 줄이 177강의 결론입니다. 검정은 인과를 말하지 않습니다")
# 167강에서 만든 교차표로 돌아갑니다
# 나이대와 클릭 여부의 교차표입니다
# 나이대 클릭 이탈 합
# 20대 42 58 100
# 30대 78 122 200
# 40대 30 70 100
# 합 150 250 400
# 전체 클릭률은 0.3750 입니다
# 독립이면 각 칸의 기대도수가 정해집니다
# 기대도수 = 행합 x 열합 / 전체 입니다
# 칸 관측 기대 차이 차이제곱/기대
# 20대 클릭 42 37.5000 4.5000 0.540000
# 20대 이탈 58 62.5000 -4.5000 0.324000
# 30대 클릭 78 75.0000 3.0000 0.120000
# 30대 이탈 122 125.0000 -3.0000 0.072000
# 40대 클릭 30 37.5000 -7.5000 1.500000
# 40대 이탈 70 62.5000 7.5000 0.900000
# 전부 더하면 카이제곱 통계량 3.456000 입니다
# 자유도는 (3-1)(2-1) = 2 이고 p 값은 0.177639 입니다
# 기각에 필요한 값은 5.9915 입니다
# 왜 자유도가 행과 열의 곱에서 하나씩 뺀 값인가
# 무엇이 정해져 있는가 몇 개
# 칸의 수 6
# 행합 제약을 뺌 -3
# 열합 제약을 뺌 -2
# 겹치는 제약 하나를 되돌림 1
# 남는 자유도 2
# 6 - 3 - 2 + 1 = 2 입니다. 행합과 열합을 자료에서 추정했기 때문입니다
# 행합의 합과 열합의 합이 둘 다 전체합이라 제약 하나가 겹칩니다
# 칸 두 개만 정하면 나머지 네 개가 자동으로 채워집니다
# 통계량이 정말 카이제곱 분포를 따르는지 확인합니다
# 독립인 모집단에서 400 명을 뽑아 6 만 번 되풀이합니다
# 분위수 모의값 이론값
# 0.50 1.3895 1.3863
# 0.90 4.5851 4.6052
# 0.95 5.9799 5.9915
# 0.99 9.2607 9.2103
# 모의값과 이론값이 잘 맞습니다. 근사가 통합니다
# 무엇 모의 이론
# 평균 2.0038 2.0000
# 분산 3.9905 4.0000
# 카이제곱 분포의 평균은 자유도이고 분산은 자유도의 두 배입니다
# 근사는 기대도수가 작으면 깨집니다
# 2 x 2 표에서 기대도수를 줄여 가며 실제 오류율을 잽니다
# 전체 표본 한쪽 비율 가장 작은 기대도수 실제 오류율 목표
# 400 0.50 100.00 0.0508 0.05
# 100 0.50 25.00 0.0549 0.05
# 40 0.50 10.00 0.0507 0.05
# 100 0.10 5.00 0.0500 0.05
# 100 0.03 1.50 0.0242 0.05
# 40 0.05 1.00 0.0164 0.05
# 기대도수가 5 까지는 목표를 지킵니다. 그 아래로 내려가면 무너집니다
# 방향은 아래쪽입니다. 1.5 에서 0.0242 이고 1.0 에서 0.0164 입니다
# 도수가 정수라 통계량이 띄엄띄엄한 값만 가져 기각이 드물어지기 때문입니다
# 전통적인 기준이 모든 칸의 기대도수가 5 이상이라는 것입니다
# 2 x 2 에서는 그보다 엄격하게 보고 작으면 정확검정을 씁니다
# 카이제곱은 표본 크기에 그대로 비례합니다
# 같은 비율을 유지한 채 표를 통째로 곱해 봅니다
# 몇 배로 키우는가 전체 카이제곱 p 값 크래머 V
# 1 400 3.4560 0.17763933 0.092952
# 2 800 6.9120 0.03155573 0.092952
# 5 2000 17.2800 0.00017689 0.092952
# 20 8000 69.1200 0.00000000 0.092952
# 카이제곱과 p 값은 크게 움직이는데 크래머 V 는 꼼짝 안 합니다
# V = sqrt(카이제곱 / (N x min(r-1, c-1))) 이며 크기로 나눈 값입니다
# 관계의 세기를 재는 다른 방법들도 봅니다
# 20대와 30대만 떼어 2 x 2 로 봅니다
# 무엇 값
# 20대 클릭률 0.420000
# 30대 클릭률 0.390000
# 차이 0.030000
# 비 1.076923
# 오즈비 1.132626
# 차이와 비와 오즈비가 서로 다른 이야기를 합니다
# 두 비율 차이 비 오즈비
# 0.42 대 0.39 0.0300 1.0769 1.1326
# 0.05 대 0.02 0.0300 2.5000 2.5789
# 0.95 대 0.92 0.0300 1.0326 1.6522
# 0.50 대 0.47 0.0300 1.0638 1.1277
# 차이가 모두 0.03 인데 비는 1.03 에서 2.50 까지 벌어집니다
# 드문 사건에서는 비가 커 보이고 흔한 사건에서는 작아 보입니다
# 오즈비는 190강에서 로지스틱 회귀의 계수로 다시 나옵니다
# 표가 작으면 정확검정을 씁니다
# 작은 표 하나를 봅니다
# 열1 열2 합
# 행1 3 1 4
# 행2 1 5 6
# 합 4 6 10
# 가장 작은 기대도수가 1.6000 밖에 안 되어 근사를 못 믿습니다
# 행합과 열합을 고정하면 가능한 표가 5 가지뿐입니다
# 왼쪽 위 칸 확률 관측만큼 드문가
# 0 0.071429 예
# 1 0.380952 아니오
# 2 0.428571 아니오
# 3 0.114286 예
# 4 0.004762 예
# 관측된 표의 확률은 0.114286 이고 그만큼 드문 것을 모두 더하면 0.190476 입니다
# 카이제곱 근사로 하면 0.065087 이라 답이 크게 다릅니다
# 근사가 너무 작은 p 값을 줍니다. 작은 표에서 위험한 방향입니다
# 다른 통계량도 있습니다
# 무엇 문제 1 자료 작은 표
# 카이제곱 3.456000 3.402778
# G 통계량 3.520095 3.554818
# G = 2 x sum(관측 x log(관측/기대)) 이며 우도비에서 나옵니다
# 큰 표에서는 둘이 거의 같고 작은 표에서는 갈립니다
# G 는 203강의 KL 발산과 같은 모양입니다. 그때 다시 만납니다
# 같은 계산이 세 가지 다른 물음에 쓰입니다
# 이름 무엇이 고정인가 무엇을 묻는가
# 독립성 검정 전체 크기만 두 변수가 무관한가
# 동질성 검정 각 행의 합 집단마다 분포가 같은가
# 적합도 검정 전체 크기만 정해진 분포와 맞는가
# 앞의 둘은 계산이 완전히 같고 표집 설계만 다릅니다
# 셋째는 기대도수를 자료가 아니라 밖에서 가져옵니다
# 적합도 검정을 해 봅니다
# 네 등급의 관측도수와 정해진 비율을 견줍니다
# 등급 관측 기대 기여
# 1 48 45.0000 0.200000
# 2 35 35.0000 0.000000
# 3 15 15.0000 0.000000
# 4 2 5.0000 1.800000
# 카이제곱은 2.000000 이고 자유도는 3 입니다
# p 값은 0.572407 입니다
# 마지막 등급의 기대도수가 5.0 으로 관례적 하한에 딱 걸립니다
# 관측이 2 라서 이 칸 하나가 전체 기여의 90 퍼센트를 차지합니다
# 기여도를 보면 어느 칸이 문제인지 알 수 있습니다
# 문제 1 의 표에서 칸마다의 표준화 잔차를 봅니다
# 칸 표준화 잔차 전체 기여 비율
# 20대 클릭 0.7348 0.1562
# 20대 이탈 -0.5692 0.0938
# 30대 클릭 0.3464 0.0347
# 30대 이탈 -0.2683 0.0208
# 40대 클릭 -1.2247 0.4340
# 40대 이탈 0.9487 0.2604
# 40대 클릭의 잔차가 -1.2247 로 가장 크고 전체 기여의 43 퍼센트입니다
# 다만 이 표는 p 가 0.1776 이라 유의하지 않습니다. 잔차는 참고일 뿐입니다
# 유의했다면 이 칸부터 봤을 것입니다. 카이제곱만으로는 어느 칸인지 모릅니다
# 180강 문제 4 와 같은 구조이며 칸마다 볼 때도 다중비교가 따라옵니다
# 독립성 검정이 답하지 않는 것을 정리합니다
# 물음 이 검정이 답하는가
# 두 변수가 무관한가 답합니다
# 관계가 얼마나 센가 크래머 V 로 따로 봅니다
# 어느 칸이 다른가 잔차로 따로 봅니다
# 어느 쪽이 원인인가 답하지 않습니다
# 다른 변수 때문은 아닌가 답하지 않습니다
# 마지막 두 줄이 177강의 결론입니다. 검정은 인과를 말하지 않습니다