Esercizi

Autore/Autrice

Paolo Bosetti

Data di Pubblicazione

11 ottobre 2025

Data di modifica

12 ottobre 2025

Sommario

Gli esercizi sono riportati di seguito, prima elencando le domande, poi (a fine documento), gli svolgimenti. I numeri delle domande della prima sezione corrispondeono ai numeri delle risposte nella seconda.

1 Domande

1.1 Test di Student

Si hanno due campioni da 9 e 12 elementi. Il primo ha i valori 12, 11.7, 9.7, 11, 12.5, 12.7, 9.9, 11.4, 9.2; il secondo 12.5, 15.1, 14.4, 12.5, 14.9, 14.4, 13.2, 11.2, 12.6, 14.8, 13.9, 11.9. Assumendo che i campioni abbiano la stessa varianza, effettuare un test di Student a due lati senza utilizzare la funzione t.test().

1.2 Potenza del test di Student

Consideriamo il secondo campione dell’esercizio precedente. Risulta \(\bar y_2 = 13.45\). Verificare con la funzione t.test() l’ipotesi che il valore atteso della popolazione d’origine sia diverso da \(\mu_2 = 12.7\). Dato che nella fattispecie risulta \(\bar y_2 > \mu_2\), effettuare anche un test a un lato e discutere il risultato in termini di potenza del test.

Qual è il valore minimo di \(\mu_2\) che ci porta a rigettare \(H_0\) con una probabilità d’errore minore del 1%?

2 Manipolazione dati

Considerare il dataset ggplot2::diamonds che riporta il prezzo di vendita di diamanti in funzione delle loro caratteristiche morfologiche.

Raggruppare la dimensione in carati (carat) in cinque gruppi di caratura. Costruire una tabella che riporti, per ciascun gruppo e per ciascuna categoria di taglio (cut), il minimo, il massimo e i tre quartili del prezzo di vendita, in colonne separate.

3 Risposte

3.1 Test di Student

c1 <- c(12, 11.7, 9.7, 11, 12.5, 12.7, 9.9, 11.4, 9.2)
c2 <- c(12.5, 15.1, 14.4, 12.5, 14.9, 14.4, 13.2, 11.2, 12.6, 14.8, 13.9, 11.9)

c1.m <- mean(c1)
c2.m <- mean(c2)
n1 <- length(c1)
n2 <- length(c2)
Sp <- sqrt(((n1-1)*var(c1) + (n2-1)*var(c2)) / (n1 + n2 -2))

t0 <- abs(c1.m - c2.m) / (Sp * sqrt(1/n1 + 1/n2))
p.value <- pt(t0, n1 + n2 -2, lower.tail=FALSE) * 2
cat(paste("t0:", t0, "\n"))
t0: 4.09946306243968 
cat(paste("p-value:", p.value))
p-value: 0.00061049441430277

Per verifica:

t.test(c1, c2, var.equal = TRUE)

    Two Sample t-test

data:  c1 and c2
t = -4.0995, df = 19, p-value = 0.0006105
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -3.516249 -1.139306
sample estimates:
mean of x mean of y 
 11.12222  13.45000 

3.2 Potenza del test di Student

A due lati:

t.test(c2, mu=12.7)

    One Sample t-test

data:  c2
t = 1.9921, df = 11, p-value = 0.07177
alternative hypothesis: true mean is not equal to 12.7
95 percent confidence interval:
 12.62136 14.27864
sample estimates:
mean of x 
    13.45 

A un lato:

(t <- t.test(c2, mu=12.7, alternative="greater", conf.level = 0.99))

    One Sample t-test

data:  c2
t = 1.9921, df = 11, p-value = 0.03588
alternative hypothesis: true mean is greater than 12.7
99 percent confidence interval:
 12.42668      Inf
sample estimates:
mean of x 
    13.45 

Adottando il test a un lato, il p-value risulta inferiore. Se ci fossimo dati una soglia per la probabilità di un falso positivo pari a \(\alpha=0.05\), in particolare, nel primo caso non avremmo potuto rigettare \(H_0\), mentre nel secondo sì.

Osservando l’intervallo di confidenza al 99%, valori di \(mu_2\) inferiori a 12.4266787 consentirebbero di rifiutare l’ipotesi nulla con una probabilità d’errore inferiore all’1%.

Nota

Provare a modificare il valore del parametro conf.level e osservare come l’unico risultato nell’output di t.test() è l’ampiezza dell’intervallo di confidenza.

3.3 Manipolazione dati

diamonds %>% 
  mutate(size = cut(carat, breaks = 5), .after=carat) %>% 
  select(size:clarity, price) %>% 
  group_by(size,cut) %>% 
  summarise(
    probs = seq(0, 100, length.out=5),
    price = quantile(price),
    .groups="keep"
  ) %>% 
  mutate(probs = paste0(probs, "%")) %>% 
  pivot_wider(names_from = probs, values_from = price) %>% 
  knitr::kable()
size cut 0% 25% 50% 75% 100%
(0.195,1.16] Fair 337 1715.00 2684.5 3785.25 10752
(0.195,1.16] Good 327 896.50 2258.0 4009.50 17499
(0.195,1.16] Very Good 336 773.00 1975.0 3937.00 18542
(0.195,1.16] Premium 326 882.00 1826.5 4033.00 18279
(0.195,1.16] Ideal 326 827.00 1389.0 2947.00 17590
(1.16,2.12] Fair 2336 5334.00 7388.0 10913.00 18574
(1.16,2.12] Good 3098 6686.50 8820.0 12236.00 18707
(1.16,2.12] Very Good 2774 6945.25 9526.0 12762.75 18818
(1.16,2.12] Premium 2360 6604.75 9384.5 12751.50 18795
(1.16,2.12] Ideal 3168 7155.50 9761.0 12735.50 18806
(2.12,3.09] Fair 5405 7069.00 12500.0 14975.00 18308
(2.12,3.09] Good 9068 13751.50 14613.5 16894.25 18788
(2.12,3.09] Very Good 6512 13782.00 15753.0 17161.00 18692
(2.12,3.09] Premium 6357 13717.00 15857.5 17262.75 18823
(2.12,3.09] Ideal 8709 14548.75 16427.0 17513.00 18791
(3.09,4.05] Fair 9823 10745.50 11668.0 13816.00 15964
(3.09,4.05] Very Good 15984 15984.00 15984.0 15984.00 15984
(3.09,4.05] Premium 12300 15223.00 15223.0 16193.00 18701
(3.09,4.05] Ideal 12545 12555.50 12566.0 12576.50 12587
(4.05,5.01] Fair 17329 17673.50 18018.0 18274.50 18531
Osservazioni
  • size:clarity: in dplyr è possibile selezionare più colonne dando un intervallo di nomi di colonne.
  • summarise() può dare un warning suggerendo di usare reframe: durante il corso e durante l’esame NON utilizzate reframe(), perché essendo sperimentale non ne è garantita la disponibilità sui PC usati per l’esame.
  • Quando le funzioni sommario utilizzate in summarise() ritornano più di un valore, il sommario riporta altrettante righe. In questo caso come sommario utilizziamo quantile(), che ritorna 5 valori, e otteniamo quindi i valori desiderati, sebbene in un’unica colonna. Aggiungiamo la colonna perc per avere le corrispondenti percentuali.
  • Ridistribuiamo poi i valori in colonne mediante pivot_wider().