---
title: Nonparametric statistics
date: 2025-06-11T16:49:18Z
modified: 2026-07-20T19:30:28Z
permalink: "https://www.micheledpierri.com/statistics/nonparametric-statistics/"
type: page
status: publish
excerpt: ""
wpid: 1367
featured_image: "https://www.micheledpierri.com/wp-content/uploads/2026/07/st_non_parametric_.png"
featured_image_alt: A young boy builds a structure with wooden blocks in a modest early 20th-century hospital room, surrounded by numbered cubes and illuminated by warm sunlight.
timestamp: 2026-07-20T19:30:28Z
tags: []
---

## Introduction

Nonparametric statistics is a branch of statistics that does not make strong assumptions about the underlying population distribution of data.

Unlike parametric statistics, which typically assume data follows a specific distribution (most commonly the normal distribution), nonparametric methods do not have such requirements.

Parametric tests get their name because they rely on parameters that describe a known distribution (like how mean and variance characterize a normal distribution). Using these tests can produce inaccurate results when the distribution is unknown or when dealing with asymmetric data, outliers, or categorical variables.

Therefore, nonparametric methods are particularly useful in cases where:

- the data distribution is unknown or non-normal
- the sample sizes are small
- the data is ordinal or categorical rather than numerical

Common nonparametric methods include:

- ranks
- counts and proportions
- sign tests
- permutation tests
- bootstrap methods
- order statistics

## Ranks and ties

### The ranks

A rank refers to the **position** of a number within an **ordered** list.

First, arrange the numbers in ascending order to generate ranks from a list. The rank of each number is its position in this ordered list.

Here’s an example with this list:

\[3, 5, 2, 8, 4\]

In ascending order:

\[2, 3, 4, 5, 8\]

Now we assign ranks to each value:

2 → rank 1

3 → rank 2

4 → rank 3

5 → rank 4

8 → rank 5

So in our original list \[3, 5, 2, 8, 4\], the corresponding ranks are \[2, 4, 1, 5, 3\]

### The ties

A challenge occurs when the list contains identical numbers, known as ties.

For example, in the following list, there is a tie:

\[3, 5, 2, 5, 4\]

When we order it we have:

\[2, 3, 4, 5, 5\]

In the transformation to ranks:

2 —> rank 1

3 —> rank 2

4 —> rank 3

5 —> ?

5 —> ?

In these cases, several methods can be used to assign rank values to ties:

- Average: this is the most common. Ties receive an average rank; in this example, each value of 5 will have a rank of 4.5 (4+5/2) where 4 and 5 are the rank values in the positions occupied by the tied values. Therefore, the final rank will be \[2, 4.5, 1, 4.5, 3\].
- Minimum: ties receive the lowest rank value
- Maximum: ties receive the highest rank value
- Dense: no gaps between ties
- Sequential: simply orders them following the index

Python has a useful function to transform a list into ranks: rankdata.

Below we use this function to illustrate how ranks work.

