「広告の表示回数が多い動画ほど、視聴維持率は高いのか?」「価格への満足度が高い顧客ほど、商品を人に薦めたがるのか?」——こうした「片方が増えるともう片方も増える(または減る)」という関連を数値で測りたい場面は、データ分析のいたるところに現れます。真っ先に思い浮かぶのはピアソンの相関係数でしょう。ところが、ピアソンには2つの大きな弱点があります。直線的な関係しか測れないこと、そしてたった1つの外れ値に振り回されることです。
たとえば、表示回数と再生数が「最初は緩やかに、後半で急激に」増えるような曲線的な関係は、見るからに強い関連があるのに、ピアソン相関は中途半端な値しか返しません。また、入力ミスで1件だけ桁外れの値が紛れ込んだだけで、相関係数がガラリと変わってしまうこともあります。
そこで登場するのがスピアマンの順位相関係数です。アイデアは驚くほどシンプルで、「値そのもの」ではなく「順位(何番目に大きいか)」だけを使ってピアソン相関を計算します。これだけで、曲がった単調関係をきれいに捉えられ、外れ値にも強くなります。スピアマンが活きる場面は具体的にたくさんあります。たとえば5段階評価のアンケート(順序尺度どうしの関連を見る)、非線形だが単調な工学データ(センサ出力と物理量の関係)、そして外れ値を含む観測データ(金融や生物のばらつきの大きいデータ)です。
本記事の内容
- ピアソン相関の2つの限界(線形性・外れ値感度)を具体例で確認する
- スピアマン $r_s$ の定義 — 「順位のピアソン相関」という本質
- 簡略式 $r_s = 1 – \dfrac{6\sum d_i^2}{n(n^2-1)}$ をピアソン相関から省略なしで導出する
- ケンドールの $\tau$ との違いと使い分け
- 単調性の検出、有意性検定(並べ替え・正規近似)、タイ(同順位)の扱い
- ピアソン vs スピアマン vs ケンドールの選択ガイド
- Pythonでのスクラッチ実装・SciPy検証・アンケートデータへの応用
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
順位で相関を測るという発想
スピアマンの核心は、難しい数式の前にある一つの素朴なアイデアです。それは「値そのものを忘れて、順位だけで考える」こと。たとえばあるクラスの身長が $\{151, 162, 158, 175, 168\}$ cm だったとします。スピアマンはこの実数値を捨てて、「小さい順に何番目か」という順位 $\{1, 3, 2, 5, 4\}$ に置き換えてしまいます。
下の図は、この「順位化」という操作を表したものです。左側は値が不均等に散らばった生データ、右側はそれを等間隔の順位に並べ替えたものです。

この図から読み取れる大切なことが2つあります。まず、順位化するとデータ点の間隔がすべて等しくなること。一番大きい値が他の値から飛び抜けて大きくても(外れ値でも)、順位の世界では「ただの1番」になります。これが外れ値への頑健性の源です。次に、順位は値の大小関係(順序)だけを保存すること。「Bの方がAより大きい」という情報は残りますが、「どれくらい大きいか」という情報は捨てられます。
なぜこれが相関の計算に役立つのでしょうか。それは、2つの変数が「片方が増えればもう片方も増える」という単調な関係にあるとき、たとえ関係が曲線的でも、順位の世界では直線関係になるからです。曲がったゴムひもをピンと引き伸ばすイメージです。順位に直せば直線になるので、そこに直線関係を測るピアソン相関を当てはめればよい——これがスピアマンの全戦略です。
では、なぜわざわざピアソンではダメなのか。ピアソン相関が「曲がった関係」と「外れ値」にどれだけ弱いのかを、まず具体的に見ておきましょう。
ピアソン相関の2つの限界
限界1: 直線的な関係しか測れない
ピアソンの相関係数 $r$ は、共分散を各標準偏差で割って $-1$ から $1$ に正規化したものでした。
$$ r = \frac{\sum_{i=1}^{n}(x_i – \bar{x})(y_i – \bar{y})}{\sqrt{\sum_{i=1}^{n}(x_i – \bar{x})^2}\sqrt{\sum_{i=1}^{n}(y_i – \bar{y})^2}} $$
この式は「データが直線 $y = ax + b$ にどれだけ近いか」を測ります。$|r| = 1$ は完全な直線、$r = 0$ は直線関係なしを意味します。問題は、直線でない関係を過小評価してしまう点です。
たとえば $y = e^x$ のような指数的に増える関係を考えます。$x$ が増えれば $y$ は必ず増える、れっきとした単調増加です。ところが直線を当てはめると、曲がりの分だけ「ぴったり乗っていない」ことになり、ピアソン相関は値を下げてしまいます。

