Ricerca Sociale con R

Una wiki per l'analisi dei dati con R

Strumenti Utente

Strumenti Sito


r:test_statistici:shapiro-test

Test di Shapiro-Wilk (test di normalità)

Il test di Shapiro-Wilk è un test per la verifica della normalità, adatto in particolare per piccoli campioni, molto usato per validare gli assunti di normalità nell'Anova.

Nell'Anova, si presuppone che i residui del modello (cioè le differenze tra i valori osservati e quelli predetti) seguano una distribuzione normale con varianza costante. Se il test indica che i residui non sono normali (p-value basso), potrebbe essere necessario trasformare i dati o considerare tecniche non parametriche come il test di Kruskal-Wallis.

La logica del test

Il test assume che i dati provengano da un campione casuale (siano indipendenti), e si basa sulla statistica $W$,che mette a confronto la varianza della distribuzione osservata con quella che potremmo attenderci in caso di normalità.

$$W = \frac{\left(\sum a_i X_{(i)}\right)^2}{\sum (X_i - \bar{X})^2}$$

dove:

  • $X_{(i)}$ = valori del campione ordinati dal più piccolo al più grande; e
  • al numeratore, troviamo i dati ordinati pesati in base a coefficienti che dipendono dalla distribuzione normale ideale ($a_i X_{(i)}$);
  • al denominatore abbiamo la varianza osservata ($\sum (X_i - \bar{X})^2$).

La statistica $W$ può essere concettualmente vista come una misura della linearità della relazione, rappresentata nel Q-Q plot, fra i quantili ordinati del campione e quelli attesi di una distribuzione normale: più $W$ si avvicina a 1, più forte è l'evidenza a favore della normalità dei dati.

Il test non può essere applicato a campioni molto grandi (>3.000 casi), in quanto diventa molto sensibile anche a piccole deviazioni dalla normalità (in questo caso, R non lo calcola).

Il test in R

Con una variabile casuale non normale

Costruiamo una variabile casuale con la funzione runif() (vedi in Distribuzioni di probabilità) 1):

# variabile pseudocasuale con seme
set.seed(5)
X <- runif(n = 100,            # numero di osservazioni
           min = 2, max = 4)

Ed eseguo il test:

# shapiro test
shapiro.test(X)
## 	Shapiro-Wilk normality test
## 
## data:  X
## W = 0.9341, p-value = 8.57e-05

L'ipotesi nulla è che la distribuzione sia normale. Un p-value maggiore di 0,05 indica che i dati non si discostano significativamente dalla normalità. In questo caso, dobbiamo respingere l'ipotesi nulla.

La distribuzione si discosta significativamente dalla normalità (p = 0), come possiamo vedere anche dall'istogramma in Fig. 1.

# confronto con istogramma
hist(X)
Fig. 1: Distribuzione non normale

Con una variabile casuale normale

Costruiamo ora una variabile normale con rnorm() (Vedi: Le distribuzioni di probabilità in R):

set.seed(5)
Y <- rnorm(n = 100, 
           mean = 5, sd = 3)        # parametri della distribuzione normale
shapiro.test(Y)
## 
## 	Shapiro-Wilk normality test
## 
## data:  Y
## W = 0.98711, p-value = 0.445

Non si discosta significativamente dalla normalità.

hist(Y)
Fig. 2: Distribuzione normale

Script di esempio

E' possibile scaricare ed eseguire lo script dell'esempio:

nome_file.R
# variabile pseudocasuale con seme
set.seed(5)
X <- runif(n = min = 2, max = 4)
 
# shapiro test
shapiro.test(X)
 
# variabile normale
set.seed(5)
Y <- rnorm(n = 100, mean = 5, sd = 3)
 
shapiro.test(Y)
1)
Per la riproducibilità del codice, costruiamo una variabile pseudo-casuale a partire da un 'seme', con set.seed(), in modo che il risultato sia sempre lo stesso

Domande? Scrivimi

Messenger Telegram Email
r/test_statistici/shapiro-test.txt · Ultima modifica: 05/09/2025 16:49 da Agnese Vardanega