184강부터 여기까지 결과가 연속인 자료였습니다. 이제 결과가 과 입니다.
181강에서 범주형 결과를 교차표로 다뤘는데, 다른 변수를 통제할 자리가 없었습니다. 회귀로 넣으면 그 한계가 풀립니다.
그런데 직선을 그냥 쓰면 안 됩니다. 확률은 과 사이인데 직선은 어디로든 갑니다.
| 무엇을 모형화 | 범위 |
|---|---|
| 확률 | 에서 |
| 오즈 | 에서 무한대 |
| 로그오즈 | 음의 무한대에서 무한대 |
셋째 줄에 직선을 얹습니다. 그것이 로지스틱 회귀이고, 181강 문제 3의 오즈비가 계수의 지수로 되돌아옵니다.
그리고 선형회귀에 없던 성질이 하나 나타납니다. 교란이 없어도 변수를 빼면 계수가 눌립니다. 문제 3에서 그것을 봅니다.
문제. 이진 결과를 회귀합니다.
(1) 최소제곱을 그냥 써 보세요.
(2) 로그오즈로 옮기세요.
(3) 로지스틱 회귀를 적합하세요.
생각의 실마리. 과 을 그대로 회귀하면 예측값이 확률처럼 읽힙니다. 그런데 직선은 아래와 위로도 갑니다.
풀이. (1) 참 모형이 로그오즈 인 자료를 최소제곱으로 회귀합니다.
| 값 | 직선의 예측 | 과 사이인가 | 참 확률 |
|---|---|---|---|
| 아니오 | |||
| 예 | |||
| 예 | |||
| 예 | |||
| 아니오 |
개 중 이 과 밖으로 나갑니다. 확률이 음수이거나 을 넘는 예측은 뜻이 없습니다.
그리고 참 확률이 자로 휘는데 직선은 안 휩니다. 에서 참값은 인데 직선은 이고, 양 끝에서 계속 어긋납니다.
(2) 확률을 로그오즈로 옮깁니다.
| 확률 | 오즈 | 로그오즈 |
|---|---|---|
로그오즈는 음의 무한대에서 무한대까지 갑니다. 직선을 얹을 수 있습니다.
를 중심으로 대칭입니다. 과 가 로 부호만 다릅니다.
거꾸로 로짓을 확률로 되돌리는 함수가 시그모이드입니다.
(3) 적합합니다.
| 계수 | 추정값 | 표준오차 | 참값 | |
|---|---|---|---|---|
| 절편 | ||||
| 의 계수 |
최소제곱이 아니라 우도를 최대로 만드는 방법으로 풉니다. 로그우도는 이며, 반복 재가중 최소제곱으로 구했습니다.
이 식이 205강의 교차엔트로피 손실과 같습니다. 부호만 뒤집으면 됩니다.
이 문제에서 배우는 것. 선형확률모형이 완전히 못 쓸 것은 아닙니다. 확률이 에서 사이에 몰려 있으면 직선이 그 구간을 잘 근사하고, 계수가 확률 차이라 해석도 쉽습니다. 못 쓰는 것은 확률이 양 끝에 가까울 때인데, 위 표에서 퍼센트가 범위를 벗어난 것이 그 신호입니다. 그리고 선형확률모형은 오차가 이항이라 188강 심화 3의 이분산이 기본값이므로, 쓰더라도 강건 표준오차가 필요합니다.
바로 확인 1.
확인 1-1. 검산에서 최소제곱 예측이 범위를 벗어난 비율을 쓰세요.
답. 입니다.
확인 1-2. 로짓과 시그모이드를 각각 식으로 쓰세요.
답. 와 입니다.
확인 1-3. 검산에서 로지스틱의 두 계수와 참값을 쓰세요.
답. 과 이며 참값은 와 입니다.
문제. 계수를 해석합니다.
(1) 오즈비를 구하세요.
(2) 확률 변화와 견주세요.
(3) 한계효과를 계산하세요.
생각의 실마리. 계수는 로그오즈의 변화입니다. 지수를 취하면 오즈의 배수가 되는데, 확률의 변화는 그것과 다릅니다.
풀이. (1) 지수를 취합니다.
| 가 얼마나 느는가 | 로그오즈 변화 | 오즈비 | 참 오즈비 |
|---|---|---|---|
오즈비가 가 어디에 있든 같습니다. 가 에서 로 가든 에서 으로 가든 오즈는 배가 됩니다.
그것이 로지스틱의 성질입니다. 로그오즈에 직선을 얹었으므로 어디서나 같은 기울기입니다.
(2) 그런데 확률의 변화는 마다 다릅니다.
| 값 | 그 자리 확률 | 가 늘면 | 확률 차이 |
|---|---|---|---|
같은 오즈비인데 확률 차이는 에서 까지 스무 배 벌어집니다.
시작과 끝이 를 사이에 두고 있을 때 가장 큽니다. 에서 가 가 되는 자리입니다.
181강 문제 3에서 차이와 비가 다른 이야기를 한 것이 여기서 되풀이됩니다.
(3) 한계효과를 계산합니다.
| 무엇 | 값 | 어떻게 |
|---|---|---|
| 평균 한계효과 | 사람마다 구해 평균 | |
| 평균에서의 한계효과 | 평균 확률로 한 번 | |
| 선형확률모형의 계수 | 최소제곱 기울기 |
평균 한계효과와 선형확률모형의 계수가 과 으로 가깝습니다.
그런데 평균에서의 한계효과는 로 크게 다릅니다. 가 넓게 퍼져 확률이 과 근처까지 가기 때문이며, 평균 확률 한 점으로 전체를 대표할 수 없습니다.
사람마다 구해 평균 내야 합니다. 132강의 젠센 부등식이 여기서 다시 나오는데, 가 오목하므로 평균의 함수가 함수의 평균보다 큽니다.
이 문제에서 배우는 것. 오즈비가 해석하기 쉬워 보이는 것이 착시입니다. "오즈가 배"라는 문장은 정확하지만, 읽는 사람은 대개 **"확률이 배"**로 옮겨 듣습니다. 기저 확률이 면 실제로 확률은 로 배가 되지만, 기저가 면 으로 배뿐입니다. 그래서 보고할 때는 기저 확률과 함께 적거나, 아예 평균 한계효과를 쓰는 편이 낫습니다. 181강 문제 3에서 "비만 보고하면 안 된다"고 한 것과 같은 결론입니다.
바로 확인 2.
확인 2-1. 검산에서 가 늘 때의 오즈비와 참값을 쓰세요.
답. 과 입니다.
확인 2-2. 검산에서 확률 차이의 최소와 최대를 쓰세요.
답. 과 입니다.
확인 2-3. 평균 한계효과와 평균에서의 한계효과를 검산 값과 함께 구분하세요.
답. 과 이며 앞쪽을 써야 합니다.
문제. 통제 변수를 넣습니다.
(1) 교차표와 견주고 교란을 통제하세요.
(2) 교란이 없을 때도 계수가 바뀌는지 확인하세요.
(3) 선형확률모형과 견주세요.
생각의 실마리. 181강이 못 하던 일이 다른 변수를 함께 넣는 것이었습니다. 그것을 하면 무엇이 달라지는지 봅니다.
풀이. (1) 가 처치 와 결과 에 모두 영향을 주는 교란입니다. 참 로그오즈는 입니다.
교차표의 오즈비는 이고 로그는 입니다.
| 모형 | 의 계수 | 오즈비 | 참값 |
|---|---|---|---|
| 만 넣음 | |||
| 와 를 넣음 |
만 넣은 계수가 교차표의 로그 오즈비와 소수 여섯째 자리까지 같습니다. 로지스틱 회귀가 교차표를 포함합니다.
를 넣으면 으로 참값 에 닿습니다. 이것이 181강이 못 하던 일입니다.
(2) 그런데 교란이 없어도 계수가 바뀝니다. 는 와 무관하고 에만 영향을 줍니다.
| 모형 | 의 계수 | 참값 |
|---|---|---|
| 만 넣음 | ||
| 와 를 넣음 |
무작위 배정과 같은 상황인데 만 넣으면 으로 눌립니다.
185강 문제 1의 누락변수 편향 공식이 여기서 안 맞습니다. 그 공식은 인데, 와 가 무관하므로 이어야 합니다.
이것을 비붕괴성이라 합니다. 조건부 오즈비와 주변 오즈비가 다른 양이기 때문이며, 어느 쪽도 틀린 값이 아닙니다.
그래서 오즈비는 어느 변수를 넣었느냐를 밝히지 않으면 견줄 수 없습니다.
(3) 선형확률모형과 견줍니다.
| 모형 | 의 계수 | 차이 |
|---|---|---|
| 만 넣음 | ||
| 와 를 넣음 |
선형확률모형의 계수는 만 바뀝니다. 확률 차이가 붕괴하기 때문입니다.
해석의 안정성이 목적이면 확률 차이가 오즈비보다 낫습니다.
이 문제에서 배우는 것. 논문 두 편의 오즈비를 나란히 놓고 비교하는 것이 대부분 잘못된 비교입니다. 통제 변수 목록이 다르면 같은 참 효과에서도 다른 오즈비가 나오며, 위 표에서 과 가 그 폭입니다. 메타분석에서 이 문제가 특히 심각한데, 연구마다 통제한 변수가 달라 오즈비를 그냥 합치면 안 됩니다. 그래서 요즘은 위험차나 위험비를 보고하도록 권하는 지침이 늘고 있으며, 둘 다 붕괴하는 양입니다.
바로 확인 3.
확인 3-1. 검산에서 교차표의 로그 오즈비와 만 넣은 계수를 쓰세요.
답. 둘 다 로 같습니다.
확인 3-2. 비붕괴성이 무엇인지 검산 값과 함께 쓰세요.
답. 교란이 없어도 변수를 빼면 계수가 눌리며 이 이 됩니다.
확인 3-3. 검산에서 선형확률모형의 두 계수를 쓰세요.
답. 과 으로 거의 같습니다.
문제. 적합도를 잽니다.
(1) 로그우도로 모형을 견주세요.
(2) 정확도를 기준선과 함께 보세요.
생각의 실마리. 로지스틱에는 잔차 제곱합이 없으므로 도 없습니다. 대신 로그우도로 견줍니다.
풀이. (1) 절편만인 모형을 기준으로 봅니다.
| 모형 | 로그우도 | 맥패든 R^ | 우도비 통계량 | 정확도 |
|---|---|---|---|---|
| 절편만 | ||||
| x_ | ||||
| x_{1}\,x_ | ||||
| x_{1}\,x_{2}\,x_ |
맥패든 이 입니다. 참 모형을 다 넣었는데도 이 값이며, 선형회귀의 보다 훨씬 작게 나옵니다.
만 넘어도 좋은 적합으로 봅니다. 같은 잣대로 읽으면 안 됩니다.
우도비 통계량은 자유도가 변수 수인 카이제곱을 따릅니다. 를 넣었을 때 에서 으로 만 올랐으므로, 자유도 에서 전혀 유의하지 않습니다.
(2) 정확도는 기준선을 함께 봐야 합니다.
| 의 비율 | 다 이라 찍기 | 모형의 정확도 | 차이 | AUC |
|---|---|---|---|---|
드문 사건에서는 다 이라 찍어도 가 나옵니다.
정확도가 에서 로 오르는 것처럼 보이는데 기준선이 같이 올랐을 뿐입니다. 차이가 에서 으로 사라집니다.
AUC는 기준선에 안 끌려다닙니다. 네 줄에서 부터 로 거의 같으며, 판별력이 같다는 것을 제대로 보여 줍니다. 226강에서 자세히 다룹니다.
이 문제에서 배우는 것. "정확도 퍼센트"라는 보고가 아무것도 말하지 않을 수 있습니다. 사기 탐지나 질병 진단처럼 사건이 드문 자리에서는 아무것도 안 하는 모형이 이미 퍼센트이므로, 기준선을 함께 적지 않으면 독자가 판단할 수 없습니다. 그리고 임계값 가 자연스러워 보이지만 드문 사건에서는 아무도 그 문턱을 안 넘습니다. 위 표의 마지막 줄에서 모형이 전부 으로 예측했고, 그래서 정확도가 기준선과 정확히 같습니다.
바로 확인 4.
확인 4-1. 맥패든 을 식으로 쓰세요.
답. 에서 모형의 로그우도를 절편만인 모형의 로그우도로 나눈 값을 뺍니다.
확인 4-2. 검산에서 를 넣었을 때 우도비 통계량의 변화를 쓰세요.
답. 에서 로 만 오릅니다.
확인 4-3. 검산에서 사건 비율이 일 때 기준선과 정확도를 쓰세요.
답. 둘 다 으로 같습니다.
문제. 추정이 안 되는 경우를 봅니다.
(1) 완전 분리를 만드세요.
(2) 벌점으로 고치세요.
(3) 드문 사건의 치우침을 재세요.
생각의 실마리. 우도를 최대로 만드는 값이 없을 수도 있습니다. 완벽하게 나누는 직선이 있으면 가파를수록 우도가 커집니다.
풀이. (1) 가 음수면 전부 이고 양수면 전부 인 자료입니다.
| 반복 횟수 | 의 계수 | 표준오차 | 로그우도 |
|---|---|---|---|
계수가 반복할수록 끝없이 커집니다. 로그우도가 에 붙어 최대가 없기 때문입니다.
표준오차가 까지 갑니다. 소프트웨어가 수렴했다고 말해도 그 값은 뜻이 없습니다.
(2) 벌점을 조금 주면 값이 정해집니다.
| 벌점 람다 | 의 계수 | 표준오차 | 로그우도 |
|---|---|---|---|
람다가 보다 크면 유한한 값에서 멈춥니다. 187강의 능형과 같은 장치입니다.
완전 분리는 자료가 작고 변수가 많을 때 자주 생깁니다. 더미를 여럿 넣으면 어느 조합이 한쪽으로만 몰리기 쉽고, 186강 문제 5에서 변수가 개가 되는 것을 봤습니다.
(3) 드문 사건의 치우침을 잽니다. 참 계수 을 여러 사건 비율에서 추정합니다.
| 의 비율 | 표본 크기 | 기대 사건 수 | 계수의 평균 | 참값 대비 |
|---|---|---|---|---|
사건이 드물고 표본이 작으면 계수가 위로 부풉니다. 기대 사건 수가 인 셋째 줄이 퍼센트로 가장 심합니다.
표본을 열 배로 늘리면 퍼센트로 줄어듭니다. 표본이 아니라 사건 수가 정합니다.
위 표는 계수가 을 넘는 분리 사례를 뺀 값이라 실제 치우침은 더 큽니다.
마지막으로 판단을 정리합니다.
| 상황 | 무엇을 하는가 |
|---|---|
| 확률 차이가 관심 | 선형확률모형이나 한계효과 |
| 오즈비를 보고 | 넣은 변수 목록을 함께 |
| 완전 분리 | 벌점을 주거나 변수를 줄임 |
| 사건이 드묾 | 사건 수를 세고 벌점을 씀 |
| 여러 모형 비교 | 로그우도와 우도비 |
| 정확도 보고 | 기준선과 AUC를 함께 |
둘째 줄이 이 강의의 결론입니다. 오즈비는 모형에 따라 달라지는 값입니다.
이 문제에서 배우는 것. 로지스틱 회귀에서 표본 크기의 자리를 사건 수가 대신합니다. 183강 심화 4에서 비율 비교의 표본 크기가 사건 수로 정해진다고 했는데, 여기서도 같습니다. 실무의 경험칙이 변수 하나당 사건 개이며, 변수가 개면 사건이 개는 있어야 합니다. 그 아래로 내려가면 완전 분리와 치우침이 함께 나타나며, 관측이 만 개여도 사건이 개면 아무 소용이 없습니다.
바로 확인 5.
확인 5-1. 완전 분리가 왜 문제인지 쓰세요.
답. 완벽히 나누는 직선이 있으면 가파를수록 우도가 커져 최대가 없습니다.
확인 5-2. 검산에서 벌점 과 일 때의 계수를 쓰세요.
답. 와 입니다.
확인 5-3. 검산에서 기대 사건 수 일 때 계수의 평균을 쓰세요.
답. 으로 참값보다 퍼센트 큽니다.
| 무엇 | 식 |
|---|---|
| 오즈 | |
| 로짓 | |
| 시그모이드 | |
| 오즈비 | e^ |
| 한계효과 | |
| 맥패든 R^ | 1-\ell/\ell_ |
| 무엇이 붕괴하는가 | 무엇이 안 하는가 |
|---|---|
| 확률 차이 | 오즈비 |
| 위험비 | 로그오즈 계수 |
| 자주 하는 실수 | 바로잡기 |
|---|---|
| 오즈비를 확률 배수로 읽습니다 | 기저 확률이 정합니다 |
| 두 논문의 오즈비를 견줍니다 | 통제 변수가 다르면 못 견줍니다 |
| 평균 확률로 한계효과를 냅니다 | 사람마다 구해 평균 냅니다 |
| 맥패든 을 처럼 읽습니다 | 면 좋은 적합입니다 |
| 정확도만 보고합니다 | 기준선을 함께 적습니다 |
| 분리인데 계수를 해석합니다 | 값이 뜻이 없습니다 |
문제 6. 검산에서 최소제곱 예측이 범위를 벗어난 비율을 쓰세요.
답. 입니다.
문제 7. 로짓과 시그모이드를 각각 식으로 쓰세요.
답. 와 입니다.
문제 8. 검산에서 로지스틱의 두 계수와 참값을 쓰세요.
답. 과 이며 참값은 와 입니다.
문제 9. 검산에서 가 늘 때의 오즈비와 참값을 쓰세요.
답. 과 입니다.
문제 10. 검산에서 확률 차이의 최소와 최대를 쓰세요.
답. 과 입니다.
문제 11. 평균 한계효과와 평균에서의 한계효과를 검산 값과 함께 구분하세요.
답. 과 이며 앞쪽을 써야 합니다.
문제 12. 검산에서 교차표의 로그 오즈비와 만 넣은 계수를 쓰세요.
답. 둘 다 로 같습니다.
문제 13. 비붕괴성이 무엇인지 검산 값과 함께 쓰세요.
답. 교란이 없어도 변수를 빼면 계수가 눌리며 이 이 됩니다.
문제 14. 검산에서 선형확률모형의 두 계수를 쓰세요.
답. 과 으로 거의 같습니다.
문제 15. 검산에서 를 넣었을 때 우도비 통계량의 변화를 쓰세요.
답. 에서 로 만 오릅니다.
문제 16. 검산에서 사건 비율이 일 때 기준선과 정확도를 쓰세요.
답. 둘 다 으로 같습니다.
문제 17. 검산에서 벌점 과 일 때의 계수를 쓰세요.
답. 와 입니다.
문제 18. 검산에서 기대 사건 수 일 때 계수의 평균을 쓰세요.
답. 으로 참값보다 퍼센트 큽니다.
심화 1. 반복 재가중 최소제곱을 유도하세요.
로그우도를 미분하면 닫힌 해가 안 나옵니다. 뉴턴 방법을 쓰면 각 단계가 가중최소제곱이 됩니다.
| 무엇 | 값 |
|---|---|
| 가중치 w_ | |
| 작업 반응 z_ | \eta_{i}+(y_{i}-p_{i})/w_ |
188강 문제 4의 가중최소제곱을 반복하는 것과 같습니다. 가중치가 매번 갱신되는 것만 다릅니다.
로그우도가 오목하므로 최대가 하나뿐입니다. 어디서 시작해도 같은 답에 닿으며, 이것이 신경망과 크게 다른 점입니다.
표준오차는 의 대각에서 나옵니다. 이것을 피셔 정보의 역이라 하며, 최대우도 이론의 일반 결과입니다.
심화 2. 링크 함수를 바꾸면 어떻게 되는지 정리하세요.
로짓이 유일한 선택은 아닙니다.
| 이름 | 링크 | 계수의 뜻 |
|---|---|---|
| 로짓 | 로그 오즈비 | |
| 프로빗 | 잠재 정규의 표준화 효과 | |
| 로그 | 로그 위험비 | |
| 항등 | 위험차 |
로짓과 프로빗은 거의 같은 곡선입니다. 계수가 대략 배 차이 날 뿐이며, 자료로 구별하기 어렵습니다.
셋째와 넷째 줄이 붕괴하는 양을 줍니다. 문제 3에서 본 비붕괴성이 없어지므로 해석이 안정적인데, 예측이 범위를 벗어날 수 있습니다.
로짓이 표준이 된 것은 계산의 편의 때문입니다. 오즈비가 사례-대조 연구에서도 추정되는 성질이 있고, 그것이 역학에서 자리 잡은 이유입니다.
심화 3. 사례-대조 연구를 정리하세요.
드문 질병에서는 결과를 보고 표본을 뽑습니다. 177강 문제 2의 선택이 의도적으로 일어납니다.
| 무엇을 고정 | 무엇이 추정되는가 |
|---|---|
| 사례 수와 대조 수 | 오즈비만 |
| 위험비 | 못 합니다 |
| 절대 위험 | 못 합니다 |
절편만 틀리고 기울기는 맞습니다. 결과에 따라 뽑는 비율이 다르면 절편이 그만큼 밀리는데, 로짓에서는 기울기가 안 밀립니다.
이 성질이 로짓에만 있습니다. 프로빗이나 로그 링크에서는 성립하지 않으며, 그것이 역학에서 로지스틱이 표준인 결정적 이유입니다.
대신 절대 위험은 밖에서 가져와야 합니다. 전체 인구의 유병률을 알면 절편을 되돌릴 수 있습니다.
심화 4. 예측 확률을 보정하는 법을 정리하세요.
모형이 순위를 잘 매겨도 확률 자체가 틀릴 수 있습니다.
| 무엇을 보는가 | 어떻게 |
|---|---|
| 보정 곡선 | 예측 확률 구간별 실제 비율 |
| 브라이어 점수 | 확률의 평균제곱오차 |
| 보정 절편과 기울기 | 로짓을 다시 회귀 |
셋째 줄이 진단입니다. 예측 로짓을 설명변수로 다시 로지스틱을 돌려, 기울기가 이고 절편이 이면 잘 보정된 것입니다.
기울기가 보다 작으면 과신입니다. 극단 확률을 너무 자주 내는 것이며, 189강의 과적합에서 흔히 나타납니다.
드문 사건에서 뽑은 자료로 학습하면 절편이 틀립니다. 심화 3의 식으로 되돌리거나, 실제 유병률에 맞춰 재보정합니다.
심화 5. 범주가 셋 이상일 때를 정리하세요.
| 방법 | 언제 |
|---|---|
| 다항 로지스틱 | 순서 없는 범주 |
| 순서형 로지스틱 | 순서 있는 범주 |
| 일대다 | 계산이 쉬워야 할 때 |
첫째 줄이 209강의 소프트맥스 회귀입니다. 기준 범주 하나를 두고 나머지마다 로짓을 세우며, 186강 문제 1의 더미와 같은 구조입니다.
둘째 줄은 계수 하나로 여러 문턱을 다룹니다. 각 범주 경계마다 절편이 다르고 기울기는 공유하며, 이것을 비례 오즈 가정이라 합니다.
그 가정이 깨지면 범주마다 기울기가 달라집니다. 186강 문제 3의 교호작용과 같은 상황이고, 검정으로 확인합니다.
심화 6. 이 강의가 어디에 쓰이는지 정리하세요.
| 분야 | 쓰임 | 이어지는 강의 |
|---|---|---|
| 인과추론 | 성향점수 추정 | 193강 |
| 손실함수 | 교차엔트로피 | 204강 |
| 학습 | 로지스틱의 최적화 | 208강 |
| 평가 | ROC와 AUC | 226강 |
둘째 줄과 셋째 줄이 이 강의의 진짜 목적지입니다. 로지스틱 회귀가 신경망의 마지막 층과 같은 식이며, 그 사이에 달라지는 것은 앞에 층이 몇 개 붙느냐뿐입니다.
첫째 줄이 03단원과 바로 이어집니다. 177강 문제 4의 성향 점수를 실제로 추정하는 도구가 로지스틱 회귀이며, 193강에서 그것으로 매칭을 합니다.
정답.
| 기호 | 읽는 법 | 뜻 |
|---|---|---|
| 오즈 | odds | 일어날 확률을 안 일어날 확률로 나눈 값입니다 |
| 로짓 | logit | 오즈의 로그입니다 |
| 시그모이드 | sigmoid | 로짓을 확률로 되돌리는 함수입니다 |
| 오즈비 | odds ratio | 계수의 지수입니다 |
| 한계효과 | marginal effect | 확률의 미분입니다 |
| 평균 한계효과 | average marginal effect | 사람마다 구해 평균 낸 값입니다 |
| 선형확률모형 | linear probability model | 과 을 최소제곱으로 회귀합니다 |
| 비붕괴성 | noncollapsibility | 변수를 빼면 계수가 눌립니다 |
| 맥패든 R^ | McFadden's R-squared | 로그우도의 비로 만든 값입니다 |
| 우도비 검정 | likelihood ratio test | 로그우도 차이의 두 배입니다 |
| 완전 분리 | complete separation | 완벽히 나누는 직선이 있는 상태입니다 |
| 반복 재가중 최소제곱 | IRLS | 가중최소제곱을 되풀이해 푸는 방법입니다 |
| 프로빗 | probit | 정규 분위수를 링크로 쓰는 모형입니다 |
| 사례-대조 | case-control | 결과를 보고 표본을 뽑는 설계입니다 |
여기서 02단원이 끝납니다. 184강부터 190강까지 관계를 선으로 적는 법을 다뤘습니다.
이 단원이 되풀이해 말한 것이 하나 있습니다. 계수의 뜻은 어느 변수를 함께 넣었느냐가 정하고, 무엇을 넣을지는 자료가 안 정합니다. 185강 문제 5의 넷째 줄에서 "넣을 변수를 못 재면 답할 수 없다"고 했는데, 191강부터는 못 잰 변수가 있어도 답할 수 있는 설계를 다룹니다. 통제 대신 무작위 배정과 자연 실험과 도구변수로 푸는 길이며, 177강이 던진 물음에 대한 답입니다.
import numpy as np
rng = np.random.default_rng(20260927)
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 erf(x):
a = abs(float(x))
if a > 6.0:
return 1.0 if x > 0 else -1.0
t, ssum, kk = 1.0, 1.0, 0
while True:
kk += 1
t *= 2.0 * a * a / (2.0 * kk + 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 p2(z):
return 1.0 - erf(abs(float(z)) / np.sqrt(2.0))
def sig(z):
return 1.0 / (1.0 + np.exp(-np.clip(z, -500, 500)))
def logit_fit(y, X, ridge=0.0, iters=60):
A = np.concatenate([np.ones((len(y), 1)), X], axis=1) if X.size else np.ones((len(y), 1))
p = A.shape[1]
b = np.zeros(p)
P = np.eye(p)
P[0, 0] = 0.0
for _ in range(iters):
eta = A @ b
mu = sig(eta)
w = np.clip(mu * (1 - mu), 1e-10, None)
z = eta + (y - mu) / w
H = (A * w[:, None]).T @ A + ridge * P
g = (A * w[:, None]).T @ z
nb = np.linalg.solve(H, g)
if np.max(np.abs(nb - b)) < 1e-11:
b = nb
break
b = nb
eta = A @ b
mu = sig(eta)
w = np.clip(mu * (1 - mu), 1e-10, None)
H = (A * w[:, None]).T @ A + ridge * P
se = np.sqrt(np.diag(np.linalg.pinv(H)))
ll = float((y * np.log(np.clip(mu, 1e-12, 1)) +
(1 - y) * np.log(np.clip(1 - mu, 1e-12, 1))).sum())
return dict(b=b, se=se, mu=mu, ll=ll, A=A, n=len(y), p=p)
def ols(y, X):
A = np.concatenate([np.ones((len(y), 1)), X], axis=1)
b, *_ = np.linalg.lstsq(A, y, rcond=None)
return dict(b=b, mu=A @ b)
# --- 문제 1: 결과가 0 과 1 이면 -----------------------------------------
print(" 181강에서 범주형 결과를 교차표로 다뤘습니다")
print(" 그런데 다른 변수를 통제할 자리가 없었습니다. 회귀로 넣어 봅니다")
N1 = 2000
x1 = rng.uniform(-3.0, 3.0, N1)
pr1 = sig(0.5 + 1.2 * x1)
y1 = (rng.random(N1) < pr1).astype(float)
lin = ols(y1, x1[:, None])
print(" 참 모형은 로그오즈 = 0.5 + 1.2 x 입니다")
print(" 먼저 0 과 1 을 그냥 최소제곱으로 회귀해 봅니다")
print(" %s %s %s %s" % (pw("x 값", 10), rw("직선의 예측", 14),
rw("0 과 1 사이인가", 18), rw("참 확률", 12)))
for xv in [-3.0, -1.5, 0.0, 1.5, 3.0]:
pv = lin["b"][0] + lin["b"][1] * xv
print(" %s %14.6f %s %12.6f"
% (pw("%.1f" % xv, 10), pv,
rw("예" if 0.0 <= pv <= 1.0 else "아니오", 18), float(sig(0.5 + 1.2 * xv))))
out = float(((lin["mu"] < 0.0) | (lin["mu"] > 1.0)).mean())
print(" %d 개 중 %.4f 가 0 과 1 밖으로 나갑니다" % (N1, out))
print(" 확률이 음수이거나 1 을 넘는 예측은 뜻이 없습니다")
print(" 확률을 로그오즈로 옮기면 직선이 됩니다")
print(" %s %s %s" % (pw("확률", 12), rw("오즈", 14), rw("로그오즈", 14)))
for pv in [0.01, 0.1, 0.5, 0.9, 0.99]:
print(" %s %14.6f %14.6f"
% (pw("%.2f" % pv, 12), pv / (1 - pv), np.log(pv / (1 - pv))))
print(" 로그오즈는 -무한대에서 +무한대까지 갑니다. 직선을 얹을 수 있습니다")
print(" 거꾸로 로짓을 확률로 되돌리는 함수가 시그모이드입니다")
f1 = logit_fit(y1, x1[:, None])
print(" %s %s %s %s %s" % (pw("계수", 14), rw("추정값", 14), rw("표준오차", 12),
rw("참값", 10), rw("z", 12)))
for i, nm, tv in [(0, "절편", 0.5), (1, "x 의 계수", 1.2)]:
print(" %s %14.6f %12.6f %10.1f %12.4f"
% (pw(nm, 14), f1["b"][i], f1["se"][i], tv, f1["b"][i] / f1["se"][i]))
print(" 최소제곱이 아니라 우도를 최대로 만드는 방법으로 풉니다")
print(" 로그우도는 %.6f 이고 반복 재가중 최소제곱으로 구했습니다" % f1["ll"])
# --- 문제 2: 계수를 어떻게 읽는가 ---------------------------------------
print(" 계수의 지수가 오즈비입니다")
print(" x 가 1 늘면 로그오즈가 계수만큼 늘고 오즈는 그 지수배가 됩니다")
b1 = f1["b"][1]
print(" %s %s %s %s" % (pw("x 가 얼마나 느는가", 20), rw("로그오즈 변화", 16),
rw("오즈비", 14), rw("참 오즈비", 14)))
for d in [0.5, 1.0, 2.0]:
print(" %s %16.6f %14.6f %14.6f"
% (pw("%.1f" % d, 20), b1 * d, np.exp(b1 * d), np.exp(1.2 * d)))
print(" 오즈비는 x 가 어디에 있든 같습니다. 그것이 로지스틱의 성질입니다")
print(" 그런데 확률의 변화는 x 마다 다릅니다")
print(" %s %s %s %s" % (pw("x 값", 10), rw("그 자리 확률", 14),
rw("x 가 1 늘면", 14), rw("확률 차이", 14)))
for xv in [-3.0, -1.5, 0.0, 1.5, 3.0]:
p0 = float(sig(f1["b"][0] + f1["b"][1] * xv))
pp = float(sig(f1["b"][0] + f1["b"][1] * (xv + 1)))
print(" %s %14.6f %14.6f %14.6f"
% (pw("%.1f" % xv, 10), p0, pp, pp - p0))
print(" 같은 오즈비인데 확률 차이는 0.0125 에서 0.2551 까지 스무 배 벌어집니다")
print(" 시작과 끝이 0.5 를 사이에 두고 있을 때 가장 큽니다")
print(" 181강 문제 3 에서 차이와 비가 다른 이야기를 한 것이 여기서 되풀이됩니다")
print(" 한계효과를 계산합니다")
print(" 로지스틱의 미분은 계수에 p(1-p) 를 곱한 값입니다")
print(" %s %s %s" % (pw("무엇", 26), rw("값", 14), rw("어떻게", 26)))
mm = f1["mu"]
ame = float((f1["b"][1] * mm * (1 - mm)).mean())
mem = float(f1["b"][1] * mm.mean() * (1 - mm.mean()))
print(" %s %14.6f %s" % (pw("평균 한계효과", 26), ame, rw("사람마다 구해 평균", 26)))
print(" %s %14.6f %s" % (pw("평균에서의 한계효과", 26), mem, rw("평균 확률로 한 번", 26)))
print(" %s %14.6f %s" % (pw("선형확률모형의 계수", 26), lin["b"][1],
rw("최소제곱 기울기", 26)))
print(" 평균 한계효과와 선형확률모형의 계수가 0.1590 과 0.1906 으로 가깝습니다")
print(" 그런데 평균에서의 한계효과는 0.2862 로 크게 다릅니다")
print(" x 가 넓게 퍼져 확률이 0 과 1 근처까지 가기 때문입니다")
print(" 평균 확률 한 점으로 전체를 대표할 수 없습니다. 사람마다 구해 평균 내야 합니다")
# --- 문제 3: 여러 변수를 넣으면 -----------------------------------------
print(" 181강의 교차표를 회귀로 다시 풉니다")
N3 = 4000
z3 = rng.integers(0, 2, N3).astype(float)
t3 = (rng.random(N3) < sig(-0.5 + 1.5 * z3)).astype(float)
y3 = (rng.random(N3) < sig(-1.0 + 0.8 * t3 + 1.5 * z3)).astype(float)
print(" z 가 처치 t 와 결과 y 에 모두 영향을 주는 교란입니다")
print(" 참 로그오즈는 -1.0 + 0.8 t + 1.5 z 입니다")
a = float(((t3 == 1) & (y3 == 1)).sum())
b = float(((t3 == 1) & (y3 == 0)).sum())
c = float(((t3 == 0) & (y3 == 1)).sum())
d = float(((t3 == 0) & (y3 == 0)).sum())
print(" %s %s %s" % (pw("", 12), rw("y=1", 10), rw("y=0", 10)))
print(" %s %10.0f %10.0f" % (pw("t=1", 12), a, b))
print(" %s %10.0f %10.0f" % (pw("t=0", 12), c, d))
print(" 교차표의 오즈비는 %.6f 이고 로그는 %.6f 입니다"
% ((a / b) / (c / d), np.log((a / b) / (c / d))))
m3a = logit_fit(y3, t3[:, None])
m3b = logit_fit(y3, np.stack([t3, z3], axis=1))
print(" %s %s %s %s" % (pw("모형", 22), rw("t 의 계수", 14), rw("오즈비", 14),
rw("참값", 12)))
print(" %s %14.6f %14.6f %12.1f"
% (pw("t 만 넣음", 22), m3a["b"][1], np.exp(m3a["b"][1]), 0.8))
print(" %s %14.6f %14.6f %12.1f"
% (pw("t 와 z 를 넣음", 22), m3b["b"][1], np.exp(m3b["b"][1]), 0.8))
print(" t 만 넣은 계수가 교차표의 로그 오즈비와 같습니다")
print(" z 를 넣으면 참값에 닿습니다. 이것이 181강이 못 하던 일입니다")
print(" 그런데 교란이 없어도 계수가 바뀝니다")
N4 = 200000
u4 = rng.normal(0, 1, N4)
t4 = rng.integers(0, 2, N4).astype(float)
y4 = (rng.random(N4) < sig(-0.5 + 1.0 * t4 + 2.0 * u4)).astype(float)
m4a = logit_fit(y4, t4[:, None])
m4b = logit_fit(y4, np.stack([t4, u4], axis=1))
print(" u 는 t 와 무관하고 y 에만 영향을 줍니다. 무작위 배정과 같습니다")
print(" %s %s %s" % (pw("모형", 22), rw("t 의 계수", 14), rw("참값", 12)))
print(" %s %14.6f %12.1f" % (pw("t 만 넣음", 22), m4a["b"][1], 1.0))
print(" %s %14.6f %12.1f" % (pw("t 와 u 를 넣음", 22), m4b["b"][1], 1.0))
print(" 교란이 없는데도 t 만 넣으면 계수가 작아집니다")
print(" 선형회귀에서는 이런 일이 없었습니다. 185강 문제 1 의 공식이 안 맞습니다")
print(" 비선형 모형에서 변수를 빼면 계수가 0 쪽으로 눌립니다. 이것을 비붕괴성이라 합니다")
print(" 그래서 오즈비는 어느 변수를 넣었느냐를 밝히지 않으면 견줄 수 없습니다")
print(" 선형확률모형은 붕괴합니다")
lp_a = ols(y4, t4[:, None])
lp_b = ols(y4, np.stack([t4, u4], axis=1))
print(" %s %s %s" % (pw("모형", 22), rw("t 의 계수", 14), rw("차이", 12)))
print(" %s %14.6f %12.6f" % (pw("t 만 넣음", 22), lp_a["b"][1], 0.0))
print(" %s %14.6f %12.6f"
% (pw("t 와 u 를 넣음", 22), lp_b["b"][1], lp_b["b"][1] - lp_a["b"][1]))
print(" 선형확률모형의 계수는 거의 안 바뀝니다. 확률 차이가 붕괴하기 때문입니다")
print(" 해석의 안정성이 목적이면 확률 차이가 오즈비보다 낫습니다")
# --- 문제 4: 얼마나 잘 맞히는가 -----------------------------------------
print(" 로지스틱에는 R^2 이 없습니다")
N5 = 3000
x5 = rng.normal(0, 1, (N5, 3))
y5 = (rng.random(N5) < sig(-0.3 + 1.0 * x5[:, 0] + 0.7 * x5[:, 1])).astype(float)
m0 = logit_fit(y5, np.zeros((N5, 0)))
m1 = logit_fit(y5, x5[:, :1])
m2 = logit_fit(y5, x5[:, :2])
m3 = logit_fit(y5, x5)
print(" 대신 로그우도로 견줍니다. 절편만인 모형이 기준입니다")
print(" %s %s %s %s %s" % (pw("모형", 20), rw("로그우도", 14),
rw("맥패든 R^2", 14), rw("우도비 통계량", 16),
rw("정확도", 12)))
for nm, m in [("절편만", m0), ("x1", m1), ("x1 x2", m2), ("x1 x2 x3", m3)]:
mf = 1.0 - m["ll"] / m0["ll"]
lr = 2.0 * (m["ll"] - m0["ll"])
acc = float(((m["mu"] > 0.5).astype(float) == y5).mean())
print(" %s %14.6f %14.6f %16.6f %12.6f"
% (pw(nm, 20), m["ll"], mf, lr, acc))
print(" 맥패든 R^2 은 선형회귀의 R^2 보다 훨씬 작게 나옵니다")
print(" 0.2 만 넘어도 좋은 적합으로 봅니다. 같은 잣대로 읽으면 안 됩니다")
print(" 우도비 통계량은 자유도가 변수 수인 카이제곱을 따릅니다")
print(" 정확도는 기준선을 함께 봐야 합니다")
print(" %s %s %s %s %s" % (pw("y=1 의 비율", 14), rw("다 0 이라 찍기", 16),
rw("모형의 정확도", 16), rw("차이", 12), rw("AUC", 12)))
for pbase in [0.5, 0.2, 0.05, 0.01]:
off = np.log(pbase / (1 - pbase))
xx = rng.normal(0, 1, 6000)
yy = (rng.random(6000) < sig(off + 1.0 * xx)).astype(float)
mm2 = logit_fit(yy, xx[:, None])
acc = float(((mm2["mu"] > 0.5).astype(float) == yy).mean())
base = float(max(yy.mean(), 1 - yy.mean()))
pos = mm2["mu"][yy == 1]
neg = mm2["mu"][yy == 0]
idx = np.argsort(np.concatenate([pos, neg]))
r = np.empty(len(idx), dtype=float)
r[idx] = np.arange(1, len(idx) + 1)
auc = (r[:len(pos)].sum() - len(pos) * (len(pos) + 1) / 2.0) / (len(pos) * len(neg))
print(" %s %16.6f %16.6f %12.6f %12.6f"
% (pw("%.2f" % pbase, 14), base, acc, acc - base, auc))
print(" 드문 사건에서는 다 0 이라 찍어도 0.99 가 나옵니다")
print(" 정확도가 오르는 것처럼 보이는데 기준선이 같이 올랐을 뿐입니다")
print(" AUC 는 기준선에 안 끌려다닙니다. 226강에서 자세히 다룹니다")
# --- 문제 5: 로지스틱이 깨지는 자리 -------------------------------------
print(" 완전 분리가 일어나면 추정이 발산합니다")
xs = np.array([-3.0, -2.0, -1.0, 1.0, 2.0, 3.0])
ys = np.array([0.0, 0.0, 0.0, 1.0, 1.0, 1.0])
print(" x 가 음수면 전부 0 이고 양수면 전부 1 인 자료입니다")
print(" %s %s %s %s" % (pw("반복 횟수", 12), rw("x 의 계수", 16),
rw("표준오차", 16), rw("로그우도", 16)))
for it in [5, 10, 20, 40]:
mm3 = logit_fit(ys, xs[:, None], iters=it)
print(" %s %16.6f %16.6f %16.6f"
% (pw("%d" % it, 12), mm3["b"][1], mm3["se"][1], mm3["ll"]))
print(" 계수가 끝없이 커집니다. 로그우도가 0 에 붙어 최대가 없기 때문입니다")
print(" 완벽하게 나누는 직선이 있으면 더 가파를수록 우도가 커집니다")
print(" 벌점을 조금 주면 값이 정해집니다")
print(" %s %s %s %s" % (pw("벌점 람다", 12), rw("x 의 계수", 16),
rw("표준오차", 16), rw("로그우도", 16)))
for lam in [0.0, 0.1, 1.0, 10.0]:
mm4 = logit_fit(ys, xs[:, None], ridge=lam, iters=60)
print(" %s %16.6f %16.6f %16.6f"
% (pw("%.1f" % lam, 12), mm4["b"][1], mm4["se"][1], mm4["ll"]))
print(" 람다가 0 보다 크면 유한한 값에서 멈춥니다. 187강의 능형과 같은 장치입니다")
print(" 완전 분리는 자료가 작고 변수가 많을 때 자주 생깁니다")
print(" 드문 사건에서는 계수가 치우칩니다")
print(" 참 계수 1.0 을 여러 사건 비율에서 추정해 평균을 봅니다")
print(" %s %s %s %s %s" % (pw("y=1 의 비율", 14), rw("표본 크기", 12),
rw("기대 사건 수", 14), rw("계수의 평균", 14),
rw("참값 대비", 12)))
for pbase, n in [(0.5, 200), (0.1, 200), (0.03, 200), (0.03, 2000)]:
off = np.log(pbase / (1 - pbase))
acc2 = []
for _ in range(600):
xx = rng.normal(0, 1, n)
yy = (rng.random(n) < sig(off + 1.0 * xx)).astype(float)
if yy.sum() < 2 or yy.sum() > n - 2:
continue
mm5 = logit_fit(yy, xx[:, None], ridge=1e-6)
if abs(mm5["b"][1]) < 20:
acc2.append(mm5["b"][1])
print(" %s %12d %14.1f %14.6f %12.4f"
% (pw("%.2f" % pbase, 14), n, n * pbase, float(np.mean(acc2)),
float(np.mean(acc2)) / 1.0))
print(" 사건이 드물고 표본이 작으면 계수가 위로 부풉니다")
print(" 기대 사건 수가 6 인 셋째 줄이 4.3 퍼센트로 가장 심합니다")
print(" 표본을 열 배로 늘리면 0.7 퍼센트로 줄어듭니다. 표본이 아니라 사건 수가 정합니다")
print(" 위 표는 계수가 20 을 넘는 분리 사례를 뺀 값이라 실제 치우침은 더 큽니다")
print(" 로지스틱을 쓸 때의 판단을 정리합니다")
print(" %s %s" % (pw("상황", 26), rw("무엇을 하는가", 28)))
for a2, b2 in [("확률 차이가 관심", "선형확률모형이나 한계효과"),
("오즈비를 보고", "넣은 변수 목록을 함께"),
("완전 분리", "벌점을 주거나 변수를 줄임"),
("사건이 드묾", "사건 수를 세고 벌점을 씀"),
("여러 모형 비교", "로그우도와 우도비"),
("정확도 보고", "기준선과 AUC 를 함께")]:
print(" %s %s" % (pw(a2, 26), rw(b2, 28)))
print(" 둘째 줄이 이 강의의 결론입니다. 오즈비는 모형에 따라 달라지는 값입니다")
print(" 02단원이 여기서 끝납니다. 다음은 03단원 인과추론입니다")
# 181강에서 범주형 결과를 교차표로 다뤘습니다
# 그런데 다른 변수를 통제할 자리가 없었습니다. 회귀로 넣어 봅니다
# 참 모형은 로그오즈 = 0.5 + 1.2 x 입니다
# 먼저 0 과 1 을 그냥 최소제곱으로 회귀해 봅니다
# x 값 직선의 예측 0 과 1 사이인가 참 확률
# -3.0 -0.008569 아니오 0.043107
# -1.5 0.277292 예 0.214165
# 0.0 0.563154 예 0.622459
# 1.5 0.849015 예 0.908877
# 3.0 1.134877 아니오 0.983698
# 2000 개 중 0.1230 가 0 과 1 밖으로 나갑니다
# 확률이 음수이거나 1 을 넘는 예측은 뜻이 없습니다
# 확률을 로그오즈로 옮기면 직선이 됩니다
# 확률 오즈 로그오즈
# 0.01 0.010101 -4.595120
# 0.10 0.111111 -2.197225
# 0.50 1.000000 0.000000
# 0.90 9.000000 2.197225
# 0.99 99.000000 4.595120
# 로그오즈는 -무한대에서 +무한대까지 갑니다. 직선을 얹을 수 있습니다
# 거꾸로 로짓을 확률로 되돌리는 함수가 시그모이드입니다
# 계수 추정값 표준오차 참값 z
# 절편 0.478477 0.062580 0.5 7.6459
# x 의 계수 1.168588 0.049492 1.2 23.6116
# 최소제곱이 아니라 우도를 최대로 만드는 방법으로 풉니다
# 로그우도는 -851.079524 이고 반복 재가중 최소제곱으로 구했습니다
# 계수의 지수가 오즈비입니다
# x 가 1 늘면 로그오즈가 계수만큼 늘고 오즈는 그 지수배가 됩니다
# x 가 얼마나 느는가 로그오즈 변화 오즈비 참 오즈비
# 0.5 0.584294 1.793724 1.822119
# 1.0 1.168588 3.217446 3.320117
# 2.0 2.337176 10.351958 11.023176
# 오즈비는 x 가 어디에 있든 같습니다. 그것이 로지스틱의 성질입니다
# 그런데 확률의 변화는 x 마다 다릅니다
# x 값 그 자리 확률 x 가 1 늘면 확률 차이
# -3.0 0.046208 0.134855 0.088647
# -1.5 0.218504 0.473570 0.255066
# 0.0 0.617388 0.838494 0.221106
# 1.5 0.903030 0.967703 0.064672
# 3.0 0.981733 0.994250 0.012517
# 같은 오즈비인데 확률 차이는 0.0125 에서 0.2551 까지 스무 배 벌어집니다
# 시작과 끝이 0.5 를 사이에 두고 있을 때 가장 큽니다
# 181강 문제 3 에서 차이와 비가 다른 이야기를 한 것이 여기서 되풀이됩니다
# 한계효과를 계산합니다
# 로지스틱의 미분은 계수에 p(1-p) 를 곱한 값입니다
# 무엇 값 어떻게
# 평균 한계효과 0.158961 사람마다 구해 평균
# 평균에서의 한계효과 0.286173 평균 확률로 한 번
# 선형확률모형의 계수 0.190574 최소제곱 기울기
# 평균 한계효과와 선형확률모형의 계수가 0.1590 과 0.1906 으로 가깝습니다
# 그런데 평균에서의 한계효과는 0.2862 로 크게 다릅니다
# x 가 넓게 퍼져 확률이 0 과 1 근처까지 가기 때문입니다
# 평균 확률 한 점으로 전체를 대표할 수 없습니다. 사람마다 구해 평균 내야 합니다
# 181강의 교차표를 회귀로 다시 풉니다
# z 가 처치 t 와 결과 y 에 모두 영향을 주는 교란입니다
# 참 로그오즈는 -1.0 + 0.8 t + 1.5 z 입니다
# y=1 y=0
# t=1 1532 723
# t=0 698 1047
# 교차표의 오즈비는 3.178423 이고 로그는 1.156385 입니다
# 모형 t 의 계수 오즈비 참값
# t 만 넣음 1.156385 3.178423 0.8
# t 와 z 를 넣음 0.776036 2.172841 0.8
# t 만 넣은 계수가 교차표의 로그 오즈비와 같습니다
# z 를 넣으면 참값에 닿습니다. 이것이 181강이 못 하던 일입니다
# 그런데 교란이 없어도 계수가 바뀝니다
# u 는 t 와 무관하고 y 에만 영향을 줍니다. 무작위 배정과 같습니다
# 모형 t 의 계수 참값
# t 만 넣음 0.599970 1.0
# t 와 u 를 넣음 0.988700 1.0
# 교란이 없는데도 t 만 넣으면 계수가 작아집니다
# 선형회귀에서는 이런 일이 없었습니다. 185강 문제 1 의 공식이 안 맞습니다
# 비선형 모형에서 변수를 빼면 계수가 0 쪽으로 눌립니다. 이것을 비붕괴성이라 합니다
# 그래서 오즈비는 어느 변수를 넣었느냐를 밝히지 않으면 견줄 수 없습니다
# 선형확률모형은 붕괴합니다
# 모형 t 의 계수 차이
# t 만 넣음 0.148876 0.000000
# t 와 u 를 넣음 0.149626 0.000751
# 선형확률모형의 계수는 거의 안 바뀝니다. 확률 차이가 붕괴하기 때문입니다
# 해석의 안정성이 목적이면 확률 차이가 오즈비보다 낫습니다
# 로지스틱에는 R^2 이 없습니다
# 대신 로그우도로 견줍니다. 절편만인 모형이 기준입니다
# 모형 로그우도 맥패든 R^2 우도비 통계량 정확도
# 절편만 -2057.547562 0.000000 0.000000 0.560333
# x1 -1827.431078 0.111840 460.232968 0.666333
# x1 x2 -1697.429090 0.175023 720.236944 0.709667
# x1 x2 x3 -1697.231915 0.175119 720.631294 0.710667
# 맥패든 R^2 은 선형회귀의 R^2 보다 훨씬 작게 나옵니다
# 0.2 만 넘어도 좋은 적합으로 봅니다. 같은 잣대로 읽으면 안 됩니다
# 우도비 통계량은 자유도가 변수 수인 카이제곱을 따릅니다
# 정확도는 기준선을 함께 봐야 합니다
# y=1 의 비율 다 0 이라 찍기 모형의 정확도 차이 AUC
# 0.50 0.513167 0.674833 0.161667 0.737003
# 0.20 0.746000 0.763167 0.017167 0.740975
# 0.05 0.929833 0.930000 0.000167 0.744446
# 0.01 0.983500 0.983500 0.000000 0.771612
# 드문 사건에서는 다 0 이라 찍어도 0.99 가 나옵니다
# 정확도가 오르는 것처럼 보이는데 기준선이 같이 올랐을 뿐입니다
# AUC 는 기준선에 안 끌려다닙니다. 226강에서 자세히 다룹니다
# 완전 분리가 일어나면 추정이 발산합니다
# x 가 음수면 전부 0 이고 양수면 전부 1 인 자료입니다
# 반복 횟수 x 의 계수 표준오차 로그우도
# 5 3.992033 5.100716 -0.037282
# 10 8.960612 62.402193 -0.000257
# 20 18.841676 7973.796464 -0.000000
# 40 23.300673 18898.223650 -0.000000
# 계수가 끝없이 커집니다. 로그우도가 0 에 붙어 최대가 없기 때문입니다
# 완벽하게 나누는 직선이 있으면 더 가파를수록 우도가 커집니다
# 벌점을 조금 주면 값이 정해집니다
# 벌점 람다 x 의 계수 표준오차 로그우도
# 0.0 24.045353 18898.223650 -0.000000
# 0.1 2.294755 1.656625 -0.214309
# 1.0 1.104404 0.608893 -0.852395
# 10.0 0.363358 0.252935 -2.424210
# 람다가 0 보다 크면 유한한 값에서 멈춥니다. 187강의 능형과 같은 장치입니다
# 완전 분리는 자료가 작고 변수가 많을 때 자주 생깁니다
# 드문 사건에서는 계수가 치우칩니다
# 참 계수 1.0 을 여러 사건 비율에서 추정해 평균을 봅니다
# y=1 의 비율 표본 크기 기대 사건 수 계수의 평균 참값 대비
# 0.50 200 100.0 1.002694 1.0027
# 0.10 200 20.0 1.017824 1.0178
# 0.03 200 6.0 1.043196 1.0432
# 0.03 2000 60.0 1.007240 1.0072
# 사건이 드물고 표본이 작으면 계수가 위로 부풉니다
# 기대 사건 수가 6 인 셋째 줄이 4.3 퍼센트로 가장 심합니다
# 표본을 열 배로 늘리면 0.7 퍼센트로 줄어듭니다. 표본이 아니라 사건 수가 정합니다
# 위 표는 계수가 20 을 넘는 분리 사례를 뺀 값이라 실제 치우침은 더 큽니다
# 로지스틱을 쓸 때의 판단을 정리합니다
# 상황 무엇을 하는가
# 확률 차이가 관심 선형확률모형이나 한계효과
# 오즈비를 보고 넣은 변수 목록을 함께
# 완전 분리 벌점을 주거나 변수를 줄임
# 사건이 드묾 사건 수를 세고 벌점을 씀
# 여러 모형 비교 로그우도와 우도비
# 정확도 보고 기준선과 AUC 를 함께
# 둘째 줄이 이 강의의 결론입니다. 오즈비는 모형에 따라 달라지는 값입니다
# 02단원이 여기서 끝납니다. 다음은 03단원 인과추론입니다