Pandas & NumPy Academy · Lezione

Analisi bivariata e della correlazione

Esplori le relazioni tra coppie di colonne usando grafici a dispersione, box plot e una heatmap della correlazione.

Lezione 3 di 413 passaggi

Analisi bivariata e della correlazione è una lezione Pandas & NumPy Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Pandas & NumPy Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Pandas & NumPy Academy include 4 lezioni in totale.

Da una variabile a due

L'analisi bivariata esamina la relazione tra esattamente due colonne alla volta. Dopo aver profilato ogni colonna singolarmente (analisi univariata), si pone la domanda: come sono correlate queste due variabili? Il metodo di analisi dipende dalla combinazione dei tipi di variabile: numerica vs. numerica (grafico a dispersione + correlazione), categorica vs. numerica (box plot/violin plot) oppure categorica vs. categorica (tabella di contingenza + test del chi-quadrato). Ogni combinazione richiede una tecnica diversa.

import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')

# Relationship types present in the dataset
print('Numeric columns:', df.select_dtypes('number').columns.tolist())
print('Categorical columns:', df.select_dtypes('object').columns.tolist())
print('Boolean columns:', df.select_dtypes('bool').columns.tolist())

Numerica vs. numerica: grafico a dispersione

Per due variabili numeriche, il grafico a dispersione è lo strumento bivariato principale. Mostra ogni osservazione come un punto alle coordinate (x, y), rivelando direzione, intensità e forma della relazione. Osservi sempre il grafico prima di calcolare un coefficiente di correlazione: una correlazione pari a 0 può comunque mostrare una forte relazione non lineare (curva) che il coefficiente non rileva.

import seaborn as sns
import matplotlib.pyplot as plt

df = sns.load_dataset('titanic')

sns.scatterplot(data=df, x='age', y='fare', alpha=0.4)
plt.title('Age vs. Fare — Is There a Linear Relationship?')
plt.xlabel('Age')
plt.ylabel('Fare ($)')
plt.show()

Coefficiente di correlazione di Pearson

Il coefficiente r di Pearson quantifica l'intensità e la direzione della relazione lineare tra due variabili numeriche. Lo calcoli con df[['col1', 'col2']].corr() oppure con scipy.stats.pearsonr(x, y), che restituisce anche un p-value per il test di significatività. Abbini sempre r a un grafico a dispersione: un valore elevato di r può dipendere da pochi outlier e lo stesso valore di r può descrivere forme di dispersione molto diverse (il quartetto di Anscombe lo illustra chiaramente).

import pandas as pd
import seaborn as sns
from scipy import stats

df = sns.load_dataset('titanic').dropna(subset=['age', 'fare'])

# Pearson correlation
r, p = stats.pearsonr(df['age'], df['fare'])
print(f'Pearson r = {r:.3f}, p-value = {p:.4f}')

# Spearman for robustness check
rho, p_sp = stats.spearmanr(df['age'], df['fare'])
print(f'Spearman rho = {rho:.3f}, p-value = {p_sp:.4f}')

Categorica vs. numerica: box plot e violin plot

Quando una variabile è categorica e l'altra è numerica, la domanda è: la distribuzione numerica varia tra le categorie? Usi un box plot o un violin plot per effettuare il confronto. Ad esempio, lo stato di sopravvivenza influisce sulla tariffa pagata? La classe del passeggero influisce sull'età? Questi grafici mostrano immediatamente se l'appartenenza a una categoria è associata a valori più alti o più bassi della variabile numerica.

import seaborn as sns
import matplotlib.pyplot as plt

df = sns.load_dataset('titanic')

fig, axes = plt.subplots(1, 2, figsize=(12, 5))

sns.boxplot(data=df, x='class', y='fare',
            order=['First', 'Second', 'Third'], ax=axes[0])
axes[0].set_title('Fare by Passenger Class')

sns.violinplot(data=df, x='survived', y='age',
               inner='quartile', ax=axes[1])