このグラフは $y = e^x$ にノイズを加えたデータです。点は明らかに右肩上がりで「強い関連」があるのに、最小二乗の直線(赤破線)はデータの曲がりを追いきれていません。実際、ピアソン $r \approx 0.89$ に対し、スピアマン $r_s \approx 0.95$ と、スピアマンの方が関連の強さを正しく捉えています。人間の目には「ほぼ完璧な単調関係」に見えるのに、ピアソンは「そこそこの相関」としか言わないのです。
限界2: 外れ値1つで激変する
もう一つの弱点は、外れ値への過敏さです。ピアソン相関は偏差の積 $(x_i – \bar{x})(y_i – \bar{y})$ の和で決まるので、平均から大きく離れた1点が積の値を爆発的に大きく(または小さく)し、全体を支配してしまいます。

左は外れ値のないきれいな直線データで、ピアソン・スピアマンとも $0.97$ 前後と高い値です。右は、たった1点を「$x$ が大きいのに $y$ が極端に小さい」位置(オレンジ)に動かしただけのデータです。するとピアソンは $0.97$ から $0.57$ へ急落するのに対し、スピアマンは $0.96$ から $0.77$ へとずっと緩やかにしか下がりません。外れ値の $y$ 値がどれだけ極端でも、順位の世界では「一番下」というだけなので、影響が限定的なのです。
ピアソンが万能でないことがはっきりしました。直線でない単調関係、そして外れ値。この2つの弱点を一挙に解決するのがスピアマンです。次に、その正体を定義から見ていきます。
スピアマンの順位相関係数の定義
定義: 順位に対するピアソン相関
スピアマンの順位相関係数の定義は、拍子抜けするほど単純です。データを順位に変換してから、ピアソン相関を計算する。それだけです。
まず、$x_i$ たちを小さい順に並べたときの順位を $R(x_i)$、$y_i$ たちの順位を $R(y_i)$ と書きます(最小値が順位 $1$)。スピアマン $r_s$ は、この順位どうしのピアソン相関として定義されます。
$$ \begin{equation} r_s = \frac{\sum_{i=1}^{n}\big(R(x_i) – \overline{R_x}\big)\big(R(y_i) – \overline{R_y}\big)}{\sqrt{\sum_{i=1}^{n}\big(R(x_i) – \overline{R_x}\big)^2}\sqrt{\sum_{i=1}^{n}\big(R(y_i) – \overline{R_y}\big)^2}} \end{equation} $$
ここで $\overline{R_x}, \overline{R_y}$ はそれぞれの順位の平均です。式の形はピアソン相関とまったく同じで、中身の $x_i, y_i$ を順位 $R(x_i), R(y_i)$ に置き換えただけだとわかります。これがスピアマンの最も本質的な定義です。「順位のピアソン相関」と覚えておけば、すべてがここから導けます。
順位に移すと何が起きるか、もう一度図で確認しましょう。

