<jupyter_start><jupyter_text>ปฏิบัติการครั้งที่ 7 กระบวนวิชา 229351 Statistical Learning for Data Scienceคำชี้แจง1. ให้เริ่มทำปฏิบัติการจาก colab notebook ที่กำหนดให้ จากนั้นบันทึกไว้ในไฟล์ *.pdf ดาวน์โหลดข้อมูลรถยนต์ชนิดต่างใน link ข้างล่างนี้  http://www.donlapark.cmustat.com/229351/data/AirPassengers.csv<jupyter_code>!pip install wget

!python -m wget -o AirPassengers.csv http://www.donlapark.cmustat.com/229351/data/AirPassengers.csv
# import module ที่ต้องใช้
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime
data = pd.read_csv('AirPassengers.csv')

print(data.head())

print (data.dtypes)
# ฟังก์ชันที่เปลี่ยน string ให้เป็น datetime
def parser(dates):
  return datetime.strptime(dates, '%Y-%m')

parser("2022-02")<jupyter_output><empty_output><jupyter_text>ในการสร้าง time series นั้น เราต้องกำหนดให้ Month เป็น index<jupyter_code># parse_dates ชื่อของคอลัมน์ที่จะเปลี่ยนให้เป็น datetime
# index_col ชื่อของคอลัมน์ที่จะให้เป็น index
# date_parser ฟังก์ชันที่เปลี่ยน string ให้เป็น datetime
data = pd.read_csv('AirPassengers.csv', parse_dates=['Month'], 
                                        index_col='Month',
                                        date_parser=parser)

print (data.head())

print (data.dtypes)
#1. Specific the index as a string constant:
ts = data['#Passengers']

print(ts)
ts['1950']
plt.plot(ts);<jupyter_output><empty_output><jupyter_text>จากแผนภาพข้างล่างนี้จะเห็นว่าความแปรปรวนเพิ่มขึ้นตามเวลา<jupyter_code>roll_std = ts.rolling(window=12).std()
plt.plot(roll_std, label = 'Rolling Std');<jupyter_output><empty_output><jupyter_text>ทดสอบด้วย KPSS test และ ADF testKPSS- $H_0$: $\texttt{ts}$ เป็น stationary- $H_1$: $\texttt{ts}$ มี unit rootADF- $H_0$: $\texttt{ts}$ มี unit root- $H_1$: $\texttt{ts}$ เป็น stationaryถ้าผลที่ได้จากการทดสอบสองตัวนี้ไม่สอดคล้องกัน แสดงว่ามีข้อมูลไม่เพียงพอ<jupyter_code>from statsmodels.tsa.stattools import adfuller, kpss

def KPSStest(timeseries):
  kpsstest = kpss(timeseries, lags='auto')
  print('KPSS test')
  print('Test Statistic: ',kpsstest[0])
  print('p-value: ',kpsstest[1])
  print('Number of Observations Used: ',kpsstest[2])
  print('Critical Values: ',kpsstest[3])

def ADFtest(timeseries):
  adftest = adfuller(timeseries)
  print('ADF test')
  print('Test Statistic: ',adftest[0])
  print('p-value: ',adftest[1])
  print('#Lags Used: ',adftest[2])
  print('Number of Observations Used: ',adftest[3])
  print('Critical Values: ',adftest[4])


KPSStest(ts)
ADFtest(ts)<jupyter_output><empty_output><jupyter_text>ปรับความแปรปรวนด้วยการใส่ log<jupyter_code>ts_log = np.log(ts)
plt.plot(ts_log)
roll_std = ts_log.rolling(window=12).std()
plt.plot(roll_std, label = 'Rolling Std');
KPSStest(ts_log)
ADFtest(ts_log)<jupyter_output><empty_output><jupyter_text>ทำ differencing โดยใช้ $\texttt{time_series.shift()}$ ในการเลื่อนข้อมูลไปข้างหน้า 1 วัน<jupyter_code>ts_log_diff = ts_log - ts_log.shift() #y_(t)-y_(t-1)

plt.plot(ts_log_diff);
print(ts_log)

print(ts_log.shift())

KPSStest(ts_log_diff)
ADFtest(ts_log_diff)<jupyter_output><empty_output><jupyter_text>เกิด Error เพราะว่าข้อมูลแถวแรกเป็น NaN ซึ่งเกิดจากการเลื่อนข้อมูลไปข้างหน้า 1 วัน<jupyter_code>ts_log_diff
ts_log_diff.dropna(inplace=True)
ts_log_diff
KPSStest(ts_log_diff)
ADFtest(ts_log_diff)<jupyter_output><empty_output><jupyter_text>ลอง differencing อีกหนึ่งครั้งถ้ายังไม่พอใจกับผลที่ได้<jupyter_code>ts_log_diff2 = ts_log_diff - ts_log_diff.shift()
ts_log_diff2.dropna(inplace=True)
ts_log_diff2

plt.plot(ts_log_diff2);
KPSStest(ts_log_diff2)
ADFtest(ts_log_diff2)<jupyter_output><empty_output><jupyter_text>สร้างแผนภาพ ACF และ PACF- ค่า ACF ที่ลดลงไปเรื่อยๆ แสดงถึง trend- จุดที่ peak ขึ้นมาใน ACF แสดงถึง seasonality- จุดที่เกินบริเวณสีฟ้าใน ACF แสดงถึง lag ที่ช่วยในการทำนาย $y_t$- ใช้ PACF เพื่อดูว่า lag ไหนที่ไม่เกี่ยวข้องกันบ้าง ถ้าค่า PACF เกินบริเวณสีฟ้าแสดงว่า lag นั้นไม่เกี่ยวข้องกับ lag ก่อนหน้า<jupyter_code>from statsmodels.graphics.tsaplots import plot_acf, plot_pacf

fig, ax = plt.subplots(2,1,figsize=(10, 10))
plot_acf(ts, lags=25, ax=ax[0]);
plot_pacf(ts, lags=25, ax=ax[1]);
fig, ax = plt.subplots(2,1,figsize=(10, 10))
plot_acf(ts_log_diff2, lags=18, ax=ax[0]);
plot_pacf(ts_log_diff2, lags=18, ax=ax[1]);<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.1645926273773186, 'fraction_numerical': 0.019488142756515614, 'mean_word_length': 7.48605577689243, 'pattern_counts': {'":': 0, '<': 37, '<?xml version=': 0, '>': 37, 'https://': 0, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '9', 'dir': 'jupyter-structured-clean-dedup', 'id': '82625', 'license': 'MIT', 'n_tokens_mistral': 2290, 'n_tokens_neox': 2322, 'n_words': 278, 'path': 'Labs/229351-LAB08-01.ipynb', 'repo_name': 'donlapark/ds351.github.io', 'size': '4259'}