axes[1].set_title('Age Distribution by Survival')

plt.tight_layout()
plt.show()

Statistiche GroupBy per variabili categoriche e numeriche

Completi il confronto visivo con statistiche numeriche raggruppate usando groupby. Calcoli media, mediana e conteggio per ogni categoria, così da quantificare le differenze osservate nei grafici. Cerchi le categorie in cui media e mediana divergono (a indicare la presenza di outlier all'interno del gruppo) e controlli che le dimensioni dei gruppi siano equilibrate: gruppi molto piccoli (<5 osservazioni) rendono i confronti poco affidabili.

import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')

stats = df.groupby('class')['fare'].agg(['mean', 'median', 'std', 'count'])
stats.columns = ['Mean Fare', 'Median Fare', 'Std Fare', 'Count']
print(stats.round(2))

print('\nSurvival rate by class:')
print(df.groupby('class')['survived'].mean().round(3))

Categorica vs. categorica: tabelle di contingenza

Per due variabili categoriche, usi pd.crosstab(df['var1'], df['var2']) per creare una tabella delle frequenze che mostri quante osservazioni rientrano in ogni combinazione di categorie. Normalizzi per riga o per colonna con normalize='index' o normalize='columns' per ottenere proporzioni anziché conteggi. Questo è il punto di partenza per studiare se due variabili categoriche sono indipendenti o associate.

import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')

# Frequency table
counts = pd.crosstab(df['class'], df['survived'])
counts.columns = ['Died', 'Survived']
print('Counts:')
print(counts)

# Row-normalised proportions (survival rate per class)
props = pd.crosstab(df['class'], df['survived'], normalize='index')
props.columns = ['Died', 'Survived']
print('\nSurvival Rate per Class:')
print(props.round(3))

Visualizzare le tabelle di contingenza come heatmap

Trasformi una tabella di contingenza in una heatmap per confrontare visivamente e immediatamente le frequenze delle celle. È più facile da consultare rispetto a una tabella stampata quando sono presenti molte combinazioni di categorie. Annoti ogni cella con il relativo valore usando annot=True e scelga una mappa di colori sequenziale (come 'YlOrRd'), poiché tutti i valori sono non negativi. Le heatmap delle proporzioni normalizzate per riga mostrano efficacemente la distribuzione condizionata di una categoria data l'altra.

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

df = sns.load_dataset('titanic')
props = pd.crosstab(df['class'], df['sex'], normalize='index')

sns.heatmap(props, annot=True, fmt='.2f', cmap='YlOrRd')
plt.title('Gender Mix by Passenger Class (Row %)')
plt.xlabel('Sex')
plt.ylabel('Class')
plt.show()

Test del chi-quadrato per l'indipendenza

Il test del chi-quadrato per l'indipendenza verifica se due variabili categoriche sono statisticamente indipendenti. scipy.stats.chi2_contingency(crosstab) restituisce la statistica chi-quadrato, il p-value, i gradi di libertà e le frequenze attese. Un p-value basso (in genere < 0.05) indica un'associazione statisticamente significativa tra le due variabili: la distribuzione di una varia sistematicamente in funzione dell'altra.

import pandas as pd
import seaborn as sns
from scipy.stats import chi2_contingency

df = sns.load_dataset('titanic')

# Test if passenger class and survival are independent
crosstab = pd.crosstab(df['class'], df['survived'])
chi2, p, dof, expected = chi2_contingency(crosstab)

print(f'Chi-squared: {chi2:.2f}')
print(f'P-value: {p:.6f}')
print(f'Degrees of freedom: {dof}')
print(f'\nConclusion: {"Significant association" if p < 0.05 else "No significant association"}')

Matrice di correlazione completa per le colonne numeriche

Anziché esaminare le coppie una alla volta, calcoli la matrice di correlazione completa per tutte le colonne numeriche e la visualizzi come heatmap. In questo modo può individuare a colpo d'occhio le coppie di variabili fortemente correlate. Correlazioni elevate tra feature indipendenti (multicollinearità) possono causare problemi nei modelli di regressione: conoscerle tempestivamente permette di rimuovere o combinare le feature ridondanti prima della modellazione.

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

df = sns.load_dataset('titanic')
corr = df.select_dtypes('number').corr()
mask = np.triu(np.ones_like(corr, dtype=bool))

sns.heatmap(corr, mask=mask, annot=True, fmt='.2f',
            cmap='coolwarm', vmin=-1, vmax=1,
            linewidths=0.5, square=True)
plt.title('Correlation Matrix — Titanic Numeric Columns')
plt.tight_layout()
plt.show()

Interazioni tra sottogruppi

A volte la relazione tra due variabili differisce notevolmente tra i sottogruppi: un fenomeno noto come paradosso di Simpson. Ad esempio, la correlazione tra età e tariffa potrebbe essere positiva per i passeggeri di prima classe, ma negativa per quelli di terza classe. Segmenti sempre l'analisi bivariata in base alle principali variabili categoriche (usando hue in Seaborn o aggregazioni groupby separate) per verificare se la relazione è coerente o si inverte tra i sottogruppi.

import seaborn as sns
import matplotlib.pyplot as plt

df = sns.load_dataset('titanic')

# Scatter coloured by passenger class
sns.scatterplot(
    data=df.dropna(subset=['age', 'fare']),
    x='age',
    y='fare',
    hue='class',
    alpha=0.5,
    palette='deep'
)
plt.title('Age vs Fare — Does Class Change the Relationship?')
plt.legend(title='Class')
plt.yscale('log')  # log scale due to fare skewness
plt.show()

Documentare i risultati dell'analisi bivariata

Dopo aver completato l'analisi bivariata, documenti i risultati principali: quali coppie di caratteristiche sono correlate (e con quale intensità), se le variabili categoriche mostrano differenze significative tra i gruppi negli esiti numerici e quali interazioni o paradossi tra sottogruppi sono stati individuati. Queste informazioni dovrebbero guidare le decisioni sulla selezione delle caratteristiche: potrebbe essere necessario eliminare una delle caratteristiche fortemente correlate e i predittori categorici con una forte capacità predittiva rispetto alla variabile target dovrebbero essere segnalati come input prioritari per la modellazione.

Verifica rapida

Verifichi la Sua comprensione dell'analisi bivariata e dell'analisi della correlazione trattate in questa lezione.

Riepilogo della lezione

In questa lezione ha imparato che: i grafici a dispersione e il coefficiente r di Pearson analizzano le relazioni tra variabili numeriche, i box plot, i violin plot e groupby consentono di confrontare variabili numeriche tra categorie e le tabelle di contingenza con i test del chi quadrato misurano l'associazione tra variabili categoriche. Nella prossima lezione vedremo come raccogliere i risultati dell'EDA in un report riepilogativo strutturato.

Gratis per iniziare

Impara Python con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
30
Lezioni
120

Domande Frequenti

La lezione «Analisi bivariata e della correlazione» è gratuita?

Sì — il testo completo di «Analisi bivariata e della correlazione» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Pandas & NumPy Academy, passa a CoddyKit PRO. Il corso Pandas & NumPy Academy include 4 lezioni in totale.

Cosa imparerò in «Analisi bivariata e della correlazione»?

Esplori le relazioni tra coppie di colonne usando grafici a dispersione, box plot e una heatmap della correlazione. Eserciti Pandas & NumPy Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Pandas & NumPy Academy?

Non è richiesta alcuna esperienza precedente. Pandas & NumPy Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Analisi bivariata e della correlazione»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Pandas & NumPy Academy?

Sì. Ogni lezione Pandas & NumPy Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Checklist per il profiling di un dataset
  2. Analisi univariata
  3. Analisi bivariata e della correlazione
  4. Riassumere i risultati in un report
← Torna a Pandas & NumPy Academy