178강이 웰치로 등분산을 풀었습니다. 그런데 정규성은 아직 가정으로 남아 있습니다.
실무의 자료는 대부분 오른쪽으로 길게 끌립니다. 164강에서 그 모양을 재는 법을 배웠고, 이제 그 모양이 검정을 어떻게 바꾸는지 봅니다.
그런데 물음이 하나 더 있습니다. 치우친 자료에서는 평균 자체가 대표성을 잃습니다. 평균 아래에 퍼센트가 몰려 있는 자료에서 "평균이 다릅니까"는 좋은 물음이 아닙니다.
| 무엇을 견줄 것인가 | 어떤 방법 |
|---|---|
| 평균 | 검정 |
| 중앙값 쪽 순서 | 순위 검정 |
| 라벨이 무의미한지 | 순열 검정 |
| 어떤 통계량이든 구간 | 붓스트랩 |
넷은 서로 다른 물음에 답합니다. 그래서 이 강의는 어느 것이 더 좋은가가 아니라 무엇을 묻고 있는가를 다룹니다.
문제. 정규성 가정을 검사합니다.
(1) 여러 분포에서 검정의 실제 오류율을 재세요.
(2) 두 집단의 크기가 다를 때를 확인하세요.
(3) 치우친 자료에서 평균이 무엇을 뜻하는지 확인하세요.
생각의 실마리. 178강 심화 2에서 검정이 쓰는 것은 각 관측이 아니라 평균의 분포라고 했습니다. 149강의 중심극한정리가 얼마나 빨리 작동하는지가 답을 정합니다.
풀이. (1) 참 차이를 으로 두고 보다 자주 기각하는지 셉니다.
| 자료의 분포 | 크기 | 크기 | 크기 |
|---|---|---|---|
| 정규 | |||
| 균등 | |||
| 지수 | |||
| 로그정규 | |||
| 코시 |
어긋남이 전부 목표보다 아래쪽입니다. 두 집단이 같은 방향으로 치우쳐 있어 치우침이 뺄셈에서 서로 상쇄되기 때문이며, 이 배치에서 검정은 너무 조심스러워집니다.
로그정규는 크기가 이어도 입니다. 올라오고는 있지만 아직 멉니다.
코시는 크기를 늘려도 안 낫습니다. 164강에서 본 대로 분산이 없어 중심극한정리가 안 통합니다.
(2) 상쇄가 성립하는 것은 두 집단이 대칭일 때뿐입니다. 크기를 어긋나게 해 봅니다.
| 자료의 분포 | 대 | 대 | 대 |
|---|---|---|---|
| 정규 | |||
| 지수 | |||
| 로그정규 |
로그정규가 에서 로 방향을 바꿉니다. 같은 분포, 같은 총 표본인데 어느 쪽을 크게 뽑았느냐만으로 너무 조심스러운 검정이 너무 자주 기각하는 검정이 됩니다.
정규는 어느 배치에서도 맞습니다. 그래서 문제가 정규성 자체가 아니라 치우침과 설계의 짝에 있습니다.
(3) 그런데 오류율보다 앞선 물음이 있습니다. 로그정규 자료 만 개를 봅니다.
| 요약값 | 값 | 아래에 몇 퍼센트 |
|---|---|---|
| 평균 | ||
| 중앙값 | ||
| 절사평균 퍼센트 |
평균 아래에 퍼센트가 몰려 있습니다. 163강에서 평균이 이상치에 끌린다고 했는데, 치우친 분포에서는 이상치가 없어도 평균이 다수에서 멀어집니다.
그러면 "평균이 다릅니까"가 좋은 물음인지부터 따져야 합니다. 검정을 고르기 전에 무엇을 견줄지를 정해야 합니다.
이 문제에서 배우는 것. "정규성 검정을 먼저 하라"는 조언이 두 번 틀립니다. 첫째로 178강 문제 2와 같은 두 단계 절차 문제가 생기고, 둘째로 정규성이 깨졌다는 사실 자체가 무엇을 해야 할지 말해 주지 않습니다. (1)에서는 가 너무 조심스러웠고 (2)에서는 너무 헤펐는데, 정규성 검정은 그 방향을 알려 주지 않습니다. 봐야 할 것은 치우침의 방향과 두 집단의 크기 배치이며, 그것은 자료가 아니라 설계를 보면 압니다.
바로 확인 1.
확인 1-1. 검산에서 로그정규 크기 의 오류율을 쓰고 방향을 밝히세요.
답. 이며 목표보다 아래라 너무 조심스러운 쪽입니다.
확인 1-2. 검산에서 로그정규가 대 일 때의 오류율을 쓰세요.
답. 이며 같은 크기일 때의 와 방향이 반대입니다.
확인 1-3. 검산에서 로그정규 자료의 평균 아래에 몇 퍼센트가 있는지 쓰세요.
답. 퍼센트입니다.
문제. 값 대신 순위를 씁니다.
(1) 순위합과 통계량을 구하세요.
(2) 가 무엇을 세는지 확인하세요.
(3) 극단값을 바꿔 강건함을 확인하세요.
생각의 실마리. 분포 모양이 문제라면 모양에 안 걸리는 것을 쓰면 됩니다. 값을 순서로 바꾸면 어떤 단조 변환에도 안 변합니다.
풀이. (1) 두 집단을 합쳐 순위를 매깁니다.
| 집단 | 값 | 순위합 |
|---|---|---|
| A | ||
| B |
순위합이 같을 때 기대되는 값은 입니다. A의 순위합이 그보다 훨씬 큽니다.
는 이고 기대는 입니다. 표준화한 는 입니다.
(2) 가 무엇을 세는지 직접 확인합니다.
A의 값이 B의 값보다 큰 짝의 수를 세면 입니다. 순위합에서 계산한 와 정확히 같습니다.
무작위로 하나씩 뽑았을 때 A가 클 확률이며, 이것을 확률 우위라 합니다.
순위 검정이 실제로 재는 것이 이 값입니다. 중앙값도 평균도 아니고, 한 쌍을 뽑았을 때 어느 쪽이 클 확률입니다.
(3) 강건함을 확인합니다. A의 을 으로 바꿉니다.
| 자료 | 웰치 | 순위 |
|---|---|---|
| 원래 | ||
| 을 으로 |
는 에서 로 반토막이 나는데 순위 는 소수점까지 그대로입니다.
값이 커지면 A의 평균은 오르는데 A의 분산이 더 크게 올라 분모가 이겨 버립니다. 순위는 도 그냥 가장 큰 값 하나로 셉니다.
이것이 강건함이며 동시에 정보를 버린다는 뜻이기도 합니다. 이 진짜로 중요한 값이었다면 순위 검정은 그것을 못 봅니다.
이 문제에서 배우는 것. 순위 검정을 "중앙값 검정"이라 부르는 것이 틀린 이름입니다. 이 재는 것은 확률 우위이고, 이것이 인지 묻는 검정입니다. 중앙값이 같아도 확률 우위가 가 아닐 수 있고 그 반대도 됩니다. 실무에서 "중앙값에 차이가 있습니다"라고 보고하려면 모양이 같다는 가정을 추가로 걸어야 하며, 그 가정은 문제 3에서 검사합니다.
바로 확인 2.
확인 2-1. 통계량을 두 가지 방식으로 설명하세요.
답. 순위합에서 를 뺀 값이고 A가 B보다 큰 짝의 수입니다.
확인 2-2. 검산에서 확률 우위 값을 쓰고 뜻을 밝히세요.
답. 이며 하나씩 뽑았을 때 A가 클 확률입니다.
확인 2-3. 검산에서 을 으로 바꿨을 때 두 통계량을 쓰세요.
답. 웰치 는 에서 가 되고 순위 는 그대로입니다.
문제. 두 방법을 견줍니다.
(1) 분포별 검출력을 재세요.
(2) 순위 검정의 가정을 정리하세요.
(3) 가정이 깨지는 경우를 만드세요.
생각의 실마리. 강건함이 공짜일 리 없습니다. 정규 자료에서 얼마나 손해인지부터 잽니다.
풀이. (1) 집단당 개로 검출력을 견줍니다.
| 자료의 분포 | 웰치 검출력 | 순위 검정 검출력 | 순위 / |
|---|---|---|---|
| 정규 | |||
| 균등 | |||
| 지수 | |||
| 로그정규 | |||
| 코시 |
정규에서 순위가 대 으로 조금 손해입니다.
이론상 상대효율이 이며 같은 검출력을 내려면 표본이 퍼센트 더 듭니다. 정규 자료에서조차 손해가 이 정도뿐입니다.
꼬리가 두꺼워질수록 순위가 유리해집니다. 로그정규에서 배, 코시에서 배이며, 잃는 것보다 얻는 것이 훨씬 큽니다.
(2) 그런데 순위 검정도 가정이 없는 것은 아닙니다.
| 무엇을 가정하는가 | 깨지면 |
|---|---|
| 두 집단의 관측이 독립 | 둘 다 무너집니다 |
| 분포 모양이 같음 | 중앙값 비교가 아니게 됩니다 |
| 연속형이라 동점이 드묾 | 분산 보정이 필요합니다 |
둘째 줄이 오해가 가장 많습니다.
(3) 모양이 다른 경우를 만듭니다. **두 집단의 중앙값과 평균이 모두 이고 표준편차만 과 **입니다.
| 무엇으로 | 기각률 | 목표 |
|---|---|---|
| 웰치 | ||
| 순위 검정 |
순위 검정이 로 목표의 배입니다. 중앙값이 같은데도 기각합니다.
확률 우위 자체는 입니다. 두 정규분포의 차 가 을 중심으로 대칭이기 때문입니다. 그런데 분산이 다르면 의 흩어짐이 귀무가설 공식과 달라져 정규 근사가 깨집니다.
모양이 다를 수 있으면 순위 검정을 중앙값 비교로 읽으면 안 됩니다. 웰치가 여기서는 오히려 정확합니다.
이 문제에서 배우는 것. "비모수는 가정이 없다"가 이 강의에서 깨야 할 가장 큰 오해입니다. 순위 검정은 분포의 모양을 가정하지 않을 뿐 두 분포가 서로 같은 모양이라고 가정합니다. 그래서 178강의 등분산 문제가 사라진 것이 아니라 모양 문제로 이름을 바꿔 남아 있습니다. 실무에서 두 집단의 흩어짐이 다를 이유가 있다면, 순위 검정으로 도망가는 것이 해결이 아닙니다. 그럴 때는 무엇을 견주고 싶은지 다시 정하는 것이 유일한 길입니다.
바로 확인 3.
확인 3-1. 검산에서 정규 자료의 두 검출력과 이론상 상대효율을 쓰세요.
답. 과 이고 상대효율은 입니다.
확인 3-2. 검산에서 순위가 가장 크게 이긴 분포와 배수를 쓰세요.
답. 코시이며 배입니다.
확인 3-3. 검산에서 분산만 다를 때 순위 검정의 기각률을 쓰세요.
답. 이며 목표의 배입니다.
문제. 가정 대신 자료로 분포를 만듭니다.
(1) 순열 검정을 구성하세요.
(2) 붓스트랩으로 구간을 만드세요.
(3) 네 방법의 귀무가설을 견주세요.
생각의 실마리. 귀무가설이 참이면 A와 B라는 라벨이 아무 뜻이 없습니다. 그러면 라벨을 바꿔 붙여도 자료가 똑같이 그럴듯해야 합니다.
풀이. (1) 관측된 평균 차이는 입니다. 개를 대 로 나누는 가지를 모두 세어 이만한 차이가 나올 비율을 구합니다.
| 무엇으로 | 양측 값 |
|---|---|
| 순열 검정 | |
| 웰치 | |
| 순위 검정 근사 |
순열과 순위가 로 거의 같고 웰치 만 로 다릅니다.
이라는 큰 값이 A의 분산을 키워 의 분모를 부풀렸기 때문입니다. 문제 2에서 본 것과 같은 일이며, 표본이 개뿐이라 근사가 특히 나쁩니다.
순열 검정은 근사가 아니라 정확한 값입니다. 가지를 다 셌으므로 더 정확할 수가 없으며, 어떤 분포도 가정하지 않습니다.
대신 있는 자료를 바꿔 넣기만 하고 새 자료를 만들지는 않습니다.
(2) 붓스트랩은 각 집단에서 복원추출로 다시 뽑아 차이를 만 번 만듭니다.
| 무엇으로 | 퍼센트 구간 | 폭 |
|---|---|---|
| 붓스트랩 백분위 | ||
| 웰치 구간 |
붓스트랩 구간은 을 안 넣고 웰치 구간은 을 넣습니다. 같은 자료에서 결론이 갈립니다.
붓스트랩 차이의 중앙값은 이고 관측값은 입니다. 관측값보다 조금 아래인데, 이 안 뽑힌 재표본이 많기 때문입니다.
웰치는 대칭 구간이라 이 부풀린 표준오차를 양쪽에 똑같이 씁니다. 붓스트랩은 실제로 나온 값들을 그대로 쓰므로 좌우가 다릅니다.
다만 작은 표본에서 붓스트랩은 원자료 밖의 값을 만들지 못합니다. 개로 만들 수 있는 재표본의 평균은 그 개의 조합뿐이므로, 표본에 없는 극단은 영영 안 나타납니다.
(3) 네 방법의 귀무가설을 견줍니다.
| 방법 | 귀무가설 | 무엇을 가정 |
|---|---|---|
| 웰치 | 두 평균이 같다 | 평균의 정규성 |
| 순위 검정 | 확률 우위가 다 | 모양이 같음 |
| 순열 검정 | 라벨이 무의미하다 | 교환가능성 |
| 붓스트랩 | 가설 대신 구간을 준다 | 표본이 모집단을 닮음 |
귀무가설이 다르므로 결론도 다른 뜻입니다. 골라 쓰는 것이 아니라 물음이 방법을 정합니다.
이 문제에서 배우는 것. " 값이 유의합니다"라는 문장은 어떤 귀무가설을 기각했는지 밝히지 않으면 뜻이 없습니다. 위 표의 넷은 전부 다른 것을 기각하며, 순열 검정의 "라벨이 무의미하다"는 평균만이 아니라 분포 전체가 같다는 강한 가설입니다. 그래서 순열 검정이 기각했다고 평균이 다르다고 말할 수 없고, 분산만 달라도 기각됩니다. 방법을 바꿔 가며 유의한 것을 찾는 관행이 위험한 이유가 여기 있는데, 기각한 대상이 매번 달라지기 때문입니다.
바로 확인 4.
확인 4-1. 순열 검정의 귀무가설과 계산 방식을 쓰세요.
답. 라벨이 무의미하다는 것이며 가능한 모든 나눔에서 비율을 셉니다.
확인 4-2. 검산에서 세 방법의 값을 쓰고 왜 하나만 다른지 쓰세요.
답. , , 이며 이 의 분모를 부풀렸기 때문입니다.
확인 4-3. 검산에서 두 구간을 쓰고 결론이 어떻게 갈리는지 쓰세요.
답. 과 이며 앞쪽만 을 뺍니다.
문제. 방법을 고릅니다.
(1) 로그 변환의 이득을 재세요.
(2) 변환 뒤 해석이 어떻게 바뀌는지 정리하세요.
(3) 고르는 순서를 세우세요.
생각의 실마리. 문제 3에서 순위 검정이 로그정규에 강했습니다. 그런데 로그를 취하면 로그정규가 정규가 됩니다. 그러면 를 그냥 써도 되지 않는지 봅니다.
풀이. (1) 로그 척도에서 만큼 차이 나는 두 로그정규 집단입니다.
| 무엇으로 | 검출력 |
|---|---|
| 원자료에 웰치 | |
| 로그 뒤 웰치 | |
| 순위 검정 |
로그를 취하면 검출력이 에서 까지 오릅니다. 순위 검정도 로 거의 같은 자리에 있습니다.
셋의 순서가 문제 3과 다릅니다. 문제 3에서는 원자료 가 이고 순위가 이었는데, 그때는 평균 차이 자체를 크게 두었고 여기서는 로그 척도에서 두었기 때문입니다. 무엇을 차이라 부르느냐가 답을 바꿉니다.
(2) 그런데 변환에는 대가가 있습니다.
| 로그 척도에서 | 원래 척도에서 |
|---|---|
| 평균의 차이 | 기하평균의 비 |
| 만큼 크다 | 배 |
| 대칭인 구간 | 곱셈으로 대칭인 구간 |
132강의 젠센 부등식이 여기서 다시 나옵니다. 로그의 평균을 되돌리면 산술평균이 아니라 기하평균이 됩니다.
그래서 결과가 차이가 아니라 비로 해석됩니다. "배"는 "만큼 크다"와 다른 진술이며, 보고할 때 단위를 반드시 밝혀야 합니다.
(3) 고르는 순서를 세웁니다.
| 상황 | 무엇을 쓰는가 |
|---|---|
| 표본이 크고 평균이 관심 | 웰치 |
| 치우쳤고 비율로 해석 가능 | 로그 뒤 웰치 |
| 꼬리가 두껍거나 이상치 | 순위 검정 |
| 표본이 아주 작음 | 순열 검정 |
| 구간이 필요함 | 붓스트랩 |
| 중앙값 자체가 관심 | 중앙값의 붓스트랩 |
자료를 보고 고르면 178강 문제 2의 두 단계 절차 문제가 되풀이됩니다.
무엇을 견주고 싶은지로 먼저 고르고 그다음에 자료의 모양을 봅니다.
이 문제에서 배우는 것. 변환은 자료를 고치는 것이 아니라 물음을 바꾸는 것입니다. 로그를 취해 정규성을 얻는 대신 답이 비로 바뀌었고, 그것이 손해인지 이득인지는 도메인이 정합니다. 매출이나 반응시간처럼 비율로 말하는 것이 자연스러운 양이면 로그가 오히려 옳은 척도이고, 온도차처럼 차이가 뜻을 갖는 양이면 변환이 답을 흐립니다. 176강에서 눈금이 어긋난 저울이 기울기를 바꾼다고 했는데, 변환은 눈금을 일부러 바꾸는 일이며 그래서 반드시 밝혀야 합니다.
바로 확인 5.
확인 5-1. 검산에서 원자료와 로그 뒤의 검출력을 쓰세요.
답. 과 입니다.
확인 5-2. 로그 척도의 평균 차이가 원래 척도에서 무엇인지 쓰세요.
답. 기하평균의 비이며 는 배입니다.
확인 5-3. 방법을 고르는 순서를 쓰세요.
답. 무엇을 견줄지 먼저 정하고 그다음에 자료의 모양을 봅니다.
| 방법 | 귀무가설 | 강한 점 | 약한 점 |
|---|---|---|---|
| 웰치 | 두 평균이 같다 | 해석이 쉽습니다 | 이상치에 끌립니다 |
| 순위 검정 | 확률 우위가 | 이상치에 강합니다 | 모양이 같아야 합니다 |
| 순열 검정 | 라벨이 무의미하다 | 정확합니다 | 가설이 강합니다 |
| 붓스트랩 | 구간을 줍니다 | 어떤 통계량에도 씁니다 | 작은 표본에 약합니다 |
| 언제 무엇이 위험한가 | 왜 |
|---|---|
| 치우쳤고 크기가 같음 | 가 너무 조심스럽습니다 |
| 치우쳤고 크기가 다름 | 가 너무 헤픕니다 |
| 분산이 다름 | 순위 검정이 헤픕니다 |
| 꼬리가 아주 두꺼움 | 의 검출력이 무너집니다 |
| 표본이 아주 작음 | 어떤 근사도 못 믿습니다 |
| 자주 하는 실수 | 바로잡기 |
|---|---|
| 정규성 검정을 먼저 합니다 | 방향을 안 알려 주고 절차만 망칩니다 |
| 비모수는 가정이 없다고 봅니다 | 모양이 같다고 가정합니다 |
| 순위 검정을 중앙값 검정이라 부릅니다 | 확률 우위를 잽니다 |
| 여러 방법 중 유의한 것을 고릅니다 | 기각한 대상이 매번 다릅니다 |
| 로그 결과를 차이로 보고합니다 | 비로 해석해야 합니다 |
| 작은 표본에 붓스트랩을 믿습니다 | 원자료 밖으로 못 나갑니다 |
문제 6. 검산에서 로그정규 크기 의 오류율과 방향을 쓰세요.
답. 이며 목표보다 아래라 너무 조심스러운 쪽입니다.
문제 7. 치우친 자료에서 가 조심스러워지는 이유를 쓰세요.
답. 두 집단이 같은 방향으로 치우쳐 뺄셈에서 상쇄되기 때문입니다.
문제 8. 검산에서 로그정규가 대 일 때와 같은 크기일 때의 오류율을 쓰세요.
답. 과 로 방향이 반대입니다.
문제 9. 검산에서 로그정규 자료의 평균과 중앙값을 쓰세요.
답. 과 이며 평균 아래에 퍼센트가 있습니다.
문제 10. 통계량을 두 가지 방식으로 설명하세요.
답. 순위합에서 를 뺀 값이고 A가 B보다 큰 짝의 수입니다.
문제 11. 검산에서 확률 우위 값을 쓰고 뜻을 밝히세요.
답. 이며 하나씩 뽑았을 때 A가 클 확률입니다.
문제 12. 검산에서 을 으로 바꿨을 때 두 통계량을 쓰세요.
답. 웰치 는 가 되고 순위 는 그대로입니다.
문제 13. 정규 자료에서 순위 검정의 이론상 상대효율을 쓰세요.
답. 이며 표본이 퍼센트 더 듭니다.
문제 14. 검산에서 순위가 가장 크게 이긴 분포와 배수를 쓰세요.
답. 코시이며 배입니다.
문제 15. 검산에서 분산만 다를 때 순위 검정의 기각률을 쓰세요.
답. 이며 목표의 배입니다.
문제 16. 검산에서 순열 검정과 웰치 의 값을 쓰세요.
답. 와 입니다.
문제 17. 검산에서 붓스트랩 구간과 웰치 구간을 쓰세요.
답. 과 입니다.
문제 18. 로그 척도의 평균 차이가 원래 척도에서 무엇인지 쓰세요.
답. 기하평균의 비이며 는 배입니다.
심화 1. 순위 검정의 정확 분포를 정리하세요.
문제 2의 는 정규 근사였습니다. 작은 표본에서는 정확 분포를 씁니다.
가 가질 수 있는 값의 개수를 직접 셉니다. 이면 가지 나눔이 있고, 각각의 를 세면 분포가 나옵니다.
| 표본 크기 | 정확 분포 | 정규 근사 |
|---|---|---|
| 씁니다 | 오차가 큽니다 | |
| 보다 큼 | 계산이 무겁습니다 | 쓸 만합니다 |
| 동점이 있음 | 조합이 달라집니다 | 분산 보정이 필요합니다 |
셋째 줄이 실무에서 자주 걸립니다. 만족도 점 척도처럼 값의 종류가 적으면 동점이 많아 정규 근사의 분산 공식이 틀립니다.
동점 묶음이 클수록 분산이 줄어들어 보정 없이는 너무 조심스러운 검정이 됩니다.
심화 2. 짝지은 자료의 비모수 대안을 정리하세요.
178강 문제 3의 짝지은 에도 대안이 있습니다.
| 방법 | 무엇을 쓰는가 |
|---|---|
| 부호 검정 | 차이의 부호만 셉니다 |
| 윌콕슨 부호순위 | 차이의 크기 순위에 부호를 붙입니다 |
| 짝지은 순열 | 각 짝의 부호를 뒤집어 봅니다 |
첫째 줄이 가장 강건하고 가장 약합니다. 차이가 이든 이든 똑같이 한 표로 셉니다.
둘째 줄이 절충입니다. 크기의 순서는 쓰되 값 자체는 안 쓰며, 차이의 분포가 대칭이라고 가정합니다.
셋째 줄이 짝지은 순열 검정입니다. 개의 짝마다 부호를 뒤집을지 말지 정하므로 가지이며, 이면 가지로 정확한 계산이 가능합니다.
심화 3. 분산을 견주는 검정을 정리하세요.
지금까지는 중심을 견줬습니다. 흩어짐 자체가 관심일 때도 있습니다.
| 방법 | 어떻게 |
|---|---|
| 검정 | 두 분산의 비를 봅니다 |
| 레벤 | 중심에서의 거리로 를 합니다 |
| 브라운-포사이드 | 중앙값에서의 거리를 씁니다 |
첫째 줄이 정규성에 아주 약합니다. 178강의 가 정규성에 강했던 것과 대조되는데, 분산은 평균과 달리 중심극한정리의 보호를 못 받기 때문입니다.
셋째 줄이 실무의 기본값입니다. 중앙값을 쓰므로 치우친 자료에서도 버팁니다.
그런데 178강 문제 2의 결론이 여기서도 적용됩니다. 등분산 검정을 해서 방법을 고르는 절차가 문제였으므로, 분산 검정은 분산 자체가 관심일 때만 씁니다.
심화 4. 붓스트랩의 종류를 정리하세요.
문제 4에서 쓴 것은 백분위 방법이며, 가장 단순하고 가장 편향에 약합니다.
| 방법 | 무엇을 고치는가 |
|---|---|
| 백분위 | 아무것도 안 고칩니다 |
| 기본 | 좌우를 뒤집습니다 |
| BCa | 편향과 왜도를 고칩니다 |
| 붓스트랩 | 표준화한 통계량을 씁니다 |
셋째 줄이 실무의 권장값입니다. 이름의 BC가 편향 보정이고 a가 가속인데, 재표본 분포가 관측값을 중심으로 치우친 정도를 재서 구간을 옮깁니다.
문제 4에서 붓스트랩 중앙값 이 관측값 보다 아래였습니다. 그 차이가 편향의 신호이며, BCa는 그만큼 구간을 오른쪽으로 밉니다.
어느 방법이든 표본이 작으면 못 믿습니다. 붓스트랩의 이론은 표본이 모집단을 닮았다는 가정 위에 서 있고, 개는 아무것도 닮지 못합니다.
심화 5. 동등성 검정을 정리하세요.
178강 문제 5에서 유의하지 않음이 차이가 없음이 아니라고 했습니다. 정말 같다고 말하려면 물음을 뒤집습니다.
귀무가설과 대립가설을 바꿔 답니다. 이제 기각하면 **"차이가 보다 작다"**는 결론이 나옵니다.
| 무엇이 필요한가 | 왜 |
|---|---|
| 동등성 한계 | 무엇을 같다고 볼지 정해야 합니다 |
| 두 번의 단측검정 | 양쪽에서 각각 밀어냅니다 |
| 더 큰 표본 | 같음을 보이는 것이 더 어렵습니다 |
첫째 줄이 통계가 아니라 도메인의 일입니다. 약효가 퍼센트 다른 것이 같은 것인지는 자료가 못 정합니다.
제네릭 의약품 승인이 이 틀을 씁니다. 오리지널과 같음을 보여야 하므로, 유의하지 않음으로는 부족합니다.
심화 6. 이 강의가 어디에 쓰이는지 정리하세요.
| 분야 | 쓰임 | 이어지는 강의 |
|---|---|---|
| 집단이 셋 이상 | 크러스컬-월리스 | 180강 |
| 범주형 자료 | 정확검정 | 181강 |
| 여러 지표 동시 | 순열 기반 보정 | 182강 |
| 모형 평가 | 붓스트랩 구간 | S9 |
셋째 줄이 강력합니다. 182강의 다중비교 보정 중 순열로 만든 것이 가장 정확한데, 지표들 사이의 상관까지 자료가 알아서 담기 때문입니다.
넷째 줄이 가장 멀리 갑니다. 모형의 정확도 차이에 구간을 붙이는 표준 방법이 붓스트랩이며, 모형 둘 중 무엇이 나은지를 말할 때 반드시 필요합니다.
정답.
| 기호 | 읽는 법 | 뜻 |
|---|---|---|
| 유 통계량 | A가 B보다 큰 짝의 수입니다 | |
| 순위합 | rank sum | 합친 순위 중 한 집단의 합입니다 |
| 맨-휘트니 | Mann-Whitney U | 두 집단의 순위 검정입니다 |
| 윌콕슨 순위합 | Wilcoxon rank-sum | 같은 검정의 다른 이름입니다 |
| 확률 우위 | stochastic dominance | 하나씩 뽑아 A가 클 확률입니다 |
| ARE | 점근 상대효율 | 같은 검출력에 드는 표본의 비입니다 |
| 순열 검정 | permutation test | 라벨을 바꿔 분포를 만듭니다 |
| 교환가능성 | exchangeability | 라벨을 바꿔도 분포가 같습니다 |
| 붓스트랩 | bootstrap | 복원추출로 재표본을 만듭니다 |
| 백분위 구간 | percentile interval | 재표본 분포의 분위수를 씁니다 |
| BCa | 편향 보정 가속 | 편향과 왜도를 고친 구간입니다 |
| 부호순위 검정 | signed-rank test | 짝지은 자료의 순위 검정입니다 |
| 동등성 검정 | equivalence test | 같음을 보이려는 검정입니다 |
다음은 180강 분산분석입니다. 이 강의까지가 집단 둘이었습니다.
안 됩니다. 178강 문제 4에서 여러 번 보면 오류율이 오른다고 했는데, 세 쌍을 각각 로 검정하면 전체 오류율이 를 크게 넘습니다. 180강은 그 값을 직접 재고, 한 번에 묻는 방법을 만들며, 그것이 왜 분산의 비교로 이름 붙었는지를 다룹니다.
import numpy as np
rng = np.random.default_rng(20260916)
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 ranks(v):
o = np.argsort(v, kind="mergesort")
r = np.empty(len(v), dtype=float)
r[o] = np.arange(1, len(v) + 1, dtype=float)
s = np.sort(v)
i = 0
while i < len(s):
j = i
while j + 1 < len(s) and s[j + 1] == s[i]:
j += 1
if j > i:
r[o[i:j + 1]] = 0.5 * (i + j) + 1.0
i = j + 1
return r
def mw_z(a, b):
n1, n2 = len(a), len(b)
r = ranks(np.concatenate([a, b]))
R1 = r[:n1].sum()
U = R1 - n1 * (n1 + 1) / 2.0
mu = n1 * n2 / 2.0
sd = np.sqrt(n1 * n2 * (n1 + n2 + 1) / 12.0)
return (U - mu) / sd
def welch_t(a, b):
va, vb = a.var(ddof=1) / len(a), b.var(ddof=1) / len(b)
return (a.mean() - b.mean()) / np.sqrt(va + vb)
def welch_df(a, b):
va, vb = a.var(ddof=1) / len(a), b.var(ddof=1) / len(b)
return (va + vb) ** 2 / (va ** 2 / (len(a) - 1) + vb ** 2 / (len(b) - 1))
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 betacf(a, b, x):
c, d = 1.0, 1.0 - (a + b) * x / (a + 1.0)
d = 1.0 / (1e-300 if abs(d) < 1e-300 else d)
h = d
for m in range(1, 300):
num = m * (b - m) * x / ((a + 2 * m - 1) * (a + 2 * m))
d = 1.0 + num * d
c = 1.0 + num / c
d = 1.0 / (1e-300 if abs(d) < 1e-300 else d)
c = 1e-300 if abs(c) < 1e-300 else c
h *= d * c
num = -(a + m) * (a + b + m) * x / ((a + 2 * m) * (a + 2 * m + 1))
d = 1.0 + num * d
c = 1.0 + num / c
d = 1.0 / (1e-300 if abs(d) < 1e-300 else d)
c = 1e-300 if abs(c) < 1e-300 else c
de = d * c
h *= de
if abs(de - 1.0) < 1e-14:
break
return h
def betainc(a, b, x):
if x <= 0.0:
return 0.0
if x >= 1.0:
return 1.0
lbeta = gammaln(a) + gammaln(b) - gammaln(a + b)
if x < (a + 1.0) / (a + b + 2.0):
return np.exp(a * np.log(x) + b * np.log(1.0 - x) - lbeta) * betacf(a, b, x) / a
return 1.0 - np.exp(b * np.log(1.0 - x) + a * np.log(x) - lbeta) * betacf(b, a, 1.0 - x) / b
def erf(x):
a = abs(float(x))
if a > 6.0:
return 1.0 if x > 0 else -1.0
t, ssum, k = 1.0, 1.0, 0
while True:
k += 1
t *= 2.0 * a * a / (2.0 * k + 1.0)
ssum += t
if t < 1e-18 * ssum:
break
v = 2.0 * a / np.sqrt(np.pi) * np.exp(-a * a) * ssum
return v if x > 0 else -v
def znorm_p2(z):
return 1.0 - erf(abs(float(z)) / np.sqrt(2.0))
def tcrit(df, alpha=0.05):
lo, hi = 0.0, 60.0
for _ in range(200):
mid = 0.5 * (lo + hi)
p = betainc(0.5 * df, 0.5, df / (df + mid * mid))
if p > alpha:
lo = mid
else:
hi = mid
return 0.5 * (lo + hi)
# --- 문제 1: 정규성이 정말 필요한가 -------------------------------------
print(" 178강의 t 검정은 정규분포를 가정합니다")
print(" 가정이 깨졌을 때 실제 오류율을 재 봅니다. 참 차이는 0 입니다")
R1, ZC = 20000, 1.959964
print(" %s %s %s %s" % (pw("자료의 분포", 22), rw("크기 10", 12),
rw("크기 30", 12), rw("크기 100", 12)))
def draw(kind, shape):
if kind == "정규":
return rng.normal(0, 1, shape)
if kind == "균등":
return rng.random(shape)
if kind == "지수":
return rng.exponential(1.0, shape)
if kind == "로그정규":
return np.exp(rng.normal(0, 1.5, shape))
if kind == "코시":
return rng.standard_cauchy(shape)
return rng.normal(0, 1, shape)
for kind in ["정규", "균등", "지수", "로그정규", "코시"]:
row = []
for n in [10, 30, 100]:
A = draw(kind, (R1, n))
B = draw(kind, (R1, n))
t = (A.mean(1) - B.mean(1)) / np.sqrt((A.var(1, ddof=1) + B.var(1, ddof=1)) / n)
row.append(float((np.abs(t) > tcrit(2 * n - 2)).mean()))
print(" %s %12.4f %12.4f %12.4f" % (pw(kind, 22), row[0], row[1], row[2]))
print(" 목표는 0.05 입니다. 정규와 균등은 크기 10 에서도 맞습니다")
print(" 치우친 분포는 목표보다 아래로 어긋납니다. 두 집단이 같은 방향으로")
print(" 치우쳐 있어 치우침이 뺄셈에서 서로 상쇄되기 때문입니다")
print(" 크기가 늘면 로그정규가 0.0237 에서 0.0370 으로 올라오지만 아직 멉니다")
print(" 코시는 크기를 늘려도 안 낫습니다. 분산이 없어 중심극한정리가 안 통합니다")
print(" 두 집단의 크기가 다르면 상쇄가 깨집니다")
print(" %s %s %s %s" % (pw("자료의 분포", 22), rw("10 대 10", 12),
rw("10 대 40", 12), rw("40 대 10", 12)))
for kind in ["정규", "지수", "로그정규"]:
row = []
for na, nb in [(10, 10), (10, 40), (40, 10)]:
M = 8000
A = draw(kind, (M, na))
B = draw(kind, (M, nb))
va, vb = A.var(1, ddof=1) / na, B.var(1, ddof=1) / nb
t = (A.mean(1) - B.mean(1)) / np.sqrt(va + vb)
df = (va + vb) ** 2 / (va ** 2 / (na - 1) + vb ** 2 / (nb - 1))
hit = 0
for tt, dd in zip(t, df):
if betainc(0.5 * dd, 0.5, dd / (dd + tt * tt)) < 0.05:
hit += 1
row.append(hit / float(M))
print(" %s %12.4f %12.4f %12.4f" % (pw(kind, 22), row[0], row[1], row[2]))
print(" 정규는 어느 배치에서도 맞습니다. 치우친 분포는 배치에 따라 흔들립니다")
print(" 같은 자료라도 어느 쪽을 크게 뽑았느냐로 오류율이 달라집니다")
print(" 치우친 자료에서는 평균 자체가 대표성을 잃습니다")
lg = np.exp(rng.normal(0.0, 1.5, 200000))
print(" 로그정규 자료 20 만 개를 봅니다")
print(" %s %s %s" % (pw("요약값", 20), rw("값", 14), rw("아래에 몇 퍼센트", 20)))
for nm, v in [("평균", float(lg.mean())), ("중앙값", float(np.median(lg))),
("절사평균 10 퍼센트", float(np.sort(lg)[20000:180000].mean()))]:
print(" %s %14.4f %20.2f" % (pw(nm, 20), v, float((lg < v).mean() * 100)))
print(" 평균 아래에 77 퍼센트가 몰려 있습니다. 평균은 대표값이 아닙니다")
print(" 중앙값은 정의상 절반입니다. 무엇을 견줄지부터 정해야 합니다")
# --- 문제 2: 순위로 견주기 ---------------------------------------------
print(" 값 대신 순위를 쓰면 분포 모양에서 벗어납니다")
a2 = np.array([12.0, 15.0, 9.0, 22.0, 11.0, 40.0, 13.0])
b2 = np.array([8.0, 10.0, 7.0, 14.0, 6.0, 9.0, 5.0])
al = np.concatenate([a2, b2])
r2 = ranks(al)
print(" 두 집단을 합쳐 순위를 매기고 한쪽의 순위합을 봅니다")
print(" %s %s %s" % (pw("집단", 8), rw("값", 42), rw("순위합", 10)))
print(" %s %s %10.1f" % (pw("A", 8), rw(" ".join("%g" % v for v in a2), 42),
float(r2[:7].sum())))
print(" %s %s %10.1f" % (pw("B", 8), rw(" ".join("%g" % v for v in b2), 42),
float(r2[7:].sum())))
n1 = n2 = 7
U2 = r2[:7].sum() - n1 * (n1 + 1) / 2.0
print(" 순위합이 같을 때 기대되는 값은 %.1f 입니다" % (n1 * (n1 + n2 + 1) / 2.0))
print(" U = 순위합 - n(n+1)/2 = %.1f 이고 기대는 %.1f 입니다"
% (U2, n1 * n2 / 2.0))
print(" 표준화한 z 는 %.4f 입니다" % mw_z(a2, b2))
print(" U 는 두 값을 짝지어 비교한 횟수와 같습니다")
cnt = 0
for x in a2:
for y in b2:
cnt += 1.0 if x > y else (0.5 if x == y else 0.0)
print(" A 의 값이 B 의 값보다 큰 짝의 수를 세면 %.1f 입니다" % cnt)
print(" 순위합에서 계산한 U 와 정확히 같습니다")
print(" U / (n1 x n2) = %.4f 이며 무작위로 하나씩 뽑아 A 가 클 확률입니다"
% (cnt / (n1 * n2)))
print(" 이 값을 확률 우위라 하고 순위 검정이 실제로 재는 것입니다")
print(" 40 을 4000 으로 바꿔도 순위는 그대로입니다")
a2b = a2.copy()
a2b[5] = 4000.0
print(" %s %s %s" % (pw("자료", 22), rw("웰치 t", 14), rw("순위 z", 14)))
print(" %s %14.4f %14.4f" % (pw("원래", 22), welch_t(a2, b2), mw_z(a2, b2)))
print(" %s %14.4f %14.4f" % (pw("40 을 4000 으로", 22), welch_t(a2b, b2), mw_z(a2b, b2)))
print(" t 는 값에 끌려다니고 순위는 꿈쩍도 안 합니다")
print(" 이것이 순위 검정의 강건함이며 동시에 정보를 버린다는 뜻이기도 합니다")
# --- 문제 3: 무엇을 얻고 무엇을 잃는가 ----------------------------------
print(" 강건함의 값은 검출력으로 치릅니다")
R3 = 20000
print(" 두 방법의 검출력을 여러 분포에서 견줍니다. 집단당 20 개입니다")
n3 = 20
tc3 = tcrit(2 * n3 - 2)
print(" %s %s %s %s" % (pw("자료의 분포", 20), rw("웰치 t 검출력", 16),
rw("순위 검정 검출력", 20), rw("순위 / t", 12)))
cases3 = [("정규", 0.0, 1.0), ("균등", 0.0, 1.0), ("지수", 0.0, 1.0),
("로그정규", 0.0, 1.0), ("코시", 0.0, 1.0)]
for kind, _, _ in cases3:
A = draw(kind, (R3, n3))
B = draw(kind, (R3, n3))
sh = {"정규": 0.9, "균등": 0.3, "지수": 0.9, "로그정규": 2.0, "코시": 1.5}[kind]
A = A + sh
t3 = (A.mean(1) - B.mean(1)) / np.sqrt((A.var(1, ddof=1) + B.var(1, ddof=1)) / n3)
pt = float((np.abs(t3) > tc3).mean())
zs = np.empty(4000)
for i in range(4000):
zs[i] = mw_z(A[i], B[i])
pr = float((np.abs(zs) > 1.959964).mean())
if kind == "정규":
pt_n, pr_n = pt, pr
print(" %s %16.4f %20.4f %12.4f"
% (pw(kind, 20), pt, pr, pr / pt if pt > 0 else 0.0))
print(" 정규에서는 순위가 조금 손해입니다. 검출력이 %.4f 에서 %.4f 입니다"
% (pt_n, pr_n))
print(" 이론상 상대효율은 3/pi = %.4f 이며 같은 검출력에 표본이 %.2f 퍼센트 더 듭니다"
% (3.0 / np.pi, (np.pi / 3.0 - 1.0) * 100))
print(" 꼬리가 두꺼워질수록 순위가 유리해지고 코시에서는 압도합니다")
print(" 정규가 아닐 것 같으면 순위 검정이 잃는 것보다 얻는 것이 큽니다")
print(" 순위 검정도 가정이 없는 것은 아닙니다")
print(" %s %s" % (pw("무엇을 가정하는가", 26), rw("깨지면", 26)))
for a, b in [("두 집단의 관측이 독립", "둘 다 무너집니다"),
("분포 모양이 같음", "중앙값 비교가 아니게 됩니다"),
("연속형이라 동점이 드묾", "분산 보정이 필요합니다")]:
print(" %s %s" % (pw(a, 26), rw(b, 26)))
print(" 둘째 줄이 오해가 많습니다. 순위 검정은 중앙값 검정이 아닙니다")
print(" 모양이 다르면 중앙값이 같아도 기각합니다")
N3b = 60
c1 = rng.normal(0.0, 1.0, (R3, N3b))
c2 = rng.normal(0.0, 4.0, (R3, N3b))
zs2 = np.empty(4000)
for i in range(4000):
zs2[i] = mw_z(c1[i], c2[i])
t3b = (c1.mean(1) - c2.mean(1)) / np.sqrt((c1.var(1, ddof=1) + c2.var(1, ddof=1)) / N3b)
print(" 두 집단의 중앙값과 평균이 모두 0 이고 표준편차만 1 과 4 입니다")
print(" %s %s %s" % (pw("무엇으로", 20), rw("기각률", 14), rw("목표", 10)))
print(" %s %14.4f %10.2f" % (pw("웰치 t", 20), float((np.abs(t3b) > tc3).mean()), 0.05))
print(" %s %14.4f %10.2f" % (pw("순위 검정", 20), float((np.abs(zs2) > 1.959964).mean()), 0.05))
print(" 순위 검정이 %.4f 로 목표의 %.2f 배입니다. 중앙값이 같은데도 기각합니다"
% (float((np.abs(zs2) > 1.959964).mean()),
float((np.abs(zs2) > 1.959964).mean()) / 0.05))
print(" 확률 우위는 0.5 지만 순위의 흩어짐이 달라 정규 근사가 깨집니다")
print(" 모양이 다를 수 있으면 순위 검정을 중앙값 비교로 읽으면 안 됩니다")
# --- 문제 4: 순열과 붓스트랩 --------------------------------------------
print(" 분포를 가정하지 않고 직접 만들 수도 있습니다")
a4 = np.array([12.0, 15.0, 9.0, 22.0, 11.0, 40.0, 13.0])
b4 = np.array([8.0, 10.0, 7.0, 14.0, 6.0, 9.0, 5.0])
obs = float(a4.mean() - b4.mean())
pool = np.concatenate([a4, b4])
combos = []
def build(start, chosen):
if len(chosen) == 7:
combos.append(list(chosen))
return
for k in range(start, 14):
chosen.append(k)
build(k + 1, chosen)
chosen.pop()
build(0, [])
tot = pool.sum()
dif = np.array([2.0 * pool[c].sum() / 7.0 - tot / 7.0 for c in combos])
p_perm = float((np.abs(dif) >= abs(obs) - 1e-9).mean())
print(" 귀무가설이 참이면 라벨을 섞어도 자료가 똑같이 그럴듯합니다")
print(" 관측된 평균 차이는 %.4f 입니다" % obs)
print(" 14 개를 7 대 7 로 나누는 %d 가지를 모두 세어 정확히 계산합니다" % len(combos))
print(" %s %s" % (pw("무엇으로", 22), rw("양측 p 값", 14)))
print(" %s %14.6f" % (pw("순열 검정", 22), p_perm))
tw4 = welch_t(a4, b4)
dfw4 = welch_df(a4, b4)
pw4 = betainc(0.5 * dfw4, 0.5, dfw4 / (dfw4 + tw4 * tw4))
print(" %s %14.6f" % (pw("웰치 t", 22), pw4))
z4 = mw_z(a4, b4)
print(" %s %14.6f" % (pw("순위 검정 근사", 22), znorm_p2(z4)))
print(" 순열과 순위가 %.4f 와 %.4f 로 거의 같고 웰치 t 만 %.4f 로 다릅니다"
% (p_perm, znorm_p2(z4), pw4))
print(" 40 이라는 큰 값이 A 의 분산을 키워 t 의 분모를 부풀렸기 때문입니다")
print(" 순열 검정은 근사가 아니라 정확한 값이며 어떤 분포도 가정하지 않습니다")
print(" 대신 있는 자료를 바꿔 넣기만 하고 새 자료를 만들지는 않습니다")
print(" 붓스트랩은 신뢰구간을 만듭니다")
R5 = 40000
ia = rng.integers(0, 7, (R5, 7))
ib = rng.integers(0, 7, (R5, 7))
bs = a4[ia].mean(1) - b4[ib].mean(1)
lo, hi = np.quantile(bs, [0.025, 0.975])
print(" 각 집단에서 복원추출로 다시 뽑아 차이를 4 만 번 만듭니다")
print(" %s %s %s" % (pw("무엇으로", 22), rw("95 퍼센트 구간", 22), rw("폭", 10)))
print(" %s %s %10.4f" % (pw("붓스트랩 백분위", 22),
rw("[%.4f, %.4f]" % (lo, hi), 22), float(hi - lo)))
se4 = np.sqrt(a4.var(ddof=1) / 7 + b4.var(ddof=1) / 7)
tc4 = tcrit(dfw4)
print(" %s %s %10.4f" % (pw("웰치 t 구간", 22),
rw("[%.4f, %.4f]" % (obs - tc4 * se4, obs + tc4 * se4), 22),
float(2 * tc4 * se4)))
print(" 붓스트랩 구간은 0 을 안 넣고 웰치 구간은 0 을 넣습니다. 결론이 갈립니다")
print(" 붓스트랩 차이의 중앙값은 %.4f 이고 관측값은 %.4f 입니다"
% (float(np.median(bs)), obs))
print(" 웰치는 대칭 구간이라 40 이 부풀린 표준오차를 양쪽에 똑같이 씁니다")
print(" 붓스트랩은 실제로 나온 값들을 그대로 쓰므로 좌우가 다릅니다")
print(" 다만 작은 표본에서 붓스트랩은 원자료 밖의 값을 만들지 못합니다")
print(" 세 방법이 답하는 물음이 서로 다릅니다")
print(" %s %s %s" % (pw("방법", 16), rw("귀무가설", 28), rw("무엇을 가정", 20)))
for a, b, c in [("웰치 t", "두 평균이 같다", "평균의 정규성"),
("순위 검정", "확률 우위가 0.5 다", "모양이 같음"),
("순열 검정", "라벨이 무의미하다", "교환가능성"),
("붓스트랩", "가설 대신 구간을 준다", "표본이 모집단을 닮음")]:
print(" %s %s %s" % (pw(a, 16), rw(b, 28), rw(c, 20)))
print(" 귀무가설이 다르므로 결론도 다른 뜻입니다. 골라 쓰는 것이 아니라 물음이 정합니다")
# --- 문제 5: 그래서 무엇을 쓰는가 ---------------------------------------
print(" 변환으로 정규에 가깝게 만드는 길도 있습니다")
ln = np.exp(rng.normal(0.0, 1.0, (R3, 30))) * 1.0
ln2 = np.exp(rng.normal(0.4, 1.0, (R3, 30))) * 1.0
tc5 = tcrit(58)
t_raw = (ln2.mean(1) - ln.mean(1)) / np.sqrt((ln2.var(1, ddof=1) + ln.var(1, ddof=1)) / 30)
L1, L2 = np.log(ln), np.log(ln2)
t_log = (L2.mean(1) - L1.mean(1)) / np.sqrt((L2.var(1, ddof=1) + L1.var(1, ddof=1)) / 30)
zs3 = np.empty(4000)
for i in range(4000):
zs3[i] = mw_z(ln2[i], ln[i])
pow_raw = float((np.abs(t_raw) > tc5).mean())
pow_log = float((np.abs(t_log) > tc5).mean())
pow_rnk = float((np.abs(zs3) > 1.959964).mean())
print(" 로그정규 두 집단이며 로그 척도에서 0.4 만큼 차이가 납니다")
print(" %s %s" % (pw("무엇으로", 24), rw("검출력", 14)))
print(" %s %14.4f" % (pw("원자료에 웰치 t", 24), pow_raw))
print(" %s %14.4f" % (pw("로그 뒤 웰치 t", 24), pow_log))
print(" %s %14.4f" % (pw("순위 검정", 24), pow_rnk))
print(" 로그를 취하면 검출력이 %.4f 에서 %.4f 까지 오릅니다. 순위도 %.4f 입니다"
% (pow_raw, pow_log, pow_rnk))
print(" 다만 로그 뒤의 평균 차이는 원래 척도의 평균 차이가 아닙니다")
print(" %s %s" % (pw("로그 척도에서", 22), rw("원래 척도에서", 24)))
for a, b in [("평균의 차이", "기하평균의 비"),
("0.4 만큼 크다", "exp(0.4) = %.4f 배" % np.exp(0.4)),
("대칭인 구간", "곱셈으로 대칭인 구간")]:
print(" %s %s" % (pw(a, 22), rw(b, 24)))
print(" 비로 해석되므로 보고할 때 단위를 반드시 밝혀야 합니다")
print(" 고를 때의 순서를 정리합니다")
print(" %s %s" % (pw("상황", 30), rw("무엇을 쓰는가", 24)))
for a, b in [("표본이 크고 평균이 관심", "웰치 t"),
("치우쳤고 비율로 해석 가능", "로그 뒤 웰치 t"),
("꼬리가 두껍거나 이상치", "순위 검정"),
("표본이 아주 작음", "순열 검정"),
("구간이 필요함", "붓스트랩"),
("중앙값 자체가 관심", "중앙값의 붓스트랩")]:
print(" %s %s" % (pw(a, 30), rw(b, 24)))
print(" 자료를 보고 고르면 178강 문제 2 의 두 단계 절차 문제가 되풀이됩니다")
print(" 무엇을 견주고 싶은지로 먼저 고르고 그다음에 자료의 모양을 봅니다")
# 178강의 t 검정은 정규분포를 가정합니다
# 가정이 깨졌을 때 실제 오류율을 재 봅니다. 참 차이는 0 입니다
# 자료의 분포 크기 10 크기 30 크기 100
# 정규 0.0503 0.0487 0.0520
# 균등 0.0513 0.0505 0.0483
# 지수 0.0440 0.0485 0.0496
# 로그정규 0.0237 0.0293 0.0370
# 코시 0.0179 0.0211 0.0202
# 목표는 0.05 입니다. 정규와 균등은 크기 10 에서도 맞습니다
# 치우친 분포는 목표보다 아래로 어긋납니다. 두 집단이 같은 방향으로
# 치우쳐 있어 치우침이 뺄셈에서 서로 상쇄되기 때문입니다
# 크기가 늘면 로그정규가 0.0237 에서 0.0370 으로 올라오지만 아직 멉니다
# 코시는 크기를 늘려도 안 낫습니다. 분산이 없어 중심극한정리가 안 통합니다
# 두 집단의 크기가 다르면 상쇄가 깨집니다
# 자료의 분포 10 대 10 10 대 40 40 대 10
# 정규 0.0515 0.0517 0.0558
# 지수 0.0401 0.0724 0.0790
# 로그정규 0.0169 0.0877 0.0864
# 정규는 어느 배치에서도 맞습니다. 치우친 분포는 배치에 따라 흔들립니다
# 같은 자료라도 어느 쪽을 크게 뽑았느냐로 오류율이 달라집니다
# 치우친 자료에서는 평균 자체가 대표성을 잃습니다
# 로그정규 자료 20 만 개를 봅니다
# 요약값 값 아래에 몇 퍼센트
# 평균 3.1090 77.55
# 중앙값 1.0030 50.00
# 절사평균 10 퍼센트 1.5833 62.03
# 평균 아래에 77 퍼센트가 몰려 있습니다. 평균은 대표값이 아닙니다
# 중앙값은 정의상 절반입니다. 무엇을 견줄지부터 정해야 합니다
# 값 대신 순위를 쓰면 분포 모양에서 벗어납니다
# 두 집단을 합쳐 순위를 매기고 한쪽의 순위합을 봅니다
# 집단 값 순위합
# A 12 15 9 22 11 40 13 71.5
# B 8 10 7 14 6 9 5 33.5
# 순위합이 같을 때 기대되는 값은 52.5 입니다
# U = 순위합 - n(n+1)/2 = 43.5 이고 기대는 24.5 입니다
# 표준화한 z 는 2.4277 입니다
# U 는 두 값을 짝지어 비교한 횟수와 같습니다
# A 의 값이 B 의 값보다 큰 짝의 수를 세면 43.5 입니다
# 순위합에서 계산한 U 와 정확히 같습니다
# U / (n1 x n2) = 0.8878 이며 무작위로 하나씩 뽑아 A 가 클 확률입니다
# 이 값을 확률 우위라 하고 순위 검정이 실제로 재는 것입니다
# 40 을 4000 으로 바꿔도 순위는 그대로입니다
# 자료 웰치 t 순위 z
# 원래 2.1278 2.4277
# 40 을 4000 으로 1.0092 2.4277
# t 는 값에 끌려다니고 순위는 꿈쩍도 안 합니다
# 이것이 순위 검정의 강건함이며 동시에 정보를 버린다는 뜻이기도 합니다
# 강건함의 값은 검출력으로 치릅니다
# 두 방법의 검출력을 여러 분포에서 견줍니다. 집단당 20 개입니다
# 자료의 분포 웰치 t 검출력 순위 검정 검출력 순위 / t
# 정규 0.7938 0.7680 0.9675
# 균등 0.8956 0.8330 0.9301
# 지수 0.8005 0.9287 1.1602
# 로그정규 0.3227 0.9048 2.8033
# 코시 0.1302 0.6132 4.7101
# 정규에서는 순위가 조금 손해입니다. 검출력이 0.7938 에서 0.7680 입니다
# 이론상 상대효율은 3/pi = 0.9549 이며 같은 검출력에 표본이 4.72 퍼센트 더 듭니다
# 꼬리가 두꺼워질수록 순위가 유리해지고 코시에서는 압도합니다
# 정규가 아닐 것 같으면 순위 검정이 잃는 것보다 얻는 것이 큽니다
# 순위 검정도 가정이 없는 것은 아닙니다
# 무엇을 가정하는가 깨지면
# 두 집단의 관측이 독립 둘 다 무너집니다
# 분포 모양이 같음 중앙값 비교가 아니게 됩니다
# 연속형이라 동점이 드묾 분산 보정이 필요합니다
# 둘째 줄이 오해가 많습니다. 순위 검정은 중앙값 검정이 아닙니다
# 모양이 다르면 중앙값이 같아도 기각합니다
# 두 집단의 중앙값과 평균이 모두 0 이고 표준편차만 1 과 4 입니다
# 무엇으로 기각률 목표
# 웰치 t 0.0476 0.05
# 순위 검정 0.0698 0.05
# 순위 검정이 0.0698 로 목표의 1.40 배입니다. 중앙값이 같은데도 기각합니다
# 확률 우위는 0.5 지만 순위의 흩어짐이 달라 정규 근사가 깨집니다
# 모양이 다를 수 있으면 순위 검정을 중앙값 비교로 읽으면 안 됩니다
# 분포를 가정하지 않고 직접 만들 수도 있습니다
# 귀무가설이 참이면 라벨을 섞어도 자료가 똑같이 그럴듯합니다
# 관측된 평균 차이는 9.0000 입니다
# 14 개를 7 대 7 로 나누는 3432 가지를 모두 세어 정확히 계산합니다
# 무엇으로 양측 p 값
# 순열 검정 0.015152
# 웰치 t 0.071366
# 순위 검정 근사 0.015194
# 순열과 순위가 0.0152 와 0.0152 로 거의 같고 웰치 t 만 0.0714 로 다릅니다
# 40 이라는 큰 값이 A 의 분산을 키워 t 의 분모를 부풀렸기 때문입니다
# 순열 검정은 근사가 아니라 정확한 값이며 어떤 분포도 가정하지 않습니다
# 대신 있는 자료를 바꿔 넣기만 하고 새 자료를 만들지는 않습니다
# 붓스트랩은 신뢰구간을 만듭니다
# 각 집단에서 복원추출로 다시 뽑아 차이를 4 만 번 만듭니다
# 무엇으로 95 퍼센트 구간 폭
# 붓스트랩 백분위 [2.5714, 17.4286] 14.8571
# 웰치 t 구간 [-1.0258, 19.0258] 20.0517
# 붓스트랩 구간은 0 을 안 넣고 웰치 구간은 0 을 넣습니다. 결론이 갈립니다
# 붓스트랩 차이의 중앙값은 8.7143 이고 관측값은 9.0000 입니다
# 웰치는 대칭 구간이라 40 이 부풀린 표준오차를 양쪽에 똑같이 씁니다
# 붓스트랩은 실제로 나온 값들을 그대로 쓰므로 좌우가 다릅니다
# 다만 작은 표본에서 붓스트랩은 원자료 밖의 값을 만들지 못합니다
# 세 방법이 답하는 물음이 서로 다릅니다
# 방법 귀무가설 무엇을 가정
# 웰치 t 두 평균이 같다 평균의 정규성
# 순위 검정 확률 우위가 0.5 다 모양이 같음
# 순열 검정 라벨이 무의미하다 교환가능성
# 붓스트랩 가설 대신 구간을 준다 표본이 모집단을 닮음
# 귀무가설이 다르므로 결론도 다른 뜻입니다. 골라 쓰는 것이 아니라 물음이 정합니다
# 변환으로 정규에 가깝게 만드는 길도 있습니다
# 로그정규 두 집단이며 로그 척도에서 0.4 만큼 차이가 납니다
# 무엇으로 검출력
# 원자료에 웰치 t 0.2256
# 로그 뒤 웰치 t 0.3306
# 순위 검정 0.3165
# 로그를 취하면 검출력이 0.2256 에서 0.3306 까지 오릅니다. 순위도 0.3165 입니다
# 다만 로그 뒤의 평균 차이는 원래 척도의 평균 차이가 아닙니다
# 로그 척도에서 원래 척도에서
# 평균의 차이 기하평균의 비
# 0.4 만큼 크다 exp(0.4) = 1.4918 배
# 대칭인 구간 곱셈으로 대칭인 구간
# 비로 해석되므로 보고할 때 단위를 반드시 밝혀야 합니다
# 고를 때의 순서를 정리합니다
# 상황 무엇을 쓰는가
# 표본이 크고 평균이 관심 웰치 t
# 치우쳤고 비율로 해석 가능 로그 뒤 웰치 t
# 꼬리가 두껍거나 이상치 순위 검정
# 표본이 아주 작음 순열 검정
# 구간이 필요함 붓스트랩
# 중앙값 자체가 관심 중앙값의 붓스트랩
# 자료를 보고 고르면 178강 문제 2 의 두 단계 절차 문제가 되풀이됩니다
# 무엇을 견주고 싶은지로 먼저 고르고 그다음에 자료의 모양을 봅니다