Data Science

Time Series Forecasting คืออะไร? + สรุปหนังสือออนไลน์แจกฟรีที่แอดเรียน ละเอียดมาก

การวิเคราะห์ Time Series แบบละเอียดมาก

เทอมสุดท้ายของชีวิตปอโทนี้ แอดได้โดดไปลงวิชาของคณะเศรษศาสตร์ที่เรียนจบแล้วประทับใจมาก ๆ ชื่อว่า Business Forecasting หรือ “การคาดการณ์ทางธุรกิจ” (อันนี้ Google แปลมาให้)

คำเตือน: บทความนี้ยาวมาก ๆๆๆๆๆ เหมือนมานั่งเรียนวิชานี้กับแอดเลย แนะนำให้ Bookmark หรือแปะลง Facebook เอาไว้ค่อย ๆ อ่านก็ได้ฮะ (เราเตือนคุณแล้ว)

วิชา Business Forecasting นี่จริง ๆ เค้าทำขึ้นมาเพื่อสอนนักเรียนด้านเศรษฐศาสตร์และบริหาร เพื่อที่จะได้สามารถดูกราฟแล้วสร้างโมเดลทำนายออกมาเองได้ แต่สำหรับคนที่สนใจด้าน Data Science (เช่นแอดมินเอง) แล้ว วิชานี้น่าสนใจมาก ๆ เพราะวิชานี้เจาะลึกข้อมูลประเภทที่เราไม่ได้เห็นกันบ่อย ๆ เวลาเรียน Machine Learning

นั่นก็คือ.. ข้อมูลประเภท Time Series นั่นเองครับ

ข้อมูล Time Series คืออะไร แล้วทำไมคนเรียน Data Science ควรสนใจ

time-series-plot.png

ตัวอย่างกราฟ Time Series จาก FPP2 Chapter 2.2

ข้อมูล Time Series (ภาษาไทยเท่ ๆ ว่า “อนุกรมเวลา”) คือ ข้อมูลที่เปลี่ยนแปลงไปตามเวลา เช่น ค่าเงินบาทไทยเทียบกับสหรัฐอเมริกา, ราคาหุ้น, ยอดขายไอศกรีมรายวัน, จำนวนสินค้าที่ผลิตได้ในแต่ละเดือน ฯลฯ

ปกติแล้วถ้าเราเรียนวิชาที่เกี่ยวข้องกับ Machine Learning เราก็จะเรียนโมเดลทำนายผลประเภท Linear Regression, Decision Tree, Neural Network ซึ่งออกแบบมาให้ใช้กับข้อมูลทั่วไป เพราะฉะนั้นโมเดลพวกนี้จะไม่ได้รองรับฟีเจอร์พิเศษต่าง ๆ ของ Time Series

ความแตกต่างของข้อมูลแบบ Time Series กับข้อมูลทั่วไป คือ ข้อมูลพวกนี้มีฟีเจอร์ในส่วนที่เกี่ยวข้องกับ เวลา เช่น

  • Trend (เทรนด์)
  • Seasonality (ความแปรผันตามฤดูกาล)
  • Cycle (วัฏจักร)

ที่เราสามารถนำมาใส่ในโมเดล เพื่อให้ทำนายผลได้ออกมาแม่นยำมากขึ้นครับ

แอดมองว่าข้อมูลแบบ Time Series เป็นข้อมูลที่สำคัญและพบเห็นได้ทั่วไปไม่ว่าจะทำงานที่ไหน เพราะฉะนั้นคนที่เป็น Data Scientist ควรมีความรู้เอาไว้ไม่มากก็น้อยครับ

ตัวอย่าง: ทดลองใช้ Linear Regression กับข้อมูล Time Series

linear-regression-time-series

หากเราใช้ Linear Regression ขีดเป็นเส้นตรง จะไม่เหมาะสมกับข้อมูล Time Series ที่มี Seasonality

 

เรามาลองใช้ Linear Regression ในการโมเดล Time Series ในกราฟข้อมูลที่แสดงก่อนหน้านี้ครับ เราจะเห็นว่าข้อมูลชุดนี้มีลูกคลื่นที่เราเห็นเป็นระยะ ๆ ในกราฟ

คลื่นพวกนี้เกิดจากที่ยอดขายของยาสูงเป็นพิเศษในเดือนมกราคมทุกปี จึงทำให้กราฟของเรามีคลื่นนี้อยู่ทุกปี เราเรียกผลจากเดือนมกราคมนี้ว่า Seasonality ครับ

เพราะข้อมูลมี Seasonality ทำให้เราไม่สามารถขีดเส้นธรรมดาด้วย Linear Regression เพื่อทำนายผลได้ เราต้องคิดถึงผลของ Seasonality ด้วยครับ

ลองมาดูตัวอย่างการใช้ Regression ที่มีตัวแปรสำหรับ Seasonality กัน

linear-model-forecast-trend-seas.png

ในรูปนี้ใช้ Linear Regression เช่นเดิม แต่มีการเพิ่มตัวแปรสำหรับ Seasonality ด้วย

บางท่านอาจจะสงสัยว่าทำไมใช้ Regression แล้วผลลัพธ์ (เส้นสีน้ำเงิน) ถึงออกมาไม่เป็นเส้นตรง นั่นเพราะเค้ามีการใช้สิ่งที่เรียกว่า Dummy Variable หรือ ใส่ค่าใน Input เป็น 0 กับ 1 ครับ

