پیش بینی می تواند ارزش زیادی در سئو ارائه دهد. در اینجا نحوه دریافت پاسخ های داده محور در مورد ترند های احتمالی در جستجوی ارگانیک با استفاده از پایتون آورده شده است. اگر تقاضای جستجو، درآمد یا ترافیک ناشی از جستجوی ارگانیک باشد، در مقطعی از حرفه سئو شما، از شما خواسته می شود پیش بینی خود را ارائه دهید. در این پست، نحوه استفاده از پایتون برای پیش بینی های سئو را خواهید آموخت.

ما قصد داریم چگونگی انجام این کار را بررسی کنیم:

  • داده های خود را رسم کنید.
  • از روش های خودکار برای برآورد بهترین پارامتر های مدل مناسب استفاده کنید.
  • از روش تقویت دیکی فولر (ADF) برای آزمایش آماری یک سری زمانی استفاده کنید.
  • برآورد تعداد پارامتر های مدل SARIMA.
  • مدل های خود را آزمایش کنید و شروع به پیش بینی کنید.
  • پیش بینی های خود را تفسیر کنید و خروجی بگیرید.

قبل از شروع، اجازه دهید داده ها را تعریف کنیم. صرف نظر از نوع معیار، ما در تلاش هستیم پیش بینی کنیم که این داده ها در طول زمان چگونه تغییر می کنند. در بیشتر موارد، این به احتمال زیاد بیش از یک سری تاریخ است. به طور مؤثر، تکنیک هایی که ما در اینجا افشا می کنیم تکنیک های پیش بینی سری های زمانی هستند.

بنابراین چرا پیش بینی؟

برای پاسخ به این مسئله با سؤال، باید بپرسم چرا پیش بینی نمی کنید؟ این تکنیک ها مدت هاست که در امور مالی برای قیمت سهام و به عنوان مثال در زمینه های دیگر مورد استفاده قرار می گیرد. چرا سئو باید متفاوت باشد؟

با توجه به علایق متعدد مانند دارنده بودجه و سایر همکاران، مثلاً مدیر سئو و مدیر بازاریابی، انتظاراتی در مورد آنچه که کانال جستجوی ارگانیک می تواند ارائه دهد و آیا این انتظارات برآورده خواهد شد، وجود خواهد داشت. پیش بینی ها پاسخ داده محور برای این موارد را ارائه می دهند.

اطلاعات پیش بینی مفید برای مزایای سئو

برای استفاده از پایتون برای پیش بینی های سئو چند نکته را باید در نظر داشته باشید:

زمانی که داده های تاریخی زیادی وجود داشته باشد، پیش بینی ها بهتر عمل می کنند. سرعت داده ها بازه زمانی مورد نیاز برای پیش بینی شما را تعیین می کند. به عنوان مثال، اگر داده های روزانه ای مانند تجزیه و تحلیل وب سایت خود دارید، بیش از 720 نقطه داده خواهید داشت، که خوب است.

با Google Trends، که دارای سرعت هفتگی است، حداقل 5 سال زمان نیاز دارید تا 250 امتیاز داده را بدست آورید. در هر صورت، شما باید یک بازه زمانی را در نظر بگیرید که حداقل 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();
ویژگی های فصلی (یا غیر فصلی) PS5

موارد فوق داده های سری زمانی و روند کلی از سال 2020 را نشان می دهد. روند فصلی قله های مکرر را نشان می دهد، که نشان می دهد از سال 2016 داده فصلی وجود دارد. با این حال، با توجه به میزان مسطح بودن سری زمانی از سال 2016 تا 2020، چندان قابل اعتماد به نظر نمی رسد.

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

برای “ps4”:

ویژگی های فصلی (یا غیر فصلی) 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 را در نظر نخواهد گرفت.

شروع استفاده از پایتون برای پیش بینی سئو

شما می توانید داده ها و پیش بینی ها را به 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. امیدواریم این پست به شما کمک کرده باشد نحوه استفاده از پایتون برای پیش بینی سئو را آموخته باشید.

منبع: searchenginejournal.com