論文一覧に戻る 📚 用語解説(ジャストインタイム型データサイエンス教育)
Spearman順位相関係数
Spearman's Rank Correlation (ρ (rho))
値そのものでなく「順位(rank)」で相関を計算。外れ値に強く、非線形でも単調なら検出可。
基礎統計ρ (rho)スピアマン相関順位相関Spearman相関

🔖 キーワード索引(拡張)

Spearman 順位相関とその近縁用語:

順位変換 ρ(rho) Kendall τ との関係 単調変換不変性 タイ補正 Spearman 行列 非単調関係の見逃し Pearson との混同 タイが多いデータ scipy.stats.spearmanr pandas .corr(method='spearman') pingouin.corr seaborn heatmap

🔖 キーワード索引 — 完全強化版

「スピアマンの順位相関」を理解するうえで必要なキーワードを 10 件以上提示します。 各チップから対応セクションへ移動できます。

30 秒結論 文脈 直感 数式 記号読み解き 実値計算 Python 実装 落とし穴 関連手法 関連用語 グループ教材 概念マップ

💡 30秒で分かる結論

🍰 まずはやさしく

順位を使って関係を測る方法です。

データの並び順に注目して使います。

テストの点数と勉強時間の順位で考えます。

この手法の結論を短くまとめます。

📖 もっと詳しく

Spearman 順位相関係数(ρ, rho)は、 Pearson 相関の順位ベース版です。 値そのものでなく「順位」を使って相関を計算するため、 外れ値に強く、 非線形でも単調なら検出できます。

計算手順:

  1. x と y それぞれを順位に変換(小→1、 大→n)
  2. 順位ペアに対して通常の Pearson 相関を計算

使い分け:

Python:scipy.stats.spearmanr(x, y)

📖 包括的解説 — この概念を完全マスター

📍 学習の3ステップ

  1. 定義を理解する:この概念は何か? 数式や条件を確認
  2. 具体例を見る:実データ(SSDSE 等)で計算してみる
  3. 応用する:自分のデータに適用、 結果を解釈

🔧 Python実装パターン

🎯 解説: スピアマンの順位相関 ρ は、 データを順位に変換してからピアソン相関を計算する非線形対応指標。 SSDSE-B-2026 の「総人口 (A1101)」と「出生数 (A4101)」のように非線形・スケール差のある関係でも頑健。
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 L322101(食料費(二人以上の世帯)) L322108(教育費(二人以上の世帯)) L322102(住居費(二人以上の世帯)) 北海道 74,341 6,911 26,730 東京都 97,776 24,160 26,457 沖縄県 73,453 6,356 27,521 …(全 47 行) ほかに 総人口 と 出生数(北海道 5,092,000 / 24,430、東京都 14,086,000 / 86,348、沖縄県 1,468,000 / 12,549)も使う
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 基本パターン: 2023 年度の 47 都道府県で Spearman ρ と Pearson r を並べる
import pandas as pd
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
import seaborn as sns

# データ読み込み(header=1 で 2 行目の日本語見出しを列名にする)
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1)
df = df[df['年度'] == 2023]   # 12 年度分が重なるので 2023 年度の 47 都道府県に絞る

# 総人口と出生数: 順位相関と積率相関
rho, p = stats.spearmanr(df['総人口'], df['出生数'])
r, _ = stats.pearsonr(df['総人口'], df['出生数'])
print(f'総人口 × 出生数: Spearman ρ = {rho:.3f} (p = {p:.1e}), Pearson r = {r:.3f}')

# 家計 3 項目の順位相関行列と散布図行列
hh = ['食料費(二人以上の世帯)', '教育費(二人以上の世帯)', '住居費(二人以上の世帯)']
print(df[hh].corr(method='spearman').round(3))
sns.pairplot(df[hh])
plt.show()
📤 実行例(実測) 総人口 × 出生数: Spearman ρ = 0.978 (p = 2.4e-32), Pearson r = 0.995 食料費(二人以上の世帯) 教育費(二人以上の世帯) 住居費(二人以上の世帯) 食料費(二人以上の世帯) 1.000 0.623 -0.056 教育費(二人以上の世帯) 0.623 1.000 -0.051 住居費(二人以上の世帯) -0.056 -0.051 1.000

💬 総人口と出生数は ρ = 0.978、r = 0.995 とどちらも 1 に近く、値で見ても順位で見ても「人口の多い県ほど出生数が多い」。家計 3 項目では食料費と教育費の ρ = 0.623 だけがはっきりした正の順位相関で、住居費は他の 2 項目と −0.05 前後とほぼ無関係になる。食料費×教育費は Pearson だと 0.728 と ρ より高く出るので、教育費 24,160 円で 2 位の埼玉県(18,057 円)を大きく離す東京都のような突出した県が値の相関を押し上げていないか、散布図行列で確かめる。

📚 統計概念マップでの位置

このページの上にある3つの概念マップ(関係マップ、 包含マップ、 ツリーマップ)でこの概念の位置づけが視覚的に分かります。 関連手法を辿って学習を進めましょう。

🎯 SSDSE-B-2026 で挑戦

統計データ活用コンペティションの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、 効果量

学習順序の推奨

  1. 記述統計(平均、 分散、 標準偏差)
  2. 可視化(ヒストグラム、 散布図)
  3. 確率分布(正規分布)
  4. 推測統計(標準誤差、 信頼区間、 p値)
  5. 仮説検定(t検定、 χ²検定)
  6. 相関と回帰(単回帰、 重回帰)
  7. 多変量解析(PCA、 クラスタリング)
  8. 機械学習(決定木、 RF、 NN)
  9. 時系列・因果推論(応用)

📝 実践練習 — SSDSE-B-2026 で挑戦

初級課題

  1. 東北6県の家計食料費の基本統計量を計算
  2. 食料費のヒストグラムを描く
  3. 食料費と教育費の散布図を描く
  4. 都道府県を「東日本/西日本」に分け、 平均を比較

中級課題

  1. 家計支出 5項目で相関行列を作成、 ヒートマップ可視化
  2. 食料費 → 教育費の単回帰を実行、 残差分析
  3. 家計5項目で PCA を実施、 バイプロット表示
  4. k-means (k=3) で都道府県をクラスタリング、 解釈

上級課題

  1. 地域別の家計パターンに有意差があるか ANOVA で検定
  2. 重回帰で教育費を予測、 多重共線性を VIF で確認
  3. Ridge/LASSO で正則化、 CV で α を最適化
  4. 階層クラスタリングと Ward 法で都道府県を分類、 デンドログラム作成

💡 30 秒で分かる結論 — 完全強化版

📍 あなたが今見ているもの

🍰 まずはやさしく

データのつながりを見る道具です。

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}$ は順位付けで、 同順位があるときは平均順位を割り当てます(この場合この簡易式は近似になります)。

🔬 数式を言葉で読み解く — 完全強化版

数式の各記号を、日本語の意味に変換します。

🧮 SSDSE-B 実値計算 — Spearman で都道府県データを総当たり相関

47都道府県の主要 8 変数で Spearman 順位相関行列を作り、 Pearson との比較で「非線形だが単調」な関係を炙り出す。

🎯 解説: 2023 年度 47 都道府県の 8 列で Spearman ρ と Pearson r の相関行列を作り、 差 |ρ − r| で「値の大きさ」と「順位」で見た関係のずれが大きいペアを探す。
📥 入力例: data/raw/SSDSE-B-2026.csv(skiprows=[1] で英語コードの見出し、2023 年度の 47 行)
  A1101 総人口 / A1303 65歳以上人口 / A4101 出生数 / A4200 死亡数
  A9101 婚姻件数 / I5102 一般診療所数 / L322101 食料費(二人以上の世帯)/ A4103 合計特殊出生率
 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))
📤 実行例(実測) === Spearman ρ === A1101 A1303 A4101 A4200 A9101 I5102 L322101 A4103 A1101 1.000 0.985 0.978 0.971 0.988 0.981 0.549 -0.574 A1303 0.985 1.000 0.942 0.993 0.957 0.980 0.534 -0.627 A4101 0.978 0.942 1.000 0.923 0.992 0.958 0.505 -0.445 A4200 0.971 0.993 0.923 1.000 0.939 0.963 0.523 -0.646 A9101 0.988 0.957 0.992 0.939 1.000 0.970 0.528 -0.508 I5102 0.981 0.980 0.958 0.963 0.970 1.000 0.517 -0.550 L322101 0.549 0.534 0.505 0.523 0.528 0.517 1.000 -0.574 A4103 -0.574 -0.627 -0.445 -0.646 -0.508 -0.550 -0.574 1.000 === Pearson r === A1101 A1303 A4101 A4200 A9101 I5102 L322101 A4103 A1101 1.000 0.991 0.995 0.989 0.989 0.972 0.672 -0.564 A1303 0.991 1.000 0.980 0.999 0.963 0.947 0.652 -0.587 A4101 0.995 0.980 1.000 0.977 0.991 0.977 0.665 -0.508 A4200 0.989 0.999 0.977 1.000 0.962 0.948 0.639 -0.594 A9101 0.989 0.963 0.991 0.962 1.000 0.989 0.662 -0.527 I5102 0.972 0.947 0.977 0.948 0.989 1.000 0.642 -0.522 L322101 0.672 0.652 0.665 0.639 0.662 0.642 1.000 -0.601 A4103 -0.564 -0.587 -0.508 -0.594 -0.527 -0.522 -0.601 1.000 === |ρ - r|(線形性のずれ) === A1101 A1303 A4101 A4200 A9101 I5102 L322101 A4103 A1101 0.000 0.006 0.017 0.018 0.001 0.009 0.123 0.010 A1303 0.006 0.000 0.038 0.006 0.006 0.033 0.118 0.040 A4101 0.017 0.038 0.000 0.054 0.001 0.019 0.160 0.063 A4200 0.018 0.006 0.054 0.000 0.023 0.015 0.116 0.052 A9101 0.001 0.006 0.001 0.023 0.000 0.019 0.134 0.019 I5102 0.009 0.033 0.019 0.015 0.019 0.000 0.125 0.028 L322101 0.123 0.118 0.160 0.116 0.134 0.125 0.000 0.027 A4103 0.010 0.040 0.063 0.052 0.019 0.028 0.027 0.000

💬 総人口 (A1101) と出生数 (A4101) は Pearson r = 0.995 / Spearman ρ = 0.978 とほぼ一致するが、食料費 (L322101、1 世帯あたり) の行は総人口と r = 0.672 / ρ = 0.549 と差が開き、|ρ − r| は 0.116〜0.160 とこの行だけが突出する。人口の多い少数の県で食料費も高いことが値の相関を押し上げ、順位全体ではそこまでそろっていないことを示す。合計特殊出生率 (A4103) は全列と負で、ρ と r の差は 0.063 以下と小さい。ρ と r の差が大きいペアから散布図で確かめる。

