Abbiamo avuto modo di esaminare nel corso dei precedenti post concetti come la media o lo scarto quadratico medio, capaci di descrivere una singola variabile. Si tratta di statistiche che rivestono una grande importanza; tuttavia, nella pratica quotidiana, capita sovente di dover indagare le relazioni tra due o più variabili. Ecco dunque emergere nuovi concetti chiave: la correlazione e l’analisi di regressione.
La correlazione e l’analisi della regressione sono strumenti assai utilizzati durante l’analisi dei nostri set di dati.
Implicano la stima della relazione tra una variabile dipendente e una o più variabili indipendenti.
Possiamo considerare la regressione come un metodo idoneo a ricercare una relazione matematica che esprima un legame tra un carattere y (la variabile dipendente o variabile responso) ed un carattere x (variabile indipendente o variabile predittiva).
Il primo passo utile per indagare qualitativamente l’eventuale dipendenza fra due variabili x e y consiste sempre nel disegnare un grafico, chiamato diagramma di dispersione (scatterplot).
Poniamo in ascissa i dati relativi a una delle due variabili, in ordinata quelli relativi all’altra variabile e rappresentiamo con dei punti le singole osservazioni. Ricordiamo infatti che i grafici a dispersione confrontano due variabili.
Se esiste una relazione semplice fra le due variabili, il diagramma dovrebbe mostrarla!
Usiamo dei valori di esempio e lasciamo a R il compito di tracciare a video il nostro diagramma di dispersione.
Riporto in un file csv dei dati di fantasia relativi a una ipotetica correlazione tra la temperatura ambientale registrata nella mia città e le vendite di gelati. Chiamo il file gelati.csv e lo salvo come pure testo in una cartella qualsiasi del mio filesystem (nel mio esempio in tmp/gelati.csv). Il file avrà questo contenuto:
temperatura,gelati 25,58 30,70 29,61 26,53 25,48 28,66 24,47 22,47 20,40 18,29 22,33
Ora apro R Studio e carico il mio dataset:
gelati <- read.csv("/tmp/gelati.csv") Poi traccio il grafico scatterplot per vedere se la figura è compatibile con una ipotesi di regressione lineare:
plot(gelati)
Il diagramma mostra una evidente correlazione di tipo lineare, con tendenza ascendente.
Esistono in statistica svariati tipi di coefficienti di correlazione. Qualora la relazione da indagare sia tra due variabili di tipo intervallo oppure rapporto (si tratta quindi di variabili di tipo quantitativo, numeriche), il più noto e il più usato è certamente il coefficiente di correlazione di Pearson, generalmente indicato con la lettera r.
Uso il linguaggio R (da non confondere con il coefficiente r) per un esempio pratico con il coefficiente di correlazione di Pearson.
La funzione da utilizzare è cor():
cor(gelati$temperatura,gelati$gelati) [1] 0.9320279
Come si vede la correlazione in questo esempio è davvero molto forte.
r infatti è un valore standardizzato e va da +1 a -1. Più si allontana da zero e si avvicina a 1 (o a -1 in caso di correlazione negativa), più è forte la correlazione.
Se r è positivo la correlazione è positiva, cioè y aumenta all’aumentare di x .
Se r è negativo, y diminuisce all’aumentare di x.
Ma quando posso dire che una correlazione è forte o molto forte e quando moderata o addirittura nulla? La risposta è…dipende 🙂
Non esiste una risposta standard. In maniera molto arbitraria possiamo dire che in genere una correlazione sotto a 0.20 (o per meglio dire, tra -0.2 e +0.2) è considerata molto debole, tra 0.2 e 0.5 (o tra -0.2 e -0.5) moderata, tra 0.5 e 0.8 (o tra -0.5 e -0.8) piuttosto forte. Correlazioni superiori a 0.8 o inferiori a -0.8, molto forti, sono in realtà abbastanza rare.
ATTENZIONE 1 : La cosa in realtà più importante è che l’evidenza di una relazione tra due variabili non implica necessariamente la presenza di un rapporto di causa effetto tra le due variabili. E’ un punto della massima importanza, che va sempre tenuto bene a mente. Entrambe le variabili che nel mio studio mostrano una fortissima correlazione possono in realtà dipendere da una terza variabile, o da molte altre variabili, che costituiscono la reale causa. Trovare e calcolare la correlazione tra due variabili è relativamente semplice, trovare e soprattutto provare un rapporto di causa ed effetto è estremamente complesso!
ATTENZIONE 2: Un altro punto che vorrei sottolineare è che il coefficiente di correlazione r di Pearson misura la correlazione lineare tra due variabili. Questo significa che due variabili possono mostrare una correlazione apparente nulla (r circa 0) eppure essere correlate, ad esempio mostrando una correlazione di tipo curvilineo. Un classico esempio di scuola riguarda la correlazione tra il livello di stress e la prestazione in una prova di esame. Un leggero stress infatti contribuisce a migliorare la prestazione, ma superata una certa soglia risulta del tutto dannoso, portando a un decadimento del risultato. In questo caso, l’analisi in termini di r e di correlazione lineare porterebbe a scartare una correlazione invece esistente.
E ora on po’ di matematica (ma davvero poca)
Il coefficiente di correlazione di Pearson per una popolazione, date due variabili X e Y, si indica con la lettera greca rho ed è dato da:
dove:
Per calcolare la covarianza della popolazione (che, ricordiamo, è una misura non standardizzata della direzione e della forza della relazione tra gli elementi di due popolazioni):
\( \sigma_{XY}=\frac{\sum\limits_{i=1}^n (X_i-\mu_x)(Y_i-\mu_y)}{n} \\ \)dove:
Attenzione: per calcolare i valori per quanto riguarda una popolazione stimata, basterà usare al denominatore sempre n-1.
Di default R usa sempre deviazione standard campionaria, quindi il valore calcolato della r di Pearson sarà sempre calcolato con n-1 al denominatore.
Tiro fuori la calcolatrice – o carta e penna – e faccio un po’ di conti…
questa è la mia tabella, che ho completato computando i vari valori:
| temperatura | gelati | xi-X | yi-Y | (xi-X)-(yi-Y) | |
|---|---|---|---|---|---|
| 1 | 25 | 58 | 0.55 | 7.82 | 4.26 |
| 2 | 30 | 70 | 5.55 | 19.82 | 109.90 |
| 3 | 29 | 61 | 4.55 | 10.82 | 49.17 |
| 4 | 26 | 53 | 1.55 | 2.82 | 4.36 |
| 5 | 25 | 48 | 0.55 | -2.18 | -1.19 |
| 6 | 28 | 66 | 3.55 | 15.82 | 56.08 |
| 7 | 24 | 47 | -0.45 | -3.18 | 1.45 |
| 8 | 22 | 47 | -2.45 | -3.18 | 7.81 |
| 9 | 20 | 40 | -4.45 | -10.18 | 45.36 |
| 10 | 18 | 29 | -6.45 | -21.18 | 136.72 |
| 11 | 22 | 33 | -2.45 | -17.18 | 42.17 |
La somma dei valori dell’ultima colonna è 456.0909.
Posso quindi calcolare la covarianza dividendo per n-1 = 10, quindi:
456.0909/10 = 45.60909
Calcolando le deviazioni standard campionarie per X e Y, trovo i valori:
Sx = 3,751363
Sy = 13,04468
Quindi Sx * Sy = 48,9353299
Ultimo passaggio. Posso calcolare r:
45,60909 / 48,9353299 = 0,9320278435
che come si vede coincide perfettamente con il valore fornito dalla funzione cor() di R.
Elevando r al quadrato otteniamo il coefficiente di determinazione.
Nel nostro caso il coefficiente di determinazione r2 sarà:
R-squared = 0.86868
ma cosa significa questo numero?
r2 ci segnala in quale misura la nostra equazione di regressione riproduce la varianza dei dati.
Detta in altri termini, quanta parte della variazione della variabile responso è spiegata dalla variabile predittiva. Più è accurata l’equazione di regressione, più il valore di r2 tende a 1.
La funzione cor() in R consente di ottenere facilmente i valori di correlazione calcolati attraverso tutti questi metodi, come si vede facilmente dalla sintassi della funzione:
cor(x, y = NULL, use = "everything", method = c("pearson", "kendall", "spearman")) Il nostro scopo è quello di ottenere l’equazione di regressione, e trattandosi di una regressione lineare la forma tipica sarà:
y = mx + b
m indica la pendenza della retta nel grafico, e si chiama coefficiente di regressione.
b è il punto in cui la retta interseca l’asse delle y, e si chiama intercetta.
Ricordiamo sempre che la retta di regressione lineare è la retta che meglio si adatta ai dati forniti. Idealmente, vorremmo ridurre al minimo le distanze di tutti i punti dati dalla linea di regressione. Queste distanze sono chiamate errore e sono anche note come valori residui. Una buona linea avrà piccoli residui.
Adattiamo la linea di regressione ai punti dati in un grafico a dispersione utilizzando il metodo dei minimi quadrati.
I calcoli non sono difficili (non riporto in questa sede il procedimento), ma la procedura può essere tediosa. Per questo, tutte le calcolatrici scientifiche evolute e molti fogli elettronici e programmi forniscono procedure che ci semplificano la vita.
Usando R, il processo è ancora più agevole.
Procedo calcolando i parametri della retta di regressione:
# calcolo i parametri della retta di regressione lm(gelati$gelati ~ gelati$temperatura) Call: lm(formula = gelati$gelati ~ gelati$temperatura) Coefficients: (Intercept) gelati$temperatura -29.074 3.241
Dunque la mia retta avrà equazione:
y = 3,241x - 29,074
E’ giunto il momento di tracciare di nuovo il diagramma a dispersione, sovrapponendo la linea di regressione che ho appena trovato:
# disegno lo scatterplot plot(gelati$temperatura,gelati$gelati, main="Scatterplot e linea di regressione",xlab="temperatura", ylab="gelati") # e traccio la linea di regressione in rosso abline(lm(gelati$gelati ~ gelati$temperatura),col="red",lwd=2)
Il dataset dei gelati ci ha accompagnato fin qui, ma portiamo ora la regressione nel territorio che ci interessa davvero: il marketing. Abbiamo dodici settimane di campagne Google Ads, e per ogni settimana conosciamo la spesa (in euro) e le conversioni registrate. La domanda è quella che ogni cliente, prima o poi, ci rivolge: se aumento il budget, quante conversioni in più posso aspettarmi?
spesa,conversioni 120,15 150,14 95,11 180,22 210,20 160,18 140,13 250,26 190,17 230,25 110,13 175,16
Stimo il modello in R:
dati <- read.csv("/tmp/ads.csv")
modello <- lm(conversioni ~ spesa, data = dati)
summary(modello)
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.93098 2.22949 0.866 0.407
spesa 0.09295 0.01284 7.240 2.79e-05 ***
Multiple R-squared: 0.8398, Adjusted R-squared: 0.8238 Leggiamo i risultati con calma, perché ogni numero ha qualcosa da dirci.
La pendenza vale 0.093: per ogni euro di spesa in più, il modello stima 0.093 conversioni aggiuntive. In termini più chiari e diretti: una conversione ogni 11 euro circa. Il suo p-value (2.79e-05) ci dice che la relazione è tutto fuorché casuale.
L’intercetta vale 1.93: sarebbero le conversioni attese a spesa zero. Ma attenzione al suo p-value (0.407): non è statisticamente diversa da zero. Il modello, in altri termini, non ha dati a sufficienza per dirci quanto convertiremmo senza campagne — logico, visto che non abbiamo nemmeno una settimana a spesa zero nel dataset. Le previsioni fuori dall’intervallo osservato (95–250 euro) restano terreno scivoloso.
L’R2 vale 0.84: la spesa spiega l’84% della variabilità delle conversioni settimanali. Il restante 16% è tutto ciò che il modello non vede: stagionalità, qualità degli annunci, concorrenza, giorni di pioggia.
A questo punto la previsione è un giochetto da ragazzi. Quante conversioni a 200 euro di spesa? Calcolo in R:
predict(modello, data.frame(spesa = 200)) # 20.52
Un avvertimento, prima di portare questo numero in una riunione. La regressione descrive un’associazione, non dimostra una causa. Se il budget veniva alzato proprio nelle settimane di domanda alta (saldi, stagionalità), parte di quella pendenza appartiene alla domanda, non alle campagne. Per stabilire un nesso causale serve un esperimento controllato — ed è esattamente il mestiere dell’A/B testing.
Un valore anomalo è un’osservazione estrema che non si adatta alla correlazione generale o al modello di regressione. In pratica, nel nostro grafico vedremo che tali valori anomali, qualora esistano, saranno molto lontani dalla linea di regressione nella direzione y.
L’inclusione di un valore anomalo può influenzare la pendenza e l’intercetta y della retta di regressione.
Quando si esamina un grafico a dispersione e si calcola l’equazione di regressione, vale la pena considerare se le osservazioni anomale debbano essere incluse o meno. Potrebbe infatti trattarsi di errori nei dati – e allora sarebbero da escludere – ma anche di valori “reali”, e in tal caso si tratta di informazioni della massima importanza per l’analista.
Ma quando possiamo parlare di valori anomali? Non esiste una regola fissa quando si cerca di decidere se includere o meno un valore anomalo nell’analisi di regressione. Questa decisione dipende dalla dimensione del campione, da quanto è estremo il valore anomalo e dalla normalità della distribuzione.
Per i dati univariati, si può utilizzare una regola empirica basata sull’intervallo interquartile IQR per determinare se un punto è o meno un valore anomalo.
Procediamo in questo modo:
Un punto influente è un punto che, se rimosso, produce un notevole cambiamento nella stima del modello. Un punto influente può essere o meno un valore anomalo (outlier).
Il comando influence.measures() fornisce tutta una serie di utili misure di influenza: dfbeta, dffit, covratio, distanza di Cook e punti di leverage di tutte le osservazioni:
# misuro punti di influenza influence.measures(lm(gelati$gelati ~ gelati$temperatura))
Perchè il modello di regressione lineare possa risultare effettivamente utilizzabile, devono essere rispettate alcune assunzioni:
Occorre dunque effettuare specifici test del modello, e tutti devono dare esito positivo per far sì che il modello di stima possa essere considerato corretto.
Se anche uno solo dei test dà esito negativo (non normalità dei residui, eteroschedasticità, correlazione seriale) il metodo di stima attraverso i minimi quadrati non va bene.
Il residuo è uguale alla differenza tra valore osservato e il valore previsto di Y.
# guardo la distribuzione dei residui. # deve essere bilanciata sopra e sotto la linea di zero. lmgelati <- lm(gelati$gelati ~ gelati$temperatura) plot (lmgelati$residual ~ lmgelati$fitted, ylab="Residui", xlab="Fitted") abline(h=0)
Il pacchetto lmtest di R ci mette a disposizione il test di Breusch-Pagan per verificare l’omoschedasticità dei residui:
# verifico omoschedasticita dei residui # utilizzando il test di Breusch-Pagan library(lmtest) testbp <- bptest(gelati ~ temperatura, data=gelati) testbp
Per quanto riguarda la normalità dei residui, l’istogramma delle frequenze consente di verificare o meno la condizione.
Possiamo verificare la normalità dei residui anche numericamente, tramite un test di Shapiro – Wilcox:
# verifico la normalita della distribuzione degli errori # con un test shapiro-wilcox residui <- residuals(lm(gelati$gelati ~ gelati$temperatura)) shapiro <- shapiro.test(residui) shapiro
Verifichiamo che la media degli errori non sia significativamente diversa da zero. Per far questo possiamo ricorre a un test t di Student:
residui <- residuals(lm(gelati$gelati ~ gelati$temperatura)) t.test(residui)
Il grafico dei residui rispetto al tempo (e l’utilizzo della statistica di Durbin-Watson) consente invece di evidenziare l’esistenza o meno di autocorrelazione.
# test Durbin Watson per autocorrelazione dwtest(gelati$temperatura~gelati$gelati)
L’analisi di regressione semplice è un modello assai utilizzato, ma molto, molto insidioso. La tendenza generalizzata, infatti, è quella di impiegare questo tipo di analisi in maniera poco consapevole e rigorosa – come ad esempio nell’esempio semplificato che ho proposto 🙂
Le assunzioni alla base del modello sono piuttosto stringenti, e molto spesso ignorate…
Frequentemente, l’analisi viene svolta senza tenere conto del modo in cui tale assunzioni debbono essere valutate oppure si sceglie il semplice modello di regressione semplice lineare al posto di modelli alternativi più calzanti.
Un altro errore molto comune è dato dall’estrapolazione: si compie cioè una stima di valori esterni all’intervallo dei valori osservati. Questo è un grande no-no.
Il consiglio è sempre quello di iniziare l’analisi guardando con grande attenzione il diagramma di dispersione e di verificare con attenzione le ipotesi alla base del modello di regressione prima di usare i risultati.
Il coefficiente di correlazione di Pearson è sicuramente il più conosciuto, studiato e usato, ma come abbiamo visto si applica nei casi in cui entrambe le variabili siano di tipo quantitativo, misurate attraverso una scala di tipo intervallo oppure rapporto. Esistono altri metodi che ci consentono di ottenere la misura della correlazione tra variabili di tipo diverso. Tutti condividono la caratteristica di essere concettualmente molto simili al coefficiente r di Pearson.
Prendiamo il caso di un’analisi nella quale una delle variabili sia di tipo quantitativo (misurata su una scala intervallo oppure rapporto) e la seconda sia una variabile categorica a due livelli (o variabile dicotomica). In questo caso ci viene in aiuto il coefficiente di correlazione punto-biseriale. Non approfondisco in questa sede il concetto, trattandosi di fatto di una versione “speciale” del coefficiente di Pearson, lasciando al lettore l’approfondimento quando richiesto dall’analisi.
Se dovesse servirci di conoscere se due variabili dicotomiche sono correlate, potremmo poi ricorrere al coefficiente phi, un altro caso “speciale” del coefficiente r di Pearson. Molti lettori sapranno certamente che due variabili dicotomiche possono anche essere analizzate servendosi di un test chi quadrato.
Ecco la formula del coefficiente di Spearman:
\( \\ r_s=\frac{6\sum{d}_i^2}{N(N^2-1)} \\ \\ \)Anche rs può assumere valori compresi tra –1.00 e +1.00, con gli stessi significati visti per r.
Il coefficiente rs ha un grave difetto: può dare una stima per eccesso della correlazione tra X e Y se, per almeno una delle due variabili, si riscontrano molti ranghi uguali. Per questo motivo, per misurare la correlazione tra due variabili di tipo ordinale, si ricorre spesso a un’altra statistica: il coefficiente tau di Kendall.
Per fissare il meccanismo, un esercizio con dati finti ma realistici. Dalla Search Console abbiamo estratto dieci keyword con la loro posizione media e il CTR (in percentuale):
posizione,ctr 1.2,28.4 2.5,19.7 3.1,15.2 4.8,9.8 5.5,8.1 6.9,5.9 8.2,4.2 9.0,3.6 10.5,2.8 12.3,1.9
lm(ctr ~ posizione).residuals(): che disegno fanno?Per controllare i risultati: la pendenza vale circa −2.15 (ogni posizione persa costa due punti di CTR), l’R2 è 0.82 e la previsione in posizione 7 è un CTR dell’8.7%. Ma il punto più istruttivo è l’ultimo: i residui sono positivi agli estremi e negativi al centro. È il disegno tipico di una relazione non lineare: il CTR non cala in linea retta, precipita nelle prime posizioni e si appiattisce dopo. La retta è un’approssimazione onesta ma grossolana — e sono proprio i residui, come abbiamo visto, a denunciarlo.
Una sola variabile, del resto, racconta raramente tutta la storia: le conversioni dipendono dalla spesa, ma anche dalla stagionalità, dal dispositivo, dalla forza del brand. Quando i predittori diventano più di uno, entriamo nel territorio della regressione multipla — il passo successivo del percorso.
Per approfondire la regressione con il rigore che merita — stima, inferenza, diagnostica — Introduzione all’econometria di Stock e Watson è il manuale di riferimento, con un’attenzione costante all’interpretazione dei risultati.
Nell'aeronautica militare israeliana, racconta Daniel Kahneman, gli istruttori erano convinti di una cosa: lodare un…
Chi guarda i dati di un sito lo fa di continuo, spesso senza nemmeno accorgersene,…
Abbiamo chiuso l'articolo sul calcolatore di significatività con una promessa. Dicevamo che il p-value risponde…
Il nostro A/B test è arrivato alla fine: la variante B mostra un tasso di…
C'è una domanda che torna, puntuale, ogni volta che pubblico un articolo di questo percorso:…
È l'ultimo giorno del mese. Stiamo preparando il report SEO per il cliente principale. Apriamo…