Test di Wilcoxon Signed-Rank: Guida Statistica con Esempi in Python e R

Cerca:

Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors

Wilcoxon Signed-Rank Test: Guida Pratica

Cos’è e Perché Serve

Il Wilcoxon Signed-Rank Test è il test non parametrico di riferimento quando devi confrontare due campioni accoppiati (paired) o misure ripetute sullo stesso soggetto, ma i dati violano le assunzioni di normalità richieste dal t-test dipendente. Sviluppato da Frank Wilcoxon nel 1945, è diventato uno strumento indispensabile nell’analisi dati moderna, specialmente in contesti A/B testing, healthcare e ottimizzazione e-commerce dove outlier e distribuzioni asimmetriche sono la norma.

A differenza del t-test, che confronta le medie, il Wilcoxon test confronta le mediane delle differenze tra coppie. Il suo vantaggio fondamentale è la robustezza: non assume che i dati seguano una distribuzione normale, ma sfrutta le magnitudini delle differenze (non solo i segni come il più semplice Sign Test), rendendolo più potente statisticamente.

Pubblicità

Le Assunzioni: Cosa Serve?

Per applicare il test correttamente, i dati devono soddisfare queste condizioni:

  • Osservazioni accoppiate: Ogni osservazione nel gruppo A deve avere una corrispondente nel gruppo B (stesso soggetto, stessa unità, stessa categoria).
  • Scala almeno ordinale: Le variabili devono essere misurabili su scala ordinale o continua. Non funziona con dati nominali puri.
  • Indipendenza tra coppie: Le differenze tra una coppia e l’altra devono essere indipendenti.
  • Simmetria delle differenze: La distribuzione delle differenze deve essere approssimativamente simmetrica attorno alla mediana. Questa è l’assunzione più trascurata e pericolosa: se le differenze sono fortemente asimmetriche, il test perde validità.
  • Dati random: Campionamento casuale dalla popolazione di riferimento.

Nota critica: il test non richiede la normalità delle differenze, ma richiede la simmetria. Se le differenze sono fortemente skewed, considera il Sign Test o una trasformazione dei dati.

Quando Usarlo: Decision Tree

La scelta tra t-test e Wilcoxon non deve essere “post-hoc” (decisa dopo aver guardato i dati), perché questo introduce bias e inflaziona l’errore di Tipo I. Segui questo flusso decisionale prima di raccogliere i dati:

I campioni sono accoppiati?
├── NO → Usa Mann-Whitney U (campioni indipendenti)
└── SI → Puoi quantificare la magnitudine delle differenze?
    ├── NO → Sign Test
    └── SI → Le differenze sono normali (n≥30 o test Shapiro-Wilk p>0.05)?
        ├── SI → Paired t-test (più potente)
        └── NO → Wilcoxon Signed-Rank Test
            → Verifica simmetria delle differenze!
                ├── Simmetriche → Procedi con Wilcoxon
                └── Asimmetriche → Trasforma o usa Sign Test

Regola d’oro : quando hai dubbi, specifica nel pre-analysis plan che userai il test non parametrico. È più conservativo e difendibile.

Come Funziona: La Meccanica

Il test opera in 5 passaggi:

  1. Calcola le differenze per ogni coppia: [math]D_i = X_{\text{after}} – X_{\text{before}}[/math]
  2. Escludi gli zero (differenze nulle non forniscono informazione sulla direzione del cambiamento)
  3. Ordina per magnitudine le differenze assolute [math]|D_i|[/math] e assegna i rank
  4. Ripristina i segni ai rank originali (positivi/negativi)
  5. Somma i rank positivi ([math]W^+[/math]) e negativi ([math]W^-[/math]). Il test statistico [math]W[/math] è il minore dei due.

Per campioni grandi ([math]n > 20[/math]), [math]W[/math] segue approssimativamente una distribuzione normale con:

[math]\displaystyle \begin{aligned}
Z &= \frac{ W^+ – \frac{n(n+1)}{4} }
{ \sqrt{ \frac{n(n+1)(2n+1)}{24} } }
\end{aligned}[/math]

Wilcoxon in 20 secondi: Quick Start Cheat Sheet

Quando usarlo: usa il test di Wilcoxon per dati accoppiati (paired) o misure ripetute quando la distribuzione delle differenze viola l’assunzione di normalità del t-test.

Controllo vitale: non basta che i dati non siano normali. La distribuzione dei delta deve essere circa simmetrica. Verifica sempre la skewness.

Regola chiave: il test esclude automaticamente le coppie con differenza pari a zero.

Regola operativa: se il numero di coppie efficaci è
n < 20, usa sempre il calcolo esatto
(method='exact' in Python o exact=TRUE in R). Evita l’approssimazione normale.

Cosa riportare nel report: in un’analisi production-ready non basta il p-value. Includi sempre:

  • Statistica W (o V)
  • p-value esatto
  • Mediana delle differenze (impatto business)
  • Skewness dei delta (controllo metodologico)

Esempi Pratici in Produzione

Esempio 1: E-commerce — Conversion Rate A/B Test (Paired Design)

Scenario: Un marketplace vuole testare una nuova UI per le pagine prodotto. Invece del classico A/B split randomizzato (che soffre di effetti stagionali e differenze tra categorie), usa un paired design: misura il conversion rate settimanale per le stesse 25 categorie di prodotto prima e dopo il redesign.

Perché Wilcoxon:

  • I conversion rate sono tipicamente right-skewed (alcune categorie outperformano sempre)
  • Outlier presenti (categorie premium con conversion 10x superiore)
  • [math]n=25[/math] (campione piccolo, difficile verificare normalità robustamente)

Dataset:

import pandas as pd

data = {
    'category': ['Electronics', 'Fashion', 'Home', 'Sports', 'Books', 
                 'Beauty', 'Toys', 'Auto', 'Garden', 'Food', ...],
    'conv_before': [2.1, 3.4, 1.8, 2.9, 4.2, 1.5, 3.1, 2.0, 1.9, 5.2],
    'conv_after':  [2.3, 3.8, 1.9, 3.1, 4.0, 1.7, 3.5, 2.2, 2.1, 5.0]
}

Implementazione Python (production-ready):

from scipy import stats
from scipy.stats import skew
import pandas as pd
import numpy as np

# 1. SOSTITUIAMO I PUNTINI CON DATI NUMERICI VERI
data = pd.DataFrame({
    'conv_before': [2.1, 2.5, 2.8, 3.2, 2.9, 2.4, 2.6, 3.1, 2.7, 3.0],
    'conv_after':  [2.4, 2.6, 2.7, 3.6, 3.3, 2.8, 2.9, 3.5, 3.1, 3.4]
})

# 2. Pre-analysis: verifica simmetria delle differenze
diff = np.array(data['conv_after']) - np.array(data['conv_before'])

# 3. Test di simmetria (approssimativo con skewness)
skewness = skew(diff)
print(f"Skewness delle differenze: {skewness:.2f}")

# 4. Wilcoxon Signed-Rank Test
statistic, p_value = stats.wilcoxon(
    data['conv_after'], 
    data['conv_before'],
    alternative='two-sided', 
    method='exact' if len(diff) <= 20 else 'approx'
)

# 5. Calcoli ausiliari per il report
median_diff = np.median(diff)
zero_diffs = sum(diff == 0)

# 6. Report completo
print(f"""
Wilcoxon Signed-Rank Test Results
=================================
Pairs analyzed:          {len(diff)}
Zero differences:        {zero_diffs} (esclusi dai ranghi base)
Test statistic (W):      {statistic}
P-value:                 {p_value:.4f}
Median difference:       {median_diff:.3f}%

Interpretation:
{'Significativo' if p_value < 0.05 else 'Non significativo'} al livello α=0.05
""")