เช่น เราเพิ่มตัวแปรชื่อ season2 เข้าไป ถ้าแถวของข้อมูลที่เราคำนวณอยู่เป็นของเดือนกุมภาพันธ์ ตัวแปร season2 = 1 แต่ถ้าไม่ใช่เดือนกุมภาพันธ์ ตัวแปร season2 = 0 ทำให้เราสามารถใส่ค่าเพิ่มใน Regression ได้เฉพาะสำหรับบางเดือนเท่านั้น

สำหรับใครที่อยากลองรันพลอตด้านบนใน R สามารถดาวน์โหลดแพ็กเกจ FPP2 ซึ่งเป็นแพ็กเกจที่แอดใช้เรียนวิชา Business Forecasting เพื่อนำโค้ดด้านล่างไปรันได้เลยครับ (วิชานี้อาจารย์ผู้สอนเป็นหนึ่งในทีมเขียน Package ครับ)

library(fpp2)

# View the data (this comes with fpp2 package)
a10

# Plot the time series data
autoplot(a10) +
  ggtitle("Antidiabetic drug sales") +
  ylab("$ million") +
  xlab("Year")

# Fit the linear model to the data with trend & season as predictors
fit = tslm(a10 ~ trend + season)
# Plot the linear model forecasts
autoplot( forecast(fit) )

ถ้าเริ่มสนใจเรื่องการสร้างโมเดลสำหรับข้อมูล Time Series กันแล้ว แอดมีหนังสือออนไลน์ดี ๆ มาแนะนำกันครับ เป็นหนังสือที่แอดใช้เรียนวิชา Business Forecasting เลย (อาจารย์ผู้สอนเป็นหนึ่งในผู้เขียนเช่นกัน ซึ่งมีหลายมหาวิทยาลัยที่ทำ Slide โดย Reference จากหนังสือเล่มนี้ น่าจะเพราะผู้เขียนอีกท่านเป็น Professor ด้าน Time Series อันดับต้น ๆ ในออสเตรเลียครับ)

แจกฟรี หนังสือออนไลน์สอน Time Series Forecasting

fpp2_book_cover.jpg

ปกหนังสือออนไลน์ที่แอดเห็นครั้งแรกตั้งแต่ปี 2016 แต่ไม่ได้เรียนจนกระทั่งเทอมนี้ (เพราะเปิดอ่านเองแล้วงง)

หนังสือ Forecasting: Principles and Practice เวอร์ชั่น 2 หรือ FPP2 สามารถอ่านบนออนไลน์ได้ฟรี หรือจะซื้อเป็นเล่มบน Amazon ก็ได้ครับ ซึ่งอาจารย์ผู้สอนเค้าบอกเองเลยว่าไม่แนะนำให้ซื้อเป็นเล่ม เพราะเนื้อหาบนออนไลน์มีการอัพเดทใหม่ตลอดครับ

เนื้อหาในหนังสือเล่มนี้ค่อนข้างอ่านง่าย เพราะเค้าไม่ลงลึกในส่วนของสูตรต่าง ๆ มากนัก เน้นเขียนให้คนที่มีพื้นฐานสถิติ หรือคณิตศาสตร์มัธยมปลาย ก็สามารถอ่านเข้าใจได้ แต่ส่วนไหนที่ต้องใช้ความรู้เพิ่มเติมเค้าจะมีเขียนกำกับไว้ครับ (เช่น การทำ Matrix Formulation เวลาใช้โมเดล Linear Regression)

วิชาที่แอดเรียนอยู่นี่เค้าสอนทั้งปริญญาตรี และปริญญาโทในห้องเรียนเดียวกันเลยครับ ใช้เนื้อหาเดียวกันหมด สิ่งที่แตกต่างกันก็แค่ว่าของปริญญาโทจะมีส่งการบ้านที่เป็นงานกลุ่มด้วย เพราะฉะนั้นคนที่เรียนปริญญาตรีอยู่ก็อ่านหนังสือเล่มนี้รู้เรื่องแน่นอน

แต่ว่าถ้าให้เปิดไปอ่านเองแบบอ่านเรียงจากบทแรกจนบทสุดท้าย อาจจะงงและเลิกอ่านกันไปก่อนครับ เพราะฉะนั้นเลยจะมาสรุปตามเนื้อหาที่แอดเรียนในวิชานี้ให้ จะได้ไปศึกษากันง่าย ๆ

สรุปหัวข้อที่ต้องอ่านเรียงตามลำดับ สำหรับหนังสือ Forecasting: Principles and Practice

อันนี้คือหัวข้อที่แอดเรียน เรียงตามลำดับที่สอนในวิชา Business Forecasting จริงเลยครับ ถ้าเรียนจบหมดนี่จะเข้าใจเรื่องต่าง ๆ ดังนี้ครับ:

  • พื้นฐานเกี่ยวกับการทำนายผลข้อมูล Time Series
  • วิธีพลอตกราฟต่าง ๆ ที่สำคัญสำหรับข้อมูล Time Series
  • วิธีการทำนายพื้นฐาน: Naive, Seasonal Naive, Drift, Average
  • วิธีการแปลงข้อมูลด้วย BoxCox Transformation
  • วิธีวิเคราะห์ Residuals
  • วิธีการทำ Decomposition แบบต่าง ๆ: Classical, X-11, SEATS, STL
  • โมเดล Time Series ที่คนนิยมใช้กัน: ETS, ARIMA
  • โมเดล Time Series ด้วย Linear Regression
  • Regression ขั้นสูง ด้วย ARMA Error

