Statistica Descrittiva in R
La statistica descrittiva e il primo passo fondamentale di qualsiasi analisi dati. Prima di costruire modelli complessi, e indispensabile comprendere la struttura dei dati attraverso misure di sintesi. R offre un insieme ricco di funzioni integrate per calcolare misure di tendenza centrale, dispersione, correlazione e distribuzioni di frequenza.
Misure di Tendenza Centrale
Le misure di tendenza centrale indicano il valore “tipico” di una distribuzione. Le principali sono la media aritmetica, la mediana e la moda.
# Dataset: voti di 20 studenti all'esame di Statistica
voti <- c(18, 22, 25, 28, 30, 19, 24, 27, 30, 26,
21, 23, 28, 25, 30, 20, 27, 29, 24, 26)
# Media aritmetica
mean(voti)
# [1] 25.1
# Mediana (valore centrale)
median(voti)
# [1] 25.5
# Media troncata (esclude il 10% estremo)
mean(voti, trim = 0.1)
# [1] 25.25
La media e sensibile ai valori estremi (outlier), mentre la mediana e robusta: divide la distribuzione in due meta uguali. Quando media e mediana differiscono sensibilmente, la distribuzione e asimmetrica.
# Esempio con outlier: stipendi mensili in euro
stipendi <- c(1200, 1350, 1400, 1500, 1600, 1550, 1700, 1800, 8000)
mean(stipendi) # [1] 2233.333 (influenzata dall'outlier 8000)
median(stipendi) # [1] 1550 (valore rappresentativo)
La moda (il valore piu frequente) non ha una funzione nativa in R, ma si calcola facilmente con table():
# Calcolare la moda
freq <- table(voti)
moda <- as.numeric(names(freq[freq == max(freq)]))
print(moda)
# [1] 30
Misure di Dispersione
Le misure di dispersione indicano quanto i dati sono sparsi attorno al valore centrale.
# Varianza (media dei quadrati degli scarti dalla media)
var(voti)
# [1] 13.04211
# Deviazione standard (radice della varianza)
sd(voti)
# [1] 3.611386
# Minimo e massimo
min(voti) # [1] 18
max(voti) # [1] 30
# Range (differenza tra massimo e minimo)
range(voti)
# [1] 18 30
diff(range(voti))
# [1] 12
Quantili e Scarto Interquartile
I quantili dividono la distribuzione in parti uguali. I quartili la dividono in 4 parti e sono particolarmente utili per identificare la dispersione centrale dei dati.
# Quartili
quantile(voti)
# 0% 25% 50% 75% 100%
# 18.00 22.75 25.50 27.75 30.00
# Percentili specifici
quantile(voti, probs = c(0.10, 0.90))
# 10% 90%
# 19.9 29.1
# Scarto interquartile (IQR = Q3 - Q1)
IQR(voti)
# [1] 5
Lo scarto interquartile (IQR) misura la dispersione del 50% centrale dei dati ed e meno sensibile agli outlier rispetto alla deviazione standard.
La Funzione summary()
La funzione summary() fornisce un riepilogo completo delle principali statistiche descrittive:
summary(voti)
# Min. 1st Qu. Median Mean 3rd Qu. Max.
# 18.00 22.75 25.50 25.10 27.75 30.00
Applicata a un data frame, summary() calcola le statistiche per ogni colonna:
# Dataset realistico: studenti universitari
studenti <- data.frame(
nome = c("Marco", "Laura", "Giovanni", "Sara", "Luca",
"Anna", "Paolo", "Elena", "Roberto", "Chiara"),
eta = c(22, 25, 23, 21, 24, 22, 26, 23, 25, 21),
voto_medio = c(26.5, 29.0, 24.0, 27.5, 28.0, 25.5, 23.0, 30.0, 26.0, 28.5),
ore_studio = c(15, 25, 10, 20, 22, 14, 8, 28, 18, 24)
)
summary(studenti[, c("eta", "voto_medio", "ore_studio")])
# eta voto_medio ore_studio
# Min. :21.0 Min. :23.0 Min. : 8.0
# 1st Qu.:22.0 1st Qu.:25.6 1st Qu.:14.2
# Median :23.0 Median :27.0 Median :19.0
# Mean :23.2 Mean :26.8 Mean :18.4
# 3rd Qu.:25.0 3rd Qu.:28.4 3rd Qu.:23.5
# Max. :26.0 Max. :30.0 Max. :28.0
Correlazione
La correlazione misura la forza e la direzione della relazione lineare tra due variabili. Il coefficiente di Pearson varia da -1 (correlazione negativa perfetta) a +1 (correlazione positiva perfetta).
# Correlazione tra ore di studio e voto medio
cor(studenti$ore_studio, studenti$voto_medio)
# [1] 0.9011975
# Matrice di correlazione per tutte le variabili numeriche
cor(studenti[, c("eta", "voto_medio", "ore_studio")])
# eta voto_medio ore_studio
# eta 1.0000 -0.0654 0.1238
# voto_medio -0.0654 1.0000 0.9012
# ore_studio 0.1238 0.9012 1.0000
Il valore 0.90 indica una forte correlazione positiva tra ore di studio e voto medio: chi studia di piu tende a ottenere voti piu alti.
Distribuzioni di Frequenza
Le distribuzioni di frequenza mostrano come i dati si distribuiscono tra le diverse categorie o classi di valori.
Frequenze Assolute con table()
# Valutazioni di un corso (scala 1-5)
valutazioni <- c(3, 4, 5, 4, 3, 2, 5, 4, 4, 3,
5, 4, 3, 4, 5, 2, 3, 4, 5, 4)
# Frequenze assolute
freq_assolute <- table(valutazioni)
print(freq_assolute)
# valutazioni
# 2 3 4 5
# 2 5 8 5
Frequenze Relative con prop.table()
# Frequenze relative (proporzioni)
freq_relative <- prop.table(freq_assolute)
print(freq_relative)
# valutazioni
# 2 3 4 5
# 0.10 0.25 0.40 0.25
# Frequenze percentuali
round(prop.table(freq_assolute) * 100, 1)
# valutazioni
# 2 3 4 5
# 10.0 25.0 40.0 25.0
Classi di Frequenza con cut()
Per variabili continue, si raggruppano i valori in classi usando cut():
# Raggruppare i voti in fasce
fasce_voto <- cut(voti, breaks = c(17, 21, 24, 27, 30),
labels = c("18-21", "22-24", "25-27", "28-30"),
include.lowest = TRUE)
# Distribuzione di frequenza per fasce
table(fasce_voto)
# fasce_voto
# 18-21 22-24 25-27 28-30
# 4 4 5 7
# Proporzioni per fascia
round(prop.table(table(fasce_voto)) * 100, 1)
# fasce_voto
# 18-21 22-24 25-27 28-30
# 20.0 20.0 25.0 35.0
Tabelle di Contingenza
Per analizzare la relazione tra due variabili categoriali si usano le tabelle di contingenza:
# Genere e fascia di voto
genere <- c("M", "F", "M", "F", "M", "F", "M", "F", "M", "F",
"M", "F", "M", "F", "M", "F", "M", "F", "M", "F")
fascia <- cut(voti, breaks = c(17, 24, 30),
labels = c("Sufficiente", "Ottimo"),
include.lowest = TRUE)
# Tabella di contingenza
tab <- table(genere, fascia)
print(tab)
# fascia
# genere Sufficiente Ottimo
# F 3 7
# M 5 5
# Proporzioni per riga (distribuzione condizionata)
round(prop.table(tab, margin = 1) * 100, 1)
# fascia
# genere Sufficiente Ottimo
# F 30.0 70.0
# M 50.0 50.0
Conclusione
La statistica descrittiva in R permette di ottenere rapidamente un quadro completo dei dati. Le funzioni mean(), median(), sd() e var() calcolano le misure fondamentali, quantile() e IQR() descrivono la dispersione in modo robusto, mentre summary() offre un riepilogo immediato. Per le distribuzioni di frequenza, table(), prop.table() e cut() sono strumenti essenziali per esplorare sia variabili categoriali che continue. Padroneggiare queste funzioni e il prerequisito per affrontare test statistici e modelli piu avanzati.