192강이 무작위 배정을 할 수 있을 때를 다뤘습니다. 못 할 때는 어떻게 흉내 내는지가 이 강의입니다.
191강 심화 5에서 윤리와 비용과 규모 때문에 무작위가 불가능한 자리를 봤습니다. 그럴 때 잰 변수로 짝을 지으면 실험에 가까워집니다.
그런데 변수가 스무 개면 짝짓기가 어렵습니다. 스무 차원에서 이웃을 찾으려면 자료가 엄청나게 많아야 합니다.
| 무엇 | 몇 차원 |
|---|---|
| 변수 전부 | |
| 성향 점수 |
처치받을 확률 하나로 변수 전부를 대신합니다. 그것이 성향 점수이며, 190강의 로지스틱 회귀가 도구입니다.
그리고 이 강의의 절반은 한계입니다. 성향 점수는 잰 변수 밖으로 못 나가며, 균형표가 아무리 좋아 보여도 안 잰 것은 그대로 남습니다.
문제. 성향 점수를 만듭니다.
(1) 처치군과 대조군의 불균형을 재세요.
(2) 성향 점수를 추정하세요.
(3) 점수가 같은 층에서 균형을 확인하세요.
생각의 실마리. 191강 문제 1의 선택 치우침이 잰 변수 때문에 생긴 것이라면, 그 변수를 맞춰 주면 사라집니다.
풀이. (1) 두 변수가 처치와 결과에 모두 영향을 줍니다. 참 효과는 입니다.
| 무엇 | 처치군 | 대조군 | 표준화 차이 |
|---|---|---|---|
| x_ | |||
| x_ | |||
| 결과 | 차이 |
두 변수가 과 만큼 어긋나 있습니다. 192강 문제 1의 기준 을 크게 넘습니다.
그래서 차이가 로 참 효과 의 두 배입니다.
(2) 190강의 로지스틱 회귀로 처치를 예측합니다.
| 계수 | 추정값 | 참값 |
|---|---|---|
| 절편 | ||
| x_ | ||
| x_ |
(3) 점수가 같은 층에서 균형을 봅니다.
| 성향 점수 구간 | 처치군 수 | 대조군 수 | 의 표준화 차이 | 의 표준화 차이 |
|---|---|---|---|---|
층 밖에서 과 이던 차이가 층 안에서 에서 로 줄어듭니다.
크게 줄었지만 아래로 다 내려가지는 않았습니다. 층이 다섯뿐이라 층 안에도 점수의 폭이 남기 때문입니다.
점수 하나가 변수 둘을 대신합니다. 이것이 성향 점수의 힘이며, 변수가 스무 개여도 점수는 여전히 하나입니다.
이 문제에서 배우는 것. 성향 점수가 하는 일이 차원을 줄이는 것뿐이라는 점이 중요합니다. 점수가 같으면 처치가 무작위와 같아진다는 성질은 잰 변수 안에서만 성립하고, 안 잰 변수는 점수에 들어가지 않으니 균형이 맞을 이유가 없습니다. 그래서 성향 점수는 177강 문제 4의 교환가능성을 가정한 뒤에 쓰는 계산 도구이지, 그 가정을 만들어 주는 장치가 아닙니다. 문제 4에서 이 구분을 수치로 확인합니다.
바로 확인 1.
확인 1-1. 성향 점수를 한 문장으로 정의하세요.
답. 잰 변수가 주어졌을 때 처치를 받을 확률입니다.
확인 1-2. 검산에서 두 변수의 매칭 전 표준화 차이를 쓰세요.
답. 과 입니다.
확인 1-3. 검산에서 층 안의 표준화 차이 범위를 쓰세요.
답. 에서 이며 층이 다섯뿐이라 아래로 다 안 내려갑니다.
문제. 네 방법을 견줍니다.
(1) 네 추정값을 구하세요.
(2) 매칭 뒤의 균형을 확인하세요.
(3) 가중치의 흩어짐을 보세요.
생각의 실마리. 점수를 만들었으면 그것으로 무엇을 할지가 남습니다. 층으로 나누거나, 가중치로 쓰거나, 짝을 짓습니다.
풀이. (1) 네 방법입니다.
| 방법 | 추정값 | 참값 | 치우침 |
|---|---|---|---|
| 아무것도 안 함 | |||
| 회귀로 통제 | |||
| 성향 점수 층화 | |||
| 성향 점수 가중 | |||
| 성향 점수 매칭 |
넷 다 에서 참값 쪽으로 크게 옮겨 옵니다. 잰 변수가 전부이기 때문입니다.
층화가 으로 가장 크게 남습니다. 문제 1에서 본 층 안의 잔여 불균형이 그대로 추정에 나타났습니다.
층을 더 잘게 나누면 줄어들지만 층마다 사람이 모자라게 됩니다.
(2) 매칭 뒤의 균형을 확인합니다.
| 변수 | 매칭 전 표준화 차이 | 매칭 후 | 몇 배로 줄었나 |
|---|---|---|---|
| x_ | |||
| x_ | |||
| 성향 점수 |
매칭 뒤 표준화 차이가 아래로 내려갑니다. 192강 문제 1의 기준입니다.
성향 점수 자체는 배로 줄어듭니다. 그것을 기준으로 짝을 지었으니 당연하며, 중요한 것은 원래 변수의 균형입니다.
매칭한 쌍은 개이고 처치군 명 중 전부 짝을 찾았습니다.
(3) 가중치의 흩어짐을 봅니다.
| 무엇 | 최댓값 | 변동계수 | 유효 표본 |
|---|---|---|---|
| 처치군의 가중치 | |||
| 대조군의 가중치 |
처치군 명이 유효 표본 명이 됩니다. 가중치가 흩어져 퍼센트를 잃었습니다.
175강 문제 3의 키시 유효 표본입니다. 가중치가 흩어지면 정보가 줍니다.
이 문제에서 배우는 것. 네 방법이 서로 다른 것을 추정합니다. 매칭은 처치받은 사람에게 짝을 붙이므로 191강 문제 1의 ATT를 재고, 가중은 전체에 가중치를 주므로 ATE를 잽니다. 이 자료에서는 효과가 모두에게 같아 둘이 같은 값이지만, 186강 문제 4의 이질적 효과가 있으면 다른 값이 나오는 것이 정상입니다. 그래서 보고할 때 "무엇을 추정했는지"를 밝혀야 하고, 그것은 방법이 정합니다.
바로 확인 2.
확인 2-1. 검산에서 네 방법의 치우침을 쓰세요.
답. , , , 입니다.
확인 2-2. 검산에서 매칭 뒤 두 변수의 표준화 차이를 쓰세요.
답. 와 입니다.
확인 2-3. 검산에서 처치군의 유효 표본과 실제 인원을 쓰세요.
답. 와 입니다.
문제. 겹침을 검사합니다.
(1) 처치 확률의 기울기를 키워 가며 겹침을 재세요.
(2) 겹치는 구간만 남겨 보세요.
(3) 가중치를 잘라 보세요.
생각의 실마리. 성향 점수가 이나 에 가까우면 짝을 지을 상대가 없습니다. 177강 문제 4의 양수성 가정이 깨지는 자리입니다.
풀이. (1) 기울기를 키워 봅니다.
| 기울기 | 점수가 아래인 처치군 | 위인 대조군 | 가중치 최댓값 | 유효 표본 비율 |
|---|---|---|---|---|
가중치 최댓값이 에서 로 폭발합니다. 한 사람이 명 몫을 하는 셈입니다.
유효 표본 비율이 에서 로 떨어집니다. 명이 명 값밖에 못 합니다.
한쪽에만 있는 사람의 비율 자체는 ~퍼센트로 작습니다. 그런데 그 소수가 가중치를 통째로 지배합니다.
(2) 겹치는 구간만 남겨 봅니다. 기울기 인 자료입니다.
| 어디까지 쓰는가 | 남는 비율 | 추정값 | 치우침 |
|---|---|---|---|
| 전부 | |||
| 에서 | |||
| 에서 | |||
| 에서 |
자를수록 치우침이 에서 로 줄어듭니다.
그런데 남는 비율이 까지 떨어집니다. 에서 만 쓰면 극단적인 사람들에 대해서는 아무 말도 못 합니다.
답이 정확해지는 것이 아니라 물음이 좁아진 것입니다.
(3) 가중치를 잘라 봅니다.
| 자르는 자리 | 최댓값 | 추정값 | 치우침 |
|---|---|---|---|
| 안 자름 | |||
| 퍼센트 | |||
| 퍼센트 | |||
| 퍼센트 |
자를수록 치우침이 오히려 커집니다. 이 이 됩니다.
175강 문제 5와 같습니다. 자르면 분산이 줄고 치우침이 생기는데, 여기서는 큰 가중치가 정보를 담고 있어 자르는 대가가 큽니다.
겹침을 자르는 것과 가중치를 자르는 것이 다릅니다. 앞쪽은 대상을 좁혀 정직하게 답하고, 뒤쪽은 같은 대상에 대해 틀린 답을 냅니다.
이 문제에서 배우는 것. 가중치 최댓값과 유효 표본이 성향 점수 분석의 필수 보고 항목입니다. 추정값만 보면 (2)의 첫 줄과 넷째 줄이 와 으로 둘 다 그럴듯한데, 실제로는 완전히 다른 사람들에 대한 답입니다. 그래서 논문이 겹침 그림과 유효 표본을 함께 싣도록 요구하며, 그것이 없으면 누구에 대한 결론인지 알 수 없습니다. 174강 문제 2에서 유효 표본이 명이었던 것과 같은 종류의 경고입니다.
바로 확인 3.
확인 3-1. 검산에서 기울기 일 때의 가중치 최댓값과 유효 표본 비율을 쓰세요.
답. 와 입니다.
확인 3-2. 검산에서 에서 만 썼을 때의 남는 비율과 치우침을 쓰세요.
답. 과 입니다.
확인 3-3. 검산에서 가중치를 퍼센트에서 자를 때의 치우침을 쓰세요.
답. 으로 안 자를 때의 보다 큽니다.
문제. 한계를 확인합니다.
(1) 관측된 변수만으로 보정해 보세요.
(2) 균형표를 만들어 보세요.
(3) 민감도 분석을 하세요.
생각의 실마리. 191강 문제 3에서 회귀와 층화가 똑같이 실패했습니다. 성향 점수도 같은지 봅니다.
풀이. (1) 는 관측되고 는 관측되지 않습니다. 참 효과는 입니다.
| 무엇으로 | 추정값 | 참값 | 치우침 |
|---|---|---|---|
| 아무것도 안 함 | |||
| 로 회귀 | |||
| 로 성향 점수 가중 | |||
| 로 성향 점수 매칭 | |||
| 와 로 가중 |
만 쓰는 세 방법이 에서 으로 거의 같은 답을 냅니다.
방법이 아니라 자료가 정합니다. 191강 문제 3의 결론과 같으며, 못 잰 것은 어떤 방법으로도 못 고칩니다.
(2) 그런데 균형표는 좋아 보입니다.
| 변수 | 관측되는가 | 매칭 전 | 매칭 후 |
|---|---|---|---|
| 예 | |||
| 아니오 |
는 로 완벽히 맞았는데 는 로 오히려 커졌습니다.
그런데 는 표에 안 실립니다. 보고서의 균형표는 잰 변수만 담으므로 좋아 보이는 것이 당연합니다.
균형표가 성향 점수 분석의 품질 증거가 아닙니다. 그것은 계산이 제대로 됐다는 증거일 뿐입니다.
(3) 민감도 분석을 합니다. 참 효과를 으로 두고 만 넣었을 때의 값을 봅니다.
| 가 에 미치는 크기 | 가 처치에 미치는 크기 | 참 효과 인데 나오는 값 | 관측값을 설명하는가 |
|---|---|---|---|
| 아니오 | |||
| 아니오 | |||
| 아니오 | |||
| 아니오 | |||
| 아니오 | |||
| 아니오 | |||
| 아니오 | |||
| 아니오 | |||
| 아니오 |
아홉 조합 중 관측값 에 닿는 것이 없습니다. 참 효과가 이므로 당연하며, 혼자서는 전부를 만들 수 없습니다.
대신 참 의 조합인 과 가 을 만듭니다. 로만 보정했을 때의 치우침 과 거의 같습니다.
민감도 분석이 제대로 작동합니다. 실제로 있는 교란의 강도를 넣으면 실제로 생긴 치우침이 나옵니다.
이 문제에서 배우는 것. 성향 점수 논문에서 균형표가 완벽한 것이 오히려 흔한 일입니다. 점수 모형을 균형이 맞을 때까지 손보는 것이 표준 절차이므로, 표가 안 맞으면 논문이 나오지 않습니다. 그래서 독자가 봐야 할 것은 표가 아니라 어떤 변수를 넣었고 무엇을 못 쟀는지이며, 그 목록은 대개 본문에 문장으로만 적혀 있습니다. 177강 문제 4의 민감도 분석을 함께 실으면 **"이만한 교란이 있어야 뒤집힙니다"**라는 확인 가능한 진술이 되며, 그것이 균형표보다 훨씬 많은 정보를 줍니다.
바로 확인 4.
확인 4-1. 검산에서 만 쓰는 세 방법의 추정값을 쓰세요.
답. , , 입니다.
확인 4-2. 검산에서 매칭 뒤 와 의 표준화 차이를 쓰세요.
답. 과 입니다.
확인 4-3. 검산에서 참 의 조합이 만드는 값과 실제 치우침을 쓰세요.
답. 과 로 거의 같습니다.
문제. 절차를 세웁니다.
(1) 목표 시험을 적으세요.
(2) 시점을 잘못 잡을 때를 보세요.
(3) 점수 모형의 품질 기준을 정하세요.
생각의 실마리. 192강이 실험 설계를 문서로 만들었습니다. 관측 자료에서도 같은 문서를 먼저 적으면 무엇이 부족한지 드러납니다.
풀이. (1) 목표 시험을 적습니다.
| 무엇을 적는가 | 관측 자료에서 무엇이 되는가 |
|---|---|
| 누가 대상인가 | 표본 포함 기준 |
| 무엇이 처치인가 | 처치 정의와 시점 |
| 무엇과 견주는가 | 대조군 정의 |
| 언제부터 세는가 | 추적 시작 시점 |
| 무엇을 결과로 보는가 | 결과 변수와 기간 |
| 어떻게 배정하는가 | 성향 점수로 흉내 |
마지막 줄만 통계이고 나머지 다섯은 설계입니다.
(2) 넷째 줄을 안 지키면 무슨 일이 생기는지 봅니다. 처치를 받으려면 그때까지 살아 있어야 하고, 참 효과는 없습니다.
| 어떻게 세는가 | 처치군 생존 | 대조군 생존 |
|---|---|---|
| 받은 사람 대 안 받은 사람 | ||
| 일 시점에서 나눔 |
첫 줄은 처치군이 세 배 넘게 오래 삽니다. 처치가 하나도 안 좋은데 그렇습니다.
오래 살아야 처치를 받을 기회가 생기기 때문이며, 이것을 불멸 시간 치우침이라 합니다.
둘째 줄처럼 기준 시점을 정하고 그 시점까지의 정보로만 나누면 사라집니다. 과 로 차이가 없습니다.
191강 문제 4의 선택편향이 시간축을 따라 나타난 것입니다.
(3) 점수 모형의 품질 기준을 봅니다. 처치를 완벽히 예측하면 겹침이 사라집니다.
| 점수 모형의 AUC | 겹치는 비율 | 유효 표본 비율 | 쓸 수 있는가 |
|---|---|---|---|
| 예 | |||
| 예 | |||
| 어렵습니다 | |||
| 어렵습니다 |
AUC가 이면 유효 표본이 퍼센트만 남습니다.
190강 문제 4의 판별력이 여기서는 나쁜 신호입니다. 처치를 잘 맞히는 모형은 처치군과 대조군이 겹치지 않는다는 뜻이기 때문입니다.
성향 점수 모형은 균형을 맞추는 도구이지 예측 모형이 아닙니다.
마지막으로 절차를 정리합니다.
| 단계 | 무엇을 확인하는가 |
|---|---|
| 변수 고르기 | 결과의 원인이면서 처치와 이어진 것 |
| 점수 만들기 | 적합도가 아니라 균형이 목표 |
| 겹침 확인 | 양쪽 끝에 한쪽만 있는지 |
| 균형 확인 | 표준화 차이 아래 |
| 효과 추정 | 매칭 구조를 분산에 반영 |
| 민감도 분석 | 못 잰 교란이 얼마여야 뒤집히는지 |
이 문제에서 배우는 것. 불멸 시간 치우침이 관측 연구에서 가장 흔하고 가장 조용한 오류입니다. "약을 먹은 환자가 더 오래 살았다"는 분석에서 약을 먹으려면 병원에 갈 만큼 건강해야 하고 살아 있어야 하므로, 효과가 없어도 차이가 생깁니다. 위 표의 대 이 그 크기입니다. 막는 방법은 기준 시점을 정하고 그 시점의 정보로만 군을 나누는 것이며, 그것이 목표 시험 문서의 넷째 줄입니다. 절차를 먼저 적으면 이 실수를 구조적으로 피합니다.
바로 확인 5.
확인 5-1. 목표 시험에서 통계인 줄과 설계인 줄을 가르세요.
답. 배정 흉내만 통계이고 나머지 다섯은 설계입니다.
확인 5-2. 검산에서 불멸 시간 치우침의 크기를 쓰세요.
답. 대 이며 기준 시점을 두면 대 이 됩니다.
확인 5-3. 성향 점수 모형의 AUC가 높으면 왜 나쁜지 검산 값과 함께 쓰세요.
답. 이면 유효 표본이 만 남아 겹침이 사라지기 때문입니다.
| 방법 | 무엇을 추정 | 어떻게 실패 |
|---|---|---|
| 층화 | ATE | 층 안 잔여 불균형 |
| 가중 | ATE | 극단 가중치 |
| 매칭 | ATT | 짝을 못 찾음 |
| 회귀 | 모형 의존 | 함수 형태 |
| 무엇을 보고하는가 | 왜 |
|---|---|
| 넣은 변수 목록 | 무엇을 가정했는지 |
| 겹침 그림 | 양수성이 성립하는지 |
| 표준화 차이 | 균형이 맞는지 |
| 유효 표본 | 실제 정보량 |
| 민감도 분석 | 뒤집히는 조건 |
| 자주 하는 실수 | 바로잡기 |
|---|---|
| 균형표가 좋아 안심합니다 | 잰 변수만 담깁니다 |
| 점수 모형의 AUC를 높입니다 | 겹침이 사라집니다 |
| 가중치를 잘라 안정시킵니다 | 치우침이 커집니다 |
| 겹침 없이 전부를 씁니다 | 소수가 결과를 지배합니다 |
| 처치 시점을 안 정합니다 | 불멸 시간 치우침 |
| 방법을 바꿔 답을 고칩니다 | 자료가 정합니다 |
문제 6. 성향 점수를 한 문장으로 정의하세요.
답. 잰 변수가 주어졌을 때 처치를 받을 확률입니다.
문제 7. 검산에서 두 변수의 매칭 전 표준화 차이를 쓰세요.
답. 과 입니다.
문제 8. 검산에서 층 안의 표준화 차이 범위와 이유를 쓰세요.
답. 에서 이며 층이 다섯뿐이라 점수의 폭이 남기 때문입니다.
문제 9. 검산에서 네 방법의 치우침을 쓰세요.
답. , , , 입니다.
문제 10. 검산에서 매칭 뒤 두 변수의 표준화 차이를 쓰세요.
답. 와 입니다.
문제 11. 검산에서 처치군의 유효 표본과 실제 인원을 쓰세요.
답. 와 입니다.
문제 12. 검산에서 기울기 일 때의 가중치 최댓값과 유효 표본 비율을 쓰세요.
답. 와 입니다.
문제 13. 검산에서 에서 만 썼을 때의 남는 비율과 치우침을 쓰세요.
답. 과 입니다.
문제 14. 검산에서 가중치를 퍼센트에서 자를 때의 치우침을 쓰세요.
답. 으로 안 자를 때보다 큽니다.
문제 15. 검산에서 만 쓰는 세 방법의 추정값을 쓰세요.
답. , , 입니다.
문제 16. 검산에서 매칭 뒤 와 의 표준화 차이를 쓰세요.
답. 과 입니다.
문제 17. 검산에서 불멸 시간 치우침의 크기를 쓰세요.
답. 대 입니다.
문제 18. 성향 점수 모형의 AUC가 높으면 왜 나쁜지 검산 값과 함께 쓰세요.
답. 이면 유효 표본이 만 남기 때문입니다.
심화 1. 매칭의 여러 방식을 정리하세요.
| 방식 | 어떻게 |
|---|---|
| 최근접 이웃 | 점수가 가장 가까운 하나 |
| 복원 매칭 | 같은 대조군을 여러 번 씀 |
| 캘리퍼 | 일정 거리 안에서만 |
| 대 | 처치 하나에 대조 여럿 |
| 전체 매칭 | 모두를 층으로 묶음 |
셋째 줄이 겹침 문제를 매칭 안에서 다룹니다. 거리가 멀면 짝을 안 짓고 버립니다.
넷째 줄이 대조군이 많을 때 유용합니다. 분산이 줄지만 짝의 질은 떨어지므로, 가 커질수록 편향과 분산의 맞바꿈이 생깁니다.
다섯째 줄이 정보를 가장 적게 버립니다. 모두를 쓰되 층마다 가중치를 달리하며, 층화와 매칭의 중간입니다.
매칭 뒤의 분산 계산이 까다롭습니다. 짝지은 구조를 무시하면 안 되고, 매칭 자체가 추정에 불확실성을 더하기 때문에 붓스트랩도 그대로 못 씁니다.
심화 2. 이중 강건 추정을 정리하세요.
성향 점수 모형과 결과 모형 둘 중 하나만 맞아도 되는 방법이 있습니다.
| 어느 모형이 맞는가 | 결과 |
|---|---|
| 둘 다 | 정확하고 효율적 |
| 성향 점수만 | 정확합니다 |
| 결과 모형만 | 정확합니다 |
| 둘 다 틀림 | 틀립니다 |
두 번의 기회를 준다는 것이 이름의 뜻입니다.
그런데 겹침이 나쁘면 오히려 불안정합니다. 가 에 가까우면 둘째 항이 폭발하며, 문제 3의 문제가 그대로 남습니다.
요즘은 기계학습으로 두 모형을 적합하고 교차적합을 씁니다. 189강 문제 4의 겹 안 규칙이 여기서도 필요합니다.
심화 3. 성향 점수의 다른 쓰임을 정리하세요.
| 쓰임 | 어떻게 |
|---|---|
| 층화 | 다섯 층으로 나눠 가중평균 |
| 가중 | 역확률로 가중 |
| 매칭 | 짝을 지음 |
| 공변량 | 점수를 회귀에 넣음 |
넷째 줄이 가장 간단하고 가장 약합니다. 점수를 선형으로 넣으면 함수 형태를 또 가정하는 셈이고, 그럴 바에는 원래 변수를 넣는 편이 낫습니다.
첫째 줄의 다섯 층이 관례입니다. 층이 다섯이면 편향의 퍼센트가 사라진다는 오래된 결과가 있는데, 문제 2에서 본 의 잔여가 나머지 퍼센트입니다.
층을 늘리면 좋아지지만 층마다 사람이 필요합니다. 처치군과 대조군이 각각 몇 명은 있어야 차이를 계산할 수 있습니다.
심화 4. 어떤 변수를 넣을지 정리하세요.
185강 문제 5의 표가 여기서도 그대로입니다.
| 변수의 성격 | 성향 점수에 넣는가 |
|---|---|
| 처치와 결과의 공통 원인 | 넣습니다 |
| 결과의 원인이고 처치와 무관 | 넣으면 정확해집니다 |
| 처치의 원인이고 결과와 무관 | 넣으면 나빠집니다 |
| 처치의 결과 | 절대 안 넣습니다 |
셋째 줄이 성향 점수에서 특히 위험합니다. 그런 변수는 처치를 잘 예측하므로 AUC를 올리고 겹침을 줄이는데, 편향은 하나도 안 줄입니다.
185강 문제 5에서 표준편차가 배가 됐던 그 변수이며, 여기서는 유효 표본까지 깎습니다.
넷째 줄이 처치 후에 잰 변수입니다. 시점이 명확하지 않은 자료에서 이 실수가 흔하며, 문제 5의 목표 시험 문서가 그것을 막습니다.
심화 5. 매칭 뒤의 추론을 정리하세요.
189강 문제 5의 선택 후 추론 문제가 여기서도 나타납니다.
| 무엇이 문제인가 | 왜 |
|---|---|
| 점수를 추정했음 | 그 불확실성이 안 담김 |
| 짝을 자료로 골랐음 | 선택이 일어남 |
| 같은 자료로 균형을 맞춤 | 여러 번 시도함 |
셋째 줄이 실무에서 가장 큽니다. 균형이 맞을 때까지 모형을 손보는 것이 표준 절차인데, 몇 번 손봤는지 아무도 세지 않습니다.
추정된 점수를 쓰면 표준오차가 오히려 작아집니다. 참 점수를 쓸 때보다 작아지는 것이 알려진 결과인데, 그것을 무시하면 보수적인 쪽이라 덜 위험합니다.
붓스트랩을 쓸 때는 점수 추정부터 다시 해야 합니다. 189강 문제 4의 겹 안 규칙과 같은 원리입니다.
심화 6. 이 강의가 어디에 쓰이는지 정리하세요.
| 분야 | 쓰임 | 이어지는 강의 |
|---|---|---|
| 시간 축 | 전후 비교로 교란 제거 | 194강 |
| 도구 | 무작위인 다른 것을 지렛대로 | 195강 |
| 추천과 정책 | 로그 자료의 정책 평가 | S9 |
| 공정성 | 집단 간 비교의 보정 | S20 |
첫째와 둘째 줄이 이 강의의 한계를 다른 방향에서 풉니다. 성향 점수는 잰 변수를 더 잘 쓰는 방법이고, 194강과 195강은 안 잰 변수가 있어도 되는 방법입니다.
셋째 줄이 실무에서 가장 크게 쓰입니다. 추천 시스템의 로그로 새 정책을 평가할 때 역확률 가중이 그대로 쓰이며, 문제 3의 겹침 문제가 정책이 다를수록 심해집니다.
정답.
| 기호 | 읽는 법 | 뜻 |
|---|---|---|
| 성향 점수 | 처치를 받을 확률입니다 | |
| 표준화 차이 | SMD | 평균 차이를 표준편차로 나눈 값입니다 |
| 역확률 가중 | IPW | 처치 확률의 역수로 가중합니다 |
| 유효 표본 | effective sample size | 가중치를 반영한 실질 크기입니다 |
| 겹침 | overlap | 두 군의 점수 분포가 겹치는 정도입니다 |
| 캘리퍼 | caliper | 짝을 지을 최대 거리입니다 |
| ATT | 처치군의 처치효과 | 처치받은 사람에게만의 효과입니다 |
| 이중 강건 | doubly robust | 두 모형 중 하나만 맞아도 됩니다 |
| 목표 시험 | target trial | 흉내 내려는 가상의 실험입니다 |
| 불멸 시간 치우침 | immortal time bias | 처치 전 생존 기간이 만드는 치우침입니다 |
| 기준 시점 | landmark | 그 시점의 정보로만 군을 나눕니다 |
다음은 194강 이중차분법입니다. 이 강의가 잰 변수를 더 잘 쓰는 법이었습니다.
문제 4에서 안 잰 교란이 그대로 남았습니다. 그런데 그 교란이 시간에 따라 안 변하는 것이라면, 같은 대상의 전후를 빼는 것만으로 사라집니다. 194강은 그 발상을 정리하고, 그 대신 필요해지는 가정이 무엇인지 다룹니다.
import numpy as np
rng = np.random.default_rng(20260930)
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 sig(z):
return 1.0 / (1.0 + np.exp(-np.clip(z, -500, 500)))
def ols(y, *xs):
A = np.stack([np.ones(len(y))] + list(xs), axis=1)
b, *_ = np.linalg.lstsq(A, y, rcond=None)
return b
def logit(y, X, iters=50):
A = np.concatenate([np.ones((len(y), 1)), X], axis=1)
b = np.zeros(A.shape[1])
for _ in range(iters):
mu = sig(A @ b)
w = np.clip(mu * (1 - mu), 1e-9, None)
z = A @ b + (y - mu) / w
nb = np.linalg.solve((A * w[:, None]).T @ A, (A * w[:, None]).T @ z)
if np.max(np.abs(nb - b)) < 1e-11:
b = nb
break
b = nb
return sig(A @ b), b
def smd(v, t):
sp = np.sqrt((v[t == 1].var(ddof=1) + v[t == 0].var(ddof=1)) / 2.0)
return float((v[t == 1].mean() - v[t == 0].mean()) / sp)
def match_nn(ps, t, caliper=None):
ti = np.flatnonzero(t == 1)
ci = np.flatnonzero(t == 0)
pc = ps[ci]
o = np.argsort(pc)
pcs = pc[o]
pairs = []
for i in ti:
j = int(np.searchsorted(pcs, ps[i]))
best, bd = None, None
for k in (j - 1, j, j + 1):
if 0 <= k < len(pcs):
dd = abs(pcs[k] - ps[i])
if bd is None or dd < bd:
bd, best = dd, k
if best is None:
continue
if caliper is not None and bd > caliper:
continue
pairs.append((i, int(ci[o[best]])))
return pairs
# --- 문제 1: 잰 변수로 실험을 흉내 냅니다 -------------------------------
print(" 191강 심화 5 에서 무작위 배정이 불가능한 자리를 봤습니다")
print(" 그럴 때 잰 변수로 비슷한 사람을 짝지어 실험처럼 만듭니다")
N1 = 4000
x1 = rng.normal(0, 1, N1)
x2 = rng.normal(0, 1, N1)
lin1 = 0.9 * x1 + 0.9 * x2
t1 = (rng.random(N1) < sig(lin1)).astype(float)
y1 = 2.0 + 2.0 * t1 + 1.5 * x1 + 1.5 * x2 + rng.normal(0, 1.0, N1)
print(" 두 변수가 처치와 결과에 모두 영향을 줍니다. 참 효과는 2.0 입니다")
print(" %s %s %s %s" % (pw("무엇", 22), rw("처치군", 14), rw("대조군", 14),
rw("표준화 차이", 14)))
for nm, v in [("x1", x1), ("x2", x2)]:
print(" %s %14.4f %14.4f %14.4f"
% (pw(nm, 22), float(v[t1 == 1].mean()), float(v[t1 == 0].mean()), smd(v, t1)))
print(" %s %14.4f %14.4f %14s"
% (pw("결과 y", 22), float(y1[t1 == 1].mean()), float(y1[t1 == 0].mean()),
rw("차이 %.4f" % float(y1[t1 == 1].mean() - y1[t1 == 0].mean()), 14)))
print(" 두 변수가 크게 어긋나 있고 그래서 y 차이가 참 효과보다 큽니다")
print(" 성향 점수는 처치받을 확률입니다")
ps1, bb = logit(t1, np.stack([x1, x2], axis=1))
print(" 190강의 로지스틱 회귀로 처치를 예측합니다")
print(" %s %s %s" % (pw("계수", 16), rw("추정값", 14), rw("참값", 12)))
for i, nm, tv in [(0, "절편", 0.0), (1, "x1", 0.9), (2, "x2", 0.9)]:
print(" %s %14.6f %12.1f" % (pw(nm, 16), bb[i], tv))
print(" 성향 점수가 같은 사람끼리는 x1 과 x2 의 분포가 같아집니다")
print(" %s %s %s %s %s"
% (pw("성향 점수 구간", 18), rw("처치군 수", 12), rw("대조군 수", 12),
rw("x1 의 표준화 차이", 20), rw("x2 의 표준화 차이", 20)))
edg = np.quantile(ps1, [0.0, 0.2, 0.4, 0.6, 0.8, 1.0])
for k in range(5):
m = (ps1 >= edg[k]) & (ps1 <= edg[k + 1] if k == 4 else ps1 < edg[k + 1])
tt = t1[m]
if tt.sum() < 5 or (1 - tt).sum() < 5:
continue
print(" %s %12d %12d %20.4f %20.4f"
% (pw("%d" % (k + 1), 18), int(tt.sum()), int((1 - tt).sum()),
smd(x1[m], tt), smd(x2[m], tt)))
print(" 층 밖에서 0.7103 과 0.7592 이던 차이가 층 안에서 0.12 에서 0.29 로 줄어듭니다")
print(" 크게 줄었지만 0.1 아래로 다 내려가지는 않았습니다. 층이 다섯뿐이라 그렇습니다")
print(" 점수 하나가 변수 둘을 대신합니다. 이것이 성향 점수의 힘입니다")
print(" 변수가 스무 개여도 점수는 여전히 하나입니다")
# --- 문제 2: 네 가지 쓰는 법 --------------------------------------------
print(" 성향 점수를 쓰는 방법이 여럿입니다")
naive = float(y1[t1 == 1].mean() - y1[t1 == 0].mean())
reg = ols(y1, t1, x1, x2)[1]
strat_num, strat_den = 0.0, 0.0
for k in range(5):
m = (ps1 >= edg[k]) & (ps1 <= edg[k + 1] if k == 4 else ps1 < edg[k + 1])
if t1[m].sum() < 5 or (1 - t1[m]).sum() < 5:
continue
d = float(y1[m & (t1 == 1)].mean() - y1[m & (t1 == 0)].mean())
strat_num += d * m.sum()
strat_den += m.sum()
w1 = np.where(t1 == 1, 1.0 / ps1, 1.0 / (1.0 - ps1))
ipw = float((w1 * y1 * t1).sum() / (w1 * t1).sum()
- (w1 * y1 * (1 - t1)).sum() / (w1 * (1 - t1)).sum())
pairs = match_nn(ps1, t1)
mt = np.array([y1[i] for i, j in pairs])
mc = np.array([y1[j] for i, j in pairs])
print(" %s %s %s %s" % (pw("방법", 24), rw("추정값", 14), rw("참값", 10),
rw("치우침", 12)))
for nm, v in [("아무것도 안 함", naive), ("회귀로 통제", reg),
("성향 점수 층화", strat_num / strat_den),
("성향 점수 가중", ipw), ("성향 점수 매칭", float((mt - mc).mean()))]:
print(" %s %14.6f %10.1f %12.6f" % (pw(nm, 24), v, 2.0, v - 2.0))
print(" 넷 다 4.0398 에서 참값 2.0 쪽으로 크게 옮겨 옵니다. 잰 변수가 전부이기 때문입니다")
print(" 층화가 0.2420 으로 가장 크게 남습니다. 층 안에 잔여 불균형이 있기 때문입니다")
print(" 층을 더 잘게 나누면 줄어들지만 층마다 사람이 모자라게 됩니다")
print(" 방법이 다른 것은 무엇을 추정하느냐와 어떻게 실패하느냐입니다")
print(" 매칭 뒤의 균형을 확인합니다")
ti = np.array([i for i, j in pairs])
ci = np.array([j for i, j in pairs])
print(" %s %s %s %s" % (pw("변수", 16), rw("매칭 전 표준화 차이", 22),
rw("매칭 후", 14), rw("몇 배로 줄었나", 16)))
for nm, v in [("x1", x1), ("x2", x2), ("성향 점수", ps1)]:
before = abs(smd(v, t1))
sp = np.sqrt((v[ti].var(ddof=1) + v[ci].var(ddof=1)) / 2.0)
after = abs(float((v[ti].mean() - v[ci].mean()) / sp))
print(" %s %22.4f %14.4f %16.2f"
% (pw(nm, 16), before, after, before / max(after, 1e-9)))
print(" 매칭 뒤 표준화 차이가 0.1 아래로 내려갑니다. 192강 문제 1 의 기준입니다")
print(" 매칭한 쌍은 %d 개이고 처치군 %d 명 중 전부 짝을 찾았습니다"
% (len(pairs), int(t1.sum())))
print(" 가중치의 흩어짐을 봅니다")
print(" %s %s %s %s" % (pw("무엇", 22), rw("최댓값", 14), rw("변동계수", 14),
rw("유효 표본", 14)))
for nm, m in [("처치군의 가중치", t1 == 1), ("대조군의 가중치", t1 == 0)]:
ww = w1[m]
ess = (ww.sum() ** 2) / (ww ** 2).sum()
print(" %s %14.4f %14.4f %14.1f"
% (pw(nm, 22), float(ww.max()), float(ww.std(ddof=1) / ww.mean()), ess))
print(" 175강 문제 3 의 키시 유효 표본입니다. 가중치가 흩어지면 정보가 줍니다")
# --- 문제 3: 겹치지 않으면 답할 수 없습니다 -----------------------------
print(" 성향 점수가 0 이나 1 에 가까우면 짝을 못 찾습니다")
N3 = 6000
x3 = rng.normal(0, 1, N3)
print(" 처치 확률의 기울기를 키워 가며 겹침을 봅니다")
print(" %s %s %s %s %s"
% (pw("기울기", 10), rw("점수가 0.1 아래인 처치군", 26),
rw("0.9 위인 대조군", 18), rw("가중치 최댓값", 16), rw("유효 표본 비율", 18)))
for a in [0.5, 1.5, 3.0, 5.0]:
tt = (rng.random(N3) < sig(a * x3)).astype(float)
yy = 2.0 * tt + 1.5 * x3 + rng.normal(0, 1.0, N3)
pp, _ = logit(tt, x3[:, None])
ww = np.where(tt == 1, 1.0 / pp, 1.0 / (1.0 - pp))
ess = (ww.sum() ** 2) / (ww ** 2).sum()
print(" %s %26.4f %18.4f %16.2f %18.4f"
% (pw("%.1f" % a, 10), float((pp[tt == 1] < 0.1).mean()),
float((pp[tt == 0] > 0.9).mean()), float(ww.max()), ess / N3))
print(" 기울기가 커지면 한쪽에만 있는 사람이 늘고 가중치가 폭발합니다")
print(" 177강 문제 4 의 양수성 가정이 깨지는 자리입니다")
print(" 겹치는 구간만 남기면 답할 수 있는 물음이 바뀝니다")
a4 = 3.0
t4 = (rng.random(N3) < sig(a4 * x3)).astype(float)
y4 = 2.0 * t4 + 1.5 * x3 + rng.normal(0, 1.0, N3)
p4, _ = logit(t4, x3[:, None])
print(" 기울기 3.0 인 자료에서 겹침 조건을 바꿔 가며 봅니다")
print(" %s %s %s %s" % (pw("어디까지 쓰는가", 22), rw("남는 비율", 12),
rw("추정값", 14), rw("치우침", 12)))
for nm, lo, hi in [("전부", 0.0, 1.0), ("0.05 에서 0.95", 0.05, 0.95),
("0.1 에서 0.9", 0.1, 0.9), ("0.2 에서 0.8", 0.2, 0.8)]:
m = (p4 >= lo) & (p4 <= hi)
ww = np.where(t4 == 1, 1.0 / p4, 1.0 / (1.0 - p4))
ww = np.where(m, ww, 0.0)
v = float((ww * y4 * t4).sum() / (ww * t4).sum()
- (ww * y4 * (1 - t4)).sum() / (ww * (1 - t4)).sum())
print(" %s %12.4f %14.6f %12.6f" % (pw(nm, 22), float(m.mean()), v, v - 2.0))
print(" 자를수록 안정적이지만 답하는 대상이 좁아집니다")
print(" 0.2 에서 0.8 만 쓰면 극단적인 사람들에 대해서는 아무 말도 못 합니다")
print(" 가중치를 자르는 방법도 있습니다")
ww4 = np.where(t4 == 1, 1.0 / p4, 1.0 / (1.0 - p4))
print(" %s %s %s %s" % (pw("자르는 자리", 16), rw("최댓값", 14), rw("추정값", 14),
rw("치우침", 12)))
for nm, q in [("안 자름", 1.0), ("99 퍼센트", 0.99), ("95 퍼센트", 0.95),
("90 퍼센트", 0.90)]:
cap = float(np.quantile(ww4, q)) if q < 1.0 else float(ww4.max())
wc = np.minimum(ww4, cap)
v = float((wc * y4 * t4).sum() / (wc * t4).sum()
- (wc * y4 * (1 - t4)).sum() / (wc * (1 - t4)).sum())
print(" %s %14.4f %14.6f %12.6f" % (pw(nm, 16), cap, v, v - 2.0))
print(" 175강 문제 5 와 같습니다. 자르면 분산이 줄고 치우침이 생깁니다")
# --- 문제 4: 못 잰 변수는 여전히 못 고칩니다 ----------------------------
print(" 성향 점수는 잰 변수 밖으로 못 나갑니다")
N5 = 20000
z5 = rng.normal(0, 1, N5)
u5 = rng.normal(0, 1, N5)
t5 = (rng.random(N5) < sig(0.8 * z5 + 1.2 * u5)).astype(float)
y5 = 2.0 * t5 + 1.5 * z5 + 2.0 * u5 + rng.normal(0, 1.0, N5)
print(" z 는 관측되고 u 는 관측되지 않습니다. 참 효과는 2.0 입니다")
pz, _ = logit(t5, z5[:, None])
pzu, _ = logit(t5, np.stack([z5, u5], axis=1))
print(" %s %s %s %s" % (pw("무엇으로", 26), rw("추정값", 14), rw("참값", 10),
rw("치우침", 12)))
rows = []
for nm, pp, cols in [("아무것도 안 함", None, ()),
("z 로 회귀", None, (z5,)),
("z 로 성향 점수 가중", pz, ()),
("z 로 성향 점수 매칭", pz, ()),
("z 와 u 로 가중", pzu, ())]:
if pp is None:
v = ols(y5, t5, *cols)[1] if cols else float(y5[t5 == 1].mean() - y5[t5 == 0].mean())
elif "매칭" in nm:
pr = match_nn(pp, t5)
v = float(np.mean([y5[i] - y5[j] for i, j in pr]))
else:
ww = np.where(t5 == 1, 1.0 / pp, 1.0 / (1.0 - pp))
v = float((ww * y5 * t5).sum() / (ww * t5).sum()
- (ww * y5 * (1 - t5)).sum() / (ww * (1 - t5)).sum())
rows.append((nm, v))
print(" %s %14.6f %10.1f %12.6f" % (pw(nm, 26), v, 2.0, v - 2.0))
print(" z 만 쓰는 세 방법이 거의 같은 답을 냅니다. 방법이 아니라 자료가 정합니다")
print(" 191강 문제 3 의 결론과 같습니다. 못 잰 것은 어떤 방법으로도 못 고칩니다")
print(" 균형표가 좋아 보여도 안심할 수 없습니다")
prz = match_nn(pz, t5)
tz = np.array([i for i, j in prz])
cz = np.array([j for i, j in prz])
print(" z 로만 매칭한 뒤 두 변수의 균형을 봅니다")
print(" %s %s %s %s" % (pw("변수", 16), rw("관측되는가", 14),
rw("매칭 전", 14), rw("매칭 후", 14)))
for nm, v, obs in [("z", z5, "예"), ("u", u5, "아니오")]:
sp = np.sqrt((v[tz].var(ddof=1) + v[cz].var(ddof=1)) / 2.0)
after = float((v[tz].mean() - v[cz].mean()) / sp)
print(" %s %14s %14.4f %14.4f"
% (pw(nm, 16), rw(obs, 14), smd(v, t5), after))
print(" z 는 균형이 맞았는데 u 는 그대로입니다. 그런데 u 는 표에 안 실립니다")
print(" 보고서의 균형표는 잰 변수만 담습니다. 좋아 보이는 것이 당연합니다")
print(" 얼마나 강한 교란이면 결론이 뒤집히는지 봅니다")
print(" 177강 문제 4 의 민감도 분석을 여기서도 합니다")
print(" %s %s %s %s"
% (pw("u 가 y 에 미치는 크기", 22), rw("u 가 처치에 미치는 크기", 26),
rw("참 효과 0 인데 나오는 값", 24), rw("관측값을 설명하는가", 22)))
obsv = rows[2][1]
for bu in [0.5, 1.0, 2.0]:
for au in [0.6, 1.2, 2.0]:
pu = sig(0.8 * z5 + au * u5)
tu = (rng.random(N5) < pu).astype(float)
y0 = 1.5 * z5 + bu * u5 + rng.normal(0, 1.0, N5)
pw2, _ = logit(tu, z5[:, None])
ww = np.where(tu == 1, 1.0 / pw2, 1.0 / (1.0 - pw2))
fake = float((ww * y0 * tu).sum() / (ww * tu).sum()
- (ww * y0 * (1 - tu)).sum() / (ww * (1 - tu)).sum())
print(" %s %26.1f %24.6f %s"
% (pw("%.1f" % bu, 22), au, fake,
rw("예" if fake >= obsv else "아니오", 22)))
print(" 아홉 조합 중 관측값 %.4f 에 닿는 것이 없습니다" % obsv)
print(" 참 효과가 2.0 이므로 당연합니다. u 혼자서는 전부를 만들 수 없습니다")
print(" 대신 참 u 의 조합인 2.0 과 1.2 가 1.930223 을 만듭니다")
print(" z 로만 보정했을 때의 치우침 1.928308 과 거의 같습니다. 민감도가 제대로 작동합니다")
# --- 문제 5: 실무의 절차 -----------------------------------------------
print(" 목표 시험을 먼저 적고 관측 자료로 흉내 냅니다")
print(" %s %s" % (pw("무엇을 적는가", 22), rw("관측 자료에서 무엇이 되는가", 30)))
for a, b in [("누가 대상인가", "표본 포함 기준"),
("무엇이 처치인가", "처치 정의와 시점"),
("무엇과 견주는가", "대조군 정의"),
("언제부터 세는가", "추적 시작 시점"),
("무엇을 결과로 보는가", "결과 변수와 기간"),
("어떻게 배정하는가", "성향 점수로 흉내")]:
print(" %s %s" % (pw(a, 22), rw(b, 30)))
print(" 마지막 줄만 통계이고 나머지 다섯은 설계입니다")
print(" 순서를 안 지키면 흔한 실수가 생깁니다. 다음에서 봅니다")
print(" 시점을 잘못 잡으면 없던 효과가 생깁니다")
N6 = 100000
death = rng.exponential(60.0, N6)
tr_time = rng.exponential(45.0, N6)
got = tr_time < death
print(" 처치를 받으려면 그때까지 살아 있어야 합니다. 참 효과는 없습니다")
print(" %s %s %s" % (pw("어떻게 세는가", 26), rw("처치군 생존", 16),
rw("대조군 생존", 16)))
a1 = float(death[got].mean())
a0 = float(death[~got].mean())
print(" %s %16.4f %16.4f" % (pw("받은 사람 대 안 받은 사람", 26), a1, a0))
land = 40.0
alive = death > land
g2 = got & (tr_time <= land)
b1 = float(death[alive & g2].mean())
b0 = float(death[alive & ~g2].mean())
print(" %s %16.4f %16.4f" % (pw("40 일 시점에서 나눔", 26), b1, b0))
print(" 첫 줄은 처치군이 훨씬 오래 삽니다. 오래 살아야 처치를 받기 때문입니다")
print(" 이것을 불멸 시간 치우침이라 합니다. 처치가 원인이 아닙니다")
print(" 둘째 줄처럼 기준 시점을 정하고 그 시점까지의 정보로만 나누면 사라집니다")
print(" 절차를 정리합니다")
print(" %s %s" % (pw("단계", 22), rw("무엇을 확인하는가", 30)))
for a, b in [("변수 고르기", "결과의 원인이면서 처치와 이어진 것"),
("점수 만들기", "적합도가 아니라 균형이 목표"),
("겹침 확인", "양쪽 끝에 한쪽만 있는지"),
("균형 확인", "표준화 차이 0.1 아래"),
("효과 추정", "매칭 구조를 분산에 반영"),
("민감도 분석", "못 잰 교란이 얼마여야 뒤집히는지")]:
print(" %s %s" % (pw(a, 22), rw(b, 30)))
print(" 둘째 줄이 자주 오해됩니다. 성향 점수 모형의 AUC 가 높을 필요가 없습니다")
print(" 점수 모형이 잘 맞을수록 좋은 것이 아닙니다")
print(" 처치를 완벽히 예측하면 겹침이 사라집니다")
print(" %s %s %s %s" % (pw("점수 모형의 AUC", 18), rw("겹치는 비율", 14),
rw("유효 표본 비율", 18), rw("쓸 수 있는가", 14)))
for a in [0.3, 1.0, 2.5, 6.0]:
tt = (rng.random(N3) < sig(a * x3)).astype(float)
pp, _ = logit(tt, x3[:, None])
pos, neg = pp[tt == 1], pp[tt == 0]
idx = np.argsort(np.concatenate([pos, neg]))
r = np.empty(len(idx))
r[idx] = np.arange(1, len(idx) + 1)
auc = (r[:len(pos)].sum() - len(pos) * (len(pos) + 1) / 2.0) / (len(pos) * len(neg))
ww = np.where(tt == 1, 1.0 / pp, 1.0 / (1.0 - pp))
ess = (ww.sum() ** 2) / (ww ** 2).sum()
ov = float(((pp > 0.1) & (pp < 0.9)).mean())
print(" %s %14.4f %18.4f %s"
% (pw("%.4f" % auc, 18), ov, ess / N3,
rw("예" if ess / N3 > 0.3 else "어렵습니다", 14)))
print(" AUC 가 높을수록 겹침이 줄고 유효 표본이 사라집니다")
print(" 190강 문제 4 의 판별력이 여기서는 나쁜 신호입니다")
print(" 성향 점수 모형은 균형을 맞추는 도구이지 예측 모형이 아닙니다")
# 191강 심화 5 에서 무작위 배정이 불가능한 자리를 봤습니다
# 그럴 때 잰 변수로 비슷한 사람을 짝지어 실험처럼 만듭니다
# 두 변수가 처치와 결과에 모두 영향을 줍니다. 참 효과는 2.0 입니다
# 무엇 처치군 대조군 표준화 차이
# x1 0.3180 -0.3509 0.7103
# x2 0.3405 -0.3639 0.7592
# 결과 y 5.0022 0.9624 차이 4.0398
# 두 변수가 크게 어긋나 있고 그래서 y 차이가 참 효과보다 큽니다
# 성향 점수는 처치받을 확률입니다
# 190강의 로지스틱 회귀로 처치를 예측합니다
# 계수 추정값 참값
# 절편 -0.001256 0.0
# x1 0.868631 0.9
# x2 0.930800 0.9
# 성향 점수가 같은 사람끼리는 x1 과 x2 의 분포가 같아집니다
# 성향 점수 구간 처치군 수 대조군 수 x1 의 표준화 차이 x2 의 표준화 차이
# 1 134 666 0.1518 0.2606
# 2 245 555 0.1221 -0.0703
# 3 401 399 -0.0397 0.0594
# 4 522 278 -0.0125 0.1050
# 5 672 128 0.2929 0.2204
# 층 밖에서 0.7103 과 0.7592 이던 차이가 층 안에서 0.12 에서 0.29 로 줄어듭니다
# 크게 줄었지만 0.1 아래로 다 내려가지는 않았습니다. 층이 다섯뿐이라 그렇습니다
# 점수 하나가 변수 둘을 대신합니다. 이것이 성향 점수의 힘입니다
# 변수가 스무 개여도 점수는 여전히 하나입니다
# 성향 점수를 쓰는 방법이 여럿입니다
# 방법 추정값 참값 치우침
# 아무것도 안 함 4.039803 2.0 2.039803
# 회귀로 통제 2.011591 2.0 0.011591
# 성향 점수 층화 2.241961 2.0 0.241961
# 성향 점수 가중 2.080574 2.0 0.080574
# 성향 점수 매칭 1.947774 2.0 -0.052226
# 넷 다 4.0398 에서 참값 2.0 쪽으로 크게 옮겨 옵니다. 잰 변수가 전부이기 때문입니다
# 층화가 0.2420 으로 가장 크게 남습니다. 층 안에 잔여 불균형이 있기 때문입니다
# 층을 더 잘게 나누면 줄어들지만 층마다 사람이 모자라게 됩니다
# 방법이 다른 것은 무엇을 추정하느냐와 어떻게 실패하느냐입니다
# 매칭 뒤의 균형을 확인합니다
# 변수 매칭 전 표준화 차이 매칭 후 몇 배로 줄었나
# x1 0.7103 0.0464 15.32
# x2 0.7592 0.0518 14.65
# 성향 점수 1.1251 0.0007 1547.76
# 매칭 뒤 표준화 차이가 0.1 아래로 내려갑니다. 192강 문제 1 의 기준입니다
# 매칭한 쌍은 1974 개이고 처치군 1974 명 중 전부 짝을 찾았습니다
# 가중치의 흩어짐을 봅니다
# 무엇 최댓값 변동계수 유효 표본
# 처치군의 가중치 26.0311 0.7402 1275.5
# 대조군의 가중치 28.0245 0.7069 1351.2
# 175강 문제 3 의 키시 유효 표본입니다. 가중치가 흩어지면 정보가 줍니다
# 성향 점수가 0 이나 1 에 가까우면 짝을 못 찾습니다
# 처치 확률의 기울기를 키워 가며 겹침을 봅니다
# 기울기 점수가 0.1 아래인 처치군 0.9 위인 대조군 가중치 최댓값 유효 표본 비율
# 0.5 0.0000 0.0000 5.51 0.9461
# 1.5 0.0088 0.0136 65.09 0.4621
# 3.0 0.0137 0.0159 404.09 0.0689
# 5.0 0.0173 0.0134 866.39 0.0215
# 기울기가 커지면 한쪽에만 있는 사람이 늘고 가중치가 폭발합니다
# 177강 문제 4 의 양수성 가정이 깨지는 자리입니다
# 겹치는 구간만 남기면 답할 수 있는 물음이 바뀝니다
# 기울기 3.0 인 자료에서 겹침 조건을 바꿔 가며 봅니다
# 어디까지 쓰는가 남는 비율 추정값 치우침
# 전부 1.0000 2.340989 0.340989
# 0.05 에서 0.95 0.6553 1.976133 -0.023867
# 0.1 에서 0.9 0.5178 1.986223 -0.013777
# 0.2 에서 0.8 0.3463 1.995558 -0.004442
# 자를수록 안정적이지만 답하는 대상이 좁아집니다
# 0.2 에서 0.8 만 쓰면 극단적인 사람들에 대해서는 아무 말도 못 합니다
# 가중치를 자르는 방법도 있습니다
# 자르는 자리 최댓값 추정값 치우침
# 안 자름 144.0118 2.340989 0.340989
# 99 퍼센트 13.4026 2.774713 0.774713
# 95 퍼센트 4.4242 3.187482 1.187482
# 90 퍼센트 2.7250 3.425506 1.425506
# 175강 문제 5 와 같습니다. 자르면 분산이 줄고 치우침이 생깁니다
# 성향 점수는 잰 변수 밖으로 못 나갑니다
# z 는 관측되고 u 는 관측되지 않습니다. 참 효과는 2.0 입니다
# 무엇으로 추정값 참값 치우침
# 아무것도 안 함 4.613760 2.0 2.613760
# z 로 회귀 3.924449 2.0 1.924449
# z 로 성향 점수 가중 3.928308 2.0 1.928308
# z 로 성향 점수 매칭 3.904053 2.0 1.904053
# z 와 u 로 가중 1.957685 2.0 -0.042315
# z 만 쓰는 세 방법이 거의 같은 답을 냅니다. 방법이 아니라 자료가 정합니다
# 191강 문제 3 의 결론과 같습니다. 못 잰 것은 어떤 방법으로도 못 고칩니다
# 균형표가 좋아 보여도 안심할 수 없습니다
# z 로만 매칭한 뒤 두 변수의 균형을 봅니다
# 변수 관측되는가 매칭 전 매칭 후
# z 예 0.5850 0.0001
# u 아니오 0.9667 1.0242
# z 는 균형이 맞았는데 u 는 그대로입니다. 그런데 u 는 표에 안 실립니다
# 보고서의 균형표는 잰 변수만 담습니다. 좋아 보이는 것이 당연합니다
# 얼마나 강한 교란이면 결론이 뒤집히는지 봅니다
# 177강 문제 4 의 민감도 분석을 여기서도 합니다
# u 가 y 에 미치는 크기 u 가 처치에 미치는 크기 참 효과 0 인데 나오는 값 관측값을 설명하는가
# 0.5 0.6 0.310852 아니오
# 0.5 1.2 0.502333 아니오
# 0.5 2.0 0.625212 아니오
# 1.0 0.6 0.582991 아니오
# 1.0 1.2 0.990584 아니오
# 1.0 2.0 1.255439 아니오
# 2.0 0.6 1.157953 아니오
# 2.0 1.2 1.930223 아니오
# 2.0 2.0 2.529557 아니오
# 아홉 조합 중 관측값 3.9283 에 닿는 것이 없습니다
# 참 효과가 2.0 이므로 당연합니다. u 혼자서는 전부를 만들 수 없습니다
# 대신 참 u 의 조합인 2.0 과 1.2 가 1.930223 을 만듭니다
# z 로만 보정했을 때의 치우침 1.928308 과 거의 같습니다. 민감도가 제대로 작동합니다
# 목표 시험을 먼저 적고 관측 자료로 흉내 냅니다
# 무엇을 적는가 관측 자료에서 무엇이 되는가
# 누가 대상인가 표본 포함 기준
# 무엇이 처치인가 처치 정의와 시점
# 무엇과 견주는가 대조군 정의
# 언제부터 세는가 추적 시작 시점
# 무엇을 결과로 보는가 결과 변수와 기간
# 어떻게 배정하는가 성향 점수로 흉내
# 마지막 줄만 통계이고 나머지 다섯은 설계입니다
# 순서를 안 지키면 흔한 실수가 생깁니다. 다음에서 봅니다
# 시점을 잘못 잡으면 없던 효과가 생깁니다
# 처치를 받으려면 그때까지 살아 있어야 합니다. 참 효과는 없습니다
# 어떻게 세는가 처치군 생존 대조군 생존
# 받은 사람 대 안 받은 사람 85.9102 25.7087
# 40 일 시점에서 나눔 100.0807 100.3660
# 첫 줄은 처치군이 훨씬 오래 삽니다. 오래 살아야 처치를 받기 때문입니다
# 이것을 불멸 시간 치우침이라 합니다. 처치가 원인이 아닙니다
# 둘째 줄처럼 기준 시점을 정하고 그 시점까지의 정보로만 나누면 사라집니다
# 절차를 정리합니다
# 단계 무엇을 확인하는가
# 변수 고르기 결과의 원인이면서 처치와 이어진 것
# 점수 만들기 적합도가 아니라 균형이 목표
# 겹침 확인 양쪽 끝에 한쪽만 있는지
# 균형 확인 표준화 차이 0.1 아래
# 효과 추정 매칭 구조를 분산에 반영
# 민감도 분석 못 잰 교란이 얼마여야 뒤집히는지
# 둘째 줄이 자주 오해됩니다. 성향 점수 모형의 AUC 가 높을 필요가 없습니다
# 점수 모형이 잘 맞을수록 좋은 것이 아닙니다
# 처치를 완벽히 예측하면 겹침이 사라집니다
# 점수 모형의 AUC 겹치는 비율 유효 표본 비율 쓸 수 있는가
# 0.5894 1.0000 0.9738 예
# 0.7352 0.9765 0.7778 예
# 0.8979 0.6157 0.2252 어렵습니다
# 0.9733 0.2903 0.0617 어렵습니다
# AUC 가 높을수록 겹침이 줄고 유효 표본이 사라집니다
# 190강 문제 4 의 판별력이 여기서는 나쁜 신호입니다
# 성향 점수 모형은 균형을 맞추는 도구이지 예측 모형이 아닙니다