左は生データの散布図で、曲線状に分布しています(ピアソン $r \approx 0.89$)。右は同じデータを順位に変換した散布図で、点が対角線 $R_y = R_x$ の近くにきれいに並びます(スピアマン $r_s \approx 0.95$)。曲がっていた関係が、順位空間では直線に伸びているのがはっきり見えます。スピアマンが「単調関係の強さ」を測れる理由が、この図に凝縮されています。
なぜ単調関係を捉えられるのか
直感的に説明しておきましょう。2変数が完全な単調増加関係($x$ が大きいほど $y$ も必ず大きい)にあるとき、$x$ で $i$ 番目に大きいデータ点は、$y$ でもちょうど $i$ 番目に大きくなります。つまり $R(x_i) = R(y_i)$ がすべての $i$ で成り立ち、順位は完全に一致します。すると右図の点はすべて対角線 $R_y = R_x$ に乗り、ピアソン相関は $r_s = 1$ になります。関係が直線か曲線かは一切関係ありません。順位さえ一致すれば、関数の形に関わらず $r_s = 1$ なのです。これがスピアマンが「単調性の指標」と呼ばれる理由です。
定義はわかりましたが、毎回ピアソン相関の式に順位を代入するのは少し面倒です。実は、タイ(同順位)がなければ、もっと覚えやすい簡略式に変形できます。次でそれを導きます。
簡略式 $r_s = 1 – \dfrac{6\sum d_i^2}{n(n^2-1)}$ の導出
ゴールと出発点
教科書でよく見るスピアマンの式は、順位差 $d_i = R(x_i) – R(y_i)$ を使った次の形です。
$$ \begin{equation} r_s = 1 – \frac{6\sum_{i=1}^{n} d_i^2}{n(n^2 – 1)} \end{equation} $$
これがどこから来るのかを、定義式(順位のピアソン相関)から省略なしで導きます。ポイントは、タイがない場合、順位 $R(x_i), R(y_i)$ は$1$ から $n$ の整数の並べ替えになるという事実です。この特殊性が、式を劇的に簡単にしてくれます。
順位の平均と平方和を求める
タイがなければ、$x$ の順位も $y$ の順位も $\{1, 2, \dots, n\}$ という同じ集合です。したがって順位の平均は両者とも等しく、よく知られた和の公式 $\sum_{k=1}^{n} k = \frac{n(n+1)}{2}$ から
$$ \overline{R_x} = \overline{R_y} = \frac{1}{n}\sum_{k=1}^{n} k = \frac{n+1}{2} $$
となります。次に、順位の偏差平方和を求めます。これも $1$ から $n$ の整数についての和なので一定値です。平方和の公式 $\sum_{k=1}^{n} k^2 = \frac{n(n+1)(2n+1)}{6}$ を使うと、
$$ \sum_{i=1}^{n}\big(R(x_i) – \overline{R_x}\big)^2 = \sum_{k=1}^{n}\left(k – \frac{n+1}{2}\right)^2 = \sum_{k=1}^{n} k^2 – n\left(\frac{n+1}{2}\right)^2 $$
と展開できます。ここに2つの公式を代入して整理します。
$$ \sum_{k=1}^{n} k^2 – n\left(\frac{n+1}{2}\right)^2 = \frac{n(n+1)(2n+1)}{6} – \frac{n(n+1)^2}{4} $$
通分して共通因子 $\frac{n(n+1)}{12}$ でくくると、
$$ = \frac{n(n+1)}{12}\big[2(2n+1) – 3(n+1)\big] = \frac{n(n+1)}{12}(4n + 2 – 3n – 3) = \frac{n(n+1)(n-1)}{12} = \frac{n(n^2 – 1)}{12} $$
が得られます。$y$ の順位についてもまったく同じなので、定義式(2式)の分母は
$$ \sqrt{\frac{n(n^2-1)}{12}}\cdot\sqrt{\frac{n(n^2-1)}{12}} = \frac{n(n^2-1)}{12} $$
となります。分母が順位差に依存しない定数になったのが、ここでの大きな収穫です。
分子を順位差 $d_i$ で書き換える
次に分子の共分散項を $d_i = R(x_i) – R(y_i)$ で表します。出発点は、順位差の二乗の和を展開することです。
$$ \sum_{i=1}^{n} d_i^2 = \sum_{i=1}^{n}\big(R(x_i) – R(y_i)\big)^2 = \sum_{i=1}^{n} R(x_i)^2 – 2\sum_{i=1}^{n} R(x_i)R(y_i) + \sum_{i=1}^{n} R(y_i)^2 $$
ここで、定義式の分子(共分散の分子)を $S_{xy} = \sum_i (R(x_i) – \overline{R_x})(R(y_i) – \overline{R_y})$ と置きます。これを展開すると $S_{xy} = \sum_i R(x_i)R(y_i) – n\,\overline{R_x}\,\overline{R_y}$ なので、積の和について解いて
$$ \sum_{i=1}^{n} R(x_i)R(y_i) = S_{xy} + n\,\overline{R_x}\,\overline{R_y} $$
が成り立ちます。これを $\sum d_i^2$ の式に代入します。さらに $\sum_i R(x_i)^2 = \sum_i R(y_i)^2 = \frac{n(n^2-1)}{12} + n\overline{R_x}^2$(偏差平方和に $n\overline{R}^2$ を戻したもの)を使うと、
$$ \sum_{i=1}^{n} d_i^2 = 2\left(\frac{n(n^2-1)}{12} + n\overline{R_x}^2\right) – 2\big(S_{xy} + n\overline{R_x}\,\overline{R_y}\big) $$
となります。$\overline{R_x} = \overline{R_y}$ なので $n\overline{R_x}^2$ と $n\overline{R_x}\overline{R_y}$ が打ち消し合い、
$$ \sum_{i=1}^{n} d_i^2 = 2\cdot\frac{n(n^2-1)}{12} – 2 S_{xy} = \frac{n(n^2-1)}{6} – 2 S_{xy} $$
すっきりした関係が得られました。これを $S_{xy}$ について解くと、
$$ S_{xy} = \frac{1}{2}\left(\frac{n(n^2-1)}{6} – \sum_{i=1}^{n} d_i^2\right) $$
です。
組み合わせて完成
いよいよ仕上げです。スピアマン $r_s$ は「分子 $S_{xy}$ ÷ 分母 $\frac{n(n^2-1)}{12}$」でした。代入すると、
$$ r_s = \frac{S_{xy}}{\frac{n(n^2-1)}{12}} = \frac{12}{n(n^2-1)}\cdot\frac{1}{2}\left(\frac{n(n^2-1)}{6} – \sum_i d_i^2\right) $$
右辺を分配して整理します。第1項は $\frac{12}{n(n^2-1)}\cdot\frac{1}{2}\cdot\frac{n(n^2-1)}{6} = 1$ と約分でき、第2項は $\frac{12}{n(n^2-1)}\cdot\frac{1}{2}\sum_i d_i^2 = \frac{6\sum_i d_i^2}{n(n^2-1)}$ となります。したがって
$$ \boxed{\,r_s = 1 – \frac{6\sum_{i=1}^{n} d_i^2}{n(n^2 – 1)}\,} $$
が導けました。順位差を二乗して足すだけでスピアマン相関が計算できる、美しい簡略式です。完全一致なら $d_i = 0$ で $r_s = 1$、完全逆順なら $\sum d_i^2$ が最大値 $\frac{n(n^2-1)}{3}$ を取り $r_s = -1$ になります。
数値例で確認
実際に計算してみましょう。$n = 7$ のデータで、$x$ の順位が $1,2,3,4,5,6,7$、$y$ の順位が $2,1,4,3,5,7,6$ だとします。順位差 $d_i$ とその二乗を一つずつ求めます。