บทที่ 1: Getting Started

บทนี้จะปูพื้นฐานเกี่ยวกับการ Forecast (ทำนายผล) ว่านำไปใช้ทำอะไร และมีขั้นตอนอย่างไร ซึ่งมีประโยชน์มากสำหรับความเข้าใจภาพกว้างว่าการ Forecast มีประโยชน์กับธุรกิจอย่างไร

(หนังสือเล่มนี้เนื้อหาค่อนข้าง Practical มากครับ อ่านจบแล้วแอดคิดว่านำไปใช้ประโยชน์ได้ไม่ยากเลย)

บทที่ 2: Time Series Graphics

บทนี้จะเริ่มเข้าเรื่องการทำ Forecast พูดถึงกราฟประเภทต่าง ๆ ที่เราจำเป็นต้องใช้ รวมไปถึงประโยชน์ของมัน พลอตที่ใช้บ่อยเวลาทำโมเดลก็คือ Time Series Plot, Seasonal Plot, Seasonal Subseries Plot, Autocorrelation (ACF) Plot ครับ

มาลองดูสัก 1 ตัวอย่างของพลอตที่สำคัญ ๆ กัน

timeseries-subseriesplot.png

ตัวอย่าง Seasonal Subseries Plot จาก FPP2 Chapter 2.5

พลอตนี้มีชื่อว่า Seasonal Subseries Plot ครับ ซึ่งอันนี้เป็นข้อมูลเดียวกับพลอตตัวอย่างอื่น ๆ ที่เราใช้ด้านบนเลย พลอตนี้มีประโยชน์มากในการดูเรื่องของ Seasonality ครับ

วิธีอ่าน Seasonal Subseries Plot คือ:

  • เส้นสีดำ = ความเปลี่ยนแปลงของยอดขายในแต่ละเดือนของทุกปี เช่น เดือนมกราคมของทุกปียอดขายสูงขึ้นเรื่อย ๆ (คอลัมน์ Jan เส้นสีดำ)
  • เส้นสีน้ำเงิน = ค่าเฉลี่ย (Mean) ของแต่ละเดือน ซึ่งเห็นได้ชัดเจนเลยว่าเดือนมกราคมมียอดขายเฉลี่ยสูงกว่าเดือนอื่น ๆ (คอลัมน์ Jan เส้นสีน้ำเงิน)

บทที่ 3: The forecaster’s toolbox

บทนี้ยาวหน่อย เพราะครอบคลุมพื้นฐานของการทำ Forecast ครบมากครับ

ช่วงแรก เค้าจะแนะนำวิธีทำนายแบบง่าย ๆ ได้แก่ Average, Naive, Seasonal Naive, Drift ซึ่งวิธีเหล่านี้เรียบง่ายแต่มีประโยชน์มาก เราสามารถใช้เพื่อเปรียบเทียบผลลัพธ์กับวิธีที่ซับซ้อนอื่น ๆ ได้ครับ

มาลองดูตัวอย่างหนึ่งในวิธีทำนายแบบง่าย ๆ ที่ชื่อว่า Naive หรืออีกชื่อคือ Random Walk ครับ

naive-method-forecast.png

ผลลัพธ์จากวิธีทำนาย Naive

 

วิธีทำนายแบบ Naive ก็ตรง ๆ โง่ ๆ ตามชื่อของมันเลยครับ (Naive แปลว่า ซื่อ ๆ ไร้เดียงสา) ก็คือ “ค่าในอนาคต = ค่าสุดท้ายในอดีต” เลยทำให้ผลทำนายออกมาเป็นเส้นตรงจากค่าสุดท้ายใน Time Series เลยครับ

ช่วงที่สอง เค้าพูดถึงเรื่องการ Transform ข้อมูล เพราะข้อมูลที่ Variance ไม่ Stable จะทำให้ต้องใช้วิธีทำนายที่ซับซ้อนในการทำผล เราสามารถแปลงข้อมูลด้วย Log หรือ BoxCox Transformation (เป็นได้ทั้ง Log และ Power Transformation ในฟังก์ชั่นเดียว)

ลองดูตัวอย่างข้อมูลชุดเดิมกับข้างบน ๆ (ยอดขายยา) ที่ทำ Transformation แล้วครับ

boxcox-transformation.png

พอทำ BoxCox Transformation ด้วย Best Lambda จะเห็นว่า Variance ของกราฟนี้เท่ากันหมดแล้ว

เวลาคิดถึง Variance คิดง่าย ๆ ว่า คือ ความสูงของคลื่น Seasonality ครับ ถ้าย้อนกลับไปดูจะเห็นว่าข้อมูลของเรามีคลื่นที่เริ่มจากความสูงเล็ก ๆ และค่อย ๆ เพิ่มขึ้น พอเราใช้ BoxCox Transformation แล้วคลื่นออกมาสูงเท่ากันหมด ทำให้เราสามารถใช้โมเดลที่ Simple ขึ้นในการทำนายได้

