2回目の投稿です。
会社であまりやることがないのでKaggleのようにガンガン手を動かす取り組みもいいけど、なあなあにしてきた統計の基礎知識ってきっちりつけないとダメだよねと感じたので、現在この本を使ってお勉強しています。
ということで、今回はこの本の第3章から、統計を学び始めた人が勘違いしやすい「見せかけの相関」と「偏相関係数」について私が好きな野球のデータを使って解説しようと思います。
基本的な統計知識なのでここを見るような方には釈迦に説法だと思いますが、自身への備忘録も兼ねて。
見せかけの相関とは
あるデータ系列$A=[a_1, a_2, ... , a_n]$と$B=[b_1, b_2, ... , b_n]$の相関係数(の絶対値)が高い値を示すが、両者の間に直接の因果関係・相関は無く、介在する第3のデータ系列$C=[c_1, c_2, ... , c_n]$とA/Bの相関の高さによってAとBにも相関があるように見える現象のこと。
私の書き方がヘタクソなのが最大の原因ですが、文字で書いてもピンと来ないと思うので野球データをもとにして実例を挙げます。
有難いことに、MLBに関しては下記サイトで歴代の個人成績データが提供されています。
SeanLahman.com
NPBもこういうのやってくれたらいいんですけどね。。公式サイトがあの有様だとあと50年ぐらいかかりそう
2017 – comma-delimited version – via Baseball Databank project のリンクから2017年度までの選手データがcsvでダウンロードできますのでどうぞ。
落としたデータの中から、選手ごとのシーズン打撃成績データを読み込みます。
簡単のために2000年以降のデータに絞ります。
import pandas as pd
import numpy as np
import math
#見かけ上の相関と偏相関係数についてMLBのデータから学ぶ
#打撃成績を取得
bat = pd.read_csv("./baseballdatabank-master/core/Batting.csv")
#2000年~2017年まで抽出
bat = bat[bat["yearID"]>=2000]
では、最もポピュラーであろうシーズン安打数とシーズン三振数の相関を計算してみましょう。
#安打数と三振数の相関を計算する
corrcoef_h_so = np.corrcoef(bat["H"],bat["SO"])[0,1]
print("Correlation coefficient between hits and strikeouts: {0}".format(corrcoef_h_so))
# Correlation coefficient between hits and strikeouts: 0.8895936528559321
相関0.89と出ました。18年分、MLB30球団の全選手のデータを使っているのでサンプル数は十分なはず。
ということは、三振をする選手ほど安打を打つことが出来る優秀な選手ということでしょうか?
そんなはずはないですね。この2指標の相関が高く出るのは、
- 打席数が多いほど三振数が増える
- 打席数が多いほど安打数が増える
というように、「打席数」という隠れた指標とこの2指標の相関が高いことが理由です。
実際、上記データにおいて打席数と三振数の相関は0.92、打席数と安打数の相関は0.99にもなっています。
これが**「見せかけの相関」**です。
偏相関係数とは
上で述べたケースにおいて、安打数と三振数の相関性をより正しく分析するには、「打席数」の影響を排除した「安打数」と「三振数」の相関係数を求める必要があります。
これが**「偏相関係数」**になります。
偏相関係数の求め方はこうです。
データ系列A,B,Cがあり、AとB,BとC,AとCの相関係数をそれぞれ$r_{AB},r_{BC},r_{AC}$と表す時、
データ系列Cの影響を排除したデータ系列AとBの相関係数(データ系列AとBの偏相関係数)$r_{AB・C}$は
r_{AB・C} = \frac{r_{AB}-r_{AC}r_{BC}}{\sqrt{1-{r_{AC}}^2}\sqrt{1-{r_{BC}}^2}}
実際に先ほどの例を使って、「安打数」と「三振数」の偏相関係数を求めてみましょう。
#打席数の影響を除いた安打数と三振数の偏相関係数を計算する
p_corrcoef_h_so = float(corrcoef_h_so-corrcoef_ab_h*corrcoef_ab_so)/float(math.sqrt(1-corrcoef_ab_h*corrcoef_ab_h)*math.sqrt(1-corrcoef_ab_so*corrcoef_ab_so))
print("Partial correlation coefficient between hits and strikeouts: {0}".format(p_corrcoef_h_so))
# Partial correlation coefficient between hits and strikeouts: -0.4387090916909891
偏相関係数は-0.44でした。したがって、打席数の影響を排除すると、三振が少ないほど安打が増える傾向にあるということが読み取れます。
#おわりに
今回の例は(特に野球を知っている人には)極めて単純な例であり、「こんなのミスリードされるわけないやろ」と感じると思います。
そもそも野球というフィールドでは、三振はともかく、安打は「数」ではなく「率」で評価することが殆どなので、その場合は打席数の影響が最初から排除されていますからね。
しかし野球とは関係ない、特に自分が初めて触れる種類の実データを扱っていると、ついついこの「見せかけの相関」に騙されて誤った結論を導きかけることも有り得るのではないでしょうか。
少なくとも私はまだデータ分析初心者なので時々ひっかかります(笑)
今後気を付けようと感じました。
#次回
前回の投稿で触れたHome Credit Default RiskコンペはDeadlineまでまだ1ヶ月近くあるので終わってから書く予定です。