Forecasting SEO: Prevedere il Traffico con Python e Prophet
Indice dei Contenuti
Il SEO è tradizionalmente una disciplina reattiva: ottimizziamo, aspettiamo, misuriamo. Ma nell’era data-driven del 2026, i board aziendali chiedono previsioni. “Quanto traffico avremo a Natale?”, “Il calo di ieri è stagionale o abbiamo rotto qualcosa?”. Rispondere a queste domande con “dipende” non è più sufficiente. Dobbiamo usare il Forecasting (previsione) e l’Anomaly Detection (rilevamento anomalie).
Per questo task, la libreria open-source Prophet (sviluppata originariamente da Meta) rimane uno standard industriale insuperato per la sua capacità di gestire la “sporcizia” e la stagionalità dei dati web reali.
Perché non basta una Media Mobile?
Molti SEO usano Excel per calcolare trend lineari o medie mobili. Questo approccio fallisce perché ignora la complessità del calendario:
- Doppia Stagionalità: Un e-commerce B2B ha pattern settimanali (crolla nel weekend) e annuali (crolla ad agosto).
- Festività Mobili: Pasqua, Black Friday e Carnevale non cadono sempre negli stessi giorni. Prophet ha calendari integrati per gestirlo.
- Cambiamenti Strutturali: Se il sito è migrato a HTTPs o ha cambiato dominio, la “baseline” cambia.
Workflow Python per l’Anomaly Detection
L’obiettivo è creare uno script che ogni mattina confronti il traffico reale di ieri con quello “atteso”. Se la differenza supera una certa soglia (Confidence Interval), scatta l’allarme.
Prerequisiti
- Python 3.10+
- Dati storici giornalieri (Sessioni Organiche o Click GSC) degli ultimi 24 mesi.
Il Codice
import pandas as pd
from prophet import Prophet
import matplotlib.pyplot as plt
# 1. Carica i dati (export GA4/GSC)
# Il formato deve essere: 'ds' (data YYYY-MM-DD) e 'y' (metrica da prevedere)
df = pd.read_csv('organic_traffic_history.csv')
# 2. Configurazione del Modello
# Abilitiamo stagionalità giornaliera, settimanale e annuale
m = Prophet(
yearly_seasonality=True,
weekly_seasonality=True,
daily_seasonality=False,
interval_width=0.95 # Confidenza al 95%
)
# Aggiungiamo festività italiane (cruciale per e-commerce locali)
m.add_country_holidays(country_name='IT')
# 3. Training
m.fit(df)
# 4. Previsione (30 giorni futuri)
future = m.make_future_dataframe(periods=30)
forecast = m.predict(future)
# 5. Rilevamento Anomalie (Logica Custom)
# Uniamo dati reali e previsioni
check_df = pd.merge(df, forecast[['ds', 'yhat_lower', 'yhat_upper']], on='ds')
# Se il valore reale è fuori dal "tunnel" di confidenza -> Anomalia
def detect_anomaly(row):
if row['y'] < row['yhat_lower']:
return "CRASH"
if row['y'] > row['yhat_upper']:
return "SPIKE"
return "NORMAL"
check_df['status'] = check_df.apply(detect_anomaly, axis=1)
# Alerting
today_status = check_df.iloc[-1]['status']
if today_status == "CRASH":
print("🚨 ALERT: Traffico sotto la soglia minima prevista!")
Operazionalizzare il Modello
Questo non deve rimanere un notebook Jupyter sul tuo PC.
- Cloud Function: Porta lo script su Google Cloud Functions o AWS Lambda.
- Scheduler: Fallo girare ogni mattina alle 09:00 (dopo che i dati di ieri sono consolidati).
- Slack Webhook: Invia il grafico della previsione vs reale direttamente nel canale #marketing-team.
Passare da “Ho l’impressione che il traffico sia calato” a “L’algoritmo rileva una deviazione di -3 sigmi dalla media prevista” cambia radicalmente la percezione della professionalità SEO in azienda.