สำหรับคนที่อยากลองพลอตนี้ สามารถนำโค้ดด้านล่างไปรันใน R ได้เช่นเคยครับ (อย่าลืมเรียก library(fpp2) ก่อน)

# Find the parameter for BoxCox transformation
(best_lambda = BoxCox.lambda(a10))
# Apply BoxCox transformation
BoxCox(a10, lambda=best_lambda)
# Plot the transformed data
autoplot( a10_transformed )

ช่วงที่สาม ก็สำคัญไม่แพ้ช่วงก่อนหน้านี้ครับ นั่นคือ การวิเคราะห์ความผิดพลาดของโมเดลทำนาย หรือ Residuals นั่นเอง

เราต้องการความมั่นใจว่าโมเดลของเราสามารถทำนายผลของ Time Series ได้เหมาะสม เราจึงต้องมาเช็คว่าผลทำนายผิดพลาดของเรามี Pattern อะไรมั้ย เราอาจจะเจอได้ว่ามีข้อมูลบางส่วนที่โมเดลของเรายังดึงออกมาไม่หมด

วิธีหนึ่งที่เช็คได้ง่าย ๆ ว่ามีข้อมูลอะไรที่โมเดลของเรายังขาดอยู่มั้ย คือ การใช้ Ljung-Box Test ที่จะบอกได้ว่าค่า Residuals ของเรามี Correlation อะไรกันมั้ย ถ้ามี แปลว่าในข้อมูลยังมี Pattern บางอย่างที่เรายังจับไม่ได้

ลองมาดูตัวอย่างของการทำ Residual Analysis กันครับ

checkresiduals-1.png

จะเห็นว่า Residuals ของเราออกมาโอเคมากครับ ไม่มี Correlation ให้เห็นเลย (เส้นสีดำใน ACF Plot ไม่สูงกว่าเส้นประสีน้ำเงิน)

ช่วงที่สี่ เป็นเรื่องของการวัดความแม่นยำของผลทำนายครับ ซึ่งเป็นเรื่องสำคัญมาก ๆ และใครที่เรียน Machine Learning มาแล้วอาจจะเจอกับคอนเซปต์ที่เหมือนกันเลยครับ นั่นคือ การแบ่งข้อมูลเป็น Training & Test Set เพื่อวัดผล รวมถึง Cross Validation (แต่การทำ Cross Validation สำหรับ Time Series จะแตกต่างกับข้อมูลทั่วไปเล็กน้อยครับ เพราะ Time Series มีเรื่องของเวลามาเกี่ยวด้วย)

สำหรับค่าที่ใช้ในการวัดความแม่นยำ ก็จะเป็นค่าเช่น MAE (Mean Absolute Error), RMSE (Root Mean Squared Error) ซึ่งคนที่เรียนด้าน Data Science มาก่อนต้องรู้จักกันอยู่แล้วแน่นอน ซึ่งสิ่งที่น่าสนใจในเรื่องนี้ คือ เค้าแบ่งค่าที่เป็น Scale Dependent (MAE, RMSE) และ Scale Independent (MAPE, MASE) โดยกลุ่มหลังสามารถนำไปใช้เปรียบเทียบกับข้อมูลต่างชุดกันได้ แต่กลุ่มแรกทำไม่ได้

ช่วงสุดท้าย ก็จะพูดถึงการคำนวณค่า Prediction Interval ซึ่งก็คือ ระยะของค่าทำนายผล ซึ่งจะบอกได้ว่าค่าที่เราทำนายสามารถสูงหรือต่ำกว่าค่ากลางได้ขนาดไหน ลองดูตัวอย่างในพลอตด้านล่างครับ

googforecasts2-1.png

พื้นที่สีน้ำเงิน คือ PI = 80% ละพื้นที่สีฟ้า คือ PI = 95%

เราจะเห็นว่าผลทำนายที่เป็นเส้นสีน้ำเงิน มีพื้นที่สีน้ำเงินและสีฟ้าครอบอยู่ นั่นก็คือส่วนของ Prediction Interval นั่นเองครับ โดยเส้นสีน้ำเงินที่เราเห็น ความจริงมันก็คือค่าเฉลี่ย (Median) ของ Prediction Interval นั่นเอง เราเรียกค่านี้ว่า Point Forecast

บทที่ 6: Time series decomposition

(เข้าใจถูกแล้วนะครับ ว่าเราข้ามบทที่ 4-5 มาบทที่ 6 เลย)

ในบทนี้ เราจะมารู้จักกับวิธีต่าง ๆ ในการแยก Time Series ออกเป็นส่วนต่าง ๆ นั่นก็คือ Trend-Cycle (หรือ Trend เฉย ๆ), Seasonality, และ Remainder (ส่วนที่เหลือจาก Trend + Seasonality)

การแยก Time Series ออก ทำให้เราสามารถวิเคราะห์ Time Series ได้ง่ายขึ้น เพราะในหลาย ๆ ครั้งเราต้องการทำนายเฉพาะส่วน หรือต้องการวิเคราะห์เฉพาะส่วนของ Time Series ครับ

elecequip-stl-decomposition.png

ตัวอย่างการทำ STL Decomposition กับข้อมูล จะเห็นว่าข้อมูลถูกแยกมาเป็น Trend, Seasonal, และ Remainder