片方の検定だけでなく、 ペアごとに p 値と 95%CI を一覧化

🎯 解説: ブロック 1 の 8 列から作れる 28 ペアすべてについて scipy.stats.spearmanr で ρ と p 値を求め、 Fisher の z 変換(se = 1/√(n−3))で 95% 信頼区間を付けて、 ρ の小さい順に並べる。
📥 入力例: ブロック 1 で作った X(2023 年度 47 都道府県 × 8 列)
  A1101 総人口 / A1303 65歳以上人口 / A4101 出生数 / A4200 死亡数
  A9101 婚姻件数 / I5102 一般診療所数 / L322101 食料費(二人以上の世帯)/ A4103 合計特殊出生率
 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))
📤 実行例(実測) a b rho p CI_lo CI_hi A4200 A4103 -0.646 0.000 -0.787 -0.441 A1303 A4103 -0.627 0.000 -0.775 -0.415 L322101 A4103 -0.574 0.000 -0.739 -0.343 A1101 A4103 -0.574 0.000 -0.739 -0.343 I5102 A4103 -0.550 0.000 -0.723 -0.312 A9101 A4103 -0.508 0.000 -0.694 -0.258 A4101 A4103 -0.445 0.002 -0.649 -0.181 A4101 L322101 0.505 0.000 0.255 0.692 I5102 L322101 0.517 0.000 0.270 0.700 A4200 L322101 0.523 0.000 0.277 0.704 A9101 L322101 0.528 0.000 0.283 0.708 A1303 L322101 0.534 0.000 0.292 0.712 A1101 L322101 0.549 0.000 0.310 0.722 A4101 A4200 0.923 0.000 0.866 0.957 A4200 A9101 0.939 0.000 0.892 0.966 A1303 A4101 0.942 0.000 0.897 0.967 A1303 A9101 0.957 0.000 0.924 0.976 A4101 I5102 0.958 0.000 0.925 0.976 A4200 I5102 0.963 0.000 0.935 0.980 A9101 I5102 0.970 0.000 0.947 0.983 A1101 A4200 0.971 0.000 0.948 0.984 A1101 A4101 0.978 0.000 0.961 0.988 A1303 I5102 0.980 0.000 0.965 0.989 A1101 I5102 0.981 0.000 0.967 0.990 A1101 A1303 0.985 0.000 0.973 0.992 A1101 A9101 0.988 0.000 0.979 0.993 A4101 A9101 0.992 0.000 0.986 0.996 A1303 A4200 0.993 0.000 0.987 0.996

💬 28 ペアのうち負の相関は合計特殊出生率(A4103)を含む 7 ペアだけで、最も強いのは死亡数との ρ = −0.646(95% CI −0.787〜−0.441)。人口規模を表す 6 列どうしは ρ = 0.923〜0.993 と 1 に張り付き、食料費(L322101)は人口系の列と 0.505〜0.549 に留まる。28 回検定しているので Bonferroni の基準 0.05/28 ≈ 0.0018 で見直すと、最も弱い出生数×合計特殊出生率(p = 0.0017)まで含めてぎりぎりすべて残る。

Spearman ヒートマップ可視化

🎯 解説: ブロック 1 で求めた Spearman ρ と Pearson r の 8×8 行列を、 同じ色の尺度(−1〜1)のヒートマップにして左右に並べ、 corr_compare.png に保存する。
📥 入力例: rho_s・rho_p(ブロック 1 の出力。どちらも 8×8 の相関行列)
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)
📤 実行例(実測) このブロックは標準出力を出さない(図を描く・変数を定義するだけ)。

💬 図では人口規模の 6 列が作る濃い赤の塊は左右でほぼ同じ色だが、食料費(L322101)の行と列は Pearson 側(0.64〜0.67)の方が Spearman 側(0.50〜0.55)より一段濃い。ブロック 1 の |ρ − r| で 0.12〜0.16 と最も大きかった行が、図でも色の差として見える。

🧮 実値で計算してみる — SSDSE-B-2026 で スピアマンの順位相関(完全強化版)

SSDSE-B-2026(公的統計の社会・教育系データセット、 47 都道府県 × 10 年分超 × 100 以上の列)を用いて、 「スピアマンの順位相関」を体感します。 ファイル名は SSDSE-B-2026.csv、 読み込みは下記の Python コードで行います。

1
2
3
4
5
6
7
8
9
import pandas as pd

# SSDSE-B-2026 を読み込む(cp932 / Shift_JIS)
# 全年度の表は raw に入れ、ブロック 1 の df(2023 年度の 47 行)は上書きしない
raw = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=[1], encoding='cp932')
print(raw.shape)          # (564, 112)
print(raw['SSDSE-B-2026'].unique())  # 含まれる年度
latest = raw[raw['SSDSE-B-2026'] == raw['SSDSE-B-2026'].max()].copy()
print(latest[['Prefecture', 'A1101', 'A4101']].head())
📤 実行例(実測) (564, 112) [2023 2022 2021 2020 2019 2018 2017 2016 2015 2014 2013 2012] Prefecture A1101 A4101 0 北海道 5092000 24430 12 青森県 1184000 5696 24 岩手県 1163000 5432 36 宮城県 2264000 12328 48 秋田県 914000 3611

