Nowcasting GDP ด้วย Polynomial Regression Model
VS Code + Jupyter Notebook
Nowcasting คืออะไร ต่างจาก Forecasting อย่างไร ?
Forecasting คือการนำข้อมูลที่มีอยู่ มาใช้คาดการณ์สิ่งที่จะเกิดขึ้นในอนาคต ส่วน Nowcasting (มาจากคำว่า Now + Forecasting) คือการนำข้อมูลที่มีอยู่ มาใช้คาดการณ์ถึงสิ่งที่เกิดขึ้นในช่วงเวลาเดียวกัน หรือเกิดขึ้นไปแล้ว
ตัวอย่างเช่น
วันนี้ คือ วันที่ 31 May 2021 อยู่ในช่วง Quater 2/2021
US GDP Q2/2021 จะประกาศตัวเลขในช่วง July 2021 โดยตัวเลขที่ประกาศออกมานั้น คือผลสะท้อนในอดีตที่เกิดขึ้นไปแล้ว และนั้นคือสิ่งที่เราจะ nowcasting กันในบทความนี้
Regression Model
Regression เป็นวิธีทางสถิติเพื่อศึกษาความสัมพันธ์ระหว่างตัวแปร 2 ตัวขึ้นไป เช่น GDP กับ ระยะเวลาไตรมาส, ความสัมพันธ์ระหว่างยอดขายกับช่องทางการขาย โดย แบ่งออกเป็น 3 แบบ ได้แก่
1) Linear regression
2) Polynomial regression
3) Logistic regression (ตัวนี้จะไม่พูดถึงนะครับ เพราะผู้เขียนไม่รู้จัก ฮ่าๆ)
Linear regression
คือ การศึกษาความสัมพันธ์ระหว่างตัวแปรที่มีความสันพันธ์เป็นเส้นตรง
Polynomial regression
คือ การศึกษาความสัมพันธ์ระหว่างตัวแปรที่มีความสัมพันธ์ไม่เป็นเส้นตรง (ความสัมพันธ์เป็นแบบเส้นโค้ง)
เริ่ม Nowcasting GDP ด้วย Polynomial regression กันเลยดีกว่า Let’s goooo
Prerequisite
1) Visual Studio Code + Jupyter notebook extension
2) Python 3
3) US GDP historical data
ในส่วนของวิธีการ setup workspace ผู้เขียนจะไม่ได้ลงรายละเอียดในบทความนี้นะครับ เพราะจะยาวจนเกินไป
หรือใครที่ไม่อยาก Setup workspace ให้วุ่นวายก็สามารถใช้ Google Colab ได้ครับ (มี source code ที่ Colab อยู่บรรทัดสุดท้ายของบทความ)
Step 1) เตรียม Dataset
เข้าไปโหลด US GDP historical data ได้จาก FRED Economic data โดยเลือก
- Frequency: Quarterly
- Range data: 1947–01–01 to 2021–02–08
Step 2) Import CSV data
import pandas as pd
import numpy as npdata = pd.read_csv(‘GDP.csv’, engine=’python’)
data['row'] = np.arange(len(data))data
Step 3) แปลงชุดข้อมูลให้เป็นแกน X กับ Y
X = data.iloc[:, 2:3].values # field Row No.
Y = data.iloc[:, 1].values # field GDP
ในส่วนตรงนี้ผู้เขียนไม่ใช้ field DATE เป็นแกน X เพราะจะค่อนข้างวุ่นวายในการจัดการ variable DATE type เลยใช้ field row ที่สร้างขึ้นมาใหม่ จะง่ายกว่า
Step 4) แบ่ง Dataset สำหรับ Training & Testing Model
1) Training data 80%
2) Testing data 20%
จะใช้ ratio อื่นๆ เช่น 75:25, 70:30, 60:40 ก็ได้ แล้วค่อยเลือกใช้ ratio ที่ทำให้ model เรามี performance ออกมาดีที่สุดเป็นพอ สามารถวัดได้โดยการใช้ metrics เช่น RMSE & R2 ซึ่งเป็น metrics ที่เหมาะในการวัด performance ของ regression
เนื่องจากเรามี Data ทั้งหมด 297 rows ดังนั้น 80% ก็คือ 237 rows
X_Test = X[237:] # Row index 237 - 296 (Testing data 20%)
X_Train = X[:237] # Row index 0 - 236 (Training data 80%)Y_Test = Y[237:]
Y_Train = Y[:237]
เราลองเอา dataset ที่เราแบ่งเรียบร้อยแล้วลองมา plot graph
import matplotlib.pyplot as pltplt.scatter(X_Train, Y_Train, s=20, label='Training Data', color='blue')
plt.scatter(X_Test, Y_Test, s=20, label='Testing Data', color='royalblue')
plt.title(‘GDP’)
plt.xlabel(‘Quarterly’)
plt.ylabel(‘Billions of Dollars’)
plt.legend()
plt.show()
Step 5) เริ่มสร้าง Model
ขั้นต่อไปเราจะนำ Dataset (Training & Test data) ที่แบ่งไว้มาสร้าง Linear model ด้วย library sklearn
from sklearn.linear_model import LinearRegressionmodel_lin = LinearRegression()
model_lin.fit(X_Train, Y_Train)
ลอง plot graph ออกมาโดยเราจะให้ แกน Y เท่ากับค่าที่ model predict ได้ในแต่ละตำแหน่งของค่า X ด้วยคำสั่ง model_lin.predict(X_Train)
plt.plot(X_Train, model_lin.predict(X_Train), label=’Linear Regression’, color=’red’)
จะได้ผลลัพธ์มาตามรูปด้านบน โดยที่เส้นสีแดง คือ ผลลัพธ์ของ linear model ที่ predict ออกมาได้ ซึ่งถ้าเทียบกับ historical data (เส้นสีน้ำเงิน Traning + Testing Data) จะเห็นได้ชัดเจนเลยว่ามีความ Underfit ไปมาก ไม่สามารถนำมาใช้ในการ Nowcasting GDP ได้อย่างแน่นอน
ซึ่งเราจะมาแก้ปัญหานี้ด้วยการใช้ Poly regression แทน เนื่องจาก GDP & Quater นั้นมีความสัมพันธ์เป็นแบบเส้นโค้ง
from sklearn.preprocessing import PolynomialFeaturespoly_model = PolynomialFeatures(degree=2)
X_poly = poly_model.fit_transform(X_Train)model = LinearRegression()
model.fit(X_poly, Y_Train)
Y_poly_pred = model.predict(X_poly)
โดย Fitting model ด้วย degree = 2 ซึ่งค่า degree นี้ถ้าหากเราใช้ค่าน้อยเกินไปก็จะ Underfitting แต่ถ้ามากเกินไปก็อาจจะเกิด Overfitting ได้ สิ่งที่เราควรได้คือทางสายกลาง Correct Fit
ลอง plot graph ออกมาดู โดยจะให้แกน Y เท่ากับค่าที่ model predict ได้เหมือนตอนทำ linear model
plt.plot(X_Train, Y_poly_pred, color=’red’, label=’Poly Regression’)
ลองเปรียบเทียบผลลัพธ์ที่ได้จาก Linear VS Poly ด้วยการ Predict GDP Q1/2006 ด้วยคำส่งต่อไปนี้
// Using Linear Model to predict an outcome
model_lin.predict([[xxx]]) // Using Poly Model to predict an outcome
model.predict(poly_model.fit_transform([[xxx]))
โดย xxx คือ GDP Quarter ที่เราต้องการ Predict ซึ่งในทีนี้คือแกน X หรือ field row
# Predict GDP Q1/2006 with Linear Regression
output_linear = model_lin.predict([[237]]) // row 237 is Q1/2006# Predict GDP Q1/2006 with Poly Regression
ouput_poly = model.predict(poly_model.fit_transform([[237]]))# Historical GDP (Actual)
data.loc[237].GDPLinear = 9721.343
Poly = 12952.620
Actual = 13749.806
จะเห็นได้ว่า ผลลัพธ์ของ Poly model นั้นมีความใกล้เคียงกับ historical data มากกว่า Linear model
Step 6) Testing Model
หลังจากเรานำ dataset 80% ไป training สร้าง model กันแล้ว คราวนี้เราจะนำ 20% ที่เหลือมา validate model ของเราว่ามีความน่าเชื่อถือมากน้อยแค่ไหน
เริ่มด้วยการ predict ค่า GDP ในช่วงของชุดข้อมูล Data Test (X_Test)
predict_data = []for i in X_Test:
predict_data.append(model.predict(poly_model.fit_transform(np.array(i).reshape(1,-1)))[0])
นำไป plot graph
plt.plot(X_Test, predict_data, label=’Predict’, color=’orange’)
วัดประสิทธิภาพของ Model ด้วย Metrics RMSE & R2
from sklearn import metrics
metrics.mean_squared_error(Y_Test,predict_data)
metrics.r2_score(Y_Test,predict_data)RMSE = 210.42360937488053
Score = 0.9968575654287439
RMSE = 210.42360 แปลว่าโดนเฉลี่ย Model ทำนายคลาดเคลื่อนไป +- 210.42 Billions of Dollars
R2 score = 0.99685 ซึ่งมีค่าใกล้เคียงกับ 1 นั้นหมายความว่า Model เราสามารถทำนายได้ผลดี
Last Step) Foward Testing
เมื่อทำการ Backtesting ไปแล้ว ก็ควรทำ Forwardtesting ด้วยเพื่อเป็นการเช็ค Performance และนี้คือผลที่ได้ โดยผู้เขียนได้ทำการ Nowcasting 2021 Q2,3,4 และ 2022 Q1 ไว้เมื่อวันที่ 26 May 2021
2021 Q2 diff +1.81419 %
2021 Q3 diff +2.94741 %
จะได้เห็นว่า Poly regression model สามารถ nowcasting ค่าได้ดี ใช้เวลาในการสร้าง Model ไม่นาน เนื่องจากมีความซับซ้อนน้อย
แต่ในโลกแห่งความเป็นจริงนั้น GDP ไม่ได้วิ่งเป็น Linear, Linear curve เนื่อจากมีเรื่องของ Trends, Seasonality, Cycle และอื่นๆ อีกมากมายมาเกี่ยวข้อง อาจทำให้ Model ที่เราสร้างขึ้นไม่มีประสิทธิภาพ, ความแม่นยำเพียงพอ ซึ่งในบทความหน้าเราจะมาลองแก้ปัญหานี้ด้วยการใช้ ARIMA Model แทน
Source code: Nowcasting GDP using Poly Regression Model