Easy way to perform Wilcoxon signed-rank test with Python.


The Wilcoxon signed-rank test is often also called non-parametric t-test. The word “non-parametric” in this case means that you know the population data does not have a normal distribution.

Wilcoxon signed-rank test features:
-Nonparametric alternative to the one- or two-samples t-test.
-Mainly used when the data do not conform to the normality assumptions.
-Tests for differences in medians instead of differences in means because mediand insensitive to outliers.

There are two slightly different versions of the test used:
- The Wilcoxon signed rank test compares your sample median against a hypothetical median.
- The Wilcoxon matched-pairs signed rank test computes the difference between each set of matched pairs, then follows the same procedure as the signed rank test to compare the sample against some median.



Generating initial data for Wilcoxon signed-rank test:



import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as stats

## generate the data

N = 30

data1 = np.random.poisson(1.4,N)
data2 = np.random.poisson(1,N)

colors = 'kr'
for i in range(N):
    plt.plot([data1[i], data2[i]],[i, i],colors[int(data1[i]<=data2[i])])

plt.plot(data1,np.arange(N),'ks',markerfacecolor='k',label='data1')
plt.plot(data2,np.arange(N),'ro',markerfacecolor='r',label='data2')

plt.ylabel('Data index')
plt.xlabel('Data value') 
plt.legend()

plt.show()

Generating initial data for Wilcoxon signed-rank test

Wilcoxon signed-rank test using the Python scipy library:



t,p = stats.wilcoxon(data1,data2)
print('Wilcoxon z=%g, p=%g'%(t,p))

OUT: Wilcoxon z=74, p=0.046319



See also related topics: