📈

correlation coefficent gallery

2024/12/31に公開

これはなに

変数間の関係性を評価するための「相関係数」をさまざまなデータの集合に対して算出してみたもの。

ねらい

相関係数の値の大小のみで関係性を評価するのではなく、可視化して特徴を確認する必要性を主張するためのもの。

相関係数とグラフ

共通関数

# 無相関
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))

↑ 相関係数は低いが、明らかな傾向が確認できる。

まとめ

相関係数は低いが、明らかな傾向が確認できるデータは変換などの処理を行うことで扱いやすくすることができる。

参考

紹介したグラフは以下の書籍を参考にさせていただきました。
https://www.kspub.co.jp/book/detail/1529014.html

Discussion