ある日のアイスクリーム店の売上データを眺めていて、「気温が高い日ほどよく売れているな」と気づいたとします。逆に「雨量が多い日ほど来客が減る」という関係もありそうです。このように 2つの量が一緒に動く(連動する)度合い を、数字ひとつで表せたら便利だと思いませんか。
その「一緒に動く度合い」を測るための統計量が、これから解説する 共分散(covariance) です。共分散は、2つの確率変数 $X$、$Y$ が同時に変動するとき、その変動が同じ向きなのか、逆向きなのか、それともバラバラなのかを定量化します。
共分散は、統計学や機械学習のあらゆる場面で土台として登場します。例えば次のような応用があります。
- 主成分分析(PCA)や次元削減 — 共分散行列の固有ベクトルがデータの「主な広がりの方向」を与えます。顔認識や画像圧縮の基礎です。
- ポートフォリオ理論(金融) — 複数の資産のリターンの共分散から、リスクを最小化する資産配分を計算します。
- ガウス過程・カルマンフィルタ — 共分散行列が「予測の不確かさ」そのものを表します。
この記事では、共分散の直感的なイメージから始め、定義式、覚えておくべき計算公式 $Cov(X,Y)=E[XY]-E[X]E[Y]$、双線形性などの性質、相関係数への正規化、そして複数変数を扱う共分散行列まで、図と Python 実装を交えて一気通貫で解説します。教科書でよく混同される「独立」と「無相関」の違いにも踏み込みます。
本記事の内容
- 共分散の直感的な理解と数学的定義
- 計算公式 $Cov(X,Y)=E[XY]-E[X]E[Y]$ の導出
- 双線形性などの性質と、相関係数への正規化
- 共分散行列・独立と無相関の違い・標本共分散・多変量への拡張
- Python での計算と可視化
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
特に 分散 は共分散の「1変数版」にあたります。分散が「$X$ がどれだけ散らばっているか」を測るのに対し、共分散は「$X$ と $Y$ がどれだけ連動して散らばるか」を測ります。分散の定義(偏差の2乗の平均)を思い出しながら読むと、共分散の定義がすんなり頭に入ります。
共分散の直感 — 2つの変数が一緒に動く
定義式に入る前に、まずイメージを固めましょう。
確率変数 $X$、$Y$ から同時にデータ点 $(x_n, y_n)$ を取り出すことを考えます。たとえば $X$ を「その日の気温」、$Y$ を「アイスの売上」とします。たくさんの日について $(x_n, y_n)$ を散布図に打つと、3つの典型的なパターンが現れます。
- 右肩上がり(正の連動) — 気温が高い日は売上も高い。点が右上から左下へ伸びる。
- 右肩下がり(負の連動) — 「気温」と「カイロの売上」のように、片方が大きいともう片方が小さい。点が左上から右下へ伸びる。
- 広がりに向きがない — 気温と「サイコロの目」のように、何の関係もない。点が雲のように散らばる。
この3パターンを、それぞれ正の共分散、負の共分散、共分散ゼロが表します。

3枚の散布図を見比べると、共分散の「符号」が連動の 向き を、その「大きさ」が連動の 強さ を表していることがわかります。左の正の共分散では、平均(オレンジの破線)の右側にある点ほど上にあり、左側の点ほど下にあります。中央の負の共分散はその逆です。右のゼロでは、平均線で区切った4つの領域に点がまんべんなく散らばり、向きがありません。
では、この「向き」をどう数式で捉えるのでしょうか。鍵は 各点が平均からどちらにずれているか(偏差)の積 です。これを次節で定義として組み立てます。
共分散の定義
それでは、共分散の定義を組み立てましょう。先ほどの「平均からのずれ(偏差)の積」というアイデアをそのまま数式にします。
確率変数 $X$、$Y$ から取り出した $n$ 番目のデータを $x_n$、$y_n$ とし、それぞれの期待値(平均)を $E[X]$、$E[Y]$ とします。1つのデータ点について、$X$ の偏差 と $Y$ の偏差 の積を考えます。
$$ (x_n – E[X])(y_n – E[Y]) $$
この積の符号を考えてみましょう。$x_n$ も $y_n$ も平均より大きい(ともに右上)なら、偏差は両方とも正なので積は 正 です。両方とも平均より小さい(ともに左下)なら、負×負で積はやはり 正 です。一方、片方だけが平均より大きい(右下や左上)と、正×負で積は 負 になります。

