2つの量の関係の強さを1つの数で表すのが相関係数です。代表的な2種類のうち、どちらを使えばよいかは「データの形」で決まります。7つの事例で、散布図を見て自分で選び、答え合わせをしてみましょう。
データはこの画面の中で乱数から作っています。設定を変えても回答は残ります。
r と ρ を −1 から +1 の線の上に並べました。2つの印が離れているほど、2つの係数の答えが食い違っています。
授業で使っている SciPy でも同じ確認ができます。フォントは、このコードと同じフォルダに置いた NotoSansJP-Regular.ttf と NotoSansJP-Bold.ttf を使います。
from pathlib import Path
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import font_manager as fm
from scipy import stats
# 日本語フォントの設定(同じフォルダの Noto Sans JP を使う)
try:
base = Path(__file__).parent # .py ファイルとして実行したとき
except NameError:
base = Path.cwd() # Jupyter Notebook で実行したとき
for f in ["NotoSansJP-Regular.ttf", "NotoSansJP-Bold.ttf"]:
fm.fontManager.addfont(str(base / f))
plt.rcParams["font.family"] = fm.FontProperties(
fname=str(base / "NotoSansJP-Regular.ttf")).get_name()
# データの準備(配信週数と再生回数:単調だが直線ではない例)
rng = np.random.default_rng(0)
x = rng.uniform(0, 10, 40)
y = np.exp(0.5 * x + rng.normal(0, 0.3, 40))
# 1. 散布図と、分布の形(Q-Q プロット)を見る
fig, ax = plt.subplots(1, 3, figsize=(11, 3.4))
ax[0].scatter(x, y)
ax[0].set_xlabel("配信開始からの週数")
ax[0].set_ylabel("週間再生回数(千回)")
ax[0].set_title("散布図")
stats.probplot(x, plot=ax[1]); ax[1].set_title("x の Q-Q プロット")
stats.probplot(y, plot=ax[2]); ax[2].set_title("y の Q-Q プロット")
plt.tight_layout()
plt.show()
# 2. 正規性の検定(p < 0.05 なら正規分布とは言いにくい)
print("x の正規性:", stats.shapiro(x))
print("y の正規性:", stats.shapiro(y))
# 3. 2つの相関係数をくらべる
print("Pearson r =", stats.pearsonr(x, y))
print("Spearman ρ =", stats.spearmanr(x, y))