خواه تقاضای جستجو ، درآمد یا ترافیک ناشی از جستجوی ارگانیک باشد ، در مقطعی از حرفه SEO شما ، از شما خواسته می شود پیش بینی خود را ارائه دهید.
در این ستون ، نحوه انجام دقیق و کارآمد این کار را به لطف پایتون خواهید آموخت.
ما قصد داریم نحوه انجام این کار را بررسی کنیم:
- داده های خود را بکشید و رسم کنید.
- از روش های خودکار برای برآورد بهترین پارامترهای مدل مناسب استفاده کنید.
- از روش تقویت دیکی فولر (ADF) برای آزمایش آماری یک سری زمانی استفاده کنید.
- برآورد تعداد پارامترهای مدل SARIMA.
- مدل های خود را آزمایش کنید و شروع به پیش بینی کنید.
- پیش بینی های خود را تفسیر و صادر کنید.
قبل از ورود به آن ، اجازه دهید داده ها را تعریف کنیم. صرف نظر از نوع معیار ، ما سعی می کنیم پیش بینی کنیم که این داده ها در طول زمان اتفاق می افتد.
در بیشتر موارد ، این به احتمال زیاد بیش از یک سری تاریخ است. به طور موثر ، تکنیک هایی که ما در اینجا افشا می کنیم ، تکنیک های پیش بینی سری های زمانی هستند.
بنابراین چرا پیش بینی؟
برای پاسخ به س questionال با س ،ال ، چرا پیش بینی نمی کنید؟
این تکنیک ها مدتهاست که در امور مالی برای قیمت سهام ، به عنوان مثال ، و در زمینه های دیگر استفاده می شود. چرا SEO باید متفاوت باشد؟
تبلیغات
ادامه مطلب را در زیر ادامه دهید
با علایق متعددی مانند دارنده بودجه و سایر همکاران – مثلاً مدیر SEO و مدیر بازاریابی – انتظاراتی در مورد آنچه که کانال جستجوی ارگانیک می تواند ارائه دهد و آیا این انتظارات برآورده می شود ، وجود خواهد داشت یا خیر.
پیش بینی ها پاسخ داده محور را ارائه می دهند.
اطلاعات پیش بینی مفید برای مزایای SEO
با استفاده از روش داده محور با استفاده از پایتون ، چند نکته را باید در نظر داشته باشید:
زمانی که داده های تاریخی زیادی وجود داشته باشد ، پیش بینی ها بهتر عمل می کنند.
سرعت داده ها بازه زمانی مورد نیاز برای پیش بینی شما را تعیین می کند.
به عنوان مثال ، اگر داده های روزانه مانند تجزیه و تحلیل وب سایت خود دارید ، بیش از 720 نقطه داده خواهید داشت ، که خوب است.
با استفاده از Google Trends ، که دارای سرعت هفتگی است ، برای بدست آوردن 250 امتیاز داده حداقل 5 سال زمان نیاز دارید.
در هر صورت ، شما باید یک بازه زمانی را در نظر بگیرید که حداقل 200 نقطه داده (عددی برگرفته از تجربه شخصی من) را در اختیار شما قرار دهد.
مدلهایی قوام را دوست دارند.
اگر روند داده های شما دارای الگویی است – به عنوان مثال ، به دلیل وجود فصلی چرخه ای است – احتمالاً پیش بینی های شما قابل اطمینان تر است.
تبلیغات
ادامه مطلب را در زیر ادامه دهید
به همین دلیل ، پیش بینی ها روندهای شکست را به خوبی کنترل نمی کنند ، زیرا هیچ داده تاریخی برای آینده وجود ندارد ، همانطور که بعداً خواهیم دید.
بنابراین مدل های پیش بینی چگونه کار می کنند؟ چند جنبه وجود دارد که مدلها در مورد داده های سری زمانی به آنها می پردازند:
همبستگی خودکار
خود همبستگی عبارت است از میزان شباهت نقطه داده با نقطه داده قبل از آن.
این می تواند اطلاعات مدل را در مورد میزان تأثیر یک رویداد در زمان بر ترافیک جستجو و اینکه آیا الگو فصلی است ، ارائه دهد.
فصلی بودن
فصلی بودن مدل را در مورد اینکه آیا یک الگوی چرخه ای وجود دارد یا خیر ، و ویژگی های الگو ، به عنوان مثال: مدت زمان یا اندازه تغییرات بین اوج و پایین ، اطلاع می دهد.
ایستایی
ثابت ماندن معیار تغییر روند کلی در طول زمان است. یک روند غیر ثابت ، علیرغم بالا و پایین دوره های فصلی ، یک روند کلی را بالا یا پایین نشان می دهد.
با در نظر گرفتن موارد فوق ، مدلها کارهایی را با داده ها انجام می دهند تا آنها را مستقیم تر و در نتیجه قابل پیش بینی تر کنند.
با بیرون آمدن نظریه whistlestop ، بیایید پیش بینی را شروع کنیم.
کاوش در داده های خود
# Import your libraries import pandas as pd from statsmodels.tsa.statespace.sarimax import SARIMAX from statsmodels.graphics.tsaplots import plot_acf, plot_pacf from statsmodels.tsa.seasonal import seasonal_decompose from sklearn.metrics import mean_squared_error from statsmodels.tools.eval_measures import rmse import warnings warnings.filterwarnings("ignore") from pmdarima import auto_arima
ما از داده های Google Trends ، که یک فایل CSV است ، استفاده می کنیم.
از این تکنیک ها می توان در هر سری سری زمانی استفاده کرد ، اعم از خود شما ، کلیک های مشتری یا شرکت ، درآمد و غیره.
# Import Google Trends Data df = pd.read_csv("exports/keyword_gtrends_df.csv", index_col=0) df.head()

