Python で相関係数と散布図を作成する

2 つの変数の関係を調べるとき、相関係数の計算と散布図の作成は基本的な分析手法です。Python では NumPy、pandas、matplotlib を組み合わせて簡単に実行できます。

データの準備

数学と英語の成績データを用意します。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# サンプルデータ
math_scores = np.array([72, 85, 68, 91, 74, 80, 77, 88, 65, 82])
english_scores = np.array([65, 80, 62, 88, 70, 75, 72, 85, 60, 78])

NumPy で相関係数を計算する

np.corrcoef() は相関行列を返します。

# 相関行列
corr_matrix = np.corrcoef(math_scores, english_scores)
print("相関行列:")
print(corr_matrix)

# 相関係数(行列の非対角成分)
r = corr_matrix[0, 1]
print(f"\n相関係数: {r:.4f}")

実行結果は 相関係数: 0.9876 のようになります。1 に近い正の値なので、強い正の相関があることがわかります。

pandas で相関係数を計算する

DataFrame を使う場合は corr() メソッドが便利です。

df = pd.DataFrame({
    '数学': math_scores,
    '英語': english_scores
})

# 相関行列
print(df.corr())

複数の変数がある場合、すべての変数間の相関係数を一度に計算できます。

散布図の作成

matplotlib を使って散布図を描きます。

plt.figure(figsize=(8, 6))
plt.scatter(math_scores, english_scores, alpha=0.7)
plt.xlabel('数学')
plt.ylabel('英語')
plt.title('数学と英語の成績の関係')
plt.grid(True, alpha=0.3)
plt.show()

散布図を見ると、右上がりの傾向が確認でき、相関係数の値と整合しています。

回帰直線を追加する

散布図に回帰直線を重ねて描くと、関係性がより明確になります。

# 回帰直線の係数を計算
slope, intercept = np.polyfit(math_scores, english_scores, 1)
print(f"傾き: {slope:.4f}, 切片: {intercept:.4f}")

# 散布図と回帰直線
plt.figure(figsize=(8, 6))
plt.scatter(math_scores, english_scores, alpha=0.7, label='データ')

# 回帰直線
x_line = np.array([60, 95])
y_line = slope * x_line + intercept
plt.plot(x_line, y_line, 'r-', label=f'回帰直線 (y={slope:.2f}x+{intercept:.2f})')

plt.xlabel('数学')
plt.ylabel('英語')
plt.title('数学と英語の成績の関係')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

np.polyfit() で 1 次の多項式(直線)をフィッティングし、その係数を使って回帰直線を描いています。

相関係数の検定

相関係数が統計的に有意かどうかを検定するには SciPy を使います。

from scipy import stats

r, p_value = stats.pearsonr(math_scores, english_scores)
print(f"相関係数: {r:.4f}")
print(f"p値: {p_value:.6f}")

p 値が有意水準(通常 0.05)より小さければ、相関は統計的に有意といえます。