💬 全体は 564 行 × 112 列で、年度は 2023 から 2012 まで新しい順に 12 年分ある。latest は 2023 年の 47 行で、順位相関はこの 47 県の中での順位で計算する。年度で絞らずに 564 行のまま順位を付けると、同じ県の 12 年分が並んで順位を取り合い、県の数が 12 倍に水増しされた ρ と p 値になってしまう。

ここで使った中心列 A1101 は SSDSE-B-2026 における 47都道府県の人口 (A1101) と出生数 (A4101) の順位相関 に関連する指標です。 算出例:

🧮 数式に値を入れて手で計算する: スピアマンのランク相関

合成データでランクから ρ を計算する。

Step 1: データとランク

ixyr_xr_yd²
123110
247330
3712550
459440
534220

Step 2: 公式

ρ = 1 - 6·Σd²/(n(n²-1)) = 1 - 6·0/120 = 1.0 (完全単調)

🐍 Python で再現

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}")

📤 実行結果

ρ: 1.0

💬 手計算 (Step 2) ρ=1.0 と Python 出力が完全一致。

🎮 触って理解する — 散布図をドラッグして r と ρ を体感

点をドラッグして動かす/空白をクリック(タップ)で追加/点を右クリック(またはダブルタップ)で削除。動かすたびに Pearson 相関 r と Spearman 順位相関 ρ が同時に再計算されます。プリセットで「単調・非線形」「外れ値」を切り替え、両者の挙動の違いを体感してください。

縦軸・横軸とも「上/右ほど大きい」。丸内の小さな数字は x の順位 / y の順位。

Pearson r—
Spearman ρ—

点数 n = 0

プリセットを押すか、キャンバスをタップして点を追加してみましょう。
#x順位y順位d

観察のポイント: 「🚀 単調・非線形」では点は厳密に増加なので順位のズレが 0 → ρ = 1.000 ちょうど、一方カーブしているため r < 1。これが「ρ は単調性を、r は直線性を測る」という核心です。 「💥 外れ値」では 1 点の極端値が Pearson r を大きく押し上げますが、順位に変換する Spearman ρ はその影響を受けにくく、r ≫ ρ となります(外れ値への頑健性)。

📘 概念を深める — 定義・Pearson との違い・タイ・Kendall τ

1. Spearman 順位相関(ρ)の定義

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 に任意の単調増加変換(対数・平方根・指数など)を施しても順位は変わらないため、ρ は不変です(単調変換不変性)。

2. Pearson との違い — 「線形性」 vs 「単調性」

Pearson rSpearman ρ
測るもの直線的な関係の強さ単調な関係の強さ
使うデータ値そのもの順位
外れ値弱い(強く影響)頑健
尺度間隔・比例尺度順序尺度でも可
非線形(単調)例:y=eˣ1 未満1(完全に検出)

実務上は両方を並べて見るのが定石です。r ≈ ρ なら関係は概ね直線的、ρ ≫ r なら単調だが曲がった関係、r ≫ ρ なら少数の外れ値が Pearson を押し上げている疑い、と読み分けられます。

3. 外れ値への頑健性(SSDSE-B-2026 実測)

2023 年・47 都道府県のデータで実際に確認できます(cp932 / skiprows=[1])。

※ 上記 4 値は同梱 data/raw/SSDSE-B-2026.csv で実測・検証済み(捏造なし)。

4. タイ(同順位)の扱い

同じ値が複数あるとき、それらには平均順位を割り当てます。例:値 [10, 20, 20, 30] → 順位 [1, 2.5, 2.5, 4]。タイがある場合、上の簡便式 1 − 6Σd²/… は近似にすぎず、正確な ρ は「平均順位に対する Pearson 相関」で求めます(タイ補正)。scipy.stats.spearmanr はこのタイ補正済みの値を返します。上のインタラクティブ図の ρ も、平均順位に対する Pearson として計算しているためタイに正しく対応します。

5. Kendall の τ との比較

もう一つの順位相関に Kendall の τ(タウ)があります。τ は全ペアのうち「順序が一致する組(concordant)」と「逆転する組(discordant)」の差の割合で定義されます。

$$ \tau = \frac{(\text{一致ペア数}) - (\text{逆転ペア数})}{n(n-1)/2} $$

6. 非線形関係の検出と限界

ρ は単調な非線形関係(増加し続ける/減少し続ける曲線)を捉えられますが、非単調な関係(例:U 字・放物線 y=x²)は検出できません。この場合 ρ も r も 0 付近になり得ます。非単調・複雑な依存には距離相関や MIC など別指標や、相関を過信しない散布図の目視が不可欠です(見せかけの相関にも注意)。

🐍 Python 実装バリエーション — scipy / pandas / pingouin / seaborn

1. scipy.stats.spearmanr — 基本

🎯 解説: scipy.stats.spearmanr の基本の呼び方を 3 通り示す(2 変数の ρ と p 値、 多変量の ρ 行列、 nan_policy と alternative の指定)。
📥 入力例: x, y(ブロック 4 の 5 点)と X(ブロック 1 の 47 行 × 8 列)
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')
📤 実行例(実測) このブロックは標準出力を出さない(図を描く・変数を定義するだけ)。

💬 print が無いので何も表示されない。x, y はブロック 4 の 5 点、X はブロック 1 の 8 列で、spearmanr(X, axis=0) は列どうしの ρ を 8×8 の行列で返す。rho_mat[0, 2] がブロック 1 の A1101×A4101 と同じ 0.978 になることを確かめておくと、列の並びを取り違えていないか確認できる。

