<jupyter_start><jupyter_text>ปฏิบัติการครั้งที่ 11 กระบวนวิชา 229351 Statistical Learning for Data Scienceคำชี้แจง1. ให้เริ่มทำปฏิบัติการจาก colab notebook ที่กำหนดให้ จากนั้นบันทึกไว้เป็นไฟล์ *.pdf2. ส่งใน Microsoft Teams ดาวน์โหลดข้อมูลการขายรถยนต์ใน link ข้างล่างนี้  http://www.donlapark.cmustat.com/229351/data/CarSales.csv<jupyter_code># uploading the csv file to colab

# uploading the csv file to colab

!pip install wget

!python -m wget -o CarSales.csv http://www.donlapark.cmustat.com/229351/data/CarSales.csv
# import module ที่ต้องใช้
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# ฟังก์ชันที่เปลี่ยน string ให้เป็น datetime
def parser(dates):
  return pd.datetime.strptime(dates, '%Y-%m')

# parse_dates ชื่อของคอลัมน์ที่จะเปลี่ยนให้เป็น datetime
# index_col ชื่อของคอลัมน์ที่จะให้เป็น index
# date_parser ฟังก์ชันที่เปลี่ยน string ให้เป็น datetime
data = pd.read_csv('CarSales.csv', parse_dates=['Month'], 
                                        index_col='Month',
                                        date_parser=parser)

print (data.head())
y = data['Sales'].astype('float32')

print(y)
plt.figure(figsize=(12,6))
y.plot();
def rmse(y_true,y_pred):
  # Inputs
  # y_true: actual value, y_pred: predicted values
  # Output: RMSE between y_true and y_pred
  return np.sqrt(np.mean(np.square(y_true-y_pred)))<jupyter_output><empty_output><jupyter_text>Train-Test split<jupyter_code>train = y[:-12]
test = y[-12:]

print(test)<jupyter_output><empty_output><jupyter_text>ARIMA($p,d,q$)<jupyter_code>from statsmodels.tsa.stattools import adfuller, kpss

def KPSStest(timeseries):
  kpsstest = kpss(timeseries)
  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(y)
ADFtest(y)
y_diff = y-y.shift()
y_diff.dropna(inplace=True)

KPSStest(y_diff)
ADFtest(y_diff)<jupyter_output><empty_output><jupyter_text>ลองพล็อต ACF และ PACF ของ time series **ที่ผ่าน difference แล้ว**1. ถ้า ACF ลดลงไปเรื่อยๆ และ PACF หายไปหลังจาก lag ใด lag หนึ่ง แสดงว่าค่าของ lag นั้นเป็นค่าอันดับ AR (นั่นคือค่า $p$) ที่เหมาะสม2. ถ้า PACF ลดลงไปเรื่อยๆ และ ACF หายไปหลังจาก lag ใด lag หนึ่ง แสดงว่าค่าของ lag นั้นเป็นค่าอันดับ MA (นั่นคือค่า $q$) ที่เหมาะสม ![alt text](http://people.duke.edu/%7Ernau/unitsac1.gif)![alt text](http://people.duke.edu/%7Ernau/unitspa1.gif)                                                                              source: http://people.duke.edu/%7Ernau/411arim3.htmในกรณีนี้ $(p,d,q)=(2,1,0)$<jupyter_code>from statsmodels.graphics.tsaplots import plot_acf, plot_pacf

fig, ax = plt.subplots(2,1,figsize=(15, 10))

plot_acf(y_diff, lags=20, ax=ax[0]);
ax[0].axhline(y=-1.96/(len(y)-1)**.5, linestyle = '--')
ax[0].axhline(y=1.96/(len(y)-1)**.5, linestyle = '--')

plot_pacf(y_diff, lags=20, ax=ax[1]);
ax[1].axhline(y=-1.96/(len(y)-1)**.5, linestyle = '--')
ax[1].axhline(y=1.96/(len(y)-1)**.5, linestyle = '--')
train
from statsmodels.tsa.arima.model import ARIMA

arima = ARIMA(train, order=(0,1,0))<jupyter_output><empty_output><jupyter_text>1. Problem: ไม่มี statsmodels.tsa.arima   Solution: ใช้ from statsmodels.tsa.arima.model import ARIMA  2.<jupyter_code>arima_fit = arima.fit()
yhat = arima_fit.predict('1968-01-01', '1968-12-01')
plt.figure(figsize=(12,6))
y.plot()
yhat.plot();
from statsmodels.tsa.statespace.sarimax import SARIMAX
                                                       
sarima = SARIMAX(train, order=(0, 1, 0), seasonal_order=(0, 0, 1, 12)) 

sarima_fit = sarima.fit(optimized=True)
yhat = sarima_fit.predict('1968-01-01', '1968-12-01')

plt.figure(figsize=(12,6))
y.plot()
yhat.plot();
print('RMSE:',rmse(test,yhat))<jupyter_output><empty_output><jupyter_text>ใช้ `auto_arima` จาก `pmdarima` เพื่อหา order ที่เหมาะสม<jupyter_code>!pip3 install pmdarima
import pmdarima as pm

auto_fit = pm.auto_arima(train, start_p=0, start_q=0, max_p=3, max_q=3, d=0,
                             seasonal=True, m=12, start_P=0, start_Q=0, D=0,
                             information_criterion = 'aicc', # choose model with the lowest corrected AIC
                             trace = True,
                             error_action='ignore',  # don't want to know if an order does not work
                             suppress_warnings=True) # don't want convergence warnings
auto_fit.summary()
predictions = auto_fit.predict(12)
yhat = pd.Series(predictions,
                    index=test.index)

plt.figure(figsize=(12,6))
ax = y.plot()
yhat.plot(ax=ax);
print('RMSE:',rmse(test,yhat))<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.1660892602404728, 'fraction_numerical': 0.0319951090279193, 'mean_word_length': 4.080745341614906, 'pattern_counts': {'":': 0, '<': 25, '<?xml version=': 0, '>': 25, 'https://': 0, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 7, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '6', 'dir': 'jupyter-structured-clean-dedup', 'id': '124681', 'license': 'MIT', 'n_tokens_mistral': 2301, 'n_tokens_neox': 2242, 'n_words': 344, 'path': 'Labs/229351-LAB11-01.ipynb', 'repo_name': 'donlapark/ds351.github.io', 'size': '4907'}