Output 

Skewness delle differenze: -1.57

Wilcoxon Signed-Rank Test Results
=================================
Pairs analyzed:          10
Zero differences:        0 (esclusi dai ranghi base)
Test statistic (W):      1.0
P-value:                 0.0039
Median difference:       0.400%

Interpretation:
Significativo al livello α=0.05

Il test ha parlato, e ti sta dando un verdetto metodologico e di business molto chiaro.

Forse potrebbe interessarti anche:  Varianza Tra e Entro Gruppi: La Guida Pratica all'ANOVA per Decisioni Efficaci

Ecco l’analisi dei punti chiave, da mostrare direttamente nel tuo report:

1. La Skewness ([math]-1.57[/math]): La tua polizza assicurativa

Nel codice avevamo impostato una soglia di guardia a [math]\pm 1.5[/math]. Il tuo valore è [math]-1.57[/math], il che indica una distribuzione delle differenze asimmetrica, con una coda allungata verso sinistra.

Cosa significa:

C’è qualche categoria che ha subito un calo vistoso o che si comporta in modo radicalmente diverso dalle altre.

Il vantaggio del Wilcoxon: Questo valore ti dà matematicamente ragione. Se avessi usato un classico t-test accoppiato, quella skewness avrebbe violato l’assunzione di normalità delle differenze, invalidando (o rendendo fragile) il p-value. Il Wilcoxon ha digerito questa asimmetria senza battere ciglio.

2. Il P-value ([math]0.0039[/math]): Certezza statistica

Il p-value è straordinariamente basso ([math]0.39\%[/math], ben inferiore alla soglia critica di [math]0.05[/math]).

Cosa significa:

La probabilità che la differenza tra il “prima” e il “dopo” sia frutto del puro caso o del rumore di fondo dei dati è quasi zero. Puoi rigettare l’ipotesi nulla con estrema sicurezza: il cambiamento ha prodotto un effetto reale e sistematico.

3. La statistica [math]W[/math] ([math]1.0[/math]): Consistenza totale

Nelle tabelle del Wilcoxon per campioni piccoli ([math]n = 10[/math]), la statistica [math]W[/math] rappresenta la somma dei ranghi con il segno meno frequente. Un valore pari a [math]1.0[/math] è vicinissimo al minimo assoluto (che sarebbe [math]0[/math]).

Cosa significa:

Significa che quasi tutte le categorie si sono muovute nella stessa identica direzione (in questo caso, un aumento). Praticamente non ci sono state oscillazioni casuali dove una categoria sale e una scende: il miglioramento è stato corale e uniforme su quasi tutto il paniere.

4. La Mediana delle differenze ([math]0.400\%[/math]): L’impatto sul Business

Questo è il dato che devi portare al tavolo dei decisori aziendali. Poiché i dati sono asimmetrici, non usi la media.

Cosa significa:

L’intervento (che sia un cambio di UX, un nuovo algoritmo di raccomandazione o una campagna) ha garantito un incremento della conversione della categoria “tipica” pari a [math]0.40[/math] punti percentuali.

Il verdetto da inserire nel report

“L’analisi effettuata tramite Wilcoxon Signed-Rank Test (scelto per sovrastare la forte asimmetria delle differenze, [math]\text{skewness} = -1.57[/math]) evidenzia un incremento statisticamente altamente significativo della conversione ([math]p = 0.0039[/math]). L’impatto mediano sulle categorie è quantificabile in un [math]+0.400\%[/math] di tasso di conversione. L’effetto è strutturale e non guidato da fluttuazioni casuali ([math]W = 1.0[/math]).”

Esempio 2: Healthcare — Efficacia di un Farmaco (Before-After)

Studio clinico pilota su 8 pazienti ipertesi. La pressione sanguigna viene misurata prima del trattamento e dopo 8 settimane. I dati sono scarsi e non mostrano traiettorie gaussiane.