ตัวอย่างที่เห็นได้บ่อย ๆ คือ เราต้องการวิเคราะห์ข้อมูลที่ไม่มี Seasonality เราก็สามารถแยก Time Series ออกมาเฉพาะส่วน Trend + Remainder ออกมาวิเคราะห์ ซึ่งเราเรียกข้อมูลชุดนี้ว่า Seasonally Adjusted Data ครับ

ในบทนี้จะแนะนำวิธีการทำ Decomposition แบบต่าง ๆ ที่พัฒนาขึ้นมาเรื่อย ๆ ตั้งแต่ Classical Decomposition, X11 / X-12 / X-13, SEATS, จนมาจบที่ STL ซึ่งพัฒนามาให้ยืดหยุ่นกว่าวิธีอื่น ๆ สามารถใช้กับข้อมูลที่มี Seasonality ระยะเท่าไหนก็ได้ (วิธีเก่า ๆ จะใช้ได้กับ Seasonality แบบรายเดือน กับราย Quarter เท่านั้น)

เราสามารถใช้วิธี Decomposition เข้ามาช่วยทำนายผลได้ด้วย วิธีการทำนายผล คือ:

  1. แยกข้อมูลส่วนที่เป็น Seasonally Adjusted Data แล้วทำนายด้วยวิธีที่เราเลือก (ใช้วิธีทำนายที่เหมาะกับข้อมูล Non-seasonal เช่น Naive, Drift, ETS จากบทที่ 7, ARIMA จากบทที่ 8 etc. ได้ทั้งหมดครับ)
  2. แยกข้อมูลส่วนที่เป็น Seasonality มาทำนายด้วย Seasonal Naive = ดึงค่า Seasonal จากค่าล่าสุด
  3. หลังจากนั้นนำผลทำนายสองส่วนมารวมกัน ส่วน Prediction Interval ใช้ของ Seasonally Adjusted Data เท่านั้นครับ

ผลลัพธ์เวลาเราทำนายด้วย Decomposition จะออกมาหน้าตาแบบนี้ครับ

decomposition-forecast.png

ตัวอย่างการทำนายผลด้วย STL Decomposition + Naive Method

บทที่ 7: Exponential Smoothing

ETS เป็นหนึ่งในโมเดลที่ได้รับความนิยมมากเป็นอันดับต้น ๆ พอ ๆ กับโมเดล ARIMA ที่เราจะเรียนในบทถัดไปครับ โดย ETS เน้นการทำนายโดยดูจาก Trend และ Seasonality ของข้อมูล

หัวใจหลักของโมเดล ETS คือ แต่ละโมเดล ETS จะแบ่งเป็น 3 ส่วน เขียนออกมาเป็น ETS(_, _, _)

3 ส่วนใน ETS ประกอบไปด้วย E (Error) + T (Trend) + S (Seasonality) ซึ่งบังเอิญว่า “ETS” ตรงกับชื่อโมเดล “ExponenTial Smoothing” พอดีครับ ถือเป็นการตั้งชื่อที่จำได้ง่ายมาก

วิธีการเลือกโมเดล ETS ให้เหมาะกับข้อมูล เราต้องดูแต่ละส่วนของข้อมูล เพื่อเลือกโมเดลที่เหมาะสมครับ:

  • ส่วนของ Error อาจารย์บอกว่าให้ดูจาก Trend หรือ Seasonality ว่ามีส่วนไหนเป็น Multiplicative มั้ย
  • มี Trend มั้ย ถ้ามี เทรนด์ของเราเป็น Additive / Additive Damped / หรือ Multiplicative (อันหลังวิชานี้ไม่ได้สอน)
  • มี Seasonality มั้ย ถ้ามี Seasonality ของเราเป็น Additive (Variance เท่าเดิมตลอด) หรือเป็น Multiplicative (Variance ขึ้นหรือลงตามเวลา)

ซึ่งค่าที่แตกต่างกันของโมเดลพวกนี้ก็มีชื่อเรียกพิเศษของมันด้วยครับ เช่น ETS(_,N,N) = Simple Exponential Smoothing, ETS(_,A,N) = Holt’s Linear Method, ETS(_,A,A) = Additive Holt-Winters’ Method จะเห็นว่าชื่อเหล่านี้ตั้งชื่อตาม Researcher ที่ค้นพบวิธีเหล่านี้นั่นเอง

ลองมาดูตัวอย่างการทำนายผลด้วยโมเดล ETS กันครับ

ets-mam-forecast.png

ผลการทำนายออกมาสวยงาม จาก FPP CHAPTER 7.7

สำหรับโมเดลในตัวอย่างนี้ เรากำหนดให้มี Trend (T = Additive) และมี Seasonality (M = Multiplicative) ซึ่งเห็นว่าผลการทำนายออกมาแล้วโมเดลแสดงถึงเทรนด์ที่เพิ่มขึ้น รวมถึง Seasonality ที่เพิ่มสูงขึ้นได้ด้วยครับ เรียกได้ว่าดึงส่วนสำคัญของข้อมูลออกมาได้ทั้งหมด

บทที่ 8: ARIMA Models

หลังจากที่รู้จักกับ ETS กันไปแล้ว มารู้จักกับ ARIMA ซึ่งเป็นโมเดลชื่อดังอีกตัวกันบ้างครับ ความแตกต่างของ ARIMA กับ ETS ก็คือ ARIMA ทำนายผลโดยดูจาก Autocorrelation ในข้อมูลครับ

