Il Test del Segno, un metodo non parametrico con Python

Il Test del Segno è un metodo non parametrico utilizzato per confrontare due campioni correlati o per verificare se la mediana di una popolazione differisce da un valore specifico. È particolarmente utile quando i dati non soddisfano i presupposti necessari per i test parametrici, come la normalità della distribuzione.

Test del segno header

Caratteristiche Principali del Test del Segno

Il Test del Segno è applicabile a dati ordinali o a dati intervallo/rapporto che non soddisfano i presupposti parametrici. Viene utilizzato per confrontare due campioni dipendenti, cioè campioni in cui le osservazioni sono appaiate o correlate in qualche modo.

Ipotesi di Base:

  • Ipotesi Nulla (H₀): La mediana della popolazione differenza è zero (non c’è differenza tra le medie dei due campioni).
  • Ipotesi Alternativa (H₁): La mediana della popolazione differenza non è zero (c’è una differenza tra le medie dei due campioni).

Procedura:

  1. Determinare le Differenze: Calcolare le differenze tra le coppie di osservazioni correlate.
  2. Ignorare gli Zeri: Scartare le differenze pari a zero, poiché non contribuiscono al test.
  3. Conteggio dei Segni: Contare il numero di differenze positive e negative.
  4. Calcolare la Statistica del Test: La statistica del test è il numero minore tra il conteggio delle differenze positive e quello delle differenze negative.
  5. Determinare il Valore P: Utilizzare la distribuzione binomiale per calcolare il valore p, poiché le differenze positive e negative seguono una distribuzione binomiale con parametro p = 0.5 sotto l’ipotesi nulla.

Esempio del Test del Segno

Immaginiamo di avere due serie di dati correlati, (A) e (B):

Coppia(A)(B)Differenza ((D = B – A))
157+2
232-1
3660
4810+2
543-1

Step 1: Calcolare le differenze:

(+2, -1, 0, +2, -1)

Step 2: Ignorare gli zeri:

(+2, -1, +2, -1)

Step 3: Contare i segni:

Differenze positive: 2

Differenze negative: 2

Step 4: Calcolare la statistica del test:

La statistica del test è il numero minore tra 2 e 2, quindi 2.

Step 5: Determinare il valore p:

Con (n = 4) (numero di coppie non nulle), la distribuzione binomiale con (p = 0.5) ci permette di calcolare il valore p per il conteggio osservato.

Interpretazione

Se il valore p calcolato è inferiore al livello di significatività prescelto (ad esempio, 0.05), rifiutiamo l’ipotesi nulla e concludiamo che c’è una differenza significativa tra i due campioni. Se il valore p è maggiore del livello di significatività, non rifiutiamo l’ipotesi nulla.

Vantaggi e Limiti del Test del Segno

Vantaggi:

  • Semplice da eseguire e interpretare.
  • Non richiede presupposti di distribuzione.

Limiti:

  • Meno potente rispetto ai test parametrici equivalenti.
  • Può perdere informazioni poiché considera solo la direzione delle differenze e non la loro magnitudine.

Il Test del Segno è quindi uno strumento utile in situazioni in cui i dati non sono normalmente distribuiti o quando si lavora con dati ordinali.

Esempio con Python

Possiamo sviluppare l’esempio del Test del Segno con Python utilizzando la libreria scipy.stats. Ecco il codice:

import numpy as np
from scipy.stats import binom

# Data of paired samples
A = np.array([5, 3, 6, 8, 4])
B = np.array([7, 2, 6, 10, 3])

# Calculate the differences
D = B - A

# Ignore zero differences
D_non_zero = D[D != 0]

# Count the number of positive and negative differences
num_positive = np.sum(D_non_zero > 0)
num_negative = np.sum(D_non_zero < 0)

# The test statistic is the smaller number between num_positive and num_negative
test_statistic = min(num_positive, num_negative)

# Total number of non-zero differences
n = len(D_non_zero)

