盆暗の学習記録

データサイエンス ,エンジニアリング,ビジネスについて日々学んだことの備忘録としていく予定です。初心者であり独学なので内容には誤りが含まれる可能性が大いにあります。

順序尺度にピアソンの積率相関係数を使うと相関を過小評価するおそれがある

最近、因子分析を勉強しています。

そのなかで順序尺度の相関係数という話題があったのでメモ。

たとえば、こんなデータがあったとします。

これは相関係数が0.5の二変量正規分布から発生させた乱数です。

これを「平均より高いかどうか」などテキトーな閾値で区切って離散化して質的変数にしてみます。

# 離散化
d1 = X[:, 0] >= X[:, 0].mean()
d2 = np.ones(shape=(n, ))
d2[(-4 <= X[:, 1]) & (X[:, 1] < 4)] = 2
d2[(4 <= X[:, 1])] = 3

クロス集計表は次のようになりました。

これらのデータに対して、

  1. 離散化前の量的変数に積率相関係数を適用した場合
  2. 離散化後の質的変数に積率相関係数を使用した場合

の結果はこのようになります

積率相関係数を離散化後の質的変数に適用している場合、0.353と真の値(0.5)よりもかなり小さな値になっています。

順序尺度の相関係数

こうした問題に対処するために、次のような相関係数が存在します。

今回でいうと2変数の両方とも離散化しているのでポリコリック相関係数を使うと、

このように真の値により近い推定値を得られます。

これらの相関係数は「順序尺度の背景には連続変数が存在し、どこかの閾値で区切られて順序尺度が作られている」と考え、その背景の連続変数が正規分布に従うと仮定して最尤推定していくものになります (このへんは小杉考司 2013がわかりやすいです)。

カテゴリ数がいくつだったら積率相関係数を使っていいのか

因子分析においてはカテゴリ数が5以上なら誤差が少ないという研究(萩生田伸子, & 繁桝算男 1996)を根拠に5がひとつの目安となる様子。

相関係数だけだとどうなのか気になったので軽く実験してみました。

また同様にデータを発生させます

pandas.cut()を用いて離散化させていきます。

for k in range(2, 11):
    d1 = pd.cut(X[0], bins=k, labels=range(k)).astype(int)
    d2 = pd.cut(X[1], bins=k, labels=range(k)).astype(int)
...

ポリコリック

今回のデータの場合、カテゴリ数が4くらいまでは積率相関係数の評価のズレが大きいように思えます。

その点、ポリコリックはよく機能しています。

ポリシリアル

2変数あったうち片方だけ離散化してポリシリアル相関係数を利用した場合、ポリシリアルのほうがズレてました…。なんでだろう。 まだまだ勉強不足のため原因に心当たりはありませんが、もし今後わかったら追記したいと思います…。

参考文献

豊田本はいい本でした。ただ絶版になっており、中古は値段が高騰しています…😢