Paziente BP Before BP After Differenza ([math]D_i = \text{Before} – \text{After}[/math])
1 122 118 4
2 132 130 2
3 125 127 -2
4 127 127 0 (Escluso)
5 136 130 6
6 128 135 -7
7 131 124 7
8 129 126 3

Calcolo Manuale Corretto (Audit & Compliance):

Differenze estratte: [math][4, 2, -2, 6, -7, 7, 3][/math] (Escluso lo 0 del paziente 4. Rimangono [math]n = 7[/math] coppie).

Ordinamento dei valori assoluti: [math]2, 2, 3, 4, 6, 7, 7[/math].

Assegnazione dei ranghi con gestione dei pareggi (ties):

  • I due valori pari a [math]2[/math] occupano le posizioni 1 e 2 [math]\rightarrow[/math] rango medio [math]= \frac{1+2}{2} = 1.5[/math].
  • Il valore [math]3[/math] occupa la posizione 3 [math]\rightarrow[/math] rango [math]= 3[/math].
  • Il valore [math]4[/math] occupa la posizione 4 [math]\rightarrow[/math] rango [math]= 4[/math].
  • Il valore [math]6[/math] occupa la posizione 5 [math]\rightarrow[/math] rango [math]= 5[/math].
  • I due valori pari a [math]7[/math] occupano le posizioni 6 e 7 [math]\rightarrow[/math] rango medio [math]= \frac{6+7}{2} = 6.5[/math].

Riassegnazione dei segni ai ranghi: [math]+4, +1.5, -1.5, +5, -6.5, +6.5, +3[/math].

Somma dei ranghi positivi ([math]W^+[/math]): [math]4 + 1.5 + 5 + 6.5 + 3 = 20[/math].

Somma dei ranghi negativi ([math]W^-[/math]): [math]1.5 + 6.5 = 8[/math].

Statistica del test: [math]W = \min(20, 8) = 8[/math].

Per [math]n = 7[/math] con [math]\alpha = 0.05[/math] (bilaterale), il valore critico tabellare di Wilcoxon è 2. Poiché la nostra statistica calcolata [math]W = 8[/math] è maggiore del valore critico ([math]8 > 2[/math]), non possiamo rifiutare l’ipotesi nulla [math]H_0[/math]. Il farmaco non mostra un effetto statisticamente rilevante al 5%.

R Script per validazione clinica

# R Script per validazione clinica
library(stats)

bp_before <- c(122, 132, 125, 127, 136, 128, 131, 129)
bp_after  <- c(118, 130, 127, 127, 130, 135, 124, 126)

# Test principale esatto per campioni ridotti
result <- wilcox.test(
    bp_before, bp_after, 
    paired = TRUE,
    alternative = "two-sided",
    exact = TRUE,
    conf.int = TRUE,
    conf.level = 0.95
)

print(result)
# Output atteso: V = 20 (o V = 8 a seconda dei fattori), p-value = 0.3088

Analisi dell’Output:

1. Il Dilemma del Campione Ridotto e la Perdita dello Zero ([math]n = 7[/math])

Nel dataset iniziale avevi 8 pazienti. Tuttavia, l’output ti dice che le coppie effettivamente analizzate su cui si basa il test sono diventate 7.

Forse potrebbe interessarti anche:  Distribuzione di Poisson: Guida Completa per Analisi Dati e Marketing (con Esempi Pratici e Quando NON Usarla)

Cosa è successo:

Il paziente 4 aveva una pressione di 127 mmHg sia prima che dopo il trattamento ([math]\text{delta} = 0[/math]). Il test di Wilcoxon esclude per costrutto le differenze nulle, perché non danno informazioni sulla direzione del cambiamento.

L’impatto clinico/metodologico:

Nei contesti a basso volume di dati, perdere anche un solo pezzo di informazione è doloroso. Ridurre il campione da 8 a 7 riduce drasticamente il potere statistico del test. Se avessi avuto molti pazienti con differenza pari a zero, il Wilcoxon avrebbe perso totalmente senso, costringendoti a ripensare l’esperimento o a usare un approccio di bootstrap.

2. Il Valore di [math]W = 8[/math] (o [math]V = 20[/math]) e lo Spettro della Casualità

A seconda di come imposti l’ordine dei vettori nel software (Before – After oppure After – Before), la statistica del test rifletterà la somma dei ranghi positivi o di quelli negativi. Nel nostro calcolo manuale abbiamo ottenuto [math]W^+ = 20[/math] e [math]W^- = 8[/math]. La statistica finale del test è il valore minore, ovvero 8.

Cosa significa intuitivamente:

Se il farmaco avesse funzionato in modo miracoloso su tutti, quasi tutti i pazienti avrebbero registrato un calo vistoso della pressione. I ranghi negativi (pazienti in cui la pressione è salita o rimasta quasi invariata) sarebbero stati vicini allo zero, e la statistica [math]W[/math] sarebbe stata piccolissima (0, 1 o 2).

Il confronto con le tabelle:

Con [math]n = 7[/math] e un livello di significatività del 5% ([math]\alpha = 0.05[/math]), il valore critico tabellare di Wilcoxon è 2. Per rifiutare l’ipotesi nulla e dichiarare il farmaco efficace, la nostra statistica calcolata [math]W[/math] doveva essere minore o uguale al valore critico ([math]W \le 2[/math]). Poiché [math]8 > 2[/math], siamo nel pieno della zona di accettazione dell’ipotesi nulla. Il segnale è troppo debole e confuso con il rumore di fondo.

3. Il [math]p[/math]-value a [math]0.3088[/math]: Nessuna Rilevanza Statistica

Il [math]p[/math]-value risultante è del 30.88%, una percentuale sideralmente lontana dalla fatidica soglia del 5% ([math]0.05[/math]).

Cosa significa:

C’è quasi il 31% di probabilità di osservare una distribuzione dei ranghi come questa (o ancora più bilanciata) a causa del puro e semplice caso, supponendo che il farmaco sia acqua fresca.

La trappola da evitare:

Un data scientist junior guardando i dati grezzi potrebbe dire: “Beh, su 8 pazienti, ben 5 hanno visto scendere la pressione, uno è rimasto stabile e solo 2 sono peggiorati. Il farmaco sembra promettente!”. Il [math]p[/math]-value smonta questa lettura ottimistica: con un campione così piccolo, quella proporzione (5 su 8) non è matematicamente distinguibile da un lancio di moneta non truccata.

4. La Presenza dei Legami (Ties) e l’Uso del Test Esatto

L’esercizio mostra una forte presenza di pareggi (ties) nei valori assoluti delle differenze:

  • Due pazienti hanno una differenza assoluta di [math]2[/math] (pazienti 2 e 3).
  • Due pazienti hanno una differenza assoluta di [math]7[/math] (pazienti 6 e 7).

Perché è interessante:

Quando ci sono dei pareggi, il test non può assegnare ranghi unici, quindi calcola la media delle posizioni (es. il rango [math]1.5[/math] e il rango [math]6.5[/math]). Se avessi usato l’approssimazione alla normale (il calcolo dello Z-score standard), la presenza di così tanti ties su un campione piccolo avrebbe distorto pesantemente la varianza, restituendo un [math]p[/math]-value falsato.

Ecco perché nello script in R è stato esplicitamente impostato exact = TRUE. Quando [math]n < 20[/math], dire al software di calcolare il p-value esatto combinatorio (e non tramite approssimazione) è l’unica polizza assicurativa per avere un dato algoritmico paranoico e corretto.

Il Verdetto Finale da presentare al Direttore Medico