from scipy.stats import rankdata import pandas as pd # Eamples datasets = { “Values without ties”: \[1, 2, 3, 4, 5\], “Values with simple ties”: \[1, 2, 2, 3, 4\], “Values with multiple ties”: \[4, 4, 4, 2, 2\], “Values with dense repetition”: \[5, 5, 6, 6, 6, 7\] } # Calculate ranks with different methods methods = \[“average”, “min”, “max”, “dense”, “ordinal”\] rows = \[\] for name, values in datasets.items(): for method in methods: ranks = rankdata(values, method=method) rows.append({ “Dataset”: name, “Method”: method, “Values”: values, “Ranks”: ranks.tolist() }) # Convert to DataFrame for display rank\_df = pd.DataFrame(rows) print(rank\_df)```
<span class="line"><span style="color: #FF79C6">from</span><span style="color: #F8F8F2"> scipy.stats </span><span style="color: #FF79C6">import</span><span style="color: #F8F8F2"> rankdata</span></span>
<span class="line"><span style="color: #FF79C6">import</span><span style="color: #F8F8F2"> pandas </span><span style="color: #FF79C6">as</span><span style="color: #F8F8F2"> pd</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6272A4"># Eamples</span></span>
<span class="line"><span style="color: #F8F8F2">datasets </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> {</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">Values without ties</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">: [</span><span style="color: #BD93F9">1</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">2</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">3</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">4</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">5</span><span style="color: #F8F8F2">],</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">Values with simple ties</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">: [</span><span style="color: #BD93F9">1</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">2</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">2</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">3</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">4</span><span style="color: #F8F8F2">],</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">Values with multiple ties</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">: [</span><span style="color: #BD93F9">4</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">4</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">4</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">2</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">2</span><span style="color: #F8F8F2">],</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">Values with dense repetition</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">: [</span><span style="color: #BD93F9">5</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">5</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">6</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">6</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">6</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">7</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #F8F8F2">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6272A4"># Calculate ranks with different methods</span></span>
<span class="line"><span style="color: #F8F8F2">methods </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> [</span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">average</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">, </span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">min</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">, </span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">max</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">, </span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">dense</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">, </span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">ordinal</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #F8F8F2">rows </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> []</span></span>
<span class="line"></span>
<span class="line"><span style="color: #FF79C6">for</span><span style="color: #F8F8F2"> name, values </span><span style="color: #FF79C6">in</span><span style="color: #F8F8F2"> datasets.items():</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">for</span><span style="color: #F8F8F2"> method </span><span style="color: #FF79C6">in</span><span style="color: #F8F8F2"> methods:</span></span>
<span class="line"><span style="color: #F8F8F2">        ranks </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> rankdata(values, </span><span style="color: #FFB86C; font-style: italic">method</span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2">method)</span></span>
<span class="line"><span style="color: #F8F8F2">        rows.append({</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">Dataset</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">: name,</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">Method</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">: method,</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">Values</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">: values,</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">Ranks</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">: ranks.tolist()</span></span>
<span class="line"><span style="color: #F8F8F2">        })</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6272A4"># Convert to DataFrame for display</span></span>
<span class="line"><span style="color: #F8F8F2">rank_df </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> pd.DataFrame(rows)</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(rank_df)</span></span>
```

### Usefulness of Ranks

Ranks offer several key advantages:

- They are resistant to outliers
- They don’t require known distributions since they work with relative positions rather than distributions
- They enable comparisons between datasets with different scales
- They remain consistent even after data transformations

## Counts

A count represents how many times a specific event occurs within a dataset.

For example, when evaluating a drug’s effectiveness in a patient group, counts tell us how many patients recovered versus how many did not.

Counts are useful for constructing contingency tables:



| Therapy | Recovered | Not Recovered |
| --- | --- | --- |
| Treatment A | 30 | 10 |
| Treatment B | 20 | 40 |

Additionally, counts can be used to construct distributions of categorical variables.

Finally, they are used in the chi-square test to verify if observed frequencies differ from expected ones.

## Proportions

A proportion is a value between 0 and 1 that represents what fraction of a sample has a particular characteristic.

For example, if 20 patients out of 100 test positive on a diagnostic test, the proportion is 20/100 = 0.2.

Proportions are useful for comparing percentages between groups, estimating probabilities, and conducting hypothesis tests based on proportion data

## Sign test

The sign test is simpler than the rank test since it only examines whether differences between pairs are positive or negative, disregarding the size of these differences.

## Permutation test

This test evaluates whether two samples come from the same distribution by comparing statistics after random shuffling of the data.

## Bootstrap method

This method simulates the sampling process multiple times by drawing new observations from the original sample, either with or without replacement. This enables group comparisons and calculations of p-values and confidence intervals.

## Order statistics

These are statistical measures derived from the relative positions of data points when arranged in ascending order. Order statistics include fundamental descriptive measures like the minimum (smallest value), maximum (largest value), median (middle value), and quartiles (values that divide the ordered dataset into four equal parts). These statistics are particularly valuable because they provide insights about the data’s distribution and spread without making assumptions about its underlying probability distribution. For example, the median is more robust to outliers than the mean, making it especially useful when dealing with skewed data or datasets containing extreme values.

## Applications of nonparametric statistics

The main commonly applied nonparametric tests are:



| Kind of data | Test |
| --- | --- |
| Two independent groups | Mann-Whitney U test |
| Paired measurements | Wilcoxon signed-rank test |
| More than two groups | Kruskal-Wallis H test |
| Relationship between ordinal variables | Spearman’s rank correlation |
| Ordinal variables more than two groups | Friedman test |
| Relationship between nominal data or frequencies | Chi-square test |

## Python for nonparametric statistics

Python’s nonparametric tests are implemented in the scipy.stats library.

### Mann-Whitney U test for two independent groups

\# mann\_whitney\_test.py import numpy as np from scipy.stats import mannwhitneyu # Simulated data: two independent groups (e.g. two treatments) group\_A = np.array(\[120, 130, 125, 118, 135\]) group\_B = np.array(\[110, 115, 112, 108, 120\]) # Mann–Whitney U test (two-sided by default) statistic, p\_value = mannwhitneyu(group\_A, group\_B, alternative=’two-sided’) # Output print(“=== Mann–Whitney U Test ===”) print(f”Group A: {group\_A}”) print(f”Group B: {group\_B}”) print(f”U statistic = {statistic}”) print(f”p-value = {p\_value:.4f}”) # Simple interpretation alpha = 0.05 if p\_value < alpha: print(“→ Significant difference between groups (reject H0)”) else: print(“→ No significant difference (fail to reject H0)”) ```
<span class="line"><span style="color: #6272A4"># mann_whitney_test.py</span></span>
<span class="line"><span style="color: #FF79C6">import</span><span style="color: #F8F8F2"> numpy </span><span style="color: #FF79C6">as</span><span style="color: #F8F8F2"> np</span></span>
<span class="line"><span style="color: #FF79C6">from</span><span style="color: #F8F8F2"> scipy.stats </span><span style="color: #FF79C6">import</span><span style="color: #F8F8F2"> mannwhitneyu</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6272A4"># Simulated data: two independent groups (e.g. two treatments)</span></span>
<span class="line"><span style="color: #F8F8F2">group_A </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> np.array([</span><span style="color: #BD93F9">120</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">130</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">125</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">118</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">135</span><span style="color: #F8F8F2">])</span></span>
<span class="line"><span style="color: #F8F8F2">group_B </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> np.array([</span><span style="color: #BD93F9">110</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">115</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">112</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">108</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">120</span><span style="color: #F8F8F2">])</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6272A4"># Mann–Whitney U test (two-sided by default)</span></span>
<span class="line"><span style="color: #F8F8F2">statistic, p_value </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> mannwhitneyu(group_A, group_B, </span><span style="color: #FFB86C; font-style: italic">alternative</span><span style="color: #FF79C6">=</span><span style="color: #E9F284">'</span><span style="color: #F1FA8C">two-sided</span><span style="color: #E9F284">'</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6272A4"># Output</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">=== Mann–Whitney U Test ===</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #FF79C6">f</span><span style="color: #F1FA8C">"Group A: </span><span style="color: #BD93F9">{</span><span style="color: #F8F8F2">group_A</span><span style="color: #BD93F9">}</span><span style="color: #F1FA8C">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #FF79C6">f</span><span style="color: #F1FA8C">"Group B: </span><span style="color: #BD93F9">{</span><span style="color: #F8F8F2">group_B</span><span style="color: #BD93F9">}</span><span style="color: #F1FA8C">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #FF79C6">f</span><span style="color: #F1FA8C">"U statistic = </span><span style="color: #BD93F9">{</span><span style="color: #F8F8F2">statistic</span><span style="color: #BD93F9">}</span><span style="color: #F1FA8C">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #FF79C6">f</span><span style="color: #F1FA8C">"p-value = </span><span style="color: #BD93F9">{</span><span style="color: #F8F8F2">p_value</span><span style="color: #FF79C6">:.4f</span><span style="color: #BD93F9">}</span><span style="color: #F1FA8C">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6272A4"># Simple interpretation</span></span>
<span class="line"><span style="color: #F8F8F2">alpha </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">0.05</span></span>
<span class="line"><span style="color: #FF79C6">if</span><span style="color: #F8F8F2"> p_value </span><span style="color: #FF79C6"><</span><span style="color: #F8F8F2"> alpha:</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">→ Significant difference between groups (reject H0)</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #FF79C6">else</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">→ No significant difference (fail to reject H0)</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
```

### Wilcoxon signed-rank test for paired measurements

\# wilcoxon\_test.py import numpy as np from scipy.stats import wilcoxon # Simulated paired data (e.g. before and after treatment) before = np.array(\[140, 135, 142, 138, 145\]) after = np.array(\[132, 130, 138, 135, 139\]) # Perform the Wilcoxon signed-rank test (two-sided by default) statistic, p\_value = wilcoxon(before, after, alternative=’two-sided’) # Output results print(“=== Wilcoxon Signed-Rank Test ===”) print(f”Before: {before}”) print(f”After: {after}”) print(f”W statistic = {statistic}”) print(f”p-value = {p\_value:.4f}”) # Simple interpretation alpha = 0.05 if p\_value < alpha: print(“→ Significant difference between paired observations (reject H0)”) else: print(“→ No significant difference (fail to reject H0)”) ```
<span class="line"><span style="color: #6272A4"># wilcoxon_test.py</span></span>
<span class="line"><span style="color: #FF79C6">import</span><span style="color: #F8F8F2"> numpy </span><span style="color: #FF79C6">as</span><span style="color: #F8F8F2"> np</span></span>
<span class="line"><span style="color: #FF79C6">from</span><span style="color: #F8F8F2"> scipy.stats </span><span style="color: #FF79C6">import</span><span style="color: #F8F8F2"> wilcoxon</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6272A4"># Simulated paired data (e.g. before and after treatment)</span></span>
<span class="line"><span style="color: #F8F8F2">before </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> np.array([</span><span style="color: #BD93F9">140</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">135</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">142</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">138</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">145</span><span style="color: #F8F8F2">])</span></span>
<span class="line"><span style="color: #F8F8F2">after </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> np.array([</span><span style="color: #BD93F9">132</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">130</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">138</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">135</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">139</span><span style="color: #F8F8F2">])</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6272A4"># Perform the Wilcoxon signed-rank test (two-sided by default)</span></span>
<span class="line"><span style="color: #F8F8F2">statistic, p_value </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> wilcoxon(before, after, </span><span style="color: #FFB86C; font-style: italic">alternative</span><span style="color: #FF79C6">=</span><span style="color: #E9F284">'</span><span style="color: #F1FA8C">two-sided</span><span style="color: #E9F284">'</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6272A4"># Output results</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">=== Wilcoxon Signed-Rank Test ===</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #FF79C6">f</span><span style="color: #F1FA8C">"Before: </span><span style="color: #BD93F9">{</span><span style="color: #F8F8F2">before</span><span style="color: #BD93F9">}</span><span style="color: #F1FA8C">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #FF79C6">f</span><span style="color: #F1FA8C">"After:  </span><span style="color: #BD93F9">{</span><span style="color: #F8F8F2">after</span><span style="color: #BD93F9">}</span><span style="color: #F1FA8C">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #FF79C6">f</span><span style="color: #F1FA8C">"W statistic = </span><span style="color: #BD93F9">{</span><span style="color: #F8F8F2">statistic</span><span style="color: #BD93F9">}</span><span style="color: #F1FA8C">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #FF79C6">f</span><span style="color: #F1FA8C">"p-value = </span><span style="color: #BD93F9">{</span><span style="color: #F8F8F2">p_value</span><span style="color: #FF79C6">:.4f</span><span style="color: #BD93F9">}</span><span style="color: #F1FA8C">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6272A4"># Simple interpretation</span></span>
<span class="line"><span style="color: #F8F8F2">alpha </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">0.05</span></span>
<span class="line"><span style="color: #FF79C6">if</span><span style="color: #F8F8F2"> p_value </span><span style="color: #FF79C6"><</span><span style="color: #F8F8F2"> alpha:</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">→ Significant difference between paired observations (reject H0)</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #FF79C6">else</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">→ No significant difference (fail to reject H0)</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"></span>
```

### Kruskal-Wallis H test for comparing more than two groups

\# kruskal\_wallis\_test.py import numpy as np from scipy.stats import kruskal # Simulated data: three independent groups (e.g. three treatment types) group\_A = np.array(\[88, 90, 85, 87, 89\]) group\_B = np.array(\[78, 75, 80, 77, 76\]) group\_C = np.array(\[92, 94, 95, 91, 93\]) # Perform the Kruskal–Wallis H test statistic, p\_value = kruskal(group\_A, group\_B, group\_C) # Output results print(“=== Kruskal–Wallis H Test ===”) print(f”Group A: {group\_A}”) print(f”Group B: {group\_B}”) print(f”Group C: {group\_C}”) print(f”H statistic = {statistic:.4f}”) print(f”p-value = {p\_value:.4f}”) # Simple interpretation alpha = 0.05 if p\_value < alpha: print(“→ At least one group differs significantly (reject H0)”) else: print(“→ No significant differences between the groups (fail to reject H0)”) ```
<span class="line"><span style="color: #6272A4"># kruskal_wallis_test.py</span></span>
<span class="line"><span style="color: #FF79C6">import</span><span style="color: #F8F8F2"> numpy </span><span style="color: #FF79C6">as</span><span style="color: #F8F8F2"> np</span></span>
<span class="line"><span style="color: #FF79C6">from</span><span style="color: #F8F8F2"> scipy.stats </span><span style="color: #FF79C6">import</span><span style="color: #F8F8F2"> kruskal</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6272A4"># Simulated data: three independent groups (e.g. three treatment types)</span></span>
<span class="line"><span style="color: #F8F8F2">group_A </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> np.array([</span><span style="color: #BD93F9">88</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">90</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">85</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">87</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">89</span><span style="color: #F8F8F2">])</span></span>
<span class="line"><span style="color: #F8F8F2">group_B </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> np.array([</span><span style="color: #BD93F9">78</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">75</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">80</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">77</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">76</span><span style="color: #F8F8F2">])</span></span>
<span class="line"><span style="color: #F8F8F2">group_C </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> np.array([</span><span style="color: #BD93F9">92</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">94</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">95</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">91</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">93</span><span style="color: #F8F8F2">])</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6272A4"># Perform the Kruskal–Wallis H test</span></span>
<span class="line"><span style="color: #F8F8F2">statistic, p_value </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> kruskal(group_A, group_B, group_C)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6272A4"># Output results</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">=== Kruskal–Wallis H Test ===</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #FF79C6">f</span><span style="color: #F1FA8C">"Group A: </span><span style="color: #BD93F9">{</span><span style="color: #F8F8F2">group_A</span><span style="color: #BD93F9">}</span><span style="color: #F1FA8C">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #FF79C6">f</span><span style="color: #F1FA8C">"Group B: </span><span style="color: #BD93F9">{</span><span style="color: #F8F8F2">group_B</span><span style="color: #BD93F9">}</span><span style="color: #F1FA8C">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #FF79C6">f</span><span style="color: #F1FA8C">"Group C: </span><span style="color: #BD93F9">{</span><span style="color: #F8F8F2">group_C</span><span style="color: #BD93F9">}</span><span style="color: #F1FA8C">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #FF79C6">f</span><span style="color: #F1FA8C">"H statistic = </span><span style="color: #BD93F9">{</span><span style="color: #F8F8F2">statistic</span><span style="color: #FF79C6">:.4f</span><span style="color: #BD93F9">}</span><span style="color: #F1FA8C">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #FF79C6">f</span><span style="color: #F1FA8C">"p-value = </span><span style="color: #BD93F9">{</span><span style="color: #F8F8F2">p_value</span><span style="color: #FF79C6">:.4f</span><span style="color: #BD93F9">}</span><span style="color: #F1FA8C">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6272A4"># Simple interpretation</span></span>
<span class="line"><span style="color: #F8F8F2">alpha </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">0.05</span></span>
<span class="line"><span style="color: #FF79C6">if</span><span style="color: #F8F8F2"> p_value </span><span style="color: #FF79C6"><</span><span style="color: #F8F8F2"> alpha:</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">→ At least one group differs significantly (reject H0)</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #FF79C6">else</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">→ No significant differences between the groups (fail to reject H0)</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"></span>
```

### Spearman’s rank correlation for relationships between ordinal variables

\# spearman\_correlation.py import numpy as np from scipy.stats import spearmanr # Simulated data: e.g. clinical scores and biomarker levels # (can be ordinal, non-normal, or monotonic) scores = np.array(\[78, 85, 90, 95, 88, 70, 75, 80, 92, 87\]) biomarker = np.array(\[0.42, 0.50, 0.55, 0.60, 0.52, 0.40, 0.45, 0.48, 0.58, 0.53\]) # Perform Spearman’s rank correlation test correlation, p\_value = spearmanr(scores, biomarker) # Output results print(“=== Spearman Rank Correlation ===”) print(f”Scores: {scores}”) print(f”Biomarker: {biomarker}”) print(f”Spearman’s rho = {correlation:.4f}”) print(f”p-value = {p\_value:.4f}”) # Simple interpretation alpha = 0.05 if p\_value < alpha: print(“→ Significant monotonic correlation (reject H0)”) else: print(“→ No significant monotonic correlation (fail to reject H0)”) ```
<span class="line"><span style="color: #6272A4"># spearman_correlation.py</span></span>
<span class="line"><span style="color: #FF79C6">import</span><span style="color: #F8F8F2"> numpy </span><span style="color: #FF79C6">as</span><span style="color: #F8F8F2"> np</span></span>
<span class="line"><span style="color: #FF79C6">from</span><span style="color: #F8F8F2"> scipy.stats </span><span style="color: #FF79C6">import</span><span style="color: #F8F8F2"> spearmanr</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6272A4"># Simulated data: e.g. clinical scores and biomarker levels</span></span>
<span class="line"><span style="color: #6272A4"># (can be ordinal, non-normal, or monotonic)</span></span>
<span class="line"><span style="color: #F8F8F2">scores </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> np.array([</span><span style="color: #BD93F9">78</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">85</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">90</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">95</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">88</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">70</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">75</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">80</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">92</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">87</span><span style="color: #F8F8F2">])</span></span>
<span class="line"><span style="color: #F8F8F2">biomarker </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> np.array([</span><span style="color: #BD93F9">0.42</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">0.50</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">0.55</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">0.60</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">0.52</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">0.40</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">0.45</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">0.48</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">0.58</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">0.53</span><span style="color: #F8F8F2">])</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6272A4"># Perform Spearman's rank correlation test</span></span>
<span class="line"><span style="color: #F8F8F2">correlation, p_value </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> spearmanr(scores, biomarker)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6272A4"># Output results</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">=== Spearman Rank Correlation ===</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #FF79C6">f</span><span style="color: #F1FA8C">"Scores:    </span><span style="color: #BD93F9">{</span><span style="color: #F8F8F2">scores</span><span style="color: #BD93F9">}</span><span style="color: #F1FA8C">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #FF79C6">f</span><span style="color: #F1FA8C">"Biomarker: </span><span style="color: #BD93F9">{</span><span style="color: #F8F8F2">biomarker</span><span style="color: #BD93F9">}</span><span style="color: #F1FA8C">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #FF79C6">f</span><span style="color: #F1FA8C">"Spearman’s rho = </span><span style="color: #BD93F9">{</span><span style="color: #F8F8F2">correlation</span><span style="color: #FF79C6">:.4f</span><span style="color: #BD93F9">}</span><span style="color: #F1FA8C">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #FF79C6">f</span><span style="color: #F1FA8C">"p-value = </span><span style="color: #BD93F9">{</span><span style="color: #F8F8F2">p_value</span><span style="color: #FF79C6">:.4f</span><span style="color: #BD93F9">}</span><span style="color: #F1FA8C">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6272A4"># Simple interpretation</span></span>
<span class="line"><span style="color: #F8F8F2">alpha </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">0.05</span></span>
<span class="line"><span style="color: #FF79C6">if</span><span style="color: #F8F8F2"> p_value </span><span style="color: #FF79C6"><</span><span style="color: #F8F8F2"> alpha:</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">→ Significant monotonic correlation (reject H0)</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #FF79C6">else</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">→ No significant monotonic correlation (fail to reject H0)</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"></span>
```

### Fiedman test for relationship between more than two ordinal variables

\# friedman\_test.py import numpy as np from scipy.stats import friedmanchisquare # Simulated repeated measures data (e.g. VAS pain scores for 3 treatments on same patients) # Each row = one subject; each column = one treatment condition scores = np.array(\[ \[6, 5, 4\], \[7, 6, 5\], \[5, 4, 3\], \[8, 7, 6\], \[6, 6, 5\], \[7, 5, 5\], \[6, 4, 4\], \[5, 5, 4\], \[7, 6, 5\], \[6, 5, 4\] \]) # Unpack columns to pass to friedmanchisquare treatment1 = scores\[:, 0\] treatment2 = scores\[:, 1\] treatment3 = scores\[:, 2\] # Perform Friedman test statistic, p\_value = friedmanchisquare(treatment1, treatment2, treatment3) # Output results print(“=== Friedman Test ===”) print(“Treatment 1:”, treatment1) print(“Treatment 2:”, treatment2) print(“Treatment 3:”, treatment3) print(f”Chi-squared statistic = {statistic:.4f}”) print(f”p-value = {p\_value:.4f}”) # Simple interpretation alpha = 0.05 if p\_value < alpha: print(“→ At least one treatment differs significantly (reject H0)”) else: print(“→ No significant differences between treatments (fail to reject H0)”) ```
<span class="line"><span style="color: #6272A4"># friedman_test.py</span></span>
<span class="line"><span style="color: #FF79C6">import</span><span style="color: #F8F8F2"> numpy </span><span style="color: #FF79C6">as</span><span style="color: #F8F8F2"> np</span></span>
<span class="line"><span style="color: #FF79C6">from</span><span style="color: #F8F8F2"> scipy.stats </span><span style="color: #FF79C6">import</span><span style="color: #F8F8F2"> friedmanchisquare</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6272A4"># Simulated repeated measures data (e.g. VAS pain scores for 3 treatments on same patients)</span></span>
<span class="line"><span style="color: #6272A4"># Each row = one subject; each column = one treatment condition</span></span>
<span class="line"><span style="color: #F8F8F2">scores </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> np.array([</span></span>
<span class="line"><span style="color: #F8F8F2">    [</span><span style="color: #BD93F9">6</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">5</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">4</span><span style="color: #F8F8F2">],</span></span>
<span class="line"><span style="color: #F8F8F2">    [</span><span style="color: #BD93F9">7</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">6</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">5</span><span style="color: #F8F8F2">],</span></span>
<span class="line"><span style="color: #F8F8F2">    [</span><span style="color: #BD93F9">5</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">4</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">3</span><span style="color: #F8F8F2">],</span></span>
<span class="line"><span style="color: #F8F8F2">    [</span><span style="color: #BD93F9">8</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">7</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">6</span><span style="color: #F8F8F2">],</span></span>
<span class="line"><span style="color: #F8F8F2">    [</span><span style="color: #BD93F9">6</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">6</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">5</span><span style="color: #F8F8F2">],</span></span>
<span class="line"><span style="color: #F8F8F2">    [</span><span style="color: #BD93F9">7</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">5</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">5</span><span style="color: #F8F8F2">],</span></span>
<span class="line"><span style="color: #F8F8F2">    [</span><span style="color: #BD93F9">6</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">4</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">4</span><span style="color: #F8F8F2">],</span></span>
<span class="line"><span style="color: #F8F8F2">    [</span><span style="color: #BD93F9">5</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">5</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">4</span><span style="color: #F8F8F2">],</span></span>
<span class="line"><span style="color: #F8F8F2">    [</span><span style="color: #BD93F9">7</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">6</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">5</span><span style="color: #F8F8F2">],</span></span>
<span class="line"><span style="color: #F8F8F2">    [</span><span style="color: #BD93F9">6</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">5</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">4</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #F8F8F2">])</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6272A4"># Unpack columns to pass to friedmanchisquare</span></span>
<span class="line"><span style="color: #F8F8F2">treatment1 </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> scores[</span><span style="color: #FF79C6">:</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">0</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #F8F8F2">treatment2 </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> scores[</span><span style="color: #FF79C6">:</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">1</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #F8F8F2">treatment3 </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> scores[</span><span style="color: #FF79C6">:</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">2</span><span style="color: #F8F8F2">]</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6272A4"># Perform Friedman test</span></span>
<span class="line"><span style="color: #F8F8F2">statistic, p_value </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> friedmanchisquare(treatment1, treatment2, treatment3)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6272A4"># Output results</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">=== Friedman Test ===</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">Treatment 1:</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">, treatment1)</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">Treatment 2:</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">, treatment2)</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">Treatment 3:</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">, treatment3)</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #FF79C6">f</span><span style="color: #F1FA8C">"Chi-squared statistic = </span><span style="color: #BD93F9">{</span><span style="color: #F8F8F2">statistic</span><span style="color: #FF79C6">:.4f</span><span style="color: #BD93F9">}</span><span style="color: #F1FA8C">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #FF79C6">f</span><span style="color: #F1FA8C">"p-value = </span><span style="color: #BD93F9">{</span><span style="color: #F8F8F2">p_value</span><span style="color: #FF79C6">:.4f</span><span style="color: #BD93F9">}</span><span style="color: #F1FA8C">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6272A4"># Simple interpretation</span></span>
<span class="line"><span style="color: #F8F8F2">alpha </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">0.05</span></span>
<span class="line"><span style="color: #FF79C6">if</span><span style="color: #F8F8F2"> p_value </span><span style="color: #FF79C6"><</span><span style="color: #F8F8F2"> alpha:</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">→ At least one treatment differs significantly (reject H0)</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #FF79C6">else</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">→ No significant differences between treatments (fail to reject H0)</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"></span>
```

### Chi-square test for relationships between nominal data and frequencies

\# chi\_squared\_test.py import numpy as np from scipy.stats import chi2\_contingency # Simulated 2×2 contingency table # Example: Treatment success vs failure in two groups # Success Failure # Group A 30 10 # Group B 20 25 table = np.array(\[ \[30, 10\], \[20, 25\] \]) # Perform Chi-squared test chi2\_stat, p\_value, dof, expected = chi2\_contingency(table) # Output results print(“=== Chi-squared Test of Independence ===”) print(“Observed frequencies:”) print(table) print(“\\\\nExpected frequencies under H0:”) print(np.round(expected, 2)) print(f”\\\\nChi-squared statistic = {chi2\_stat:.4f}”) print(f”Degrees of freedom = {dof}”) print(f”p-value = {p\_value:.4f}”) # Simple interpretation alpha = 0.05 if p\_value < alpha: print(“→ Significant association between variables (reject H0)”) else: print(“→ No significant association (fail to reject H0)”) ```
<span class="line"><span style="color: #6272A4"># chi_squared_test.py</span></span>
<span class="line"><span style="color: #FF79C6">import</span><span style="color: #F8F8F2"> numpy </span><span style="color: #FF79C6">as</span><span style="color: #F8F8F2"> np</span></span>
<span class="line"><span style="color: #FF79C6">from</span><span style="color: #F8F8F2"> scipy.stats </span><span style="color: #FF79C6">import</span><span style="color: #F8F8F2"> chi2_contingency</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6272A4"># Simulated 2x2 contingency table</span></span>
<span class="line"><span style="color: #6272A4"># Example: Treatment success vs failure in two groups</span></span>
<span class="line"><span style="color: #6272A4">#           Success   Failure</span></span>
<span class="line"><span style="color: #6272A4"># Group A     30         10</span></span>
<span class="line"><span style="color: #6272A4"># Group B     20         25</span></span>
<span class="line"><span style="color: #F8F8F2">table </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> np.array([</span></span>
<span class="line"><span style="color: #F8F8F2">    [</span><span style="color: #BD93F9">30</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">10</span><span style="color: #F8F8F2">],</span></span>
<span class="line"><span style="color: #F8F8F2">    [</span><span style="color: #BD93F9">20</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">25</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #F8F8F2">])</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6272A4"># Perform Chi-squared test</span></span>
<span class="line"><span style="color: #F8F8F2">chi2_stat, p_value, dof, expected </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> chi2_contingency(table)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6272A4"># Output results</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">=== Chi-squared Test of Independence ===</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">Observed frequencies:</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(table)</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #E9F284">"</span><span style="color: #FF79C6">\\</span><span style="color: #F1FA8C">nExpected frequencies under H0:</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(np.round(expected, </span><span style="color: #BD93F9">2</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #FF79C6">f</span><span style="color: #F1FA8C">"</span><span style="color: #FF79C6">\\</span><span style="color: #F1FA8C">nChi-squared statistic = </span><span style="color: #BD93F9">{</span><span style="color: #F8F8F2">chi2_stat</span><span style="color: #FF79C6">:.4f</span><span style="color: #BD93F9">}</span><span style="color: #F1FA8C">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #FF79C6">f</span><span style="color: #F1FA8C">"Degrees of freedom = </span><span style="color: #BD93F9">{</span><span style="color: #F8F8F2">dof</span><span style="color: #BD93F9">}</span><span style="color: #F1FA8C">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #FF79C6">f</span><span style="color: #F1FA8C">"p-value = </span><span style="color: #BD93F9">{</span><span style="color: #F8F8F2">p_value</span><span style="color: #FF79C6">:.4f</span><span style="color: #BD93F9">}</span><span style="color: #F1FA8C">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6272A4"># Simple interpretation</span></span>
<span class="line"><span style="color: #F8F8F2">alpha </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">0.05</span></span>
<span class="line"><span style="color: #FF79C6">if</span><span style="color: #F8F8F2"> p_value </span><span style="color: #FF79C6"><</span><span style="color: #F8F8F2"> alpha:</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">→ Significant association between variables (reject H0)</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #FF79C6">else</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">→ No significant association (fail to reject H0)</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"></span>
```

## Nonparametric Statistics in Medicine

In medical research, we frequently encounter various scenarios and conditions where traditional parametric tests may be unreliable or incorrect. These situations commonly include cases with limited data availability, the presence of significant outliers that can skew results, datasets that deviate from the normal distribution pattern, or when working with ordinal data where the intervals between values cannot be assumed to be equal.

In such challenging circumstances, nonparametric statistical methods prove invaluable by providing more reliable and trustworthy results. Their reliability stems from their distribution-free nature, meaning they don’t assume the data follows any particular probability distribution. Additionally, these methods demonstrate superior robustness compared to their parametric counterparts when analyzing datasets complicated by outliers or limited by small sample sizes. This robustness ensures that the statistical conclusions remain valid even under less-than-ideal conditions.

Moreover, researchers have access to sophisticated normality tests, particularly the Shapiro-Wilks and Kolmogorov-Smirnov tests, which serve as essential diagnostic tools. These tests play a crucial role in the statistical analysis process by enabling researchers to systematically evaluate variables and make informed decisions about when to apply nonparametric methods. This systematic approach to choosing appropriate statistical tests strengthens the validity of research findings.

## Limitations of nonparametric statistics

First of all, it should be clarified that nonparametric statistics is less powerful than parametric statistics. This means that a larger number of observations is necessary to detect significant differences.

Since nonparametric tests are based on the relative positions of data rather than their absolute values, this results in a loss of information.

Often the results are not as immediately readable and interpretable, especially for clinicians for whom the concepts of “mean and standard deviation” are certainly more familiar than those of “rank positions”.

Finally, when making comparisons between more than two variables, it may be necessary to perform post-hoc tests with corrections (for example Bonferroni) to identify differences between pairs, which makes the statistical analysis and its interpretation more complex.

## Conclusion

Nonparametric statistical methods have established themselves as fundamental and indispensable tools in medical research, particularly when dealing with real-world data that often fails to meet the strict assumptions required by parametric approaches. Their versatility and reliability make them essential components of the modern medical researcher’s analytical toolkit.

## Further Reading

- [Nonparametric statistics – Wikipedia](https://en.wikipedia.org/wiki/Nonparametric_statistics)
- [Non-Parametric Statistics: Types, Tests, and Examples](https://www.analyticssteps.com/blogs/non-parametric-statistics-types-tests-and-examples)
- [How to Conduct Non-Parametric Tests with SciPy](https://www.statology.org/how-to-conduct-non-parametric-tests-scipy/)