左の図は、$x$ の順位と $y$ の順位を線で結んだものです。傾いた線ほど順位差 $d_i$ が大きいことを表します。右の図は各点の $d_i^2$ を棒で示したもので、5番目(順位が一致)だけ $0$、残りは $1$ です。合計 $\sum d_i^2 = 6$ なので、簡略式に代入すると
$$ r_s = 1 – \frac{6 \times 6}{7(7^2 – 1)} = 1 – \frac{36}{336} = 1 – 0.107 \approx 0.893 $$
となります。後ほどPythonの scipy.stats.spearmanr でも同じ $0.893$ が出ることを確認します。手計算と一致するので、導出が正しいと安心できます。
簡略式は順位差さえ求めればよく、電卓でも計算できる手軽さが魅力です。ところで、順位を使う相関係数はスピアマンだけではありません。「ペアの順序が一致するか」という別の角度から相関を測る、ケンドールの $\tau$ も重要です。次に見ていきましょう。
ケンドールの順位相関係数 $\tau$
一致ペア・不一致ペアという考え方
ケンドールの $\tau$(タウ)は、スピアマンとは少し違う発想で順位相関を測ります。注目するのは、データから2点を選んだペアの並び方です。2点 $(x_i, y_i)$ と $(x_j, y_j)$ を比べたとき、
- 一致ペア(concordant): $x$ の大小と $y$ の大小が同じ向き。すなわち $(x_i – x_j)(y_i – y_j) > 0$。
- 不一致ペア(discordant): $x$ と $y$ で大小が逆。すなわち $(x_i – x_j)(y_i – y_j) < 0$。
「$x$ が大きい方は $y$ も大きい」というペアが一致ペアです。全部で $\binom{n}{2} = \frac{n(n-1)}{2}$ 組のペアがあり、一致ペアの数を $C$、不一致ペアの数を $D$ とすると、ケンドールの $\tau$(タイがない場合、$\tau_a$)は次で定義されます。
$$ \begin{equation} \tau = \frac{C – D}{\binom{n}{2}} = \frac{C – D}{\tfrac{1}{2}n(n-1)} \end{equation} $$
直感はとても明快です。「一致ペアばかりなら $\tau = 1$(完全な単調増加)、不一致ペアばかりなら $\tau = -1$(完全な単調減少)」。一致と不一致が半々なら $\tau = 0$ です。$\tau$ は「ランダムに2点を選んだとき、順序が一致する確率と一致しない確率の差」と解釈でき、確率的な意味が明快なのが特徴です。
スピアマンとの違い
スピアマン $r_s$ とケンドール $\tau$ はどちらも単調性を測りますが、性質が少し異なります。
- スピアマンは順位差 $d_i$ の二乗を使うので、大きく順位がずれた点の影響を強く受けます(「順位のピアソン相関」なので二乗の重みが効く)。
- ケンドールはペアの向きだけを数えるので、外れ値にさらに頑健で、サンプルが小さいときの統計的性質が良好です。また値の解釈(確率差)が直接的です。
同じデータでも値は一般に異なり、おおむね $|\tau| \le |r_s|$ となる傾向があります。たとえば順位 $x: 1,2,3,4,5$, $y: 2,1,4,3,5$ では、スピアマン $r_s = 0.8$ に対しケンドール $\tau = 0.6$ です。両者は別物ですが、$\tau$ と $r_s$ の間には大標本で $r_s \approx \frac{3}{2}\tau$ という近似関係が知られています。
3つの相関係数が、関係の種類によってどう振る舞うかを並べて見てみましょう。

