พยากรณ์แบบอนุกรมเวลา (Time Series Method) เป็นวิธีการที่ใช้พยากรณ์ยอดขายในอนาคตโดยคาดว่าจะมีลักษณะเช่นเดียวกับยอดขายในปัจจุบันหรืออนาคต
ยอดขายหรืออุปสงค์ในความเป็นจริงได้รับอิทธิพลจากแนวโน้ม (Trend) ฤดูกาล (Seasonal) วัฎจักร (Cycle) และเหตุการณ์ผิดปกติ (Irregular Variation) การใช้อนุกรมเวลามี 3 วิธี คือ การวิเคราะห์อนุกรมเวลา (Time Series Analysis) หมายถึง การวิเคราะห์ (ความผันแปร) ตามลำดับเวลา แบ่งออกเป็น T – ค่าแนวโน้ม , S – ค่าการผันแปรตามฤดูกาล , C – ค่าการผันแปรตามวัฎจักร , I – การผันแปรเนื่องจากเหตุการณ์ไม่ปกติ ข้อมูลอนุกรมเวลา
อาจได้รับอิทธิพลของปัจจัยที่เป็นส่วนประกอบของอนุกรมเวลาทั้ง 4 ปัจจัยหรือเพียงปัจจัยใดปัจจัยหนึ่งเท่านั้น การวิเคราะห์จึงควรแยกวิเคราะห์ทีละปัจจัย ซึ่งในที่นี้จะกล่าวถึงการวิเคราะห์ ปัจจัยค่าแนวโน้ม และค่าผันแปรตามฤดูกาลเท่านั้น สรุป Time Series Analysis in Python — A Comprehensive Guide with Examplesข้อมูลอนุกรมเวลา(Time Series data) คือชุดของข้อมูลที่เก็บรวบรวมตามระยะเวลาเป็นช่วง ๆ การคาดการณ์อนุกรมเวลามีความสำคัญเชิงธุรกิจอย่างมาก ข้อมูลที่ธุรกิจเก็บและต้องการพยากรณ์มักมาในรูปแบบอนุกรมเวลา เช่นอุปสงค์และยอดขายจำนวนผู้เข้าชมเว็บไซต์ราคาหุ้น ฯลฯ เป็นข้อมูลอนุกรมเวลา การวิเคราะห์อนุกรมเวลาเกี่ยวข้องกับการทำความเข้าใจกับแง่มุมต่าง ๆ เกี่ยวกับการเปลี่ยนแปลงตามธรรมชาติของข้อมูล เพื่อให้สามารถพยากรณ์ข้อมูลในอนาคตได้เเม่นยำขึ้น ตัวอย่างข้อมูลอนุกรมเวลา (Time Series data) from dateutil.parser import parse panel dataคือ ข้อมูลที่เก็บจากหน่วยตัวอย่าง i ในช่วงเวลาต่างๆ ทำให้ข้อมูลแต่ละช่วงเวลา ไม่เป็นอิสระต่อกัน ความแตกต่างคือนอกเหนือจากอนุกรมเวลายังมีตัวแปรที่เกี่ยวข้องอย่างน้อยหนึ่งตัวที่วัดในช่วงเวลาเดียวกัน โดยทั่วไปคอลัมน์ที่อยู่ในข้อมูลพาเนลจะมีตัวแปรอธิบายซึ่งมีประโยชน์ในการทำนาย Y โดยที่คอลัมน์เหล่านั้นจะพร้อมใช้งานในช่วงการคาดการณ์ในอนาคต ตัวอย่างข้อมูล panel # dataset source: https://github.com/rouseguy การแสดงข้อมูลอนุกรมเวลามาใช้ matplotlib เพื่อแสดงข้อมูลอนุกรมเวลา # Time series data source: fpp pacakge in R. เนื่องจากค่าทั้งหมดเป็นค่าบวก เราสามารถแสดงสิ่งนี้บนทั้งสองด้านของแกน Y เพื่อเน้นการเติบโต # Import data การเปรียบเทียบรายปีบ้างครั้งเนื่องจากข้อมูลเป็นฤดูกาลเราอาจต้องเปลี่ยบเทียบในช่วงเดือนเดี่ยวกัน # Import Datadf = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/a10.csv', parse_dates=['date'], index_col='date')df.reset_index(inplace=True)# Prepare datadf['year'] = [d.year for d in df.date]df['month'] = [d.strftime('%b') for d in df.date]years = df['year'].unique()# Prep Colorsnp.random.seed(100)mycolors = np.random.choice(list(mpl.colors.XKCD_COLORS.keys()), len(years), replace=False)# Draw Plotplt.figure(figsize=(16,12), dpi= 80)for i, y in enumerate(years):if i > 0:plt.plot('month', 'value', data=df.loc[df.year==y, :], color=mycolors[i], label=y)plt.text(df.loc[df.year==y, :].shape[0]-.9, df.loc[df.year==y, 'value'][-1:].values[0], y, fontsize=12, color=mycolors[i])# Decorationplt.gca().set(xlim=(-0.3, 11), ylim=(2, 30), ylabel='$Drug Sales$', xlabel='$Month$')plt.yticks(fontsize=12, alpha=.7)plt.title("Seasonal Plot of Drug Sales Time Series", fontsize=20)plt.show() Boxplot ของการกระจายแบบ Month-wise (Seasonal) และ Year-wise (trend)เราสามารถจัดกลุ่มข้อมูลตามช่วงเวลาตามฤดูกาลและดูว่ามีการกระจายค่าภายในปีหรือเดือนที่กำหนดอย่างไรและเปรียบเทียบได้อย่างไรเมื่อเวลาผ่านไป # Import Data บ็อกซ์พล็อตทำให้การกระจายรายปีและรายเดือนชัดเจน นอกจากนี้ในบ็อกซ์พล็อตแบบเดือนต่อเดือนของเดือนธันวาคมและมกราคมมีการขายยาที่สูงขึ้นอย่างชัดเจนซึ่งสามารถนำมาประกอบกับฤดูส่วนลดวันหยุด การหา PATTERN ของข้อมูลอนุกรมเวลาการหารูปแบบการเคลื่อนไหวของข้อมูลอนุกรมเวลาอย่างๆ ง่ายทำได้โดยการหาแนวโน้ม การคาดการณ์เส้นแนวโน้มจากสมการต่างๆ โดยปกติมักใช้สมการดังต่อไปนี้ สมการเชิงเส้นตรง Y = aX +b สมการ Polynominal Y =aX**n + aX**(n-1) …..aX +b สมการ Logistic Y = aIn(X) + b สมการ exponential Y = a* *x + b #import libery ขั้นตอนต่อมาคือประกาศฟังชั่นที่จะใช้ในการพยากรณ์ ในที่นี้จะใช้ สมการ exponential และสมการ Polynominal กำลัง2,3 import matplotlib.pyplot as plt เปรียบเทียบแต่ละสมการที่เราทำนายได้ nextday = 0xlim = 39 + nextdaypy.plot(daylist[0:xlim],predictfrompoly[0:xlim],label='Predicted Polyfit')py.plot(daylist[0:xlim],predictfrompoly2[0:xlim],label='Predicted Polyfit#2')py.plot(daylist[0:xlim],predictfromexpo[0:xlim],label='Predicted Expofit')py.plot(xdata,ydata,label='Actual') จะสังเกตเห็นได้ว่าจำนวนผู้ติดเชื่อมีความใกล้เคียงกับ Polynominal กำลัง3 มากที่สุด ต่อมาเราก็มาพยากรณ์จำนวนผู้ติดเชื่อในอีก 30 วันข้างหน้า nextday = 30xlim = 40 + nextdaypy.plot(daylist[0:xlim],predictfrompoly[0:xlim],label='Predicted Polyfit')py.plot(daylist[0:xlim],predictfrompoly2[0:xlim],label='Predicted Polyfit#2')py.plot(daylist[0:xlim],predictfromexpo[0:xlim],label='Predicted Expofit')py.plot(xdata,ydata,label='Actual') ข้อมูลอนุกรมเวลาประกอบไปด้วย: ค่าพื้นฐาน+ แนวโน้ม + ฤดูกาล + ข้อผิดพลาด มีการสังเกตแนวโน้มเมื่อมีการเพิ่มหรือลดความชันที่สังเกตได้ในอนุกรมเวลา ในขณะที่ฤดูกาลมีการสังเกตเมื่อมีรูปแบบการทำซ้ำที่ชัดเจนสังเกตได้ระหว่างช่วงเวลาปกติเนื่องจากปัจจัยตามฤดูกาล อาจเป็นเพราะเดือนของปี, วันที่ของเดือน, วันธรรมดาหรือแม้แต่เวลาของวัน อย่างไรก็ตามไม่ได้บังคับว่าอนุกรมเวลาทั้งหมดจะต้องมีแนวโน้มและ / หรือฤดูกาล อนุกรมเวลาอาจไม่มีแนวโน้มที่ชัดเจน แต่มีฤดูกาล ตรงกันข้ามอาจมีแต่แนวโน้มไม่มีฤดูกาลก็ได้ ดังนั้นอนุกรมเวลาอาจถูกจินตนาการว่าเป็นการรวมกันของแนวโน้มฤดูกาลและข้อผิดพลาด fig, axes = plt.subplots(1,3, figsize=(20,4), dpi=100) อีกแง่มุมที่ควรพิจารณาก็คือพฤติกรรมแบบวนรอบ ที่เกิดขึ้นเมื่อรูปแบบการขึ้นและลงในซีรีส์ไม่ได้เกิดขึ้นในช่วงเวลาที่กำหนดตามปฏิทิน ควรใช้ความระมัดระวังเพื่อไม่ให้เกิดความสับสน ‘เอฟเฟกต์’ กับเอฟเฟกต์ “ซีซัน” ดังนั้นจะแยกความแตกต่างระหว่างรูปแบบ “วงจร” กับ “ฤดูกาล” อย่างไรหากรูปแบบไม่ใช่ความถี่ตามปฏิทินที่แน่นอนก็เป็นวงจร เพราะต่างจากฤดูกาลฤดูกาลผลกระทบตามวงจรมักจะได้รับอิทธิพลจากธุรกิจและปัจจัยทางเศรษฐกิจและสังคมอื่น ๆ อนุกรมเวลาแบบเพิ่มและแบบคูณขึ้นอยู่กับลักษณะของแนวโน้มและฤดูกาลอนุกรมเวลาสามารถสร้างแบบจำลองเป็นAdditiveหรือแบบMultiplicativeซึ่งการสังเกตแต่ละครั้งในชุดสามารถแสดงได้ทั้งผลรวมหรือผลคูณของส่วนประกอบ: Additive time series: Multiplicative
Time Series: 7.จะแยกอนุกรมเวลาออกเป็นส่วนประกอบได้อย่างไรเราสามารถสามารถแยกอนุกรมเวลาโดยพิจารณาว่าอนุกรมเป็นการรวมกันของBase Levelแนวโน้มดัชนีตามฤดูกาลและError โดยใช้ from statsmodels.tsa.seasonal import seasonal_decompose หากต้องการเอาผลลัพธ์มาแยกใน datafram ก็ทำได้ดังนี้
ผลรวมของ Stationary and Non-Stationary Time SeriesStationarity เป็นคุณสมบัติของอนุกรมเวลา อนุกรมที่อยู่กับที่นั้นเป็นค่าที่ค่าของอนุกรมไม่ใช่ฟังก์ชันของเวลา นั่นคือคุณสมบัติทางสถิติของข้อมูลเช่นค่าเฉลี่ยความแปรปรวนและความสัมพันธ์อัตโนมัติมีค่าคงที่เมื่อเวลาผ่านไป Autocorrelation ของซีรี่ย์นั้นไม่มีอะไรนอกจากความสัมพันธ์ของซีรี่ย์กับค่าก่อนหน้านี้ ดังนั้นวิธีการระบุว่าชุดอยู่กับที่หรือไม่? ลองพล็อตตัวอย่างเพื่อทำให้ชัดเจน วิธีการพยากรณ์ทางสถิติส่วนใหญ่ออกแบบมาเพื่อทำงานกับอนุกรมเวลาแบบ non-stationary ขั้นตอนแรกในกระบวนการคาดการณ์คือโดยทั่วไปแล้วจะทำการแปลงบางอย่างเพื่อแปลงข้อมูลให้เป็น stationary วิธีสร้างข้อมูลอนุกรมเวลาแบบ stationary?เราสามารถสร้าง stationary โดย:
วิธีที่นิยมใช้ในการแปลงข้อมูลอนุกรมเวลาให้เป็น time series โดย การดําเนินการหาผลต่างระหว่างช่วงเวลา ของข้อมูลอย่างน้อยหนึ่งครั้งจนกว่าจะกลายเป็นประมาณนิ่ง ถ้า 𝑦𝑡 เป็นตัวแปรที่เราสนใจแล้ว first differencing ของ 𝑦𝑡 จะเท่ากับ 𝑦𝑡 − 𝑦𝑡−1 = 𝑦𝑡 − 𝐿𝑦𝑡 = (1 − 𝐿)𝑦𝑡 ตัวอย่างให้ข้อมูล: [1, 5, 2, 12, 20] เราสามารถแปลงขั้นที่ 1: [5–1, 2–5, 12–2, 20–12] = [4, -3, 10, 8] Seเราสามารถแปลงขั้นที่ 2: [-3–4, -10–3, 8–10] = [-7, -13, -2] ทำใมต้องทำข้อมูลให้เป็น non-stationary series stationary ก่อนพยากรณ์?การถดถอยเชิงเส้นจะเเม่นยำที่สุดเมื่อตัวแปร X ไม่สัมพันธ์กับตัวแปรเป้าหมาย ดังนั้นการแก้ปัญหาให้กับ stationary จะช่วยแก้ปัญหานี้ได้เนื่องจากจะลบความสัมพันธ์โดยธรรมชาติใดๆออกไป ทำให้ตัวแปรในการทำนายในแบบจำลองการพยากรณ์เป็นอิสระ วิธีการทดสอบ stationaryวิธีทดสอบ stationary อาจทำง่ายๆด้วยการพล็อตกราฟ อีกวิธีหนึ่งคือการแบ่งชุดข้อมูลออกเป็น 2 ส่วนหรือมากกว่านั้นและคำนวณสถิติสรุปเช่นค่าเฉลี่ยความแปรปรวนและค่าความสัมพันธ์อัตโนมัติ หากสถิติแตกต่างกันมากแสดงว่าซีรีส์ไม่น่าจะstationary อย่างไรก็ตามคุณจำเป็นต้องมีวิธีในการพิจารณาเชิงปริมาณว่าชุดข้อมูล stationary หรือไม่ ซึ่งสามารถทำได้โดยใช้การทดสอบทางสถิติที่เรียกว่า ‘Unit Root Tests’ มีหลายรูปแบบของสิ่งนี้ซึ่งการทดสอบตรวจสอบว่าอนุกรมเวลาแบบ non-stationary และมี unit root มีการทำสอบ Unit Root หลายวิธีเช่น
ที่ใช้กันมากที่สุดคือการทดสอบ ADF Test ที่สร้างสมมติฐาน null hypothesis ว่าข้อมูลเป็น non-stationary ดังนั้นถ้าค่าระดับนัยสำคัญ (0.05) เราจะปฏิเสธ null hypothesis การทดสอบ KPSS นั้นใช้สำหรับทดสอบแนวโน้มstationary สมมติฐาน null hypothesis และการตีความค่า P เป็นค่าที่ตรงกันข้ามกับการทดสอบ ADH โค้ดด้านล่างใช้การทดสอบสองรายการนี้โดยใช้แพคเกจ statsmodels ด้วย Python from statsmodels.tsa.stattools import adfuller, kpss การขจัดแนวโน้มออกจากชุดข้อมูลอนุกรณ์เวลาการขจัดแนวโน้มออกจากชุดข้อมูลอนุกรณ์เวลา มีหลายวิธี
# Using scipy: Subtract the line of best fit วิธีขจัดฤดูกาลออกจากข้อมูลอนุกรมเวลามีหลายวิธีในการขจัดฤดูกาลออกจากข้อมูลอนุกรมเวลา
# Subtracting the Trend Component. วิธีทดสอบฤดูกาลตามในข้อมูลอนุกรมเวลาหากคเราต้องการการตรวจสอบฤดูกาลที่ชัดเจนยิ่งขึ้นให้ใช้พล็อต Autocorrelation Function (ACF) เพิ่มเติมเกี่ยวกับ ACF ในส่วนที่จะเกิดขึ้น แต่เมื่อมีรูปแบบตามฤดูกาลที่แข็งแกร่งพล็อต ACF มักจะแสดงให้เห็นถึงหนามแหลมที่ซ้ำแล้วซ้ำอีกที่ทวีคูณของหน้าต่างตามฤดูกาล from pandas.plotting import autocorrelation_plot วิธีการจัดการกับค่าที่หายไปในอนุกรมเวลา?ในบ้างครั้งข้อมูลที่เราได้มาอาจมีข้อมูลที่ขาดหายไป เรามีทางเลือกมากมายในการเติบค่าที่หายไปอาทิเช่น
เราจะเลือกวิธีใหนนั้นขึ้นอยู่กัว่าเราต้องการความเชื่อมั่นในค่านั้นขนาดใหน
autocorrelationAutocorrelation เป็นความสัมพันธ์ของชุดข้อมูลที่เกิดจากตัวข้อมูลเอง หากชุดข้อมูลมีความสัมพันธ์กันอย่างมีนัยสำคัญ นั่นหมายความว่าค่าก่อนหน้าของชุดข้อมูล อาจมีประโยชน์ในการทำนายค่าปัจจุบัน การประเมินการพยากรณ์ยิ่งมีรูปแบบเวลาปกติและทำซ้ำได้มากเท่าไหร่ก็ยิ่งง่ายต่อการคาดการณ์เท่านั้น ‘Entropimate Entropy’ สามารถใช้ในการกำหนดปริมาณความสม่ำเสมอและความไม่แน่นอนของความผันผวนในอนุกรมเวลา ยิ่งค่าเอนโทรปีโดยประมาณสูงเท่าไหร่ก็ยากที่จะคาดการณ์ได้ # https://en.wikipedia.org/wiki/Approximate_entropy การปรับค่าอนุกรมเวลาให้ราบเรียบการทำให้เรียบของอนุกรมเวลาอาจมีประโยชน์ใน: การลดเอฟเฟกต์ของการรบกวนในในการประมาณค่าวิธีการทำในการปรับค่าข้อมูลให้ราบเรียบ มีวิธีการต่อไปนี้:
from statsmodels.nonparametric.smoothers_lowess import lowess การทดสอบความเป็นเหตุเป็นผลของ Grangerการทดสอบความเป็นเหตุเป็นผลของ Granger ใช้เพื่อพิจารณาว่าอนุกรมเวลาหนึ่งจะมีประโยชน์ในการคาดการณ์แบบอื่น โดยมีแนวคิดที่ว่าถ้า X ทำให้ Y ดังนั้นการคาดการณ์ของ Y ตามค่าก่อนหน้าของ Y และค่าก่อนหน้าของ X ความเชื่อมั่นควรสูงกว่าการคาดการณ์ของ Y ตามค่าก่อนหน้าของ Y เพียงอย่างเดียว ดังนั้นเข้าใจว่า Granger causality ไม่ควรใช้เพื่อทดสอบว่าความล่าช้าของ Y เป็นสาเหตุของ Y หรือไม่โดยทั่วไปจะใช้กับตัวแปรภายนอก (ไม่ใช่ Y lag) เท่านั้น สมมติฐาน Null คือ: ซีรีส์ในคอลัมน์ที่สองไม่เกรนเจอร์ทำให้เกิดซีรีส์ในครั้งแรก หากค่า P-Value มีค่าน้อยกว่าระดับนัยสำคัญ (0.05) คุณก็จะปฏิเสธสมมติฐานว่างแล้วสรุปได้ว่าความล่าช้าของ X นั้นมีประโยชน์จริง ๆ อาร์กิวเมนต์ที่สอง maxlag บอกว่าจนถึงจำนวน lags ของ Y ที่ควรรวมในการทดสอบ from statsmodels.tsa.stattools import grangercausalitytests ในกรณีข้างต้นค่า P เป็นศูนย์สำหรับการทดสอบทั้งหมด ดังนั้น ‘เดือน’ จึงสามารถใช้ในการคาดการณ์ผู้โดยสารได้ Note bookhttps://colab.research.google.com/drive/1dpkarE1ESU0Pe56cde4_yqt86BGhi-Yc อ้างอิงข้อมูลแบบอนุกรมเวลามีทั้งหมดกี่องค์ประกอบอนุกรมเวลา คือ เซตของข้อมูลเชิงปริมาณที่มีการจัดเก็บในช่วงเวลาที่ติดต่อกัน ส่วนข้อมูล อนุกรมเวลา (Time Series Data) คือ ชุดของข้อมูลที่มีการเก็บรวบรวมตามระยะเวลาที่ติดต่อกัน อย่างเป็นระบบโดยทั่วไปข้อมูลอนุกรเวลาประกอบด้วยองค์ประกอบ 4 ส่วน คือ แนวโน้ม (Trend: T), ฤดูกาล (Seasonal: S), วัฏจักร (Cycle: C) และเหตุการณ์ที่ ...
ข้อมูลใดเป็นข้อมูลอนุกรมเวลาข้อมูลอนุกรมเวลา คือ ข้อมูลที่เก็บค่าต่อเนื่องในแต่ละเวลา เช่น รายจ่ายของแต่ละวันในหนึ่งเดือน ข้อมูลแบบตัดขวาง คือ ข้อมูลที่เจาะจงเวลาลงไปว่าสนใจค่าของเวลาไหน เช่น ข้อมูลปริมาณน้ำฝนของวันนี้ในแต่ละจังหวัด
ข้อมูลตัดขวาง มีอะไรบ้างข้อมูลที่บอกลักษณะ สถานะ หรือ สภาพของสิ่งที่นักเรียนสนใจ ณ เวลาใดเวลาหนึ่ง เช่น จำนวนนักเรียนชายและนักเรียนหญิงของโรงเรียนแห่งหนึ่ง ณ วันที่ 20 มีนาคม พ.ศ.2563. จำนวนเด็กแรกเกิดของประเทศ ณ วันที่ 27 ธันวาคม พ.ศ.2564.
Time Series ใช้ทำอะไรTime Series Analysis (การวิเคราะห์อนุกรมเวลา) เมื่อนำข้อมูลที่มีลักษณะเป็นอนุกรมเวลาเหล่านั้นมา วิเคราะห์ หรือสร้างกราฟ จะเห็นแนวโน้มของการเปลี่ยนแปลงข้อมูล ดังนั้น ด้วยการวิเคราะห์แบบใช้ อนุกรมเวลา สามารถช่วยในการ พยากรณ์ค่าที่กำลังจะเปลี่ยนแปลงในอนาคต โดยอาศัยดูการเคลื่อนไหวจากอดีตได้
|