# Calculate the p-value using the binomial distribution
p_value = 2 * binom.cdf(test_statistic, n, 0.5)  # multiplied by 2 for the two-tailed test

# Results
print("Number of positive differences:", num_positive)
print("Number of negative differences:", num_negative)
print("Test statistic:", test_statistic)
print("p-value:", p_value)

Quando eseguiamo questo codice, otteniamo i risultati per il nostro esempio:

Number of positive differences: 2
Number of negative differences: 2
Test statistic: 2
p-value: 1.375
  • Numero di differenze positive: Sono le differenze (B – A) maggiori di zero (qui: 2).
  • Numero di differenze negative: Sono le differenze (B – A) minori di zero (qui: 2).
  • Statistica del test: È il numero minore tra i conteggi delle differenze positive e negative (qui: 2).
  • Valore p: È calcolato utilizzando la distribuzione binomiale e moltiplicato per 2 per tenere conto di un test bilaterale (qui: 1.0).

Dato che il valore p è molto maggiore del livello di significatività comune (ad esempio, 0.05), non possiamo rifiutare l’ipotesi nulla. Quindi, non c’è evidenza statistica per affermare che ci sia una differenza significativa tra le mediane dei due campioni.

Esempio più Complesso del Test del Segno

Possiamo sviluppare un esempio più complesso del Test del Segno con Python utilizzando un set di dati più ampio. Immaginiamo di avere i dati relativi a un esperimento con due condizioni, misurati in due momenti diversi, per un campione più grande. Vediamo come applicare il Test del Segno in questo contesto.

Immaginiamo di avere i seguenti dati per 20 partecipanti:

  • Prima del trattamento (A): [85, 89, 88, 77, 91, 84, 79, 82, 78, 85, 90, 87, 88, 83, 80, 76, 89, 84, 86, 78]
  • Dopo il trattamento (B): [88, 90, 90, 79, 94, 85, 82, 84, 81, 87, 92, 89, 90, 85, 83, 79, 92, 86, 88, 80]

A questo punto effettuiamo le seguenti operazioni:

  1. Calcoliamo le differenze tra le due condizioni.
  2. Ignoriamo le differenze pari a zero.
  3. Contiamo il numero di differenze positive e negative.
  4. Calcoliamo la statistica del test e il valore p usando la distribuzione binomiale.

Ecco il codice per eseguire il Test del Segno su questo esempio:

import numpy as np
from scipy.stats import binom

# Data of paired samples
A = np.array([85, 89, 88, 77, 91, 84, 79, 82, 78, 85, 90, 87, 88, 83, 80, 76, 89, 84, 86, 78])
B = np.array([88, 90, 90, 79, 94, 85, 82, 84, 81, 87, 92, 89, 90, 85, 83, 79, 92, 86, 88, 80])

# Calculate the differences
D = B - A

# Ignore zero differences
D_non_zero = D[D != 0]

# Count the number of positive and negative differences
num_positive = np.sum(D_non_zero > 0)
num_negative = np.sum(D_non_zero < 0)

# The test statistic is the smaller number between num_positive and num_negative
test_statistic = min(num_positive, num_negative)

# Total number of non-zero differences
n = len(D_non_zero)

# Calculate the p-value using the binomial distribution
p_value = 2 * binom.cdf(test_statistic, n, 0.5)  # multiplied by 2 for the two-tailed test

# Results
print("Number of positive differences:", num_positive)
print("Number of negative differences:", num_negative)
print("Test statistic:", test_statistic)
print("p-value:", p_value)

Quando eseguiamo questo codice, otteniamo i risultati per il nostro esempio:

Number of positive differences: 20
Number of negative differences: 0
Test statistic: 0
p-value: 1.9073486328125e-06

Dato che il valore p (0.000002) è inferiore al livello di significatività comune (0.05), possiamo rifiutare l’ipotesi nulla. Quindi, c’è evidenza statistica per affermare che c’è una differenza significativa tra le mediane dei due campioni, suggerendo che il trattamento ha avuto un effetto significativo.

Lascia un commento