ก่อนจะเข้าใจโมเดล ARIMA เราต้องเข้าใจสิ่งที่เรียกว่า Non-Stationary Data VS Stationary Data ก่อนครับ อธิบายแบบเข้าใจง่าย ๆ ข้อมูลที่ Stationary คือ “ถ้าเราสุ่มข้อมูลออกมา 2 ครั้งจากบน Time Series จะต้องได้กราฟหน้าตาเหมือนกัน”

เพราะฉะนั้นข้อมูลที่มี Trend หรือ Seasonality ถ้าเราสุ่มข้อมูลออกมา 2 ครั้งจะได้กราฟไม่เหมือนกันแน่นอน ถือเป็น Non-Stationary Data ครับ ซึ่ง ARIMA จะทำงานได้ไม่ดีกับข้อมูลประเภทนี้ ส่วนข้อมูลแบบ Stationary Data ก็อย่างเช่น White Noise (หน้าตาเหมือนข้อมูลสุ่มมั่วๆ) ครับ

แต่ข้อมูลส่วนใหญ่ในโลกนี้เป็น Non-Stationary ครับ เพราะฉะนั้นเลยมีวิธีที่เรียกว่า Differencing หรือการหาความแตกต่างระหว่างค่าปัจจุบันกับค่าก่อนหน้า ซึ่งจะทำให้เราได้ข้อมูลที่เป็น Stationary ออกมาครับ (บางครั้งก็ต้องทำการ Difference หลายครั้ง หรือ Difference โดยเทียบกับค่าจาก Season ที่แล้ว เรียกว่า seasonal diff)

ลองมาดูตัวอย่างของการทำ Differencing กัน

drugsale-scale-diff.png

พลอต 1: ข้อมูลต้นฉบับ, พลอต 2: ข้อมูลหลังจาก Stabilize Variance ด้วย Log, พลอต 3: ข้อมูลพลอต 2 ที่เอาไป diff

จะเห็นว่าพอ diff แล้วจะได้ข้อมูลที่ดูหน้าตาเหมือนมั่ว ๆ ออกมา พร้อมใช้กับโมเดล ARIMA แล้วครับ

สิ่งที่เราต้องรู้เกี่ยวกับ ARIMA คือ ARIMA มาจากโมเดล AR (AutoRegressive) ที่รวมร่างกับ (Integrated) โมเดล MA (Moving Average) นั่นเอง

สำหรับโมเดล ARIMA ที่ใช้กับข้อมูลที่ไม่มี Seasonality จะถูกเขียนในรูปของ ARIMA(p,d,q):

  • p = order ของโมเดล AR(p)
  • d = จำนวนการ diff ทั้งหมด ไม่นับ seasonal diff
  • q = order ของโมเดล MA(q)

สำหรับวิธีการเลือก Parameter ของโมเดลนี้ เราสามารถให้คำสั่ง auto.arima เลือกให้ หรือใช้วิธี ดูจาก ACF/PACF Plot ก็ได้ครับ โดยหลังจากเลือกโมเดลเริ่มต้นแล้ว เราต้องลองปรับค่า p กับ q ประมาณ +-2 ดูด้วย แล้วเทียบจากค่า AICc หรือ RMSE เพื่อดูว่าโมเดลไหนดีที่สุด

สิ่งที่ควรรู้ก็คือ ใน ARIMA ค่าของ p กับ q เป็นตัวเลข เพราะฉะนั้นมันสามารถเป็นเลขไหนก็ได้ที่ไม่ใช่เลขติดลบ ต่างกับ ETS ที่มีกำหนดแน่นอนว่าส่วนนี้เป็นได้เฉพาะค่านี้กับค่านี้เท่านั้น หมายความว่าถ้าเราใช้คำสั่ง auto.arima มันจะไม่ได้เสิร์จจากทุกความเป็นไปได้ ทำให้การเลือกเองด้วย ACF/PACF Plot หลาย ๆ ครั้งได้ผลดีกว่าครับ

อีกเวอร์ชั่นหนึ่งของ ARIMA คือ การนำไปใช้กับข้อมูลที่มี Seasonality เราจะมี Parameter หน้าตาเหมือนเดิมเพิ่มมาอีก 3 ตัว คือ ARIMA(p,d,q)(P,D,Q)m:

  • P = order ของโมเดล AR(P) สำหรับส่วน Seasonality
  • D = จำนวนการ seasonal diff ทั้งหมด
  • Q = order ของโมเดล MA(q) สำหรับส่วน Seasonality
  • m = frequency ของข้อมูล เช่น ข้อมูลราย Quarter จะ m = 4, ข้อมูลรายเดือนจะ m = 12

มาลองดูตัวอย่างการทำนายผลด้วย Seasonal ARIMA กันครับ

arima-forecast.png

ผลการทำนายจาก ARIMA ออกมาดูดีมากครับ จาก FPP2 CHAPTER 8.9

