========================================

CREA GUIDA COMPLETA CON TUTTA LA TEORIA

========================================

Installa patchwork se necessario

if (!requireNamespace(“patchwork”, quietly = TRUE)) { install.packages(“patchwork”, repos = “https://cloud.r-project.org”) }

Crea il file

cat(’— title: “Guida Completa: Statistica con R - Teoria e Pratica” author: “Corso Completo di Statistica” date: “2025-11-04” output: html_document: toc: true toc_depth: 4 toc_float: true number_sections: true theme: cosmo code_folding: show —

INTRODUZIONE ALLA STATISTICA

Cos'è la Statistica?

La statistica è la scienza che raccoglie, organizza, analizza e interpreta dati per fare inferenze su popolazioni.

Rami della Statistica

STATISTICA
    │
    ├─ STATISTICA DESCRITTIVA
    │  • Riassume e descrive i dati
    │  • Tabelle, grafici, indici
    │  • Esempio: "La media è 25"
    │
    └─ STATISTICA INFERENZIALE
       • Fa conclusioni su popolazioni
       • Test di ipotesi, IC
       • Esempio: "IC 95%: [24, 26]"

Popolazione vs Campione

Popolazione: Insieme completo di tutti gli elementi

  • Parametri: μ (media), σ (SD), p (proporzione)
  • Sconosciuti, vogliamo stimarli

Campione: Sottoinsieme della popolazione

  • Statistiche: x̄ (media camp.), s (SD camp.), p̂ (prop. camp.)
  • Calcolabili, usati per stimare parametri
cat("POPOLAZIONE → CAMPIONE\\n")
## POPOLAZIONE → CAMPIONE\n
cat("Parametri  → Statistiche\\n")
## Parametri  → Statistiche\n
cat("μ (mu)     → x̄ (x-bar)\\n")
## μ (mu)     → x̄ (x-bar)\n
cat("σ (sigma)  → s\\n")
## σ (sigma)  → s\n
cat("p          → p̂ (p-hat)\\n")
## p          → p̂ (p-hat)\n

PARTE 1: STATISTICA DESCRITTIVA

Tipi di Variabili

Classificazione Completa

1. QUALITATIVE (Categoriche)

A. Nominali - Nessun ordine - Esempi: colore, città, gruppo sanguigno - Operazioni: contare, moda - In R: factor()

B. Ordinali - Con ordine - Esempi: soddisfazione (basso < medio < alto) - Operazioni: contare, moda, mediana - In R: factor(ordered = TRUE)

2. QUANTITATIVE (Numeriche)

A. Discrete - Valori interi - Esempi: numero figli, voti (0, 1, 2, …) - Operazioni: tutte le statistiche

B. Continue - Valori decimali - Esempi: altezza, peso, temperatura - Operazioni: tutte le statistiche

# Esempio completo
df_tipi <- data.frame(
  # Nominale
  citta = c("Roma", "Milano", "Napoli"),
  # Ordinale
  soddisfazione = factor(c("Alto", "Medio", "Basso"), 
                         levels = c("Basso", "Medio", "Alto"), 
                         ordered = TRUE),
  # Discreta
  figli = c(2, 0, 1),
  # Continua
  altezza = c(175.5, 162.3, 180.1)
)

str(df_tipi)
## 'data.frame':    3 obs. of  4 variables:
##  $ citta        : chr  "Roma" "Milano" "Napoli"
##  $ soddisfazione: Ord.factor w/ 3 levels "Basso"<"Medio"<..: 3 2 1
##  $ figli        : num  2 0 1
##  $ altezza      : num  176 162 180

Misure di Tendenza Centrale

Media Aritmetica

Definizione: Somma dei valori divisa per il numero di osservazioni

Formula popolazione: \[\\mu = \\frac{1}{N} \\sum_{i=1}^{N} x_i\]

Formula campionaria: \[\\bar{x} = \\frac{1}{n} \\sum_{i=1}^{n} x_i\]

Proprietà: 1. Usa tutti i dati 2. Sensibile agli outlier 3. Somma deviazioni = 0: \(\\sum(x_i - \\bar{x}) = 0\) 4. Minimizza somma quadrati: \(\\sum(x_i - \\bar{x})^2\) è minima

voti <- c(18, 24, 27, 30, 22, 28, 26)
media_voti <- mean(voti)

cat("=== MEDIA ===\\n\\n")
## === MEDIA ===\n\n
cat("Voti:", paste(voti, collapse = ", "), "\\n")
## Voti: 18, 24, 27, 30, 22, 28, 26 \n
cat("Media:", media_voti, "\\n\\n")
## Media: 25 \n\n
# Proprietà: somma deviazioni = 0
deviazioni <- voti - media_voti
cat("Deviazioni dalla media:\\n")
## Deviazioni dalla media:\n
for(i in 1:length(voti)) {
  cat("  ", voti[i], "-", media_voti, "=", round(deviazioni[i], 2), "\\n")
}
##    18 - 25 = -7 \n   24 - 25 = -1 \n   27 - 25 = 2 \n   30 - 25 = 5 \n   22 - 25 = -3 \n   28 - 25 = 3 \n   26 - 25 = 1 \n
cat("\\nSomma deviazioni:", round(sum(deviazioni), 10), "(≈ 0)\\n")
## \nSomma deviazioni: 0 (≈ 0)\n
# Sensibilità agli outlier
dati_normali <- c(10, 12, 11, 13, 12)
dati_outlier <- c(10, 12, 11, 13, 100)

cat("\\n=== SENSIBILITÀ OUTLIER ===\\n")
## \n=== SENSIBILITÀ OUTLIER ===\n
cat("Senza outlier:", paste(dati_normali, collapse = ", "), "→ Media:", 
    mean(dati_normali), "\\n")
## Senza outlier: 10, 12, 11, 13, 12 → Media: 11.6 \n
cat("Con outlier:", paste(dati_outlier, collapse = ", "), "→ Media:", 
    mean(dati_outlier), "(aumentata!)\\n")
## Con outlier: 10, 12, 11, 13, 100 → Media: 29.2 (aumentata!)\n

Mediana

Definizione: Valore centrale quando i dati sono ordinati

Calcolo: - Se n dispari: mediana = valore centrale - Se n pari: mediana = media dei due valori centrali

Proprietà: 1. Robusta agli outlier 2. Divide i dati a metà (50% sotto, 50% sopra) 3. È il 50° percentile (Q2)

# Esempio con n dispari
dispari <- c(5, 2, 9, 1, 7)
ord_disp <- sort(dispari)

cat("=== MEDIANA (n dispari) ===\\n")
## === MEDIANA (n dispari) ===\n
cat("Dati:", paste(dispari, collapse = ", "), "\\n")
## Dati: 5, 2, 9, 1, 7 \n
cat("Ordinati:", paste(ord_disp, collapse = ", "), "\\n")
## Ordinati: 1, 2, 5, 7, 9 \n
cat("Mediana:", median(dispari), "(valore centrale)\\n\\n")
## Mediana: 5 (valore centrale)\n\n
# Esempio con n pari
pari <- c(5, 2, 9, 1, 7, 4)
ord_pari <- sort(pari)

cat("=== MEDIANA (n pari) ===\\n")
## === MEDIANA (n pari) ===\n
cat("Dati:", paste(pari, collapse = ", "), "\\n")
## Dati: 5, 2, 9, 1, 7, 4 \n
cat("Ordinati:", paste(ord_pari, collapse = ", "), "\\n")
## Ordinati: 1, 2, 4, 5, 7, 9 \n
cat("Valori centrali:", ord_pari[3], "e", ord_pari[4], "\\n")
## Valori centrali: 4 e 5 \n
cat("Mediana:", median(pari), "(media dei due centrali)\\n\\n")
## Mediana: 4.5 (media dei due centrali)\n\n
# Robustezza agli outlier
stipendi <- c(1200, 1300, 1250, 1400, 1350, 50000)

cat("=== ROBUSTEZZA ===\\n")
## === ROBUSTEZZA ===\n
cat("Stipendi:", paste(stipendi, collapse = ", "), "€\\n")
## Stipendi: 1200, 1300, 1250, 1400, 1350, 50000 €\n
cat("Media:", mean(stipendi), "€ (influenzata dall\'outlier 50000)\\n")
## Media: 9416.667 € (influenzata dall'outlier 50000)\n
cat("Mediana:", median(stipendi), "€ (robusta, rappresentativa)\\n")
## Mediana: 1325 € (robusta, rappresentativa)\n

Moda

Definizione: Valore più frequente

Tipi di distribuzioni: - Unimodale: Una moda - Bimodale: Due mode - Multimodale: Più mode - Amodale: Nessuna moda

# Funzione moda
calcola_moda <- function(x) {
  tab <- table(x)
  max_freq <- max(tab)
  mode_vals <- names(tab)[tab == max_freq]
  if(length(mode_vals) == length(unique(x))) {
    return("Nessuna moda")
  }
  return(mode_vals)
}

# Unimodale
uni <- c(1, 2, 2, 2, 3, 3, 4)
cat("Unimodale:", paste(uni, collapse = ", "), "\\n")
## Unimodale: 1, 2, 2, 2, 3, 3, 4 \n
cat("Moda:", calcola_moda(uni), "\\n\\n")
## Moda: 2 \n\n
# Bimodale
bi <- c(1, 1, 1, 2, 3, 4, 4, 4)
cat("Bimodale:", paste(bi, collapse = ", "), "\\n")
## Bimodale: 1, 1, 1, 2, 3, 4, 4, 4 \n
cat("Mode:", paste(calcola_moda(bi), collapse = ", "), "\\n")
## Mode: 1, 4 \n

Confronto: Media vs Mediana vs Moda

cat("=== QUANDO USARE COSA ===\\n\\n")
## === QUANDO USARE COSA ===\n\n
cat("MEDIA:\\n")
## MEDIA:\n
cat("  ✓ Dati simmetrici senza outlier\\n")
##   ✓ Dati simmetrici senza outlier\n
cat("  ✓ Variabili quantitative\\n")
##   ✓ Variabili quantitative\n
cat("  ✗ Dati asimmetrici o con outlier\\n\\n")
##   ✗ Dati asimmetrici o con outlier\n\n
cat("MEDIANA:\\n")
## MEDIANA:\n
cat("  ✓ Dati con outlier\\n")
##   ✓ Dati con outlier\n
cat("  ✓ Distribuzioni asimmetriche\\n")
##   ✓ Distribuzioni asimmetriche\n
cat("  ✓ Variabili ordinali\\n\\n")
##   ✓ Variabili ordinali\n\n
cat("MODA:\\n")
## MODA:\n
cat("  ✓ Variabili nominali\\n")
##   ✓ Variabili nominali\n
cat("  ✓ Quando serve il valore più comune\\n")
##   ✓ Quando serve il valore più comune\n
cat("  ✗ Come unica misura (poco stabile)\\n")
##   ✗ Come unica misura (poco stabile)\n

Misure di Dispersione

Range

Formula: Range = Max - Min

Proprietà: - Facile da calcolare - Usa solo 2 valori - Molto sensibile agli outlier

temperature <- c(18, 22, 25, 20, 19, 23, 21)
cat("Temperature:", paste(temperature, collapse = ", "), "°C\\n")
## Temperature: 18, 22, 25, 20, 19, 23, 21 °C\n
cat("Min:", min(temperature), "°C\\n")
## Min: 18 °C\n
cat("Max:", max(temperature), "°C\\n")
## Max: 25 °C\n
cat("Range:", max(temperature) - min(temperature), "°C\\n")
## Range: 7 °C\n

Varianza

Definizione: Media dei quadrati delle deviazioni dalla media

Formula popolazione: \[\\sigma^2 = \\frac{1}{N} \\sum_{i=1}^{N} (x_i - \\mu)^2\]

Formula campionaria: \[s^2 = \\frac{1}{n-1} \\sum_{i=1}^{n} (x_i - \\bar{x})^2\]

Perché n-1? Correzione di Bessel per stima non distorta

cat("=== CALCOLO VARIANZA PASSO-PASSO ===\\n\\n")
## === CALCOLO VARIANZA PASSO-PASSO ===\n\n
dati <- c(10, 12, 15, 18, 20)
n <- length(dati)
media <- mean(dati)

cat("Dati:", paste(dati, collapse = ", "), "\\n")
## Dati: 10, 12, 15, 18, 20 \n
cat("n =", n, "\\n")
## n = 5 \n
cat("Media =", media, "\\n\\n")
## Media = 15 \n\n
cat("STEP 1: Deviazioni (x - media)\\n")
## STEP 1: Deviazioni (x - media)\n
dev <- dati - media
for(i in 1:n) {
  cat("  ", dati[i], "-", media, "=", dev[i], "\\n")
}
##    10 - 15 = -5 \n   12 - 15 = -3 \n   15 - 15 = 0 \n   18 - 15 = 3 \n   20 - 15 = 5 \n
cat("\\nSTEP 2: Quadrati delle deviazioni\\n")
## \nSTEP 2: Quadrati delle deviazioni\n
dev_quad <- dev^2
for(i in 1:n) {
  cat("  (", dev[i], ")² =", dev_quad[i], "\\n")
}
##   ( -5 )² = 25 \n  ( -3 )² = 9 \n  ( 0 )² = 0 \n  ( 3 )² = 9 \n  ( 5 )² = 25 \n
cat("\\nSTEP 3: Somma quadrati\\n")
## \nSTEP 3: Somma quadrati\n
somma <- sum(dev_quad)
cat("  ", somma, "\\n")
##    68 \n
cat("\\nSTEP 4: Dividi per (n-1)\\n")
## \nSTEP 4: Dividi per (n-1)\n
varianza <- somma / (n-1)
cat("  Varianza =", somma, "/", (n-1), "=", varianza, "\\n\\n")
##   Varianza = 68 / 4 = 17 \n\n
cat("Verifica con var():", var(dati), "✓\\n\\n")
## Verifica con var(): 17 ✓\n\n
# Dimostrazione perché n-1
cat("=== PERCHÉ n-1 E NON n? ===\\n\\n")
## === PERCHÉ n-1 E NON n? ===\n\n
set.seed(123)
popolazione <- rnorm(10000, 100, 15)
var_vera <- var(popolazione)

n_camp <- 10
n_sim <- 1000

var_con_n <- numeric(n_sim)
var_con_n_1 <- numeric(n_sim)

for(i in 1:n_sim) {
  camp <- sample(popolazione, n_camp)
  xbar <- mean(camp)
  var_con_n[i] <- sum((camp - xbar)^2) / n_camp
  var_con_n_1[i] <- sum((camp - xbar)^2) / (n_camp - 1)
}

cat("Varianza vera popolazione:", round(var_vera, 2), "\\n\\n")
## Varianza vera popolazione: 224.39 \n\n
cat("Con divisore n:", round(mean(var_con_n), 2), "(sottostima ✗)\\n")
## Con divisore n: 204.09 (sottostima ✗)\n
cat("Con divisore n-1:", round(mean(var_con_n_1), 2), "(corretto ✓)\\n")
## Con divisore n-1: 226.76 (corretto ✓)\n

Deviazione Standard

Formula: \(s = \\sqrt{s^2}\)

Proprietà: - Stesse unità dei dati - Interpretabile come “distanza tipica dalla media” - Regola empirica (68-95-99.7) per dati normali

cat("=== DEVIAZIONE STANDARD ===\\n\\n")
## === DEVIAZIONE STANDARD ===\n\n
gruppo_a <- c(50, 52, 48, 51, 49)
gruppo_b <- c(30, 70, 45, 60, 35)

cat("GRUPPO A (poco disperso):\\n")
## GRUPPO A (poco disperso):\n
cat("  Dati:", paste(gruppo_a, collapse = ", "), "\\n")
##   Dati: 50, 52, 48, 51, 49 \n
cat("  Media:", mean(gruppo_a), "\\n")
##   Media: 50 \n
cat("  SD:", round(sd(gruppo_a), 2), "\\n\\n")
##   SD: 1.58 \n\n
cat("GRUPPO B (molto disperso):\\n")
## GRUPPO B (molto disperso):\n
cat("  Dati:", paste(gruppo_b, collapse = ", "), "\\n")
##   Dati: 30, 70, 45, 60, 35 \n
cat("  Media:", mean(gruppo_b), "\\n")
##   Media: 48 \n
cat("  SD:", round(sd(gruppo_b), 2), "\\n\\n")
##   SD: 16.81 \n\n
# Regola 68-95-99.7
set.seed(42)
dati_norm <- rnorm(10000, 100, 15)
mu <- mean(dati_norm)
sigma <- sd(dati_norm)

perc_1sd <- mean(dati_norm >= (mu-sigma) & dati_norm <= (mu+sigma)) * 100
perc_2sd <- mean(dati_norm >= (mu-2*sigma) & dati_norm <= (mu+2*sigma)) * 100
perc_3sd <- mean(dati_norm >= (mu-3*sigma) & dati_norm <= (mu+3*sigma)) * 100

cat("=== REGOLA 68-95-99.7 ===\\n\\n")
## === REGOLA 68-95-99.7 ===\n\n
cat("Dati normali (μ =", round(mu,1), ", σ =", round(sigma,1), ")\\n\\n")
## Dati normali (μ = 99.8 , σ = 15.1 )\n\n
cat("Entro 1 SD:", round(perc_1sd, 1), "% (teoria: 68%)\\n")
## Entro 1 SD: 68.3 % (teoria: 68%)\n
cat("Entro 2 SD:", round(perc_2sd, 1), "% (teoria: 95%)\\n")
## Entro 2 SD: 95.5 % (teoria: 95%)\n
cat("Entro 3 SD:", round(perc_3sd, 1), "% (teoria: 99.7%)\\n")
## Entro 3 SD: 99.7 % (teoria: 99.7%)\n

Coefficiente di Variazione

Formula: \(CV = \\frac{s}{\\bar{x}} \\times 100\\%\)

Interpretazione: - CV < 10%: Bassa variabilità - CV 10-20%: Moderata - CV 20-30%: Alta - CV > 30%: Molto alta

peso <- c(68, 72, 65, 70, 73)
altezza <- c(168, 175, 162, 172, 180)

cv_peso <- sd(peso) / mean(peso) * 100
cv_altezza <- sd(altezza) / mean(altezza) * 100

cat("PESO:\\n")
## PESO:\n
cat("  Media:", mean(peso), "kg\\n")
##   Media: 69.6 kg\n
cat("  SD:", round(sd(peso), 2), "kg\\n")
##   SD: 3.21 kg\n
cat("  CV:", round(cv_peso, 2), "%\\n\\n")
##   CV: 4.61 %\n\n
cat("ALTEZZA:\\n")
## ALTEZZA:\n
cat("  Media:", mean(altezza), "cm\\n")
##   Media: 171.4 cm\n
cat("  SD:", round(sd(altezza), 2), "cm\\n")
##   SD: 6.84 cm\n
cat("  CV:", round(cv_altezza, 2), "%\\n\\n")
##   CV: 3.99 %\n\n
if(cv_peso > cv_altezza) {
  cat("Il peso ha variabilità relativa maggiore\\n")
} else {
  cat("L\'altezza ha variabilità relativa maggiore\\n")
}
## Il peso ha variabilità relativa maggiore\n

Quartili e Percentili

Percentili

Definizione: Il percentile P_k è il valore sotto il quale cade il k% dei dati

set.seed(42)
punteggi <- round(rnorm(100, 75, 10))

cat("=== PERCENTILI ===\\n\\n")
## === PERCENTILI ===\n\n
percs <- c(10, 25, 50, 75, 90, 95, 99)
vals <- quantile(punteggi, probs = percs/100)

for(i in 1:length(percs)) {
  cat("P", percs[i], " = ", round(vals[i], 1), 
      " → ", percs[i], "% ha punteggio ≤ ", round(vals[i], 1), "\\n", sep = "")
}
## P10 = 62.8 → 10% ha punteggio ≤ 62.8\nP25 = 69 → 25% ha punteggio ≤ 69\nP50 = 76 → 50% ha punteggio ≤ 76\nP75 = 82 → 75% ha punteggio ≤ 82\nP90 = 89 → 90% ha punteggio ≤ 89\nP95 = 90 → 95% ha punteggio ≤ 90\nP99 = 95 → 99% ha punteggio ≤ 95\n

Quartili

Definizione: - Q1 = 25° percentile - Q2 = 50° percentile (mediana) - Q3 = 75° percentile

IQR: Interquartile Range = Q3 - Q1

dati_q <- c(45, 52, 58, 62, 68, 72, 75, 78, 82, 85, 88, 92, 95)

q1 <- quantile(dati_q, 0.25)
q2 <- quantile(dati_q, 0.50)
q3 <- quantile(dati_q, 0.75)
iqr <- IQR(dati_q)

cat("=== QUARTILI ===\\n\\n")
## === QUARTILI ===\n\n
cat("Q1 (25°):", q1, "→ 25% dati ≤", q1, "\\n")
## Q1 (25°): 62 → 25% dati ≤ 62 \n
cat("Q2 (50°):", q2, "→ 50% dati ≤", q2, "(mediana)\\n")
## Q2 (50°): 75 → 50% dati ≤ 75 (mediana)\n
cat("Q3 (75°):", q3, "→ 75% dati ≤", q3, "\\n\\n")
## Q3 (75°): 85 → 75% dati ≤ 85 \n\n
cat("IQR = Q3 - Q1 =", iqr, "\\n\\n")
## IQR = Q3 - Q1 = 23 \n\n
# Outlier
lower <- q1 - 1.5 * iqr
upper <- q3 + 1.5 * iqr

cat("OUTLIER:\\n")
## OUTLIER:\n
cat("  < Q1 - 1.5×IQR =", lower, "\\n")
##   < Q1 - 1.5×IQR = 27.5 \n
cat("  > Q3 + 1.5×IQR =", upper, "\\n")
##   > Q3 + 1.5×IQR = 119.5 \n

summary() in R

set.seed(42)
df_esempio <- data.frame(
  eta = rnorm(100, 35, 10),
  stipendio = rnorm(100, 1500, 300),
  soddisfazione = sample(c("Bassa", "Media", "Alta"), 100, replace = TRUE)
)

cat("=== SUMMARY COMPLETO ===\\n\\n")
## === SUMMARY COMPLETO ===\n\n
summary(df_esempio)
##       eta           stipendio      soddisfazione     
##  Min.   : 5.069   Min.   : 892.6   Length:100        
##  1st Qu.:28.833   1st Qu.:1322.6   Class :character  
##  Median :35.898   Median :1479.2   Mode  :character  
##  Mean   :35.325   Mean   :1473.8                     
##  3rd Qu.:41.616   3rd Qu.:1638.5                     
##  Max.   :57.866   Max.   :2310.6

PARTE 2: GGPLOT2

Struttura Base

ggplot(data, aes(x, y)) + geom_*()

Componenti: 1. ggplot(): inizializza 2. data: dataframe 3. aes(): aesthetics (mappature) 4. geom_*(): tipo di grafico 5. +: aggiunge layer

df_base <- data.frame(x = 1:5, y = c(2, 4, 3, 5, 4))

ggplot(df_base, aes(x = x, y = y)) +
  geom_point(size = 4, color = "blue") +
  geom_line(color = "red", linewidth = 1) +
  labs(title = "Grafico Base ggplot2",
       x = "Asse X", y = "Asse Y") +
  theme_minimal()

Aesthetics

Principali aesthetics: - x, y: posizione - color: colore punti/linee - fill: riempimento - size: dimensione - shape: forma - alpha: trasparenza

Mapping vs Setting:

df_aes <- data.frame(
  x = 1:10,
  y = rnorm(10),
  gruppo = rep(c("A", "B"), 5)
)

# MAPPING: variabile
p1 <- ggplot(df_aes, aes(x = x, y = y, color = gruppo)) +
  geom_point(size = 3) +
  labs(title = "MAPPING: color = gruppo") +
  theme_minimal()

# SETTING: fisso
p2 <- ggplot(df_aes, aes(x = x, y = y)) +
  geom_point(color = "blue", size = 3) +
  labs(title = "SETTING: color = blue") +
  theme_minimal()

p1 + p2

Principali Geoms

set.seed(42)
df_demo <- data.frame(
  gruppo = rep(c("A", "B", "C"), each = 30),
  valore = c(rnorm(30, 10, 2), rnorm(30, 12, 2), rnorm(30, 11, 2))
)

# Histogram
g1 <- ggplot(df_demo, aes(x = valore)) +
  geom_histogram(bins = 15, fill = "steelblue", color = "black") +
  labs(title = "geom_histogram()") +
  theme_minimal()

# Boxplot
g2 <- ggplot(df_demo, aes(x = gruppo, y = valore, fill = gruppo)) +
  geom_boxplot(alpha = 0.7) +
  labs(title = "geom_boxplot()") +
  theme_minimal() +
  theme(legend.position = "none")

# Scatter + smooth
df_scatter <- data.frame(x = rnorm(100), y = rnorm(100))
g3 <- ggplot(df_scatter, aes(x = x, y = y)) +
  geom_point(alpha = 0.5) +
  geom_smooth(method = "lm", color = "red") +
  labs(title = "geom_point() + geom_smooth()") +
  theme_minimal()

# Density
g4 <- ggplot(df_demo, aes(x = valore, fill = gruppo)) +
  geom_density(alpha = 0.5) +
  labs(title = "geom_density()") +
  theme_minimal()

(g1 + g2) / (g3 + g4)

Faceting

ggplot(df_demo, aes(x = valore)) +
  geom_histogram(bins = 15, fill = "lightblue", color = "black") +
  facet_wrap(~gruppo, ncol = 3) +
  labs(title = "Faceting con facet_wrap()") +
  theme_minimal()

Personalizzazione

ggplot(df_demo, aes(x = gruppo, y = valore, fill = gruppo)) +
  geom_boxplot(alpha = 0.7) +
  scale_fill_manual(values = c("A" = "red", "B" = "green", "C" = "blue")) +
  labs(
    title = "Grafico Personalizzato",
    subtitle = "Con colori custom e tema modificato",
    x = "Gruppo Sperimentale",
    y = "Valore Misurato (unità)",
    caption = "Fonte: Dati simulati"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 16, face = "bold", hjust = 0.5),
    plot.subtitle = element_text(hjust = 0.5),
    legend.position = "bottom"
  )


PARTE 3: STATISTICA INFERENZIALE

Popolazione vs Campione (Ripasso)

cat("POPOLAZIONE    →    CAMPIONE\\n")
## POPOLAZIONE    →    CAMPIONE\n
cat("(N elementi)        (n elementi)\\n\\n")
## (N elementi)        (n elementi)\n\n
cat("Parametri          Statistiche\\n")
## Parametri          Statistiche\n
cat("μ (mu)        ←    x̄ (x-bar)\\n")
## μ (mu)        ←    x̄ (x-bar)\n
cat("σ (sigma)     ←    s\\n")
## σ (sigma)     ←    s\n
cat("p             ←    p̂ (p-hat)\\n\\n")
## p             ←    p̂ (p-hat)\n\n
cat("Obiettivo: Usare statistiche campionarie\\n")
## Obiettivo: Usare statistiche campionarie\n
cat("per stimare parametri popolazione\\n")
## per stimare parametri popolazione\n

Central Limit Theorem (CLT)

Teorema Fondamentale:

Se n ≥ 30, la distribuzione delle medie campionarie è approssimativamente normale, indipendentemente dalla distribuzione originale.

Formula: \[\\bar{x} \\sim N\\left(\\mu, \\frac{\\sigma^2}{n}\\right)\]

cat("=== DIMOSTRAZIONE CLT ===\\n\\n")
## === DIMOSTRAZIONE CLT ===\n\n
set.seed(123)
# Popolazione NON normale (esponenziale)
popolazione <- rexp(100000, rate = 0.02)
mu_vero <- mean(popolazione)
sigma_vero <- sd(popolazione)

cat("POPOLAZIONE (esponenziale - NON normale):\\n")
## POPOLAZIONE (esponenziale - NON normale):\n
cat("  μ =", round(mu_vero, 2), "\\n")
##   μ = 49.87 \n
cat("  σ =", round(sigma_vero, 2), "\\n\\n")
##   σ = 49.75 \n\n
# Simula 5000 medie campionarie
n_camp <- 50
n_sim <- 5000

medie <- replicate(n_sim, mean(sample(popolazione, n_camp)))

cat("DISTRIBUZIONE MEDIE CAMPIONARIE:\\n")
## DISTRIBUZIONE MEDIE CAMPIONARIE:\n
cat("  Media delle medie:", round(mean(medie), 2), "(≈ μ =", round(mu_vero, 2), ")\\n")
##   Media delle medie: 49.82 (≈ μ = 49.87 )\n
cat("  SE empirico:", round(sd(medie), 2), "\\n")
##   SE empirico: 6.93 \n
cat("  SE teorico (σ/√n):", round(sigma_vero/sqrt(n_camp), 2), "\\n\\n")
##   SE teorico (σ/√n): 7.04 \n\n
cat("✓ CLT VERIFICATO: Le medie sono normali!\\n")
## ✓ CLT VERIFICATO: Le medie sono normali!\n
# Visualizza
par(mfrow = c(1, 2))
hist(sample(popolazione, 1000), main = "Popolazione (NON normale)", 
     xlab = "Valore", col = "lightcoral", breaks = 50)
hist(medie, main = "Medie Campionarie (NORMALE!)", 
     xlab = "Media", col = "steelblue", breaks = 50)

Standard Error (SE)

Definizione: Deviazione standard della distribuzione campionaria

Formula: \[SE(\\bar{x}) = \\frac{\\sigma}{\\sqrt{n}}\]

Quando σ sconosciuto (quasi sempre): \[SE(\\bar{x}) = \\frac{s}{\\sqrt{n}}\]

cat("=== STANDARD ERROR ===\\n\\n")
## === STANDARD ERROR ===\n\n
# Confronta diversi n
ns <- c(10, 30, 100, 500)
campione_base <- rnorm(500, 100, 15)

cat("Effetto di n sul SE:\\n\\n")
## Effetto di n sul SE:\n\n
for(n in ns) {
  camp <- campione_base[1:n]
  se <- sd(camp) / sqrt(n)
  cat("  n =", n, "→ SE =", round(se, 2), "\\n")
}
##   n = 10 → SE = 5.16 \n  n = 30 → SE = 2.69 \n  n = 100 → SE = 1.66 \n  n = 500 → SE = 0.69 \n
cat("\\nRegola: Per dimezzare SE, devi quadruplicare n!\\n")
## \nRegola: Per dimezzare SE, devi quadruplicare n!\n

Distribuzione t di Student

Quando usarla: σ sconosciuto (quasi sempre!)

Caratteristiche: - Simmetrica come la normale - Code più pesanti (più prob. valori estremi) - Dipende dai gradi di libertà (df = n - 1) - Converge alla normale quando df → ∞

cat("=== DISTRIBUZIONE t ===\\n\\n")
## === DISTRIBUZIONE t ===\n\n
x_vals <- seq(-4, 4, 0.01)

# Grafico
plot(x_vals, dnorm(x_vals), type = "l", lwd = 2, 
     main = "Distribuzione t vs Normale",
     ylab = "Densità", xlab = "Valore",
     ylim = c(0, 0.4))
lines(x_vals, dt(x_vals, df = 2), col = "red", lwd = 2)
lines(x_vals, dt(x_vals, df = 5), col = "orange", lwd = 2)
lines(x_vals, dt(x_vals, df = 30), col = "blue", lwd = 2)
legend("topright", 
       c("Normale", "t (df=2)", "t (df=5)", "t (df=30)"),
       col = c("black", "red", "orange", "blue"), 
       lwd = 2)

# Tabella valori critici
cat("\\nVALORI CRITICI t (IC 95%):\\n\\n")
## \nVALORI CRITICI t (IC 95%):\n\n
df_vals <- c(1, 2, 5, 10, 20, 30, 50, 100, Inf)
t_vals <- qt(0.975, df = df_vals)

tab <- data.frame(
  df = c(1, 2, 5, 10, 20, 30, 50, 100, "∞"),
  t_critico = round(t_vals, 3)
)
print(tab, row.names = FALSE)
##   df t_critico
##    1    12.706
##    2     4.303
##    5     2.571
##   10     2.228
##   20     2.086
##   30     2.042
##   50     2.009
##  100     1.984
##    ∞     1.960
cat("\\nNota: Con df → ∞, t converge a z = 1.96\\n")
## \nNota: Con df → ∞, t converge a z = 1.96\n

PARTE 4: INTERVALLI DI CONFIDENZA

IC per la Media

Formula: \[IC = \\bar{x} \\pm t^* \\times \\frac{s}{\\sqrt{n}}\]

Dove: - \(\\bar{x}\) = media campionaria - \(t^*\) = valore critico dalla dist. t - \(s\) = deviazione standard campionaria - \(n\) = dimensione campione

cat("=== INTERVALLO DI CONFIDENZA 95% PER LA MEDIA ===\\n\\n")
## === INTERVALLO DI CONFIDENZA 95% PER LA MEDIA ===\n\n
# Dati esempio
altezze <- c(168, 172, 165, 180, 175, 170, 177, 169, 173, 171,
             174, 176, 168, 172, 170)

n <- length(altezze)
xbar <- mean(altezze)
s <- sd(altezze)
se <- s / sqrt(n)
df <- n - 1

cat("DATI:\\n")
## DATI:\n
cat("  n =", n, "\\n")
##   n = 15 \n
cat("  x̄ =", round(xbar, 2), "cm\\n")
##   x̄ = 172 cm\n
cat("  s =", round(s, 2), "cm\\n")
##   s = 3.95 cm\n
cat("  SE = s/√n =", round(se, 2), "cm\\n")
##   SE = s/√n = 1.02 cm\n
cat("  df = n-1 =", df, "\\n\\n")
##   df = n-1 = 14 \n\n
# IC 95%
alpha <- 0.05
t_crit <- qt(1 - alpha/2, df = df)
margine <- t_crit * se
ic_low <- xbar - margine
ic_up <- xbar + margine

cat("CALCOLO IC 95%:\\n")
## CALCOLO IC 95%:\n
cat("  α = 0.05\\n")
##   α = 0.05\n
cat("  α/2 = 0.025\\n")
##   α/2 = 0.025\n
cat("  t* = qt(0.975, df=", df, ") =", round(t_crit, 3), "\\n")
##   t* = qt(0.975, df= 14 ) = 2.145 \n
cat("  Margine = t* × SE =", round(margine, 2), "cm\\n\\n")
##   Margine = t* × SE = 2.19 cm\n\n
cat("IC 95%: [", round(ic_low, 2), ",", round(ic_up, 2), "] cm\\n\\n")
## IC 95%: [ 169.81 , 174.19 ] cm\n\n
cat("INTERPRETAZIONE:\\n")
## INTERPRETAZIONE:\n
cat("Siamo confidenti al 95% che la vera altezza\\n")
## Siamo confidenti al 95% che la vera altezza\n
cat("media della popolazione sia tra", round(ic_low, 2), 
    "e", round(ic_up, 2), "cm.\\n\\n")
## media della popolazione sia tra 169.81 e 174.19 cm.\n\n
# Verifica con t.test()
cat("VERIFICA CON R:\\n")
## VERIFICA CON R:\n
risultato <- t.test(altezze)
print(risultato$conf.int)
## [1] 169.8147 174.1853
## attr(,"conf.level")
## [1] 0.95

IC per la Proporzione

Formula: \[IC = \\hat{p} \\pm z^* \\times \\sqrt{\\frac{\\hat{p}(1-\\hat{p})}{n}}\]

Condizioni: \(n\\hat{p} \\geq 10\) e \(n(1-\\hat{p}) \\geq 10\)

cat("=== IC 95% PER PROPORZIONE ===\\n\\n")
## === IC 95% PER PROPORZIONE ===\n\n
# Esempio: sondaggio
n_sond <- 1000
favorevoli <- 580
phat <- favorevoli / n_sond

cat("DATI:\\n")
## DATI:\n
cat("  n =", n_sond, "\\n")
##   n = 1000 \n
cat("  Favorevoli =", favorevoli, "\\n")
##   Favorevoli = 580 \n
cat("  p̂ =", phat, "(", phat*100, "%)\\n\\n")
##   p̂ = 0.58 ( 58 %)\n\n
# Verifica condizioni
np <- n_sond * phat
n_1_p <- n_sond * (1 - phat)

cat("VERIFICA CONDIZIONI:\\n")
## VERIFICA CONDIZIONI:\n
cat("  np =", np, ifelse(np >= 10, "✓", "✗"), "\\n")
##   np = 580 ✓ \n
cat("  n(1-p) =", n_1_p, ifelse(n_1_p >= 10, "✓", "✗"), "\\n\\n")
##   n(1-p) = 420 ✓ \n\n
if(np >= 10 & n_1_p >= 10) {
  cat("Condizioni soddisfatte! Possiamo procedere.\\n\\n")
  
  # Calcola IC
  se_p <- sqrt(phat * (1-phat) / n_sond)
  z_crit <- qnorm(0.975)
  marg_p <- z_crit * se_p
  ic_low_p <- phat - marg_p
  ic_up_p <- phat + marg_p
  
  cat("CALCOLO IC 95%:\\n")
  cat("  SE = √[p̂(1-p̂)/n] =", round(se_p, 4), "\\n")
  cat("  z* = qnorm(0.975) =", round(z_crit, 3), "\\n")
  cat("  Margine = z* × SE =", round(marg_p, 4), "\\n\\n")
  
  cat("IC 95%: [", round(ic_low_p*100, 2), "%,", 
      round(ic_up_p*100, 2), "%]\\n\\n")
  
  # Test significatività
  if(ic_low_p > 0.5) {
    cat("✓ Il SÌ vincerà! (IC tutto sopra 50%)\\n")
  } else if(ic_up_p < 0.5) {
    cat("✓ Il NO vincerà! (IC tutto sotto 50%)\\n")
  } else {
    cat("⚠ Risultato INCERTO (IC include 50%)\\n")
  }
} else {
  cat("✗ Condizioni NON soddisfatte!\\n")
}
## Condizioni soddisfatte! Possiamo procedere.\n\nCALCOLO IC 95%:\n  SE = √[p̂(1-p̂)/n] = 0.0156 \n  z* = qnorm(0.975) = 1.96 \n  Margine = z* × SE = 0.0306 \n\nIC 95%: [ 54.94 %, 61.06 %]\n\n✓ Il SÌ vincerà! (IC tutto sopra 50%)\n

Confronto Livelli di Confidenza

cat("=== CONFRONTO LIVELLI DI CONFIDENZA ===\\n\\n")
## === CONFRONTO LIVELLI DI CONFIDENZA ===\n\n
livelli <- c(0.90, 0.95, 0.99)
risultati <- data.frame()

for(conf in livelli) {
  alpha <- 1 - conf
  t_c <- qt(1 - alpha/2, df = df)
  marg <- t_c * se
  ic_l <- xbar - marg
  ic_u <- xbar + marg
  amp <- ic_u - ic_l
  
  risultati <- rbind(risultati, data.frame(
    Confidenza = paste0(conf*100, "%"),
    t_critico = round(t_c, 3),
    Margine = round(marg, 2),
    IC_Lower = round(ic_l, 1),
    IC_Upper = round(ic_u, 1),
    Ampiezza = round(amp, 2)
  ))
}

print(risultati, row.names = FALSE)
##  Confidenza t_critico Margine IC_Lower IC_Upper Ampiezza
##         90%     1.761    1.79    170.2    173.8     3.59
##         95%     2.145    2.19    169.8    174.2     4.37
##         99%     2.977    3.03    169.0    175.0     6.07
cat("\\nTRADE-OFF:\\n")
## \nTRADE-OFF:\n
cat("  Più confidenza → IC più ampio → meno preciso\\n")
##   Più confidenza → IC più ampio → meno preciso\n
cat("  Meno confidenza → IC più stretto → più rischioso\\n")
##   Meno confidenza → IC più stretto → più rischioso\n

PARTE 5: TEST DI IPOTESI

Logica del Test

Passi: 1. Formula ipotesi (H₀ e H₁) 2. Raccogli dati 3. Calcola statistica test 4. Calcola p-value 5. Decidi: rifiuta o non rifiuta H₀

Ipotesi: - H₀ (nulla): “Nessun effetto” o “Nessuna differenza” - H₁ (alternativa): “C'è un effetto” o “C'è una differenza”

p-value

Definizione: Probabilità di osservare dati così estremi (o più estremi), SE H₀ fosse vera.

Interpretazione: - p < 0.05: Rifiuta H₀ (risultato significativo) - p ≥ 0.05: Non rifiuta H₀

cat("=== INTERPRETAZIONE P-VALUE ===\\n\\n")
## === INTERPRETAZIONE P-VALUE ===\n\n
esempi <- data.frame(
  p_value = c(0.001, 0.02, 0.08, 0.35, 0.80),
  Interpretazione = c(
    "Forte evidenza contro H₀",
    "Evidenza significativa",
    "Evidenza debole",
    "Poca evidenza",
    "Nessuna evidenza"
  ),
  Decisione = c(
    "RIFIUTA H₀",
    "RIFIUTA H₀",
    "NON RIFIUTA H₀",
    "NON RIFIUTA H₀",
    "NON RIFIUTA H₀"
  )
)

print(esempi, row.names = FALSE)
##  p_value          Interpretazione      Decisione
##    0.001 Forte evidenza contro H₀     RIFIUTA H₀
##    0.020   Evidenza significativa     RIFIUTA H₀
##    0.080          Evidenza debole NON RIFIUTA H₀
##    0.350            Poca evidenza NON RIFIUTA H₀
##    0.800         Nessuna evidenza NON RIFIUTA H₀

One-Sample t-test

Quando: Confrontare media campione con valore ipotizzato

Ipotesi: - H₀: μ = μ₀ - H₁: μ ≠ μ₀ (a due code)

Statistica test: \[t = \\frac{\\bar{x} - \\mu_0}{s / \\sqrt{n}}\]

cat("=== ONE-SAMPLE T-TEST ===\\n\\n")
## === ONE-SAMPLE T-TEST ===\n\n
set.seed(42)
dati_test <- rnorm(20, 175, 8)

cat("DOMANDA: L\'altezza media è 170 cm?\\n\\n")
## DOMANDA: L'altezza media è 170 cm?\n\n
cat("IPOTESI:\\n")
## IPOTESI:\n
cat("  H₀: μ = 170\\n")
##   H₀: μ = 170\n
cat("  H₁: μ ≠ 170\\n")
##   H₁: μ ≠ 170\n
cat("  α = 0.05\\n\\n")
##   α = 0.05\n\n
# Statistiche
n_t <- length(dati_test)
xbar_t <- mean(dati_test)
s_t <- sd(dati_test)
se_t <- s_t / sqrt(n_t)

cat("DATI:\\n")
## DATI:\n
cat("  n =", n_t, "\\n")
##   n = 20 \n
cat("  x̄ =", round(xbar_t, 2), "\\n")
##   x̄ = 176.54 \n
cat("  s =", round(s_t, 2), "\\n")
##   s = 10.5 \n
cat("  SE =", round(se_t, 2), "\\n\\n")
##   SE = 2.35 \n\n
# Calcolo manuale
mu0 <- 170
t_stat <- (xbar_t - mu0) / se_t
df_t <- n_t - 1
p_val <- 2 * pt(-abs(t_stat), df = df_t)

cat("CALCOLO MANUALE:\\n")
## CALCOLO MANUALE:\n
cat("  t = (x̄ - μ₀) / SE\\n")
##   t = (x̄ - μ₀) / SE\n
cat("  t = (", round(xbar_t, 2), "- 170) /", round(se_t, 2), "\\n")
##   t = ( 176.54 - 170) / 2.35 \n
cat("  t =", round(t_stat, 3), "\\n")
##   t = 2.783 \n
cat("  df =", df_t, "\\n")
##   df = 19 \n
cat("  p-value =", format.pval(p_val, digits = 3), "\\n\\n")
##   p-value = 0.0118 \n\n
# Decisione
cat("DECISIONE:\\n")
## DECISIONE:\n
if(p_val < 0.05) {
  cat("  ✗ RIFIUTA H₀ (p < 0.05)\\n\\n")
  cat("CONCLUSIONE:\\n")
  cat("Ci sono prove significative che l\'altezza media\\n")
  cat("sia DIVERSA da 170 cm.\\n")
} else {
  cat("  ✓ NON RIFIUTA H₀ (p ≥ 0.05)\\n\\n")
  cat("CONCLUSIONE:\\n")
  cat("Non ci sono prove sufficienti per dire che\\n")
  cat("l\'altezza media sia diversa da 170 cm.\\n")
}
##   ✗ RIFIUTA H₀ (p < 0.05)\n\nCONCLUSIONE:\nCi sono prove significative che l'altezza media\nsia DIVERSA da 170 cm.\n
cat("\\nVERIFICA CON R:\\n")
## \nVERIFICA CON R:\n
t.test(dati_test, mu = 170)
## 
##  One Sample t-test
## 
## data:  dati_test
## t = 2.7833, df = 19, p-value = 0.01185
## alternative hypothesis: true mean is not equal to 170
## 95 percent confidence interval:
##  171.6207 181.4500
## sample estimates:
## mean of x 
##  176.5354

Two-Sample t-test

Quando: Confrontare medie di due gruppi indipendenti

Welch's t-test (raccomandato): Non assume varianze uguali

cat("=== TWO-SAMPLE T-TEST (WELCH) ===\\n\\n")
## === TWO-SAMPLE T-TEST (WELCH) ===\n\n
set.seed(42)
uomini <- rnorm(30, 178, 7)
donne <- rnorm(30, 165, 6)

cat("DOMANDA: Gli uomini sono più alti delle donne?\\n\\n")
## DOMANDA: Gli uomini sono più alti delle donne?\n\n
cat("IPOTESI:\\n")
## IPOTESI:\n
cat("  H₀: μ_uomini = μ_donne\\n")
##   H₀: μ_uomini = μ_donne\n
cat("  H₁: μ_uomini ≠ μ_donne\\n")
##   H₁: μ_uomini ≠ μ_donne\n
cat("  α = 0.05\\n\\n")
##   α = 0.05\n\n
cat("STATISTICHE:\\n")
## STATISTICHE:\n
cat("UOMINI:\\n")
## UOMINI:\n
cat("  n =", length(uomini), "\\n")
##   n = 30 \n
cat("  Media =", round(mean(uomini), 2), "cm\\n")
##   Media = 178.48 cm\n
cat("  SD =", round(sd(uomini), 2), "cm\\n\\n")
##   SD = 8.79 cm\n\n
cat("DONNE:\\n")
## DONNE:\n
cat("  n =", length(donne), "\\n")
##   n = 30 \n
cat("  Media =", round(mean(donne), 2), "cm\\n")
##   Media = 164.27 cm\n
cat("  SD =", round(sd(donne), 2), "cm\\n\\n")
##   SD = 6.3 cm\n\n
# Test
risultato_welch <- t.test(uomini, donne, var.equal = FALSE)
print(risultato_welch)
## 
##  Welch Two Sample t-test
## 
## data:  uomini and donne
## t = 7.2002, df = 52.59, p-value = 2.237e-09
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  10.25194 18.17118
## sample estimates:
## mean of x mean of y 
##  178.4801  164.2685
cat("\\n")
## \n
if(risultato_welch$p.value < 0.05) {
  cat("✗ RIFIUTA H₀\\n\\n")
  cat("CONCLUSIONE:\\n")
  cat("C\'è una differenza statisticamente significativa.\\n")
  cat("Gli uomini sono più alti delle donne.\\n")
} else {
  cat("✓ NON RIFIUTA H₀\\n\\n")
  cat("Non ci sono prove sufficienti di differenza.\\n")
}
## ✗ RIFIUTA H₀\n\nCONCLUSIONE:\nC'è una differenza statisticamente significativa.\nGli uomini sono più alti delle donne.\n
# Visualizza
df_alt <- data.frame(
  altezza = c(uomini, donne),
  sesso = rep(c("Uomini", "Donne"), c(30, 30))
)

ggplot(df_alt, aes(x = sesso, y = altezza, fill = sesso)) +
  geom_boxplot(alpha = 0.7) +
  stat_summary(fun = mean, geom = "point", 
               shape = 23, size = 4, fill = "red") +
  labs(title = "Altezza per Sesso",
       subtitle = paste("p-value =", round(risultato_welch$p.value, 4)),
       y = "Altezza (cm)") +
  theme_minimal() +
  theme(legend.position = "none")

Paired t-test

Quando: Misurazioni ripetute sugli stessi soggetti

cat("=== PAIRED T-TEST ===\\n\\n")
## === PAIRED T-TEST ===\n\n
set.seed(42)
prima <- rnorm(20, 85, 10)
dopo <- prima - rnorm(20, 5, 2)

cat("DOMANDA: La dieta ha effetto sul peso?\\n\\n")
## DOMANDA: La dieta ha effetto sul peso?\n\n
cat("IPOTESI:\\n")
## IPOTESI:\n
cat("  H₀: μ_differenza = 0 (nessun effetto)\\n")
##   H₀: μ_differenza = 0 (nessun effetto)\n
cat("  H₁: μ_differenza ≠ 0 (c\'è effetto)\\n")
##   H₁: μ_differenza ≠ 0 (c'è effetto)\n
cat("  α = 0.05\\n\\n")
##   α = 0.05\n\n
differenze <- prima - dopo

cat("STATISTICHE:\\n")
## STATISTICHE:\n
cat("  Peso medio PRIMA:", round(mean(prima), 2), "kg\\n")
##   Peso medio PRIMA: 86.92 kg\n
cat("  Peso medio DOPO:", round(mean(dopo), 2), "kg\\n")
##   Peso medio DOPO: 82.46 kg\n
cat("  Perdita media:", round(mean(differenze), 2), "kg\\n")
##   Perdita media: 4.46 kg\n
cat("  SD differenze:", round(sd(differenze), 2), "kg\\n\\n")
##   SD differenze: 2.22 kg\n\n
# Test
risultato_paired <- t.test(prima, dopo, paired = TRUE)
print(risultato_paired)
## 
##  Paired t-test
## 
## data:  prima and dopo
## t = 8.9834, df = 19, p-value = 2.874e-08
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
##  3.419348 5.496684
## sample estimates:
## mean difference 
##        4.458016
cat("\\n")
## \n
if(risultato_paired$p.value < 0.05) {
  cat("✗ RIFIUTA H₀\\n\\n")
  cat("CONCLUSIONE:\\n")
  cat("La dieta ha un effetto significativo.\\n")
  cat("Perdita media:", round(mean(differenze), 2), "kg.\\n")
} else {
  cat("✓ NON RIFIUTA H₀\\n\\n")
  cat("Non ci sono prove di effetto significativo.\\n")
}
## ✗ RIFIUTA H₀\n\nCONCLUSIONE:\nLa dieta ha un effetto significativo.\nPerdita media: 4.46 kg.\n
# Visualizza
df_paired <- data.frame(
  id = rep(1:20, 2),
  peso = c(prima, dopo),
  tempo = factor(rep(c("Prima", "Dopo"), each = 20), 
                 levels = c("Prima", "Dopo"))
)

ggplot(df_paired, aes(x = tempo, y = peso, fill = tempo)) +
  geom_boxplot(alpha = 0.7) +
  geom_line(aes(group = id), alpha = 0.3) +
  geom_point(alpha = 0.5) +
  labs(title = "Peso Prima e Dopo Dieta",
       subtitle = paste("p-value =", round(risultato_paired$p.value, 4)),
       y = "Peso (kg)") +
  theme_minimal() +
  theme(legend.position = "none")


PARTE 6: GRADI DI LIBERTÀ

Concetto

Definizione: Numero di valori liberi di variare dopo aver imposto vincoli

Esempio pratico:

cat("=== GRADI DI LIBERTÀ: ESEMPIO ===\\n\\n")
## === GRADI DI LIBERTÀ: ESEMPIO ===\n\n
n <- 5
media_fissa <- 10

cat("Hai", n, "numeri con media fissata =", media_fissa, "\\n\\n")
## Hai 5 numeri con media fissata = 10 \n\n
# Scelgo i primi 4 liberamente
numeri_liberi <- c(8, 12, 15, 6)

cat("Primi 4 numeri (LIBERI):\\n")
## Primi 4 numeri (LIBERI):\n
for(i in 1:4) {
  cat("  x", i, " = ", numeri_liberi[i], " ✓\\n", sep = "")
}
##   x1 = 8 ✓\n  x2 = 12 ✓\n  x3 = 15 ✓\n  x4 = 6 ✓\n
# L\'ultimo è vincolato
somma_necessaria <- media_fissa * n
ultimo <- somma_necessaria - sum(numeri_liberi)

cat("\\nUltimo numero (VINCOLATO):\\n")
## \nUltimo numero (VINCOLATO):\n
cat("  x5 =", ultimo, "✗ (non puoi sceglierlo!)\\n\\n")
##   x5 = 9 ✗ (non puoi sceglierlo!)\n\n
tutti <- c(numeri_liberi, ultimo)
cat("Verifica:\\n")
## Verifica:\n
cat("  Numeri:", paste(tutti, collapse = ", "), "\\n")
##   Numeri: 8, 12, 15, 6, 9 \n
cat("  Media:", mean(tutti), "(deve essere 10 ✓)\\n\\n")
##   Media: 10 (deve essere 10 ✓)\n\n
cat("┌────────────────────────────────┐\\n")
## ┌────────────────────────────────┐\n
cat("│ GRADI DI LIBERTÀ = 4           │\\n")
## │ GRADI DI LIBERTÀ = 4           │\n
cat("│ (4 liberi, 1 vincolato)        │\\n")
## │ (4 liberi, 1 vincolato)        │\n
cat("│ Formula: df = n - 1 = 5 - 1    │\\n")
## │ Formula: df = n - 1 = 5 - 1    │\n
cat("└────────────────────────────────┘\\n")
## └────────────────────────────────┘\n

df nei t-test

cat("=== GRADI DI LIBERTÀ NEI T-TEST ===\\n\\n")
## === GRADI DI LIBERTÀ NEI T-TEST ===\n\n
cat("ONE-SAMPLE T-TEST:\\n")
## ONE-SAMPLE T-TEST:\n
cat("  df = n - 1\\n")
##   df = n - 1\n
cat("  (1 vincolo: la media)\\n")
##   (1 vincolo: la media)\n
cat("  Esempio: n=20 → df=19\\n\\n")
##   Esempio: n=20 → df=19\n\n
cat("TWO-SAMPLE T-TEST (Student):\\n")
## TWO-SAMPLE T-TEST (Student):\n
cat("  df = n₁ + n₂ - 2\\n")
##   df = n₁ + n₂ - 2\n
cat("  (2 vincoli: 2 medie)\\n")
##   (2 vincoli: 2 medie)\n
cat("  Esempio: n₁=20, n₂=30 → df=48\\n\\n")
##   Esempio: n₁=20, n₂=30 → df=48\n\n
cat("TWO-SAMPLE T-TEST (Welch):\\n")
## TWO-SAMPLE T-TEST (Welch):\n
cat("  df = formula complessa (non intero)\\n")
##   df = formula complessa (non intero)\n
cat("  Pesa i gruppi per precisione\\n")
##   Pesa i gruppi per precisione\n
cat("  Esempio: df può essere 23.7\\n\\n")
##   Esempio: df può essere 23.7\n\n
cat("PAIRED T-TEST:\\n")
## PAIRED T-TEST:\n
cat("  df = n - 1\\n")
##   df = n - 1\n
cat("  (n = numero di coppie)\\n")
##   (n = numero di coppie)\n
cat("  Esempio: 15 coppie → df=14\\n")
##   Esempio: 15 coppie → df=14\n

Effetto dei df

cat("=== EFFETTO DEI df ===\\n\\n")
## === EFFETTO DEI df ===\n\n
df_vals <- c(1, 2, 5, 10, 20, 30, 50, 100, Inf)
t_vals <- qt(0.975, df = df_vals)

tab_df <- data.frame(
  df = c("1", "2", "5", "10", "20", "30", "50", "100", "∞"),
  t_critico = round(t_vals, 3),
  Effetto = c(
    "Molto ampio",
    "Molto ampio",
    "Ampio",
    "Moderato",
    "Piccolo",
    "Piccolo",
    "Minimo",
    "Minimo",
    "= z (1.96)"
  )
)

print(tab_df, row.names = FALSE)
##   df t_critico     Effetto
##    1    12.706 Molto ampio
##    2     4.303 Molto ampio
##    5     2.571       Ampio
##   10     2.228    Moderato
##   20     2.086     Piccolo
##   30     2.042     Piccolo
##   50     2.009      Minimo
##  100     1.984      Minimo
##    ∞     1.960  = z (1.96)
cat("\\nREGOLA:\\n")
## \nREGOLA:\n
cat("  df piccoli → t* grande → IC ampio (molta incertezza)\\n")
##   df piccoli → t* grande → IC ampio (molta incertezza)\n
cat("  df grandi → t* piccolo → IC stretto (poca incertezza)\\n")
##   df grandi → t* piccolo → IC stretto (poca incertezza)\n
cat("  df → ∞ → t converge a z = 1.96\\n")
##   df → ∞ → t converge a z = 1.96\n

PARTE 7: FUNZIONI DISTRIBUZIONI IN R

Famiglia di Funzioni

Ogni distribuzione in R ha 4 funzioni:

  • d*(): density - densità (PDF)
  • p*(): probability - probabilità cumulata (CDF)
  • q*(): quantile - quantili (inversa CDF)
  • r*(): random - genera numeri casuali
cat("=== FUNZIONI DISTRIBUZIONI ===\\n\\n")
## === FUNZIONI DISTRIBUZIONI ===\n\n
cat("Prefissi:\\n")
## Prefissi:\n
cat("  d = density (PDF)\\n")
##   d = density (PDF)\n
cat("  p = probability (CDF)\\n")
##   p = probability (CDF)\n
cat("  q = quantile (inversa CDF)\\n")
##   q = quantile (inversa CDF)\n
cat("  r = random (genera numeri)\\n\\n")
##   r = random (genera numeri)\n\n
cat("Distribuzioni principali:\\n")
## Distribuzioni principali:\n
cat("  norm   → Normale\\n")
##   norm   → Normale\n
cat("  t      → t di Student\\n")
##   t      → t di Student\n
cat("  chisq  → Chi-quadrato\\n")
##   chisq  → Chi-quadrato\n
cat("  f      → F di Fisher\\n")
##   f      → F di Fisher\n
cat("  binom  → Binomiale\\n")
##   binom  → Binomiale\n
cat("  pois   → Poisson\\n")
##   pois   → Poisson\n

dnorm() - Densità Normale

Uso: Calcolare l'altezza della curva normale in un punto

cat("=== dnorm() - DENSITÀ ===\\n\\n")
## === dnorm() - DENSITÀ ===\n\n
# dnorm(x, mean, sd)
cat("dnorm(0) =", round(dnorm(0), 4), "(altezza a x=0)\\n")
## dnorm(0) = 0.3989 (altezza a x=0)\n
cat("dnorm(1) =", round(dnorm(1), 4), "(altezza a x=1)\\n")
## dnorm(1) = 0.242 (altezza a x=1)\n
cat("dnorm(0, mean=5, sd=2) =", round(dnorm(0, 5, 2), 4), "\\n\\n")
## dnorm(0, mean=5, sd=2) = 0.0088 \n\n
# Grafico
x <- seq(-4, 4, 0.01)
plot(x, dnorm(x), type = "l", lwd = 2,
     main = "dnorm() - Densità Normale Standard",
     ylab = "Densità", xlab = "x")
abline(v = 0, col = "red", lty = 2)
points(0, dnorm(0), pch = 19, col = "red", cex = 2)
text(0.5, dnorm(0), paste("dnorm(0) =", round(dnorm(0), 3)), pos = 4)

pnorm() - Probabilità Cumulata

Uso: Calcolare P(X ≤ x)

cat("=== pnorm() - PROBABILITÀ CUMULATA ===\\n\\n")
## === pnorm() - PROBABILITÀ CUMULATA ===\n\n
# pnorm(q, mean, sd)
cat("pnorm(0) =", round(pnorm(0), 4), "(P(X ≤ 0) = 50%)\\n")
## pnorm(0) = 0.5 (P(X ≤ 0) = 50%)\n
cat("pnorm(1.96) =", round(pnorm(1.96), 4), "(P(X ≤ 1.96) = 97.5%)\\n")
## pnorm(1.96) = 0.975 (P(X ≤ 1.96) = 97.5%)\n
cat("pnorm(-1.96) =", round(pnorm(-1.96), 4), "(P(X ≤ -1.96) = 2.5%)\\n\\n")
## pnorm(-1.96) = 0.025 (P(X ≤ -1.96) = 2.5%)\n\n
# Area tra -1.96 e 1.96
area <- pnorm(1.96) - pnorm(-1.96)
cat("P(-1.96 < X < 1.96) =", round(area, 4), "(95%)\\n\\n")
## P(-1.96 < X < 1.96) = 0.95 (95%)\n\n
# Grafico
x <- seq(-4, 4, 0.01)
plot(x, pnorm(x), type = "l", lwd = 2,
     main = "pnorm() - CDF Normale Standard",
     ylab = "Probabilità Cumulata", xlab = "x")
abline(h = c(0.025, 0.5, 0.975), col = "red", lty = 2)
abline(v = c(-1.96, 0, 1.96), col = "blue", lty = 2)

qnorm() - Quantili

Uso: Inversa di pnorm(), trova x dato probabilità

cat("=== qnorm() - QUANTILI ===\\n\\n")
## === qnorm() - QUANTILI ===\n\n
# qnorm(p, mean, sd)
cat("qnorm(0.5) =", round(qnorm(0.5), 4), "(mediana)\\n")
## qnorm(0.5) = 0 (mediana)\n
cat("qnorm(0.975) =", round(qnorm(0.975), 4), "(valore critico IC 95%)\\n")
## qnorm(0.975) = 1.96 (valore critico IC 95%)\n
cat("qnorm(0.025) =", round(qnorm(0.025), 4), "\\n\\n")
## qnorm(0.025) = -1.96 \n\n
cat("USO PRINCIPALE: Trovare valori critici\\n")
## USO PRINCIPALE: Trovare valori critici\n
cat("  IC 90%: ±", round(qnorm(0.95), 3), "\\n")
##   IC 90%: ± 1.645 \n
cat("  IC 95%: ±", round(qnorm(0.975), 3), "\\n")
##   IC 95%: ± 1.96 \n
cat("  IC 99%: ±", round(qnorm(0.995), 3), "\\n")
##   IC 99%: ± 2.576 \n

rnorm() - Genera Numeri Casuali

Uso: Simulazioni, generare dati

cat("=== rnorm() - GENERA NUMERI ===\\n\\n")
## === rnorm() - GENERA NUMERI ===\n\n
set.seed(42)
# rnorm(n, mean, sd)
numeri <- rnorm(5, mean = 100, sd = 15)

cat("rnorm(5, mean=100, sd=15):\\n")
## rnorm(5, mean=100, sd=15):\n
cat("  ", paste(round(numeri, 2), collapse = ", "), "\\n\\n")
##    120.56, 91.53, 105.45, 109.49, 106.06 \n\n
# Genera campione grande
campione_grande <- rnorm(10000, 100, 15)
cat("rnorm(10000, 100, 15):\\n")
## rnorm(10000, 100, 15):\n
cat("  Media:", round(mean(campione_grande), 2), "(≈ 100)\\n")
##   Media: 99.83 (≈ 100)\n
cat("  SD:", round(sd(campione_grande), 2), "(≈ 15)\\n\\n")
##   SD: 15.09 (≈ 15)\n\n
# Istogramma
hist(campione_grande, breaks = 50, col = "lightblue",
     main = "10000 numeri da N(100, 15)",
     xlab = "Valore", freq = FALSE)
curve(dnorm(x, 100, 15), add = TRUE, col = "red", lwd = 2)

Funzioni t di Student

cat("=== FUNZIONI DISTRIBUZIONE t ===\\n\\n")
## === FUNZIONI DISTRIBUZIONE t ===\n\n
df_val <- 10

cat("dt(x, df) - densità:\\n")
## dt(x, df) - densità:\n
cat("  dt(0, df=10) =", round(dt(0, df_val), 4), "\\n\\n")
##   dt(0, df=10) = 0.3891 \n\n
cat("pt(q, df) - probabilità:\\n")
## pt(q, df) - probabilità:\n
cat("  pt(2, df=10) =", round(pt(2, df_val), 4), "\\n\\n")
##   pt(2, df=10) = 0.9633 \n\n
cat("qt(p, df) - quantili:\\n")
## qt(p, df) - quantili:\n
cat("  qt(0.975, df=10) =", round(qt(0.975, df_val), 3), "(valore critico)\\n\\n")
##   qt(0.975, df=10) = 2.228 (valore critico)\n\n
cat("rt(n, df) - genera numeri:\\n")
## rt(n, df) - genera numeri:\n
set.seed(42)
numeri_t <- rt(5, df_val)
cat("  rt(5, df=10):", paste(round(numeri_t, 2), collapse = ", "), "\\n\\n")
##   rt(5, df=10): 1.67, 0.07, -0.08, -0.07, -0.05 \n\n
# Confronto t vs normale
x <- seq(-4, 4, 0.01)
plot(x, dnorm(x), type = "l", lwd = 2, col = "black",
     main = "dt() vs dnorm()", ylab = "Densità")
lines(x, dt(x, df_val), col = "red", lwd = 2)
legend("topright", c("Normale", paste("t (df=", df_val, ")")),
       col = c("black", "red"), lwd = 2)


PARTE 8: ASSUNZIONI E ALTERNATIVE

Verifica Normalità

Test di Shapiro-Wilk:

  • H₀: dati provengono da distribuzione normale
  • H₁: dati NON normali
cat("=== TEST DI NORMALITÀ (SHAPIRO-WILK) ===\\n\\n")
## === TEST DI NORMALITÀ (SHAPIRO-WILK) ===\n\n
set.seed(42)
dati_norm <- rnorm(30, 100, 15)
dati_non_norm <- rexp(30, 0.1)

cat("DATI NORMALI:\\n")
## DATI NORMALI:\n
test_norm <- shapiro.test(dati_norm)
print(test_norm)
## 
##  Shapiro-Wilk normality test
## 
## data:  dati_norm
## W = 0.96209, p-value = 0.35
cat("\\n")
## \n
if(test_norm$p.value > 0.05) {
  cat("✓ p > 0.05 → Dati compatibili con normalità\\n\\n")
} else {
  cat("✗ p < 0.05 → Dati NON normali\\n\\n")
}
## ✓ p > 0.05 → Dati compatibili con normalità\n\n
cat("DATI NON NORMALI:\\n")
## DATI NON NORMALI:\n
test_non <- shapiro.test(dati_non_norm)
print(test_non)
## 
##  Shapiro-Wilk normality test
## 
## data:  dati_non_norm
## W = 0.60174, p-value = 7.664e-08
cat("\\n")
## \n
if(test_non$p.value > 0.05) {
  cat("✓ p > 0.05 → Dati compatibili con normalità\\n")
} else {
  cat("✗ p < 0.05 → Dati NON normali\\n")
}
## ✗ p < 0.05 → Dati NON normali\n
# Q-Q plots
par(mfrow = c(1, 2))
qqnorm(dati_norm, main = "Q-Q Plot: Dati Normali")
qqline(dati_norm, col = "red", lwd = 2)
qqnorm(dati_non_norm, main = "Q-Q Plot: Dati Non Normali")
qqline(dati_non_norm, col = "red", lwd = 2)

Test Non Parametrici

Quando dati non normali:

  • Wilcoxon Signed-Rank: alternativa a one-sample/paired
  • Mann-Whitney U: alternativa a two-sample
cat("=== TEST NON PARAMETRICI ===\\n\\n")
## === TEST NON PARAMETRICI ===\n\n
set.seed(42)
gruppo1 <- rexp(20, 0.1)
gruppo2 <- rexp(20, 0.15)

cat("Dati NON normali (esponenziali)\\n\\n")
## Dati NON normali (esponenziali)\n\n
cat("t-test (assume normalità):\\n")
## t-test (assume normalità):\n
t_res <- t.test(gruppo1, gruppo2)
cat("  p-value =", round(t_res$p.value, 4), "\\n\\n")
##   p-value = 0.5603 \n\n
cat("Mann-Whitney (NON parametrico):\\n")
## Mann-Whitney (NON parametrico):\n
w_res <- wilcox.test(gruppo1, gruppo2)
cat("  p-value =", round(w_res$p.value, 4), "\\n\\n")
##   p-value = 0.9893 \n\n
cat("Nota: Con dati non normali, usa test non parametrici!\\n")
## Nota: Con dati non normali, usa test non parametrici!\n

PARTE 9: EFFECT SIZE

Cohen's d

Formula: \[d = \\frac{|\\bar{x}_1 - \\bar{x}_2|}{s_{pooled}}\]

Interpretazione: - |d| < 0.2: trascurabile - 0.2 ≤ |d| < 0.5: piccolo - 0.5 ≤ |d| < 0.8: medio - |d| ≥ 0.8: grande

cat("=== EFFECT SIZE (COHEN\'S d) ===\\n\\n")
## === EFFECT SIZE (COHEN'S d) ===\n\n
# Funzione
cohen_d <- function(x1, x2) {
  n1 <- length(x1)
  n2 <- length(x2)
  s1 <- sd(x1)
  s2 <- sd(x2)
  
  # SD pooled
  s_pooled <- sqrt(((n1-1)*s1^2 + (n2-1)*s2^2) / (n1+n2-2))
  
  # Cohen\'s d
  d <- abs(mean(x1) - mean(x2)) / s_pooled
  return(d)
}

# Calcola
d_val <- cohen_d(uomini, donne)

cat("Confronto Uomini vs Donne:\\n")
## Confronto Uomini vs Donne:\n
cat("  Diff. medie:", round(abs(mean(uomini) - mean(donne)), 2), "cm\\n")
##   Diff. medie: 14.21 cm\n
cat("  Cohen\'s d:", round(d_val, 3), "\\n\\n")
##   Cohen's d: 1.859 \n\n
if(d_val < 0.2) {
  cat("Effetto: TRASCURABILE (< 0.2)\\n")
} else if(d_val < 0.5) {
  cat("Effetto: PICCOLO (0.2-0.5)\\n")
} else if(d_val < 0.8) {
  cat("Effetto: MEDIO (0.5-0.8)\\n")
} else {
  cat("Effetto: GRANDE (≥ 0.8)\\n")
}
## Effetto: GRANDE (≥ 0.8)\n
cat("\\nIMPORTANTE:\\n")
## \nIMPORTANTE:\n
cat("Un risultato può essere statisticamente significativo\\n")
## Un risultato può essere statisticamente significativo\n
cat("(p < 0.05) ma avere effect size piccolo (poco rilevante)!\\n")
## (p < 0.05) ma avere effect size piccolo (poco rilevante)!\n

RIASSUNTO FORMULE

cat("╔════════════════════════════════════════╗\\n")
## ╔════════════════════════════════════════╗\n
cat("║         FORMULE PRINCIPALI             ║\\n")
## ║         FORMULE PRINCIPALI             ║\n
cat("╚════════════════════════════════════════╝\\n\\n")
## ╚════════════════════════════════════════╝\n\n
cat("DESCRITTIVA:\\n")
## DESCRITTIVA:\n
cat("  Media: x̄ = Σx / n\\n")
##   Media: x̄ = Σx / n\n
cat("  Varianza: s² = Σ(x-x̄)² / (n-1)\\n")
##   Varianza: s² = Σ(x-x̄)² / (n-1)\n
cat("  Dev.Std: s = √s²\\n")
##   Dev.Std: s = √s²\n
cat("  CV: (s/x̄) × 100%\\n\\n")
##   CV: (s/x̄) × 100%\n\n
cat("INFERENZA:\\n")
## INFERENZA:\n
cat("  SE: s / √n\\n")
##   SE: s / √n\n
cat("  IC media: x̄ ± t* × SE\\n")
##   IC media: x̄ ± t* × SE\n
cat("  IC prop: p̂ ± z* × √[p̂(1-p̂)/n]\\n\\n")
##   IC prop: p̂ ± z* × √[p̂(1-p̂)/n]\n\n
cat("T-TEST:\\n")
## T-TEST:\n
cat("  t = (x̄ - μ₀) / SE\\n")
##   t = (x̄ - μ₀) / SE\n
cat("  df one-sample: n - 1\\n")
##   df one-sample: n - 1\n
cat("  df two-sample: n₁ + n₂ - 2\\n")
##   df two-sample: n₁ + n₂ - 2\n
cat("  df paired: n - 1\\n\\n")
##   df paired: n - 1\n\n
cat("FUNZIONI R:\\n")
## FUNZIONI R:\n
cat("  dnorm(x): densità\\n")
##   dnorm(x): densità\n
cat("  pnorm(q): prob. cumulata\\n")
##   pnorm(q): prob. cumulata\n
cat("  qnorm(p): quantile\\n")
##   qnorm(p): quantile\n
cat("  rnorm(n): genera numeri\\n")
##   rnorm(n): genera numeri\n

CHECKLIST ANALISI

cat("\\n✓ CHECKLIST COMPLETA ANALISI STATISTICA\\n")
## \n✓ CHECKLIST COMPLETA ANALISI STATISTICA\n
cat("══════════════════════════════════════════\\n\\n")
## ══════════════════════════════════════════\n\n
cat("1. ESPLORA DATI\\n")
## 1. ESPLORA DATI\n
cat("   □ summary()\\n")
##    □ summary()\n
cat("   □ Grafici (hist, boxplot)\\n")
##    □ Grafici (hist, boxplot)\n
cat("   □ Identifica outlier\\n\\n")
##    □ Identifica outlier\n\n
cat("2. VERIFICA ASSUNZIONI\\n")
## 2. VERIFICA ASSUNZIONI\n
cat("   □ Normalità (shapiro.test, Q-Q plot)\\n")
##    □ Normalità (shapiro.test, Q-Q plot)\n
cat("   □ Indipendenza\\n")
##    □ Indipendenza\n
cat("   □ Varianze simili (se two-sample)\\n\\n")
##    □ Varianze simili (se two-sample)\n\n
cat("3. SCEGLI TEST\\n")
## 3. SCEGLI TEST\n
cat("   □ 1 gruppo → one-sample t-test\\n")
##    □ 1 gruppo → one-sample t-test\n
cat("   □ 2 indipendenti → two-sample t-test\\n")
##    □ 2 indipendenti → two-sample t-test\n
cat("   □ 2 appaiati → paired t-test\\n")
##    □ 2 appaiati → paired t-test\n
cat("   □ Non normale → test non parametrico\\n\\n")
##    □ Non normale → test non parametrico\n\n
cat("4. FORMULA IPOTESI\\n")
## 4. FORMULA IPOTESI\n
cat("   □ H₀ chiara\\n")
##    □ H₀ chiara\n
cat("   □ H₁ chiara\\n")
##    □ H₁ chiara\n
cat("   □ α (es: 0.05)\\n\\n")
##    □ α (es: 0.05)\n\n
cat("5. ESEGUI TEST\\n")
## 5. ESEGUI TEST\n
cat("   □ t.test() in R\\n")
##    □ t.test() in R\n
cat("   □ Verifica parametri\\n\\n")
##    □ Verifica parametri\n\n
cat("6. INTERPRETA\\n")
## 6. INTERPRETA\n
cat("   □ p-value (significatività)\\n")
##    □ p-value (significatività)\n
cat("   □ IC (precisione)\\n")
##    □ IC (precisione)\n
cat("   □ Effect size (rilevanza)\\n")
##    □ Effect size (rilevanza)\n
cat("   □ Conclusione semplice\\n")
##    □ Conclusione semplice\n

FINE GUIDA

Documento completo con:

✓ Teoria completa
✓ Formule matematiche
✓ Spiegazioni dettagliate
✓ Codice R eseguibile
✓ Grafici e visualizzazioni
✓ Esempi pratici
✓ Funzioni dnorm, pnorm, qnorm, rnorm
✓ Tutti i test statistici
✓ Gradi di libertà spiegati
✓ Effect size
✓ Checklist completa

sessionInfo()
## R version 4.5.1 (2025-06-13)
## Platform: aarch64-apple-darwin20
## Running under: macOS Tahoe 26.0.1
## 
## Matrix products: default
## BLAS:   /Library/Frameworks/R.framework/Versions/4.5-arm64/Resources/lib/libRblas.0.dylib 
## LAPACK: /Library/Frameworks/R.framework/Versions/4.5-arm64/Resources/lib/libRlapack.dylib;  LAPACK version 3.12.1
## 
## locale:
## [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
## 
## time zone: Europe/Rome
## tzcode source: internal
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] patchwork_1.3.2 tidyr_1.3.1     dplyr_1.1.4     ggplot2_4.0.0  
## 
## loaded via a namespace (and not attached):
##  [1] Matrix_1.7-3       gtable_0.3.6       jsonlite_2.0.0     compiler_4.5.1    
##  [5] tidyselect_1.2.1   jquerylib_0.1.4    splines_4.5.1      scales_1.4.0      
##  [9] yaml_2.3.10        fastmap_1.2.0      lattice_0.22-7     R6_2.6.1          
## [13] labeling_0.4.3     generics_0.1.4     knitr_1.50         tibble_3.3.0      
## [17] bslib_0.9.0        pillar_1.11.1      RColorBrewer_1.1-3 rlang_1.1.6       
## [21] cachem_1.1.0       xfun_0.53          sass_0.4.10        S7_0.2.0          
## [25] cli_3.6.5          withr_3.0.2        magrittr_2.0.4     mgcv_1.9-3        
## [29] digest_0.6.37      grid_4.5.1         rstudioapi_0.17.1  lifecycle_1.0.4   
## [33] nlme_3.1-168       vctrs_0.6.5        evaluate_1.0.5     glue_1.8.0        
## [37] farver_2.1.2       rmarkdown_2.30     purrr_1.1.0        tools_4.5.1       
## [41] pkgconfig_2.0.3    htmltools_0.5.8.1

’, file = “Guida_Statistica_Completa.Rmd”)

cat(“✅ FILE COMPLETO CREATO!”) cat(“📄 Nome: Guida_Statistica_Completa.Rmd”) cat(“📂 Cartella:”, getwd(), “”) cat(“Per compilare:”) cat(“rmarkdown::render(‘Guida_Statistica_Completa.Rmd’)”) cat(“🎯 Include TUTTO:”) cat(” ✓ Teoria completa“) cat(” ✓ Funzioni dnorm, pnorm, qnorm, rnorm“) cat(” ✓ Tutti i test“) cat(” ✓ Gradi di libertà“) cat(” ✓ Codice eseguibile“)