case-kの備忘録

日々の備忘録です。データ分析とか基盤系に興味あります。

Pythonで多変量解析、3変数以上の偏相関係数を算出してみた

この記事では説明変数3つ以上の偏相関係数算出方法をPythonで行います。実際のコードはこちらにあげておきます。
# partial_correlation_coefficient.ipynb
# Partial_correlation.csv
github.com


相関係数とは

相関係数とは変数間の交互作用を取り除いた純粋な相関係数と言えます。
多変量である場合、個々の説明変数が互いに相関している場合が多いかと思います。説明変数間で相関していると目的変数に対し実際には相関していないのに、相関しているように見えてしまいます(疑似相関)。偏相関係数とは説明変数間の影響を取り除いた純粋な相関係数と言えます。
相関係数についてはこちらの記事がよくまとまっていました。
bellcurve.jp

この記事の背景

多変量データの偏相関係数を出そうと調べたところ、ほとんどが2変数の偏相関係数の算出する記事ばかりでした。
実際に多変量解析を行う場合は、2変数以上の場合が多いかと思います。調べていたところ、3変数以上の偏相関係数の算出方法を記載した記事を見つけたので、実際にPythonで実装し、正しい偏相関係数が求められたか検証してみました。

3変数以上の偏相関係数算出方法

説明変数が3変数以上の場合の偏相関係数算出方法です。
1.相関行列の逆行列を求める
2.逆行列の各要素を2つの対角要素の積の平方根で割り,符号を逆転する
www.fujiitoshiki.com

実装偏

実際に上記の方法をPythonで実装してみたいと思います。データはこの後の検証も兼ねてこちらの記事のデータを参考とさせて頂きました。
tjo.hatenablog.com

相関係数と検証はこちらの記事を参考にさせて頂きました。
blog.goo.ne.jp


データはこちらを活用してください。広告のCVと相関のあるカラムを調べます。
github.com

cv_data = pd.read_csv("./data/Partial_correlation.csv")
cv_data.head()

f:id:casekblog:20190414161125p:plain:w300

目的変数を2値に変換します。

def conv_dummy(x):
    if x == "No":
        return 0
    else:
        return 1

cv_data["cv"] = cv_data["cv"].apply(lambda x : conv_dummy(x))
cv_data.head()

f:id:casekblog:20190414161410p:plain:w300

3変数以上の偏相関係数を求めてみます。3変数以上の偏相関係数算出方法にしたがって、関数を定義します。

# 偏相関係数
def p_corr(y,data):
    corr = data.corr()
    #1.相関行列の逆行列を求める
    inv_corr = pd.DataFrame(np.linalg.inv(corr),columns=corr.columns,index=corr.columns)
    p_corr_list = []
    #2.逆行列の各要素を2つの対角要素の積の平方根で割り,符号を逆転する
    for x in corr.columns:
        p_corr = -(inv_corr[x][y] / np.sqrt(inv_corr[x][x]*inv_corr[y][y]))
        p_corr_list.append([x ,p_corr])
    return p_corr_list

実際に偏相関を求めてみます。

# 目的変数
y =  "cv"
cv_data = pd.read_csv("./data/Partial_correlation.csv")
cv_data["cv"] = cv_data["cv"].apply(lambda x : conv_dummy(x))
cv_data=p_corr(y, cv_data)
cv_data

f:id:casekblog:20190414162107p:plain:w400

検証

算出結果が正しいか検証してみます。こちらの記事で同じデータを活用して2変数間の偏相関係数を算出していたので、検証結果が正しいか確認してみます。
blog.goo.ne.jp


a1 a2 a3 a4 a5 a6 a7
a2 -0.027
a3 -0.005 0.003
a4 -0.005 0.012 0.019
a5 0.027 -0.007 -0.025 0.015
a6 -0.031 -0.013 0.018 -0.020 0.015
a7 0.006 -0.029 -0.031 0.007 -0.003 -0.011
cv 0.112 -0.059 0.003 -0.284 0.176 0.807 0.006

計算結果が一致しました。どうやら問題なさそうです。

おわりに

今回は3変数以上の偏相関係数の算出をPythonで行ってみました。実際の多変量解析ではおそらく、多重共線性という問題にぶつかります。
これは説明変数間の相関がとても高い場合に起きる問題で、逆行列が作れなかったり、回帰の推定結果が不安定になるといった問題を引き起こします。
多重共線性については改めて記事を書きたいたいと思います。