2. pandas DataFrame.corr で総当たり

🎯 解説: df の数値列(110 列)すべての組み合わせについて pearson・spearman・kendall の 3 種類の相関行列を一度に作り、 総人口・出生数・食料費・合計特殊出生率の 4 列を抜き出して見比べる。
📥 入力例: ブロック 1 の df(2023 年度 47 都道府県 × 112 列、うち数値列 110)
  A1101 総人口 / A4101 出生数 / L322101 食料費(二人以上の世帯)/ A4103 合計特殊出生率
1
2
3
4
5
6
7
8
9
10
11
12
# 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)
print('総当たりの行列の大きさ:', spearman.shape)

# 全部まとめて: 総人口・出生数・食料費・合計特殊出生率の 4 列を抜き出して見比べる
show = ['A1101', 'A4101', 'L322101', 'A4103']
for name, m in [('pearson', pearson), ('spearman', spearman), ('kendall', kendall)]:
    print(name)
    print(m.loc[show, show].round(2))
📤 実行例(実測) 総当たりの行列の大きさ: (110, 110) pearson A1101 A4101 L322101 A4103 A1101 1.00 1.00 0.67 -0.56 A4101 1.00 1.00 0.66 -0.51 L322101 0.67 0.66 1.00 -0.60 A4103 -0.56 -0.51 -0.60 1.00 spearman A1101 A4101 L322101 A4103 A1101 1.00 0.98 0.55 -0.57 A4101 0.98 1.00 0.51 -0.44 L322101 0.55 0.51 1.00 -0.57 A4103 -0.57 -0.44 -0.57 1.00 kendall A1101 A4101 L322101 A4103 A1101 1.00 0.90 0.39 -0.40 A4101 0.90 1.00 0.36 -0.31 L322101 0.39 0.36 1.00 -0.41 A4103 -0.40 -0.31 -0.41 1.00

💬 総人口×出生数は pearson 1.00・spearman 0.98・kendall 0.90 と、同じデータでも係数によって目盛りが違う。Kendall τ は「順位の大小がそろうペアの割合」から作るので同じ強さの関係でも Spearman より小さく出るのが普通で、0.90 を 0.98 より弱い関係と読んではいけない。食料費×総人口は pearson 0.67 に対し spearman 0.55 と差が大きく、値の大きい少数の県が積率相関を押し上げている。

3. pingouin — 効果量・CI・bootstrap が一発

🎯 解説: pingouin の pg.corr で、 2023 年度 47 都道府県の総人口と出生数の Spearman ρ・95% 信頼区間・p 値・検出力を 1 行で出し、 pairwise_corr でブロック 1 の 8 列の 28 ペアを総当たりする。
📥 入力例: df['A1101']・df['A4101'](47 行)と X(47 行 × 8 列)
1
2
3
4
5
6
7
8
9
10
11
12
import pingouin as pg
# 2023 年度 47 都道府県の総人口と出生数で、Spearman ρ・95% CI・検出力を 1 行で得る
res = pg.corr(df['A1101'], df['A4101'], method='spearman')
# pingouin の版によって列名が違う(CI95% が CI95、p-val が p_val になるなど)ので、
# 実際にある列だけを選んで表示する
_want = [c for c in ['n', 'r', 'CI95%', 'CI95', 'p-val', 'p_val', 'power'] if c in res.columns]
print(res[_want])
# ペアワイズ: ブロック 1 で選んだ 8 列の総当たり(28 ペア)を ρ の小さい順に
pw = pg.pairwise_corr(X, method='spearman')
_pw = [c for c in ['X', 'Y', 'r', 'CI95%', 'CI95', 'p-unc', 'p_unc'] if c in pw.columns]
print(len(pw), 'ペア')
print(pw[_pw].sort_values('r').head(5).to_string(index=False))
📤 実行例(実測) n r CI95 p_val power spearman 47 0.978145 [0.96, 0.99] 2.441732e-32 1.0 28 ペア X Y r CI95 p_unc A4200 A4103 -0.646303 [-0.79, -0.44] 9.248569e-07 A1303 A4103 -0.627405 [-0.77, -0.42] 2.363774e-06 L322101 A4103 -0.573759 [-0.74, -0.34] 2.485145e-05 A1101 A4103 -0.573701 [-0.74, -0.34] 2.490908e-05 I5102 A4103 -0.549623 [-0.72, -0.31] 6.296988e-05

💬 ρ = 0.978 の 95% CI は [0.96, 0.99] で、下限でも 0.96 と非常に強い。power = 1.0 は、n = 47 でこれだけ強い相関なら見逃す確率がほぼ 0 という意味。ペアワイズで ρ が最も負になるのは死亡数×合計特殊出生率の −0.646 で、CI [−0.79, −0.44] はブロック 2 で Fisher z から手で作った区間(−0.787〜−0.441)と小数 2 桁で一致する。

4. seaborn でカテゴリと連続変数の関係を可視化

🎯 解説: ブロック 1 の 8 列で散布図行列(回帰直線つき)を描き、 上三角の各パネルに Spearman ρ を書き込む。
📥 入力例: df[cols](2023 年度 47 都道府県 × 8 列。列はブロック 1 と同じ)
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)
📤 実行例(実測) このブロックは標準出力を出さない(図を描く・変数を定義するだけ)。

💬 print は無く図だけが出る。上三角の ρ はブロック 1 の Spearman 行列と同じ値で、A1101 と A4101 のパネルには ρ=0.98 と書かれる。各パネルの赤い回帰直線は値そのものへの直線の当てはめなので、東京都の点が右上に離れるパネルでは直線がその 1 点に引っ張られる。直線の傾きの印象と ρ の値を見比べる。

5. 並べ替え検定で厳密 p 値

🎯 解説: ブロック 4 の 5 点(x, y)で Spearman ρ の並べ替え検定を行う。 y と x の組み合わせを入れ替えて ρ の帰無分布を作り、 観測値以上に極端な割合を p 値とする。
📥 入力例: ブロック 4 の合成データ
  x = [2, 4, 7, 5, 3]
  y = [3, 7, 12, 9, 4]
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}')
📤 実行例(実測) ρ = 1.000, p_perm = 0.0167

💬 x と y は前のブロックの 5 点で、順位が完全にそろっているので ρ = 1.000 になる。5 点の並べ方は 5! = 120 通りしかなく、ρ = +1 と −1 になるのはそれぞれ 1 通りなので、両側の p 値は 2/120 = 0.0167 がちょうど下限になる(n_resamples=20000 は 120 を超えるので全列挙の厳密検定になっている)。n = 5 ではどれほどきれいな単調関係でも p は 0.0167 より小さくならないことを覚えておく。

🐍 Python 実装 — 完全強化版

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}')
📤 実行例(実測) n = 47 mean(x) = 2645808.510638298 std(x) = 2797551.411023093 Pearson r = 0.9954, p = 1.529e-47 Spearman rho = 0.9781, p = 2.442e-32

💬 総人口と出生数は Pearson r = 0.9954、Spearman ρ = 0.9781 で、どちらも極めて強いが ρ の方が 0.017 低い。r は東京都(人口・出生とも 1 位)のような大きな県が直線に乗っていれば押し上げられるが、ρ は順位で見るので、沖縄県(人口 25 位・出生数 14 位)や熊本県(23 位・17 位)、秋田県(39 位・45 位)の順位のずれがそのまま効く。順位差の二乗和 Σd² = 378 を公式に入れると 1 − 6×378/(47×2,208) = 0.9781 で、spearmanr の値と一致する。

用途別の追加実装:

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))
📤 実行例(実測) Prefecture A1101 A4101 cluster 0 北海道 5092000 24430 3 12 青森県 1184000 5696 0 24 岩手県 1163000 5432 0 36 宮城県 2264000 12328 0 48 秋田県 914000 3611 0 60 山形県 1026000 5151 0 72 福島県 1767000 9019 0 84 茨城県 2825000 14898 0 96 栃木県 1897000 9958 0 108 群馬県 1902000 9950 0

💬 総人口と出生数(相関 0.995)を z 化して k=4 に分けると、表示された先頭 10 行では北海道だけが 3 番、東北 6 県と北関東 3 県はすべて 0 番に入った。47 県では 0 番が 37 県、3 番が北海道・千葉・静岡・兵庫・福岡、1 番が埼玉・神奈川・愛知・大阪、2 番が東京都だけになる。2 変数がほぼ一直線に並ぶので、K-means は実質「県の規模」1 軸を 4 段に切っているのに近く、規模の順位で並べた ρ の話と同じ構造を別の見方で見ている。

1
2
3
4
5
6
7
8
9
10
11
# 時系列(北海道の A1101)— 例として ARIMA 系の前処理
import pandas as pd
import statsmodels.api as sm

full = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=[1], encoding='cp932')
ts = (full[full['Prefecture'] == '北海道']
      .sort_values('SSDSE-B-2026')          # CSV は新しい年度が先なので昇順に並べ直す
      .set_index('SSDSE-B-2026')['A1101'])  # 2012〜2023 年の 12 点
print(ts.tail())
res = sm.tsa.stattools.adfuller(ts, maxlag=1)   # 12 点しかないのでラグは 1 まで
print('ADF stat:', round(res[0], 3), 'p:', round(res[1], 4))
📤 実行例(実測) SSDSE-B-2026 2019 5259000 2020 5224614 2021 5183000 2022 5140000 2023 5092000 Name: A1101, dtype: int64 ADF stat: 2.122 p: 0.9988

💬 北海道の総人口は 2019 年の 525.9 万人から 2023 年の 509.2 万人まで毎年 3〜5 万人ずつ減っており、年度と人口の Spearman ρ を取れば −1(完全な単調減少)になる系列。ADF 統計量 2.122・p 値 0.9988 で単位根は棄却できず、トレンドを持つ非定常な系列とみなせる。こうした系列同士で順位相関を取ると、どちらも年とともに動くだけで ρ が ±1 近くに出るので、時系列の相関は差分をとってから見る。

⚠️ Spearman 順位相関の落とし穴 — 6 つの典型ミス

① 「Spearman は非線形に強い」と過大評価する

Spearman ρ が捉えるのは「単調関係(monotonic)」だけで、 U 字や逆 U 字のような非単調関係は Pearson と同様に 0 に近くなる。 「ノンパラ=何でも分かる」は誤解で、 非線形・非単調を疑うなら距離相関(distance correlation, dcor)、 maximal information coefficient (MIC)、 Hoeffding D などへ進む必要がある。 また「単調ではあるが微弱」の場合も ρ は小さい値しか出ない。

② タイが多いと p 値が不正確になる

