How to Calculate Cramer’s V in Python

Spread the love

Cramer’s V is a measure of association between two nominal variables, providing a value between 0 and +1 (inclusive). It is based on Pearson’s chi-squared statistic and can be understood as the standardized version of the chi-squared statistic. In this article, we’ll explore how to calculate Cramer’s V in Python, which is a powerful tool in the toolbox of a data scientist or statistician.

Understanding Cramer’s V

Before we proceed to the Python code, let’s understand what Cramer’s V is. Named after Harald Cramer, it’s a measure of association between two nominal variables, providing a value between 0 and +1. The interpretation of Cramer’s V is as follows:

  • A value close to 0 indicates little association between variables.
  • A value close to 1 indicates a strong association between variables.

It’s important to note that Cramer’s V doesn’t imply causality. A high value simply means the variables are associated, not that one causes the other.

How to Calculate Cramer’s V in Python

Let’s assume we have a Pandas DataFrame that contains two categorical variables. Here’s how you can calculate Cramer’s V for these variables:

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

def cramers_v(x, y):
    confusion_matrix = pd.crosstab(x,y)
    chi2 = stats.chi2_contingency(confusion_matrix)[0]
    n = confusion_matrix.sum().sum()
    phi2 = chi2/n
    r,k = confusion_matrix.shape
    phi2corr = max(0, phi2-((k-1)*(r-1))/(n-1))
    rcorr = r-((r-1)**2)/(n-1)
    kcorr = k-((k-1)**2)/(n-1)
    return np.sqrt(phi2corr/min((kcorr-1),(rcorr-1)))

# Generate some data
df = pd.DataFrame({
    'A': np.random.choice(['Low', 'Medium', 'High'], size=100),
    'B': np.random.choice(['Red', 'Blue', 'Green'], size=100)

# Compute Cramer's V
print(cramers_v(df['A'], df['B']))

In this code:

  1. We first define a function cramers_v that takes two categorical variables as input.
  2. We create a confusion matrix for these variables using the pd.crosstab function.
  3. We calculate the chi-square statistic for the confusion matrix using the stats.chi2_contingency function.
  4. We compute the phi-squared value by dividing chi-square by the sample size.
  5. We then correct for bias by subtracting the product of the matrix dimensions minus one divided by the sample size minus one.
  6. We correct the dimensions for bias in the same way.
  7. Finally, we take the square root of the corrected phi-squared divided by the minimum of the corrected dimensions minus one. This is the Cramer’s V statistic.

The final result is a measure of the association between the two variables.


In this article, we’ve explained how to calculate Cramer’s V in Python, a measure of association between two categorical variables. It’s important to remember that while this metric can indicate the strength of an association, it doesn’t imply causality.

Like any statistical method, Cramer’s V should be used thoughtfully, considering the nature of your data and the specific context in which you’re working. It’s also worth noting that Cramer’s V works best with large datasets because a larger sample size reduces the likelihood of error.

Being aware of methods like Cramer’s V and knowing how to implement them in Python is essential for conducting high-quality data analysis and can help you draw more accurate and insightful conclusions from your data. Whether you’re a seasoned data scientist or a beginner just starting out, understanding and using Cramer’s V can be a valuable addition to your data analysis toolkit.

Leave a Reply