همانطور که انتظار داشتیم ، داده های Google Trends یک سری زمانی بسیار ساده است که دارای تاریخ ، پرس و جو و بازدیدهای 5 ساله است.
تبلیغات
ادامه مطلب را در زیر ادامه دهید
وقت آن رسیده که فرمت داده را از طولانی به گسترده فرمت کنید.
این به ما امکان می دهد داده ها را با هر عبارت جستجو به عنوان ستون مشاهده کنیم:
df_unstacked = ps_trends.set_index(["date", "query"]).unstack(level=-1) df_unstacked.columns.set_names(['hits', 'query'], inplace=True) ps_unstacked = df_unstacked.droplevel('hits', axis=1) ps_unstacked.columns = [c.replace(' ', '_') for c in ps_unstacked.columns] ps_unstacked = ps_unstacked.reset_index() ps_unstacked.head()

ما دیگر ستون بازدید نداریم ، زیرا این مقادیر پرس و جوها در ستون های مربوطه است.
این قالب نه تنها برای SARIMA (که در اینجا به بررسی آن می پردازیم) بلکه برای شبکه های عصبی مانند حافظه کوتاه مدت طولانی (LSTM) نیز مفید است.
تبلیغات
ادامه مطلب را در زیر ادامه دهید
بیایید داده ها را ترسیم کنیم:
ps_unstacked.plot(figsize=(10,5))

از طرح (بالا) ، متوجه خواهید شد که مشخصات “PS4” و “PS5” هر دو متفاوت است. برای بازیگران غیر شما ، “PS4” نسل چهارم کنسول Sony Playstation و “PS5” پنجمین است.
جستجوهای “PS4” بسیار فصلی هستند زیرا یک محصول ثابت هستند و یک الگوی منظم جدا از پایان هنگام ظهور “PS5” دارند.
تبلیغات
ادامه مطلب را در زیر ادامه دهید
“PS5” 5 سال پیش وجود نداشت ، که عدم وجود روندی را در 4 سال اول طرح بالا توضیح می دهد.
من این دو پرسش را برای نشان دادن تفاوت در پیش بینی اثربخشی دو ویژگی بسیار متفاوت انتخاب کردم.
تجزیه روند
اکنون بیایید ویژگی های فصلی (یا غیر فصلی) هر گرایش را تجزیه کنیم:
ps_unstacked.set_index("date", inplace=True) ps_unstacked.index = pd.to_datetime(ps_unstacked.index)
query_col="ps5" a = seasonal_decompose(ps_unstacked[query_col], model = "add") a.plot();