この図は3種類の関係(線形・単調な非線形・非単調なU字)で3つの係数を計算したものです。読み取れることは3つあります。まず線形関係(左)では、ピアソンとスピアマンがほぼ同じ高い値を示します。次に単調な非線形(中央、$y = x^3$)では、ピアソン $r \approx 0.91$ に対しスピアマン $r_s \approx 0.96$ と、順位ベースの2つが関連の強さを正しく捉えます。そして非単調なU字(右)では、$x$ と $y$ に明らかな関係があるのに、3つの係数すべてが $0$ 近くになります。これは重要な教訓です——順位相関も「単調性」を測る道具であって、U字のような非単調な関係は捉えられません。
ここで「単調性を測る」という言葉が繰り返し出てきました。スピアマンが何を測り、何を測れないのかを、もう少しはっきりさせておきましょう。
単調性の検出 — スピアマンが見ているもの
スピアマンとケンドールは、関係が単調(monotonic)かどうかを測ります。単調とは「片方が増えると、もう片方は常に増える(単調増加)か、常に減る(単調減少)」という性質で、増え方が直線でも曲線でも構いません。前節のU字の例で見たように、単調でない関係には無力です。この区別は実務で極めて重要です。
整理すると、相関係数の「守備範囲」は次のように階層的になっています。
- ピアソン $r$: 直線関係を測る。最も狭い守備範囲。
- スピアマン $r_s$・ケンドール $\tau$: 単調関係を測る。直線を含むより広い守備範囲。
- 単調でない関係(U字、周期的など): いずれの相関係数も不向き。距離相関や相互情報量(MIC)などが必要。
つまり「ピアソンが高ければスピアマンも高い」とは限りますが、その逆——「スピアマンが高くてもピアソンは低い」——は曲線的な単調関係で普通に起こります。逆に、ピアソンとスピアマンが両方とも低いのに散布図には明確なパターンがあるなら、それは非単調な関係のサインで、相関係数では捉えられません。散布図を必ず描くことが大切なのは、このためです。
単調性を検出できたとして、得られた相関係数が「偶然ではない」と言い切れるでしょうか。次に有意性検定を扱います。
有意性検定 — その相関は偶然か
帰無仮説と検定の考え方
サンプルから計算した $r_s$ がたとえば $0.4$ だったとして、それが「本当に関連がある」のか「たまたまそう見えただけ」なのかは別問題です。そこで、帰無仮説 $H_0$:$x$ と $y$ は独立(母集団での順位相関は $0$) を立て、観測された $r_s$ がこの仮定のもとでどれだけ起こりにくいかを調べます。
最も直接的なのは並べ替え検定(permutation test)です。$x$ の順位は固定し、$y$ の順位だけをランダムにシャッフルして $r_s$ を何度も計算すると、「独立なら $r_s$ がどんな分布になるか」という帰無分布が得られます。観測した $r_s$ がこの分布の裾に位置すれば、独立では説明しにくい——すなわち有意と判断します。

この図は $n = 12$ のデータで、$y$ の順位を2万回シャッフルして作った帰無分布(灰色のヒストグラム)です。中心 $0$ の対称な山になっており、独立なら $r_s$ は $0$ 付近に集まることがわかります。観測値 $r_s \approx 0.83$(赤い実線)は分布の右の裾の外側にあり、両側 $p$ 値はおよそ $0.001$ と非常に小さくなります。「独立だとこんな高い $r_s$ はめったに出ない」ので、有意な相関があると結論できます。
正規近似と $t$ 近似
毎回並べ替えるのは計算量が大きいので、近似式も使われます。帰無仮説のもとで $r_s$ の標準偏差はおよそ $\frac{1}{\sqrt{n-1}}$ になることが知られており、図の緑の曲線 $N\!\left(0, \frac{1}{n-1}\right)$ が並べ替え分布によく重なっています。サンプルが十分大きければ、
$$ z = r_s \sqrt{n – 1} $$
が近似的に標準正規分布に従うとして $p$ 値を求められます。より精度を上げるには、$t = r_s\sqrt{\dfrac{n-2}{1 – r_s^2}}$ が自由度 $n-2$ の $t$ 分布に従う、という $t$ 近似がよく使われます(SciPy の spearmanr はこの $t$ 近似で $p$ 値を返します)。小標本では、専用の臨界値表や並べ替え検定の方が信頼できます。
検定の話の中で「タイがなければ」という前提を何度か置いてきました。同じ値が複数あるとき——タイ(同順位)——はどう扱うのか、最後の理論的な論点を片付けましょう。
タイ(同順位)の扱い
平均順位を割り当てる
現実のデータ、とくにアンケートの5段階評価などでは、同じ値が何度も現れます。これをタイ(同順位)と呼びます。タイがあると「何番目か」が一意に決まりません。標準的な解決法は、タイになった順位の平均を全員に割り当てることです。