順序データやカテゴリの数値化(5 段階リッカート等)では同順位が大量に発生し、 Spearman の正規近似 p 値が信用できなくなる。 タイがある場合は scipy.stats.spearmanr の method='asymptotic'(タイ補正済み)か、 並べ替え検定で求めるのが確実。 タイが多いなら Kendall τ-b(タイ補正版)の方が頑健。 査読時に「タイの扱い」を必ず聞かれるので明記すること。

③ ρ の差分 |ρ_Spearman − r_Pearson| を「線形性検定」と扱う

直観的には便利な指標だが、 「差分が小さい=線形」は厳密ではない。 標本サイズが小さければ差分が偶然大きくなり、 大きければ差分が偶然小さくなる。 差分の正式な検定は存在せず、 ブートストラップで信頼区間を作るくらい。 真の線形性検定をしたいなら Ramsey RESET 検定や、 残差プロットの目視を推奨。

④ 外れ値の影響が消えると過信する

Spearman は順位に変換するため確かに外れ値に頑健だが、 「順位の中で極端な点」(最大・最小に張り付く点)の影響は残る。 たとえば東京・神奈川を含む 47 都道府県データでは、 順位 1 と順位 2 が特定の組合せで固定されるため、 ρ は依然として影響を受ける。 外れ値を完全に除きたいなら、 95% トリミング相関や中央値ベースのロバスト相関を検討する。

⑤ サンプル数が極端に小さいときの ρ を過信する

n=10 で ρ=0.7 を見て「強い相関」と結論するのは早い。 95%CI は概ね [0.13, 0.92] と非常に広く、 偶然のばらつきで簡単に変わる。 小サンプルでは必ず CI(Fisher z 変換)と並べ替え検定 p 値を両方報告すること。 n < 20 では Kendall τ の方が漸近正規近似が安定するという指摘もある。

⑥ 順位変換した上で線形回帰すると Spearman と一致する、 という誤解

「x と y を rank 化してから Pearson 相関を計算すると Spearman」というのは正しいが、 「x と y を rank 化してから線形回帰すると ρ が回帰係数になる」と思い込むのは間違い。 順位回帰の係数は ρ ではなく、 Spearman の式とは異なる。 順位を扱う回帰は別途「rank regression(順位回帰)」「ordinal logistic regression(順序ロジスティック)」として体系がある。

⚠️ 落とし穴 — 完全強化版

スピアマンの順位相関を SSDSE-B-2026 (人口 A1101・出生数 A4101 等 47 都道府県) に当てはめるとき、 タイ補正・外れ値・有意性検定で誤りやすい 5 項目を整理する。

🗺️ 統計手法選択フローチャート

Q1: 何を知りたい?

Q2: データの種類は?

Q3: サンプルサイズは?

Q4: 仮定は?

📏 効果量の参照表

p値だけでなく効果量も併記するのが現代統計の標準。 主要な指標と Cohen の解釈基準:

統計量 効果量 小 中 大
2群平均差Cohen's d0.20.50.8
相関r0.10.30.5
線形回帰R²0.020.130.26
ANOVAη² (eta²)0.010.060.14
χ²Cramér's V0.10.30.5
ロジスティックOdds Ratio1.52.54.0

🗺️ 概念マップ — 3つの視点で体系を理解する

Spearman順位相関係数 がデータサイエンスの体系の中でどこに位置するかを、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。

📍 体系階層のパス

🌐 統計・データサイエンス › 関連・回帰 › 相関 › Spearman相関

① 🔗 関係マップ — 「他の手法とどう繋がっているか」

中心に Spearman順位相関係数 を置き、 そこから 相関係数・中央値・共分散・単回帰・平均・四分位 など 計 7 個の用語へ、 前提・兄弟・発展形といった関係を矢印で結んでいます。 線がどちら向きかを見れば、 先に読むべき用語とあとから読む用語が分かります。 ノードはドラッグで動かせ、 ホイールでズーム、 クリックでその用語のページへ遷移します。

凡例:現在の用語上位カテゴリ兄弟(並列)前提発展形応用先2階層先

② ⭕ 包含マップ — 「どのカテゴリに含まれているか」

大きな円が小さな円を包含する Circle Packing 図。 「Spearman順位相関係数」は緑色でハイライト。

📍現在地:統計・データサイエンス

③ 🌳 ツリーマップ — 「面積で見るボリューム比較」

長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「Spearman順位相関係数」は緑色でハイライト。

🎯 3つのマップの使い分け

マップ 分かること こんな時に見る
🔗 関係マップ手法間の横の関係(前提→発展→応用)「次に何を学べばよい?」 学習順序の判断
⭕ 包含マップ分類体系の入れ子構造(上位⊃下位)「この手法はどんなジャンルに属する?」
🌳 ツリーマップ分野の規模比較(面積=ボリューム)「データサイエンス全体の俯瞰像」

💡 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 との連続性も見えます。

架空の数値で体感 — 外れ値 1 点が相関を「作り出す」

下は仕組みを示すための架空データです(SSDSE ではありません)。7 個のうち 6 個は弱い負の関係ですが、最後の 1 点だけ極端な (100, 100) を置くと Pearson が激変します。

データ(架空)Pearson rSpearman ρ読み
外れ値 (100,100) を含む 7 点+0.997−0.091r は「強い正の相関」と誤認、ρ はほぼ無相関
外れ値を除いた 6 点−0.777−0.765本来は弱〜中程度の負の関係