この図は、平均 $E[X]$、$E[Y]$ で平面を4つの領域に分けたものです。右上と左下(赤)の点は積が正、右下と左上(青)の点は積が負に効きます。$X$ と $Y$ が正に連動していれば右上・左下に点が集まり、正の項が多くなります。負に連動していれば右下・左上に集まり、負の項が多くなります。共分散は、この 偏差の積を全データで平均 したものです。
共分散の定義(標本)
$$ \begin{equation} \sigma_{XY} = Cov(X, Y) = \frac{1}{N} \sum_{n=1}^{N} (x_n – E[X])(y_n – E[Y]) \end{equation} $$
ここで $N$ はデータ点の総数です。共分散は $Cov(X, Y)$、$\sigma_{XY}$、あるいは $s_{XY}$ という記号で書くことが多いです。
確率分布として書く場合、つまり確率変数 $X$、$Y$ の同時分布が与えられているときは、平均を期待値オペレータ $E[\cdot]$ で表して次のように書きます。
$$ \begin{equation} Cov(X, Y) = E\big[(X – E[X])(Y – E[Y])\big] \end{equation} $$
(1) 式が手元のデータ(標本)に対する計算、(2) 式が確率分布に対する定義です。意味はどちらも同じで、「偏差の積の平均(期待値)」です。
なお、$X=Y$ とおくと、共分散はそのまま 分散 になります。
$$ Cov(X, X) = E\big[(X – E[X])^2\big] = V[X] $$
つまり分散は「自分自身との共分散」であり、共分散は分散の自然な一般化なのです。手元のデータが2つ以上の系列から構成されているとき、任意の2変数を取ってきて (1) を計算すれば、その2変数間の共分散が得られます。
定義はわかりましたが、毎回 (1) のように「平均を引いてから掛けて足す」のは少し面倒です。次節では、もっと楽に計算できる便利な公式を導きます。
共分散の計算公式 Cov=E[XY]-E[X]E[Y]
実務で最もよく使う、共分散の計算公式を導出します。ゴールは次の式を示すことです。
$$ \begin{equation} Cov(X, Y) = E[XY] – E[X]E[Y] \end{equation} $$
定義 (2) の右辺を展開していきます。まず、積の中身を分配法則で展開します。
$$ \begin{aligned} Cov(X, Y) &= E\big[(X – E[X])(Y – E[Y])\big] \\ &= E\big[XY – X\,E[Y] – E[X]\,Y + E[X]E[Y]\big] \end{aligned} $$
ここで期待値の 線形性(和の期待値は期待値の和、定数は外に出せる)を使って、各項を分けます。$E[X]$ や $E[Y]$ は定数であることに注意します。
$$ \begin{aligned} Cov(X, Y) &= E[XY] – E\big[X\,E[Y]\big] – E\big[E[X]\,Y\big] + E\big[E[X]E[Y]\big] \\ &= E[XY] – E[Y]\,E[X] – E[X]\,E[Y] + E[X]E[Y] \end{aligned} $$
2行目では、$E[Y]$ が定数なので $E[X\,E[Y]] = E[Y]\,E[X]$ のように期待値の外に出しました。同様に $E[E[X]\,Y] = E[X]\,E[Y]$、$E[E[X]E[Y]] = E[X]E[Y]$(定数の期待値はそれ自身)としています。
最後に $-E[X]E[Y]$ が2つあって $+E[X]E[Y]$ が1つあるので、まとめると $-E[X]E[Y]$ が1つ残ります。
$$ Cov(X, Y) = E[XY] – 2E[X]E[Y] + E[X]E[Y] = E[XY] – E[X]E[Y] $$
これで (3) 式が示せました。「積の平均」から「平均の積」を引く だけで共分散が得られます。$XY$ の平均と、$X$ と $Y$ それぞれの平均さえわかれば、偏差をいちいち計算しなくても共分散が求まる、というのがこの公式のありがたさです。
![計算公式の分解 — E[XY]からE[X]E[Y]を引くと共分散](https://disassemble-channel.com/wp-content/uploads/2026/06/figs03-43.png)
棒グラフは、4000点のデータで $E[XY]$、$E[X]E[Y]$、そしてその差 $Cov(X,Y)$ を実際に計算したものです。左の高い棒(積の平均)から真ん中の棒(平均の積)を引くと、右の共分散になります。この公式は手計算でも、コンピュータでの計算でも頻繁に使うので、ぜひ覚えておきましょう。
ところで、$X=Y$ とすると (3) は $V[X]=E[X^2]-E[X]^2$ となり、分散の有名な計算公式と一致します。ここでも分散と共分散の対応が確認できます。
公式が手に入ったところで、次は手を動かして具体的な数値で共分散を計算し、定義と公式が本当に一致するかを自分の目で確かめてみましょう。
具体例 — 手計算で共分散を求める
数式だけだとピンとこないので、小さなデータで実際に共分散を計算してみます。ある5日間について、最高気温 $X$(℃)とアイスの売上 $Y$(万円)を記録したとします。
| 日 | 気温 $x_n$ | 売上 $y_n$ |
|---|---|---|
| 1 | 20 | 3 |
| 2 | 24 | 5 |
| 3 | 28 | 6 |
| 4 | 30 | 7 |
| 5 | 28 | 4 |
まず、それぞれの平均を求めます。
$$ \bar{x} = \frac{20+24+28+30+28}{5} = \frac{130}{5} = 26, \qquad \bar{y} = \frac{3+5+6+7+4}{5} = \frac{25}{5} = 5 $$
次に、各日の偏差 $(x_n-\bar{x})$、$(y_n-\bar{y})$ と、その積を計算します。
| 日 | $x_n-\bar{x}$ | $y_n-\bar{y}$ | 積 |
|---|---|---|---|
| 1 | $-6$ | $-2$ | $12$ |
| 2 | $-2$ | $0$ | $0$ |
| 3 | $2$ | $1$ | $2$ |
| 4 | $4$ | $2$ | $8$ |
| 5 | $2$ | $-1$ | $-2$ |
偏差の積を合計すると $12+0+2+8-2 = 20$ です。これを $\div N = 5$ すると、標本共分散が得られます。
$$ Cov(X, Y) = \frac{20}{5} = 4.0 $$
共分散が正の値になりました。気温が高い日ほど売上も高い、という正の連動を数値が裏づけています。第1日(気温も売上も平均より低い、左下)と第4日(気温も売上も平均より高い、右上)が大きく正に寄与し、第5日(気温は高いが売上は低い、右下)だけが負に効いていることが表から読み取れます。
計算公式 (3) でも同じ値になるか確認しましょう。$E[XY]$ は各日の $x_n y_n$ の平均です。
$$ E[XY] = \frac{20\cdot3 + 24\cdot5 + 28\cdot6 + 30\cdot7 + 28\cdot4}{5} = \frac{60+120+168+210+112}{5} = \frac{670}{5} = 134 $$
これと $\bar{x}\,\bar{y} = 26 \times 5 = 130$ を使うと、
$$ Cov(X, Y) = E[XY] – \bar{x}\,\bar{y} = 134 – 130 = 4.0 $$
確かに定義から求めた値 $4.0$ と一致しました。このように、どちらの方法でも同じ答えになります。手計算では「偏差を出して掛ける」よりも「$xy$ の平均から平均の積を引く」公式の方が、表の列が少なく済んで楽な場合も多いです。
具体例で計算の手触りがつかめたところで、次は共分散がもつ代数的な性質を整理しましょう。これらの性質は、複数の変数を組み合わせたときの計算で威力を発揮します。
共分散の性質(双線形性・対称性)
共分散には、計算を大いに楽にしてくれる便利な性質がいくつかあります。順に確認しましょう。
対称性
定義から明らかですが、$X$ と $Y$ を入れ替えても共分散は変わりません。
$$ Cov(X, Y) = Cov(Y, X) $$
偏差の積 $(x_n-E[X])(y_n-E[Y])$ は掛け算なので順序を入れ替えても同じだからです。
定数との共分散はゼロ
$c$ を定数とすると、$Cov(X, c) = 0$ です。定数には「ばらつき」がなく偏差が常に $0$ になるため、何とも連動しようがないからです。
双線形性
共分散の最も重要な性質が 双線形性(bilinearity) です。これは「2つの引数のそれぞれについて線形である」という意味で、次の2つの式にまとめられます。$a$、$b$ は定数、$X$、$Y$、$Z$ は確率変数です。
$$ \begin{equation} \begin{aligned} Cov(aX, Y) &= a\,Cov(X, Y) \\ Cov(X + Z, Y) &= Cov(X, Y) + Cov(Z, Y) \end{aligned} \end{equation} $$
1つ目は「片方を $a$ 倍すると共分散も $a$ 倍になる」、2つ目は「片方が和になっていれば共分散も分配できる」という性質です。$Y$ 側についても同じことが成り立ちます。
1つ目の式を定義から確かめてみましょう。$E[aX]=aE[X]$ を使います。
$$ \begin{aligned} Cov(aX, Y) &= E\big[(aX – E[aX])(Y – E[Y])\big] \\ &= E\big[a(X – E[X])(Y – E[Y])\big] \\ &= a\,E\big[(X – E[X])(Y – E[Y])\big] = a\,Cov(X, Y) \end{aligned} $$
2行目で $aX – aE[X] = a(X-E[X])$ と $a$ をくくり出し、3行目で期待値の線形性により定数 $a$ を外に出しました。

この図は、$X$ をいろいろなスケール係数 $a$ で拡大したときの $Cov(aX, Y)$ をプロットしたものです。実測(青)が理論線 $a\cdot Cov(X,Y)$(赤の破線)にぴったり乗っており、双線形性が確かに成り立っていることが見て取れます。
双線形性のおかげで、和の分散も簡単に展開できます。たとえば $V[X+Y]=Cov(X+Y, X+Y)$ を双線形性で分配すると、
$$ V[X + Y] = V[X] + V[Y] + 2\,Cov(X, Y) $$
という有名な公式が得られます。共分散の項が「2つの変数の連動による上乗せ(または相殺)」を表しているわけです。ポートフォリオのリスク計算は、まさにこの式の応用です。
性質が整理できたところで、共分散の弱点に目を向けましょう。共分散には「値の大きさが単位に依存してしまう」という困った性質があります。これを解決するのが相関係数です。
相関係数への正規化
共分散には1つ実用上の問題があります。それは 単位(スケール)に依存してしまう という点です。
たとえば身長を「メートル」で測るか「センチメートル」で測るかで、共分散の値は100倍も変わってしまいます。連動の向きと強さは同じはずなのに、数値だけ見ると比較できません。この問題を解決するために、共分散を各変数の標準偏差で割って 無次元化 したものが、ピアソンの相関係数 $\rho$ です。
$$ \begin{equation} \rho_{XY} = \frac{Cov(X, Y)}{\sigma_X \, \sigma_Y} \end{equation} $$
ここで $\sigma_X = \sqrt{V[X]}$、$\sigma_Y = \sqrt{V[Y]}$ はそれぞれの標準偏差です。標準偏差は変数と同じ単位をもつので、$Cov(X,Y)$ の単位($X$ の単位 × $Y$ の単位)をちょうど打ち消し、$\rho$ は単位をもたない純粋な数になります。
相関係数 $\rho$ は必ず $-1 \le \rho \le 1$ の範囲に収まります(これはコーシー・シュワルツの不等式から示せます)。$\rho$ が $1$ に近いほど強い正の相関、$-1$ に近いほど強い負の相関、$0$ に近いほど直線的な関係が弱いことを意味します。

2枚の散布図は、どちらも本質的に同じ強さ($\rho \approx 0.8$)の正の相関をもつデータですが、右側は $X$ と $Y$ の単位(スケール)を大きく変えてあります。共分散 $Cov$ の値は左右で大きく異なるのに、相関係数 $\rho$ はほぼ同じ値になっています。これが「正規化」の効果です。異なる単位のデータ間で連動の強さを比較したいときは、共分散ではなく相関係数を使う、と覚えておきましょう。
ここまでは2つの変数を扱ってきました。しかし現実のデータは何十、何百という変数をもつことが普通です。次は、すべての変数ペアの共分散を一度に扱う「共分散行列」に進みます。
共分散行列
変数が3つ、4つ……と増えてくると、変数ペアの組み合わせも一気に増えます。$p$ 個の変数があれば、ペアの数は $\binom{p}{2}$ 通りです。これらの共分散を、それぞれの分散とまとめて1つの行列に並べたものが 共分散行列(covariance matrix) $\Sigma$ です。
確率変数をベクトル $\bm{X} = (X_1, X_2, \dots, X_p)^\top$ にまとめると、共分散行列は次のように定義されます。
$$ \begin{equation} \Sigma = E\big[(\bm{X} – E[\bm{X}])(\bm{X} – E[\bm{X}])^\top\big] \end{equation} $$
各成分 $(i, j)$ は、$i$ 番目と $j$ 番目の変数の共分散です。
$$ \Sigma_{ij} = Cov(X_i, X_j) $$
成分を並べて書くと、次のような対称行列になります。
$$ \Sigma = \begin{pmatrix} V[X_1] & Cov(X_1, X_2) & \cdots & Cov(X_1, X_p) \\ Cov(X_2, X_1) & V[X_2] & \cdots & Cov(X_2, X_p) \\ \vdots & \vdots & \ddots & \vdots \\ Cov(X_p, X_1) & Cov(X_p, X_2) & \cdots & V[X_p] \end{pmatrix} $$
この行列には重要な構造があります。
- 対角成分($i=j$)は $Cov(X_i, X_i) = V[X_i]$、すなわち各変数の 分散 です。
- 非対角成分($i \ne j$)は変数ペアの 共分散 です。
- 対称性 $Cov(X_i, X_j) = Cov(X_j, X_i)$ より、$\Sigma$ は 対称行列 です。
- さらに $\Sigma$ は 半正定値 です(任意のベクトル $\bm{a}$ に対し $\bm{a}^\top \Sigma \bm{a} = V[\bm{a}^\top\bm{X}] \ge 0$)。
半正定値であることの意味を補足しておきます。$\bm{a}^\top \bm{X}$ は変数の重み付き和(たとえば資産の組み合わせ)であり、その分散は決して負になりません。分散が必ず $0$ 以上であることが、共分散行列の半正定値性として表れるのです。逆に言えば、勝手に作った対称行列が必ずしも共分散行列になれるわけではなく、半正定値という条件を満たす必要があります。この性質は、ガウス過程のカーネル行列やポートフォリオ最適化で「正しい共分散構造かどうか」を判定する基準になります。

左が共分散行列 $\Sigma$、右がそれを正規化した相関行列です。共分散行列は対角に分散($X_1$ は分散が大きいので明るい色)、非対角にペアの共分散が並びます。ただし共分散行列は変数のスケールが混ざって読みにくいので、実務では右の相関行列で見ることが多いです。相関行列は対角がすべて $1$(自分自身との相関は $1$)で、$X_1$ と $X_2$ が強い正の相関($0.81$)、$X_1$ と $X_3$ が弱い負の相関($-0.32$)であることが一目でわかります。
共分散行列はガウス過程、カルマンフィルタ、PCA など多くの手法の中心に座る重要な対象です。その固有ベクトルが「データの主な広がりの方向」を与えることは、後ほど楕円の図で直感的に確認します。
ここで、初学者が必ず一度はつまずく重要な区別に触れておきましょう。「独立」と「無相関」は同じではありません。
独立と無相関の違い
「2つの変数が独立なら無相関」は正しいのですが、その逆「無相関なら独立」は 成り立ちません。ここを取り違えると、データ分析で重大な誤解を生みます。
まず用語を整理します。
- 独立: $X$ の値が何であっても $Y$ の分布が変わらない。$P(X, Y) = P(X)P(Y)$ が成り立つ。これは「あらゆる種類の関係がない」という非常に強い条件です。
- 無相関: $Cov(X, Y) = 0$(したがって $\rho = 0$)。「直線的な関係がない」という、ずっと弱い条件です。
独立なら $E[XY] = E[X]E[Y]$ が成り立つので、計算公式 (3) から $Cov(X,Y) = E[XY] – E[X]E[Y] = 0$、つまり無相関になります。この向きは常に正しいです。
しかし逆は成り立ちません。共分散は 直線的な関係しか測れない からです。曲がった関係があっても、共分散はそれを見逃します。

左は $Y = X^2$ という放物線の関係、右は単位円周上に並んだ点です。どちらも $X$ と $Y$ の間には明確な(決定論的に近い)関係があるのに、共分散も相関係数もほぼ $0$ になっています。放物線では、$X$ が正でも負でも $Y$ が大きくなり、偏差の積の正負が打ち消し合うためです。円周上の点も同様に、上下左右で対称なので積の平均がゼロになります。
この事実は実務で極めて重要です。「相関係数が $0$ だから2つの変数は無関係だ」と結論づけるのは誤りで、非線形な関係を見落としている可能性があります。散布図を必ず描いて目で確認する、あるいは スピアマンの順位相関係数 のような非線形の関係も捉えられる指標を併用する、といった対策が必要です。
なお、独立と無相関が一致する重要な例外があります。$X$ と $Y$ が 2次元正規分布に従う 場合に限っては、「無相関ならば独立」が成り立ちます。多変量正規分布は共分散行列だけで分布の形が完全に決まるため、共分散がゼロなら本当に独立になるのです。この特殊な事情から、正規分布を仮定する場面では「無相関」と「独立」を同一視できますが、それはあくまで正規性という強い仮定があってのことだと理解しておきましょう。一般の分布では、無相関は独立よりずっと弱い主張にすぎません。
ここまでは、確率分布が与えられている前提で共分散を扱ってきました。しかし現実には、私たちが手にするのは有限個のデータ(標本)だけです。次は、データから共分散を推定する「標本共分散」を見ていきます。
標本共分散と不偏推定
実際のデータ分析では、母集団の真の共分散は知りようがなく、手元の $N$ 個の標本 $(x_n, y_n)$ から推定します。このとき、推定式の分母を $N$ にするか $N-1$ にするかで、2種類の標本共分散が定義されます。
$$ \begin{aligned} \text{標本共分散(÷N)}: \quad & \tilde{s}_{XY} = \frac{1}{N}\sum_{n=1}^{N}(x_n – \bar{x})(y_n – \bar{y}) \\ \text{不偏共分散(÷(N-1))}: \quad & s_{XY} = \frac{1}{N-1}\sum_{n=1}^{N}(x_n – \bar{x})(y_n – \bar{y}) \end{aligned} $$
ここで $\bar{x}$、$\bar{y}$ は標本平均です。違いは分母だけですが、これには深い理由があります。標本平均 $\bar{x}$ 自体がデータから推定された値なので、偏差 $(x_n – \bar{x})$ は真の偏差 $(x_n – E[X])$ よりもわずかに小さくなりがちです(標本平均は手元のデータに最も近づく値だから)。その結果、$N$ で割ると共分散をやや小さく見積もってしまいます。これを補正するのが「自由度」$N-1$ で割る操作で、これにより推定量の期待値が母共分散にぴったり一致します(不偏性)。
$$ E[s_{XY}] = Cov(X, Y) $$

この図は、母共分散が $0.6$ のデータから $N=8$ の小標本を何度も取り、2つの推定式で共分散を計算した結果のヒストグラムです。$\div N$(青)の平均は真値 $0.6$ より小さい側に偏っているのに対し、$\div (N-1)$(赤)の平均は真値にほぼ一致しています。標本数 $N$ が小さいほどこの差は顕著になり、$N$ が大きくなれば両者はほとんど同じになります。統計ソフトの多くは既定で不偏($N-1$)を使うので、自分のコードがどちらを使っているか意識しておきましょう(NumPy の np.cov は既定で ddof=1、つまり $N-1$)。
2変数の標本共分散がわかれば、これを多変数に拡張するのは自然な流れです。次に、データ行列から共分散行列を一気に計算する方法を見ます。
多変量への拡張
複数の変数を同時に扱うときは、データを行列の形で整理します。$N$ 個のサンプル、$p$ 個の変数があるとき、各行が1サンプル、各列が1変数のデータ行列 $\bm{X} \in \mathbb{R}^{N \times p}$ を考えます。
まず各列の平均を引いて 中心化 した行列 $\bm{X}_c$ を作ります。$\bm{X}_c$ の各列は平均 $0$ になっています。すると、標本共分散行列は次の1本の式で計算できます。
$$ \begin{equation} \hat{\Sigma} = \frac{1}{N-1}\,\bm{X}_c^\top \bm{X}_c \end{equation} $$
この式の意味を確認しましょう。$\bm{X}_c^\top \bm{X}_c$ の $(i, j)$ 成分は、$i$ 列目と $j$ 列目の中心化済みデータの内積、すなわち $\sum_n (x_{ni} – \bar{x}_i)(x_{nj} – \bar{x}_j)$ です。これは2変数の偏差積の和そのものなので、$N-1$ で割れば $X_i$ と $X_j$ の不偏共分散になります。行列の掛け算1回で、すべての変数ペアの共分散を同時に得られるのが美しいところです。
このように、共分散行列は「中心化したデータ行列の自己内積を $N-1$ で割ったもの」と覚えると、計算も実装もスッキリします。多変量正規分布、PCA、線形判別分析(LDA)など、多変量解析のほぼすべてがこの式を出発点にしています。
理論が一通り揃ったので、ここからは Python で実際に計算し、これまでの主張を数値とグラフで確かめていきます。
Pythonでの実装
まずは、共分散を定義通りに計算し、NumPy の np.cov の結果と一致するかを確認します。さらに、計算公式 $Cov(X,Y)=E[XY]-E[X]E[Y]$ でも同じ値になるかを検証します。
import numpy as np
# 相関のある2次元データを生成(rho=0.7)
rng = np.random.default_rng(0)
n = 5000
z1 = rng.standard_normal(n)
z2 = rng.standard_normal(n)
rho = 0.7
x = z1
y = rho * z1 + np.sqrt(1 - rho**2) * z2
# (1) 定義通り(偏差の積の平均, ÷N)
cov_def = np.mean((x - x.mean()) * (y - y.mean()))
# (2) 計算公式 E[XY] - E[X]E[Y]
cov_formula = np.mean(x * y) - x.mean() * y.mean()
# (3) NumPy(既定は ddof=1 = ÷(N-1) の不偏)
cov_numpy_unbiased = np.cov(x, y, ddof=1)[0, 1]
cov_numpy_biased = np.cov(x, y, ddof=0)[0, 1]
print(f"定義(÷N) : {cov_def:.5f}")
print(f"計算公式(÷N) : {cov_formula:.5f}")
print(f"np.cov(ddof=0) : {cov_numpy_biased:.5f}")
print(f"np.cov(ddof=1) : {cov_numpy_unbiased:.5f}")
実行すると、次のような出力が得られます。
定義(÷N) : 0.70358
計算公式(÷N) : 0.70358
np.cov(ddof=0) : 0.70358
np.cov(ddof=1) : 0.70373
定義通りの計算と計算公式が小数点以下まで完全に一致しており、(3) 式が正しいことが数値で確認できました。np.cov の ddof=0(÷N)も同じ値です。一方 ddof=1(÷(N-1))はわずかに大きく、データ数 $n=5000$ と多いため差はごく小さいですが、確かに不偏補正がかかっています。生成時に $\rho=0.7$、分散はほぼ $1$ としたので、共分散は理論上 $0.7$ 付近になるはずで、結果もそれに合致しています。
次に、相関係数とスケール不変性を確認します。共分散はスケールで変わるが相関係数は変わらない、という前節の主張を数値で検証します。
import numpy as np
rng = np.random.default_rng(1)
n = 5000
z1 = rng.standard_normal(n)
z2 = rng.standard_normal(n)
rho_true = 0.8
x = z1
y = rho_true * z1 + np.sqrt(1 - rho_true**2) * z2
# Xを100倍、Yを0.01倍にスケール変換
xs = 100 * x
ys = 0.01 * y
print("--- 元のスケール ---")
print(f"Cov = {np.cov(x, y, ddof=0)[0,1]:.4f}")
print(f"rho = {np.corrcoef(x, y)[0,1]:.4f}")
print("--- スケール変換後 ---")
print(f"Cov = {np.cov(xs, ys, ddof=0)[0,1]:.6f}")
print(f"rho = {np.corrcoef(xs, ys)[0,1]:.4f}")
出力は次のようになります。
--- 元のスケール ---
Cov = 0.7805
rho = 0.7939
--- スケール変換後 ---
Cov = 0.780496
rho = 0.7939
共分散の値はスケール変換($X$ を100倍、$Y$ を0.01倍)でほぼ変わらないように見えますが、これは $100 \times 0.01 = 1$ と係数の積がたまたま $1$ だったためです。係数を変えれば共分散は大きく動きます。一方、相関係数 $\rho$ は どんなスケール変換に対しても完全に不変 で、$0.794$ のまま変わりません。これが (5) 式の正規化の威力です。連動の「強さそのもの」を測りたいときは相関係数を使うべきだと、改めて確認できます。
最後に、多変量データから共分散行列を計算し、行列演算による式 (8) と np.cov が一致することを確かめ、固有値分解で「データの広がりの主軸」を取り出してみます。
import numpy as np
rng = np.random.default_rng(2)
n = 2000
# 真の共分散構造
true_cov = np.array([[3.0, 1.2, -0.5],
[1.2, 1.0, 0.3],
[-0.5, 0.3, 2.0]])
data = rng.multivariate_normal([0, 0, 0], true_cov, n) # (n, 3)
# (8) 中心化して X_c^T X_c / (N-1)
Xc = data - data.mean(axis=0)
cov_manual = (Xc.T @ Xc) / (n - 1)
# NumPy(rowvar=Falseで列が変数)
cov_numpy = np.cov(data, rowvar=False, ddof=1)
print("手計算 (X_c^T X_c)/(N-1):")
print(np.round(cov_manual, 3))
print("一致するか:", np.allclose(cov_manual, cov_numpy))
# 固有値分解 → データの主な広がりの方向
eigvals, eigvecs = np.linalg.eigh(cov_manual)
order = eigvals.argsort()[::-1]
print("固有値(大きい順):", np.round(eigvals[order], 3))
print("第1主軸の向き:", np.round(eigvecs[:, order[0]], 3))
実行結果は次の通りです。
手計算 (X_c^T X_c)/(N-1):
[[ 2.985 1.194 -0.463]
[ 1.194 0.981 0.294]
[-0.463 0.294 1.987]]
一致するか: True
固有値(大きい順): [3.598 2.059 0.296]
第1主軸の向き: [-0.901 -0.39 0.188]
中心化したデータ行列の自己内積を $N-1$ で割った手計算の結果が np.cov と完全に一致し(np.allclose が True)、式 (8) の正しさが確認できました。推定された共分散行列は、生成時に与えた true_cov ともよく一致しています。さらに固有値分解を行うと、最大の固有値($3.60$)に対応する固有ベクトルが「データが最も大きく広がる方向(第1主成分)」を指します。この固有ベクトルは $X_1$ の重みの絶対値が最も大きく($0.90$)、これは $X_1$ の分散が最も大きいことと整合します(向きの符号は固有ベクトルの不定性によるもので、軸の方向としては同じです)。共分散行列の固有分解が PCA の正体である、という事実がここに現れています。
最後に、共分散行列の固有ベクトルが等確率楕円の向きを決めること、そして多変量データの相関構造を一望できるペアプロットを見ておきましょう。

この図は、相関 $\rho$ を変えたときの2次元正規分布のデータと、その等確率楕円(赤)を重ねたものです。$\rho=0$ では楕円は円になり、向きがありません。$\rho>0$ では右上がりの楕円、$\rho<0$ では右下がりの楕円になります。楕円の長軸の向きは、まさに共分散行列の最大固有値に対応する固有ベクトルの方向です。共分散が大きいほど楕円は細長く傾き、データの連動が強いことを視覚的に表します。

ペアプロットは、全変数の組み合わせについて散布図(非対角)とヒストグラム(対角)を並べたものです。各散布図には相関係数 $\rho$ を表示してあり、$X_1$ と $X_2$ が強い正の相関(赤)、$X_3$ が他と弱い負の相関(青)をもつことが一目で読み取れます。変数が多い実データでは、まずこのペアプロットや相関行列のヒートマップを描いて全体の相関構造をつかむのが定石です。
まとめ
本記事では、確率変数の共分散について、直感から多変量への拡張まで解説しました。要点を整理します。
- 共分散 は、2つの確率変数が一緒に動く(連動する)向きと強さを表す統計量で、定義は偏差の積の平均 $Cov(X,Y) = E[(X-E[X])(Y-E[Y])]$。
- よく使う 計算公式 は $Cov(X,Y) = E[XY] – E[X]E[Y]$。「積の平均」から「平均の積」を引くだけ。
- 共分散には 双線形性・対称性があり、$V[X+Y]=V[X]+V[Y]+2Cov(X,Y)$ のような展開ができる。
- 共分散はスケール依存なので、標準偏差で割って正規化したのが 相関係数 $\rho = Cov(X,Y)/(\sigma_X\sigma_Y) \in [-1, 1]$。
- 全変数ペアの共分散をまとめたのが 共分散行列 $\Sigma$。対角が分散、非対角が共分散の対称・半正定値行列で、PCA やガウス過程の基礎。
- 独立なら無相関だが、無相関でも独立とは限らない。共分散は直線的な関係しか測れない。
- 標本からの推定では、不偏性のために $\div(N-1)$ を使う。多変量では $\hat{\Sigma} = \bm{X}_c^\top \bm{X}_c / (N-1)$ で一括計算できる。
共分散と相関係数は、ここから多くの発展トピックへつながります。次のステップとして、以下の記事も参考にしてください。