موارد فوق داده های سری زمانی و روند کلی صاف ناشی از سال 2020 را نشان می دهد.
تبلیغات
ادامه مطلب را در زیر ادامه دهید
جعبه روند فصلی قله های مکرر را نشان می دهد ، که نشان می دهد از سال 2016 فصلی وجود دارد. با این حال ، با توجه به میزان مسطح بودن سری زمانی از 2016 تا 2020 ، به نظر نمی رسد.
همچنین عدم وجود سر و صدا مشکوک است ، زیرا طرح فصلی یک الگوی تقریباً یکنواخت را نشان می دهد که به صورت دوره ای تکرار می شود.
Resid (که مخفف “باقی مانده” است) هر الگویی از آنچه از داده های سری زمانی پس از محاسبه فصلی و روند باقی مانده است را نشان می دهد ، که در واقع تا سال 2020 چیزی نیست زیرا بیشتر اوقات صفر است.
برای “ps4”:

ما می توانیم نوساناتی را در کوتاه مدت (فصلی) و بلند مدت (Trend) با کمی سر و صدا (Resid) مشاهده کنیم.
تبلیغات
ادامه مطلب را در زیر ادامه دهید
گام بعدی استفاده از روش تقویت دیکی فولر (ADF) برای آزمایش آماری است که آیا یک سری زمانی معین ثابت است یا خیر.
from pmdarima.arima import ADFTest adf_test = ADFTest(alpha=0.05) adf_test.should_diff(ps_unstacked[query_col]) PS4: (0.09760939899434763, True) PS5: (0.01, False)
می بینیم که مقدار p “PS5” نشان داده شده در بالا بیش از 0.05 است ، به این معنی که داده های سری زمانی ثابت نیستند و بنابراین نیاز به تفاوت دارند.
“PS4” ، از سوی دیگر ، کمتر از 0.05 در 0.01 است. ثابت است و نیازی به تفاوت ندارد
نکته همه اینها درک پارامترهایی است که اگر ما به صورت دستی مدلی برای پیش بینی جستجوهای گوگل بسازیم ، مورد استفاده قرار می گیرد.
متناسب با مدل SARIMA شما
از آنجا که ما از روش های خودکار برای برآورد بهترین پارامترهای مدل مناسب استفاده می کنیم (بعدا) ، اکنون قصد داریم تعداد پارامترهای مدل SARIMA خود را برآورد کنیم.
من SARIMA را انتخاب کردم زیرا نصب آن آسان است. اگرچه پیام فیس بوک از نظر ریاضی زیبا است (از روشهای مونت کارلو استفاده می کند) ، اما به اندازه کافی نگهداری نمی شود و بسیاری از کاربران ممکن است هنگام نصب آن با مشکل مواجه شوند.
تبلیغات
ادامه مطلب را در زیر ادامه دهید
در هر صورت ، SARIMA از نظر دقت بسیار خوب با پیامبر مقایسه می شود.
برای برآورد پارامترهای مدل SARIMA ما ، توجه داشته باشید که ما m را بر روی 52 قرار می دهیم زیرا 52 هفته در سال وجود دارد ، به این ترتیب فاصله ها در Google Trends فاصله می گیرند.
ما همچنین تمام پارامترها را برای شروع از 0 تنظیم کرده ایم تا بتوانیم به auto_arima اجازه دهیم کارهای سنگین را انجام دهد و مقادیری را که برای پیش بینی بهتر با داده ها مطابقت دارد جستجو کند.
ps5_s = auto_arima(ps_unstacked['ps4'], trace=True, m=52, # there are 52 periods per season (weekly data) start_p=0, start_d=0, start_q=0, seasonal=False)
پاسخ به موارد بالا:
Performing stepwise search to minimize aic ARIMA(3,0,3)(0,0,0)[0] : AIC=1842.301, Time=0.26 sec ARIMA(0,0,0)(0,0,0)[0] : AIC=2651.089, Time=0.01 sec ... ARIMA(5,0,4)(0,0,0)[0] intercept : AIC=1829.109, Time=0.51 sec Best model: ARIMA(4,0,3)(0,0,0)[0] intercept Total fit time: 6.601 seconds
چاپ بالا نشان می دهد که پارامترهایی که بهترین نتایج را می گیرند عبارتند از:
PS4: ARIMA(4,0,3)(0,0,0) PS5: ARIMA(3,1,3)(0,0,0)
هنگام چاپ خلاصه مدل ، برآورد PS5 بیشتر توضیح داده می شود:
ps5_s.summary()

آنچه اتفاق می افتد این است: این تابع به دنبال به حداقل رساندن احتمال خطا است که توسط معیار اطلاعات Akaike (AIC) و معیار اطلاعات بیزی اندازه گیری می شود.
تبلیغات
ادامه مطلب را در زیر ادامه دهید
AIC = -2Log(L) + 2(p + q + k + 1)
به طوری که L احتمال داده ها است ، k = 1 اگر c ≠ 0 و k = 0 اگر c = 0
BIC = AIC + [log(T) - 2] + (p + q + k + 1)
با به حداقل رساندن AIC و BIC ، بهترین پارامترهای برآورد شده برای p و q را بدست می آوریم.
مدل را تست کنید
اکنون که پارامترها را داریم ، می توانیم پیش بینی ها را شروع کنیم. ابتدا ، ما نحوه عملکرد مدل را بر روی داده های گذشته می بینیم. این به ما نشان می دهد که مدل چگونه می تواند در دوره های آینده عملکرد خوبی داشته باشد.
ps4_order = ps4_s.get_params()['order'] ps4_seasorder = ps4_s.get_params()['seasonal_order'] ps5_order = ps5_s.get_params()['order'] ps5_seasorder = ps5_s.get_params()['seasonal_order'] params = { "ps4": {"order": ps4_order, "seasonal_order": ps4_seasorder}, "ps5": {"order": ps5_order, "seasonal_order": ps5_seasorder} } results = [] fig, axs = plt.subplots(len(X.columns), 1, figsize=(24, 12)) for i, col in enumerate(X.columns): #Fit best model for each column arima_model = SARIMAX(train_data[col], order = params[col]["order"], seasonal_order = params[col]["seasonal_order"]) arima_result = arima_model.fit() #Predict arima_pred = arima_result.predict(start = len(train_data), end = len(X)-1, typ="levels") .rename("ARIMA Predictions") #Plot predictions test_data[col].plot(figsize = (8,4), legend=True, ax=axs[i]) arima_pred.plot(legend = True, ax=axs[i]) arima_rmse_error = rmse(test_data[col], arima_pred) mean_value = X[col].mean() results.append((col, arima_pred, arima_rmse_error, mean_value)) print(f'Column: {col} --> RMSE Error: {arima_rmse_error} - Mean: {mean_value}n') Column: ps4 --> RMSE Error: 8.626764032898576 - Mean: 37.83461538461538 Column: ps5 --> RMSE Error: 27.552818032476257 - Mean: 3.973076923076923
پیش بینی ها نشان می دهد که مدلها زمانی خوب هستند که سابقه کافی وجود داشته باشد تا ناگهان تغییر کنند ، همانطور که برای PS4 از مارس به بعد تغییر کرده است.
برای PS5 ، مدلها تقریباً از ابتدا ناامید کننده هستند.
ما این را می دانیم زیرا Root Mean Squared Error (RMSE) برای PS4 8.62 است که بیش از یک سوم PS5 RMSE 27.5 است. با توجه به اینکه Google Trends از 0 تا 100 متغیر است ، این 27٪ حاشیه خطا است.
آینده را پیش بینی کنید
در این مرحله ، ما اکنون تلاش احمقانه ای را برای پیش بینی آینده بر اساس داده هایی که تا به امروز داریم انجام می دهیم:
تبلیغات
ادامه مطلب را در زیر ادامه دهید
oos_train_data = ps_unstacked oos_train_data.tail()

همانطور که از عصاره جدول بالا مشاهده می کنید ، ما اکنون از همه داده های موجود استفاده می کنیم.
اکنون ، 6 ماه آینده (که 26 هفته تعریف شده است) را در کد زیر پیش بینی می کنیم:
oos_results = [] weeks_to_predict = 26 fig, axs = plt.subplots(len(ps_unstacked.columns), 1, figsize=(24, 12)) for i, col in enumerate(ps_unstacked.columns): #Fit best model for each column s = auto_arima(oos_train_data[col], trace=True) oos_arima_model = SARIMAX(oos_train_data[col], order = s.get_params()['order'], seasonal_order = s.get_params()['seasonal_order']) oos_arima_result = oos_arima_model.fit()
#Predict oos_arima_pred = oos_arima_result.predict(start = len(oos_train_data), end = len(oos_train_data) + weeks_to_predict, typ="levels").rename("ARIMA Predictions") #Plot predictions oos_arima_pred.plot(legend = True, ax=axs[i]) axs[i].legend([col]); mean_value = ps_unstacked[col].mean() oos_results.append((col, oos_arima_pred, mean_value)) print(f'Column: {col} - Mean: {mean_value}n')
خروجی:
Performing stepwise search to minimize aic ARIMA(2,0,2)(0,0,0)[0] intercept : AIC=1829.734, Time=0.21 sec ARIMA(0,0,0)(0,0,0)[0] intercept : AIC=1999.661, Time=0.01 sec ... ARIMA(1,0,0)(0,0,0)[0] : AIC=1865.936, Time=0.02 sec Best model: ARIMA(1,0,0)(0,0,0)[0] intercept Total fit time: 0.722 seconds Column: ps4 - Mean: 37.83461538461538
Performing stepwise search to minimize aic ARIMA(2,1,2)(0,0,0)[0] intercept : AIC=1657.990, Time=0.19 sec ARIMA(0,1,0)(0,0,0)[0] intercept : AIC=1696.958, Time=0.01 sec ... ARIMA(4,1,4)(0,0,0)[0] : AIC=1645.756, Time=0.56 sec Best model: ARIMA(3,1,3)(0,0,0)[0] Total fit time: 7.954 seconds Column: ps5 - Mean: 3.973076923076923
این بار ، ما پیدا کردن بهترین پارامترهای مناسب را به طور خودکار انجام دادیم و آن را مستقیماً در مدل قرار دادیم.
در چند هفته گذشته داده های زیادی تغییر کرده است. گرچه روندهای پیش بینی شده محتمل به نظر می رسند ، اما مانند تصویر زیر بسیار دقیق به نظر نمی رسند:

این در مورد آن دو کلمه کلیدی است. اگر بخواهید کد را بر اساس داده های دیگر خود بر اساس پرس و جوهای بیشتر امتحان کنید ، احتمالاً پیش بینی دقیق تری در مورد داده های شما ارائه می دهند.
تبلیغات
ادامه مطلب را در زیر ادامه دهید
کیفیت پیش بینی بستگی به میزان پایداری الگوهای تاریخی دارد و بدیهی است که وقایع غیرقابل پیش بینی مانند COVID-19 را در نظر نخواهد گرفت.
شروع پیش بینی برای SEO
اگر با ابزار تجسم داده های matplot پایتون هیجان زده نشده اید ، نترسید! شما می توانید داده ها و پیش بینی ها را به Excel ، Tableau یا داشبورد دیگری منتقل کنید تا ظاهر آنها زیبا تر شود.
برای صادر کردن پیش بینی های خود:
df_pred = pd.concat([pd.Series(res[1]) for res in oos_results], axis=1) df_pred.columns = [x + str('_preds') for x in ps_unstacked.columns] df_pred.to_csv('your_forecast_data.csv')
آنچه در اینجا آموختیم این است که پیش بینی با استفاده از مدل های آماری مفید است یا احتمالاً برای پیش بینی ارزش افزوده خواهد داشت ، به ویژه در سیستم های خودکار مانند داشبورد – به عنوان مثال ، هنگامی که داده های تاریخی وجود دارد و نه زمانی که جهش ناگهانی وجود دارد ، مانند PS5.
منابع بیشتر:
تصویر ویژه: ImageFlow/Shutterstock