00
:
00
:
00
:
00
Corso SEO AI - Usa SEOEMAIL al checkout per il 30% di sconto

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.