アンケートの5段階評価や「はい/いいえ」の回答どうしの関係を、数値を振ってそのままピアソンの相関係数で測ると、関係の強さを小さく見積もります。カテゴリカル変数の相関は、2つの変数が名義尺度か順序尺度か二値か連続かの組み合わせで係数を選ぶのが基本です。この記事では、順序データの背後に連続量を仮定するテトラコリック相関・ポリコリック相関を中心に、スピアマン・ケンドールの順位相関係数、クラメールのVなどの連関係数との使い分けを、Pythonでの実測値と原論文・Rパッケージの仕様をもとに整理します。
まとめ:カテゴリカル変数の相関係数を選ぶ基準
- 係数は2変数の尺度の組み合わせで決まります。名義×名義はクラメールのV、順序×順序はスピアマンかケンドール、背後に正規分布する連続量を仮定できるならポリコリック相関です。二値×二値はφ係数、背後に連続量を仮定できるならテトラコリック相関です。
- 順序データにピアソン相関をそのまま当てると、潜在相関0.5のデータが2段階で約0.33、5段階でも約0.46まで縮みます(筆者のPython実測・50回平均)。ポリコリック相関はどの段階数でも0.50前後を返します。
- テトラコリック相関はポリコリック相関の2×2表版です。セルに0があると推定値が±1に張り付くため、Rのpsychパッケージは0のセルに0.5を足す補正を既定にしています。
- ポリコリック相関は「回答の背後に正規分布する連続量がある」という仮定の上に立つ推定値です。購入の有無や性別のように本来が離散の変数には使いません。
- 順序尺度の項目で因子分析をするなら、5段階未満はポリコリック相関を使うカテゴリカルな推定(lavaanのWLSMV等)、5段階以上で標本が小さく閾値がほぼ対称なら頑健な最尤法(連続扱い)でもよい、というのがRhemtullaら(2012)のシミュレーションの結論です。
尺度の組み合わせ別:相関係数の早見表
カテゴリカル変数(質的変数)は、値が分類を表す変数です。順序に意味のない名義尺度(血液型・業種など)と、順序に意味はあるが間隔が等しいとは限らない順序尺度(満足度の5段階など)に分かれます。量的変数どうしの直線的な関係はピアソンの積率相関係数(共分散を両変数の標準偏差の積で割った値)で測ります。カテゴリカル変数が含まれる場合、間隔尺度・比例尺度の量的変数との組み合わせも含めて、使う係数は次のように決まります。
| 変数Xの尺度 | 変数Yの尺度 | 記述的な係数 | 潜在連続量を仮定する係数 |
|---|---|---|---|
| 名義 | 名義 | クラメールのV | なし |
| 二値 | 二値 | φ係数 | テトラコリック相関 |
| 順序 | 順序 | スピアマン・ケンドール | ポリコリック相関 |
| 順序 | 連続 | スピアマン | ポリシリアル相関 |
| 二値 | 連続 | 点双列相関 | 双列(バイシリアル)相関 |
| 名義 | 連続 | 相関比η | なし |
右の2列の違いは、何を測りたいかです。記述的な係数は「観測された分類どうしがどれだけ連動しているか」を表し、潜在連続量を仮定する係数は「分類する前の連続量どうしの相関はいくつだったか」を推定します。満足度や同意度のように、本来は連続的な気持ちを5つの箱に分けて聞いている項目なら右列、カテゴリそのものに関心があるなら左列を選びます。
順序データにピアソン相関を使ったときの過小評価
カテゴリ化による相関の縮み(Pythonでの実測)
カテゴリに1・2・3…と数値を振ってピアソン相関を計算すると、間隔が等しいという仮定に加えて、粗く区切ったことによる情報の損失が相関を小さくします。どの程度縮むかを確かめるため、潜在相関0.5の二変量正規乱数を1,000件生成し、閾値で2〜7段階に区切ってから各係数を計算する試行を50回繰り返しました(Python 3・SciPy 1.13.1。推定関数のコードは後述)。
| 区切り方 | ピアソン | スピアマン | ケンドールτb | ポリコリック |
|---|---|---|---|---|
| 2段階(中央で分割) | 0.332 | 0.332 | 0.332 | 0.498 |
| 3段階 | 0.415 | 0.415 | 0.372 | 0.503 |
| 5段階(対称) | 0.458 | 0.449 | 0.386 | 0.502 |
| 7段階(対称) | 0.475 | 0.464 | 0.379 | 0.500 |
| 5段階(低い段階に集中) | 0.442 | 0.433 | 0.365 | 0.499 |
真の値0.5に対し、ピアソン相関は2段階で3分の2程度まで縮み、7段階でも届きません。スピアマンもほぼ同じ値で、順位に変換しても粗さによる損失は戻りません。ケンドールのτbは3段階以上で0.36〜0.39に留まります。τは順位の一致・不一致の割合を測る別の尺度で、同じデータでもスピアマンより小さく出る性質があるため、この差は過小評価の度合いとは別の話です(2×2表ではτbはφ係数と一致し、3つの値が同じになります)。ポリコリック相関だけが区切りの数や偏りによらず0.50前後を返しています。
2段階の値は理論値とも一致します。両方の変数を中央で2分割したときのφ係数の期待値は (2/π)×arcsin(ρ) で、ρ=0.5なら0.333です。片方だけを中央で2分割した場合は、相関が√(2/π)≒0.798倍になります(Cohen 1983, Applied Psychological Measurement 7巻)。「中央値で2分割すると相関が0.798倍になる」という説明をよく見かけますが、これは片側だけを分割したケースです。
測定誤差による希薄化とスピアマンの修正式
カテゴリ化とは別に、尺度の信頼性が低いことでも相関は小さく出ます。これを希薄化(attenuation)と呼び、スピアマン(1904)は観測相関を両変数の信頼性係数の幾何平均で割る修正式 r ÷ √(rxx × ryy) を示しました。たとえば観測相関0.40、信頼性係数がそれぞれ0.70と0.80なら、修正後は 0.40 ÷ √0.56 ≒ 0.53 です。ただし信頼性係数が過小に推定されていると修正後の値が1を超えることがあり、修正値は「誤差がなければこの程度」という上限の目安として扱います。
スピアマンとケンドールの順位相関係数:計算方法と使い分け
スピアマンの順位相関係数ρsの計算式と使いどころ
スピアマンの順位相関係数は、各変数を順位に置き換えてからピアソン相関を計算した値です。同順位は平均順位で処理します。同順位がなければ ρs = 1 − 6Σd² ÷ (n(n²−1))(dは各対の順位差)でも計算できます。値は−1〜1で、順位に変換するため1件の極端な値が結果を左右しにくく、直線でなくても単調な関係(片方が増えればもう片方も増える)を捉えます。ピアソンとの使い分けは、量的変数で外れ値や曲線的な関係が疑われる、または片方が順序尺度ならスピアマン、と覚えれば足ります。上の実測のとおり、少ない段階数の順序データでは潜在相関の推定値としては小さく出る点に注意が必要です。
ケンドールの順位相関係数τの計算とτb・τcの違い
ケンドールのτは、すべての2件の組み合わせについて、2変数の大小関係が一致する組(協和対)と逆になる組(不協和対)を数え、その差を全組数で割った係数です(Kendall 1938, Biometrika 30巻。この定義をτaと呼びます)。アンケートの順序データは同順位が大量に出るため、分母を √((P+Q+T)(P+Q+U))(Pは協和対、Qは不協和対、T・Uは片方の変数だけで同順位の組数)に替えて同順位を調整したτbを使います。SciPyの scipy.stats.kendalltau は既定でτbを返し、表の行と列のカテゴリ数が違う長方形の表では variant='c' でτcも選べます。τは「無作為に2人を選んだとき、順序が一致する確率から逆になる確率を引いた値」と解釈でき、スピアマンより説明しやすいのが利点です。
ポリコリック相関係数の仮定と推定手順
ポリコリック相関は、2つの順序変数それぞれの背後に標準正規分布に従う連続量があり、それが閾値で区切られて観測カテゴリになった、と仮定して、連続量どうしの相関ρを推定する方法です。Olsson(1979, Psychometrika 44巻 443-460頁)が最尤推定の方法を整理しました。推定は次の2段階で行うのが一般的です。
- 各変数の周辺分布(カテゴリごとの累積比率)を標準正規分布の分位点に変換し、閾値を決める。
- 閾値を固定したまま、クロス集計表の各セルの確率を二変量正規分布の長方形領域の確率として表し、観測度数の尤度が最大になるρを探す。
閾値とρを同時に推定する完全な最尤法もあり、Rの polycor パッケージ(0.8-2)の polychor() は既定が二段階推定で、ML = TRUE で完全な最尤推定に切り替わります。std.err = TRUE を指定すると二変量正規性のカイ二乗検定も返すので、仮定が大きく崩れていないかをそこで確かめられます。
次のコードは上記の二段階推定をSciPyだけで書いたものです。「順序データにピアソン相関を使ったときの過小評価」の章の表はこの関数で計算しました。
import numpy as np
from scipy import stats, optimize
from scipy.stats import multivariate_normal
def thresholds(x):
# 1段目:周辺の累積比率を標準正規の分位点に変換して閾値を置く
cats = np.sort(np.unique(x))
cum = np.cumsum([np.mean(x == c) for c in cats])[:-1]
return np.concatenate(([-np.inf], stats.norm.ppf(cum), [np.inf])), cats
def bvn_cdf(a, b, rho):
a = np.clip(a, -10, 10); b = np.clip(b, -10, 10)
return multivariate_normal.cdf([a, b], mean=[0, 0], cov=[[1, rho], [rho, 1]])
def polychoric(x, y):
tx, cx = thresholds(x); ty, cy = thresholds(y)
table = np.array([[np.sum((x == i) & (y == j)) for j in cy] for i in cx])
def negll(rho):
# 2段目:閾値を固定し、各セル確率(二変量正規の長方形領域)の対数尤度を最大化
ll = 0.0
for i in range(len(cx)):
for j in range(len(cy)):
if table[i, j] == 0:
continue
p = (bvn_cdf(tx[i+1], ty[j+1], rho) - bvn_cdf(tx[i], ty[j+1], rho)
- bvn_cdf(tx[i+1], ty[j], rho) + bvn_cdf(tx[i], ty[j], rho))
ll += table[i, j] * np.log(max(p, 1e-300))
return -ll
return optimize.minimize_scalar(negll, bounds=(-0.999, 0.999), method="bounded").x
x・y はNumPy配列で渡します(例:polychoric(np.array(x), np.array(y)))。実務では自前実装より既存の実装を使うほうが安全です。Rなら psych パッケージ(2.6.9)の polychoric() が項目の行列から相関行列を一度に返します。扱うカテゴリ数の上限を決める引数 max.cat の既定値は8で、得られた行列が正定値でなければ固有値を補正して平滑化します(smooth = TRUE)。
テトラコリック相関:2×2表の特殊例と空セルの扱い
テトラコリック相関は、ポリコリック相関を2値×2値(2×2のクロス集計表)に当てはめたものです。「正答/誤答」「はい/いいえ」のような二値項目の背後に連続的な特性を仮定し、その相関を推定します。考え方はピアソン(1900, Philosophical Transactions of the Royal Society A 195巻)にさかのぼり、テストの二値項目を因子分析する際の入力として使われてきました。同じ2×2表から計算するφ係数は観測された分類どうしの連動を、テトラコリック相関は分類前の連続量の相関を表すため、同じデータでもテトラコリック相関のほうが大きく出ます(過小評価の章の表で2段階の行を参照)。
注意すべきは、4つのセルのうち1つでも度数が0だと、最尤推定値が−1か1に張り付くことです。50・0・30・20という度数の表で筆者の実装を回すと、φ係数0.50に対してテトラコリック相関は0.994と、探索範囲の上限(0.999)近くまで上がりました。Rの psych の tetrachoric() はこの退化を避けるため、0のセルに0.5を足す連続性補正を既定にしており(correct = .5)、補正したときは警告を出します。correct = 0 にすると補正をせず、polycor の結果と一致します。どちらを採ったかで値が大きく変わるので、報告には補正の有無を書き添えます。
ポリシリアル・双列・点双列相関:順序や二値と連続量の組み合わせ
片方が順序変数、もう片方が連続変数のときに使うのがポリシリアル相関です(Olsson, Drasgow & Dorans 1982, Psychometrika 47巻 337-347頁)。順序変数の背後に正規分布する連続量を仮定し、観測された連続変数との相関を推定します。順序変数が二値の特殊例が双列(バイシリアル)相関です。
一方、二値変数を0と1の数値としてそのままピアソン相関を計算したものが点双列相関です。テストの項目分析で「その問題に正答した人ほど総得点が高いか」を見る識別力の指標によく使われます。過小評価の章で示した片側分割の理論値(√(2/π)≒0.798倍)のとおり、二値の背後に正規分布する連続量があり中央で分けられている場合、点双列相関は双列相関の約0.8倍になります。性別や購入の有無のように背後の連続量が想定できない二値変数なら、点双列相関のほうを使います。
名義尺度の連関係数:φ係数・クラメールのV・ピアソンの連関係数
順序のない名義尺度どうしでは、相関の「向き」に意味がないため、クロス集計表のカイ二乗統計量から計算する連関係数を使います。
| 係数 | 計算式 | 範囲 | 向いている表 |
|---|---|---|---|
| φ係数 | √(χ² ÷ n) | 0〜1(符号付きなら−1〜1) | 2×2 |
| クラメールのV | √(χ² ÷ (n × (k−1))) | 0〜1 | 任意の大きさ |
| ピアソンの連関係数C | √(χ² ÷ (χ² + n)) | 0〜上限1未満 | 大きさが同じ表どうしの比較 |
kは行数と列数の小さいほうです。2×2表ではクラメールのVとφ係数の絶対値は一致します。ピアソンの連関係数Cは完全な連関でも1に届かず、上限が表の大きさで変わります。3×3の対角だけに度数がある表で計算すると、Vは1.000、Cは0.816(上限 √(2/3))でした。大きさの違う表どうしでCを比べると誤るため、比較が目的ならクラメールのVを選びます。
SciPyでは scipy.stats.contingency.association の method 引数で、クラメールのV(cramer)・チュプロウのT(tschuprow)・ピアソンの連関係数C(pearson)を切り替えて計算できます。φ係数の選択肢はありませんが、2×2表ではクラメールのVと絶対値が一致します。
import numpy as np
from scipy.stats.contingency import association
table = np.array([[30, 10, 10],
[10, 30, 10],
[10, 10, 30]])
for m in ["cramer", "tschuprow", "pearson"]:
print(m, round(association(table, method=m), 3))
# 出力: cramer 0.4、tschuprow 0.4、pearson 0.492
連関係数は関連の強さだけを示し、どのセルが関連を生んでいるかは教えてくれません。クロス集計表そのものと残差を並べて報告するのが前提で、表の読み方とカイ二乗検定の手順はアンケートのクロス集計とは?やり方・表の見方から単純集計との違い、カイ二乗検定まで解説で扱っています。
カテゴリカル因子分析での使い方と推定法の選び方
順序尺度の項目を因子分析や構造方程式モデリングにかけるとき、ピアソン相関行列を入力にすると、前述の過小評価がそのまま因子負荷量の過小評価になります。そこで、ポリコリック相関行列を入力にするカテゴリカル因子分析が使われます。Rの lavaan では、cfa() や sem() の ordered 引数に順序変数を指定すると推定法が自動的にWLSMV(対角重み付き最小二乗法に頑健な標準誤差と平均・分散調整済みの検定統計量を組み合わせたもの)に切り替わります。
どの段階数から連続変数とみなしてよいかについては、Rhemtullaら(2012, Psychological Methods 17巻 354-373頁)のシミュレーションが判断材料になります。2〜7カテゴリのデータで比べた結果、因子負荷量と標準誤差は全般にカテゴリカルな最小二乗法のほうが正確で、とくに5カテゴリ未満で差が大きく、因子間相関と適合度は頑健な最尤法でも同等でした。同論文は、5カテゴリ未満ならカテゴリカルな推定、5カテゴリ以上で標本が小さく閾値がほぼ対称なら頑健な最尤法を推奨し、6〜7カテゴリでは多くの条件でどちらでもよいとしています。最尤法は閾値が非対称なときに、カテゴリカルな推定は標本が小さいときや潜在変数の正規性が崩れたときに弱い、という弱点の違いもあります。
因子分析そのものの手順や因子数の決め方は因子分析とは?やり方・結果の見方を具体例でわかりやすく解説、潜在変数間の因果モデルまで組む場合は共分散構造分析とは?SEM(構造方程式モデリング)の仕組みと進め方を参照してください。
ポリコリック相関を選ばないほうがよい場面
ポリコリック相関はピアソン相関より「正しい」わけではなく、仮定を満たすときに潜在相関をより近く推定できる道具です。次の条件では、スピアマン・ケンドールやクラメールのVなどの記述的な係数を使うほうが妥当です。
- 背後に連続量を想定できない変数:購入の有無、性別、契約プランのように、カテゴリそのものが実体である変数。潜在連続量の相関を推定しても解釈できません。
- 空セルや度数の少ないセルが多い表:標本が数十件しかない、5段階×5段階で多くのセルが0か1といった表では推定値が不安定で、テトラコリックと同様に±1付近へ振れます。カテゴリを統合するか順位相関に切り替えます。
- 二変量正規性の検定で大きく外れる場合:polycor が返す二変量正規性のカイ二乗検定で適合が悪いなら、潜在分布が歪んでいる可能性があります。Rhemtullaら(2012)も、カテゴリカルな推定は潜在変数の正規性の違反に敏感だと報告しています。
- 観測された分類の連動そのものを報告したい場合:「満足と答えた人の何割が再購入意向ありか」を示したいなら、潜在相関ではなくクロス集計とφ係数・クラメールのVのほうが読み手に伝わります。
また、項目ごとに別々に推定したポリコリック相関を並べた行列は、正定値にならないことがあります。そのまま因子分析に入れると計算が止まるか不適解になるため、psych の平滑化(smooth = TRUE)か、lavaan の lavCor() で cor_smooth = TRUE を指定して正定値に補正してから入力します。
よくある質問
カテゴリカルデータとは何ですか?
値が数量ではなく分類を表すデータです。血液型や業種のように順序のない名義尺度と、満足度の5段階のように順序はあるが間隔が等しいとは限らない順序尺度があります。名義尺度ではクラメールのVなどの連関係数、順序尺度ではスピアマン・ケンドールの順位相関やポリコリック相関を使います。
ピアソンとスピアマンはどう使い分けますか?
両方が量的変数で関係が直線的、外れ値が少なければピアソン、片方が順序尺度であるか、外れ値や曲線的な単調関係があればスピアマンを使います。順序尺度の段階数が少ない場合は、どちらも背後の連続量の相関を小さく見積もる点は共通です。
テトラコリック相関とφ係数の違いは何ですか?
どちらも2×2表から計算しますが、φ係数は観測された二値どうしの連動を表し、テトラコリック相関は二値の背後にある連続量どうしの相関を推定します。同じ表でもテトラコリック相関のほうが絶対値が大きく出ます。セルに0があるとテトラコリック相関は±1に張り付くため、補正の有無を確認します。
ポリコリック相関は何段階の尺度から使えますか?
2段階(テトラコリック相関)から使えます。Rの psych の polychoric() は、扱うカテゴリ数の上限 max.cat の既定値が8です。因子分析での目安は、Rhemtullaら(2012)の結果から5段階未満ならポリコリック相関を使うカテゴリカルな推定、5段階以上で閾値がほぼ対称なら頑健な最尤法(連続扱い)でもよい、と考えます。
順位相関係数の検定はどうすればよいですか?
SciPyの spearmanr() と kendalltau() は、係数と同時に「相関が0である」という帰無仮説のp値を返します。ただしp値は標本サイズで小さくなるため、相関の強さは係数の値で判断します。p値の読み方は有意差検定とは?有意差・p値の意味と検定の種類・やり方をわかりやすく解説で詳しく解説しています。