Kendall's Tau
Descriptive Statistics
Count Pairs, Not Pixels — A More Intuitive Correlation
Kendall's τ takes a fundamentally different approach to correlation: instead of squaring differences, it simply counts how many pairs of observations agree or disagree. This makes it one of the most intuitive measures of rank association.
Key things Kendall's tau helps you understand:
- Concordant vs discordant pairs — A pair agrees (concordant) if both variables rank in the same order; it disagrees (discordant) if they flip.
- Robust small-sample behavior — Kendall's τ has better statistical properties than Spearman for small datasets with many tied ranks.
- Tied rank handling — The τ-b variant gracefully adjusts for ties, making it the default choice in most software.
In small samples or datasets full of ties, Kendall's τ often tells the more honest story.
What is Kendall's Tau?
Definition
Kendall's τ (tau) measures the ordinal association between two variables by counting concordant and discordant pairs.
import numpy as np
from scipy import stats
np.random.seed(42)
x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
y = np.array([2, 1, 4, 3, 6, 5, 8, 7])
tau, p_value = stats.kendalltau(x, y)
print(f"Kendall's tau = {tau:.4f}")
print(f"p-value = {p_value:.4f}")
Concordant vs Discordant Pairs
A pair (i, j) is concordant if both x and y rank in the same order: and (or both >).
A pair is discordant if the ranks disagree: but .
| Pair Type | Condition | Effect on τ |
|---|---|---|
| Concordant | Same order in X and Y | Increases τ |
| Discordant | Opposite order in X and Y | Decreases τ |
| Tied | Same rank in X or Y | Excluded from calculation |
Kendall's τ-a vs τ-b
| Variant | Formula | When to Use |
|---|---|---|
| τ-a | No ties in data | |
| τ-b | Handles ties (default in scipy) | |
| τ-c | Rectangular tables |
# τ-a (no ties correction)
n = len(x)
tau_a = 2 * (tau) # Simplified; scipy does not directly compute τ-a
print(f"τ-b = {tau:.4f}")
Comparison with Spearman
np.random.seed(42)
n = 20
x = np.random.normal(0, 1, n)
y = x + np.random.normal(0, 0.5, n)
rho, _ = stats.spearmanr(x, y)
tau, _ = stats.kendalltau(x, y)
print(f"Spearman ρ = {rho:.4f}")
print(f"Kendall τ = {tau:.4f}")
Kendall Tau in Machine Learning
| ML Application | Kendall Tau Usage | Why |
|---|---|---|
| Learning to rank | Evaluate ranking agreement | Handles ties better than Spearman |
| Recommendation systems | User preference ordering | Rank-based evaluation |
| Feature selection | Ordinal feature relationships | Robust to outliers |
| Inter-rater reliability | Agreement between annotators | Label quality assessment |
import numpy as np
from scipy.stats import kendalltau, spearmanr
# Compare rankings
model_a_ranks = [1, 2, 3, 4, 5]
model_b_ranks = [1, 3, 2, 5, 4]
kendall_tau, _ = kendalltau(model_a_ranks, model_b_ranks)
spearman_rho, _ = spearmanr(model_a_ranks, model_b_ranks)
print(f"Ranking agreement: Kendall τ = {kendall_tau:.3f}, Spearman ρ = {spearman_rho:.3f}")
print("Kendall tau is more conservative (fewer pairwise comparisons)")
Key Takeaways
Kendall's τ counts concordant vs discordant pairs — an intuitive, pair-wise interpretation of rank association.
τ ranges from -1 to +1 — same scale as Spearman's ρ, making comparison straightforward.
τ-b is the default — handles tied ranks gracefully, unlike the simpler τ-a variant.
More robust than Spearman for small samples and many ties, but expect lower absolute values — this is expected, not a flaw.
"When your sample is small or full of ties, let Kendall's τ do the counting — concordant pairs agree, discordant pairs disagree, and the truth falls somewhere in between."