この図は値 $\{12, 15, 15, 15, 20, 22\}$ の例です。3つの $15$ は本来なら順位 $2, 3, 4$ を取り合いますが、優劣がつけられません。そこで $\frac{2 + 3 + 4}{3} = 3$ という平均順位を3つすべてに割り当てます。結果として順位は $\{1, 3, 3, 3, 5, 6\}$ になります。この方式なら順位の総和が変わらず、後の計算と整合します。
タイがあるときは簡略式が使えない
ここで注意点があります。先ほど導いた簡略式 $r_s = 1 – \frac{6\sum d_i^2}{n(n^2-1)}$ は、タイがないこと(順位が $1$ から $n$ の整数の並べ替えであること)を前提に導出しました。平均順位を使うと順位が整数でなくなり、偏差平方和が $\frac{n(n^2-1)}{12}$ からずれるため、簡略式は厳密には成り立ちません。
タイがある場合は、定義に戻って「平均順位に対するピアソン相関」を直接計算するのが正しい方法です。これはタイ補正を含む式と等価で、SciPy の spearmanr も内部でこの計算を行っています。タイが少なければ簡略式でも実用上の誤差は小さいですが、5段階評価のようにタイが大量にあるデータでは、必ず定義式(順位のピアソン相関)を使ってください。
ここまでで理論は出そろいました。では、ピアソン・スピアマン・ケンドールを、結局いつどれを使えばよいのか。実務的な判断基準をまとめます。
ピアソン vs スピアマン vs ケンドール
3つの相関係数の使い分けを、判断のフローチャートにまとめました。