Pearson は外れ値 1 点で「+0.997(強い正)」まで跳ね上がりますが、順位で見る ρ は −0.091 のまま、実態(弱い負)に近い判断を保ちます。r と ρ が大きく食い違ったら、まず散布図で外れ値を疑う のが鉄則です(見せかけの相関にも直結)。

ケンドール τ との直感的な違い

ρ と ケンドール τ(タウ)はどちらも順位ベースですが、「何を数えるか」が違います。

実務のイメージ:ρ は「順位表がどれだけ揃っているか」、τ は「入れ替えの手間(並べ替えに何回のスワップが要るか)」。タイが多い/小標本のときは τ(特に τ-b)が安定しやすく、計算が速く直感的なのは ρ、という住み分けです。

⚠️ 落とし穴の深掘り — 乖離パターン早見表・タイ・小標本

1. r と ρ の乖離が「語ること」— SSDSE-B-2026 実測早見表

2023 年・47 都道府県(cp932 / skiprows=[1])での実測値です。ρ と r の関係だけで、関係の「形」の当たりを付けられます。

変数ペア(実測)Pearson rSpearman ρパターンと解釈
総人口 (A1101) × 出生数 (A4101)0.9950.978r ≈ ρ:概ね直線的で強い単調関係
大学教員数 (E6202) × 被服及び履物費 (L322105)0.3740.674ρ ≫ r:単調だが曲がった(非線形)関係の疑い
各種学校生徒数 (E7202) × 充足数〔一般〕(F3104)0.8140.295r ≫ ρ:少数の外れ値が Pearson を押し上げる典型

※ 上記 6 値はすべて同梱 data/raw/SSDSE-B-2026.csv(2023 年・47 都道府県)で実測・検証済み(捏造なし)。ただし「差分の大小=線形性の検定」ではない点に注意(差分の正式な検定は存在せず、目安)。

2. タイ(同順位)の扱い — 平均順位と近似式の限界

同じ値が複数あるとき、それらには平均順位を割り当てます。例:値 [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を併用するのが安全です。

3. 小標本での有意性 — n=47 でも過信しない

ρ の点推定だけを見て「強い相関」と即断しないこと。信頼区間(Fisher z 変換)と 効果量を必ず併記します。目安として ρ の標準誤差は概ね 1/√(n−3)。SSDSE-B-2026 は n=47 と中規模ですが、ブートストラップや並べ替え検定で CI を確認すると、点推定の「揺れ」を過小評価せずに済みます。逆に n が大きいと、実質的に無意味なほど小さい ρ でも p 値だけは有意になり得るため、p 値と効果量は必ずセットで報告します。

4. 順位化による情報損失

順位変換は外れ値に強い反面、「どれだけ離れているか」という間隔情報を捨てます。1 位と 2 位の実距離が僅差でも大差でも、順位差は同じ 1。だから「値の大きさそのもの」が意味を持つ場面(金額・距離の絶対量を扱う回帰など)では、ρ ではなく Pearson や回帰の方が適切なことがあります。ρ が答えるのは「順番が連動するか」であって、「どれだけ増えるか」ではありません。

🚀 発展 — ケンドール τ・順位相関の検定・単調変換不変性・順位ベース手法

1. ケンドール τ の中身 — 一致ペアと逆転ペアを数える

τ は全 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。一般に |τ| ≤ |ρ| となり、τ の方が小さめの値が出ます。

2. r / ρ / τ を並べて読む(SSDSE-B-2026 実測)

変数ペア(実測)Pearson rSpearman ρKendall τ
総人口 (A1101) × 出生数 (A4101)0.9950.9780.896
大学教員数 (E6202) × 被服及び履物費 (L322105)0.3740.6740.492
各種学校生徒数 (E7202) × 充足数〔一般〕(F3104)0.8140.2950.204

※ 上記 9 値は data/raw/SSDSE-B-2026.csv(2023 年・47 都道府県)で実測・検証済み。ρ と τ は常に同符号で、|τ| ≤ |ρ| の傾向が確認できる。

3. 順位相関の検定 — 並べ替え検定が最も安全

「ρ が 0 と有意に違うか」の検定は、標本が小さい・タイが多いと正規近似が崩れます。最も頑健なのは並べ替え検定(permutation test)で、片方の系列をシャッフルして ρ の帰無分布を直接作ります。scipy.stats.permutation_test で permutation_type='pairings' を使えば、分布仮定なしに厳密 p 値が得られます(本ページ「🐍 Python 実装バリエーション」の 5 番に実コードあり)。ノンパラメトリック検定の一種として位置づけられます。

4. 単調変換不変性 — ρ が「純粋に単調性を測る」理由

x・y に任意の単調増加変換(対数・平方根・指数など)を施しても、順位は一切変わりません。したがって ρ も τ も不変です。架空例:x=[1,…,8]、y=eˣ(指数)とすると、Pearson r=0.776(曲線なので 1 未満)に対し、ρ=τ=1.000(完全な単調性を検出)。「r は低いが ρ は高い」ときは、対数などの単調変換でモデル化できる余地があるという実務的サインになります。ただし非単調(U 字・放物線 y=x²)は ρ も r も 0 付近になり検出できず、この場合は距離相関・MIC や散布図の目視が必要です。

5. 順位ベース手法のファミリー

ρ は「順位で統計をやり直す」という発想の入り口で、同じ思想の手法群があります。

※ Pearson・Kendall 各指標の詳細は 相関ページ内で扱っています(本教材に pearson.html / kendall.html の独立ページは無いため相関ページへ集約)。