196강 문제 2에서 자기상관의 모양으로 구조를 읽었습니다. 지수적으로 줄어드는 것, 뒤로 끊기는 것, 천천히 줄어드는 것이 있었습니다.
부품은 둘뿐입니다. 어제 값을 되먹이거나, 어제 잡음을 섞거나입니다.
왼쪽이 되먹임이고 오른쪽이 이동평균입니다. 둘의 자기상관 모양이 정반대이므로, 두 그림을 나란히 놓으면 어느 부품인지 알 수 있습니다.
이 강의는 두 부품의 성질을 재고, 차수를 고르는 절차를 세우고, 그 모형으로 예측하고 구간을 다는 데까지 갑니다.
문제. 어제 값을 되먹입니다.
(1) 계수를 바꿔 가며 성질을 재세요.
(2) 정상 조건을 찾으세요.
(3) 두 그림을 함께 보세요.
생각의 실마리. 입니다. 어제의 배에 새 잡음을 더합니다.
풀이. (1) 계수를 바꿔 봅니다.
| 표준편차 | 이론 표준편차 | 시차 상관 | 시차 상관 | |
|---|---|---|---|---|
의 절댓값이 커지면 표준편차도 커집니다. 잡음이 쌓이기 때문입니다.
시차 상관이 와 같습니다. , , 입니다.
가 음수면 상관이 시차마다 부호를 바꿉니다. 톱니 모양이 됩니다.
(2) 정상 조건을 찾습니다.
| 이론 표준편차 | 시차 상관 | 정상인가 | |
|---|---|---|---|
| 예 | |||
| 예 | |||
| 예 | |||
| 발산 | 아니오 |
가 이면 분산이 무한대로 갑니다. 196강 문제 2의 누적합입니다.
절댓값이 보다 작아야 정상입니다. 이것이 되먹임의 조건입니다.
는 정상이지만 시차 에서도 입니다. 조건을 겨우 만족하는 자료는 누적합과 구분하기 어려우며, 그것이 198강의 물음입니다.
(3) 두 그림을 함께 봅니다. 두 칸 되먹임 자료이고 계수는 과 입니다.
| 시차 | 자기상관 | 부분자기상관 |
|---|---|---|
자기상관은 에서 로 천천히 줄어드는데 부분자기상관은 시차 뒤로 끊깁니다.
시차 의 부분자기상관 이 참 계수 와 같습니다.
끊기는 자리가 차수입니다. 이것이 되먹임 차수를 고르는 법입니다.
이 문제에서 배우는 것. 부분자기상관이 하는 일은 185강의 다중회귀와 같습니다. 시차 의 자기상관 에는 "시차 을 거쳐 온 몫"이 섞여 있고, 그것을 통제하고 남은 것이 입니다. 185강 문제 1에서 만 넣으면 이던 계수가 를 넣으면 가 됐던 것과 정확히 같은 계산이며, 여기서는 중간 시점이 그 의 역할을 합니다.
바로 확인 1.
확인 1-1. 되먹임의 정상 조건을 쓰세요.
답. 계수의 절댓값이 보다 작아야 합니다.
확인 1-2. 검산에서 가 일 때의 이론 표준편차와 시차 상관을 쓰세요.
답. 와 입니다.
확인 1-3. 검산에서 두 칸 되먹임의 시차 부분자기상관을 쓰고 무엇과 같은지 쓰세요.
답. 이며 참 계수 와 같습니다.
문제. 어제 잡음을 섞습니다.
(1) 계수를 바꿔 가며 성질을 재세요.
(2) 자기상관의 상한을 찾으세요.
(3) 되먹임과 견주세요.
생각의 실마리. 입니다. 어제 값이 아니라 어제 잡음을 씁니다.
풀이. (1) 계수를 바꿔 봅니다.
| 시차 상관 | 이론값 | 시차 상관 | 표준편차 | |
|---|---|---|---|---|
시차 부터는 근처입니다. 잡음이 한 칸만 겹치기 때문이며, 와 는 공통 잡음이 없습니다.
이 식은 가 무엇이든 언제나 정상입니다. 되먹임과 달리 조건이 없으며, 유한한 개수의 잡음만 더하기 때문입니다.
(2) 자기상관의 상한을 찾습니다.
| 시차 상관 | |
|---|---|
가 일 때 로 가장 큽니다. 그보다 크면 다시 줄어듭니다.
한 칸 이동평균의 시차 상관은 를 넘을 수 없습니다. 자료의 시차 상관이 이면 한 칸 이동평균으로는 설명이 안 됩니다.
와 가 같은 자기상관을 냅니다. 와 이 둘 다 이므로 둘을 못 가립니다.
절댓값이 아래인 쪽을 고르는 것이 관례이며, 이것을 가역성이라 합니다.
(3) 되먹임과 견줍니다. 한 칸 이동평균 자료의 두 그림입니다.
| 시차 | 자기상관 | 부분자기상관 |
|---|---|---|
자기상관은 시차 뒤로 끊기고 부분자기상관은 천천히 줄어듭니다.
부분자기상관이 에서 과 로 부호를 바꾸며 줄어듭니다.
| 무엇을 보는가 | 되먹임 차 | 이동평균 차 |
|---|---|---|
| 자기상관 | 천천히 줄어듦 | 뒤로 끊김 |
| 부분자기상관 | 뒤로 끊김 | 천천히 줄어듦 |
두 그림이 정확히 뒤집힌 관계입니다. 나란히 놓으면 어느 부품인지 알 수 있습니다.
이 문제에서 배우는 것. 두 부품이 같은 자료를 서로의 언어로 옮겨 적을 수 있습니다. 가역인 이동평균은 무한한 되먹임으로 다시 쓸 수 있고, 정상인 되먹임은 무한한 이동평균으로 다시 쓸 수 있습니다. 그래서 "어느 쪽이 참인가"는 물음이 아니고, "어느 쪽이 계수가 적은가"가 물음입니다. 문제 5에서 그 차이를 수치로 봅니다.
바로 확인 2.
확인 2-1. 한 칸 이동평균의 시차 상관 식과 상한을 쓰세요.
답. 이며 가 일 때 가 상한입니다.
확인 2-2. 검산에서 가 와 일 때의 시차 상관을 쓰세요.
답. 둘 다 이라 구분되지 않습니다.
확인 2-3. 검산에서 이동평균 자료의 부분자기상관 처음 셋을 쓰세요.
답. , , 입니다.
문제. 차수를 확정합니다.
(1) 여러 차수를 맞춰 견주세요.
(2) 두 기준을 비교하세요.
(3) 잔차를 묶어 검정하세요.
생각의 실마리. 실제 자료에서 두 그림이 그렇게 깨끗하지 않습니다. 수치 기준이 필요합니다.
풀이. (1) 두 칸 되먹임 자료에 여러 차수를 맞춰 봅니다.
| 차수 | 잔차 분산 | AIC | BIC | 잔차 시차 상관 |
|---|---|---|---|---|
잔차 분산은 차수를 늘릴수록 줄어듭니다. 189강 문제 1의 와 같아 기준이 못 됩니다.
AIC와 BIC는 벌점이 있어 어딘가에서 가장 작아집니다. 둘 다 차수 에서 가장 작고, 참 차수와 같습니다.
마지막 열이 차수 부터 근처입니다. 차수 에서 이 남아 있던 것이 사라집니다.
(2) 두 기준을 비교합니다. 참 차수가 인 자료를 여러 길이로 만듭니다.
| 자료 길이 | AIC가 를 고름 | BIC가 를 고름 | AIC 평균 차수 | BIC 평균 차수 |
|---|---|---|---|---|
BIC가 참 차수를 더 자주 맞힙니다. 길이 에서 대 입니다.
길이 에서는 BIC 평균 차수가 으로 오히려 작게 나옵니다. 벌점이 무거워 짧은 자료에서는 필요한 항까지 떨어뜨립니다.
AIC는 길이와 무관하게 근처를 고릅니다. 커지는 쪽으로 치우치며, 자료를 늘려도 안 낫습니다.
189강 문제 2의 두 기준이 여기서도 같은 성질을 보입니다.
(3) 잔차를 묶어 검정합니다. 196강 문제 2에서 시차 하나씩 보면 다중비교가 된다고 했습니다.
| 맞춘 차수 | 묶음 통계량 | 자유도 | 대략의 기준값 |
|---|---|---|---|
차수 은 로 기준값 을 크게 넘습니다. 남은 구조가 있다는 뜻입니다.
차수 부터는 기준값 아래입니다. 백색잡음으로 볼 수 있습니다.
자유도가 맞춘 계수 수만큼 줄어듭니다. 그만큼 자료를 썼기 때문이며, 181강 문제 1의 자유도 계산과 같은 논리입니다.
이 문제에서 배우는 것. AIC와 BIC 중 무엇을 쓸지가 목적에 달렸습니다. BIC는 참 모형이 후보 안에 있을 때 그것을 찾아내는 데 좋고, AIC는 예측 오차를 줄이는 데 좋습니다. 위 표에서 AIC가 차수를 크게 고르는 것이 결함이 아니라 설계이며, 예측에서는 항을 조금 더 넣는 편이 유리할 때가 많습니다. 189강 문제 2와 같은 결론이고, **"어느 것이 옳은가"가 아니라 "무엇을 하려는가"**가 정합니다.
바로 확인 3.
확인 3-1. 잔차 분산이 왜 차수 기준이 못 되는지 쓰세요.
답. 차수를 늘릴수록 계속 줄어들기 때문입니다.
확인 3-2. 검산에서 길이 일 때 두 기준의 적중률을 쓰세요.
답. AIC 이고 BIC 입니다.
확인 3-3. 검산에서 차수 과 의 묶음 통계량과 기준값을 쓰세요.
답. 와 이며 기준값은 과 입니다.
문제. 앞을 내다봅니다.
(1) 예측값과 분산을 계산하세요.
(2) 실제로 예측해 오차를 재세요.
(3) 구간을 다세요.
생각의 실마리. 되먹임 모형에서 칸 뒤 예측은 곱하기 현재값입니다. 되먹임을 번 적용한 것입니다.
풀이. (1) 계산합니다. 입니다.
| 몇 칸 앞 | 예측 계수 | 예측 분산 | 자료 전체 분산 |
|---|---|---|---|
멀리 갈수록 예측 계수가 으로 가고 분산이 전체 분산으로 갑니다.
먼 미래에는 평균을 말하는 것 말고는 할 수 있는 것이 없습니다. 칸 앞에서 예측 분산 가 전체 분산 과 같습니다.
이것이 정상 시계열의 성질입니다. 기억이 사라집니다.
(2) 실제로 예측합니다. 앞 개로 계수를 맞추고 뒤 개를 예측하며, **추정한 계수는 이고 참값은 **입니다.
| 몇 칸 앞 | 실제 제곱오차 | 이론 예측 분산 | 평균만 말할 때 |
|---|---|---|---|
실제 오차가 이론값과 붙습니다. 모형이 맞기 때문입니다.
칸 앞에서는 로 평균만 말하는 을 오히려 넘습니다. 그 거리에서는 모형이 도움이 안 됩니다.
(3) 구간을 답니다.
| 몇 칸 앞 | 구간 반폭 | 실제 포함률 | 목표 |
|---|---|---|---|
칸과 칸은 와 로 목표에 닿습니다.
칸에서는 로 조금 모자랍니다. 계수 추정 오차가 들어가기 때문입니다.
구간은 계수를 안다고 치고 계산한 것이라 실제보다 좁습니다. 자료가 짧으면 그 차이가 더 커지며, 199강에서 다룹니다.
이 문제에서 배우는 것. 예측 지평이 길어지면 모형의 값어치가 사라집니다. 위 표에서 칸 앞의 오차가 평균만 말할 때와 같아졌는데, 에서 이므로 당연한 결과입니다. 그래서 시계열 모형을 평가할 때 몇 칸 앞을 맞히는지 반드시 밝혀야 하며, "정확도 퍼센트"라는 주장은 그것 없이는 뜻이 없습니다. 한 칸 앞 예측만으로 성능을 자랑하는 보고서가 흔한데, 실무에서 필요한 것은 대개 그보다 먼 지평입니다.
바로 확인 4.
확인 4-1. 한 칸 되먹임의 칸 앞 예측을 쓰세요.
답. 의 제곱을 현재값에 곱합니다.
확인 4-2. 검산에서 칸 앞 예측 분산과 전체 분산을 쓰세요.
답. 와 로 같습니다.
확인 4-3. 검산에서 네 지평의 포함률을 쓰세요.
답. , , , 입니다.
문제. 두 부품을 함께 씁니다.
(1) 언제 무엇을 쓰는지 정리하세요.
(2) 왜 섞는지 수치로 보세요.
(3) 절차와 확인 항목을 세우세요.
생각의 실마리. 되먹임 개와 이동평균 개를 함께 쓰면 ARMA라 합니다.
풀이. (1) 언제 무엇을 쓰는지 정리합니다.
| 무엇을 쓰나 | 언제 | 몇 개의 계수 |
|---|---|---|
| 되먹임만 | 부분자기상관이 끊길 때 | 개 |
| 이동평균만 | 자기상관이 끊길 때 | 개 |
| 둘 다 | 둘 다 천천히 줄 때 | 더하기 개 |
| 차분한 뒤 둘 다 | 천천히 안 줄 때 | 198강 |
셋째 줄이 적은 계수로 같은 모양을 만드는 자리입니다.
(2) 왜 섞는지 수치로 봅니다. 한 칸 이동평균 자료를 되먹임만으로 맞춰 봅니다.
| 되먹임 차수 | 잔차 분산 | 잔차 시차 상관 |
|---|---|---|
되먹임만으로도 맞출 수 있지만 계수가 여럿 필요합니다.
이동평균 계수 하나면 될 일에 되먹임 계수 다섯이 듭니다. 잔차 시차 상관이 에서 이 되기까지 그렇습니다.
계수가 많으면 추정 오차가 쌓입니다. 189강 문제 2와 같으며, 같은 설명력을 적은 계수로 얻는 것이 모형 선택의 목표입니다.
(3) 절차와 확인 항목을 세웁니다.
| 무엇 | 어떻게 |
|---|---|
| 정상성 | 196강 문제 3을 먼저 |
| 차수 후보 | 두 그림에서 읽기 |
| 차수 확정 | AIC와 BIC를 함께 |
| 잔차 검사 | 묶음 검정으로 |
| 예측 검증 | 앞에서 뒤로만 나누기 |
| 계수 안정 | 구간을 나눠 다시 맞추기 |
마지막 줄이 자주 빠집니다. 구조가 변하면 계수도 변합니다.
앞 절반은 이고 뒤 절반은 인 자료를 이어 붙여 봅니다.
| 어디로 맞추나 | 추정 계수 | 참값 |
|---|---|---|
| 전체 | 섞임 | |
| 앞 절반 | ||
| 뒤 절반 |
전체로 맞추면 로 어느 쪽도 아닌 값이 나옵니다.
구간을 나눠 보면 계수가 다른 것이 드러납니다. 한 모형이 전체를 설명한다고 가정하기 전에 이것을 확인해야 합니다.
이 문제에서 배우는 것. 모형 진단에서 잔차 검사보다 계수 안정성이 먼저 무너집니다. 위 자료를 전체로 맞춰도 잔차가 그럴듯하게 나올 수 있는데, 그것은 가 두 구간의 어중간한 타협점이기 때문입니다. 그런데 그 계수로 예측하면 앞 구간에서는 반응이 모자라고 뒤 구간에서는 지나칩니다. 196강 문제 5의 정상성 확인이 여기서 "구간별로 다시 맞춰 보기"라는 구체적 절차가 되며, 실무 자료에서는 정상성이 깨지는 쪽이 오히려 정상입니다.
바로 확인 5.
확인 5-1. ARMA가 무엇인지 쓰세요.
답. 되먹임과 이동평균을 함께 쓰는 모형입니다.
확인 5-2. 검산에서 이동평균 자료를 되먹임으로 맞출 때 차수 과 의 잔차 상관을 쓰세요.
답. 과 입니다.
확인 5-3. 검산에서 계수가 변하는 자료의 세 추정값을 쓰세요.
답. , , 입니다.
| 무엇을 보는가 | 되먹임 차 | 이동평균 차 |
|---|---|---|
| 자기상관 | 천천히 줄어듦 | 뒤로 끊김 |
| 부분자기상관 | 뒤로 끊김 | 천천히 줄어듦 |
| 조건 | 절댓값 아래 | 언제나 정상 |
| 상한 | 없음 | 시차 이 |
| 무엇 | 식 |
|---|---|
| 되먹임 분산 | |
| 되먹임 자기상관 | \phi^ |
| 이동평균 자기상관 | |
| 칸 예측 | \phi^{h}x_ |
| 칸 예측 분산 |
| 차수 고르기 | 성질 |
|---|---|
| 잔차 분산 | 계속 줄어 기준이 못 됨 |
| AIC | 크게 고르는 쪽 |
| BIC | 참 차수를 잘 맞힘 |
| 묶음 검정 | 남은 구조가 있는지 |
| 자주 하는 실수 | 바로잡기 |
|---|---|
| 잔차 분산으로 차수를 고릅니다 | 벌점 기준을 씁니다 |
| 그림만 보고 확정합니다 | 수치 기준을 함께 봅니다 |
| 한 칸 앞 성능만 보고합니다 | 지평을 밝힙니다 |
| 계수가 일정하다고 둡니다 | 구간을 나눠 확인합니다 |
| 되먹임 차수를 계속 늘립니다 | 이동평균 항을 넣어 봅니다 |
문제 6. 되먹임의 정상 조건을 쓰세요.
답. 계수의 절댓값이 보다 작아야 합니다.
문제 7. 검산에서 가 일 때의 이론 표준편차와 시차 상관을 쓰세요.
답. 와 입니다.
문제 8. 검산에서 두 칸 되먹임의 시차 부분자기상관을 쓰세요.
답. 이며 참 계수 와 같습니다.
문제 9. 한 칸 이동평균의 시차 상관 식과 상한을 쓰세요.
답. 이며 가 일 때 가 상한입니다.
문제 10. 검산에서 가 와 일 때의 시차 상관을 쓰세요.
답. 둘 다 이라 구분되지 않습니다.
문제 11. 검산에서 이동평균 자료의 부분자기상관 처음 셋을 쓰세요.
답. , , 입니다.
문제 12. 잔차 분산이 왜 차수 기준이 못 되는지 쓰세요.
답. 차수를 늘릴수록 계속 줄어들기 때문입니다.
문제 13. 검산에서 길이 일 때 두 기준의 적중률을 쓰세요.
답. AIC 이고 BIC 입니다.
문제 14. 검산에서 차수 과 의 묶음 통계량을 쓰세요.
답. 와 입니다.
문제 15. 검산에서 칸 앞 예측 분산과 전체 분산을 쓰세요.
답. 와 로 같습니다.
문제 16. 검산에서 네 지평의 포함률을 쓰세요.
답. , , , 입니다.
문제 17. 검산에서 이동평균 자료를 되먹임으로 맞출 때 차수 과 의 잔차 상관을 쓰세요.
답. 과 입니다.
문제 18. 검산에서 계수가 변하는 자료의 세 추정값을 쓰세요.
답. , , 입니다.
심화 1. 되먹임 계수를 어떻게 추정하는지 정리하세요.
| 방법 | 어떻게 |
|---|---|
| 최소제곱 | 시차 값들에 회귀 |
| 율-워커 | 자기상관에서 연립방정식 |
| 최대가능도 | 189강의 가능도 최대화 |
| 조건부 가능도 | 처음 개를 고정 |
첫째 줄이 이 강의에서 쓴 방법이고 가장 간단합니다. 시차 값을 설명변수로 두면 그냥 다중회귀입니다.
그런데 설명변수가 종속변수의 과거라는 점이 다릅니다. 오차와 무관해야 하는데, 잔차에 자기상관이 남아 있으면 그 가정이 깨집니다.
표본이 크면 넷이 거의 같은 답을 냅니다. 짧은 자료에서 차이가 나며, 최대가능도가 대체로 낫습니다.
심화 2. 되먹임 계수 추정의 치우침을 정리하세요.
되먹임 계수는 아래로 치우쳐 추정됩니다.
| 일 때 대략의 치우침 | |
|---|---|
문제 4에서 개로 이 나온 것이 이 치우침입니다.
짧은 자료에서 되먹임이 실제보다 약해 보입니다. 그래서 예측이 평균으로 너무 빨리 수렴하고, 예측 구간도 좁아집니다.
보정하는 방법이 있지만 표본이 크면 무시할 만합니다.
심화 3. 잔차 검정의 함정을 정리하세요.
| 무엇이 문제 | 왜 |
|---|---|
| 자유도 조정 | 맞춘 계수 수만큼 빼야 함 |
| 시차 개수 선택 | 몇 개까지 볼지가 결과를 바꿈 |
| 검정력 | 큰 표본에서는 사소한 것도 유의 |
| 통과가 증명은 아님 | 다른 결함은 못 잡음 |
둘째 줄이 실무에서 자주 조작됩니다. 시차를 까지 보면 통과하는데 까지 보면 떨어지는 일이 있습니다.
시차 개수를 자료 길이에 따라 미리 정하는 관례가 그래서 있습니다.
넷째 줄이 가장 중요합니다. 잔차가 백색잡음이어도 분산이 시간에 따라 변하는 것은 이 검정이 못 잡습니다.
심화 4. 분산이 변하는 자료를 정리하세요.
잔차가 백색잡음인데도 크기가 몰려 다니는 자료가 있습니다.
| 무엇 | 어떻게 |
|---|---|
| 조용한 시기와 요란한 시기 | 잔차 제곱의 자기상관 |
| 모형 | 분산을 되먹임으로 적음 |
| 어디에 쓰나 | 금융 수익률, 위험 관리 |
잔차의 자기상관은 인데 잔차 제곱의 자기상관이 큽니다. 그것이 신호입니다.
188강의 이분산이 시간축을 따라 나타난 것입니다. 계수는 안 망가지고 표준오차와 구간이 망가집니다.
예측값은 그대로인데 예측 구간의 폭이 시점마다 달라집니다.
심화 5. 여러 시계열을 함께 모형화하는 것을 정리하세요.
| 무엇 | 뜻 |
|---|---|
| 벡터 되먹임 | 여러 변수를 함께 되먹임 |
| 그레인저 인과 | 과거가 예측을 개선하는가 |
| 충격 반응 | 한 변수의 충격이 퍼지는 모양 |
둘째 줄의 이름이 오해를 부릅니다. 191강의 인과와 다르며, **"예측에 도움이 되는가"**일 뿐입니다.
교란이 있으면 그레인저 인과가 있어도 개입 효과는 없을 수 있습니다. 03단원 전체가 그 구분을 다뤘습니다.
계수가 변수 수의 제곱으로 늘어납니다. 변수 개에 차수 이면 개이므로, 189강의 정규화가 필요해집니다.
심화 6. 이 강의가 남긴 문제를 정리하세요.
이 강의의 모든 것이 정상성을 전제했습니다.
| 무엇을 못 했나 | 어디서 |
|---|---|
| 가 인 자료 | 문제 1의 넷째 줄 |
| 추세가 있는 자료 | 196강 문제 3 |
| 계절이 있는 자료 | 196강 문제 4 |
문제 1에서 가 정상인데도 과 구분이 어려웠습니다. 그 구분을 어떻게 검정할지가 198강의 핵심이며, 차분을 몇 번 할지가 그 답에 달렸습니다.
정답.
| 기호 | 읽는 법 | 뜻 |
|---|---|---|
| AR | 자기회귀 | 과거 값을 되먹입니다 |
| MA | 이동평균 | 과거 잡음을 섞습니다 |
| ARMA | 자기회귀 이동평균 | 둘을 함께 씁니다 |
| 파이 | 되먹임 계수입니다 | |
| 세타 | 이동평균 계수입니다 | |
| 되먹임 차수 | 몇 칸까지 되먹이는지입니다 | |
| 이동평균 차수 | 몇 칸까지 잡음을 섞는지입니다 | |
| 정상 조건 | stationarity condition | 되먹임 계수의 절댓값이 아래입니다 |
| 가역성 | invertibility | 이동평균 계수의 절댓값이 아래입니다 |
| 묶음 검정 | portmanteau test | 여러 시차를 한꺼번에 봅니다 |
| 예측 지평 | forecast horizon | 몇 칸 앞을 맞히는지입니다 |
다음은 198강 정상성과 차분입니다. 이 강의가 정상인 자료를 다뤘습니다.
문제 1에서 와 이 시차 에서 과 으로 비슷했습니다. 하나는 정상이고 하나는 아니며, 어느 쪽인지에 따라 완전히 다른 처리를 해야 합니다. 198강은 그 판별과 차분을 다루고, 차분을 잘못했을 때의 대가까지 봅니다.
import numpy as np
rng = np.random.default_rng(20261004)
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 acf(x, k):
x = x - x.mean()
d = float(x @ x)
return float(x[k:] @ x[:len(x) - k]) / d
def pacf(x, K):
out = []
for k in range(1, K + 1):
n = len(x) - k
A = np.stack([x[k - j:k - j + n] for j in range(1, k + 1)] + [np.ones(n)],
axis=1)
b, *_ = np.linalg.lstsq(A, x[k:k + n], rcond=None)
out.append(float(b[k - 1]))
return out
def gen_ar(n, phis, sd=1.0, burn=500):
p = len(phis)
m = n + burn
e = rng.normal(0, sd, m)
x = np.zeros(m)
for t in range(p, m):
x[t] = float(np.dot(phis, x[t - p:t][::-1])) + e[t]
return x[burn:]
def fit_ar(x, p):
n = len(x) - p
A = np.stack([x[p - j:p - j + n] for j in range(1, p + 1)] + [np.ones(n)],
axis=1)
b, *_ = np.linalg.lstsq(A, x[p:p + n], rcond=None)
r = x[p:p + n] - A @ b
return b[:p], float(b[p]), float(r @ r) / n
# --- 문제 1: 되먹임 ----------------------------------------------------
print(" 196강 문제 2 에서 자기상관이 지수적으로 줄어드는 자료를 봤습니다")
print(" 그 모양을 만드는 가장 간단한 식을 씁니다")
print(" x[t] = phi 곱하기 x[t-1] 더하기 새 잡음. 이것이 한 칸 되먹임입니다")
N1 = 4000
print(" %s %s %s %s %s"
% (pw("phi", 10), rw("표준편차", 14), rw("이론 표준편차", 16),
rw("시차 1 상관", 14), rw("시차 5 상관", 14)))
for phi in [0.0, 0.5, 0.9, -0.7]:
x = gen_ar(N1, [phi])
print(" %s %14.6f %16.6f %14.6f %14.6f"
% (pw("%.1f" % phi, 10), float(x.std(ddof=1)),
1.0 / np.sqrt(1 - phi * phi), acf(x, 1), acf(x, 5)))
print(" phi 의 절댓값이 커지면 표준편차도 커집니다. 잡음이 쌓이기 때문입니다")
print(" 이론 표준편차는 1 나누기 루트 1 빼기 phi 제곱입니다")
print(" phi 가 음수면 상관이 시차마다 부호를 바꿉니다. 톱니 모양이 됩니다")
print(" phi 가 1 에 가까우면 무슨 일이 생기는지 봅니다")
print(" %s %s %s %s"
% (pw("phi", 10), rw("이론 표준편차", 16), rw("시차 20 상관", 16),
rw("정상인가", 14)))
for phi in [0.5, 0.9, 0.99, 1.0]:
v = 1.0 / np.sqrt(1 - phi * phi) if phi < 1 else float("inf")
print(" %s %16s %16.6f %s"
% (pw("%.2f" % phi, 10),
rw("%.6f" % v if phi < 1 else "발산", 16), phi ** 20,
rw("예" if phi < 1 else "아니오", 14)))
print(" phi 가 1 이면 분산이 무한대로 갑니다. 196강의 누적합입니다")
print(" 절댓값이 1 보다 작아야 정상입니다. 이것이 되먹임의 조건입니다")
print(" 자기상관과 부분자기상관을 함께 봅니다")
x_ar2 = gen_ar(6000, [0.6, 0.25])
a = [acf(x_ar2, k) for k in range(1, 7)]
p = pacf(x_ar2, 6)
print(" 두 칸 되먹임 자료입니다. 계수는 0.6 과 0.25 입니다")
print(" %s %s %s" % (pw("시차", 8), rw("자기상관", 14), rw("부분자기상관", 16)))
for k in range(6):
print(" %s %14.6f %16.6f" % (pw("%d" % (k + 1), 8), a[k], p[k]))
print(" 자기상관은 천천히 줄어드는데 부분자기상관은 시차 2 뒤로 끊깁니다")
print(" 끊기는 자리가 차수입니다. 이것이 되먹임 차수를 고르는 법입니다")
# --- 문제 2: 이동평균 --------------------------------------------------
print(" 다른 부품은 잡음을 섞는 것입니다")
print(" x[t] = e[t] 더하기 theta 곱하기 e[t-1]. 이것이 한 칸 이동평균입니다")
N2 = 6000
def ma1(n, th):
e = rng.normal(0, 1, n + 1)
return e[1:] + th * e[:-1]
print(" %s %s %s %s %s"
% (pw("theta", 10), rw("시차 1 상관", 14), rw("이론값", 14),
rw("시차 2 상관", 14), rw("표준편차", 12)))
for th in [0.0, 0.5, 0.8, -0.8]:
x = ma1(N2, th)
print(" %s %14.6f %14.6f %14.6f %12.6f"
% (pw("%.1f" % th, 10), acf(x, 1), th / (1 + th * th), acf(x, 2),
float(x.std(ddof=1))))
print(" 이론값은 theta 나누기 1 더하기 theta 제곱입니다")
print(" 시차 2 부터는 0 근처입니다. 잡음이 한 칸만 겹치기 때문입니다")
print(" 이 식은 theta 가 무엇이든 언제나 정상입니다. 조건이 없습니다")
print(" 이동평균의 자기상관에는 상한이 있습니다")
print(" %s %s" % (pw("theta", 12), rw("시차 1 상관", 16)))
for th in [0.5, 1.0, 2.0, 5.0]:
print(" %s %16.6f" % (pw("%.1f" % th, 12), th / (1 + th * th)))
print(" theta 가 1 일 때 0.5 로 가장 큽니다. 그보다 크면 다시 줄어듭니다")
print(" 한 칸 이동평균의 시차 1 상관은 0.5 를 넘을 수 없습니다")
print(" theta 와 1 나누기 theta 가 같은 자기상관을 냅니다. 둘을 못 가립니다")
print(" 절댓값이 1 아래인 쪽을 고르는 것이 관례입니다")
print(" 두 부품의 그림이 서로 뒤집혀 있습니다")
x_ma2 = ma1(6000, 0.8)
a2 = [acf(x_ma2, k) for k in range(1, 7)]
p2 = pacf(x_ma2, 6)
print(" 한 칸 이동평균 자료의 두 그림입니다")
print(" %s %s %s" % (pw("시차", 8), rw("자기상관", 14), rw("부분자기상관", 16)))
for k in range(6):
print(" %s %14.6f %16.6f" % (pw("%d" % (k + 1), 8), a2[k], p2[k]))
print(" 자기상관은 시차 1 뒤로 끊기고 부분자기상관은 천천히 줄어듭니다")
print(" 부분자기상관이 0.5031 에서 -0.2966 과 0.2212 로 부호를 바꾸며 줄어듭니다")
print(" 문제 1 의 되먹임과 정확히 반대입니다")
print(" %s %s %s"
% (pw("무엇을 보는가", 20), rw("되먹임 p 차", 20), rw("이동평균 q 차", 20)))
for a_, b_, c_ in [("자기상관", "천천히 줄어듦", "q 뒤로 끊김"),
("부분자기상관", "p 뒤로 끊김", "천천히 줄어듦")]:
print(" %s %s %s" % (pw(a_, 20), rw(b_, 20), rw(c_, 20)))
print(" 두 그림을 나란히 놓으면 어느 부품인지 알 수 있습니다")
# --- 문제 3: 차수 고르기 -----------------------------------------------
print(" 실제 자료에서 차수를 고르는 것은 그림만으로 안 됩니다")
print(" 두 칸 되먹임 자료에 여러 차수를 맞춰 봅니다")
xs = gen_ar(2000, [0.5, 0.3])
n = len(xs)
print(" %s %s %s %s %s"
% (pw("차수", 8), rw("잔차 분산", 14), rw("AIC", 14), rw("BIC", 14),
rw("잔차 시차 1 상관", 20)))
best_a, best_b = None, None
for pp in [1, 2, 3, 4, 5]:
co, ic, s2 = fit_ar(xs, pp)
m = n - pp
aic = m * np.log(s2) + 2 * (pp + 1)
bic = m * np.log(s2) + np.log(m) * (pp + 1)
A = np.stack([xs[pp - j:pp - j + m] for j in range(1, pp + 1)]
+ [np.ones(m)], axis=1)
r = xs[pp:pp + m] - A @ np.append(co, ic)
print(" %s %14.6f %14.4f %14.4f %20.6f"
% (pw("%d" % pp, 8), s2, aic, bic, acf(r, 1)))
print(" 잔차 분산은 차수를 늘릴수록 계속 줄어듭니다. 기준이 못 됩니다")
print(" AIC 와 BIC 는 벌점이 있어 어딘가에서 가장 작아집니다")
print(" 둘 다 차수 2 에서 가장 작습니다. 참 차수와 같습니다")
print(" 마지막 열이 차수 2 부터 0 근처입니다. 남은 구조가 없다는 뜻입니다")
print(" 두 기준이 다르게 고르는 일이 있습니다")
S = 600
print(" 참 차수가 2 인 자료를 여러 길이로 만들어 봅니다")
print(" %s %s %s %s %s"
% (pw("자료 길이", 12), rw("AIC 가 2 를 고름", 20),
rw("BIC 가 2 를 고름", 20), rw("AIC 평균 차수", 16),
rw("BIC 평균 차수", 16)))
for nn in [100, 400, 1600]:
ca, cb, sa, sb = 0, 0, 0, 0
for _ in range(S):
z = gen_ar(nn, [0.5, 0.3])
aics, bics = [], []
for pp in range(1, 7):
_, _, s2 = fit_ar(z, pp)
m = nn - pp
aics.append(m * np.log(s2) + 2 * (pp + 1))
bics.append(m * np.log(s2) + np.log(m) * (pp + 1))
pa = int(np.argmin(aics)) + 1
pb = int(np.argmin(bics)) + 1
ca += pa == 2
cb += pb == 2
sa += pa
sb += pb
print(" %s %20.4f %20.4f %16.4f %16.4f"
% (pw("%d" % nn, 12), ca / S, cb / S, sa / S, sb / S))
print(" BIC 가 참 차수를 더 자주 맞힙니다. 벌점이 더 무겁기 때문입니다")
print(" 길이 100 에서는 BIC 평균 차수가 1.7933 으로 오히려 작게 나옵니다")
print(" 벌점이 무거워 짧은 자료에서는 필요한 항까지 떨어뜨립니다")
print(" AIC 는 반대로 길이와 무관하게 2.7 근처를 고릅니다. 커지는 쪽으로 치우칩니다")
print(" 189강 문제 2 의 두 기준이 여기서도 같은 성질을 보입니다")
print(" 잔차를 여러 시차로 묶어 검정합니다")
print(" 196강 문제 2 에서 시차 하나씩 보면 다중비교가 된다고 했습니다")
def lb(r, K):
m = len(r)
q = 0.0
for k in range(1, K + 1):
q += acf(r, k) ** 2 / (m - k)
return m * (m + 2) * q
print(" %s %s %s %s"
% (pw("맞춘 차수", 12), rw("묶음 통계량", 16), rw("자유도", 12),
rw("대략의 기준값", 18)))
for pp in [1, 2, 3]:
co, ic, _ = fit_ar(xs, pp)
m = n - pp
A = np.stack([xs[pp - j:pp - j + m] for j in range(1, pp + 1)]
+ [np.ones(m)], axis=1)
r = xs[pp:pp + m] - A @ np.append(co, ic)
K = 20
df = K - pp
print(" %s %16.4f %12d %18.4f"
% (pw("%d" % pp, 12), lb(r, K), df, df + 1.96 * np.sqrt(2.0 * df)))
print(" 차수 1 은 기준값을 크게 넘습니다. 남은 구조가 있다는 뜻입니다")
print(" 차수 2 부터는 기준값 아래입니다. 백색잡음으로 볼 수 있습니다")
print(" 자유도가 맞춘 계수 수만큼 줄어듭니다. 그만큼 자료를 썼기 때문입니다")
# --- 문제 4: 예측 ------------------------------------------------------
print(" 되먹임 모형으로 앞을 내다봅니다")
print(" 한 칸 되먹임에서 h 칸 뒤 예측은 phi 의 h 제곱 곱하기 현재값입니다")
phi4 = 0.8
x4 = gen_ar(3000, [phi4])
print(" %s %s %s %s"
% (pw("몇 칸 앞", 12), rw("예측 계수", 14), rw("예측 분산", 14),
rw("자료 전체 분산", 18)))
tot4 = 1.0 / (1 - phi4 * phi4)
for h in [1, 2, 5, 10, 30]:
var = sum(phi4 ** (2 * j) for j in range(h))
print(" %s %14.6f %14.6f %18.6f"
% (pw("%d" % h, 12), phi4 ** h, var, tot4))
print(" 멀리 갈수록 예측 계수가 0 으로 가고 분산이 전체 분산으로 갑니다")
print(" 먼 미래에는 평균을 말하는 것 말고는 할 수 있는 것이 없습니다")
print(" 이것이 정상 시계열의 성질입니다. 기억이 사라집니다")
print(" 실제로 예측해서 오차를 재 봅니다")
tr = x4[:2500]
te = x4[2500:]
co4, ic4, s24 = fit_ar(tr, 1)
print(" 앞 2500 개로 계수를 맞추고 뒤 500 개를 예측합니다")
print(" 추정한 계수는 %.6f 이고 참값은 %.1f 입니다" % (co4[0], phi4))
print(" %s %s %s %s"
% (pw("몇 칸 앞", 12), rw("실제 제곱오차", 16), rw("이론 예측 분산", 18),
rw("평균만 말할 때", 18)))
for h in [1, 2, 5, 10]:
errs = []
for i in range(len(te) - h):
f = ic4 / (1 - co4[0]) + (co4[0] ** h) * (te[i] - ic4 / (1 - co4[0]))
errs.append((te[i + h] - f) ** 2)
var = sum(phi4 ** (2 * j) for j in range(h))
print(" %s %16.6f %18.6f %18.6f"
% (pw("%d" % h, 12), float(np.mean(errs)), var, tot4))
print(" 실제 오차가 이론값과 붙습니다. 모형이 맞기 때문입니다")
print(" 10 칸 앞에서는 평균만 말하는 것과 거의 같아집니다")
print(" 구간을 답니다")
print(" %s %s %s %s"
% (pw("몇 칸 앞", 12), rw("구간 반폭", 14), rw("실제 포함률", 16),
rw("목표", 10)))
for h in [1, 2, 5, 10]:
var = sum(phi4 ** (2 * j) for j in range(h)) * s24
half = 1.96 * np.sqrt(var)
cov = 0
cnt = 0
for i in range(len(te) - h):
f = ic4 / (1 - co4[0]) + (co4[0] ** h) * (te[i] - ic4 / (1 - co4[0]))
cnt += 1
if abs(te[i + h] - f) < half:
cov += 1
print(" %s %14.6f %16.4f %10.2f"
% (pw("%d" % h, 12), half, cov / cnt, 0.95))
print(" 1 칸과 2 칸은 0.9559 와 0.9518 로 목표에 닿습니다")
print(" 10 칸에서는 0.9367 로 조금 모자랍니다. 계수 추정 오차가 들어가기 때문입니다")
print(" 구간은 계수를 안다고 치고 계산한 것이라 실제보다 좁습니다")
print(" 겹치는 구간으로 세었으므로 이 비율 자체도 서로 이어져 있습니다")
print(" 자료가 짧으면 그 차이가 더 커집니다. 199강에서 다룹니다")
# --- 문제 5: 실무 -------------------------------------------------------
print(" 둘을 합친 모형을 씁니다")
print(" 되먹임 p 개와 이동평균 q 개를 함께 쓰면 ARMA 라 합니다")
print(" %s %s %s"
% (pw("무엇을 쓰나", 20), rw("언제", 26), rw("몇 개의 계수", 16)))
for a_, b_, c_ in [("되먹임만", "부분자기상관이 끊길 때", "p 개"),
("이동평균만", "자기상관이 끊길 때", "q 개"),
("둘 다", "둘 다 천천히 줄 때", "p 더하기 q 개"),
("차분한 뒤 둘 다", "천천히 안 줄 때", "198강")]:
print(" %s %s %s" % (pw(a_, 20), rw(b_, 26), rw(c_, 16)))
print(" 셋째 줄이 적은 계수로 같은 모양을 만드는 자리입니다")
print(" 왜 둘을 섞는지 수치로 봅니다")
x5 = ma1(4000, 0.7)
print(" 한 칸 이동평균 자료를 되먹임만으로 맞춰 봅니다")
print(" %s %s %s"
% (pw("되먹임 차수", 14), rw("잔차 분산", 14), rw("잔차 시차 1 상관", 20)))
for pp in [1, 2, 3, 5, 8]:
co, ic, s2 = fit_ar(x5, pp)
m = len(x5) - pp
A = np.stack([x5[pp - j:pp - j + m] for j in range(1, pp + 1)]
+ [np.ones(m)], axis=1)
r = x5[pp:pp + m] - A @ np.append(co, ic)
print(" %s %14.6f %20.6f" % (pw("%d" % pp, 14), s2, acf(r, 1)))
print(" 되먹임만으로도 맞출 수 있지만 계수가 여럿 필요합니다")
print(" 이동평균 계수 하나면 될 일에 되먹임 계수 다섯이 듭니다")
print(" 계수가 많으면 추정 오차가 쌓입니다. 189강 문제 2 와 같습니다")
print(" 실무에서 무엇을 확인하는지 정리합니다")
print(" %s %s" % (pw("무엇", 24), rw("어떻게", 30)))
for a_, b_ in [("정상성", "196강 문제 3 을 먼저"),
("차수 후보", "두 그림에서 읽기"),
("차수 확정", "AIC 와 BIC 를 함께"),
("잔차 검사", "묶음 검정으로"),
("예측 검증", "앞에서 뒤로만 나누기"),
("계수 안정", "구간을 나눠 다시 맞추기")]:
print(" %s %s" % (pw(a_, 24), rw(b_, 30)))
print(" 마지막 줄이 자주 빠집니다. 구조가 변하면 계수도 변합니다")
print(" 계수가 변하는 자료에서 무슨 일이 생기는지 봅니다")
n6 = 2000
half = n6 // 2
seg1 = gen_ar(half, [0.8])
seg2 = gen_ar(half, [0.2])
x6 = np.concatenate([seg1, seg2])
print(" 앞 절반은 0.8 이고 뒤 절반은 0.2 인 자료를 이어 붙입니다")
print(" %s %s %s"
% (pw("어디로 맞추나", 20), rw("추정 계수", 14), rw("참값", 12)))
for nm, seg, tv in [("전체", x6, None), ("앞 절반", x6[:half], 0.8),
("뒤 절반", x6[half:], 0.2)]:
co, _, _ = fit_ar(seg, 1)
print(" %s %14.6f %s"
% (pw(nm, 20), co[0],
rw("%.1f" % tv if tv is not None else "섞임", 12)))
print(" 전체로 맞추면 어느 쪽도 아닌 값이 나옵니다")
print(" 구간을 나눠 보면 계수가 다른 것이 드러납니다")
print(" 한 모형이 전체를 설명한다고 가정하기 전에 이것을 확인해야 합니다")
print(" 197강은 정상인 자료를 다뤘습니다. 198강은 그렇지 않은 자료를 다룹니다")
# 196강 문제 2 에서 자기상관이 지수적으로 줄어드는 자료를 봤습니다
# 그 모양을 만드는 가장 간단한 식을 씁니다
# x[t] = phi 곱하기 x[t-1] 더하기 새 잡음. 이것이 한 칸 되먹임입니다
# phi 표준편차 이론 표준편차 시차 1 상관 시차 5 상관
# 0.0 0.993634 1.000000 -0.015972 0.000134
# 0.5 1.134541 1.154701 0.496982 0.043722
# 0.9 2.360503 2.294157 0.903275 0.611001
# -0.7 1.390520 1.400280 -0.695181 -0.158052
# phi 의 절댓값이 커지면 표준편차도 커집니다. 잡음이 쌓이기 때문입니다
# 이론 표준편차는 1 나누기 루트 1 빼기 phi 제곱입니다
# phi 가 음수면 상관이 시차마다 부호를 바꿉니다. 톱니 모양이 됩니다
# phi 가 1 에 가까우면 무슨 일이 생기는지 봅니다
# phi 이론 표준편차 시차 20 상관 정상인가
# 0.50 1.154701 0.000001 예
# 0.90 2.294157 0.121577 예
# 0.99 7.088812 0.817907 예
# 1.00 발산 1.000000 아니오
# phi 가 1 이면 분산이 무한대로 갑니다. 196강의 누적합입니다
# 절댓값이 1 보다 작아야 정상입니다. 이것이 되먹임의 조건입니다
# 자기상관과 부분자기상관을 함께 봅니다
# 두 칸 되먹임 자료입니다. 계수는 0.6 과 0.25 입니다
# 시차 자기상관 부분자기상관
# 1 0.793042 0.793160
# 2 0.723277 0.254576
# 3 0.627492 -0.005092
# 4 0.556187 0.006634
# 5 0.482029 -0.019015
# 6 0.424640 0.004930
# 자기상관은 천천히 줄어드는데 부분자기상관은 시차 2 뒤로 끊깁니다
# 끊기는 자리가 차수입니다. 이것이 되먹임 차수를 고르는 법입니다
# 다른 부품은 잡음을 섞는 것입니다
# x[t] = e[t] 더하기 theta 곱하기 e[t-1]. 이것이 한 칸 이동평균입니다
# theta 시차 1 상관 이론값 시차 2 상관 표준편차
# 0.0 -0.001867 0.000000 -0.000668 1.016123
# 0.5 0.404941 0.400000 0.008204 1.135863
# 0.8 0.486381 0.487805 0.000737 1.274103
# -0.8 -0.478730 -0.487805 -0.027598 1.296108
# 이론값은 theta 나누기 1 더하기 theta 제곱입니다
# 시차 2 부터는 0 근처입니다. 잡음이 한 칸만 겹치기 때문입니다
# 이 식은 theta 가 무엇이든 언제나 정상입니다. 조건이 없습니다
# 이동평균의 자기상관에는 상한이 있습니다
# theta 시차 1 상관
# 0.5 0.400000
# 1.0 0.500000
# 2.0 0.400000
# 5.0 0.192308
# theta 가 1 일 때 0.5 로 가장 큽니다. 그보다 크면 다시 줄어듭니다
# 한 칸 이동평균의 시차 1 상관은 0.5 를 넘을 수 없습니다
# theta 와 1 나누기 theta 가 같은 자기상관을 냅니다. 둘을 못 가립니다
# 절댓값이 1 아래인 쪽을 고르는 것이 관례입니다
# 두 부품의 그림이 서로 뒤집혀 있습니다
# 한 칸 이동평균 자료의 두 그림입니다
# 시차 자기상관 부분자기상관
# 1 0.503104 0.503115
# 2 0.031553 -0.296566
# 3 0.022012 0.221196
# 4 0.002674 -0.170548
# 5 -0.014449 0.111298
# 6 -0.019242 -0.102112
# 자기상관은 시차 1 뒤로 끊기고 부분자기상관은 천천히 줄어듭니다
# 부분자기상관이 0.5031 에서 -0.2966 과 0.2212 로 부호를 바꾸며 줄어듭니다
# 문제 1 의 되먹임과 정확히 반대입니다
# 무엇을 보는가 되먹임 p 차 이동평균 q 차
# 자기상관 천천히 줄어듦 q 뒤로 끊김
# 부분자기상관 p 뒤로 끊김 천천히 줄어듦
# 두 그림을 나란히 놓으면 어느 부품인지 알 수 있습니다
# 실제 자료에서 차수를 고르는 것은 그림만으로 안 됩니다
# 두 칸 되먹임 자료에 여러 차수를 맞춰 봅니다
# 차수 잔차 분산 AIC BIC 잔차 시차 1 상관
# 1 1.077992 154.1248 165.3256 -0.199571
# 2 0.985833 -22.5076 -5.7079 -0.007122
# 3 0.985549 -21.0683 1.3293 0.000121
# 4 0.985901 -18.3412 9.6533 0.000241
# 5 0.984816 -18.5244 15.0660 0.000724
# 잔차 분산은 차수를 늘릴수록 계속 줄어듭니다. 기준이 못 됩니다
# AIC 와 BIC 는 벌점이 있어 어딘가에서 가장 작아집니다
# 둘 다 차수 2 에서 가장 작습니다. 참 차수와 같습니다
# 마지막 열이 차수 2 부터 0 근처입니다. 남은 구조가 없다는 뜻입니다
# 두 기준이 다르게 고르는 일이 있습니다
# 참 차수가 2 인 자료를 여러 길이로 만들어 봅니다
# 자료 길이 AIC 가 2 를 고름 BIC 가 2 를 고름 AIC 평균 차수 BIC 평균 차수
# 100 0.5700 0.6600 2.6600 1.7933
# 400 0.6600 0.9633 2.6700 2.0467
# 1600 0.6167 0.9867 2.7833 2.0133
# BIC 가 참 차수를 더 자주 맞힙니다. 벌점이 더 무겁기 때문입니다
# 길이 100 에서는 BIC 평균 차수가 1.7933 으로 오히려 작게 나옵니다
# 벌점이 무거워 짧은 자료에서는 필요한 항까지 떨어뜨립니다
# AIC 는 반대로 길이와 무관하게 2.7 근처를 고릅니다. 커지는 쪽으로 치우칩니다
# 189강 문제 2 의 두 기준이 여기서도 같은 성질을 보입니다
# 잔차를 여러 시차로 묶어 검정합니다
# 196강 문제 2 에서 시차 하나씩 보면 다중비교가 된다고 했습니다
# 맞춘 차수 묶음 통계량 자유도 대략의 기준값
# 1 203.2584 19 31.0823
# 2 20.3971 18 29.7600
# 3 18.9488 17 28.4287
# 차수 1 은 기준값을 크게 넘습니다. 남은 구조가 있다는 뜻입니다
# 차수 2 부터는 기준값 아래입니다. 백색잡음으로 볼 수 있습니다
# 자유도가 맞춘 계수 수만큼 줄어듭니다. 그만큼 자료를 썼기 때문입니다
# 되먹임 모형으로 앞을 내다봅니다
# 한 칸 되먹임에서 h 칸 뒤 예측은 phi 의 h 제곱 곱하기 현재값입니다
# 몇 칸 앞 예측 계수 예측 분산 자료 전체 분산
# 1 0.800000 1.000000 2.777778
# 2 0.640000 1.640000 2.777778
# 5 0.327680 2.479516 2.777778
# 10 0.107374 2.745752 2.777778
# 30 0.001238 2.777774 2.777778
# 멀리 갈수록 예측 계수가 0 으로 가고 분산이 전체 분산으로 갑니다
# 먼 미래에는 평균을 말하는 것 말고는 할 수 있는 것이 없습니다
# 이것이 정상 시계열의 성질입니다. 기억이 사라집니다
# 실제로 예측해서 오차를 재 봅니다
# 앞 2500 개로 계수를 맞추고 뒤 500 개를 예측합니다
# 추정한 계수는 0.779870 이고 참값은 0.8 입니다
# 몇 칸 앞 실제 제곱오차 이론 예측 분산 평균만 말할 때
# 1 0.972248 1.000000 2.777778
# 2 1.675491 1.640000 2.777778
# 5 2.590594 2.479516 2.777778
# 10 2.847751 2.745752 2.777778
# 실제 오차가 이론값과 붙습니다. 모형이 맞기 때문입니다
# 10 칸 앞에서는 평균만 말하는 것과 거의 같아집니다
# 구간을 답니다
# 몇 칸 앞 구간 반폭 실제 포함률 목표
# 1 1.978618 0.9559 0.95
# 2 2.533868 0.9518 0.95
# 5 3.115627 0.9394 0.95
# 10 3.278632 0.9367 0.95
# 1 칸과 2 칸은 0.9559 와 0.9518 로 목표에 닿습니다
# 10 칸에서는 0.9367 로 조금 모자랍니다. 계수 추정 오차가 들어가기 때문입니다
# 구간은 계수를 안다고 치고 계산한 것이라 실제보다 좁습니다
# 겹치는 구간으로 세었으므로 이 비율 자체도 서로 이어져 있습니다
# 자료가 짧으면 그 차이가 더 커집니다. 199강에서 다룹니다
# 둘을 합친 모형을 씁니다
# 되먹임 p 개와 이동평균 q 개를 함께 쓰면 ARMA 라 합니다
# 무엇을 쓰나 언제 몇 개의 계수
# 되먹임만 부분자기상관이 끊길 때 p 개
# 이동평균만 자기상관이 끊길 때 q 개
# 둘 다 둘 다 천천히 줄 때 p 더하기 q 개
# 차분한 뒤 둘 다 천천히 안 줄 때 198강
# 셋째 줄이 적은 계수로 같은 모양을 만드는 자리입니다
# 왜 둘을 섞는지 수치로 봅니다
# 한 칸 이동평균 자료를 되먹임만으로 맞춰 봅니다
# 되먹임 차수 잔차 분산 잔차 시차 1 상관
# 1 1.136988 0.134657
# 2 1.038807 0.056670
# 3 1.000396 0.023562
# 5 0.979727 0.002972
# 8 0.977440 -0.000054
# 되먹임만으로도 맞출 수 있지만 계수가 여럿 필요합니다
# 이동평균 계수 하나면 될 일에 되먹임 계수 다섯이 듭니다
# 계수가 많으면 추정 오차가 쌓입니다. 189강 문제 2 와 같습니다
# 실무에서 무엇을 확인하는지 정리합니다
# 무엇 어떻게
# 정상성 196강 문제 3 을 먼저
# 차수 후보 두 그림에서 읽기
# 차수 확정 AIC 와 BIC 를 함께
# 잔차 검사 묶음 검정으로
# 예측 검증 앞에서 뒤로만 나누기
# 계수 안정 구간을 나눠 다시 맞추기
# 마지막 줄이 자주 빠집니다. 구조가 변하면 계수도 변합니다
# 계수가 변하는 자료에서 무슨 일이 생기는지 봅니다
# 앞 절반은 0.8 이고 뒤 절반은 0.2 인 자료를 이어 붙입니다
# 어디로 맞추나 추정 계수 참값
# 전체 0.636781 섞임
# 앞 절반 0.808861 0.8
# 뒤 절반 0.157979 0.2
# 전체로 맞추면 어느 쪽도 아닌 값이 나옵니다
# 구간을 나눠 보면 계수가 다른 것이 드러납니다
# 한 모형이 전체를 설명한다고 가정하기 전에 이것을 확인해야 합니다
# 197강은 정상인 자료를 다뤘습니다. 198강은 그렇지 않은 자료를 다룹니다