選択の流れは次のとおりです。
- 関係がおおむね直線的で、データが間隔尺度(連続値)かつ外れ値が少なく正規に近い → ピアソン $r$。効率がよく、回帰分析とも整合します。
- 関係が単調だが曲線的、または順序尺度(アンケート等)、または外れ値を含む → スピアマン $r_s$。最も汎用的な選択肢です。
- サンプルが小さい、タイが多い、解釈の明快さ(確率差)を重視する → ケンドール $\tau$。小標本での性質がよく、頑健性も高い。
- 関係が非単調(U字、周期的など) → どの相関係数も不向き。距離相関や相互情報量(MIC)を検討する。
特性を表でも整理しておきます。
| 観点 | ピアソン $r$ | スピアマン $r_s$ | ケンドール $\tau$ |
|---|---|---|---|
| 測る関係 | 直線 | 単調 | 単調 |
| 尺度 | 間隔・比率 | 順序以上 | 順序以上 |
| 外れ値 | 弱い | 頑健 | 最も頑健 |
| タイへの強さ | — | 補正必要 | 補正が自然 |
| 小標本 | 普通 | 普通 | 良好 |
| 解釈 | 直線あてはまり | 順位の相関 | 順序一致確率の差 |
| 計算量 | $O(n)$ | $O(n\log n)$ | $O(n\log n)$ |
実務では「まず散布図を描き、直線的ならピアソン、曲がった単調や外れ値ありならスピアマン」が基本方針になります。迷ったらスピアマンを使えば大きく外しません。
理屈が整理できたところで、実際にPythonで計算してみましょう。スクラッチ実装で定義を体に染み込ませてから、SciPyで答え合わせします。
Pythonでの実装
スピアマンとケンドールをスクラッチ実装
まず、定義どおりにスピアマンとケンドールを実装します。NumPy だけで書き、後でSciPyと一致するか確かめるのが目的です。
import numpy as np
def rankdata_avg(a):
"""平均順位を割り当てる(タイ対応)。最小値が順位1。"""
a = np.asarray(a, dtype=float)
order = np.argsort(a, kind="mergesort")
ranks = np.empty(len(a), dtype=float)
sorted_a = a[order]
i = 0
n = len(a)
while i < n:
j = i
while j + 1 < n and sorted_a[j + 1] == sorted_a[i]:
j += 1
# i..j がタイ。平均順位 = (i+1 + j+1)/2(1始まり)
avg = (i + 1 + j + 1) / 2.0
ranks[order[i:j + 1]] = avg
i = j + 1
return ranks
def spearman_scratch(x, y):
"""スピアマン rs = 順位どうしのピアソン相関(タイ対応の定義式)。"""
rx = rankdata_avg(x)
ry = rankdata_avg(y)
return np.corrcoef(rx, ry)[0, 1]
def kendall_scratch(x, y):
"""ケンドール tau-a(タイなし想定の素朴版, O(n^2))。"""
x = np.asarray(x); y = np.asarray(y)
n = len(x)
C = D = 0
for i in range(n):
for j in range(i + 1, n):
s = np.sign(x[i] - x[j]) * np.sign(y[i] - y[j])
if s > 0:
C += 1
elif s < 0:
D += 1
return (C - D) / (0.5 * n * (n - 1))
rankdata_avg がタイに平均順位を割り当てる関数で、これが順位相関の心臓部です。spearman_scratch は「順位に変換してピアソン相関を取る」という定義そのもの、kendall_scratch は全ペアを総当たりして一致・不一致を数える素朴な実装です(大きな $n$ では効率的なマージソート版が使われます)。
簡略式とSciPyで答え合わせ
次に、導出した簡略式・スクラッチ実装・SciPyの3つが一致するか確かめます。
import numpy as np
from scipy import stats
# 簡略式(タイなし前提)
def spearman_formula(x, y):
rx = rankdata_avg(x)
ry = rankdata_avg(y)
n = len(x)
d2 = np.sum((rx - ry) ** 2)
return 1 - 6 * d2 / (n * (n ** 2 - 1))
# 数値例(本文 fig05 と同じ)
x = np.array([10, 20, 30, 40, 50, 60, 70])
y = np.array([15, 10, 40, 35, 55, 70, 60])
print("簡略式 rs =", round(spearman_formula(x, y), 4))
print("スクラッチ rs =", round(spearman_scratch(x, y), 4))
print("SciPy rs =", round(stats.spearmanr(x, y).correlation, 4))
print("ケンドール tau(scratch) =", round(kendall_scratch(x, y), 4))
print("ケンドール tau(SciPy) =", round(stats.kendalltau(x, y).correlation, 4))
このコードを実行すると、簡略式・スクラッチ・SciPy のスピアマンがすべて 0.8929(本文で手計算した $0.893$)で一致します。ケンドールもスクラッチとSciPyが一致します。理論で導いた簡略式が、定義式やライブラリの実装と完全に同じ値を返すことが確認でき、導出が正しかったとわかります。
ピアソンとの違いを数値で見る
続いて、本文で見たピアソンの限界を数値で再現します。非線形データと外れ値データの2つで、ピアソンとスピアマンを比べます。
import numpy as np
from scipy import stats
rng = np.random.default_rng(1)
# (1) 単調だが非線形(指数)
x1 = np.linspace(0.2, 4.0, 60)
y1 = np.exp(x1) + rng.normal(0, 2.0, x1.size)
print("[非線形] pearson =", round(stats.pearsonr(x1, y1)[0], 3),
" spearman =", round(stats.spearmanr(x1, y1).correlation, 3))
# (2) 外れ値の影響
rng2 = np.random.default_rng(4)
x2 = np.sort(rng2.uniform(0, 10, 30))
y2 = 1.2 * x2 + rng2.normal(0, 1.0, 30)
print("[外れ値なし] pearson =", round(stats.pearsonr(x2, y2)[0], 3),
" spearman =", round(stats.spearmanr(x2, y2).correlation, 3))
x2o, y2o = x2.copy(), y2.copy()
x2o[-1], y2o[-1] = 10.0, -8.0 # 1点だけ強い外れ値に
print("[外れ値あり] pearson =", round(stats.pearsonr(x2o, y2o)[0], 3),
" spearman =", round(stats.spearmanr(x2o, y2o).correlation, 3))
実行結果は、非線形データでピアソン $\approx 0.89$・スピアマン $\approx 0.95$、外れ値ありでピアソンが $0.97 \to 0.57$ と急落するのにスピアマンは $0.96 \to 0.77$ にとどまる、という本文の図の数値を再現します。スピアマンが非線形性と外れ値の両方に強いことが、数値ではっきり確認できました。
有意性検定を自作する
最後に、並べ替え検定とSciPyの $p$ 値を比べます。
import numpy as np
from scipy import stats
rng = np.random.default_rng(5)
n = 12
x = np.arange(n)
y = x + rng.normal(0, 3, n) # 緩やかな単調関係
rs_obs = stats.spearmanr(x, y).correlation
# 並べ替え検定
rx, ry = stats.rankdata(x), stats.rankdata(y)
B = 20000
null = np.empty(B)
for b in range(B):
null[b] = np.corrcoef(rx, rng.permutation(ry))[0, 1]
p_perm = np.mean(np.abs(null) >= abs(rs_obs))
print("観測 rs =", round(rs_obs, 3))
print("並べ替え p値 =", round(p_perm, 4))
print("SciPy p値 =", round(stats.spearmanr(x, y).pvalue, 4))
並べ替え検定の $p$ 値とSciPyが返す $t$ 近似の $p$ 値が、ともに小さい値($0.001$ 前後)でおおむね一致します。観測した $r_s \approx 0.83$ は帰無分布の裾に位置するため、「独立では説明しにくい有意な相関」と結論できます。自作の並べ替え検定が、ライブラリの理論的近似と整合することも確認できました。
実装で手応えがつかめたところで、スピアマンが本領を発揮する代表的な応用——アンケート分析——を見ておきましょう。
応用: アンケート(順序尺度)データの分析
スピアマンが最も自然に活きるのが、5段階評価のような順序尺度のデータです。「価格への満足度(1〜5)」と「商品の推奨意向(1〜5)」の関連を考えましょう。順序尺度には落とし穴があります。「満足度4と5の差」と「満足度1と2の差」が同じ大きさである保証はありません(心理的な距離が等間隔とは限らない)。間隔の等しさを前提とするピアソンは、本来この種のデータには不向きなのです。
import numpy as np
from scipy import stats
rng = np.random.default_rng(6)
n = 200
latent = rng.normal(0, 1, n) # 潜在的な好意度
def to_likert(z, noise):
v = z + rng.normal(0, noise, n)
edges = np.quantile(v, [0.2, 0.4, 0.6, 0.8])
return np.digitize(v, edges) + 1 # 1〜5 の順序尺度
price = to_likert(latent, 0.6) # 価格満足度
recommend = to_likert(latent, 0.7) # 推奨意向
print("ピアソン r =", round(stats.pearsonr(price, recommend)[0], 3))
print("スピアマン rs =", round(stats.spearmanr(price, recommend).correlation, 3))
print("ケンドール tau =", round(stats.kendalltau(price, recommend).correlation, 3))
実行すると、3つの係数が出ます。順序尺度では、間隔の等しさを仮定しないスピアマンとケンドールの方が解釈的に妥当です。下の図は、5段階×5段階の各マスにデータが何件あるかをバブルの大きさで表したものです。

