186강에서 변수를 계속 늘렸습니다. 범주 개에 곱 항까지 개를 만들었는데, 그 변수들이 서로 닮았습니다.
185강 심화 2에서 완전히 종속이면 역행렬이 없다고 했습니다. 거의 종속이면 더 나쁩니다. 역행렬은 존재하는데 원소가 폭발합니다.
| 무엇이 망가지는가 | 무엇이 안 망가지는가 |
|---|---|
| 개별 계수 | 계수의 합 |
| 계수의 표준오차 | 과 예측 |
| 개별 검정 | 전체 검정 |
오른쪽 열이 이 강의의 핵심입니다. 공선성은 해석의 문제이지 예측의 문제가 아닙니다.
그리고 자주 오해되는 지점이 있습니다. VIF가 크다는 것과 그 계수를 못 쓴다는 것이 다르며, 표본을 늘리면 VIF는 그대로인데 구간은 좁아집니다.
문제. 상관을 올려 가며 봅니다.
(1) 계수와 표준오차를 재세요.
(2) 표준오차가 커지는 양을 식으로 쓰세요.
생각의 실마리. 185강 문제 2의 프리슈-워-로벨로 보면, 의 계수는 를 걷어 낸 잔차로 계산합니다. 둘이 닮으면 그 잔차가 거의 안 남습니다.
풀이. (1) 참 계수는 둘 다 이고 오차 sd는 입니다.
| 두 변수의 상관 | 첫째 계수 | 표준오차 | 둘째 계수 | 표준오차 | R^ |
|---|---|---|---|---|---|
마지막 줄에서 첫째 계수가 입니다. 참값이 인데 부호가 뒤집혔습니다.
표준오차가 에서 로 배가 됐습니다. 그래서 이 놀랄 값이 아닙니다.
은 오히려 에서 으로 오릅니다. 예측은 멀쩡한데 계수만 못 믿게 됩니다.
(2) 표준오차의 식을 봅니다.
이 그 변수를 나머지 변수들로 회귀했을 때의 결정계수입니다. 뒤쪽 인자의 제곱을 분산팽창인자라 하고 VIF라 적습니다.
| 다른 변수로 설명되는 정도 | R_{j}^ | VIF | 표준오차 배수 |
|---|---|---|---|
이 면 표준오차가 배가 됩니다. 흔히 VIF 을 경계로 쓰는데, 그 경계는 관례일 뿐이며 무엇이 문제인지는 목적이 정합니다.
이 문제에서 배우는 것. 공선성은 자료의 성질이지 잘못이 아닙니다. 키와 몸무게, 광고비와 노출 수, 소득과 학력처럼 함께 움직이는 것이 자연스러운 쌍이 세상에 많습니다. 그것을 갈라 보고 싶다는 것이 분석자의 바람일 뿐이고, 자료가 그 둘을 갈라 본 적이 없으면 갈라 말할 근거도 없습니다. 184강 문제 2에서 를 넓게 퍼뜨리라고 했는데, 여기서는 두 변수를 서로 다르게 움직이도록 설계해야 하며, 그것이 가능한 것은 실험뿐입니다.
바로 확인 1.
확인 1-1. 검산에서 상관이 일 때 두 계수와 표준오차를 쓰세요.
답. 과 이며 표준오차는 정도입니다.
확인 1-2. VIF를 식으로 쓰세요.
답. 그 변수를 나머지로 회귀한 에 대해 입니다.
확인 1-3. 검산에서 이 일 때 표준오차 배수를 쓰세요.
답. 배입니다.
문제. 공선성의 영향 범위를 가릅니다.
(1) 여러 양을 재고 망가진 것을 표시하세요.
(2) 개별 검정과 결합 검정을 견주세요.
(3) 표본을 다시 뽑아 흔들림을 보세요.
생각의 실마리. 계수가 못 믿을 값이 되는데 예측은 왜 멀쩡한지가 이 문제의 물음입니다. 답은 두 계수가 서로를 대신하기 때문입니다.
풀이. (1) 상관 인 두 변수로 회귀합니다.
| 무엇 | 값 | 망가졌는가 |
|---|---|---|
| 첫째 계수 | 예 | |
| 첫째 계수의 | 예 | |
| 둘째 계수 | 예 | |
| 두 계수의 합 | 아니오 | |
| R^ | 아니오 | |
| 오차 sd 추정 | 아니오 | |
| 전체 | 아니오 |
참 계수의 합은 이고 참 오차 sd는 입니다. 개별 계수는 와 로 크게 어긋났는데 합은 로 정확합니다.
두 변수가 거의 같으므로 자료가 아는 것은 "둘을 합쳐 얼마"뿐입니다. 어떻게 나눌지는 자료에 정보가 없습니다.
(2) 개별 검정과 결합 검정을 견줍니다.
| 무엇을 검정 | 통계량 | 값 |
|---|---|---|
| 첫째 계수 하나 | ||
| 둘째 계수 하나 | ||
| 둘을 한꺼번에 |
각각은 유의하지 않은데 함께 보면 아주 유의합니다.
"둘 중 하나만 빼도 되는가"에 각각 예라고 답하는데 "둘 다 빼도 되는가"에는 아니오라고 답합니다. 모순이 아니며, 185강 심화 5의 타원이 여기서 나타납니다.
(3) 같은 모집단에서 표본만 다시 뽑아 봅니다.
| 표본 | 첫째 계수 | 둘째 계수 | 두 계수의 합 | R^ |
|---|---|---|---|---|
개별 계수가 에서 까지 오가는데 합은 에서 사이입니다.
부호가 뒤집히는 표본이 둘 있습니다. 그것을 보고 "첫째 변수는 음의 효과"라고 해석하면 완전히 틀립니다.
이 문제에서 배우는 것. 공선성이 있는 모형에서 계수 부호가 예상과 반대로 나오는 것이 흔한데, 그것이 발견이 아닙니다. 실무에서 이 자리에서 "흥미로운 결과"라며 해석을 붙이는 일이 자주 일어나며, 다음 분기 자료에서 부호가 다시 뒤집혀 혼란이 생깁니다. VIF를 먼저 확인하는 습관이 이것을 막고, VIF가 크면 개별 계수 대신 합이나 예측을 보고해야 합니다.
바로 확인 2.
확인 2-1. 검산에서 개별 계수와 두 계수의 합을 참값과 견주세요.
답. 와 은 어긋났는데 합 는 참값 에 가깝습니다.
확인 2-2. 검산에서 개별 와 전체 의 값을 쓰세요.
답. 과 인데 는 입니다.
확인 2-3. 표본을 다시 뽑았을 때 무엇이 안정적인지 쓰세요.
답. 개별 계수는 크게 흔들리고 두 계수의 합은 근처를 유지합니다.
문제. 진단 지표를 계산합니다.
(1) VIF를 직접 구하세요.
(2) 조건수를 구하세요.
(3) 중심화의 효과를 확인하세요.
생각의 실마리. VIF는 변수마다 나오고 조건수는 설계행렬 전체에 하나 나옵니다. 둘이 서로 다른 것을 봅니다.
풀이. (1) 과 는 같은 잠재요인에서 오고 는 따로입니다.
| 변수 | 다른 것으로의 R^ | VIF | 계수 | 표준오차 |
|---|---|---|---|---|
| x_ | ||||
| x_ | ||||
| x_ |
의 표준오차는 로 나머지의 절반이 안 됩니다. 공선성의 영향을 안 받습니다.
얽힌 변수만 영향을 받습니다. 모형에 VIF가 큰 변수가 있어도, 관심 변수가 그 얽힘 밖이면 그 계수는 멀쩡합니다.
(2) 조건수를 봅니다. 설계행렬을 표준화한 뒤 특이값의 비를 봅니다.
| 두 변수의 상관 | 가장 큰 특이값 | 가장 작은 특이값 | 조건수 |
|---|---|---|---|
상관이 커질수록 작은 특이값이 에서 으로 갑니다.
그 방향의 정보가 없다는 뜻입니다. 84강부터 89강의 특이값 분해로 보면, 자료가 한 방향으로만 퍼져 있고 그 수직 방향은 거의 안 움직입니다.
조건수 을 넘으면 의심하고 을 넘으면 심각하다고 봅니다.
(3) 중심화의 효과를 봅니다. 와 을 함께 넣는 186강 심화 2의 상황입니다.
| 무엇을 넣는가 | 두 열의 상관 | VIF | 이차항 표준오차 |
|---|---|---|---|
| 원래 와 x^ | |||
| 중심화한 와 그 제곱 |
상관이 에서 으로 떨어지고 VIF가 에서 이 됩니다.
그런데 이차항의 표준오차가 로 똑같습니다. 계수도 로 같습니다.
중심화는 이차항에 대해서는 아무것도 안 바꿉니다. 가 에서 사이라 와 이 함께 커지는 것이 좌표의 문제였을 뿐이고, 원점을 옮기면 사라집니다.
주효과의 해석은 크게 나아집니다. 186강 문제 4에서 본 대로, 중심화하면 일차항이 평균 자리에서의 기울기가 되어 뜻을 갖습니다.
이 문제에서 배우는 것. VIF가 크다고 다 같은 문제가 아닙니다. (3)의 는 좌표를 옮기면 사라지는 가짜 공선성이고, (1)의 은 두 변수가 실제로 같은 것을 재고 있어 없앨 수 없는 공선성입니다. 다항식 항, 곱 항, 더미의 기준 선택에서 생기는 것은 대부분 앞쪽이며 중심화나 코딩 변경으로 풀립니다. 뒤쪽은 자료를 더 모으거나 설계를 바꾸는 것 말고는 방법이 없습니다.
바로 확인 3.
확인 3-1. 검산에서 얽히지 않은 의 VIF와 표준오차를 쓰세요.
답. 과 이며 얽힌 변수의 절반이 안 됩니다.
확인 3-2. 조건수를 어떻게 구하는지 쓰세요.
답. 표준화한 설계행렬의 가장 큰 특이값을 가장 작은 것으로 나눕니다.
확인 3-3. 검산에서 중심화 전후의 VIF와 이차항 표준오차를 쓰세요.
답. VIF는 에서 이 되는데 표준오차는 로 같습니다.
문제. 대책을 견줍니다.
(1) 네 가지를 적용해 계수를 보세요.
(2) 능형의 맞바꿈을 반복 모의로 재세요.
(3) 예측 성능을 견주세요.
생각의 실마리. 대책마다 다른 것을 포기합니다. 무엇을 포기해도 되는지는 목적이 정합니다.
풀이. (1) 상관 이고 참 계수는 둘 다 입니다.
| 무엇을 하는가 | 첫째 계수 | 둘째 계수 | 계수의 합 | 잔차 제곱합 |
|---|---|---|---|---|
| 둘 다 넣음 | ||||
| 하나를 뺌 | 없음 | |||
| 둘을 더해 하나로 | 없음 | |||
| 능형 (람다 ) |
하나를 빼면 남은 계수가 가 됩니다. 두 효과를 합쳐 담은 값이며, 참 개별 효과 이 아닙니다.
둘을 더해 하나로 만들면 계수가 이고 합이 입니다. 의 계수가 각각의 계수와 같은 자리에 놓이므로, 합의 효과를 정확히 잽니다.
능형은 둘을 와 로 비슷하게 나눠 갖습니다. 대신 합이 로 조금 줄어듭니다.
(2) 능형이 무엇을 사고 무엇을 파는지 반복 모의로 봅니다. 상관 인 표본을 번 뽑았습니다.
| 람다 | 첫째 계수 평균 | 첫째 계수 표준편차 | 합의 평균 | 계수의 평균제곱오차 |
|---|---|---|---|---|
람다가 커지면 표준편차가 에서 로 줄고 평균이 에서 로 멀어집니다.
평균제곱오차가 람다 에서 로 가장 작습니다. 치우침과 흔들림의 맞바꿈이며, 210강의 편향과 분산 분해가 여기서 미리 나타납니다.
최소제곱이 불편이지만 최선이 아닐 수 있다는 것이 여기서 처음 드러납니다. 184강 심화 4의 가우스-마르코프는 불편추정량 중에서만 최선이라고 했습니다.
(3) 예측 성능을 견줍니다. 새 자료 개에서 잽니다.
| 무엇을 하는가 | 새 자료 평균제곱오차 |
|---|---|
| 둘 다 넣음 | |
| 하나를 뺌 | |
| 둘을 더해 하나로 | |
| 능형으로 줄임 |
네 방법이 에서 사이로 비슷하고 참 오차분산 근처입니다.
공선성은 해석의 문제이지 예측의 문제가 아닙니다. 예측이 목적이면 아무 대책도 필요 없습니다.
이 문제에서 배우는 것. "공선성이 있으니 변수를 빼자"가 가장 흔하면서 가장 위험한 대책입니다. 뺀 변수의 효과가 남은 변수에 통째로 얹히므로, 남은 계수를 개별 효과로 읽으면 두 배로 틀립니다. 185강 문제 1의 누락변수 편향이 정확히 이 일이며, 공선성을 없애려고 일부러 편향을 만드는 셈입니다. 굳이 하나를 뺀다면 남은 계수를 "둘의 합"으로 읽어야 하고, 그럴 바에는 처음부터 합을 넣는 것이 정직합니다.
바로 확인 4.
확인 4-1. 검산에서 하나를 뺐을 때의 계수와 참 개별 효과를 견주세요.
답. 인데 참 개별 효과는 이며 둘의 합을 담고 있습니다.
확인 4-2. 검산에서 평균제곱오차가 가장 작은 람다를 쓰세요.
답. 람다 에서 입니다.
확인 4-3. 검산에서 네 방법의 새 자료 예측 오차를 쓰세요.
답. , , , 으로 비슷합니다.
문제. 오해를 가려냅니다.
(1) 공선성이 아닌 원인을 정리하세요.
(2) 표본을 늘리면 무엇이 변하는지 재세요.
(3) 목적별 판단을 세우세요.
생각의 실마리. 계수가 이상하면 공선성을 먼저 의심하는 습관이 있는데, 다른 원인이 더 흔합니다.
풀이. (1) 증상별로 봅니다.
| 증상 | 진짜 원인일 수 있는 것 |
|---|---|
| 계수가 예상과 반대 | 교란 또는 충돌부 |
| 표준오차가 큼 | 표본이 작거나 오차가 큼 |
| 변수를 빼면 계수가 바뀜 | 당연합니다. 다른 물음입니다 |
| 는 안 유의한데 는 유의 | 공선성일 가능성이 큽니다 |
넷째 줄만 공선성의 특징적인 신호입니다. 나머지 셋은 다른 이유로도 얼마든지 생깁니다.
셋째 줄이 특히 자주 오해됩니다. 185강 문제 2에서 본 대로, 변수를 빼면 계수가 바뀌는 것이 정상입니다. 두 계수가 다른 물음에 대한 답이기 때문입니다.
(2) 상관 를 고정하고 표본만 늘려 봅니다. 이론상 VIF는 입니다.
| 표본 크기 | 표본에서 잰 VIF | 첫째 계수의 표준오차 | 구간의 폭 |
|---|---|---|---|
VIF는 이론값 근처를 맴돌 뿐 표본이 늘어도 안 줄어듭니다.
그런데 표준오차는 에서 으로 계속 줄어듭니다. 구간의 폭이 에서 가 되어, 표본 이면 계수를 충분히 정확하게 잽니다.
VIF가 크다는 것과 못 쓴다는 것이 다릅니다. VIF 이어도 표본이 크면 쓸 수 있고, VIF 이어도 표본이 작으면 못 씁니다. 실제 구간의 폭을 봐야 합니다.
(3) 목적별 판단을 세웁니다.
| 무엇이 목적인가 | 공선성을 어떻게 다루는가 |
|---|---|
| 예측 | 그냥 둡니다 |
| 한 변수의 효과 | 그 변수만 남기고 나머지는 통제 |
| 변수들의 합의 효과 | 합쳐서 하나로 넣습니다 |
| 어느 변수가 중요한가 | 답할 수 없습니다 |
| 계수가 안정적이길 | 능형이나 표본 확대 |
넷째 줄이 이 강의의 결론입니다. 얽힌 변수들 사이에서 중요도는 정의되지 않습니다. 자료가 두 변수를 갈라 본 적이 없으므로 갈라 말할 근거도 없습니다.
이 문제에서 배우는 것. VIF 기준을 기계적으로 적용하는 관행이 두 방향으로 틀립니다. VIF 을 넘는다고 변수를 자동으로 지우면 문제 4의 누락변수 편향을 스스로 만들고, VIF 아래면 안심하는 것도 표본이 작으면 근거가 없습니다. 봐야 할 것은 지표가 아니라 관심 계수의 신뢰구간이 결론을 낼 만큼 좁은가입니다. 그것이 183강 심화 4의 최소 검출 가능 효과와 같은 물음이며, 설계 단계에서 계산할 수 있습니다.
바로 확인 5.
확인 5-1. 공선성의 특징적인 신호를 쓰세요.
답. 개별 는 유의하지 않은데 전체 가 유의한 경우입니다.
확인 5-2. 검산에서 표본이 에서 이 될 때 VIF와 구간 폭을 쓰세요.
답. VIF는 근처 그대로이고 구간 폭은 에서 이 됩니다.
확인 5-3. 얽힌 변수들 사이의 중요도에 대해 쓰세요.
답. 자료가 둘을 갈라 본 적이 없으므로 정의되지 않습니다.
| 무엇 | 어떻게 |
|---|---|
| VIF | |
| 표준오차 배수 | |
| 조건수 | 표준화 행렬 특이값의 비 |
| 능형 | 대각에 람다를 더해 뒤집습니다 |
| 무엇이 망가지는가 | 무엇이 안 망가지는가 |
|---|---|
| 개별 계수 | 계수의 합 |
| 개별 표준오차 | 오차 sd 추정 |
| 개별 | 전체 |
| 계수의 부호 | 과 예측 |
| 자주 하는 실수 | 바로잡기 |
|---|---|
| VIF가 크니 변수를 지웁니다 | 누락변수 편향을 만듭니다 |
| 부호가 반대로 나온 것을 해석합니다 | 표본마다 뒤집힙니다 |
| VIF 아래면 안심합니다 | 표본이 작으면 여전히 못 씁니다 |
| 공선성 때문에 예측이 나쁘다고 봅니다 | 예측은 멀쩡합니다 |
| 다항식 VIF를 진짜 공선성으로 봅니다 | 중심화하면 사라집니다 |
| 얽힌 변수의 중요도를 견줍니다 | 정의되지 않습니다 |
문제 6. VIF를 식으로 쓰세요.
답. 그 변수를 나머지로 회귀한 에 대해 입니다.
문제 7. 검산에서 상관이 일 때 두 계수를 쓰세요.
답. 과 이며 참값은 둘 다 입니다.
문제 8. 검산에서 이 일 때 표준오차 배수를 쓰세요.
답. 배입니다.
문제 9. 검산에서 개별 계수와 두 계수의 합을 참값과 견주세요.
답. 와 은 어긋났는데 합 는 참값에 가깝습니다.
문제 10. 검산에서 개별 와 전체 의 값을 쓰세요.
답. 과 인데 는 입니다.
문제 11. 검산에서 얽히지 않은 의 VIF와 표준오차를 쓰세요.
답. 과 입니다.
문제 12. 조건수를 어떻게 구하는지 쓰세요.
답. 표준화한 설계행렬의 가장 큰 특이값을 가장 작은 것으로 나눕니다.
문제 13. 검산에서 중심화 전후의 VIF와 이차항 표준오차를 쓰세요.
답. VIF는 에서 이 되는데 표준오차는 로 같습니다.
문제 14. 검산에서 하나를 뺐을 때의 계수와 참 개별 효과를 견주세요.
답. 인데 참 개별 효과는 입니다.
문제 15. 검산에서 평균제곱오차가 가장 작은 람다를 쓰세요.
답. 람다 에서 입니다.
문제 16. 검산에서 네 방법의 새 자료 예측 오차를 쓰세요.
답. , , , 입니다.
문제 17. 공선성의 특징적인 신호를 쓰세요.
답. 개별 는 유의하지 않은데 전체 가 유의한 경우입니다.
문제 18. 검산에서 표본이 에서 이 될 때 VIF와 구간 폭을 쓰세요.
답. VIF는 근처 그대로이고 구간 폭은 에서 이 됩니다.
심화 1. 능형회귀를 유도하세요.
대각선에 람다를 더하는 것이 전부입니다. 의 고유값이 전부 람다만큼 커지므로, 에 가깝던 고유값이 살아납니다.
| 무엇 | 어떻게 바뀌는가 |
|---|---|
| 고유값 \mu_ | |
| 그 방향의 계수 | 배로 |
| 큰 고유값 방향 | 거의 안 줄어듭니다 |
| 작은 고유값 방향 | 크게 줄어듭니다 |
정보가 많은 방향은 그대로 두고 정보가 없는 방향만 눌러 줍니다. 문제 3의 조건수가 작은 특이값을 보여 줬는데, 능형이 정확히 그 방향을 다룹니다.
최소화하는 것은 잔차 제곱합에 벌점을 더한 것입니다.
211강에서 이 식을 정규화로 다시 다룹니다.
심화 2. 라쏘와의 차이를 정리하세요.
벌점을 제곱 대신 절댓값으로 두면 다른 성질이 나옵니다.
| 무엇 | 능형 | 라쏘 |
|---|---|---|
| 벌점 | 제곱의 합 | 절댓값의 합 |
| 계수 | 에 가까워집니다 | 정확히 이 됩니다 |
| 얽힌 변수 | 비슷하게 나눠 갖습니다 | 하나만 고릅니다 |
| 해 | 닫힌 식이 있습니다 | 없습니다 |
셋째 줄이 공선성에서 결정적입니다. 라쏘는 얽힌 둘 중 하나만 살리는데, 어느 것을 살릴지가 표본마다 달라집니다.
문제 2의 표본 다섯 개에서 부호가 뒤집혔던 것과 같은 불안정성이며, 라쏘에서는 변수 선택 자체가 흔들립니다.
둘을 섞은 것이 엘라스틱넷입니다. 얽힌 변수들을 함께 살리거나 함께 버려 안정성을 얻습니다.
심화 3. 주성분 회귀를 정리하세요.
84강부터 89강의 주성분을 회귀에 쓰는 방법입니다.
| 단계 | 무엇을 하는가 |
|---|---|
| 설명변수의 주성분을 구합니다 | |
| 앞쪽 몇 개만 남깁니다 | |
| 그것으로 회귀합니다 |
주성분끼리는 직교하므로 공선성이 완전히 사라집니다.
대신 계수의 해석이 사라집니다. "첫째 주성분이 늘면"이 무슨 뜻인지 말하려면 그 주성분이 무엇의 조합인지 설명해야 합니다.
그리고 위험이 하나 더 있습니다. 주성분은 를 안 보고 고르므로, 분산이 작은 방향에 의 정보가 몰려 있으면 그 방향을 버립니다. 171강 문제 3에서 설명 비율이 높아도 군집이 사라질 수 있다고 한 것과 같은 문제입니다.
부분최소제곱이 그것을 고칩니다. 와의 공분산이 큰 방향을 고르므로, 예측에는 더 낫습니다.
심화 4. 공선성과 예측의 관계를 더 정리하세요.
문제 4에서 예측이 멀쩡했는데 언제나 그런 것은 아닙니다.
| 새 자료가 | 예측이 |
|---|---|
| 훈련 자료와 같은 방향으로 얽힘 | 멀쩡합니다 |
| 얽힘이 깨진 자리 | 크게 틀립니다 |
둘째 줄이 위험합니다. 훈련에서 과 가 늘 함께 컸는데, 새 자료에서 만 크면 자료에 없던 구석입니다.
문제 1의 계수를 그대로 쓰면 터무니없는 값이 나옵니다. 184강 문제 5의 외삽이며, 공선성이 심할수록 외삽 가능한 영역이 좁아집니다.
그래서 예측이 목적이어도 조건수는 봐야 합니다. 배포 환경에서 변수 간 관계가 바뀔 수 있다면, 능형이나 변수 합치기가 안전합니다.
심화 5. 완전 공선성이 생기는 자리를 정리하세요.
| 언제 | 예 |
|---|---|
| 더미를 전부 넣음 | 186강 문제 1 |
| 비율이 로 합해짐 | 성분 비율 셋을 다 넣음 |
| 선형 항등식 | 나이, 연도, 출생연도 |
| 변수보다 관측이 적음 | 185강 문제 4 |
셋째 줄이 유명한 문제입니다. 나이 연도 출생연도이므로 셋을 다 넣으면 완전히 종속입니다.
셋의 효과를 갈라 내는 것이 원리적으로 불가능합니다. 자료를 아무리 모아도 안 되며, 가정을 하나 걸어야 풀립니다.
넷째 줄이 요즘 가장 흔합니다. 유전체나 텍스트에서 변수가 관측보다 훨씬 많으며, 정규화 없이는 아예 풀리지 않습니다.
심화 6. 이 강의가 어디에 쓰이는지 정리하세요.
| 분야 | 쓰임 | 이어지는 강의 |
|---|---|---|
| 오차 구조 | 강건표준오차 | 188강 |
| 변수 선택 | 얽힌 변수의 선택 | 189강 |
| 정규화 | 능형과 라쏘 | 211강 |
| 차원의 저주 | 변수가 많을 때 | 213강 |
셋째 줄이 이 강의의 직접적인 확장입니다. 문제 4의 능형이 정규화의 원형이며, S9에서 손실함수에 벌점을 더하는 모든 방법이 같은 발상입니다.
신경망의 가중치 감쇠도 능형입니다. 이름만 다르고 식은 같으며, 그때 배우는 "람다를 어떻게 고르는가"가 212강의 교차검증입니다.
정답.
| 기호 | 읽는 법 | 뜻 |
|---|---|---|
| 다중공선성 | multicollinearity | 설명변수끼리 서로 닮은 상태입니다 |
| VIF | 분산팽창인자 | 표준오차가 몇 배로 커지는지의 제곱입니다 |
| R_{j}^ | 알제이 제곱 | 그 변수를 나머지로 설명한 정도입니다 |
| 조건수 | condition number | 특이값의 최대와 최소의 비입니다 |
| 특이값 | singular value | 각 방향의 퍼짐의 크기입니다 |
| 중심화 | centering | 평균을 빼 원점을 옮깁니다 |
| 능형회귀 | ridge regression | 제곱 벌점을 더해 계수를 줄입니다 |
| 라쏘 | lasso | 절댓값 벌점으로 계수를 으로 만듭니다 |
| 엘라스틱넷 | elastic net | 두 벌점을 섞습니다 |
| 주성분 회귀 | principal component regression | 주성분으로 회귀합니다 |
| 부분최소제곱 | partial least squares | 를 보고 방향을 고릅니다 |
| 편향과 분산 | bias and variance | 치우침과 흔들림의 맞바꿈입니다 |
다음은 188강 이분산과 강건표준오차입니다. 이 강의가 의 문제를 다뤘습니다.
184강 문제 4에서 잔차의 분산비가 인 자료를 봤습니다. 184강 심화 4의 가우스-마르코프가 등분산을 가정했는데, 그것이 깨지면 계수는 여전히 불편이지만 표준오차가 틀립니다. 188강은 그 틀린 정도를 재고, 모형을 고치지 않고 표준오차만 고치는 방법을 다룹니다.
import numpy as np
rng = np.random.default_rng(20260924)
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 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, 400):
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
lb = 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) - lb) * betacf(a, b, x) / a
return 1.0 - np.exp(b * np.log(1.0 - x) + a * np.log(x) - lb) * betacf(b, a, 1.0 - x) / b
def t_p2(t, df):
return betainc(0.5 * df, 0.5, df / (df + t * t))
def f_sf(f, d1, d2):
if f <= 0.0:
return 1.0
return betainc(0.5 * d2, 0.5 * d1, d2 / (d2 + d1 * f))
def ols(y, *xs):
A = np.stack([np.ones(len(y))] + list(xs), axis=1)
b, *_ = np.linalg.lstsq(A, y, rcond=None)
e = y - A @ b
n, p = A.shape
s2 = (e ** 2).sum() / (n - p)
se = np.sqrt(s2 * np.diag(np.linalg.pinv(A.T @ A)))
sse = (e ** 2).sum()
sst = ((y - y.mean()) ** 2).sum()
return dict(b=b, se=se, sse=sse, sst=sst, n=n, p=p, df=n - p,
r2=1.0 - sse / sst, s2=s2, A=A, e=e)
def vif(*xs):
out = []
for i in range(len(xs)):
others = [xs[j] for j in range(len(xs)) if j != i]
r2 = ols(xs[i], *others)["r2"]
out.append(1.0 / (1.0 - r2))
return out
def corr2(rho, n):
a = rng.normal(0, 1, n)
b = rho * a + np.sqrt(1.0 - rho ** 2) * rng.normal(0, 1, n)
return a, b
# --- 문제 1: 변수끼리 닮으면 무엇이 커지는가 ----------------------------
print(" 186강에서 변수를 계속 늘렸습니다. 그 변수들이 서로 닮으면 어떻게 됩니까")
N1 = 200
print(" 참 계수는 둘 다 1.0 이고 오차 sd 는 1.0 입니다")
print(" %s %s %s %s %s %s"
% (pw("두 변수의 상관", 16), rw("첫째 계수", 12), rw("표준오차", 12),
rw("둘째 계수", 12), rw("표준오차", 12), rw("R^2", 10)))
for rho in [0.0, 0.5, 0.9, 0.99, 0.999]:
a, b = corr2(rho, N1)
y = 1.0 * a + 1.0 * b + rng.normal(0, 1.0, N1)
m = ols(y, a, b)
print(" %s %12.6f %12.6f %12.6f %12.6f %10.6f"
% (pw("%.3f" % rho, 16), m["b"][1], m["se"][1], m["b"][2], m["se"][2], m["r2"]))
print(" 상관이 커질수록 계수가 참값에서 멀리 튀고 표준오차가 폭발합니다")
print(" R^2 은 오히려 오릅니다. 예측은 멀쩡한데 계수만 못 믿게 됩니다")
print(" 표준오차가 커지는 양을 식으로 씁니다")
print(" se(b_j) = sqrt(s^2 / Sxx_j) x sqrt(1 / (1 - R_j^2)) 입니다")
print(" 뒤쪽 인자의 제곱을 분산팽창인자라 하고 VIF 라 적습니다")
print(" %s %s %s %s" % (pw("다른 변수로 설명되는 정도", 28), rw("R_j^2", 12),
rw("VIF", 12), rw("표준오차 배수", 16)))
for r2j in [0.0, 0.5, 0.8, 0.9, 0.95, 0.99, 0.999]:
v = 1.0 / (1.0 - r2j)
print(" %s %12.4f %12.4f %16.4f"
% (pw("%.3f" % r2j, 28), r2j, v, np.sqrt(v)))
print(" R_j^2 이 0.9 면 표준오차가 3.16 배가 됩니다. 흔히 VIF 10 을 경계로 씁니다")
print(" 그런데 그 경계는 관례일 뿐이며 무엇이 문제인지는 목적이 정합니다")
# --- 문제 2: 무엇이 망가지고 무엇이 안 망가지는가 -----------------------
print(" 공선성이 있어도 안 망가지는 것들이 있습니다")
N2 = 300
a2, b2 = corr2(0.999, N2)
y2 = 1.0 * a2 + 1.0 * b2 + rng.normal(0, 1.0, N2)
m2 = ols(y2, a2, b2)
sse0 = ((y2 - y2.mean()) ** 2).sum()
fv = ((sse0 - m2["sse"]) / 2) / (m2["sse"] / m2["df"])
print(" 상관 0.999 인 두 변수로 회귀합니다")
print(" %s %s %s" % (pw("무엇", 26), rw("값", 16), rw("망가졌는가", 14)))
print(" %s %16.6f %s" % (pw("첫째 계수", 26), m2["b"][1], rw("예", 14)))
print(" %s %16.6f %s" % (pw("첫째 계수의 t", 26), m2["b"][1] / m2["se"][1], rw("예", 14)))
print(" %s %16.6f %s" % (pw("둘째 계수", 26), m2["b"][2], rw("예", 14)))
print(" %s %16.6f %s" % (pw("두 계수의 합", 26), m2["b"][1] + m2["b"][2], rw("아니오", 14)))
print(" %s %16.6f %s" % (pw("R^2", 26), m2["r2"], rw("아니오", 14)))
print(" %s %16.6f %s" % (pw("오차 sd 추정", 26), np.sqrt(m2["s2"]), rw("아니오", 14)))
print(" %s %16.6f %s" % (pw("전체 F", 26), fv, rw("아니오", 14)))
print(" 참 계수의 합은 2.0 이고 참 오차 sd 는 1.0 입니다")
print(" 개별 계수는 못 믿는데 합과 예측은 정확합니다")
print(" 둘을 함께 검정하면 유의합니다")
print(" %s %s %s" % (pw("무엇을 검정", 26), rw("통계량", 14), rw("p 값", 16)))
print(" %s %14.6f %16.10f"
% (pw("첫째 계수 하나", 26), m2["b"][1] / m2["se"][1],
t_p2(m2["b"][1] / m2["se"][1], m2["df"])))
print(" %s %14.6f %16.10f"
% (pw("둘째 계수 하나", 26), m2["b"][2] / m2["se"][2],
t_p2(m2["b"][2] / m2["se"][2], m2["df"])))
print(" %s %14.6f %16.10f" % (pw("둘을 한꺼번에", 26), fv, f_sf(fv, 2, m2["df"])))
print(" 각각은 유의하지 않은데 함께 보면 아주 유의합니다")
print(" 185강 심화 5 의 타원이 여기서 나타납니다. 두 계수가 서로를 대신할 수 있습니다")
print(" 자료를 조금만 바꿔도 계수가 크게 흔들립니다")
print(" 같은 모집단에서 표본만 다시 뽑아 봅니다")
print(" %s %s %s %s %s" % (pw("표본", 10), rw("첫째 계수", 14), rw("둘째 계수", 14),
rw("두 계수의 합", 16), rw("R^2", 12)))
for k in range(5):
aa, bb = corr2(0.999, N2)
yy = 1.0 * aa + 1.0 * bb + rng.normal(0, 1.0, N2)
mm = ols(yy, aa, bb)
print(" %s %14.6f %14.6f %16.6f %12.6f"
% (pw("%d" % (k + 1), 10), mm["b"][1], mm["b"][2],
mm["b"][1] + mm["b"][2], mm["r2"]))
print(" 개별 계수는 표본마다 크게 다른데 합은 2.0 근처에서 안정적입니다")
print(" 부호가 뒤집히는 표본도 나옵니다. 그것을 보고 해석하면 안 됩니다")
# --- 문제 3: 얼마나 심한지 재는 법 --------------------------------------
print(" VIF 를 직접 계산합니다")
N3 = 400
u3 = rng.normal(0, 1, N3)
x31 = u3 + rng.normal(0, 0.3, N3)
x32 = u3 + rng.normal(0, 0.3, N3)
x33 = rng.normal(0, 1, N3)
y3 = 1.0 * x31 + 1.0 * x32 + 1.0 * x33 + rng.normal(0, 1.0, N3)
vs = vif(x31, x32, x33)
m3 = ols(y3, x31, x32, x33)
print(" x1 과 x2 는 같은 잠재요인에서 오고 x3 는 따로입니다")
print(" %s %s %s %s %s" % (pw("변수", 10), rw("다른 것으로의 R^2", 20), rw("VIF", 12),
rw("계수", 12), rw("표준오차", 12)))
for i, nm in enumerate(["x1", "x2", "x3"]):
print(" %s %20.6f %12.4f %12.6f %12.6f"
% (pw(nm, 10), 1.0 - 1.0 / vs[i], vs[i], m3["b"][i + 1], m3["se"][i + 1]))
print(" x1 과 x2 의 VIF 가 큽니다. x3 는 1 근처입니다")
print(" x3 의 표준오차는 공선성의 영향을 안 받습니다. 얽힌 변수만 영향을 받습니다")
print(" 조건수로도 잽니다")
print(" 설계행렬을 표준화한 뒤 특이값의 비를 봅니다")
print(" %s %s %s %s" % (pw("두 변수의 상관", 16), rw("가장 큰 특이값", 16),
rw("가장 작은 특이값", 18), rw("조건수", 12)))
for rho in [0.0, 0.5, 0.9, 0.99, 0.999]:
a, b = corr2(rho, 500)
M = np.stack([(a - a.mean()) / a.std(), (b - b.mean()) / b.std()], axis=1)
sv = np.linalg.svd(M, compute_uv=False)
print(" %s %16.4f %18.4f %12.4f"
% (pw("%.3f" % rho, 16), sv[0], sv[-1], sv[0] / sv[-1]))
print(" 상관이 커질수록 작은 특이값이 0 으로 갑니다. 그 방향의 정보가 없다는 뜻입니다")
print(" 조건수 30 을 넘으면 의심하고 100 을 넘으면 심각하다고 봅니다")
print(" 중심화만으로도 크게 나아지는 경우가 있습니다")
N4 = 300
x4 = rng.uniform(5.0, 15.0, N4)
y4 = 2.0 + 1.0 * x4 + 0.5 * x4 ** 2 + rng.normal(0, 3.0, N4)
xc = x4 - x4.mean()
print(" x 와 x 제곱을 함께 넣습니다. 186강 심화 2 의 상황입니다")
print(" %s %s %s %s" % (pw("무엇을 넣는가", 20), rw("두 열의 상관", 16),
rw("VIF", 12), rw("이차항 표준오차", 18)))
for nm, xa, xb in [("원래 x 와 x^2", x4, x4 ** 2),
("중심화한 x 와 그 제곱", xc, xc ** 2)]:
v = vif(xa, xb)
mm = ols(y4, xa, xb)
print(" %s %16.6f %12.4f %18.6f"
% (pw(nm, 20), float(np.corrcoef(xa, xb)[0, 1]), v[1], mm["se"][2]))
print(" 중심화만으로 상관이 크게 줄고 VIF 가 내려갑니다")
print(" 이차항의 표준오차와 계수는 안 변합니다. 해석이 쉬워질 뿐입니다")
mm1 = ols(y4, x4, x4 ** 2)
mm2 = ols(y4, xc, xc ** 2)
print(" 이차항 계수는 %.6f 과 %.6f 으로 같습니다" % (mm1["b"][2], mm2["b"][2]))
# --- 문제 4: 무엇을 할 것인가 -------------------------------------------
print(" 대책마다 얻는 것과 잃는 것이 다릅니다")
N5 = 300
a5, b5 = corr2(0.98, N5)
y5 = 1.0 * a5 + 1.0 * b5 + rng.normal(0, 1.0, N5)
mfull = ols(y5, a5, b5)
mdrop = ols(y5, a5)
msum = ols(y5, a5 + b5)
A5 = np.stack([np.ones(N5), a5, b5], axis=1)
P = np.eye(3)
P[0, 0] = 0.0
def ridge(A, y, lam):
return np.linalg.solve(A.T @ A + lam * P, A.T @ y)
bridge = ridge(A5, y5, 30.0)
print(" 상관 0.98 이고 참 계수는 둘 다 1.0 입니다")
print(" %s %s %s %s %s" % (pw("무엇을 하는가", 20), rw("첫째 계수", 14),
rw("둘째 계수", 14), rw("계수의 합", 14), rw("잔차 제곱합", 16)))
print(" %s %14.6f %14.6f %14.6f %16.6f"
% (pw("둘 다 넣음", 20), mfull["b"][1], mfull["b"][2],
mfull["b"][1] + mfull["b"][2], mfull["sse"]))
print(" %s %14.6f %14s %14.6f %16.6f"
% (pw("하나를 뺌", 20), mdrop["b"][1], rw("없음", 14), mdrop["b"][1], mdrop["sse"]))
print(" %s %14.6f %14s %14.6f %16.6f"
% (pw("둘을 더해 하나로", 20), msum["b"][1], rw("없음", 14),
msum["b"][1] * 2, msum["sse"]))
print(" %s %14.6f %14.6f %14.6f %16.6f"
% (pw("능형 (람다 30)", 20), bridge[1], bridge[2], bridge[1] + bridge[2],
float(((y5 - A5 @ bridge) ** 2).sum())))
print(" 하나를 빼면 남은 계수가 두 효과를 합쳐 담습니다. 참 개별 효과가 아닙니다")
print(" 둘을 더해 하나로 만들면 계수가 절반쯤 되고 합은 참값에 가깝습니다")
print(" 능형은 둘을 비슷하게 나눠 갖습니다. 대신 합이 조금 줄어듭니다")
print(" 능형이 무엇을 사고 무엇을 파는지 반복 모의로 봅니다")
print(" 상관 0.98 인 표본을 500 번 뽑아 계수의 평균과 흔들림을 잽니다")
print(" %s %s %s %s %s" % (pw("람다", 10), rw("첫째 계수 평균", 18),
rw("첫째 계수 표준편차", 20), rw("합의 평균", 14),
rw("계수의 평균제곱오차", 22)))
for lam in [0.0, 1.0, 10.0, 100.0, 1000.0]:
b1s, sums = [], []
for _ in range(500):
aa, bb = corr2(0.98, N5)
yy = 1.0 * aa + 1.0 * bb + rng.normal(0, 1.0, N5)
AA = np.stack([np.ones(N5), aa, bb], axis=1)
bh = ridge(AA, yy, lam)
b1s.append(bh[1])
sums.append(bh[1] + bh[2])
b1s = np.array(b1s)
print(" %s %18.6f %20.6f %14.6f %22.6f"
% (pw("%.0f" % lam, 10), float(b1s.mean()), float(b1s.std(ddof=1)),
float(np.mean(sums)), float(((b1s - 1.0) ** 2).mean())))
print(" 람다가 커지면 흔들림이 줄고 평균이 1.0 에서 멀어집니다")
print(" 평균제곱오차가 가운데에서 가장 작습니다. 치우침과 흔들림의 맞바꿈입니다")
print(" 210강의 편향과 분산 분해가 여기서 미리 나타납니다")
print(" 예측만 하려면 아무것도 안 해도 됩니다")
print(" 새 자료 3000 개에서 예측 오차를 재 봅니다")
N6 = 3000
an, bn = corr2(0.98, N6)
yn = 1.0 * an + 1.0 * bn + rng.normal(0, 1.0, N6)
print(" %s %s %s" % (pw("무엇을 하는가", 20), rw("새 자료 평균제곱오차", 24),
rw("참값 대비", 12)))
for nm, pred in [("둘 다 넣음", mfull["b"][0] + mfull["b"][1] * an + mfull["b"][2] * bn),
("하나를 뺌", mdrop["b"][0] + mdrop["b"][1] * an),
("둘을 더해 하나로", msum["b"][0] + msum["b"][1] * (an + bn)),
("능형으로 줄임", bridge[0] + bridge[1] * an + bridge[2] * bn)]:
mse = float(((yn - pred) ** 2).mean())
print(" %s %24.6f %12.4f" % (pw(nm, 20), mse, mse / 1.0))
print(" 네 방법의 예측 오차가 비슷하고 참 오차분산 1.0 근처입니다")
print(" 공선성은 해석의 문제이지 예측의 문제가 아닙니다")
print(" 그래서 예측이 목적이면 아무 대책도 필요 없습니다")
# --- 문제 5: 착각하기 쉬운 것들 -----------------------------------------
print(" 공선성이 아닌데 공선성으로 오해하는 경우가 있습니다")
print(" %s %s" % (pw("증상", 26), rw("진짜 원인일 수 있는 것", 28)))
for a, b in [("계수가 예상과 반대", "교란 또는 충돌부"),
("표준오차가 큼", "표본이 작거나 오차가 큼"),
("변수를 빼면 계수가 바뀜", "당연합니다. 다른 물음입니다"),
("t 는 안 유의한데 F 는 유의", "공선성일 가능성이 큽니다")]:
print(" %s %s" % (pw(a, 26), rw(b, 28)))
print(" 넷째 줄만 공선성의 특징적인 신호입니다")
print(" 표본을 늘리면 공선성이 나아집니다")
print(" 상관 0.99 를 고정하고 표본만 늘려 봅니다")
print(" 이론상 VIF 는 1/(1-0.99^2) = %.4f 입니다" % (1.0 / (1.0 - 0.99 ** 2)))
print(" %s %s %s %s" % (pw("표본 크기", 12), rw("표본에서 잰 VIF", 18),
rw("첫째 계수의 표준오차", 22), rw("95 구간의 폭", 16)))
for n in [50, 200, 800, 3200, 12800]:
aa, bb = corr2(0.99, n)
yy = 1.0 * aa + 1.0 * bb + rng.normal(0, 1.0, n)
mm = ols(yy, aa, bb)
v = vif(aa, bb)
print(" %s %18.4f %22.6f %16.6f"
% (pw("%d" % n, 12), v[0], mm["se"][1], 2 * 1.96 * mm["se"][1]))
print(" VIF 는 이론값 50.25 근처를 맴돌 뿐 표본이 늘어도 안 줄어듭니다")
print(" 그런데 표준오차는 표본 크기의 제곱근에 반비례해 계속 줄어듭니다")
print(" VIF 가 크다는 것과 못 쓴다는 것이 다릅니다. 실제 구간의 폭을 봐야 합니다")
print(" 결정하는 기준을 정리합니다")
print(" %s %s" % (pw("무엇이 목적인가", 24), rw("공선성을 어떻게 다루는가", 28)))
for a, b in [("예측", "그냥 둡니다"),
("한 변수의 효과", "그 변수만 남기고 나머지는 통제"),
("변수들의 합의 효과", "합쳐서 하나로 넣습니다"),
("어느 변수가 중요한가", "답할 수 없습니다"),
("계수가 안정적이길", "능형이나 표본 확대")]:
print(" %s %s" % (pw(a, 24), rw(b, 28)))
print(" 넷째 줄이 이 강의의 결론입니다. 얽힌 변수들 사이에서 중요도는 정의되지 않습니다")
print(" 자료가 두 변수를 갈라 본 적이 없으므로 갈라 말할 근거도 없습니다")
# 186강에서 변수를 계속 늘렸습니다. 그 변수들이 서로 닮으면 어떻게 됩니까
# 참 계수는 둘 다 1.0 이고 오차 sd 는 1.0 입니다
# 두 변수의 상관 첫째 계수 표준오차 둘째 계수 표준오차 R^2
# 0.000 0.958199 0.065811 1.016550 0.074034 0.657732
# 0.500 0.939455 0.084494 1.023510 0.082459 0.715559
# 0.900 1.332924 0.159018 0.654884 0.163913 0.771017
# 0.990 1.302195 0.472885 0.703569 0.472736 0.817900
# 0.999 -1.306283 1.438180 3.313065 1.442909 0.823242
# 상관이 커질수록 계수가 참값에서 멀리 튀고 표준오차가 폭발합니다
# R^2 은 오히려 오릅니다. 예측은 멀쩡한데 계수만 못 믿게 됩니다
# 표준오차가 커지는 양을 식으로 씁니다
# se(b_j) = sqrt(s^2 / Sxx_j) x sqrt(1 / (1 - R_j^2)) 입니다
# 뒤쪽 인자의 제곱을 분산팽창인자라 하고 VIF 라 적습니다
# 다른 변수로 설명되는 정도 R_j^2 VIF 표준오차 배수
# 0.000 0.0000 1.0000 1.0000
# 0.500 0.5000 2.0000 1.4142
# 0.800 0.8000 5.0000 2.2361
# 0.900 0.9000 10.0000 3.1623
# 0.950 0.9500 20.0000 4.4721
# 0.990 0.9900 100.0000 10.0000
# 0.999 0.9990 1000.0000 31.6228
# R_j^2 이 0.9 면 표준오차가 3.16 배가 됩니다. 흔히 VIF 10 을 경계로 씁니다
# 그런데 그 경계는 관례일 뿐이며 무엇이 문제인지는 목적이 정합니다
# 공선성이 있어도 안 망가지는 것들이 있습니다
# 상관 0.999 인 두 변수로 회귀합니다
# 무엇 값 망가졌는가
# 첫째 계수 0.545019 예
# 첫째 계수의 t 0.451796 예
# 둘째 계수 1.497043 예
# 두 계수의 합 2.042062 아니오
# R^2 0.838957 아니오
# 오차 sd 추정 0.933991 아니오
# 전체 F 773.611310 아니오
# 참 계수의 합은 2.0 이고 참 오차 sd 는 1.0 입니다
# 개별 계수는 못 믿는데 합과 예측은 정확합니다
# 둘을 함께 검정하면 유의합니다
# 무엇을 검정 통계량 p 값
# 첫째 계수 하나 0.451796 0.6517455248
# 둘째 계수 하나 1.238570 0.2164827965
# 둘을 한꺼번에 773.611310 0.0000000000
# 각각은 유의하지 않은데 함께 보면 아주 유의합니다
# 185강 심화 5 의 타원이 여기서 나타납니다. 두 계수가 서로를 대신할 수 있습니다
# 자료를 조금만 바꿔도 계수가 크게 흔들립니다
# 같은 모집단에서 표본만 다시 뽑아 봅니다
# 표본 첫째 계수 둘째 계수 두 계수의 합 R^2
# 1 1.758572 0.182485 1.941057 0.716481
# 2 1.844141 0.011778 1.855919 0.794165
# 3 -0.729404 2.847628 2.118224 0.843674
# 4 0.104582 1.891573 1.996154 0.810378
# 5 2.312680 -0.188713 2.123967 0.822865
# 개별 계수는 표본마다 크게 다른데 합은 2.0 근처에서 안정적입니다
# 부호가 뒤집히는 표본도 나옵니다. 그것을 보고 해석하면 안 됩니다
# VIF 를 직접 계산합니다
# x1 과 x2 는 같은 잠재요인에서 오고 x3 는 따로입니다
# 변수 다른 것으로의 R^2 VIF 계수 표준오차
# x1 0.859083 7.0964 0.998911 0.122986
# x2 0.859143 7.0994 1.026200 0.124593
# x3 0.002098 1.0021 0.934838 0.051345
# x1 과 x2 의 VIF 가 큽니다. x3 는 1 근처입니다
# x3 의 표준오차는 공선성의 영향을 안 받습니다. 얽힌 변수만 영향을 받습니다
# 조건수로도 잽니다
# 설계행렬을 표준화한 뒤 특이값의 비를 봅니다
# 두 변수의 상관 가장 큰 특이값 가장 작은 특이값 조건수
# 0.000 22.5319 22.1881 1.0155
# 0.500 27.4253 15.7433 1.7420
# 0.900 30.8195 7.0823 4.3516
# 0.990 31.5393 2.2959 13.7370
# 0.999 31.6149 0.7045 44.8781
# 상관이 커질수록 작은 특이값이 0 으로 갑니다. 그 방향의 정보가 없다는 뜻입니다
# 조건수 30 을 넘으면 의심하고 100 을 넘으면 심각하다고 봅니다
# 중심화만으로도 크게 나아지는 경우가 있습니다
# x 와 x 제곱을 함께 넣습니다. 186강 심화 2 의 상황입니다
# 무엇을 넣는가 두 열의 상관 VIF 이차항 표준오차
# 원래 x 와 x^2 0.991904 62.0104 0.021237
# 중심화한 x 와 그 제곱 -0.025956 1.0007 0.021237
# 중심화만으로 상관이 크게 줄고 VIF 가 내려갑니다
# 이차항의 표준오차와 계수는 안 변합니다. 해석이 쉬워질 뿐입니다
# 이차항 계수는 0.510151 과 0.510151 으로 같습니다
# 대책마다 얻는 것과 잃는 것이 다릅니다
# 상관 0.98 이고 참 계수는 둘 다 1.0 입니다
# 무엇을 하는가 첫째 계수 둘째 계수 계수의 합 잔차 제곱합
# 둘 다 넣음 0.980557 0.991769 1.972326 268.180724
# 하나를 뺌 1.949674 없음 1.949674 280.248891
# 둘을 더해 하나로 0.986156 없음 1.972312 268.181115
# 능형 (람다 30) 0.938990 0.939088 1.878078 270.835807
# 하나를 빼면 남은 계수가 두 효과를 합쳐 담습니다. 참 개별 효과가 아닙니다
# 둘을 더해 하나로 만들면 계수가 절반쯤 되고 합은 참값에 가깝습니다
# 능형은 둘을 비슷하게 나눠 갖습니다. 대신 합이 조금 줄어듭니다
# 능형이 무엇을 사고 무엇을 파는지 반복 모의로 봅니다
# 상관 0.98 인 표본을 500 번 뽑아 계수의 평균과 흔들림을 잽니다
# 람다 첫째 계수 평균 첫째 계수 표준편차 합의 평균 계수의 평균제곱오차
# 0 0.998275 0.282296 2.000315 0.079535
# 1 0.991590 0.246188 2.000549 0.060558
# 10 0.985827 0.113585 1.964964 0.013077
# 100 0.853024 0.030591 1.706425 0.022536
# 1000 0.371102 0.022131 0.742133 0.396002
# 람다가 커지면 흔들림이 줄고 평균이 1.0 에서 멀어집니다
# 평균제곱오차가 가운데에서 가장 작습니다. 치우침과 흔들림의 맞바꿈입니다
# 210강의 편향과 분산 분해가 여기서 미리 나타납니다
# 예측만 하려면 아무것도 안 해도 됩니다
# 새 자료 3000 개에서 예측 오차를 재 봅니다
# 무엇을 하는가 새 자료 평균제곱오차 참값 대비
# 둘 다 넣음 1.013720 1.0137
# 하나를 뺌 1.073119 1.0731
# 둘을 더해 하나로 1.013833 1.0138
# 능형으로 줄임 1.024156 1.0242
# 네 방법의 예측 오차가 비슷하고 참 오차분산 1.0 근처입니다
# 공선성은 해석의 문제이지 예측의 문제가 아닙니다
# 그래서 예측이 목적이면 아무 대책도 필요 없습니다
# 공선성이 아닌데 공선성으로 오해하는 경우가 있습니다
# 증상 진짜 원인일 수 있는 것
# 계수가 예상과 반대 교란 또는 충돌부
# 표준오차가 큼 표본이 작거나 오차가 큼
# 변수를 빼면 계수가 바뀜 당연합니다. 다른 물음입니다
# t 는 안 유의한데 F 는 유의 공선성일 가능성이 큽니다
# 넷째 줄만 공선성의 특징적인 신호입니다
# 표본을 늘리면 공선성이 나아집니다
# 상관 0.99 를 고정하고 표본만 늘려 봅니다
# 이론상 VIF 는 1/(1-0.99^2) = 50.2513 입니다
# 표본 크기 표본에서 잰 VIF 첫째 계수의 표준오차 95 구간의 폭
# 50 65.2419 1.041169 4.081383
# 200 50.0770 0.499750 1.959021
# 800 51.4581 0.246415 0.965946
# 3200 51.6866 0.124333 0.487386
# 12800 50.1810 0.062511 0.245043
# VIF 는 이론값 50.25 근처를 맴돌 뿐 표본이 늘어도 안 줄어듭니다
# 그런데 표준오차는 표본 크기의 제곱근에 반비례해 계속 줄어듭니다
# VIF 가 크다는 것과 못 쓴다는 것이 다릅니다. 실제 구간의 폭을 봐야 합니다
# 결정하는 기준을 정리합니다
# 무엇이 목적인가 공선성을 어떻게 다루는가
# 예측 그냥 둡니다
# 한 변수의 효과 그 변수만 남기고 나머지는 통제
# 변수들의 합의 효과 합쳐서 하나로 넣습니다
# 어느 변수가 중요한가 답할 수 없습니다
# 계수가 안정적이길 능형이나 표본 확대
# 넷째 줄이 이 강의의 결론입니다. 얽힌 변수들 사이에서 중요도는 정의되지 않습니다
# 자료가 두 변수를 갈라 본 적이 없으므로 갈라 말할 근거도 없습니다