📈
correlation coefficent gallery
これはなに
変数間の関係性を評価するための「相関係数」をさまざまなデータの集合に対して算出してみたもの。
ねらい
相関係数の値の大小のみで関係性を評価するのではなく、可視化して特徴を確認する必要性を主張するためのもの。
相関係数とグラフ
共通関数
# 無相関
def make_no_corr_data(n):
# random.seed(0)
return [random.random() * 10 for i in range(n)]
# 正の相関
def make_posneg_corr_data(n, a=1):
random.seed(0)
r = [random.random() for i in range(n)]
random.seed(1)
x = [random.random() * 10 for i in range(n)]
y = [a * x + (i * random.random() * 10) for x, i in zip(x, r)]
# print(y)
return [x, y]
# 二次関数
def make_quadratic_corr_data(n, a=1):
random.seed(0)
r = [random.random() for i in range(n)]
random.seed(1)
x = [random.random() * 10 for i in range(n)]
y = [a * ((x - 5) ** 2) + (i * random.random() * 10) for x, i in zip(x, r)]
# print(y)
return x, y
# チェッカーボード
def make_checkerboard_corr_data(n):
x = []
y = []
# 中心を定めた無相関の塊を1ずつ作成
for k in ([1,1], [1,9], [4.5,4.5], [9,1], [9,9]):
# random.seed(0)
r = [random.random() + k[0] for i in range(int(n/5))]
x = x + r
# random.seed(1)
r = [random.random() + k[1] for i in range(int(n/5))]
y = y + r
return [x, y]
# 十字架
def make_cross_corr_data(n):
x = []
y = []
x1 = [random.random() + 4.5 for i in range(int(n/2))]
y1 = [random.random() * 10 for i in range(int(n/2))]
x2 = [random.random() * 10 for i in range(int(n/2))]
y2 = [random.random() + 4.5 for i in range(int(n/2))]
x = x1 + x2
y = y1 + y2
return [x, y]
無相関
# 無相関
tmp = pd.DataFrame({
"x": make_no_corr_data(100),
"y": make_no_corr_data(100)
})
print(np.round(tmp.corr().iloc[0,1], 2))
tmp.plot.scatter('x', 'y', figsize=(3,3))
正の相関
# 正の相関
tmp = pd.DataFrame({
"x": make_posneg_corr_data(100)[0],
"y": make_posneg_corr_data(100)[1]
})
print(np.round(tmp.corr().iloc[0,1], 3))
tmp.plot.scatter('x', 'y', figsize=(3,3))
負の相関
# 負の相関
tmp = pd.DataFrame({
"x": make_posneg_corr_data(100, a=-1)[0],
"y": make_posneg_corr_data(100, a=-1)[1]
})
print(np.round(tmp.corr().iloc[0,1], 3))
tmp.plot.scatter('x', 'y', figsize=(3,3))
二次関数
# 二次関数
tmp = pd.DataFrame({
"x": make_quadratic_corr_data(100, a=1)[0],
"y": make_quadratic_corr_data(100, a=1)[1]
})
print(np.round(tmp.corr().iloc[0,1], 3))
tmp.plot.scatter('x', 'y', figsize=(3,3))
↑ 相関係数は低いが、明らかな傾向が確認できる。
チェッカーボード
# チェッカーボード
tmp = pd.DataFrame({
"x": make_checkerboard_corr_data(100)[0],
"y": make_checkerboard_corr_data(100)[1]
})
print(np.round(tmp.corr().iloc[0,1], 3))
tmp.plot.scatter('x', 'y', figsize=(3,3))
↑ 相関係数は低いが、明らかな傾向が確認できる。
十字架
# 十字架
tmp = pd.DataFrame({
"x": make_cross_corr_data(100)[0],
"y": make_cross_corr_data(100)[1]
})
print(np.round(tmp.corr().iloc[0,1], 3))
tmp.plot.scatter('x', 'y', figsize=(3,3))
↑ 相関係数は低いが、明らかな傾向が確認できる。
まとめ
相関係数は低いが、明らかな傾向が確認できるデータは変換などの処理を行うことで扱いやすくすることができる。
参考
紹介したグラフは以下の書籍を参考にさせていただきました。
Discussion