この図から、対角線(左下から右上)にデータが集中していることが読み取れます。価格満足度が高い人ほど推奨意向も高い、という単調な傾向です。タイ(同じマスに複数人)が大量にあるため、簡略式ではなく定義式に基づく spearmanr で計算するのが正解です。アンケート分析では、このようにスピアマンやケンドールが標準的に使われます。
まとめ
本記事では、スピアマンの順位相関係数を、ピアソンの限界という動機から定義・導出・検定・応用まで一気通貫で解説しました。
- ピアソンの限界: 直線関係しか測れず、外れ値1点で激変する。曲線的な単調関係を過小評価し、$y = e^x$ 型のデータでピアソン $\approx 0.89$ に対しスピアマン $\approx 0.95$ のように差が出る。
- スピアマンの本質: 「順位に変換してからピアソン相関を計算する」。曲がった単調関係を順位空間で直線に伸ばすことで、単調性の強さを捉える。
- 簡略式の導出: タイがなければ順位は $1$〜$n$ の整数なので、平均 $\frac{n+1}{2}$・偏差平方和 $\frac{n(n^2-1)}{12}$ が定数になり、$r_s = 1 – \dfrac{6\sum d_i^2}{n(n^2-1)}$ に帰着する。
- ケンドール $\tau$: 一致ペアと不一致ペアの差で測る $\tau = \dfrac{C – D}{\binom{n}{2}}$。外れ値に最も頑健で小標本に強く、解釈は「順序一致確率の差」。
- 使い分け: 直線=ピアソン、単調・順序・外れ値=スピアマン、小標本・タイ多・解釈重視=ケンドール、非単調=相関係数は不向き(距離相関・MIC)。
- 検定とタイ: 並べ替え検定や正規近似 $z = r_s\sqrt{n-1}$ で有意性を判定。タイが多いときは簡略式ではなく平均順位に基づく定義式を使う。
順位相関は、線形・正規という強い仮定を置けない現実のデータ——アンケート、外れ値混じりの観測、非線形だが単調な工学量——を扱うための、頑健で汎用的な道具です。「まず散布図を描き、単調なら順位相関」を合言葉にしてください。
次のステップとして、以下の記事も参考にしてください。