184강과 185강의 변수가 모두 수였습니다. 이제 범주를 넣습니다.
184강 문제 2에서 집단 둘을 과 로 적어 회귀했고 값까지 맞았습니다. 범주가 셋 이상이면 그 방법이 그대로 안 됩니다.
| 어떻게 적는가 | 무엇이 문제인가 |
|---|---|
| 라는 수로 | 없는 순서와 간격을 만듭니다 |
| 더미 두 개로 | 각 범주가 자기 값을 갖습니다 |
| 더미 셋 다 | 계수를 정할 수 없습니다 |
그리고 이 강의의 후반이 더 중요합니다. 185강 심화 4에서 본 덧셈 가정을 깨는 곱 항을 넣으면, 집단마다 기울기가 달라집니다.
곱 항이 들어가는 순간 계수를 읽는 방법이 바뀝니다. 집단 차이가 하나의 수가 아니라 의 함수가 되며, 그것이 문제 4의 주제입니다.
문제. 범주 셋을 회귀에 넣습니다.
(1) 번호를 그대로 쓰면 어떻게 되는지 보세요.
(2) 더미변수로 바꾸세요.
(3) 더미를 셋 다 넣으면 어떻게 되는지 확인하세요.
생각의 실마리. 회귀는 **"가 늘 때"**를 계산합니다. 지역 과 지역 의 사이가 지역 과 지역 의 사이와 같은 크기라는 보장이 없습니다.
풀이. (1) 세 지역의 참 평균이 , , 입니다.
| 지역 | 표본 평균 | 크기 |
|---|---|---|
지역을 라는 수로 넣고 회귀하면 **기울기가 **입니다.
| 지역 | 이 모형의 예측 | 실제 평균 |
|---|---|---|
가운데 지역의 예측이 인데 실제는 입니다. 세 평균이 오르내리는데 직선에 억지로 끼웠기 때문입니다.
모형이 "지역 번호가 늘면 오른다"고 말합니다. 지역에 그런 순서가 없으므로 뜻이 없는 문장입니다.
(2) 더미변수로 바꿉니다. 기준을 지역 으로 둡니다.
| 계수 | 값 | 표준오차 | 뜻 |
|---|---|---|---|
| 절편 | 기준 지역의 평균 | ||
| 지역 더미 | 기준과의 차이 | ||
| 지역 더미 | 기준과의 차이 |
| 지역 | 이 모형의 예측 | 실제 평균 |
|---|---|---|
세 예측이 세 평균과 소수 여섯째 자리까지 같습니다. 더미가 평균을 그대로 담습니다.
절편이 기준 지역의 평균이고 각 더미 계수가 기준과의 차이입니다. 184강 문제 2에서 집단 둘일 때 본 대응이 그대로 늘어난 것입니다.
(3) 더미를 셋 다 넣으면 어떻게 되는지 봅니다.
가 모든 행에서 이라 상수열과 똑같습니다. 절편과 완전히 겹쳐 가 뒤집히지 않으며, 이것을 더미변수 함정이라 합니다.
| 무엇 | 두 개만 넣음 | 셋 다 넣음 |
|---|---|---|
| 잔차 제곱합 | ||
| R^ |
예측은 같습니다. 절편에 를 더하고 더미 셋에서 를 빼도 예측이 그대로인지 봅니다.
| 예측의 최대 차이 | 잔차 제곱합 | |
|---|---|---|
가 무엇이든 예측과 잔차가 똑같습니다. 계수가 무한히 많으며, 계수 하나를 집어 해석할 수가 없습니다.
이 문제에서 배우는 것. 범주에 순서가 있어도 번호를 그대로 쓰는 것은 강한 가정입니다. 등급 ~처럼 순서가 분명해도, 번호를 쓰면 과 의 차이가 와 의 차이와 같다고 가정하는 것입니다. 더미를 쓰면 그 가정 없이 각 등급이 자기 값을 갖는데, 대신 자유도를 더 씁니다. 181강 심화 3에서 순서형 자료의 추세 검정이 자유도를 아꼈던 것과 같은 맞바꿈이며, 순서가 진짜로 선형이면 번호를 쓰는 것이 낫습니다.
바로 확인 1.
확인 1-1. 범주에 번호를 그대로 쓰면 무엇을 가정하는지 쓰세요.
답. 이웃한 범주 사이의 간격이 모두 같다고 가정합니다.
확인 1-2. 검산에서 더미 모형의 절편과 두 계수의 뜻을 쓰세요.
답. 이 기준 평균이고 과 가 기준과의 차이입니다.
확인 1-3. 더미변수 함정이 무엇인지 쓰세요.
답. 더미를 전부 넣으면 합이 상수열과 같아 계수를 하나로 정할 수 없습니다.
문제. 기준 범주를 바꿔 봅니다.
(1) 계수와 을 견주세요.
(2) 유의성이 어떻게 달라지는지 보세요.
(3) 범주 전체를 한 번에 검정하세요.
생각의 실마리. 기준을 바꾸면 비교의 상대가 바뀝니다. 모형 자체는 같은데 적는 방식만 달라집니다.
풀이. (1) 기준을 셋 다 써 봅니다.
| 기준 | 절편 | 첫째 계수 | 둘째 계수 | R^ |
|---|---|---|---|---|
| 지역 | ||||
| 지역 | ||||
| 지역 |
절편과 계수가 다 다른데 은 소수 여섯째 자리까지 같습니다. 같은 모형을 다르게 적었을 뿐이며, 예측도 같습니다.
(2) 유의성을 봅니다.
| 기준 | 비교 | 차이 | 값 |
|---|---|---|---|
| 지역 | 대 | ||
| 지역 | 대 | ||
| 지역 | 대 | ||
| 지역 | 대 | ||
| 지역 | 대 | ||
| 지역 | 대 |
지역 과 의 차이는 기준이 일 때 표에 안 나옵니다. 계수 둘의 차이로 계산은 되지만, 표준오차는 따로 구해야 합니다.
모든 짝을 보려면 기준을 바꿔 가며 봐야 하고 그러면 다중비교가 됩니다. 180강 문제 4의 사후 비교와 같은 자리이며, 보정이 필요합니다.
(3) 범주 전체가 필요한지는 로 한 번에 봅니다.
| 무엇 | 값 |
|---|---|
| 절편만인 모형의 잔차 | |
| 더미를 넣은 잔차 | |
| 통계량 | |
| 자유도 분자 | |
| 자유도 분모 |
값은 입니다.
180강의 분산분석과 정확히 같은 값입니다. 더미 회귀가 곧 분산분석이며, 180강 심화 6에서 예고한 대응이 여기서 확인됩니다.
이 문제에서 배우는 것. 기준 범주를 무엇으로 두느냐가 보고서의 인상을 바꿉니다. 계수 표만 보면 기준과의 비교만 눈에 들어오므로, 기준을 어디에 두느냐로 무엇이 강조될지가 정해집니다. 그래서 기준은 실무적으로 뜻이 있는 것으로 정해야 하는데, 대조군이나 가장 흔한 범주가 보통 좋은 선택입니다. 그리고 계수 표를 볼 때는 빠진 비교가 있다는 것을 늘 염두에 두어야 하며, 범주가 개면 계수는 개인데 짝은 개입니다.
바로 확인 2.
확인 2-1. 기준을 바꾸면 무엇이 변하고 무엇이 안 변하는지 쓰세요.
답. 계수와 절편은 변하고 과 예측은 안 변합니다.
확인 2-2. 검산에서 지역 과 의 차이와 값을 쓰세요.
답. 이고 는 입니다.
확인 2-3. 검산에서 더미 두 개를 한꺼번에 검정한 와 자유도를 쓰세요.
답. 이고 자유도는 와 입니다.
문제. 교호작용을 넣습니다.
(1) 덧셈 모형과 곱 항 모형을 견주세요.
(2) 집단별로 따로 회귀한 것과 같은지 확인하세요.
(3) 곱 항이 필요한지 검정하세요.
생각의 실마리. 지금까지 집단이 절편만 바꿨습니다. 집단마다 의 효과 자체가 다르면 그 모형으로 못 담습니다.
풀이. (1) 참 모형이 입니다. 집단 의 기울기는 이고 집단 의 기울기는 입니다.
| 모형 | 계수 | 계수 | 곱 계수 | R^ |
|---|---|---|---|---|
| 덧셈만 | 없음 | |||
| 곱 항을 넣음 |
덧셈만 하면 계수가 로 두 기울기의 가운데쯤에 놓입니다.
어느 집단에도 맞지 않는 값입니다. 집단 에는 너무 크고 집단 에는 너무 작습니다.
곱 항을 넣으면 과 로 갈립니다. 도 에서 로 오릅니다.
(2) 집단별로 따로 회귀한 것과 견줍니다.
| 무엇 | 따로 회귀 | 곱 항 모형에서 |
|---|---|---|
| 집단 의 절편 | ||
| 집단 의 기울기 | ||
| 집단 의 절편 | ||
| 집단 의 기울기 |
네 값이 모두 같습니다. 곱 항 모형은 두 회귀를 한꺼번에 적은 것입니다.
그러면 왜 하나로 적습니까. 오차분산을 공유해 자유도가 늘고, 두 집단을 함께 검정할 수 있기 때문입니다.
(3) 곱 항이 필요한지 로 검정합니다.
| 무엇 | 값 |
|---|---|
| 덧셈 모형의 잔차 | |
| 곱 항 모형의 잔차 | |
| 통계량 | |
| 자유도 |
값은 입니다. 곱 항이 필요합니다.
잔차가 정확히 절반으로 줄었습니다. 덧셈 모형이 담지 못한 몫이 그만큼 컸다는 뜻입니다.
이 문제에서 배우는 것. 교호작용을 안 넣으면 계수가 평균 효과가 되는데, 그 평균이 누구의 평균인지가 표본에 달려 있습니다. 위에서 가 나온 것은 두 집단이 반반이기 때문이고, 집단 이 퍼센트뿐이면 쯤이 나옵니다. 참 효과는 안 변했는데 추정값이 변합니다. 그래서 교호작용이 있는데 덧셈 모형을 쓰면, 다른 표본에서 다른 계수가 나오고 재현이 안 되는 것처럼 보입니다. 실제로는 처음부터 하나의 수로 요약할 수 없는 것이었습니다.
바로 확인 3.
확인 3-1. 검산에서 덧셈 모형의 계수와 두 참 기울기를 쓰세요.
답. 이며 참 기울기는 과 입니다.
확인 3-2. 곱 항 모형에서 집단 의 기울기를 식으로 쓰세요.
답. 계수와 곱 계수를 더한 값입니다.
확인 3-3. 검산에서 곱 항의 와 잔차 변화를 쓰세요.
답. 는 이고 잔차가 에서 가 됩니다.
문제. 주효과의 뜻을 밝힙니다.
(1) 세 계수가 각각 무엇인지 정리하세요.
(2) 를 옮겨 무엇이 변하는지 보세요.
(3) 집단 차이를 의 함수로 계산하세요.
생각의 실마리. 곱 항이 있으면 의 효과가 에 따라 다릅니다. 그러면 **"의 계수"**라는 말이 어느 에서의 이야기인지 밝혀야 합니다.
풀이. (1) 셋을 정리합니다.
| 계수 | 무엇을 뜻하는가 |
|---|---|
| 계수 | 가 일 때의 기울기 |
| 계수 | 가 일 때의 집단 차이 |
| 곱 계수 | 집단에 따른 기울기 차이 |
둘째 줄이 함정입니다. 가 이 뜻이 없으면 계수도 뜻이 없습니다.
(2) 를 옮겨 확인합니다.
| 를 어디서 재는가 | 계수 | 계수 | 곱 계수 |
|---|---|---|---|
| 원래 그대로 | |||
| 평균을 뺌 | |||
| 를 뺌 | |||
| 를 뺌 |
계수와 곱 계수는 소수 여섯째 자리까지 안 변하는데 계수만 에서 으로 움직입니다.
계수가 인 자리에서의 차이라 기준점이 옮겨 가기 때문입니다. 에서 를 빼면 원래 였던 자리가 새 원점이 되고, 그 자리의 집단 차이는 입니다.
그래서 곱 항을 넣을 때는 를 중심화하는 것이 관례입니다. 평균을 빼 두면 계수가 평균적인 에서의 집단 차이가 되어 해석이 됩니다.
(3) 집단 차이를 의 함수로 계산합니다.
| 값 | 집단 차이 | 표준오차 | 구간이 을 넣는가 |
|---|---|---|---|
| 아니오 | |||
| 예 | |||
| 아니오 | |||
| 아니오 | |||
| 아니오 | |||
| 아니오 |
가 근처에서 집단 차이가 을 지납니다. 참값이 에서 이므로 정확합니다.
부호까지 바뀝니다. 에서는 집단 이 오히려 낮습니다.
표준오차도 에 따라 달라집니다. 에서 가장 작고 멀어질수록 커지는데, 184강 문제 5의 구간이 에서 가장 좁았던 것과 같은 구조입니다.
곱 항이 있으면 집단 차이가 하나의 수가 아니라 의 함수입니다. 그래서 계수 하나만 보고 집단 차이를 말하면 안 됩니다.
이 문제에서 배우는 것. 논문과 보고서에서 가장 흔한 오독이 여기서 나옵니다. 곱 항이 유의한 모형에서 "의 효과는 입니다"라고 쓰면, 독자는 그것이 모든 에서의 차이라고 읽습니다. 실제로는 에서만 그렇고, 에서는 부호가 반대입니다. 올바른 보고는 **"가 범위에서 집단 차이가 에서 까지 변하며 근처에서 방향이 바뀝니다"**입니다. 그리고 이 형태가 191강 이후 인과추론에서 이질적 처치효과로 다시 나오는데, 평균 효과 하나로 정책을 정하면 안 되는 이유가 됩니다.
바로 확인 4.
확인 4-1. 곱 항이 있을 때 계수의 뜻을 쓰세요.
답. 가 일 때의 집단 차이입니다.
확인 4-2. 검산에서 에서 를 뺐을 때 계수를 쓰세요.
답. 이며 계수와 곱 계수는 그대로입니다.
확인 4-3. 검산에서 집단 차이가 을 지나는 를 쓰세요.
답. 근처이며 그 자리의 차이가 입니다.
문제. 범주 셋에 곱 항을 넣습니다.
(1) 세 모형을 견주고 검정하세요.
(2) 집단별 기울기를 되살리세요.
(3) 변수가 늘어나는 속도를 세세요.
생각의 실마리. 범주가 개면 더미가 개이고, 각각에 곱 항이 붙으면 개가 더 생깁니다.
풀이. (1) 세 집단의 참 절편은 이고 참 기울기는 입니다.
| 모형 | 계수 수 | 잔차 제곱합 | R^ | 오차 sd |
|---|---|---|---|---|
| 만 | ||||
| 와 더미 | ||||
| 곱 항까지 |
오차 sd가 에서 으로 내려가 참값 에 닿습니다.
| 무엇을 검정 | 와 값 |
|---|---|
| 더미가 필요한가 | , 자유도 , |
| 곱 항이 필요한가 | , 자유도 , |
둘 다 필요합니다. 곱 항은 두 개를 한꺼번에 검정해야 하며, 하나씩 로 보면 182강의 다중비교가 됩니다.
(2) 집단별 기울기를 되살립니다.
| 집단 | 모형이 말하는 기울기 | 참값 |
|---|---|---|
세 값이 참값에 정확히 닿습니다.
집단 의 기울기가 집단 과 거의 같습니다. 곱 계수가 에 가깝다는 뜻이며, 그 곱 항 하나는 사실 필요 없습니다.
필요한 곱 항만 넣는 것이 낫지만 어느 것이 필요한지는 미리 알기 어렵습니다. 자료를 보고 고르면 178강 문제 2의 두 단계 절차 문제가 되며, 189강에서 그 문제를 정면으로 다룹니다.
(3) 변수가 늘어나는 속도를 셉니다.
| 범주 수 | 더미 수 | 곱 항 수 | 연속변수 개면 |
|---|---|---|---|
범주가 이면 연속변수 두 개와의 곱까지 개가 됩니다.
185강 문제 4의 과적합이 바로 여기서 시작됩니다. 관측이 개인데 변수가 개면 자유도가 빠르게 사라집니다.
마지막으로 판단을 정리합니다.
| 상황 | 무엇을 하는가 |
|---|---|
| 범주에 순서가 없음 | 더미를 씁니다 |
| 범주에 순서가 있음 | 수로 넣거나 더미를 씁니다 |
| 범주가 아주 많음 | 묶거나 다른 방법을 씁니다 |
| 집단마다 기울기가 다름 | 곱 항을 넣습니다 |
| 곱 항을 넣었음 | 를 중심화합니다 |
| 집단 차이를 보고 | 값과 함께 적습니다 |
마지막 줄이 이 강의의 결론입니다. 곱 항이 있으면 차이가 하나의 수가 아닙니다.
이 문제에서 배우는 것. 범주가 많으면 더미가 답이 아닙니다. 우편번호나 상품 코드처럼 범주가 수천 개면 더미로는 다룰 수 없고, 비슷한 것끼리 묶거나 목표값으로 인코딩하거나 혼합효과 모형으로 범주를 확률변수로 두어야 합니다. 마지막 방법이 통계적으로 가장 깔끔한데, 각 범주의 효과가 전체 평균 쪽으로 당겨져 관측이 적은 범주에서 과하게 튀지 않습니다. 184강 심화 1의 평균으로의 회귀가 여기서 의도적인 장치가 되며, S9의 정규화와 같은 발상입니다.
바로 확인 5.
확인 5-1. 검산에서 세 모형의 오차 sd를 쓰세요.
답. , , 입니다.
확인 5-2. 검산에서 곱 항 두 개를 한꺼번에 검정한 를 쓰세요.
답. 이며 자유도는 입니다.
확인 5-3. 범주가 개일 때 더미와 곱 항의 수를 쓰세요.
답. 각각 개이며 연속변수가 둘이면 합쳐 개입니다.
| 무엇 | 어떻게 |
|---|---|
| 범주 개 | 더미 개 |
| 절편 | 기준 범주의 값 |
| 더미 계수 | 기준과의 차이 |
| 곱 계수 | 기울기의 차이 |
| 범주 전체 검정 | 더미를 한꺼번에 |
| 곱 항이 있을 때 | 무엇을 뜻하는가 |
|---|---|
| 계수 | 기준 집단의 기울기 |
| 계수 | 에서의 집단 차이 |
| 집단 차이 | |
| 기울기 차이 | 곱 계수 |
| 자주 하는 실수 | 바로잡기 |
|---|---|
| 범주에 번호를 그대로 씁니다 | 없는 간격을 만듭니다 |
| 더미를 전부 넣습니다 | 계수를 정할 수 없습니다 |
| 기준과의 비교만 봅니다 | 나머지 짝이 빠져 있습니다 |
| 더미를 하나씩 로 봅니다 | 한꺼번에 로 봅니다 |
| 곱 항이 있는데 계수를 집단 차이로 읽습니다 | 에서만 그렇습니다 |
| 중심화 없이 곱 항을 넣습니다 | 주효과가 뜻을 잃습니다 |
문제 6. 범주에 번호를 그대로 쓰면 무엇을 가정하는지 쓰세요.
답. 이웃한 범주 사이의 간격이 모두 같다고 가정합니다.
문제 7. 검산에서 번호 모형이 가운데 지역을 얼마로 예측하는지 쓰세요.
답. 인데 실제 평균은 입니다.
문제 8. 검산에서 더미 모형의 절편과 두 계수를 쓰세요.
답. 과 과 입니다.
문제 9. 더미변수 함정이 무엇인지 쓰세요.
답. 더미를 전부 넣으면 합이 상수열과 같아 계수를 하나로 정할 수 없습니다.
문제 10. 기준을 바꾸면 무엇이 변하고 무엇이 안 변하는지 쓰세요.
답. 계수와 절편은 변하고 과 예측은 안 변합니다.
문제 11. 검산에서 지역 과 의 차이와 값을 쓰세요.
답. 이고 는 입니다.
문제 12. 검산에서 더미 두 개를 한꺼번에 검정한 와 자유도를 쓰세요.
답. 이고 자유도는 와 입니다.
문제 13. 검산에서 덧셈 모형의 계수와 두 참 기울기를 쓰세요.
답. 이며 참 기울기는 과 입니다.
문제 14. 곱 항 모형에서 집단 의 기울기를 식으로 쓰세요.
답. 계수와 곱 계수를 더한 값입니다.
문제 15. 곱 항이 있을 때 계수의 뜻을 쓰세요.
답. 가 일 때의 집단 차이입니다.
문제 16. 검산에서 에서 를 뺐을 때 계수를 쓰세요.
답. 이며 계수와 곱 계수는 그대로입니다.
문제 17. 검산에서 집단 차이가 을 지나는 를 쓰세요.
답. 근처이며 그 자리의 차이가 입니다.
문제 18. 범주가 개일 때 더미와 곱 항의 수를 쓰세요.
답. 각각 개이며 연속변수가 둘이면 합쳐 개입니다.
심화 1. 다른 코딩 방식을 정리하세요.
기준 범주를 두는 것이 유일한 방법은 아닙니다.
| 이름 | 어떻게 | 절편의 뜻 |
|---|---|---|
| 처치 코딩 | 기준을 으로 | 기준의 평균 |
| 효과 코딩 | 기준을 로 | 전체 평균 |
| 헬머트 코딩 | 앞 범주들의 평균과 비교 | 전체 평균 |
둘째 줄이 분산분석의 관례입니다. 절편이 집단 평균들의 평균이 되고, 각 계수가 그 평균에서의 이탈이 됩니다.
어느 코딩이든 예측과 은 같습니다. 문제 2에서 기준을 바꿔도 이 같았던 것과 같은 이유이며, 같은 공간을 다른 좌표로 적은 것뿐입니다.
곱 항이 있으면 코딩이 주효과의 뜻을 바꿉니다. 효과 코딩에서는 계수가 집단들의 평균적인 기울기가 되어, 처치 코딩보다 해석이 나은 경우가 많습니다.
심화 2. 연속변수끼리의 곱을 정리하세요.
곱 항의 두 변수가 모두 연속일 수도 있습니다.
의 효과가 가 됩니다. 문제 4의 집단 차이가 의 함수였던 것과 같은 구조인데, 양쪽이 다 연속이라 더 복잡합니다.
| 무엇을 조심하는가 | 왜 |
|---|---|
| 중심화 | 주효과가 자리에서의 값입니다 |
| 다중공선성 | 곱 항이 원래 변수와 상관됩니다 |
| 외삽 | 곱은 구석에서 빠르게 커집니다 |
둘째 줄이 187강의 주제입니다. 중심화하면 곱 항과 원래 변수의 상관이 크게 줄어, 다중공선성이 상당히 완화됩니다.
셋째 줄이 예측에서 위험합니다. 과 가 둘 다 큰 자리가 자료에 없으면, 곱 항이 그 구석에서 아무 근거 없이 큰 값을 냅니다.
심화 3. 곱 항 없이 굽은 관계를 담는 법을 정리하세요.
185강 심화 3에서 을 변수로 넣는 것을 봤습니다. 같은 발상을 더 밀면 조각별 함수가 됩니다.
| 방법 | 어떻게 |
|---|---|
| 다항식 | 을 넣습니다 |
| 구간 더미 | 를 구간으로 나눠 더미로 |
| 스플라인 | 매듭에서 이어 붙인 다항식 |
첫째 줄은 차수가 오르면 끝에서 요동칩니다. 184강 문제 5의 외삽 위험이 심해집니다.
둘째 줄은 169강 문제 1의 히스토그램과 같은 문제를 갖습니다. 구간의 폭과 시작점을 골라야 하고, 그 선택이 결과를 바꿉니다.
셋째 줄이 실무의 기본값입니다. 매듭에서 값과 기울기가 이어지도록 묶으므로 매끄럽고, 매듭 수만 정하면 됩니다.
심화 4. 심슨의 역설을 회귀로 보는 법을 정리하세요.
153강과 166강의 역설이 집단별 기울기로 설명됩니다.
| 무엇 | 어떻게 나타나는가 |
|---|---|
| 전체 회귀 | 기울기가 양수 |
| 집단별 회귀 | 모든 집단에서 음수 |
| 더미를 넣으면 | 기울기가 음수로 바뀜 |
집단마다 의 수준이 다르고 의 수준도 다르면 전체 기울기가 집단 간 차이에 끌려갑니다.
더미를 넣는 것이 집단 간 성분을 걷어 내는 일입니다. 185강 문제 2의 프리슈-워-로벨로 보면, 집단 평균을 뺀 잔차끼리 회귀하는 것과 같습니다.
곱 항까지 넣으면 집단마다 다른 기울기를 볼 수 있습니다. 역설이 사라지는 것이 아니라 어디서 왔는지가 보입니다.
심화 5. 범주가 아주 많을 때를 정리하세요.
| 방법 | 어떻게 | 위험 |
|---|---|---|
| 묶기 | 드문 범주를 기타로 | 정보를 버립니다 |
| 목표 인코딩 | 범주별 평균을 값으로 | 누출이 생깁니다 |
| 혼합효과 | 범주 효과를 확률변수로 | 계산이 무겁습니다 |
둘째 줄의 누출이 162강 문제 2 그대로입니다. 로 만든 값을 설명변수로 쓰므로, 분할 안에서 계산하지 않으면 검증 성능이 부풀어 오릅니다.
셋째 줄이 통계적으로 가장 깔끔합니다.
관측이 적은 범주일수록 전체 평균 쪽으로 당겨집니다. 관측이 셋뿐인 범주에 그 셋의 평균을 그대로 주면 튀는데, 그 튐을 미리 줄여 둡니다.
심화 6. 이 강의가 어디에 쓰이는지 정리하세요.
| 분야 | 쓰임 | 이어지는 강의 |
|---|---|---|
| 변수끼리 얽힘 | 곱 항의 공선성 | 187강 |
| 변수 선택 | 곱 항을 고를 때 | 189강 |
| 처치효과 | 이질적 효과 | 191강 |
| 특징 공학 | 범주형 인코딩 | S9 |
셋째 줄이 가장 중요한 확장입니다. 문제 4에서 집단 차이가 의 함수였는데, 인과추론에서는 처치효과가 사람마다 다른 것으로 나타납니다.
평균 하나로 정책을 정하면 어떤 사람에게는 해로울 수 있습니다. 문제 4에서 인 사람들에게는 효과가 음수였던 것과 같으며, 191강 이후 이 문제를 정면으로 다룹니다.
정답.
| 기호 | 읽는 법 | 뜻 |
|---|---|---|
| d_ | 더미변수 | 그 범주이면 입니다 |
| 기준 범주 | reference category | 더미를 안 붙인 범주입니다 |
| 더미변수 함정 | dummy variable trap | 더미를 전부 넣어 생기는 종속입니다 |
| 교호작용 | interaction | 한 변수의 효과가 다른 변수에 따라 다릅니다 |
| 주효과 | main effect | 곱 항 없이 붙은 계수입니다 |
| 중심화 | centering | 평균을 빼 원점을 옮깁니다 |
| 처치 코딩 | treatment coding | 기준을 으로 두는 방식입니다 |
| 효과 코딩 | effect coding | 기준을 로 두는 방식입니다 |
| 조각별 선형 | piecewise linear | 구간마다 다른 직선입니다 |
| 스플라인 | spline | 매듭에서 매끄럽게 이은 다항식입니다 |
| 목표 인코딩 | target encoding | 범주별 평균을 값으로 씁니다 |
| 혼합효과 | mixed effects | 범주 효과를 확률변수로 둡니다 |
| 이질적 효과 | heterogeneous effect | 대상마다 다른 효과입니다 |
다음은 187강 다중공선성입니다. 이 강의에서 변수를 계속 늘렸습니다.
문제 5에서 범주 개에 곱 항까지 개를 만들었는데, 그 변수들이 서로 비슷하게 움직입니다. 185강 심화 2에서 가 거의 뒤집히지 않는 경우를 예고했는데, 187강은 그때 계수가 어떻게 폭발하는지와 왜 예측은 멀쩡한지를 다룹니다.
import numpy as np
rng = np.random.default_rng(20260923)
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)
try:
se = np.sqrt(s2 * np.diag(np.linalg.inv(A.T @ A)))
except np.linalg.LinAlgError:
se = np.full(p, np.nan)
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)
def ftest(mfull, msmall):
q = mfull["p"] - msmall["p"]
fv = ((msmall["sse"] - mfull["sse"]) / q) / (mfull["sse"] / mfull["df"])
return fv, q, mfull["df"], f_sf(fv, q, mfull["df"])
# --- 문제 1: 범주를 수로 적는 법 ----------------------------------------
print(" 184강에서 집단 둘을 0 과 1 로 적었습니다. 셋이면 어떻게 합니까")
N1 = 900
g1 = np.repeat([0, 1, 2], N1 // 3)
mu = np.array([10.0, 13.0, 12.0])
y1 = mu[g1] + rng.normal(0, 2.0, N1)
print(" 세 지역의 참 평균은 10.0, 13.0, 12.0 입니다")
print(" %s %s %s" % (pw("지역", 10), rw("표본 평균", 14), rw("크기", 10)))
for k in range(3):
print(" %s %14.6f %10d"
% (pw("%d" % k, 10), float(y1[g1 == k].mean()), int((g1 == k).sum())))
print(" 범주에 번호를 그대로 쓰면 안 됩니다")
mnum = ols(y1, g1.astype(float))
print(" 지역을 0, 1, 2 라는 수로 넣고 회귀하면 기울기가 %.6f 입니다" % mnum["b"][1])
print(" 이 값은 지역이 1 늘 때의 변화라는 뜻인데 지역에 그런 순서가 없습니다")
print(" %s %s %s" % (pw("지역", 10), rw("이 모형의 예측", 16), rw("실제 평균", 14)))
for k in range(3):
print(" %s %16.6f %14.6f"
% (pw("%d" % k, 10), mnum["b"][0] + mnum["b"][1] * k, float(y1[g1 == k].mean())))
print(" 가운데 지역의 예측이 실제와 크게 어긋납니다. 직선에 억지로 끼웠기 때문입니다")
print(" 더미변수를 쓰면 각 범주가 자기 값을 갖습니다")
d1 = (g1 == 1).astype(float)
d2 = (g1 == 2).astype(float)
md = ols(y1, d1, d2)
print(" 기준 범주를 0 으로 두고 나머지에 더미를 하나씩 붙입니다")
print(" %s %s %s %s" % (pw("계수", 16), rw("값", 14), rw("표준오차", 12), rw("뜻", 24)))
for i, nm, msg in [(0, "절편", "기준 지역의 평균"),
(1, "지역 1 더미", "기준과의 차이"),
(2, "지역 2 더미", "기준과의 차이")]:
print(" %s %14.6f %12.6f %s" % (pw(nm, 16), md["b"][i], md["se"][i], rw(msg, 24)))
print(" %s %s %s" % (pw("지역", 10), rw("이 모형의 예측", 16), rw("실제 평균", 14)))
for k, pred in [(0, md["b"][0]), (1, md["b"][0] + md["b"][1]), (2, md["b"][0] + md["b"][2])]:
print(" %s %16.6f %14.6f" % (pw("%d" % k, 10), pred, float(y1[g1 == k].mean())))
print(" 세 예측이 세 평균과 정확히 같습니다. 더미가 평균을 그대로 담습니다")
print(" 더미를 셋 다 넣으면 안 됩니다")
d0 = (g1 == 0).astype(float)
mall = ols(y1, d0, d1, d2)
print(" d0 + d1 + d2 가 모든 행에서 1 이라 상수열과 똑같습니다")
print(" 절편과 완전히 겹쳐 행렬이 뒤집히지 않습니다. 이것을 더미변수 함정이라 합니다")
print(" %s %s %s" % (pw("무엇", 22), rw("두 개만 넣음", 16), rw("셋 다 넣음", 16)))
print(" %s %16.6f %16.6f" % (pw("잔차 제곱합", 22), md["sse"], mall["sse"]))
print(" %s %16.6f %16.6f" % (pw("R^2", 22), md["r2"], mall["r2"]))
print(" 예측은 같습니다. 다만 계수를 하나로 정할 수 없습니다")
print(" 절편에 c 를 더하고 더미 셋에서 c 를 빼도 예측이 그대로인지 봅니다")
Afull = np.stack([np.ones(N1), d0, d1, d2], axis=1)
print(" %s %s %s" % (pw("c", 10), rw("예측의 최대 차이", 20), rw("잔차 제곱합", 16)))
for c in [0.0, 1.0, 5.0, 100.0]:
bb = mall["b"] + np.array([c, -c, -c, -c])
pr = Afull @ bb
print(" %s %20.10f %16.6f"
% (pw("%.0f" % c, 10), float(np.abs(pr - Afull @ mall["b"]).max()),
float(((y1 - pr) ** 2).sum())))
print(" c 가 무엇이든 예측과 잔차가 똑같습니다. 계수가 무한히 많습니다")
print(" 그래서 계수 하나를 집어 해석할 수가 없습니다")
# --- 문제 2: 기준을 무엇으로 두는가 -------------------------------------
print(" 기준 범주를 바꾸면 계수가 바뀝니다")
print(" %s %s %s %s %s" % (pw("기준", 12), rw("절편", 12), rw("첫째 계수", 14),
rw("둘째 계수", 14), rw("R^2", 12)))
for base in range(3):
others = [k for k in range(3) if k != base]
dd = [(g1 == k).astype(float) for k in others]
mm = ols(y1, *dd)
print(" %s %12.6f %14.6f %14.6f %12.6f"
% (pw("지역 %d" % base, 12), mm["b"][0], mm["b"][1], mm["b"][2], mm["r2"]))
print(" 절편과 계수가 다 다른데 R^2 은 소수 아래까지 같습니다")
print(" 같은 모형을 다르게 적었을 뿐입니다. 예측도 같습니다")
print(" 무엇이 기준이냐로 유의성도 바뀝니다")
print(" %s %s %s %s" % (pw("기준", 12), rw("비교", 16), rw("차이", 12), rw("p 값", 14)))
for base in range(3):
others = [k for k in range(3) if k != base]
dd = [(g1 == k).astype(float) for k in others]
mm = ols(y1, *dd)
for j, k in enumerate(others):
tv = mm["b"][j + 1] / mm["se"][j + 1]
print(" %s %s %12.6f %14.10f"
% (pw("지역 %d" % base, 12), rw("%d 대 %d" % (k, base), 16),
mm["b"][j + 1], t_p2(tv, mm["df"])))
print(" 지역 1 과 2 의 차이는 기준이 0 일 때 직접 안 나옵니다")
print(" 모든 짝을 보려면 기준을 바꿔 가며 봐야 하고 그러면 다중비교가 됩니다")
print(" 범주 전체가 필요한지는 F 로 한 번에 봅니다")
sse0 = ((y1 - y1.mean()) ** 2).sum()
fv2 = ((sse0 - md["sse"]) / 2) / (md["sse"] / md["df"])
print(" 더미 두 개를 한꺼번에 검정합니다")
print(" %s %s" % (pw("무엇", 26), rw("값", 18)))
for nm, v in [("절편만인 모형의 잔차", sse0), ("더미를 넣은 잔차", md["sse"]),
("F 통계량", fv2), ("자유도 분자", 2.0), ("자유도 분모", float(md["df"]))]:
print(" %s %18.6f" % (pw(nm, 26), v))
print(" p 값은 %.10f 입니다" % f_sf(fv2, 2, md["df"]))
print(" 180강의 분산분석과 정확히 같은 값입니다. 더미 회귀가 분산분석입니다")
# --- 문제 3: 기울기가 집단마다 다르면 -----------------------------------
print(" 지금까지는 집단이 절편만 바꿨습니다")
N3 = 1200
g3 = rng.integers(0, 2, N3).astype(float)
x3 = rng.normal(0, 1, N3)
y3 = 2.0 + 1.0 * x3 + 3.0 * g3 + 2.0 * x3 * g3 + rng.normal(0, 1.0, N3)
print(" 참 모형은 y = 2 + 1 x + 3 g + 2 x g 입니다")
print(" 집단 0 의 기울기는 1.0 이고 집단 1 의 기울기는 3.0 입니다")
madd = ols(y3, x3, g3)
mint = ols(y3, x3, g3, x3 * g3)
print(" %s %s %s %s %s" % (pw("모형", 18), rw("x 계수", 12), rw("g 계수", 12),
rw("곱 계수", 12), rw("R^2", 12)))
print(" %s %12.6f %12.6f %12s %12.6f"
% (pw("덧셈만", 18), madd["b"][1], madd["b"][2], rw("없음", 12), madd["r2"]))
print(" %s %12.6f %12.6f %12.6f %12.6f"
% (pw("곱 항을 넣음", 18), mint["b"][1], mint["b"][2], mint["b"][3], mint["r2"]))
print(" 덧셈만 하면 x 계수가 두 기울기의 가운데쯤에 놓입니다")
print(" 어느 집단에도 맞지 않는 값이며 곱 항을 넣어야 갈립니다")
print(" 집단별로 따로 회귀한 것과 같은지 봅니다")
m0 = ols(y3[g3 == 0], x3[g3 == 0])
m1b = ols(y3[g3 == 1], x3[g3 == 1])
print(" %s %s %s" % (pw("무엇", 26), rw("따로 회귀", 16), rw("곱 항 모형에서", 18)))
print(" %s %16.6f %18.6f" % (pw("집단 0 의 절편", 26), m0["b"][0], mint["b"][0]))
print(" %s %16.6f %18.6f" % (pw("집단 0 의 기울기", 26), m0["b"][1], mint["b"][1]))
print(" %s %16.6f %18.6f" % (pw("집단 1 의 절편", 26), m1b["b"][0],
mint["b"][0] + mint["b"][2]))
print(" %s %16.6f %18.6f" % (pw("집단 1 의 기울기", 26), m1b["b"][1],
mint["b"][1] + mint["b"][3]))
print(" 네 값이 모두 같습니다. 곱 항 모형은 두 회귀를 한꺼번에 적은 것입니다")
print(" 다만 하나로 적으면 오차분산을 공유해 자유도가 늘고 검정을 함께 할 수 있습니다")
print(" 곱 항이 필요한지 F 로 검정합니다")
fv3, q3, df3, p3 = ftest(mint, madd)
print(" %s %s" % (pw("무엇", 26), rw("값", 18)))
for nm, v in [("덧셈 모형의 잔차", madd["sse"]), ("곱 항 모형의 잔차", mint["sse"]),
("F 통계량", fv3), ("자유도", float(q3))]:
print(" %s %18.6f" % (pw(nm, 26), v))
print(" p 값은 %.10f 입니다. 곱 항이 필요합니다" % p3)
# --- 문제 4: 곱 항이 있으면 계수를 어떻게 읽는가 -------------------------
print(" 곱 항이 있으면 주효과의 뜻이 달라집니다")
print(" %s %s" % (pw("계수", 16), rw("무엇을 뜻하는가", 34)))
for a, b in [("x 계수", "g 가 0 일 때의 x 기울기"),
("g 계수", "x 가 0 일 때의 집단 차이"),
("곱 계수", "집단에 따른 기울기 차이")]:
print(" %s %s" % (pw(a, 16), rw(b, 34)))
print(" 둘째 줄이 함정입니다. x 가 0 이 뜻이 없으면 g 계수도 뜻이 없습니다")
print(" x 를 옮기면 g 계수가 바뀝니다")
print(" %s %s %s %s" % (pw("x 를 어디서 재는가", 24), rw("x 계수", 12),
rw("g 계수", 12), rw("곱 계수", 12)))
for nm, shift in [("원래 그대로", 0.0), ("평균을 뺌", float(x3.mean())),
("2 를 뺌", 2.0), ("5 를 뺌", 5.0)]:
xc = x3 - shift
mm = ols(y3, xc, g3, xc * g3)
print(" %s %12.6f %12.6f %12.6f"
% (pw(nm, 24), mm["b"][1], mm["b"][2], mm["b"][3]))
print(" x 계수와 곱 계수는 안 변하는데 g 계수만 크게 움직입니다")
print(" g 계수가 x = 0 인 자리에서의 차이라 기준점이 옮겨 가기 때문입니다")
print(" 그래서 곱 항을 넣을 때는 x 를 중심화하는 것이 관례입니다")
print(" 집단 차이를 x 값마다 계산합니다")
print(" %s %s %s %s" % (pw("x 값", 10), rw("집단 차이", 14), rw("표준오차", 14),
rw("95 구간이 0 을 넣는가", 24)))
tc = 1.9600
for xv in [-2.0, -1.5, -1.0, 0.0, 1.0, 2.0]:
A = np.stack([np.ones(N3), x3, g3, x3 * g3], axis=1)
V = mint["s2"] * np.linalg.inv(A.T @ A)
c = np.array([0.0, 0.0, 1.0, xv])
est = float(c @ mint["b"])
sd = float(np.sqrt(c @ V @ c))
print(" %s %14.6f %14.6f %s"
% (pw("%.1f" % xv, 10), est, sd,
rw("예" if abs(est) < tc * sd else "아니오", 24)))
print(" x 가 -1.5 근처에서 집단 차이가 0 을 지납니다")
print(" 곱 항이 있으면 집단 차이가 하나의 수가 아니라 x 의 함수입니다")
print(" 그래서 g 계수 하나만 보고 집단 차이를 말하면 안 됩니다")
# --- 문제 5: 범주가 여럿이고 곱 항까지 있으면 ---------------------------
print(" 범주가 여럿이면 곱 항도 여럿입니다")
N5 = 1800
g5 = np.repeat([0, 1, 2], N5 // 3)
x5 = rng.normal(0, 1, N5)
inter = np.array([2.0, 5.0, 3.0])
slope = np.array([1.0, 1.0, 4.0])
y5 = inter[g5] + slope[g5] * x5 + rng.normal(0, 1.0, N5)
e1 = (g5 == 1).astype(float)
e2 = (g5 == 2).astype(float)
print(" 세 집단의 참 절편은 2, 5, 3 이고 참 기울기는 1, 1, 4 입니다")
mA = ols(y5, x5)
mB = ols(y5, x5, e1, e2)
mC = ols(y5, x5, e1, e2, x5 * e1, x5 * e2)
print(" %s %s %s %s %s" % (pw("모형", 24), rw("계수 수", 10), rw("잔차 제곱합", 16),
rw("R^2", 12), rw("오차 sd", 12)))
for nm, mm in [("x 만", mA), ("x 와 더미", mB), ("곱 항까지", mC)]:
print(" %s %10d %16.6f %12.6f %12.6f"
% (pw(nm, 24), mm["p"], mm["sse"], mm["r2"], np.sqrt(mm["s2"])))
print(" %s %s" % (pw("무엇을 검정", 26), rw("F 와 p 값", 30)))
f1v, q1, d1v, p1v = ftest(mB, mA)
f2v, q2, d2v, p2v = ftest(mC, mB)
print(" %s %s" % (pw("더미가 필요한가", 26),
rw("F = %.4f, 자유도 %d, p = %.10f" % (f1v, q1, p1v), 30)))
print(" %s %s" % (pw("곱 항이 필요한가", 26),
rw("F = %.4f, 자유도 %d, p = %.10f" % (f2v, q2, p2v), 30)))
print(" 둘 다 필요합니다. 곱 항은 두 개를 한꺼번에 검정해야 합니다")
print(" 곱 항 모형에서 집단별 기울기를 되살립니다")
print(" %s %s %s" % (pw("집단", 10), rw("모형이 말하는 기울기", 22), rw("참값", 12)))
for k, expr, tv in [(0, mC["b"][1], 1.0),
(1, mC["b"][1] + mC["b"][4], 1.0),
(2, mC["b"][1] + mC["b"][5], 4.0)]:
print(" %s %22.6f %12.1f" % (pw("%d" % k, 10), expr, tv))
print(" 집단 1 의 기울기는 집단 0 과 거의 같습니다. 곱 계수가 0 에 가깝습니다")
print(" 필요한 곱 항만 넣는 것이 낫지만 어느 것이 필요한지는 미리 알기 어렵습니다")
print(" 변수가 늘어나는 속도를 셉니다")
print(" %s %s %s %s" % (pw("범주 수", 10), rw("더미 수", 12), rw("곱 항 수", 12),
rw("연속변수 2 개면", 18)))
for k in [2, 3, 5, 10, 20]:
print(" %s %12d %12d %18d"
% (pw("%d" % k, 10), k - 1, k - 1, (k - 1) * 3))
print(" 범주가 20 이면 연속변수 두 개와의 곱까지 57 개가 됩니다")
print(" 185강 문제 4 의 과적합이 바로 여기서 시작됩니다")
print(" 범주형을 다룰 때의 판단을 정리합니다")
print(" %s %s" % (pw("상황", 28), rw("무엇을 하는가", 26)))
for a, b in [("범주에 순서가 없음", "더미를 씁니다"),
("범주에 순서가 있음", "수로 넣거나 더미를 씁니다"),
("범주가 아주 많음", "묶거나 다른 방법을 씁니다"),
("집단마다 기울기가 다름", "곱 항을 넣습니다"),
("곱 항을 넣었음", "x 를 중심화합니다"),
("집단 차이를 보고", "x 값과 함께 적습니다")]:
print(" %s %s" % (pw(a, 28), rw(b, 26)))
print(" 마지막 줄이 이 강의의 결론입니다. 곱 항이 있으면 차이가 하나의 수가 아닙니다")
# 184강에서 집단 둘을 0 과 1 로 적었습니다. 셋이면 어떻게 합니까
# 세 지역의 참 평균은 10.0, 13.0, 12.0 입니다
# 지역 표본 평균 크기
# 0 9.781881 300
# 1 12.864564 300
# 2 12.147746 300
# 범주에 번호를 그대로 쓰면 안 됩니다
# 지역을 0, 1, 2 라는 수로 넣고 회귀하면 기울기가 1.182933 입니다
# 이 값은 지역이 1 늘 때의 변화라는 뜻인데 지역에 그런 순서가 없습니다
# 지역 이 모형의 예측 실제 평균
# 0 10.415131 9.781881
# 1 11.598064 12.864564
# 2 12.780996 12.147746
# 가운데 지역의 예측이 실제와 크게 어긋납니다. 직선에 억지로 끼웠기 때문입니다
# 더미변수를 쓰면 각 범주가 자기 값을 갖습니다
# 기준 범주를 0 으로 두고 나머지에 더미를 하나씩 붙입니다
# 계수 값 표준오차 뜻
# 절편 9.781881 0.118422 기준 지역의 평균
# 지역 1 더미 3.082683 0.167474 기준과의 차이
# 지역 2 더미 2.365865 0.167474 기준과의 차이
# 지역 이 모형의 예측 실제 평균
# 0 9.781881 9.781881
# 1 12.864564 12.864564
# 2 12.147746 12.147746
# 세 예측이 세 평균과 정확히 같습니다. 더미가 평균을 그대로 담습니다
# 더미를 셋 다 넣으면 안 됩니다
# d0 + d1 + d2 가 모든 행에서 1 이라 상수열과 똑같습니다
# 절편과 완전히 겹쳐 행렬이 뒤집히지 않습니다. 이것을 더미변수 함정이라 합니다
# 무엇 두 개만 넣음 셋 다 넣음
# 잔차 제곱합 3773.796459 3773.796459
# R^2 0.292661 0.292661
# 예측은 같습니다. 다만 계수를 하나로 정할 수 없습니다
# 절편에 c 를 더하고 더미 셋에서 c 를 빼도 예측이 그대로인지 봅니다
# c 예측의 최대 차이 잔차 제곱합
# 0 0.0000000000 3773.796459
# 1 0.0000000000 3773.796459
# 5 0.0000000000 3773.796459
# 100 0.0000000000 3773.796459
# c 가 무엇이든 예측과 잔차가 똑같습니다. 계수가 무한히 많습니다
# 그래서 계수 하나를 집어 해석할 수가 없습니다
# 기준 범주를 바꾸면 계수가 바뀝니다
# 기준 절편 첫째 계수 둘째 계수 R^2
# 지역 0 9.781881 3.082683 2.365865 0.292661
# 지역 1 12.864564 -3.082683 -0.716818 0.292661
# 지역 2 12.147746 -2.365865 0.716818 0.292661
# 절편과 계수가 다 다른데 R^2 은 소수 아래까지 같습니다
# 같은 모형을 다르게 적었을 뿐입니다. 예측도 같습니다
# 무엇이 기준이냐로 유의성도 바뀝니다
# 기준 비교 차이 p 값
# 지역 0 1 대 0 3.082683 0.0000000000
# 지역 0 2 대 0 2.365865 0.0000000000
# 지역 1 0 대 1 -3.082683 0.0000000000
# 지역 1 2 대 1 -0.716818 0.0000206843
# 지역 2 0 대 2 -2.365865 0.0000000000
# 지역 2 1 대 2 0.716818 0.0000206843
# 지역 1 과 2 의 차이는 기준이 0 일 때 직접 안 나옵니다
# 모든 짝을 보려면 기준을 바꿔 가며 봐야 하고 그러면 다중비교가 됩니다
# 범주 전체가 필요한지는 F 로 한 번에 봅니다
# 더미 두 개를 한꺼번에 검정합니다
# 무엇 값
# 절편만인 모형의 잔차 5335.204741
# 더미를 넣은 잔차 3773.796459
# F 통계량 185.566875
# 자유도 분자 2.000000
# 자유도 분모 897.000000
# p 값은 0.0000000000 입니다
# 180강의 분산분석과 정확히 같은 값입니다. 더미 회귀가 분산분석입니다
# 지금까지는 집단이 절편만 바꿨습니다
# 참 모형은 y = 2 + 1 x + 3 g + 2 x g 입니다
# 집단 0 의 기울기는 1.0 이고 집단 1 의 기울기는 3.0 입니다
# 모형 x 계수 g 계수 곱 계수 R^2
# 덧셈만 2.087341 2.999498 없음 0.770146
# 곱 항을 넣음 1.026056 3.056224 2.008251 0.885043
# 덧셈만 하면 x 계수가 두 기울기의 가운데쯤에 놓입니다
# 어느 집단에도 맞지 않는 값이며 곱 항을 넣어야 갈립니다
# 집단별로 따로 회귀한 것과 같은지 봅니다
# 무엇 따로 회귀 곱 항 모형에서
# 집단 0 의 절편 1.999917 1.999917
# 집단 0 의 기울기 1.026056 1.026056
# 집단 1 의 절편 5.056141 5.056141
# 집단 1 의 기울기 3.034307 3.034307
# 네 값이 모두 같습니다. 곱 항 모형은 두 회귀를 한꺼번에 적은 것입니다
# 다만 하나로 적으면 오차분산을 공유해 자유도가 늘고 검정을 함께 할 수 있습니다
# 곱 항이 필요한지 F 로 검정합니다
# 무엇 값
# 덧셈 모형의 잔차 2470.330917
# 곱 항 모형의 잔차 1235.481685
# F 통계량 1195.387758
# 자유도 1.000000
# p 값은 0.0000000000 입니다. 곱 항이 필요합니다
# 곱 항이 있으면 주효과의 뜻이 달라집니다
# 계수 무엇을 뜻하는가
# x 계수 g 가 0 일 때의 x 기울기
# g 계수 x 가 0 일 때의 집단 차이
# 곱 계수 집단에 따른 기울기 차이
# 둘째 줄이 함정입니다. x 가 0 이 뜻이 없으면 g 계수도 뜻이 없습니다
# x 를 옮기면 g 계수가 바뀝니다
# x 를 어디서 재는가 x 계수 g 계수 곱 계수
# 원래 그대로 1.026056 3.056224 2.008251
# 평균을 뺌 1.026056 3.005873 2.008251
# 2 를 뺌 1.026056 7.072726 2.008251
# 5 를 뺌 1.026056 13.097479 2.008251
# x 계수와 곱 계수는 안 변하는데 g 계수만 크게 움직입니다
# g 계수가 x = 0 인 자리에서의 차이라 기준점이 옮겨 가기 때문입니다
# 그래서 곱 항을 넣을 때는 x 를 중심화하는 것이 관례입니다
# 집단 차이를 x 값마다 계산합니다
# x 값 집단 차이 표준오차 95 구간이 0 을 넣는가
# -2.0 -0.960278 0.128730 아니오
# -1.5 0.043847 0.103742 예
# -1.0 1.047973 0.081489 아니오
# 0.0 3.056224 0.058798 아니오
# 1.0 5.064475 0.083795 아니오
# 2.0 7.072726 0.131658 아니오
# x 가 -1.5 근처에서 집단 차이가 0 을 지납니다
# 곱 항이 있으면 집단 차이가 하나의 수가 아니라 x 의 함수입니다
# 그래서 g 계수 하나만 보고 집단 차이를 말하면 안 됩니다
# 범주가 여럿이면 곱 항도 여럿입니다
# 세 집단의 참 절편은 2, 5, 3 이고 참 기울기는 1, 1, 4 입니다
# 모형 계수 수 잔차 제곱합 R^2 오차 sd
# x 만 2 8262.300278 0.474298 2.143659
# x 와 더미 4 5526.604310 0.648361 1.754188
# 곱 항까지 6 1910.082746 0.878468 1.031846
# 무엇을 검정 F 와 p 값
# 더미가 필요한가 F = 444.5144, 자유도 2, p = 0.0000000000
# 곱 항이 필요한가 F = 1698.3661, 자유도 2, p = 0.0000000000
# 둘 다 필요합니다. 곱 항은 두 개를 한꺼번에 검정해야 합니다
# 곱 항 모형에서 집단별 기울기를 되살립니다
# 집단 모형이 말하는 기울기 참값
# 0 1.004164 1.0
# 1 0.993238 1.0
# 2 3.989680 4.0
# 집단 1 의 기울기는 집단 0 과 거의 같습니다. 곱 계수가 0 에 가깝습니다
# 필요한 곱 항만 넣는 것이 낫지만 어느 것이 필요한지는 미리 알기 어렵습니다
# 변수가 늘어나는 속도를 셉니다
# 범주 수 더미 수 곱 항 수 연속변수 2 개면
# 2 1 1 3
# 3 2 2 6
# 5 4 4 12
# 10 9 9 27
# 20 19 19 57
# 범주가 20 이면 연속변수 두 개와의 곱까지 57 개가 됩니다
# 185강 문제 4 의 과적합이 바로 여기서 시작됩니다
# 범주형을 다룰 때의 판단을 정리합니다
# 상황 무엇을 하는가
# 범주에 순서가 없음 더미를 씁니다
# 범주에 순서가 있음 수로 넣거나 더미를 씁니다
# 범주가 아주 많음 묶거나 다른 방법을 씁니다
# 집단마다 기울기가 다름 곱 항을 넣습니다
# 곱 항을 넣었음 x 를 중심화합니다
# 집단 차이를 보고 x 값과 함께 적습니다
# 마지막 줄이 이 강의의 결론입니다. 곱 항이 있으면 차이가 하나의 수가 아닙니다