- Seleziona Pearson, Spearman o Kendall in base a forma del legame, normalità e dimensione campionaria.
- Per variabili categoriali usa chi-quadro/Fisher e misura l’associazione con V di Cramér o φ.
- Valuta confondenti con correlazione parziale e supporta l’analisi con grafici e diagnostiche.
- L’algebra delle relazioni (insiemi, funzioni, composizione) struttura il pensiero e le applicazioni nei database.
Capire che tipo di legame c’è tra due variabili è una delle domande più frequenti in statistica applicata, scienza dei dati e ricerca sperimentale e ricerca quantitativa. A volte la relazione è lineare e semplice da cogliere, altre volte è monotona ma non lineare, oppure coinvolge categorie e non numeri, o ancora dipende da una terza variabile che confonde le acque: insomma, non è una passeggiata.
In questa guida pratica e teorica in italiano, rivediamo in modo organico i principali tipi di relazioni matematiche tra due variabili, come diagnosticarle visivamente e con test formali, quali coefficienti usare (Pearson, Spearman, Kendall), come muoversi con variabili categoriali (chi-quadro di indipendenza, test esatto di Fisher, V di Cramér, coefficiente di contingenza, phi), come misurare l’accordo tra valutatori con il Kappa, e come gestire le variabili di confondimento tramite la correlazione parziale. Inoltre, apriamo una finestra sull’algebra delle relazioni (in senso insiemistico e computazionale), essenziale per formalizzare concetti come dominio, composizione, inversa e funzioni.
Che cosa intendiamo per “relazione” tra due variabili
Nel linguaggio matematico, una relazione R tra insiemi A e B è un sottoinsieme del prodotto cartesiano A×B: ogni coppia ordinata (a, b) appartenente a R indica che l’elemento a di A è “in relazione” con l’elemento b di B. In termini applicati, una relazione può essere deterministica (funzione) oppure probabilistica (associazione stocastica): nel primo caso ad ogni a corrisponde esattamente un b, nel secondo osserviamo una tendenza (più o meno forte) e non un legame uno-a-uno.
All’interno dell’algebra delle relazioni (in senso insiemistico) ci interessano proprietà come riflessività (ogni a è in relazione con se stesso), simmetria ((a, b) implica (b, a)), antisimmetria (se (a, b) e (b, a) allora a = b) e transitività (da (a, b) e (b, c) segue (a, c)). Queste proprietà sono cruciali: se una relazione è riflessiva, simmetrica e transitiva diventa una relazione di equivalenza che “partiziona” A in classi di elementi equivalenti. Se invece è riflessiva, antisimmetrica e transitiva, abbiamo una relazione d’ordine.
Nel lavoro di analisi dati, traduciamo queste idee in pratica: valutiamo il tipo di variabili (quantitative continue, ordinali, nominali/dicotomiche) e la classificazione nelle statistiche e scegliamo strumenti adeguati per misurare la relazione, sapendo che “relazione” non sempre significa “causa-effetto”.
Ispezione visiva: come riconoscere pattern e direzione
Prima di buttarsi nei numeri, un grafico a dispersione è spesso la mossa più intelligente. Una nuvola allineata lungo una retta suggerisce una relazione lineare (positiva o negativa); strutture a curva indicano relazioni non lineari (ma magari monotone). Se non si intravede un pattern, la relazione lineare potrebbe essere debole o assente.
Con più variabili, i pannelli di scatter plot (ad esempio in R con pairs(dati)) e linee di tendenza smussate (geom_smooth in ggplot2) aiutano a notare associazioni, cluster e outlier. Attenzione: gli outlier possono influenzare moltissimo i coefficienti, specie Pearson.
Per esempio in R si può iniziare così: pairs(dati)
# Matrice di grafici a dispersione
pairs(dati)
# Correlazioni grezze (matrice)
cor(dati, use = "pairwise.complete.obs")
Un primo screening visivo, corredato da numeri, aiuta a scegliere il test giusto in base a forma, monotonia e linearità apparenti.
Verifica della normalità: quando serve davvero
Molti test parametrici (ad esempio il test di Pearson) assumono, in varia misura, normalità o almeno una struttura simmetrica senza code pesanti. Per controllare l’ipotesi, si parte spesso da strumenti grafici come istogrammi con densità e QQ-plot.
In R, una batteria minima potrebbe includere:
# Istogrammi con densità e curva normale sovrapposta
par(mfrow = c(2, 2))
plot_hist <- function(x) {
hist(x, prob = TRUE)
lines(density(x), col = "red")
curve(dnorm(x, mean(x), sd(x)), add = TRUE, col = "blue")
}
plot_hist(dati$GASTEDU)
plot_hist(dati$GASAUDE)
plot_hist(dati$GASLAZER)
plot_hist(dati$IDADE)
Per confrontare i quantili osservati con quelli di una normale standard, il QQ-plot è insostituibile:
par(mfrow = c(2, 2))
qqfun <- function(x) {
qqnorm(x, main = "", xlab = "Quantili teorici N(0,1)", pch = 20)
qqline(x, col = "red", lty = 1)
}
qqfun(dati$IDADE)
qqfun(dati$GASAUDE)
qqfun(dati$GASLAZER)
qqfun(dati$GASTEDU)
Oltre alla vista, si possono usare test formali di normalità per accumulare evidenze: Kolmogorov–Smirnov con parametri stimati, Lilliefors, Cramér–von Mises, Shapiro–Wilk, Shapiro–Francia, Anderson–Darling e il test di Pearson (chi-quadro) di normalità.
normalita <- function(x) {
t1 <- ks.test(x, "pnorm", mean(x), sd(x)) # Kolmogorov–Smirnov
t2 <- nortest::lillie.test(x) # Lilliefors
t3 <- nortest::cvm.test(x) # Cramér–von Mises
t4 <- shapiro.test(x) # Shapiro–Wilk
t5 <- nortest::sf.test(x) # Shapiro–Francia
t6 <- nortest::ad.test(x) # Anderson–Darling
t7 <- PearsonDS::pearson.test(x) # Pearson chi-quadro di normalità
pv <- c(t1$p.value, t2$p.value, t3$p.value, t4$p.value, t5$p.value, t6$p.value, t7$p.value)
data.frame(p_value = pv, row.names = c(t1$method, t2$method, t3$method, t4$method, t5$method, t6$method, t7$method))
}
normalita(dati$GASAUDE)
Se i dati sono circa normali e la relazione è lineare, il coefficiente di Pearson è una buona prima scelta; in caso contrario è prudente preferire misure basate sui ranghi come Spearman o Kendall.
Relazioni tra variabili quantitative: covarianza e correlazione
La covarianza fra X e Y è la media del prodotto degli scarti dalle rispettive medie: se i punti stanno soprattutto nel I e III quadrante, tende a essere positiva, mentre nel II e IV è negativa. Il problema è che la covarianza dipende dall’unità di misura, quindi è poco comparabile.
La correlazione lineare di Pearson risolve il problema standardizzando per le deviazioni standard: il coefficiente r varia tra -1 e 1, dove valori vicini a ±1 indicano forte relazione lineare (positiva o negativa) e 0 suggerisce assenza di linearità. Attenzione: r = 0 non esclude relazioni non lineari.
Calcoli per correlazioni in R:
# Coefficiente di Pearson e test di significatività
cor(dati$GASTEDU, dati$GASAUDE, method = "pearson")
cor.test(dati$GASTEDU, dati$GASAUDE, method = "pearson")
Quando la relazione è monotona ma non lineare o quando i dati non sono normali (o contengono outlier), ha senso usare Spearman (ranghi; robusto e adatto a campioni medio-grandi) o Kendall τ (basato su concordanze/discordanze; preferibile su campioni piccoli o con molti pareggi):
# Correlazioni non parametriche
cor.test(dati$GASTEDU, dati$GASAUDE, method = "spearman")
# Su un sottoinsieme più piccolo, meglio Kendall
dati2 <- head(dati, 20)
cor.test(dati2$IDADE, dati2$GASAUDE, method = "kendall")
Un’idea utile: il coefficiente di determinazione R² di un modello lineare semplice restituisce la quota di variabilità di Y spiegata linearmente da X. In R:
summary(lm(GASAUDE ~ ESTCIVIL, data = dati))$r.squared
Per variabili dicotomiche vs quantitative, il coefficiente point-biserial coincide con il Pearson calcolato su una variabile codificata 0/1; in pratica, cor(dicotomica, quantitativa) con method = “pearson”.
Variabili categoriali: indipendenza, forza dell’associazione e piccoli campioni
Quando entrambe le variabili sono nominali od ordinali, la relazione si studia con tabelle di contingenza (frequenze con doppia classificazione). L’ipotesi tipica è: H0 = indipendenza (nessuna associazione), contro H1 = dipendenza.
Il test di riferimento è il chi-quadro di indipendenza. Se ci sono frequenze attese troppo basse (tipicamente < 5), si usa la correzione di Yates per 2×2 o si passa al test esatto di Fisher, particolarmente indicato con campioni piccoli.
# Tabella incrociata e chi-quadro
xtabs(~ PROFI + ESTCIVIL, data = dati) -> tab1
chisq.test(dati$PROFI, dati$ESTCIVIL) # p-value non significativo => indipendenza plausibile
# Campioni piccoli: test di Fisher
chisq.test(dati$PROFI, dati$RENDA)
fisher.test(dati2$PROFI, dati2$RENDA)
Per quantificare l’intensità dell’associazione in tabelle I×J si usano: V di Cramér (0–1), coefficiente di contingenza (0–1, limitato), e in 2×2 il phi (φ), che è formalmente un Pearson r applicato alla tabella binaria.
# Misure di associazione per tabelle
library(vcd)
xtabs(~ PROFI + RENDA, data = dati) -> tab2
assocstats(tab2) # riporta V di Cramér, coeff. di contingenza e test
# Attenzione: cor() su codifiche numeriche di categorie non è equivalente a φ in generale
Se l’interesse è confrontare gruppi su variabili quantitative (es. reddito per professione), si valutano test t, ANOVA e le rispettive alternative non parametriche, nonché intervalli di confidenza. In tutti i casi, coerenza fra tipo di variabili e metodo è fondamentale.
Accordo tra valutatori: Kappa di Cohen
Quando due (o più) giudici classificano gli stessi oggetti in categorie, non basta misurare la percentuale di accordo, perché una quota può essere dovuta al caso. Il Kappa di Cohen quantifica l’accordo corretto per l’accordo casuale: valori prossimi a 0 indicano accordo pari al caso, valori maggiori suggeriscono accordo crescente (interpretazioni comuni: scarso, discreto, moderato, buono, molto buono).
In R è possibile stimare Kappa anche in versione ponderata (per categorie ordinali):
set.seed(1)
val1 <- sample(0:1, 10, replace = TRUE)
val2 <- sample(0:1, 10, replace = TRUE)
# Kappa non ponderato
fmsb::Kappa.test(val1, val2)
Se le categorie hanno un ordine naturale (ad esempio, lieve/moderata/severa), Kappa ponderato penalizza meno i disaccordi “vicini” e più quelli “lontani”, risultando spesso più informativo.
Relazioni e variabili di confusione: la correlazione parziale
Può capitare che due variabili X e Y sembrino molto correlate, ma in realtà la forza dell’associazione sia dovuta a una variabile di confondimento Z correlata con entrambe. In questi casi si calcola la correlazione parziale tra X e Y controllando per Z.
In R, con ggm::pcor si ottiene la correlazione parziale di primo ordine e si può testarne la significatività. È utile confrontare r classico e r parziale per capire quanto Z “spiega” del legame grezzo.
library(ggm)
# Correlazione parziale tra GASLAZER e GASAUDE controllando GASTEDU
rp <- pcor(c("GASLAZER", "GASAUDE", "GASTEDU"), var(dati))
# Correlazione grezza
r <- cor(dati$GASLAZER, dati$GASAUDE)
# Test della correlazione parziale (1 variabile di controllo)
pcor.test(rp, 1, length(dati$GASAUDE))
# Confronto R^2 grezzo vs parziale
data.frame("Senza_controllo" = r^2, "Con_controllo" = rp^2)
Se la quota spiegata “crolla” dopo il controllo, allora Z era un confondente importante. Quando la variabile di controllo è categoriale (es. professione), si possono usare approcci analoghi o modelli che includono la categoria come fattore.
Limiti e buone pratiche nell’uso della correlazione
Il coefficiente di Pearson misura solo la linearità. Se la relazione è non lineare (quadratica, esponenziale, logaritmica), r può risultare vicino a 0 pur in presenza di una forte dipendenza. In questi casi, valutare Spearman, trasformazioni adeguate o modelli non lineari.
Gli outlier possono distorcere parecchio il risultato. Per questo, prima del calcolo, conviene ispezionare i dati, fare grafici e, se necessario, effettuare analisi robuste o verificare la sensibilità del risultato all’eliminazione di punti estremi.
Un altro classico: correlazione ≠ causalità. Due variabili possono correlare perché sono influenzate da un terzo fattore, per mera coincidenza o per effetto di un meccanismo inverso. Servono disegni sperimentali, strumenti causali o modelli appropriati per parlare di causa-effetto.
Tipi di relazione: lineare, monotona, nulla, categoriale
Nei casi misti (quantitativa vs dicotomica/nominale/ordinata) si passa a test di confronto tra gruppi, correlazioni biseriali/point-biserial o a modelli (ad esempio regressioni con predittori fattoriali). Con variabili entrambe categoriali, ci si affida a chi-quadro/Fisher e alle misure di forza dell’associazione già viste.
Funzioni come relazioni speciali
Una funzione è una relazione che, per ogni elemento del dominio, associa esattamente un elemento del codominio. In termini di insiemi, è un sottoinsieme di A×B tale che ogni a in A compare una sola volta come primo componente. Altre operazioni importanti in algebra delle relazioni sono: unione (R1 ∪ R2), intersezione (R1 ∩ R2), composizione (R2 ∘ R1) e inversa (R^{-1}, che scambia ciascuna coppia (a, b) in (b, a)).
Questi mattoni concettuali tornano utili sia nella matematica pura (equivalenze, ordini, classi di equivalenza) sia in applicazioni concrete dove serve formalizzare relazioni fra entità.
Algebra delle relazioni e scienza dei dati
Nel mondo dei database, l’algebra relazionale è l’ossatura teorica di SQL: operazioni come selezione, proiezione, join, unione e intersezione sono versioni pratiche di operazioni su relazioni-insiemi. Questa formalizzazione è un’arma potente per descrivere, ottimizzare e manipolare dati complessi.
In ambito intelligenza artificiale e machine learning, la capacità di modellare relazioni tra entità permette di costruire grafi di conoscenza, sistemi di raccomandazione e pipeline di integrazione dati; lo stesso vale in economia, biostatistica e scienze sociali, dove il nocciolo è quasi sempre “chi è legato a chi, e in che modo”.
Esempi classici di relazioni in teoria degli insiemi
Relazioni di equivalenza: sono riflessive, simmetriche e transitive. Esempi tipici includono “avere lo stesso valore assoluto” sui reali o la congruenza modulo n sugli interi. Ogni relazione di equivalenza induce classi di equivalenza che ripartiscono l’insieme in blocchi disgiunti.
Relazioni d’ordine: riflessive, antisimmetriche e transitive. Esempi: ≤ sui numeri naturali, l’inclusione ⊆ sull’insieme delle parti P(X), o “divide” (|) sui naturali. Sono fondamentali per definire ordinamenti totali o parziali e per ragionare su massimi, minimi, catene e antichains.
Ordine lessicografico: quello dei dizionari. È un ordine su sequenze (stringhe, numeri scritti in sequenza) che confronta elemento per elemento; ha un ruolo importante nelle strutture dati e negli algoritmi.
Questa sezione è utile perché ci ricorda che “relazione” in matematica è un concetto più ampio della sola correlazione: include uguaglianze, ordini, composizioni e tanto altro, tutti indispensabili per modellare sistemi complessi.
Workflow pratico: dalla domanda ai risultati
Un possibile flusso di lavoro per non perdersi tra strumenti e casi:
- Ispezione grafica: scatter plot, smoothing, istogrammi, QQ-plot. Occhio a outlier e forme non lineari.
- Verifiche: se serve, test di normalità; controlli di omoscedasticità se si prevede un modello lineare.
- Scelta del coefficiente: Pearson (lineare, dati circa normali), Spearman/Kendall (monotona/non normale/piccoli campioni).
- Categoriali: chi-quadro/Fisher + misure d’associazione (V di Cramér, coeff. di contingenza, φ). Per confronto di gruppi, test t/ANOVA o alternative.
- Confondenti: correlazione parziale o modelli multivariati (inclusi fattori categoriali).
Qualunque sia la scelta, interpretare nel contesto è la chiave: grandezza dell’effetto, significatività statistica, ampiezza del campione e qualità dei dati contano quanto (se non più) del numero finale.
Esempi di codice R ricorrenti
Riassumendo alcune chiamate utili che tornano spesso nelle analisi di relazione tra due variabili, e che puoi adattare al tuo dataset:
# 1) Correlazioni
cor(x, y, method = "pearson")
cor.test(x, y, method = "spearman")
cor.test(x_small, y_small, method = "kendall")
# 2) Grafici (base e ggplot2)
plot(x, y)
# ggplot2: geom_point() + geom_smooth(method = "lm" o se = FALSE)
# 3) Normalità
shapiro.test(x)
nortest::ad.test(x)
# 4) Tabelle e test
xtabs(~ a + b, data = dati) -> tab
chisq.test(tab)
fisher.test(tab) # campioni piccoli o celle con attesi < 5
vcd::assocstats(tab) # V di Cramér e coeff. di contingenza
# 5) Kappa
afmsb::Kappa.test(giudice1, giudice2)
# 6) Correlazione parziale
ggm::pcor(c("x", "y", "z"), var(dati))
Nota pratica: le scelte “giuste” dipendono dai dati. Vale la pena validare le ipotesi, confrontare metodi e, quando serve, costruire un piccolo script di diagnostica che ripeti questi passi in modo riproducibile.
Abbiamo visto che “relazione” può significare molte cose: dalla forma lineare con Pearson, alla monotonia con Spearman/Kendall, fino all’associazione fra categorie con chi-quadro/Fisher e misure come V di Cramér e φ; senza dimenticare l’accordo tra giudici (Kappa) e la gestione dei confondenti con la correlazione parziale. Sullo sfondo, l’algebra delle relazioni fornisce i mattoni concettuali per definire dominio, inversa e composizione, mentre l’algebra relazionale guida il modo in cui archiviamo e interroghiamo i dati nei database. L’idea chiave è scegliere lo strumento in base al tipo di variabili, alla forma del legame e agli obiettivi dell’analisi, ricordandoci che nessun coefficiente, da solo, può raccontare tutta la storia.