“Il trial pilota condotto su 8 pazienti non fornisce alcuna evidenza statistica a supporto dell’efficacia del farmaco nel ridurre la pressione arteriosa ([math]p = 0.3088[/math]). Sebbene si noti un calo pressorio nominale in 5 soggetti su 8, la dimensione ridotta del campione efficace ([math]n=7[/math], a causa dell’esclusione di un paziente senza variazioni) e il bilanciamento dei ranghi ([math]W = 8[/math] contro un valore critico di [math]2[/math]) indicano che l’effetto osservato è statisticamente indistinguibile dalle fluttuazioni casuali. Raccomandazione: Non procedere alla Fase II del trial con questo dosaggio, a meno di non ridisegnare lo studio ampliando drasticamente il campione per intercettare un eventuale effect size più ridotto.”

Esempio 3: ML Ops — Latenza API Before/After Ottimizzazione

Scenario: Il team DevOps ha ottimizzato il backend. Vuole verificare se la latenza p95 è migliorata per gli stessi endpoint, misurata su 50 chiamate identiche.

Forse potrebbe interessarti anche:  La Distribuzione F di Fisher e l'Analisi della Varianza (ANOVA)

Dataset:

latency_before = [145, 132, 189, 201, 156, 134, 178, 165, 190, 155]  # ms
latency_after  = [138, 128, 175, 195, 148, 130, 170, 160, 182, 149]

Implementazione con controllo qualità:

from scipy.stats import wilcoxon, shapiro
import numpy as np

diff = np.array(latency_after) - np.array(latency_before)

# QC Step 1: Verifica simmetria (non normalità!)
_, p_shapiro = shapiro(diff)
print(f"Shapiro-Wilk p-value: {p_shapiro:.3f} (irrilevante per Wilcoxon)")

# QC Step 2: Verifica percentuale di zero e ties
zero_count = np.sum(diff == 0)
ties_pct = len(diff) - len(np.unique(np.abs(diff)))
print(f"Zero differences: {zero_count} ({zero_count/len(diff)*100:.1f}%)")
print(f"Tied ranks: {ties_pct} ({ties_pct/len(diff)*100:.1f}%)")
# Alert se >20% zero o ties eccessivi

# Test con continuity correction per n>20
stat, p = wilcoxon(
    latency_after, 
    latency_before,
    alternative='less',  # ipotesi direzionale: after < before
    zero_method='wilcox',  # esclude zero (standard)
    correction=True  # continuity correction per normal approx
)

# Effect size (rank-biserial correlation)
n = len(diff[diff != 0])
z = (stat - n*(n+1)/4) / np.sqrt(n*(n+1)*(2*n+1)/24)
r_effect = z / np.sqrt(n)

print(f"""
Wilcoxon Results (Latency Optimization)
=======================================
Statistic W:      {stat}
P-value:          {p:.4f}
Effect size r:    {r_effect:.3f}
Interpretation:   {'Small' if abs(r_effect) < 0.3 else 'Medium' if abs(r_effect) < 0.5 else 'Large'} effect
""")
Shapiro-Wilk p-value: 0.042 (irrilevante per Wilcoxon)
Zero differences: 0 (0.0%)
Tied ranks: 4 (40.0%)

Wilcoxon Results (Latency Optimization)
=======================================
Statistic W:      0.0
P-value:          0.0010
Effect size r:    -0.886
Interpretation:   Large effect

Questo output è il sogno di ogni ingegnere del software o DevOps:

i dati dicono che l’ottimizzazione non ha solo funzionato, ma ha letteralmente polverizzato la latenza precedente con una consistenza impeccabile.

Ecco cosa raccontano questi numeri:

1. Validazione Metodologica (I controlli preliminari)

Shapiro-Wilk p-value ([math]0.042[/math]): Essendo [math]p < 0.05[/math], l’ipotesi di normalità dei residui viene respinta. Le differenze di latenza non seguono una curva gaussiana. Questo dato giustifica matematicamente il rifiuto del t-test accoppiato a favore del Wilcoxon. Usare il t-test qui avrebbe esposto l’analisi a falsi positivi/negativi a causa della distorsione della varianza.

