クラマーの V

概要

クラマーのV(Cramér's V)は、r 行 × c 列の分割表(クロス集計表)における、2つのカテゴリ変数(名義変数、順序や大小のない分類のための変数)間の関連の強さを示す指標である。値は 0 以上 1 以下の範囲をとり、1 に近いほど関連が強い。クラマーの連関係数(Cramer's coefficient of association)とも呼ばれる。分割表のカイ二乗値を χ²、データの総件数(サンプルサイズ)を n とすると、クラマーの V は次の式で計算される。

V = √( χ² / ( n × min(r-1, c-1) ) )

Pythonでは、SciPy の scipy.stats.contingency.association 関数を使うことで、この計算を1行で行える。

目次

関連する外部ページ

サイト内の関連情報

クラマーのVとは

クラマーのVは、2つのカテゴリ変数(名義変数)を集計した分割表(クロス集計表)から、両者の間にどの程度の関連があるかを数値で示す指標である。例えば「性別」と「購入商品」のように、大小関係を持たない分類データどうしの関連の強さを調べる場面で使われる。値は 0 から 1 の範囲をとり、0 は関連がないことを示し、1 に近づくほど関連が強いことを示す。分割表の行数と列数が異なる場合にも使える点が特徴であり、2 行 2 列の分割表限定のファイ係数(φ係数)を、行数・列数が任意の分割表へ拡張したものと位置づけられる。

クラマーのVは、カイ二乗検定(分割表における2変数の独立性を検定する手法)と組み合わせて使われることが多い。カイ二乗検定は「関連があるかどうか」を判定する検定であるのに対し、クラマーのVは「関連がどの程度強いか」を数値で示す効果量(統計的な差や関連の大きさを表す指標)である。

Python環境の準備

クラマーのVの計算には、分割表の作成に使うpandasと、クラマーのVの計算に使うSciPyを用いる。両方とも、Pythonのパッケージ管理ツールpipでインストールできる。

管理者権限コマンドプロンプトを起動する (手順:Windowsキーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」)。

python -m pip install --no-user -U pip
pip install --no-user --upgrade pandas scipy

クラマーのVの計算

分割表がすでに数値の配列として得られている場合は、SciPy のscipy.stats.contingency.association関数に、その配列とmethod="cramer"を渡すだけで、クラマーのVを計算できる。次のコードは、4行2列の分割表からクラマーのVを求める例である。

import numpy as np
from scipy.stats.contingency import association

# 分割表(4行2列)を作成する
observed = np.array([[100, 150], [203, 322], [420, 700], [320, 210]])

# クラマーのVを計算する
v = association(observed, method="cramer")
print("クラマーの V:", v)

実際のデータでは、分割表そのものが最初から用意されていることは少なく、個々の記録(レコード)から分割表を作る必要がある。この作成には、pandasのcrosstab関数(2つの列の値ごとの件数を集計してクロス集計表を作る関数)を使う。次のコードは、性別と購入商品というカテゴリデータから分割表を作り、クラマーのVを計算する例である。

import pandas as pd
from scipy.stats.contingency import association

# カテゴリデータ(性別と購入商品)を作成する
data = pd.DataFrame({
    "性別": ["男性", "男性", "女性", "女性", "男性", "女性", "男性", "女性"],
    "購入商品": ["A", "B", "A", "B", "A", "A", "B", "B"]
})

# 分割表(クロス集計表)を作成する
cross = pd.crosstab(data["性別"], data["購入商品"])
print(cross)

# クラマーのVを計算する
v = association(cross, method="cramer")
print("クラマーの V:", v)

scipy.stats.contingency.associationは、method引数の値によって、クラマーのVのほかに、ツシュプロフのT(Tschuprow's T)やピアソンの連関係数(Pearson's contingency coefficient)も計算できる。既定値はmethod="cramer"であり、明示しない場合はクラマーのVが計算される。