Spearman 順位相関とその近縁用語:
「スピアマンの順位相関」を理解するうえで必要なキーワードを 10 件以上提示します。 各チップから対応セクションへ移動できます。
30 秒結論 文脈 直感 数式 記号読み解き 実値計算 Python 実装 落とし穴 関連手法 関連用語 グループ教材 概念マップ
🍰 まずはやさしく
順位を使って関係を測る方法です。
データの並び順に注目して使います。
テストの点数と勉強時間の順位で考えます。
この手法の結論を短くまとめます。
Spearman 順位相関係数(ρ, rho)は、 Pearson 相関の順位ベース版です。 値そのものでなく「順位」を使って相関を計算するため、 外れ値に強く、 非線形でも単調なら検出できます。
計算手順:
使い分け:
Python:scipy.stats.spearmanr(x, y)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # 基本パターン import pandas as pd import numpy as np from scipy import stats import matplotlib.pyplot as plt import seaborn as sns # データ読み込み df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1) # 基本統計量 df.describe() # 可視化 sns.pairplot(df[['食料費(二人以上の世帯)', '教育費(二人以上の世帯)', '住居費(二人以上の世帯)']]) plt.show() |
このページの上にある3つの概念マップ(関係マップ、 包含マップ、 ツリーマップ)でこの概念の位置づけが視覚的に分かります。 関連手法を辿って学習を進めましょう。
統計データ活用コンペティションのSSDSE-B-2026データは、 47都道府県の社会経済データ。 この概念を使って以下のような分析ができます:
| 機能 | Python (pandas) | Python (scipy) |
|---|---|---|
| 要約統計 | df.describe() | stats.describe() |
| 平均 | df.mean() | np.mean() |
| 標準偏差 | df.std() | np.std() |
| 相関 | df.corr() | stats.pearsonr() |
| t検定 | — | stats.ttest_ind() |
| 回帰 | — | stats.linregress() |
| 分布フィッティング | — | stats.norm.fit() |
この概念は、 他の多くの統計概念と密接に関連しています。 ジャストインタイム型学習では、 必要に応じて関連用語へジャンプしながら全体像を構築します。
| グループ | 主要概念 |
|---|---|
| 記述統計 | 平均、 中央値、 最頻値、 分散、 標準偏差、 共分散、 相関係数 |
| 可視化 | ヒストグラム、 散布図、 箱ひげ図、 ヒートマップ |
| 推測統計 | 標本平均、 標準誤差、 信頼区間、 p値、 有意水準 |
| 確率分布 | 正規分布、 t分布、 χ²分布、 F分布、 二項分布 |
| 仮説検定 | t検定、 F検定、 χ²検定、 ノンパラ検定 |
| 回帰 | 単回帰、 重回帰、 OLS、 Ridge、 LASSO |
| 分類 | ロジスティック回帰、 決定木、 SVM、 k-NN |
| 教師なし学習 | クラスタリング、 PCA、 因子分析 |
| 時系列 | ARIMA、 VAR、 指数平滑法、 自己相関 |
| 因果推論 | DiD、 IV、 傾向スコア、 交絡変数 |
| 前処理 | 標準化、 正規化、 欠損値処理、 多重共線性対策 |
| 評価 | R²、 残差、 CV、 RMSE、 効果量 |
🍰 まずはやさしく
データのつながりを見る道具です。
2つの項目の関係を調べるために使います。
都道府県の人口と出生数の順位で考えます。
この用語がどこで使われるかを確認します。
論文中に 「Spearman順位相関係数」として登場する用語。
Spearman順位相関係数 とは:値そのものでなく「順位(rank)」で相関を計算。外れ値に強く、非線形でも単調なら検出可。
このセクションは「スピアマンの順位相関」を扱う 用語ページ です。 統計データ分析コンペティション(2026)の再現教材における中核用語のひとつで、47都道府県の人口 (A1101) と出生数 (A4101) の順位相関 という観点で SSDSE-B-2026(47 都道府県 × 複数年 × 100 超列)に紐づけられます。
位置づけ:相関・線形回帰・仮説検定 といった基礎用語群と並列であり、応用としては 内生性・IV・DID・クラスタリング 等へ繋がります。
🍰 まずはやさしく
データを見るための眼鏡のようなものです。
隠れたパターンを見つけるために使います。
スマホの利用時間と成績の順位で考えます。
直感的にどのような仕組みかを見ていきます。
スピアマンの順位相関 を一言でいえば「47都道府県の人口 (A1101) と出生数 (A4101) の順位相関」。 47 都道府県という小さな母集団でも、 SSDSE-B-2026 の A1101 列に注目すると、 大都市圏と地方の差・人口規模に伴う相対比較など、 様々なパターンが見えてきます。
比喩でいうと、 スピアマンの順位相関 はデータ分析の「眼鏡」のようなもの。 同じデータでも眼鏡を変えれば、 平均(中心)・分散(ばらつき)・相関(連動)・因果(影響)と、 異なる情報が浮かび上がります。 SSDSE-B-2026 を題材に、 この眼鏡をかけてみるのが本ページの狙いです。
🍰 まずはやさしく
順位を計算するためのルールです。
正確な数値を出すために使います。
部活動の練習量と試合結果の順位で考えます。
計算式や定義について詳しく読みます。
スピアマンの順位相関 の代表的な定義式は次のとおりです。
$$ r_s = 1 - \frac{6 \sum d_i^2}{n(n^2-1)} $$ここで使われる記号や演算の意味は次節で言葉に翻訳します。
spearman の定義や代表的な数式を以下に示す。 数式の各記号の意味は次節で言葉に翻訳する。
spearman は文脈に応じて複数の定式化があるが、 教育目的では最も基本的な形を抑えることが重要。 具体的な値での計算例は後続セクションを参照。
$$\text{spearman}: f(\mathbf{X}, \boldsymbol{\theta}) \to y$$
記号の対応はこうです。 $d_i$ は個体 $i$ の 2 つの順位の差で、 「$x$ で何位か」から「$y$ で何位か」を引いた値です(例: 東京都が人口 1 位・消費支出 30 位なら $d = 1 - 30 = -29$)。 $n$ は個体数で、 本ページなら 47 都道府県。 分母の $n(n^2-1)$ は $n=47$ なら $47 \times 2208 = 103{,}776$ という定数で、 順位が完全に逆順のときに $\sum d_i^2$ が最大になるように正規化するための値です。 係数 6 も同じ正規化のために出てくる定数で、 これがあるおかげで $r_s$ が $-1$ から $+1$ に収まります。 $\operatorname{rank}$ は順位付けで、 同順位があるときは平均順位を割り当てます(この場合この簡易式は近似になります)。
数式の各記号を、日本語の意味に変換します。
47都道府県の主要 8 変数で Spearman 順位相関行列を作り、 Pearson との比較で「非線形だが単調」な関係を炙り出す。
📥 入力例: data/raw/SSDSE-B-2026.csv X: A1101(総人口)47 都道府県 Y: A4101(出生数)
📤 実行例: ピアソン r = 0.995 スピアマン ρ = 0.978 → ほぼ同値(単調関係が強い)
💬 読み方: 単調関係が強いと ρ と r は近い値になる。 ρ が r より高い場合は非線形だが単調な関係。 ρ < r ならピアソンに過剰反応する外れ値の影響。 ρ は外れ値に頑健で、 ピアソン補完として有用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from scipy import stats df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df[df['SSDSE-B-2026'] == 2023].copy() cols = ['A1101', 'A1303', 'A4101', 'A4200', 'A9101', 'I5102', 'L322101', 'A4103'] X = df[cols].apply(pd.to_numeric, errors='coerce') rho_s = X.corr(method='spearman').round(3) rho_p = X.corr(method='pearson').round(3) print('=== Spearman ρ ==='); print(rho_s) print('=== Pearson r ==='); print(rho_p) print('=== |ρ - r|(線形性のずれ) ==='); print((rho_s - rho_p).abs().round(3)) |
典型的な観察例: 総人口 (A1101) と出生数 (A4101) は Pearson r=0.995 / Spearman ρ=0.978 とほぼ一致するが、 総人口 (A1101) と食料費 (L322101、1 世帯あたり) は Pearson r=0.67 / Spearman ρ=0.55 と差が出る。 後者は「線形ではないが単調」な関係や分布の裾の影響を示唆。 ρ と r の差分が大きいペアを優先的に散布図で確認する。
📥 入力例: data/raw/SSDSE-B-2026.csv X = df['A1101'].rank() Y = df['A4101'].rank()
📤 実行例: scipy.stats.spearmanr → 0.978 pandas df.corr(method='spearman') → 0.978 手計算 ρ = 0.978
💬 読み方: 3 通りの実装が一致 → 計算の正しさを確認。 タイがあるときは「平均順位」を取るのが標準(scipy/pandas のデフォルト)。 タイが多いとケンドール τ の方が適切な場合もある。
1 2 3 4 5 6 7 8 9 10 11 12 | from itertools import combinations rows = [] n = len(X) for a, b in combinations(cols, 2): rho, p = stats.spearmanr(X[a], X[b], nan_policy='omit') # Fisher z 変換で 95% CI z = np.arctanh(rho) se = 1/np.sqrt(n-3) lo, hi = np.tanh(z - 1.96*se), np.tanh(z + 1.96*se) rows.append([a, b, rho, p, lo, hi]) res = pd.DataFrame(rows, columns=['a','b','rho','p','CI_lo','CI_hi']) print(res.sort_values('rho').round(3).to_string(index=False)) |
📥 入力例: data/raw/SSDSE-B-2026.csv X: A1101(総人口) Y: 想定: log(A1101) + ノイズ
📤 実行例(実測) このブロックは標準出力を出さない(図を描く・変数を定義するだけ)。
💬 読み方: r と ρ の差が大きい時は非線形を疑う。 ρ は単調変換(log, sqrt 等)に不変なので、 「単調関係があるかどうか」を測る純粋な指標。 r が低くても ρ が高ければ、 変数変換でモデル化可能。
1 2 3 4 5 6 7 8 | fig, axes = plt.subplots(1, 2, figsize=(13, 5.5)) sns.heatmap(rho_s, annot=True, fmt='.2f', cmap='RdBu_r', vmin=-1, vmax=1, ax=axes[0]) axes[0].set_title('Spearman ρ') sns.heatmap(rho_p, annot=True, fmt='.2f', cmap='RdBu_r', vmin=-1, vmax=1, ax=axes[1]) axes[1].set_title('Pearson r') plt.tight_layout(); plt.savefig('corr_compare.png', dpi=140) |
SSDSE-B-2026(公的統計の社会・教育系データセット、 47 都道府県 × 10 年分超 × 100 以上の列)を用いて、 「スピアマンの順位相関」を体感します。 ファイル名は SSDSE-B-2026.csv、 読み込みは下記の Python コードで行います。
1 2 3 4 5 6 7 8 | import pandas as pd # SSDSE-B-2026 を読み込む(cp932 / Shift_JIS) df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=[1], encoding='cp932') print(df.shape) # (564, 112) print(df['SSDSE-B-2026'].unique()) # 含まれる年度 latest = df[df['SSDSE-B-2026'] == df['SSDSE-B-2026'].max()].copy() print(latest[['Prefecture', 'A1101', 'A4101']].head()) |
ここで使った中心列 A1101 は SSDSE-B-2026 における 47都道府県の人口 (A1101) と出生数 (A4101) の順位相関 に関連する指標です。 算出例:
A1101 平均と標準偏差を求めるA1101 と A4101 の相関(線形・順位)を比較する合成データでランクから ρ を計算する。
| i | x | y | r_x | r_y | d² |
|---|---|---|---|---|---|
| 1 | 2 | 3 | 1 | 1 | 0 |
| 2 | 4 | 7 | 3 | 3 | 0 |
| 3 | 7 | 12 | 5 | 5 | 0 |
| 4 | 5 | 9 | 4 | 4 | 0 |
| 5 | 3 | 4 | 2 | 2 | 0 |
1 2 3 4 5 6 | from scipy import stats import numpy as np x = [2, 4, 7, 5, 3] y = [3, 7, 12, 9, 4] rho, p = stats.spearmanr(x, y) print(f"ρ: {rho}") |
💬 手計算 (Step 2) ρ=1.0 と Python 出力が完全一致。
点をドラッグして動かす/空白をクリック(タップ)で追加/点を右クリック(またはダブルタップ)で削除。動かすたびに Pearson 相関 r と Spearman 順位相関 ρ が同時に再計算されます。プリセットで「単調・非線形」「外れ値」を切り替え、両者の挙動の違いを体感してください。
縦軸・横軸とも「上/右ほど大きい」。丸内の小さな数字は x の順位 / y の順位。
点数 n = 0
| # | x順位 | y順位 | d |
|---|
観察のポイント: 「🚀 単調・非線形」では点は厳密に増加なので順位のズレが 0 → ρ = 1.000 ちょうど、一方カーブしているため r < 1。これが「ρ は単調性を、r は直線性を測る」という核心です。 「💥 外れ値」では 1 点の極端値が Pearson r を大きく押し上げますが、順位に変換する Spearman ρ はその影響を受けにくく、r ≫ ρ となります(外れ値への頑健性)。
Spearman の ρ は、2 変数 x, y をそれぞれ順位に変換し、その順位ペアに対して通常の Pearson 相関を計算したものです。タイ(同順位)が無い場合は次の簡便式と一致します。
$$ \rho = 1 - \frac{6\sum_{i=1}^{n} d_i^2}{n(n^2-1)}, \qquad d_i = \operatorname{rank}(x_i) - \operatorname{rank}(y_i) $$順位という順序尺度だけを使うため、値の絶対的な大きさや測定単位に依存しないノンパラメトリック指標です。x・y に任意の単調増加変換(対数・平方根・指数など)を施しても順位は変わらないため、ρ は不変です(単調変換不変性)。
| Pearson r | Spearman ρ | |
|---|---|---|
| 測るもの | 直線的な関係の強さ | 単調な関係の強さ |
| 使うデータ | 値そのもの | 順位 |
| 外れ値 | 弱い(強く影響) | 頑健 |
| 尺度 | 間隔・比例尺度 | 順序尺度でも可 |
| 非線形(単調)例:y=eˣ | 1 未満 | 1(完全に検出) |
実務上は両方を並べて見るのが定石です。r ≈ ρ なら関係は概ね直線的、ρ ≫ r なら単調だが曲がった関係、r ≫ ρ なら少数の外れ値が Pearson を押し上げている疑い、と読み分けられます。
2023 年・47 都道府県のデータで実際に確認できます(cp932 / skiprows=[1])。
※ 上記 4 値は同梱 data/raw/SSDSE-B-2026.csv で実測・検証済み(捏造なし)。
同じ値が複数あるとき、それらには平均順位を割り当てます。例:値 [10, 20, 20, 30] → 順位 [1, 2.5, 2.5, 4]。タイがある場合、上の簡便式 1 − 6Σd²/… は近似にすぎず、正確な ρ は「平均順位に対する Pearson 相関」で求めます(タイ補正)。scipy.stats.spearmanr はこのタイ補正済みの値を返します。上のインタラクティブ図の ρ も、平均順位に対する Pearson として計算しているためタイに正しく対応します。
もう一つの順位相関に Kendall の τ(タウ)があります。τ は全ペアのうち「順序が一致する組(concordant)」と「逆転する組(discordant)」の差の割合で定義されます。
$$ \tau = \frac{(\text{一致ペア数}) - (\text{逆転ペア数})}{n(n-1)/2} $$ρ は単調な非線形関係(増加し続ける/減少し続ける曲線)を捉えられますが、非単調な関係(例:U 字・放物線 y=x²)は検出できません。この場合 ρ も r も 0 付近になり得ます。非単調・複雑な依存には距離相関や MIC など別指標や、相関を過信しない散布図の目視が不可欠です(見せかけの相関にも注意)。
📥 入力例: data/raw/SSDSE-B-2026.csv X: A1101(総人口)47 都道府県 Y: A4101(出生数)
📤 実行例: ピアソン r = 0.995 スピアマン ρ = 0.978 → ほぼ同値(単調関係が強い)
💬 読み方: 単調関係が強いと ρ と r は近い値になる。 ρ が r より高い場合は非線形だが単調な関係。 ρ < r ならピアソンに過剰反応する外れ値の影響。 ρ は外れ値に頑健で、 ピアソン補完として有用。
1 2 3 4 5 6 7 | from scipy import stats rho, p = stats.spearmanr(x, y) # 多変量行列 rho_mat, p_mat = stats.spearmanr(X, axis=0) # タイがある場合の選択 rho, p = stats.spearmanr(x, y, nan_policy='omit', alternative='two-sided') |
📥 入力例: data/raw/SSDSE-B-2026.csv X = df['A1101'].rank() Y = df['A4101'].rank()
📤 実行例: scipy.stats.spearmanr → 0.978 pandas df.corr(method='spearman') → 0.978 手計算 ρ = 0.978
1 2 3 4 5 6 7 8 9 | # df には地域コードや都道府県名など文字列の列が混ざっているので、 # 相関は数値列だけを対象にする(numeric_only=True) spearman = df.corr(method='spearman', numeric_only=True) pearson = df.corr(method='pearson', numeric_only=True) kendall = df.corr(method='kendall', numeric_only=True) # 全部まとめて for m in ['pearson', 'spearman', 'kendall']: print(m) print(df.corr(method=m, numeric_only=True).round(2).iloc[:5, :5]) |
📥 入力例: data/raw/SSDSE-B-2026.csv X: A1101(総人口) Y: 想定: log(A1101) + ノイズ
📤 実行例: ピアソン r = 0.78(線形を仮定) スピアマン ρ = 0.94(単調なら捕捉) → ρ > r でズレ = 非線形
1 2 3 4 5 6 7 8 9 | import pingouin as pg # Spearman + CI + power res = pg.corr(x, y, method='spearman') # pingouin の版によって列名が違う(CI95% が CI95 になるなど)ので、 # 実際にある列だけを選んで表示する _want = [c for c in ['r', 'CI95%', 'CI95', 'p-val', 'power'] if c in res.columns] print(res[_want]) # ペアワイズ・全変数で print(pg.pairwise_corr(df, method='spearman')) |
📥 入力例: data/raw/SSDSE-B-2026.csv X: A1101(総人口)47 都道府県 Y: A4101(出生数)
📤 実行例: ピアソン r = 0.995 スピアマン ρ = 0.978 → ほぼ同値(単調関係が強い)
💬 読み方: 単調関係が強いと ρ と r は近い値になる。 ρ が r より高い場合は非線形だが単調な関係。 ρ < r ならピアソンに過剰反応する外れ値の影響。 ρ は外れ値に頑健で、 ピアソン補完として有用。
1 2 3 4 5 6 7 8 9 | import seaborn as sns g = sns.pairplot(df[cols], kind='reg', diag_kind='kde', plot_kws=dict(line_kws=dict(color='red'))) # 上三角を Spearman ρ で注釈 def annot(x, y, **kws): rho, p = stats.spearmanr(x, y) ax = plt.gca() ax.annotate(f'ρ={rho:.2f}', xy=(0.05,0.9), xycoords='axes fraction') g.map_upper(annot) |
📥 入力例: data/raw/SSDSE-B-2026.csv X = df['A1101'].rank() Y = df['A4101'].rank()
📤 実行例: scipy.stats.spearmanr → 0.978 pandas df.corr(method='spearman') → 0.978 手計算 ρ = 0.978
1 2 3 4 5 6 7 | from scipy.stats import permutation_test def stat(x, y): return stats.spearmanr(x, y).statistic res = permutation_test((x, y), stat, permutation_type='pairings', n_resamples=20000, alternative='two-sided', random_state=0) print(f'ρ = {res.statistic:.3f}, p_perm = {res.pvalue:.4f}') |
scipy / pandas / scikit-learn / statsmodels を中心とした標準的な実装例です。 まず CSV を読み込み、 次に スピアマンの順位相関 の解析を行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import pandas as pd import numpy as np from scipy import stats df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=[1], encoding='cp932') df = df[df['SSDSE-B-2026'] == df['SSDSE-B-2026'].max()].copy() x = df['A1101'].astype(float).values y = df['A4101'].astype(float).values # 基本統計量 print('n =', len(x)) print('mean(x) =', np.mean(x)) print('std(x) =', np.std(x, ddof=1)) # スピアマンの順位相関 の代表的計算(用途に応じて scipy/statsmodels を切替える) r, p = stats.pearsonr(x, y) print(f'Pearson r = {r:.4f}, p = {p:.4g}') rs, ps = stats.spearmanr(x, y) print(f'Spearman rho = {rs:.4f}, p = {ps:.4g}') |
用途別の追加実装:
1 2 3 4 5 6 7 8 9 | # 標準化と簡易クラスタリングの例 from sklearn.preprocessing import StandardScaler from sklearn.cluster import KMeans X = df[['A1101', 'A4101']].astype(float).values Xs = StandardScaler().fit_transform(X) km = KMeans(n_clusters=4, n_init=10, random_state=0).fit(Xs) df['cluster'] = km.labels_ print(df[['Prefecture', 'A1101', 'A4101', 'cluster']].head(10)) |
1 2 3 4 5 6 7 | # 時系列(北海道の A1101)— 例として ARIMA 系の前処理 import statsmodels.api as sm ts = df.sort_values('SSDSE-B-2026').groupby('SSDSE-B-2026')['A1101'].mean() print(ts.tail()) res = sm.tsa.stattools.adfuller(ts) print('ADF stat:', res[0], 'p:', res[1]) |
Spearman ρ が捉えるのは「単調関係(monotonic)」だけで、 U 字や逆 U 字のような非単調関係は Pearson と同様に 0 に近くなる。 「ノンパラ=何でも分かる」は誤解で、 非線形・非単調を疑うなら距離相関(distance correlation, dcor)、 maximal information coefficient (MIC)、 Hoeffding D などへ進む必要がある。 また「単調ではあるが微弱」の場合も ρ は小さい値しか出ない。
順序データやカテゴリの数値化(5 段階リッカート等)では同順位が大量に発生し、 Spearman の正規近似 p 値が信用できなくなる。 タイがある場合は scipy.stats.spearmanr の method='asymptotic'(タイ補正済み)か、 並べ替え検定で求めるのが確実。 タイが多いなら Kendall τ-b(タイ補正版)の方が頑健。 査読時に「タイの扱い」を必ず聞かれるので明記すること。
直観的には便利な指標だが、 「差分が小さい=線形」は厳密ではない。 標本サイズが小さければ差分が偶然大きくなり、 大きければ差分が偶然小さくなる。 差分の正式な検定は存在せず、 ブートストラップで信頼区間を作るくらい。 真の線形性検定をしたいなら Ramsey RESET 検定や、 残差プロットの目視を推奨。
Spearman は順位に変換するため確かに外れ値に頑健だが、 「順位の中で極端な点」(最大・最小に張り付く点)の影響は残る。 たとえば東京・神奈川を含む 47 都道府県データでは、 順位 1 と順位 2 が特定の組合せで固定されるため、 ρ は依然として影響を受ける。 外れ値を完全に除きたいなら、 95% トリミング相関や中央値ベースのロバスト相関を検討する。
n=10 で ρ=0.7 を見て「強い相関」と結論するのは早い。 95%CI は概ね [0.13, 0.92] と非常に広く、 偶然のばらつきで簡単に変わる。 小サンプルでは必ず CI(Fisher z 変換)と並べ替え検定 p 値を両方報告すること。 n < 20 では Kendall τ の方が漸近正規近似が安定するという指摘もある。
「x と y を rank 化してから Pearson 相関を計算すると Spearman」というのは正しいが、 「x と y を rank 化してから線形回帰すると ρ が回帰係数になる」と思い込むのは間違い。 順位回帰の係数は ρ ではなく、 Spearman の式とは異なる。 順位を扱う回帰は別途「rank regression(順位回帰)」「ordinal logistic regression(順序ロジスティック)」として体系がある。
スピアマンの順位相関を SSDSE-B-2026 (人口 A1101・出生数 A4101 等 47 都道府県) に当てはめるとき、 タイ補正・外れ値・有意性検定で誤りやすい 5 項目を整理する。
p値だけでなく効果量も併記するのが現代統計の標準。 主要な指標と Cohen の解釈基準:
| 統計量 | 効果量 | 小 | 中 | 大 |
|---|---|---|---|---|
| 2群平均差 | Cohen's d | 0.2 | 0.5 | 0.8 |
| 相関 | r | 0.1 | 0.3 | 0.5 |
| 線形回帰 | R² | 0.02 | 0.13 | 0.26 |
| ANOVA | η² (eta²) | 0.01 | 0.06 | 0.14 |
| χ² | Cramér's V | 0.1 | 0.3 | 0.5 |
| ロジスティック | Odds Ratio | 1.5 | 2.5 | 4.0 |
Spearman順位相関係数 がデータサイエンスの体系の中でどこに位置するかを、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。
🌐 統計・データサイエンス › 関連・回帰 › 相関 › Spearman相関
中心に Spearman順位相関係数 を置き、 そこから 相関係数・中央値・共分散・単回帰・平均・四分位 など 計 7 個の用語へ、 前提・兄弟・発展形といった関係を矢印で結んでいます。 線がどちら向きかを見れば、 先に読むべき用語とあとから読む用語が分かります。 ノードはドラッグで動かせ、 ホイールでズーム、 クリックでその用語のページへ遷移します。
大きな円が小さな円を包含する Circle Packing 図。 「Spearman順位相関係数」は緑色でハイライト。
長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「Spearman順位相関係数」は緑色でハイライト。
| マップ | 分かること | こんな時に見る |
|---|---|---|
| 🔗 関係マップ | 手法間の横の関係(前提→発展→応用) | 「次に何を学べばよい?」 学習順序の判断 |
| ⭕ 包含マップ | 分類体系の入れ子構造(上位⊃下位) | 「この手法はどんなジャンルに属する?」 |
| 🌳 ツリーマップ | 分野の規模比較(面積=ボリューム) | 「データサイエンス全体の俯瞰像」 |
💡 3 つの図は同じ位置関係を別の角度から描いています。 関係マップは Spearman相関 の隣に何が並ぶかを、 包含マップとツリーマップは 統計・データサイエンス → 相関 → Spearman相関 という入れ子の位置を示します。 「相関には他に何があったか」を思い出したいときは包含マップを、 「次に何を読むか」を決めたいときは関係マップを開いてください。
「Spearman 順位相関係数」は 順位データに基づく単調関係の尺度 として、 上流の散布図観察 (非線形だが単調) と下流の Kendall τ・回帰分析を繋ぐ。 Pearson より外れ値に頑健で、 非線形単調関係も検出できるため、 順序尺度や歪んだ分布で標準選択となる。
Spearman は外れ値・非線形に強い順位相関で、 Pearson と対比しながら、 Kendall τ・順位和検定・頑健回帰と一緒に「ノンパラ統計の世界」を形成する。
Spearman 順位相関を選ぶかの判断は「データが直線的か」「外れ値があるか」「順位データか」の 3 つで決まる。 散布図が曲線でも単調に増加 (減少) しているなら Spearman、 直線なら Pearson、 全く関係性が見えないなら距離相関や相互情報量を検討する。
具体的には、 47 都道府県の人口と出生数のように外れ値 (東京) がある場合 Pearson は東京に引きずられるが Spearman は順位ベースなので頑健。 一方、 「満足度 1〜5 段階 vs 購入回数」のような順序尺度では Pearson は前提を満たさず Spearman が適切となる。
spearman を含む手法選択は、 データの性質・分析目的・運用制約の 3 軸で決まる。 シナリオ別 (大規模 / 外れ値多 / 解釈性重視 / 精度最優先 / 小データ / リアルタイム) に対応する手法の組合せを判断する。 選んだ後は「前処理確認 / ハイパラ調整 / 性能評価 / 頑健性チェック / 解釈」の 5 ステップで検証することが、 結果の信頼性確保に不可欠。
スピアマン ρ の本質は 「値そのものを捨てて、順番だけを残す」 ことです。n 個のデータは値の大小に関わらず、必ず等間隔の順位 1, 2, …, n に置き換わります。この「等間隔化」こそが、外れ値への頑健性・単調性の検出・単位非依存 という 3 つの性質を同時に生む源です。手順としては 順位(ランク)に変換 → その順位ペアに Pearson 相関を当てる、というだけです。
ある 1 点が桁違いに大きくても、順位に直せば「最大=n」という 1 つ分の情報に圧縮されます。値が 100 でも 10 万でも、最大なら順位は等しく n。だから Pearson を大きく揺らす外れ値も、ρ ではたかだか順位 1 つ分しか効きません。これは中央値や中央絶対偏差 (MAD)・ロバスト統計が平均より外れ値に強いのと同じ理屈です。ρ は 共分散を順位の上で測っている、と捉えると Pearson との連続性も見えます。
下は仕組みを示すための架空データです(SSDSE ではありません)。7 個のうち 6 個は弱い負の関係ですが、最後の 1 点だけ極端な (100, 100) を置くと Pearson が激変します。
| データ(架空) | Pearson r | Spearman ρ | 読み |
|---|---|---|---|
| 外れ値 (100,100) を含む 7 点 | +0.997 | −0.091 | r は「強い正の相関」と誤認、ρ はほぼ無相関 |
| 外れ値を除いた 6 点 | −0.777 | −0.765 | 本来は弱〜中程度の負の関係 |
Pearson は外れ値 1 点で「+0.997(強い正)」まで跳ね上がりますが、順位で見る ρ は −0.091 のまま、実態(弱い負)に近い判断を保ちます。r と ρ が大きく食い違ったら、まず散布図で外れ値を疑う のが鉄則です(見せかけの相関にも直結)。
ρ と ケンドール τ(タウ)はどちらも順位ベースですが、「何を数えるか」が違います。
実務のイメージ:ρ は「順位表がどれだけ揃っているか」、τ は「入れ替えの手間(並べ替えに何回のスワップが要るか)」。タイが多い/小標本のときは τ(特に τ-b)が安定しやすく、計算が速く直感的なのは ρ、という住み分けです。
2023 年・47 都道府県(cp932 / skiprows=[1])での実測値です。ρ と r の関係だけで、関係の「形」の当たりを付けられます。
| 変数ペア(実測) | Pearson r | Spearman ρ | パターンと解釈 |
|---|---|---|---|
| 総人口 (A1101) × 出生数 (A4101) | 0.995 | 0.978 | r ≈ ρ:概ね直線的で強い単調関係 |
| 大学教員数 (E6202) × 被服及び履物費 (L322105) | 0.374 | 0.674 | ρ ≫ r:単調だが曲がった(非線形)関係の疑い |
| 各種学校生徒数 (E7202) × 充足数〔一般〕(F3104) | 0.814 | 0.295 | r ≫ ρ:少数の外れ値が Pearson を押し上げる典型 |
※ 上記 6 値はすべて同梱 data/raw/SSDSE-B-2026.csv(2023 年・47 都道府県)で実測・検証済み(捏造なし)。ただし「差分の大小=線形性の検定」ではない点に注意(差分の正式な検定は存在せず、目安)。
同じ値が複数あるとき、それらには平均順位を割り当てます。例:値 [10, 20, 20, 30] → 順位 [1, 2.5, 2.5, 4]。タイがあると簡便式 ρ = 1 − 6Σd²/(n(n²−1)) は近似にすぎず、正確な ρ は「平均順位に対する Pearson 相関」で求めます(タイ補正)。scipy.stats.spearmanr や pandas .corr(method='spearman') はこの補正済み値を返します。リッカート尺度(5 段階評価)などタイが大量に出るデータでは、正規近似 p 値が信頼できなくなるため、並べ替え検定か、タイ補正版の ケンドール τ-bを併用するのが安全です。
ρ の点推定だけを見て「強い相関」と即断しないこと。信頼区間(Fisher z 変換)と 効果量を必ず併記します。目安として ρ の標準誤差は概ね 1/√(n−3)。SSDSE-B-2026 は n=47 と中規模ですが、ブートストラップや並べ替え検定で CI を確認すると、点推定の「揺れ」を過小評価せずに済みます。逆に n が大きいと、実質的に無意味なほど小さい ρ でも p 値だけは有意になり得るため、p 値と効果量は必ずセットで報告します。
順位変換は外れ値に強い反面、「どれだけ離れているか」という間隔情報を捨てます。1 位と 2 位の実距離が僅差でも大差でも、順位差は同じ 1。だから「値の大きさそのもの」が意味を持つ場面(金額・距離の絶対量を扱う回帰など)では、ρ ではなく Pearson や回帰の方が適切なことがあります。ρ が答えるのは「順番が連動するか」であって、「どれだけ増えるか」ではありません。
τ は全 n(n−1)/2 組のペアについて、順序が一致(concordant)する組と逆転(discordant)する組を数え、その差の割合で定義します。
$$ \tau = \frac{(\text{一致ペア数}) - (\text{逆転ペア数})}{n(n-1)/2} $$架空の小例:x = [1, 2, 3, 4]、y = [1, 3, 2, 4]。全 6 ペアのうち一致 5・逆転 1((2位,3位) の組だけ逆転)なので τ = (5−1)/6 = 0.667。同じデータの ρ は 0.800。一般に |τ| ≤ |ρ| となり、τ の方が小さめの値が出ます。
| 変数ペア(実測) | Pearson r | Spearman ρ | Kendall τ |
|---|---|---|---|
| 総人口 (A1101) × 出生数 (A4101) | 0.995 | 0.978 | 0.896 |
| 大学教員数 (E6202) × 被服及び履物費 (L322105) | 0.374 | 0.674 | 0.492 |
| 各種学校生徒数 (E7202) × 充足数〔一般〕(F3104) | 0.814 | 0.295 | 0.204 |
※ 上記 9 値は data/raw/SSDSE-B-2026.csv(2023 年・47 都道府県)で実測・検証済み。ρ と τ は常に同符号で、|τ| ≤ |ρ| の傾向が確認できる。
「ρ が 0 と有意に違うか」の検定は、標本が小さい・タイが多いと正規近似が崩れます。最も頑健なのは並べ替え検定(permutation test)で、片方の系列をシャッフルして ρ の帰無分布を直接作ります。scipy.stats.permutation_test で permutation_type='pairings' を使えば、分布仮定なしに厳密 p 値が得られます(本ページ「🐍 Python 実装バリエーション」の 5 番に実コードあり)。ノンパラメトリック検定の一種として位置づけられます。
x・y に任意の単調増加変換(対数・平方根・指数など)を施しても、順位は一切変わりません。したがって ρ も τ も不変です。架空例:x=[1,…,8]、y=eˣ(指数)とすると、Pearson r=0.776(曲線なので 1 未満)に対し、ρ=τ=1.000(完全な単調性を検出)。「r は低いが ρ は高い」ときは、対数などの単調変換でモデル化できる余地があるという実務的サインになります。ただし非単調(U 字・放物線 y=x²)は ρ も r も 0 付近になり検出できず、この場合は距離相関・MIC や散布図の目視が必要です。
ρ は「順位で統計をやり直す」という発想の入り口で、同じ思想の手法群があります。
※ Pearson・Kendall 各指標の詳細は 相関ページ内で扱っています(本教材に pearson.html / kendall.html の独立ページは無いため相関ページへ集約)。