Tied Ranks ([math]40.0\%[/math]): Questo è l’unico elemento a cui prestare attenzione nel codice. Hai 4 differenze che hanno lo stesso identico valore assoluto (es. due categorie che hanno perso entrambe esattamente 5ms). Un valore del [math]40\%[/math] è alto per un campione piccolo ([math]n=10[/math]).

⚠️ Nota: La formula che abbiamo usato per calcolare manualmente lo Z-score (e quindi l’Effect Size [math]r[/math]) è quella standard:

[math]\sigma_W = \sqrt{\frac{n(n+1)(2n+1)}{24}}[/math]

Tuttavia, quando ci sono così tanti ties (legami), la varianza andrebbe corretta al denominatore sottraendo un fattore legato ai gruppi di ranghi uguali. Nel nostro caso specifico l’effetto è così schiacciante che la correzione cambierebbe solo la seconda cifra decimale, ma in casi più ambigui potrebbe alterare il risultato.

2. Il Verdetto Statistico (I parametri del test)

Statistic [math]W[/math] ([math]0.0[/math]): Questo è il dato più clamoroso. La statistica [math]W[/math] nel test di Wilcoxon ad una coda (alternative=’less’) è la somma dei ranghi positivi (casi in cui la latenza dopo l’ottimizzazione è risultata maggiore di quella precedente). Un valore pari a [math]0.0[/math] significa che in tutte e 10 le misurazioni la latenza dopo è stata inferiore a quella prima. Non c’è stata una singola eccezione o regressione.

P-value ([math]0.0010[/math]): C’è solo lo [math]0.1\%[/math] di probabilità che questo risultato sia dovuto al caso o al rumore di fondo del sistema. Il risultato è altamente significativo.

3. L’Impatto Reale (L’ampiezza dell’effetto)

Effect Size [math]r[/math] ([math]-0.886[/math]): La correlazione rango-biseriale si muove tra [math]-1[/math] e [math]1[/math]. Un valore di [math]-0.886[/math] indica un effetto negativo (negativo è un bene qui, perché parliamo di riduzione di latenza) estremamente potente.

Interpretazione (Large effect): Non si tratta di un’ottimizzazione marginale che “pulisce” il grafico solo grazie alla statistica. È una modifica strutturale che ha spostato l’intera distribuzione delle performance verso il basso.

Il testo da copiare nel report esecutivo

“L’analisi statistica condotta tramite test non parametrico di Wilcoxon (scelto a causa della non-normalità dei delta di performance, Shapiro-Wilk [math]p = 0.042[/math]) conferma l’efficacia del processo di ottimizzazione della latenza ([math]p = 0.0010[/math]).

Il test evidenzia una consistenza del [math]100\%[/math] sul campione esaminato ([math]W = 0.0[/math]), indicando che ogni singolo scenario ha registrato un miglioramento dei tempi di risposta. L’ampiezza dell’effetto è da considerarsi eccezionale (Rank-Biserial [math]r = -0.886[/math]), certificando un impatto massivo e strutturale sulle performance del sistema.”

Hai compreso il funzionamento del Wilcoxon. Ma sai usarlo correttamente in produzione?

Conoscere la formula e ottenere un p-value significativo non basta. Nella pratica professionale molti errori derivano da scelte metodologiche sbagliate: campioni non realmente accoppiati, gestione scorretta degli outlier, interpretazioni eccessive dei risultati o utilizzo improprio di test unilaterali.

Nella pagina seguente vedremo le migliori pratiche adottate da data scientist, ricercatori e analisti per utilizzare il Wilcoxon Signed-Rank Test in modo rigoroso, evitando gli errori più comuni che possono compromettere la validità delle conclusioni.👇🏻​

Pubblicità