Analisi univariata
Analizzi ogni colonna indipendentemente: rappresenti le distribuzioni delle variabili numeriche e i conteggi dei valori di quelle categoriche, annotando outlier e asimmetria.
Analisi univariata è una lezione Pandas & NumPy Academy gratuita su CoddyKit. Questa è la lezione 2 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.
Che cos'è l'analisi univariata?
L'analisi univariata esamina una colonna alla volta, in modo isolato, ignorando le relazioni tra le colonne. L'obiettivo è comprendere la distribuzione di ogni variabile, rilevare gli outlier, identificare l'asimmetria e individuare problemi di qualità dei dati prima di iniziare qualsiasi attività di modellazione. L'analisi univariata varia a seconda che le colonne siano numeriche o categoriche: per le colonne numeriche servono grafici della distribuzione e statistiche riassuntive, mentre per quelle categoriche servono conteggi delle frequenze e proporzioni.
import pandas as pd
import seaborn as sns
df = sns.load_dataset('titanic')
numeric_cols = df.select_dtypes('number').columns.tolist()
categoric_cols = df.select_dtypes('object').columns.tolist()
print('Numeric columns:', numeric_cols)
print('Categorical columns:', categoric_cols)Istogrammi per le colonne numeriche
Tracci un istogramma per ogni colonna numerica per osservare la forma della relativa distribuzione. Cerchi simmetria e asimmetria (una coda su un lato), la modalità (un picco o più picchi) e le anomalie evidenti (valori agli estremi che sembrano implausibili). In Pandas, df.hist() crea rapidamente una griglia di istogrammi per più colonne senza dover scrivere un ciclo, mentre histplot di Seaborn offre un controllo più preciso per le singole colonne.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = sns.load_dataset('titanic')
# Quick multi-column histogram grid
numeric = df.select_dtypes('number')
numeric.hist(bins=20, figsize=(12, 8), layout=(2, 3), color='steelblue', edgecolor='white')
plt.suptitle('Univariate Distributions (Numeric Columns)', y=1.02)
plt.tight_layout()
plt.show()Statistiche riassuntive per le colonne numeriche
Per ogni colonna numerica, calcoli e confronti media e mediana. Quando la media è significativamente maggiore della mediana, la distribuzione è asimmetrica a destra (con una lunga coda destra, situazione comune nei dati relativi a redditi e prezzi). Quando la media è minore della mediana, è asimmetrica a sinistra. Controlli anche la deviazione standard rispetto alla media: per una variabile non negativa, una deviazione standard maggiore della media indica un'elevata variabilità o la presenza di outlier. Calcoli direttamente l'asimmetria con df.skew().
import pandas as pd
import seaborn as sns
df = sns.load_dataset('titanic')
numeric = df.select_dtypes('number')
summary = pd.DataFrame({
'mean': numeric.mean(),
'median': numeric.median(),
'std': numeric.std(),
'skewness': numeric.skew(),
'missing_pct': (numeric.isna().sum() / len(df) * 100).round(1)
}).round(2)
print(summary)Box plot per il rilevamento degli outlier
I box plot sono lo strumento visivo più rapido per individuare gli outlier nelle colonne numeriche. Qualsiasi punto oltre i baffi (1.5×IQR da Q1 o Q3) viene tracciato singolarmente e segnalato come potenziale outlier. Una colonna con molti punti anomali richiede un'analisi: si tratta di errori di inserimento, di valori estremi legittimi o di un'indicazione di una distribuzione non normale? I box plot mostrano anche un'asimmetria a destra o a sinistra, visibile dalla posizione non simmetrica della mediana all'interno del box.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = sns.load_dataset('titanic')
fig, axes = plt.subplots(1, 3, figsize=(14, 5))
for ax, col in zip(axes, ['age', 'fare', 'sibsp']):
df[[col]].boxplot(ax=ax)
ax.set_title(f'Box Plot: {col}')
plt.tight_layout()
plt.show()Conteggio degli outlier basato sull'IQR
Il metodo IQR (Interquartile Range) definisce gli outlier come valori inferiori a Q1 - 1.5×IQR o superiori a Q3 + 1.5×IQR. Può calcolarlo programmaticamente per contare e ispezionare gli outlier in ogni colonna numerica senza creare grafici. È utile nelle pipeline automatizzate in cui occorre registrare il conteggio delle anomalie invece di generare grafici. La decisione su come gestire gli outlier — rimuoverli, limitarli o segnalarli — deve essere ponderata e basata sulla conoscenza del dominio.
import pandas as pd
import seaborn as sns
df = sns.load_dataset('titanic')
numeric = df.select_dtypes('number')
Q1 = numeric.quantile(0.25)
Q3 = numeric.quantile(0.75)
IQR = Q3 - Q1
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR
outlier_counts = ((numeric < lower) | (numeric > upper)).sum()
print('Outlier counts per column:')
print(outlier_counts[outlier_counts > 0])Conteggi dei valori per le colonne categoriche
Per ogni colonna categorica, chiami value_counts() per vedere come le osservazioni sono distribuite tra le categorie. Verifichi sempre: una singola categoria è dominante (>80%)? Questo causa uno squilibrio tra le classi nelle attività di classificazione. Sono presenti categorie rare con una o due sole osservazioni (refusi o errori di inserimento)? La distribuzione corrisponde alle aspettative aziendali (ad esempio, una colonna 'country' in cui la maggior parte degli ordini proviene da un Paese inatteso)?
import pandas as pd
import seaborn as sns
df = sns.load_dataset('titanic')
for col in ['sex', 'embarked', 'class', 'who']:
counts = df[col].value_counts(dropna=False)
pct = (counts / len(df) * 100).round(1)
result = pd.DataFrame({'count': counts, 'pct%': pct})
print(f'\n--- {col} ---')
print(result)Grafici a barre per le variabili categoriche
Visualizzi i conteggi dei valori categorici con grafici a barre usando sns.countplot oppure chiamando value_counts().plot(kind='bar'). Ordini le barre dalla categoria più frequente a quella meno frequente, così chi osserva il grafico può individuare subito le categorie dominanti. Per le variabili binarie (sì/no, uomo/donna) è accettabile un grafico a torta, ma per più di 3 categorie i grafici a barre sono sempre più chiari. Ruoti di 45 gradi le etichette dei tick quando i nomi delle categorie sono lunghi.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = sns.load_dataset('titanic')
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
sns.countplot(data=df, x='embarked', order=df['embarked'].value_counts().index, ax=axes[0])
axes[0].set_title('Embarkation Port Counts')
sns.countplot(data=df, x='class', order=['First', 'Second', 'Third'], ax=axes[1])
axes[1].set_title('Passenger Class Counts')
plt.tight_layout()
plt.show()Rilevare l'asimmetria e applicare trasformazioni
Le colonne numeriche fortemente asimmetriche a destra (asimmetria > 1.5) spesso traggono beneficio da una trasformazione logaritmica per diventare più simmetriche. Questo è importante per molti test statistici e per alcuni algoritmi di ML che presuppongono la normalità. Applichi np.log1p() (log(x+1), sicuro per i valori prossimi a zero) e controlli nuovamente l'asimmetria. Confronti gli istogrammi prima e dopo la trasformazione per verificare che la distribuzione sia diventata più simile a una campana.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
df = sns.load_dataset('titanic')
fig, axes = plt.subplots(1, 2, figsize=(10, 4))
sns.histplot(df['fare'], bins=30, kde=True, ax=axes[0])
axes[0].set_title(f'fare (skew={df["fare"].skew():.2f})')
log_fare = np.log1p(df['fare'])
sns.histplot(log_fare, bins=30, kde=True, ax=axes[1], color='coral')
axes[1].set_title(f'log1p(fare) (skew={log_fare.skew():.2f})')
plt.tight_layout()
plt.show()Controllare le colonne a varianza nulla
Una colonna con varianza nulla (tutti i valori sono identici) non fornisce alcuna informazione a un modello e dovrebbe essere eliminata. Una colonna con varianza prossima a zero (il 99% delle righe contiene lo stesso valore) è altrettanto inutile. Calcoli la varianza con df.var() e applichi un filtro. Controlli anche le colonne per cui nunique() == len(df): sono probabilmente colonne ID che non dovrebbero essere usate come feature, ma possono essere utili come identificatori delle righe.
import pandas as pd
import seaborn as sns
df = sns.load_dataset('titanic')
numeric = df.select_dtypes('number')
# Zero-variance columns
zero_var = numeric.columns[numeric.var() == 0].tolist()
print('Zero-variance columns:', zero_var)
# Near-zero variance (std < 0.01)
nzv = numeric.columns[numeric.std() < 0.01].tolist()
print('Near-zero variance:', nzv)
# Likely ID columns (all unique values)
id_candidates = [c for c in df.columns if df[c].nunique() == len(df)]
print('Likely ID columns:', id_candidates)Ciclo di automazione dell'analisi univariata
Anziché ripetere manualmente la stessa analisi per ogni colonna, scriva un ciclo che iteri su tutte le colonne numeriche e stampi le statistiche principali in un formato strutturato. In questo modo è facile esaminare rapidamente decine di colonne e segnalare quelle che richiedono attenzione. L'output può essere salvato in un file CSV come parte di un audit log della pipeline, che gli stakeholder possono esaminare prima di usare i dati nella modellazione.
import pandas as pd
import seaborn as sns
df = sns.load_dataset('titanic')
numeric = df.select_dtypes('number')
rows = []
for col in numeric.columns:
s = df[col]
Q1, Q3 = s.quantile(0.25), s.quantile(0.75)
IQR = Q3 - Q1
n_outliers = ((s < Q1 - 1.5*IQR) | (s > Q3 + 1.5*IQR)).sum()
rows.append({
'column': col,
'missing_pct': round(s.isna().mean() * 100, 1),
'mean': round(s.mean(), 2),
'std': round(s.std(), 2),
'skew': round(s.skew(), 2),
'outliers': int(n_outliers)
})
report = pd.DataFrame(rows)
print(report.to_string(index=False))Documentare i risultati dell'analisi univariata
Dopo aver completato l'analisi univariata, documenti sistematicamente i risultati. Per ogni colonna annoti: la forma della distribuzione (asimmetrica, bimodale, approssimativamente normale), la percentuale di valori mancanti e la strategia di imputazione prevista, il conteggio degli outlier e la decisione adottata (limitare, rimuovere, segnalare), oltre a eventuali valori sospetti che richiedono chiarimenti sul dominio. Questa documentazione diventa il registro della qualità dei dati che guida le fasi di pulizia e impedisce che le decisioni vengano dimenticate o contestate in seguito.
Verifica rapida
Verifichi la Sua comprensione dell'analisi univariata presentata in questa lezione.
Riepilogo della lezione
In questa lezione ha imparato che gli istogrammi mostrano la forma della distribuzione delle colonne numeriche, mentre box plot e limiti basati sull'IQR identificano gli outlier e value_counts mostra la frequenza delle categorie nelle colonne categoriche. Automatizzare questi controlli in un ciclo permette di creare un report della qualità riutilizzabile. Ora esploreremo l'analisi bivariata e delle correlazioni, per comprendere le relazioni tra coppie di colonne.
Domande Frequenti
La lezione «Analisi univariata» è gratuita?
Sì — il testo completo di «Analisi univariata» è 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 univariata»?
Analizzi ogni colonna indipendentemente: rappresenti le distribuzioni delle variabili numeriche e i conteggi dei valori di quelle categoriche, annotando outlier e asimmetria. 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 2 di 4.
Quanto tempo richiede la lezione «Analisi univariata»?
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
- Checklist per il profiling di un dataset
- Analisi univariata
- Analisi bivariata e della correlazione
- Riassumere i risultati in un report