เรื่องสุดท้ายที่เราต้องรู้ คือ การนำโมเดล ETS กับ ARIMA มาเปรียบเทียบกัน เพราะว่าเป็นโมเดลที่มี Parameter ไม่เหมือนกัน เราไม่สามารถมาเปรียบเทียบค่า AICc กันได้โดยตรง (รวมถึงโมเดล ARIMA ที่มีค่า diff ต่างกัน เราก็ไม่สามารถเทียบค่า AICc ได้โดยตรงเช่นกันครับ)

วิธีในการเปรียบเทียบว่าโมเดล ETS หรือ ARIMA เหมาะกับข้อมูลเรามากกว่า คือ คำนวณ Error จาก Train-Test Set หรือ Time Series Cross Validation ซึ่งโมเดลไหนมี Error น้อยกว่าก็เลือกใช้โมเดลนั้นได้เลยครับ

บทที่ 5: Time Series Regression Model

หลังจากที่ไปตะลุยกับโมเดลเทพ ๆ อย่าง ETS และ ARIMA แล้ว เราก็ย้อนกลับมาบทที่ 5 เพื่อเรียน Regression Model กันครับ ซึ่งในต้นบทความแอดได้ขายของไปแล้ว Regression Model กับ Time Series มันทำอะไรได้มากกว่าที่คิด

ข้อดีของ Regression Model เทียบกับโมเดลอื่น ๆ คือ สามารถอ่านเข้าใจได้ง่าย เราสามารถดูค่า Parameter แล้วเขียนออกมาเป็นสมการ Regression ได้เลย หรือศัพท์ที่ใช้ในนี้ คือ มี Explanatory Power สูงมาก

แน่นอนว่าด้วยความที่มันอธิบายได้ง่าย ก็มาพร้อมกับข้อจำกัดว่าความแม่นยำในการทำนายอาจจะต่ำกว่าโมเดลประเภทอื่นที่อธิบายได้ยาก

ตามที่แอดสปอยไปก่อนหน้านี้ คือ เราสามารถใช้เทคนิคต่าง ๆ มาเพื่อพัฒนา Regression Model ให้ทำนาย Time Series เก่งขึ้นได้ เช่น:

  • ใช้ Dummy Variable เพื่อแบ่ง Seasonality จะมีคอลัมน์เพิ่มขึ้น 1 คอลัมน์สำหรับแต่ละ seasonality – 1
  • ถ้า Seasonality เยอะมาก (เช่น m = 52 สำหรับข้อมูล weekly) การเพิ่มอีก 51 คอลัมน์ก็ไม่ใช่ไอเดียที่ดี (เดี๋ยว Overfitting) เราก็เพิ่ม Fourier Term เพื่อใช้แทน Seasonality ได้
  • นับจำนวนวันที่เปิดทำการในแต่ละเดือน ข้อมูลอันนี้สำคัญมากเวลาต้องการคำนวณยอดขายรายวัน เช่น เดือนมกราคมมีวันเปิดทำการ 28 วัน เดือนกุมภาพันธ์เปิดทำการ 25 วัน ฯลฯ
  • ข้อมูลที่ดีเลย์ (Lag) เหมาะมากเวลาเราลงโฆษณาไปเมื่อสามเดือนก่อน ซึ่งอาจจะต้องใช้เวลากว่าผลการลงโฆษณาจะส่งผลต่อยอดขาย

ตัวอย่างการใช้ Trend และ Dummy Variable (Seasonality) ใน Regression

regression-dummy-variables.png

ตัวอย่างผลการทำนายด้วย Regression จาก FPP2 CHAPTER 5.6

Regression Model จะให้โมเดลออกมาเป็นเส้นตรงเท่านั้น หลายคนอาจจะสงสัยว่าแล้วถ้าข้อมูลไม่ได้เป็นเส้นตรงจะทำอย่างไร ในบทนี้ก็มีการแนะนำเรื่อง Nonlinear regression ที่อธิบายเทคนิคต่าง ๆ ที่เราสามารถใช้ได้ครับ

  • เราสามารถแปลงข้อมูลด้วยการใส่ log ได้ โดยสิ่งสำคัญที่ห้ามลืม คือ ถ้าเราใส่ log ที่ตัวแปรต้น เราต้องใส่ log ที่ตัวแปรตามทั้งหมดด้วย
  • สำหรับกรณีที่ Trend ของ Time Series เปลี่ยนแปลงไปมาหลายค่า แทนที่เราจะขีดเทรนด์เป็นเส้นตรงจากต้นจนจบ เราก็ตัดเส้นออกเป็นส่วน ๆ ซึ่งเทคนิคนี้เรียกว่า Piecewise linear regression
  • ถ้าเราอยากให้เส้นเทรนด์เข้ากับโมเดลมากขึ้น เราสามารถทำให้เส้น Piecewise กลายเป็นโค้งได้ เทคนิคนี้เรียกว่า Exponential / Spline แต่เทคนิคนี้ค่อนข้างอันตราย เพราะปลายสุดของผลทำนายอาจจะโค้งขึ้นหรือลงจนค่าสูงหรือต่ำเกินกว่าจริงไปมากในอนาคต ควรใช้ต่อเมื่อเราอยากโมเดลเท่านั้น ไม่ได้ต้องการ Forecast

ลองมาดูตัวอย่างเทคนิค Piecewise แบบต่าง ๆ กันก่อนครับ

nonlinear-regression.png

