تحلیل سری زمانی با پایتون — معرفی انواع مدل ها
تحلیل سری زمانی و انتخاب مدل مناسب برای تحلیل آنها یکی از مهمترین بخشهای تجزیه و تحلیل دادههای مرتبط با زمان است. انجام محاسبات و رسم نمودارها، از وظایف اصلی «تحلیلگر داده» (Data Scientist) محسوب میشود. زبان برنامه نویسی پایتون از ابزارهای مفید در این امر است. در سری مطالب دنبالهای تحلیل سری زمانی با پایتون، در قسمت اول، به بررسی مفاهیم اولیه در مبحث سری زمانی پرداختیم. در این بخش، مدلهای پایه برای سری زمانی و نحوه ایستا کردن (Stationary) آنها را مرور خواهیم کرد. در بخش آخر و سوم، به معرفی مدلهای ترکیبی و پیچیده سری زمانی خواهیم پرداخت و پیادهسازی چنین مدلهایی را با زبان برنامهنویسی پایتون فرا خواهیم گرفت.
تحلیل سری زمانی با پایتون به صورت دنبالهای از نوشتارها در سه بخش ارائه میشود.
- بخش نخست: تحلیل سری زمانی با پایتون --- مقدمات و مفاهیم اولیه
- بخش دوم: تحلیل سری زمانی با پایتون --- معرفی انواع مدلها
- بخش سوم: تحلیل سری زمانی با پایتون --- مدلهای ترکیبی و پیچیده
برای آشنایی بیشتر با مقدمات مربوط به مبحث سری زمانی بهتر است نوشتار تحلیل سری زمانی — تعریف و مفاهیم اولیه را بخوانید. همچنین خواندن مطلب سری زمانی در علم داده — از صفر تا صد نیز خالی از لطف نیست.
تحلیل سری زمانی و معرفی انواع مدلها
همانطور که در بخش اول از این سری مطالب مطالعه کردید، مدل خطی یکی از انواع مدلهای سری زمانی است که در آن بوسیله رابطه خطی دادهها با زمان، عمل مدلسازی صورت میگیرد. ولی متاسفانه، مدل ساخته شده دارای خاصیت ایستایی (Stationary) نیست. در ادامه به معرفی مدلهایی خواهیم پرداخت به صورت خطی بوده و خاصیت ایستایی نیز دارند.
مدل خودهمبسته
زمانی که متغیر وابسته با مقدارهایی از خودش (با در نظر گرفتن مقدار تاخیر مناسب) تشکیل یک مدل خطی دهد، مدل را «خودهمبسته» (Autoregressive) مینامند. شیوه نمایش چنین مدلی به زبان ریاضی به صورت زیر خواهد بود.
چنین مدلی را با نماد نشان میدهند. به مانند مدلهای دیگر میزان خطا یا نویز سفید در مدل است. همچنین را مرتبه مدل «اتورگرسیو» یا «خودهمبسته» مینامند. به این ترتیب مشخص است که منظور از میزان تاخیراتی است که باید در مدل لحاظ شود. با توجه به مقدار تعداد دادههایی که از گذشته روی متغیر در زمان تاثیرگذار هستند مشخص میشود. برای مثال مدل به صورت زیر نوشته خواهد شد.
این مدل نشان میدهد که مقدار متغیر در زمان به مقدار متغیر در زمانهای و وابسته است و مدل این وابستگی نیز خطی است. از طرفی مقدار خطا یا نویز سفید نیز در مقدار نقش دارد.
نکته: اگر در مدل مقدار باشد، مدل به صورت قدمهای تصادفی در خواهد آمد. در قسمت اول از مطالب دنبالهای سری زمانی، مشخص شد که چنین مدلی ایستا نیست.
با استفاده از کد زیر به شبیهسازی دادههای چنین مدلی خواهیم پرداخت. در اینجا ضریب () برابر با 0.6 در نظر گرفته شده است.
1# Simulate an AR(1) process with alpha = 0.6
2
3np.random.seed(1)
4n_samples = int(1000)
5a = 0.6
6x = w = np.random.normal(size=n_samples)
7
8for t in range(n_samples):
9 x[t] = a*x[t-1] + w[t]
10
11_ = tsplot(x, lags=lags)
نمودارهای تحلیل سری زمانی مربوط به چنین دادههایی در ادامه قابل مشاهده است. این نمودارها الگوی مناسبی برای تشخیص دادههای سری زمانی با مدل هستند. به این معنی که اگر برای یک سری داده، نمودارهای سری زمانی ترسیم شود و الگوی مشابه با نمودارهای زیر داشته باشد میتوان آن را سری زمانی با مدل در نظر گرفت.
نکته: تابع tsplot در بخش اول از این نوشتارها معرفی شده است.
همانطور که انتظار داشتیم، توزیع باقیماندهها نرمال است. از طرفی میزان همبستگی بین دادهها بخصوص در تاخیر اول (Lag 1) که در منحنی PACF دیده میشود، گواه وجود رابطه بین مشاهدات است. در ادامه یک مدل را به کمک توابع پایتون ایجاد میکنیم. ابتدا یک مدل را برای دادهها در نظر میگیریم و ضریب را برآورد میکنیم. سپس به منظور برآورد مقدار از تابع select_order استفاده خواهیم کرد. اگر مقدار ضریب نزدیک به مقدار 0.6 برآورد شود، آنگاه به نظر میرسد مدل برای داده مناسب است.
کدهای زیر به این منظور تهیه شدهاند. همانطور که مشخص است متغیر از قسمت قبلی که در آن شبیهسازی صورت گرفته بود، دریافت شده و برای برازش مدل سری زمانی استفاده شده است.
1# Fit an AR(p) model to simulated AR(1) model with alpha = 0.6
2
3mdl = smt.AR(x).fit(maxlag=30, ic='aic', trend='nc')
4%time est_order = smt.AR(x).select_order(
5 maxlag=30, ic='aic', trend='nc')
6
7true_order = 1
8p('\nalpha estimate: {:3.5f} | best lag order = {}'
9 .format(mdl.params[0], est_order))
10p('\ntrue alpha = {} | true order = {}'
11 .format(a, true_order))
مقدارهای برآورد شده برای ضریب و تاخیر (lag) به صورت زیر است.
به نظر میرسد که پارامتر واقعی مدل را به خوبی پیشبینی کردهایم. حال به بررسی و شبیهسازی مدل میپردازیم. در ادامه کد مربوط به شبیهسازی چنین دادههایی نوشته شده است.
1# Simulate an AR(2) process
2
3n = int(1000)
4alphas = np.array([.666, -.333])
5betas = np.array([0.])
6
7# Python requires us to specify the zero-lag value which is 1
8# Also note that the alphas for the AR model must be negated
9# We also set the betas for the MA equal to 0 for an AR(p) model
10# For more information see the examples at statsmodels.org
11ar = np.r_[1, -alphas]
12ma = np.r_[1, betas]
13
14ar2 = smt.arma_generate_sample(ar=ar, ma=ma, nsample=n)
15_ = tsplot(ar2, lags=lags)
با توجه به دادههای شبیهسازی شده، نمودارهای تحلیل سریزمانی با تابع tsplot، ترسیم شده است.
در این قسمت سعی میکنیم پارامتر مربوط به دادههای شبیهسازی شده را برآورد کنیم. مدل در نظر گرفته شده توسط تابع select_order در اینجا هم برابر با ۲ است.
1# Fit an AR(p) model to simulated AR(2) process
2
3max_lag = 10
4mdl = smt.AR(ar2).fit(maxlag=max_lag, ic='aic', trend='nc')
5est_order = smt.AR(ar2).select_order(
6 maxlag=max_lag, ic='aic', trend='nc')
7
8true_order = 2
9p('\ncoef estimate: {:3.4f} {:3.4f} | best lag order = {}'
10 .format(mdl.params[0],mdl.params[1], est_order))
11p('\ntrue coefs = {} | true order = {}'
12 .format([.666,-.333], true_order))
خروجیهای که در ادامه قابل مشاهده هستند تقریبا برابر با ضریبهای واقعی هستند.
به منظور بررسی مدل سری زمانی برای دادههای MSFT که در بخش اول این سری مطالب معرفی و بارگذاری شده، دستور زیر را اجرا کنید.
1_ = tsplot(data.MSFT, lags=30)
حال به بررسی خروجی تابع tsplot برای لگاریتم دادههای MSFT میپردازیم.
به نظر میرسد که خطاها توزیع نرمال دارند ولی بعد از گذشت ۲۳ تاخیر ضریب خودهمبستگی ACF به صفر میل میکند. حال با اجرای کد زیر محاسبات مربوط به برازش سری زمانی طی کرده و نتایج را مورد بررسی قرار میدهیم.
1# Fit an AR(p) model to simulated AR(2) process
2
3max_lag = 10
4mdl = smt.AR(ar2).fit(maxlag=max_lag, ic='aic', trend='nc')
5est_order = smt.AR(ar2).select_order(
6 maxlag=max_lag, ic='aic', trend='nc')
7
8true_order = 2
9p('\ncoef estimate: {:3.4f} {:3.4f} | best lag order = {}'
10 .format(mdl.params[0],mdl.params[1], est_order))
11p('\ntrue coefs = {} | true order = {}'
12 .format([.666,-.333], true_order))
نتیجه اجرای این کد به صورت زیر است:
به نظر میرسد که میزان تاخیر در این مدل برابر با ۲۳ است یا مدل دارای ۲۳ پارامتر خواهد بود. با توجه به تعدد پارامترها، مدل مناسب به نظر نمیرسد زیرا پیچیدگی آن زیاد است.
مدل میانگین متحرک (Moving Average)
مدل «میانگین متحرک» (Moving Average) با پارامتر مشخص میشود. این پارامتر نشان میدهد که مقدار سری زمانی در زمان با مقدار خطا یا نویز سفید تشکیل یک مدل خطی میدهد. از نظر اینکه مدل میانگین متحرک به صورت ترکیب خطی نوشته میشود، مشابه با مدل AR است ولی با این تفاوت که برحسب ترکیب خطی از خطاهای برحسب زمان، نوشته میشود.
بیان ریاضی برای مدل میانگین متحرک با توجه به نمادهای به کار رفته در قسمت اول به صورت زیر است.
در اینجا همان نویزهای سفید با میانگین صفر و ورایانس ۱ در زمان هستند.