if (!requireNamespace(“patchwork”, quietly = TRUE)) { install.packages(“patchwork”, repos = “https://cloud.r-project.org”) }
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 —
La statistica è la scienza che raccoglie, organizza, analizza e interpreta dati per fare inferenze su popolazioni.
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: Insieme completo di tutti gli elementi
Campione: Sottoinsieme della popolazione
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
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
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
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
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
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
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
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
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
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
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
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
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
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()
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
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)
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()
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"
)
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
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)
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
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
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
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
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
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”
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₀
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
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")
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")
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
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
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
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
casualicat("=== 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
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)
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)
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
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)
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)
Test di Shapiro-Wilk:
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)
Quando dati non normali:
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
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
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
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
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“)