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)より小さければ、相関は統計的に有意といえます。