ภาพเปรียบเทียบการวาดเทรนด์แบบจากต้นจนจบด้วยเส้นเดียว (Linear), การแบ่งออกเป็นส่วน ๆ (Piecewise), การทำเส้นโค้งด้วย Exponential หรือ Cubic Spines

วิธีหนึ่งที่แก้ปัญหา Spline วิ่งทะลุจอได้ คือ ใช้ Natural Cubic Smoothing Splines ซึ่งเป็นการตั้ง Spline แบบให้โค้งได้ทุกจุดนั่นเองครับ

regression-splinef.png

ตัวอย่างการใช้ Natural Cubic Smoothing Splines จะเห็นว่าโค้งสวยมาก และยังทำให้ส่วนต้นกับปลายไม่วิ่งทะลุจอด้วย

บทที่ 9: Dynamic Regression Models

(สังเกตว่าเมื่อกี้เราอยู่บทที่ 5 แล้วมาบทที่ 9 เลย เพราะเราเรียนบทที่ 6 7 8 กันไปแล้วไงครับ)

ขอขอบคุณทุกท่านที่อ่านมาจนถึงจุดนี้นะครับ อันนี้เป็นบทสุดท้ายที่เรียนในวิชานี้แล้วครับ พูดถึงการนำ Regression ในบทที่ 5 มารวมร่างกับ ARIMA ในบทที่ 8

โมเดล ARIMA และ ETS ใช้ประโยชน์จากค่าในอดีต แต่ไม่ได้ใช้ประโยชน์จากข้อมูลเกี่ยวข้อง เช่น จำนวนวันเปิดทำการ, การเปลี่ยนแปลงของกฏหมาย, การเปลี่ยนแปลงในตลาดโดยรวม ฯลฯ แต่ในทางกลับกัน โมเดล Regression ใช้ประโยชน์จากข้อมูลที่เกี่ยวข้อง แต่ไม่ได้ใช้ประโยชน์จากค่าในอดีตได้ดีเท่า ARIMA / ETS

เพราะฉะนั้นเค้าก็เลยเอา Regression กับ ARIMA มารวมกัน จะได้นำข้อดีของทั้งสองโมเดลมาช่วยให้ทำนายผลได้แม่นยำมากขึ้น

วิธีการรวมร่างของเค้าก็ง่ายมากครับ นั่นคือ เค้าเพิ่ม Error Term ที่เป็น ARIMA Model เข้ามาใน Regression เท่านั้นเองครับ

ตัวอย่างการทำนายผลด้วย Dynamic Regression Model เป็นดังนี้ครับ

regression-arma-error.png

ตัวอย่างการนำ Regression มาใช้กับ ARIMA จาก FPP2 CHAPTER 9.3

สรุปวิชา Business Forecasting เรียนแล้วได้อะไรบ้าง

สำหรับคนทั่วไป เรียนแล้วจะได้เทคนิคการทำนายผลข้อมูล Time Series โดยใช้ภาษา R รันแบบง่าย ๆ เพราะหนังสือออนไลน์เล่มนี้เน้นเนื้อหา Practical ทุกบทจะอธิบายทฤษฎีไม่เยอะ แต่มี Reference ให้คนที่สนใจไปอ่านต่อได้ แล้วแทบทุกบทมีโค้ด R ให้เอาไปรันได้ผลตามหนังสือเป๊ะ

สำหรับคนที่มาจากสาย Data Science / Machine Learning จะพบกับโมเดลแปลกใหม่อย่าง ETS, ARIMA ที่ไม่เคยเห็นในข้อมูลรูปแบบอื่นนอกจาก Time Series รวมถึงการนำ Regression มาใช้แบบซับซ้อนมากขึ้น

เวลาเรียน Data Science หลาย ๆ ที่ชอบสอน Regression แบบผ่าน ๆ แล้วข้ามไปพวก Random Forest / Neural Network เลย แต่ไม่ได้ลงลึกว่า Regression จริง ๆ แล้วมัน Powerful ขนาดไหน

(สำหรับท่านที่สนใจหาหนังสือ Time Series ภาษาไทยอ่าน ลองดูเล่มนี้นะครับ การวิเคราะห์อนุกรมเวลาสำหรับเศรษฐศาสตร์และธุรกิจ ที่ศูนย์หนังสือจุฬาฯ ครับ)

หวังว่าบทความนี้จะเป็นประโยชน์ต่อทุกท่านไม่มากก็น้อยครับ หากเห็นว่ามีประโยชน์รบกวนแชร์บทความนี้ต่อให้เพื่อน ๆ และคอมเม้นท์ทิ้งไว้หน่อยว่าชอบ / ไม่ชอบบทความนี้อย่างไรบ้างนะครับ 🙂 แอดจะได้นำไปปรับปรุงบทความต่อ ๆ ไปในอนาคตครับผม

 

 

คุณอยากอ่านบทความแนวนี้อีกมั้ย ?

ลงทะเบียนรับ GrowthBee Newsletter เพื่ออ่านบทความใหม่ ๆ ด้าน Data Science ก่อนใคร !!

I agree to have my personal information transfered to MailChimp ( more information )

เราสัญญาว่าจะไม่มีการแสปมใด ๆ ทั้งสิ้น และคุณสามารถยกเลิกรับข่าวสารตอนไหนก็ได้

1 Comment

  1. Frank

    ขอบคุณมาก ๆ ครับ

Leave a Reply