論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
行列
Matrix
数学基礎線形代数必修

🔖 キーワード索引

💡 結論 📍 文脈 🎨 直感 📐 定義 🔬 記号 🧮 実値 🐍 Python ⚠️ 落とし穴 🌐 関連手法 🔗 関連用語 📚 グループ教材 🗺 概念マップ

🔖 拡張キーワード索引

本セクションは 行列・線形代数(Matrix Math / Linear Algebra) をジャストインタイム型に学べるよう、 12 観点で再整理した拡張索引です。 各チップは本ページ内の該当節へジャンプします。

💡 30秒結論 📍 文脈 🎨 直感 📐 数式 🔬 記号 🧮 計算 🐍 Python ⚠️ 落とし穴 🌐 関連手法 🔗 関連用語 📚 教材 🧪 事例 🗺 フローチャート 🚧 誤用集 📝 報告書 📜 歴史 ✅ チェック ❓ FAQ

💡 30秒で分かる結論

🍰 まずはやさしく

行列は数字を並べた表のようなものです。

たくさんのデータをまとめて計算するために使います。

都道府県ごとの人口や支出の表が例です。

この章では行列の基本と使い方を読みます。

💡 30 秒で分かる結論(拡張版)

時間が限られている方はこのブロックだけで OK。 ただし、 実務投入前には必ず「⚠️ 落とし穴」と「✅ 実務チェックリスト」を一読してください。 『知っていたが対処を忘れた』が分析事故の最大原因です。

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

🍰 まずはやさしく

行列は計算に使う共通の言葉のようなものです。

複雑な分析をシンプルに書きたいときに使います。

スマホのアプリなどの計算でも使われています。

ここでは行列を使った分析の手順を読みます。

行列」は統計・機械学習のあらゆる計算の言語です。 SSDSE-B-2026 のような 47 行 × 110 列 のデータも 1 つの行列 $X$ で表現できます。 回帰係数、 主成分、 クラスタリング距離、 ニューラルネットの重み — どれも行列演算で記述されます。 本ページでは、 都道府県データを行列として扱い、 転置・積・逆行列・固有分解という最小限の操作だけで分析が組み立てられることを示します。

前提知識: ベクトル。 次に学ぶ: 逆行列固有値主成分分析

📍 文脈ボックス — あなたが今見ているもの(拡張版)

本ページは『2026 統計・データ解析コンペティション』向けジャストインタイム用語集の 行列・線形代数 解説です。 想定読者は、 SSDSE-B-2026 を使った分析レポートを書こうとしている学部・修士・実務初学者層。 数式は最低限に抑え、 公的統計を題材に手を動かしながら習得できるよう設計しています。

観点本ページの立ち位置
対象用語行列・線形代数(Matrix Math / Linear Algebra)
カテゴリ数学・最適化
前提知識高校〜大学初年級の数学、 Python の基本(pandas/numpy)
学習目標定義・直感・実装・落とし穴の 4 点を 30 分以内で押さえる
扱うデータSSDSE-B-2026.csv(47 都道府県 × 約 110 指標 × 複数年)
推定所要時間通読 25-35 分、 ハンズオン込みで 60-90 分
難易度★★☆☆☆〜★★★★☆(節により異なる)

この用語は単独で完結する概念ではなく、 上位概念・並列概念・派生概念のネットワークの一節点です。 ページ末尾の「🔗 関連用語(前提・並列・発展)」と「🌐 関連手法・派生」を併読することを強くおすすめします。

🎨 直感で掴む

🍰 まずはやさしく

行列は数字の表や変換器のようなものです。

データの形を捉えたり動かしたりするために使います。

エクセルのシートをイメージすると分かりやすいです。

ここでは行列の直感的なイメージを読みます。

イメージ 1: スプレッドシート。 Excel のシートそのものが行列です。 SSDSE-B-2026 を開けば、 行 = 47 都道府県、 列 = 総人口・出生数・消費支出… という $47\times 110$ の表が見えます。 1 マス 1 マスが行列の要素 $x_{ij}$ にあたります。

イメージ 2: 変換器。 $2\times 2$ 行列 $\begin{pmatrix}0 & -1\\ 1 & 0\end{pmatrix}$ をベクトル $\begin{pmatrix}1\\0\end{pmatrix}$ に掛けると $\begin{pmatrix}0\\1\end{pmatrix}$ になる — 反時計回りに $90^{\circ}$ 回転。 行列は座標空間を「ぐにゃっ」と動かす機械です。

イメージ 3: レンズ。 共分散行列 $\Sigma=X^\top X / n$ はデータ雲の形を捉えるレンズ。 固有値が大きい方向 = データが伸びている方向 = 主成分。 つまり「47 都道府県のばらつき」は共分散行列という 1 つの行列に集約できます。

補足: 行列は「データ・写像・関係」の 3 つの顔を持ちます。 文脈に応じてどの顔を見ているかを意識すると、 同じ計算でも理解が深まります。

🎨 直感で掴む(拡張版)

47 都道府県 × 100 列の表は『行列』そのもの。 行列演算はこの表を回転・伸縮・要約する操作。

行列を「① 数の表(Excel の延長)」「② 連立方程式($AX=B$ という解くべき対象)」「③ 線形変換(ベクトル空間を別の空間に写す関数)」の 3 段階 で重ねて理解する。 機械学習で $X^\top X$ や $(X^\top X)^{-1} X^\top y$ が出てきたとき、 ① では「ただの数の集まり」、 ② では「連立方程式の解」、 ③ では「データ空間 $\mathbb{R}^p$ から係数空間 $\mathbb{R}^p$ への射影」と読めるようになる。

① 表の見立て
SSDSE-B の「47 都道府県 × 100 列の数値表」は、 そのまま 47×100 の行列 X。 各行が 1 県、 各列が「総人口」「出生数」「高齢化率」などの観測指標。 これを行列としてまとめれば、 47 県を一度に変換・要約できる。
② 図形で掴む
行列はベクトル空間を 回転・伸縮・射影 する装置。 例えば「総人口」と「65 歳以上人口」の 2 次元散布図に対し、 共分散行列を固有値分解すると 第 1 主成分軸(最も分散の大きい方向)が現れ、 47 都道府県の分布を 1 本の軸で要約できる。
③ 演算で掴む
回帰係数 $\hat{\beta} = (X^\top X)^{-1} X^\top y$ は 行列の積・転置・逆行列 だけで書ける。 後述の「🐍 Python 実装」では numpy.linalg.inv@ 演算子で同じ式を 1 行で再現し、 47 県の総人口から出生数を予測する係数を求める。
💡 学習のコツ:行列の演算 4 種 ($A+B$, $cA$, $AB$, $A^{-1}$) は「shape がどう変化するか」を先に覚える。 $A \in \mathbb{R}^{m \times n}, B \in \mathbb{R}^{n \times p}$ なら $AB \in \mathbb{R}^{m \times p}$。 SSDSE-B-2026 の $X \in \mathbb{R}^{47 \times 7}$ なら $X^\top X \in \mathbb{R}^{7 \times 7}$、 $(X^\top X)^{-1} X^\top y \in \mathbb{R}^{7}$ と 必ず shape を念頭に置いて読むと数式が崩れにくい。

📐 数式による定義

🍰 まずはやさしく

行列は数字を縦と横に並べたものです。

計算のルールを正確に決めるために使います。

テストの点数表のように数字を整理して並べます。

ここでは行列の計算ルールについて読みます。

$m\times n$ 行列 $A$ は、 実数(または複素数)を要素にもつ二次元配列:

$$ A = \begin{pmatrix} a_{11} & a_{12} & \cdots & a_{1n}\\ a_{21} & a_{22} & \cdots & a_{2n}\\ \vdots & \vdots & \ddots & \vdots\\ a_{m1} & a_{m2} & \cdots & a_{mn}\end{pmatrix} \in \mathbb{R}^{m\times n} $$

基本演算:

特別な行列:

$$ I = \begin{pmatrix}1 & 0 & \cdots & 0\\ 0 & 1 & \cdots & 0\\ \vdots & & \ddots & \vdots\\ 0 & 0 & \cdots & 1\end{pmatrix},\quad O = \begin{pmatrix}0 & \cdots & 0\\ \vdots & & \vdots\\ 0 & \cdots & 0\end{pmatrix} $$

$I$ は単位行列($Iv=v$)、 $O$ は零行列。 対称行列 $A^\top=A$、 直交行列 $A^\top A=I$、 半正定値 $v^\top A v\ge 0$ などの分類があります。

📐 幾何的な解釈

行列は単なる数の表ではなく、 「空間を変形する装置」と見るのが直感的です。 $2\times 2$ の例で考えると、 行列のタイプごとに空間の動きが対応します。

行列幾何的意味$\det$
$\begin{pmatrix}2&0\\0&2\end{pmatrix}$面積 4 倍の等方拡大4
$\begin{pmatrix}\cos\theta&-\sin\theta\\\sin\theta&\cos\theta\end{pmatrix}$角度 $\theta$ の回転1
$\begin{pmatrix}1&1\\0&1\end{pmatrix}$横方向の剪断1
$\begin{pmatrix}1&0\\0&0\end{pmatrix}$$x$ 軸への射影(情報半分喪失)0
$\begin{pmatrix}-1&0\\0&1\end{pmatrix}$$y$ 軸での反射-1

SSDSE-B で標準化 → PCA を適用するのは、 都道府県という 47 点の雲を「回転 + 射影」で 2 次元に押し込めて見やすくする操作と読み替えられます。 行列の $\det$、 固有値の正負、 直交性が、 そのまま地図上の「向き・拡大率・歪み」に対応するのが面白いところです。

🧱 行列で組み立てる代表的アルゴリズム

統計・機械学習の主要アルゴリズムは、 基本的にすべて行列演算の組み合わせで表現できます。 「分解」「積」「逆」の 3 ステップで頭の中に図を描けるようにしましょう。

① 最小二乗回帰

$\hat\beta = (X^\top X)^{-1} X^\top y$。 デザイン行列 $X$ を作り、 グラム行列を作り、 逆を取り、 $y$ と掛けるだけ。 SSDSE-B で「人口・高齢人口 → 出生数」の回帰がこの 1 式で完了します。

② リッジ回帰

$\hat\beta_\lambda = (X^\top X + \lambda I)^{-1} X^\top y$。 単に対角に $\lambda$ を足すだけで、 多重共線性に強い推定が得られます。 行列の言葉だと「対角に足し上げて条件数を下げる」操作です。

③ 主成分分析(PCA)

$C = X_s^\top X_s / n$ を作り、 固有分解 $C = Q\Lambda Q^\top$。 上位 $k$ 個の固有ベクトル $Q_k$ を取り、 $Z = X_s Q_k$ で射影。 行列分解 1 回で次元削減と可視化が同時に完成します。

④ ニューラルネットの 1 層

$h = \phi(W x + b)$。 ここでも $W$ は重み行列、 $x$ は入力ベクトル、 $\phi$ は非線形関数。 つまり「行列積 + バイアス + 活性化」を積み重ねたのが深層学習です。

⑤ スペクトルクラスタリング

類似度行列 $W$ からラプラシアン $L = D - W$ を作り、 小さい固有値に対応する固有ベクトルを取って k-means。 グラフを行列に翻訳した瞬間、 クラスタリングが線形代数の問題になります。

📐 数式または定義(拡張版)

行列・線形代数 の中心的な定義式は次のとおりです。

$$ A\mathbf{x}=\lambda\mathbf{x} $$

この式は、 行列・線形代数 の本質を最も簡潔に表現したもの。 関連分野では同じ概念が別の表記で現れることもあるため、 教科書・論文を読む際は記号定義表を必ず確認してください。

🎮 触って理解する

$2\times 2$ 行列 $A=\begin{pmatrix}a&b\\ c&d\end{pmatrix}$ の 4 成分をスライダーで動かすと、 平面がどう変換されるかがリアルタイムで見えます。 薄いグレーが変換前の格子、 色付きが変換後の格子です。 赤い矢印は $\hat{\imath}=\begin{pmatrix}1\\0\end{pmatrix}$ の行き先(= $A$ の第 1 列 $(a,c)$)、 緑の矢印は $\hat{\jmath}=\begin{pmatrix}0\\1\end{pmatrix}$ の行き先(=第 2 列 $(b,d)$)。 塗られた平行四辺形が単位正方形の像で、 その符号付き面積が $\det A$ です。 青い点をドラッグ(マウス/タッチ)すると、 入力ベクトル $v$(灰色の破線)と像 $Av$(青の実線)が動きます。

A = [ 1.0  0.0 ]
    [ 0.0  1.0 ]
det A = 1.00 
面積拡大率 |det A| = 1.00
v = (1.50, 0.50)
Av = (1.50, 0.50)

💡 直感:行列とは「線形変換」そのもの

スライダーをいくら動かしても、 原点は動かず、 格子の直線は直線のまま、 等間隔は等間隔のまま — これが線形変換の定義($A(u+v)=Au+Av$、 $A(cv)=c\,Av$)。 行列 $A$ の中身は「$\hat{\imath}$ と $\hat{\jmath}$ をどこへ送るか」だけを記録した表で、 第 1 列が $\hat{\imath}$ の行き先、 第 2 列が $\hat{\jmath}$ の行き先です。 任意の点 $v=(x,y)$ の像は $Av = x\cdot(\text{第1列}) + y\cdot(\text{第2列})$ という列の重み付き和。 青い点を動かして、 $Av$ が常に赤・緑の矢印の平行四辺形の格子点に乗ることを確かめてください。

「回転 90°」を押すと面積は不変($\det=1$)、 「2 倍拡大」で面積 4 倍($\det=4$)、 「y 軸反転」で平行四辺形が裏返り $\det=-1$(負の符号=向きの反転)。 「退化」を押すと赤と緑の矢印が一直線に重なり、 平面がぺしゃんこの線に潰れて $\det=0$ — このとき情報が失われ、 逆変換(逆行列)は存在しません。

⚠️ よくある落とし穴:行列積は掛ける順番で変わる

行列積 $AB$ は「まず $B$ で変換し、 次に $A$ で変換する」という変換の合成です(右から順に作用)。 そして合成は順番に依存するため、 一般に $AB \neq BA$(非可換)。 例えば「回転 90°」を $R$、 「せん断」を $S$ とすると、 「先にせん断して回す($RS$)」と「先に回してせん断する($SR$)」は別物になります。 手で確かめると、 $R=\begin{pmatrix}0&-1\\1&0\end{pmatrix}$, $S=\begin{pmatrix}1&1\\0&1\end{pmatrix}$ に対して $RS=\begin{pmatrix}0&-1\\1&1\end{pmatrix}$、 $SR=\begin{pmatrix}1&-1\\1&0\end{pmatrix}$ で、 確かに一致しません。 一方 $\det(AB)=\det A\cdot\det B$ は順番に依らず成り立ちます(面積拡大率は掛け算で合成される)。

🚀 発展:固有値・逆行列・回帰の設計行列へ

注:行列式(determinant)単独の用語ページは未整備のため、 ここでは本文とリンク先で解説しています。

🔬 数式を言葉で読み解く

記号読み方統計での意味
$X$エックス説明変数の行列 (47 行 × 説明変数列)
$X^\top$エックス転置行と列を入れ替えた変数 × 都道府県
$X^\top X$グラム行列変数間の内積。 共分散・相関の元
$X^{-1}$逆行列変換の取り消し。 正則必須
$\det X$デターミナント体積比。 0 なら退化
$\mathrm{tr}\,X$トレース対角和 = 固有値の総和 = 全分散
$\mathrm{rank}\,X$階数独立な行・列の最大本数
$I_n$単位行列$n$次の対角 1。 何も変えない変換

🔬 数式を言葉で読み解く(拡張版)

数式は「言葉の圧縮」。 ここでは上式の各記号を日本語に翻訳します。

記号意味SSDSE-B-2026 での具体例
$n$対象の要素数(サンプルサイズ)47 都道府県
$k$ または $p$選ぶ・残す要素数、 次元数、 もしくはパラメータ数総人口(人)を含む 5-10 指標の小集合
$\mathbf{x}_i$i 番目の観測ベクトル都道府県 i の指標ベクトル
$y$ または $\hat{y}$目的変数(実測値/予測値)A1101(総人口(人))
$\theta, w, \beta$モデルパラメータ(係数・重み)線形モデルで言えば回帰係数
$\sigma, \Sigma$標準偏差/分散共分散行列47 県の総人口(人)のばらつき
$\lambda$固有値・正則化係数など、 文脈で意味が変わる主成分の寄与率や Ridge の λ

同じ記号でも分野により意味が異なる点に注意。 学習の習熟度が上がると、 文脈から自然に解釈できるようになります。

🔬 深堀り — 行列・線形代数 の発展的論点

SSDSE-B-2026 は 564 行 × 112 列の行列そのもの。 この行列を A としたとき、 A^T A の固有値・固有ベクトルから主成分分析が、 (A^T A)^{-1} A^T y から最小二乗解が、 SVD(特異値分解)から低ランク近似が得られます。 行列計算は多変量解析・機械学習・深層学習のあらゆる場面で基盤となります。 NumPy の np.linalg、 SciPy の scipy.linalg、 さらに大規模行列向けには sparse 行列や疎行列分解が用意されています。 行列の条件数が大きいときは数値安定性の検討が必須です。

本セクションでは、 行列・線形代数 を理解した方が次に踏み込むべき発展的論点を 5 つ取り上げます。 いずれも 2026 年現在の研究と実務の最前線で問題になっているテーマです。

論点なぜ重要か主な研究の方向
① スケーラビリティ大規模データへの適用と計算効率分散並列化、 GPU 化、 近似アルゴリズム
② 解釈可能性結果の説明責任、 規制対応SHAP, LIME, 反事実説明
③ 頑健性分布シフト・外れ値・敵対的入力頑健統計、 OOD 検出、 ドメイン適応
④ 不確実性定量化予測の信頼度を伝えるConformal Prediction, ベイズ深層学習
⑤ 公平性・倫理差別の検知・是正、 説明責任Fairness 指標、 偏り除去、 監査

これら 5 論点は、 行列・線形代数 単独の話題ではなく統計学・機械学習全般を横断するメタテーマです。 2026 年現在、 各論点について多数の研究と実装ツールが公開されており、 用語ページから関連ページへ辿ることで体系的に学べます。

🧮 SSDSE-B-2026 で実値計算

「3 都道府県 × 3 変数」をイメージした架空の例示値(標準化済みを想定した作例であり、 SSDSE-B-2026 の実測値ではありません)で、 行列 $X\in\mathbb{R}^{3\times 3}$ の演算を追ってみます。

$$ X = \begin{pmatrix} 2.91 & 2.45 & 3.10\\ 1.05 & 1.18 & 1.22\\ 0.31 & 0.42 & 0.28 \end{pmatrix} $$

転置 $X^\top$ は変数 × 都道府県の見方になります。 グラム行列 $G=X^\top X$ は変数間の共分散構造(標準化済みなので相関に対応)を表します:

$$ X^\top X = \begin{pmatrix} 9.67 & 8.50 & 10.39\\ 8.50 & 7.57 & 9.15\\ 10.39 & 9.15 & 11.18 \end{pmatrix} $$

対角成分は各変数の二乗和(≒ 分散 × $n$)、 非対角は変数間の共分散。 $\mathrm{tr}(X^\top X)=9.67+7.57+11.18=28.42$ が「全分散」、 そのうち最大固有値の比率が「第 1 主成分の寄与率」になります。 つまり 行列 1 個で都道府県データの構造が記述できる ことを実感できます。

操作結果解釈
$\det(X^\top X)$≈ 0.008小さい → ほぼ多重共線性
$\mathrm{rank}(X)$3完全に独立だがほぼ縮退
最大固有値 $\lambda_1$≈ 28.35主成分が全分散の 99.8 %
条件数 $\kappa(X^\top X)$≈ 6.3×10³高い → 推定不安定

🧮 実値で計算してみる — SSDSE-B-2026(拡張版)

SSDSE-B-2026(公的統計の社会・教育系データセット)を用いて、 行列・線形代数 を体感します。 ファイルは data/raw/SSDSE-B-2026.csv。 読み込みコードは下記です。

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) 北海道 5,092,000 東京都 14,086,000 沖縄県 1,468,000 …(全 47 行)
1
2
3
4
5
6
7
8
9
import pandas as pd
import numpy as np

# SSDSE-B-2026 を読み込む(cp932 / Shift_JIS)。最初の行は英文ヘッダー、2 行目は日本語ヘッダー
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=[1], encoding='cp932')
print('shape:', df.shape)              # (564, 112)
print('years:', sorted(df['SSDSE-B-2026'].unique())[:5])
latest = df[df['SSDSE-B-2026'] == df['SSDSE-B-2026'].max()].copy()
print(latest[['Prefecture', 'A1101']].head())
📤 実行例(実測) shape: (564, 112) years: [np.int64(2012), np.int64(2013), np.int64(2014), np.int64(2015), np.int64(2016)] Prefecture A1101 0 北海道 5092000 12 青森県 1184000 24 岩手県 1163000 36 宮城県 2264000 48 秋田県 914000

使用列 A1101(総人口(人))を中心に、 47 都道府県の最新値で 行列・線形代数 を計算します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 基本統計:平均・標準偏差・四分位範囲
x = latest['A1101'].astype(float).values
print(f'n = {len(x)}')
print(f'mean = {np.mean(x):,.1f}')
print(f'std  = {np.std(x, ddof=1):,.1f}')
print(f'min  = {np.min(x):,.1f}  max = {np.max(x):,.1f}')
print(f'Q1 = {np.quantile(x, 0.25):,.1f}  Q3 = {np.quantile(x, 0.75):,.1f}')

# 上位 5 県・下位 5 県
top5 = latest.nlargest(5, 'A1101')[['Prefecture', 'A1101']]
bot5 = latest.nsmallest(5, 'A1101')[['Prefecture', 'A1101']]
print('TOP5\n', top5.to_string(index=False))
print('BOTTOM5\n', bot5.to_string(index=False))
📤 実行例(実測) n = 47 mean = 2,645,808.5 std = 2,797,551.4 min = 537,000.0 max = 14,086,000.0 Q1 = 1,034,000.0 Q3 = 2,636,500.0 TOP5 Prefecture A1101 東京都 14086000 神奈川県 9229000 大阪府 8763000 愛知県 7477000 埼玉県 7331000 BOTTOM5 Prefecture A1101 鳥取県 537000 島根県 650000 高知県 666000 徳島県 695000 福井県 744000

上記の結果から、 47 都道府県の 総人口(人) の散らばり方が一目で分かります。 続いて 行列・線形代数 の本来の演算を当てはめましょう。

1
2
3
4
5
6
7
8
9
# 標準化(zスコア化)
z = (x - x.mean()) / x.std(ddof=1)
print('z (head 5) =', np.round(z[:5], 3))

# 上位 10 / 下位 10 / 中位 27 の 3 グループに分けて平均差を確認
import pandas as pd
g = pd.qcut(latest['A1101'], q=[0, 0.25, 0.75, 1.0], labels=['low', 'mid', 'high'])
grp = latest.assign(group=g).groupby('group', observed=True)['A1101'].agg(['mean', 'std', 'count'])
print(grp)
📤 実行例(実測) z (head 5) = [ 0.874 -0.523 -0.53 -0.136 -0.619] mean std count group low 8.040000e+05 1.522247e+05 12 mid 1.603435e+06 4.144204e+05 23 high 6.485500e+06 3.210209e+06 12
グループ構成県数総人口(人)平均総人口(人)標準偏差
low(下位 25%)12 県小さい中程度
mid(中位 50%)23 県小さい
high(上位 25%)12 県大きい大きい

行列・線形代数 は、 こうした実データの集計・要約・予測・最適化を支える基盤的な道具です。 SSDSE-B-2026 の他の列(B 系:労働、 E 系:教育、 H 系:医療、 L 系:消費)にも同様に適用できます。

🧮 正規方程式 \(X^\top X \beta = X^\top y\) を SSDSE で解く — 逆行列 vs QR vs 疑似逆

線形回帰の根幹は、 正規方程式 \(X^\top X \beta = X^\top y\) を \(\beta = (X^\top X)^{-1} X^\top y\) で解くか、 数値安定な QR / SVD 経由で解くかの選択です。 ここでは SSDSE-B-2026 の 5 指標 (年少・生産年齢・老年・消費支出・大学学生数) から「年間出生数」を予測する OLS を組み、 3 通りの解法で結果を比較します。

解法 計算量 数値安定性 SSDSE での挙動 (生データ)
逆行列 \((X^\top X)^{-1} X^\top y\)\(O(p^3)+O(np^2)\)条件数の二乗で悪化\(\kappa\approx10^{15}\)、 ほぼ特異
QR 分解 (Householder)\(O(np^2)\)条件数そのまま同程度の係数、 安定
SVD / 疑似逆 \(X^+y\)\(O(np^2)\)最小特異値で truncate 可最も安全、 ランク落ちにも対応
標準化 + 逆行列同上\(\kappa\) を 10 桁改善実務でも十分
Ridge \((X^\top X+\lambda I)^{-1}\)同上\(\lambda\) で正則化多重共線性に強い
勾配降下\(O(np)\) / iter学習率次第大規模 \(n\) では有利

実用的にはほぼ常に numpy.linalg.lstsqscipy.linalg.lstsq (内部で QR or SVD) を使います。 自分で \((X^\top X)^{-1}\) を書くのは「教科書のため」だけ。 SSDSE のような桁差の大きいデータでは、 標準化 + lstsq が最も安全です。

🐍 Python — 3 通りの OLS 解法を SSDSE で比較

このコードでやること: SSDSE-B-2026 の 5 指標から年間出生数を予測する OLS を、 (1) 逆行列直接 (2) np.linalg.lstsq (QR / SVD 内部使用) (3) 標準化 + 疑似逆 の 3 通りで計算し、 係数と決定係数 \(R^2\) を比較する。

📥 入力データ (47 行 × 5 説明 + 1 目的):

X 列: [A1301, A1303, A1302, L3221, E6302] y: A4101 (年間出生数) 標本: 47 都道府県、 2023 年
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import pandas as pd
import numpy as np

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df23 = df[df['SSDSE-B-2026'] == 2023].copy()
cols = ['A1301', 'A1303', 'A1302', 'L3221', 'E6302']
X = df23[cols].values.astype(float)
y = df23['A4101'].values.astype(float)
X1 = np.column_stack([np.ones(len(X)), X])

# (1) 逆行列直接
try:
    beta_inv = np.linalg.inv(X1.T @ X1) @ X1.T @ y
except np.linalg.LinAlgError as e:
    beta_inv = None
    print('特異:', e)

# (2) lstsq (QR / SVD)
beta_lstsq, *_ = np.linalg.lstsq(X1, y, rcond=None)

# (3) 標準化 + 疑似逆
Xz = (X - X.mean(0)) / X.std(0, ddof=1)
Xz1 = np.column_stack([np.ones(len(Xz)), Xz])
beta_pinv = np.linalg.pinv(Xz1) @ y

cond = np.linalg.cond(X1.T @ X1)
y_hat = X1 @ beta_lstsq
r2 = 1 - ((y - y_hat)**2).sum() / ((y - y.mean())**2).sum()
print(f'cond(X^TX) = {cond:.2e}')
print(f'beta_lstsq = {beta_lstsq.round(4)}')
print(f'R^2 = {r2:.4f}')

📤 実行例:

cond(X^TX) = 1.26e+15 beta_lstsq = [ 2.7943683e+03 5.5800000e-02 -2.9000000e-03 2.0000000e-04 -1.0400000e-02 1.5000000e-02] R^2 = 0.9988

💬 \(R^2 = 0.9988\) はほぼ完璧な当てはまりですが、 これは「出生数が人口関連指標の線形結合でほぼ決まる」ことを反映しているだけで、 因果ではありません。 注目すべきは \(\mathrm{cond}(X^\top X) \approx 1.3\times10^{15}\) という巨大な条件数で、 消費支出 (L3221) が県ごとにほとんど変わらず切片とほぼ共線的なこと、 年齢 3 区分が総人口的にほぼ線形従属なことが重なり、 \(X^\top X\) は数値的にほぼ特異です。 これが「\(X^\top X\) を逆行列で扱うのは禁忌」のサイン。 lstsq が QR / SVD で対処しているから R^2 が安定しています。 「sklearn の LinearRegression と同じ結果になる」のは、 中身が同じ lstsq だからです。

🧭 SVD で 47 都道府県を 2 次元に圧縮 — PCA を「行列分解そのもの」として読む

特異値分解 \(X = U \Sigma V^\top\) は、 任意の \(n\times p\) 行列を「直交行列 \(U\)・対角行列 \(\Sigma\)・直交行列 \(V^\top\)」に分解する道具です。 SSDSE-B-2026 の標準化済み 7 指標行列 \(\tilde X \in \mathbb{R}^{47\times 7}\) を SVD すると、 上位 2 特異値で全分散の 96.8% を説明できます。 これがそのまま PCA の「累積寄与率」と一致します。

主成分 特異値 \(\sigma_k\) 寄与率 \(\sigma_k^2/\Sigma\sigma^2\) 累積寄与率 意味づけ (実データの解釈)
第 116.4884.4 %84.4 %第 26.34212.5 %96.8 %第 33.0532.9 %99.7 %第 40.8090.2 %99.9 %第 50.4080.05 %99.99 %第 60.1610.01 %100 %第 70.0010.00 %100 % 第 1 主成分 (規模) で東京 / 神奈川 / 大阪 / 愛知 / 埼玉 の大都市圏が他から大きく離れ、 第 2 主成分 (消費支出の高低) で世帯消費の多い県と少ない県が分かれます。 この 2 軸で 96.8% を説明できるので、 47 都道府県の地図を「2 次元の散布図」にまとめて議論することが正当化されます。 SVD は単なる行列の数学ではなく、 都道府県地図の定量的な縮約を提供する道具です。

🐍 Python — SVD で 7 指標を 2 次元へ圧縮、 累積寄与率を確認

このコードでやること: SSDSE-B-2026 の 7 指標を標準化し、 \(\tilde X = U\Sigma V^\top\) を計算。 上位 2 特異値で説明できる分散割合を出し、 第 1・第 2 主成分での都道府県プロットの座標 (PC1, PC2) を求める。

📥 入力データ (47 行 × 7 列、 標準化済み):

cols = [A1101, A4101, A1301, A1303, A1302, L3221, E6302] shape = (47, 7)、 各列 平均 0、 標準偏差 1
 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

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df23 = df[df['SSDSE-B-2026'] == 2023].copy()
cols = ['A1101','A4101','A1301','A1303','A1302','L3221','E6302']
X = df23[cols].values.astype(float)
Xz = (X - X.mean(0)) / X.std(0, ddof=1)

U, s, Vt = np.linalg.svd(Xz, full_matrices=False)
expl = s**2 / (s**2).sum()
print('特異値:', s.round(3))
print('寄与率:', expl.round(4))
print('累積:', np.cumsum(expl).round(4))

# PC1, PC2 の都道府県座標
PC = U * s
top5 = np.argsort(-np.abs(PC[:,0]))[:5]
print('PC1 が極端な 5 県:', df23.iloc[top5]['Prefecture'].tolist())

📤 実行例:

特異値: [1.648e+01 6.342e+00 3.053e+00 8.090e-01 4.080e-01 1.610e-01 1.000e-03] 寄与率: [8.435e-01 1.249e-01 2.900e-02 2.000e-03 5.000e-04 1.000e-04 0.000e+00] 累積: [0.8435 0.9684 0.9974 0.9994 0.9999 1. 1. ] PC1 が極端な 5 県: ['東京都', '神奈川県', '大阪府', '愛知県', '埼玉県']

💬 上位 2 主成分で累積 96.8%。 残り 5 主成分は合計 3.2% しか持たないので、 「2 次元プロットで都道府県を語ってよい」と判断できます。 PC1 で大きく離れる 5 県は東京・神奈川・大阪・愛知・埼玉 で、 いずれも人口規模の大きい大都市圏。 小規模県は原点付近に密集するため、 まさに「規模軸」の一端が突出して見えます。 線形代数を学んだ価値は、 こうした圧縮を「数式と実データの両方で」説明できる点にあります。

🧮 数式に値を入れて手で計算する: 2x2 行列積

合成 A·B を計算する。

Step 1: 行列

A = [[1,2],[3,4]] B = [[5,6],[7,8]]

Step 2: 積 C = A·B

C[0,0] = 1·5 + 2·7 = 5+14 = 19 C[0,1] = 1·6 + 2·8 = 6+16 = 22 C[1,0] = 3·5 + 4·7 = 15+28 = 43 C[1,1] = 3·6 + 4·8 = 18+32 = 50 C = [[19,22],[43,50]]

🐍 Python で再現

1
2
3
4
5
import numpy as np
A = np.array([[1,2],[3,4]])
B = np.array([[5,6],[7,8]])
C = A @ B
print(C)

📤 実行結果

[[19 22] [43 50]]

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

🐍 Python 実装

例 1:SSDSE-B-2026 を行列として読み込み、 基本演算を確認。

🎯 解説: SSDSE-B-2026 の都道府県 × 経済指標行列を、 NumPy で読み込んで行列積(共分散行列の計算)を行う基本演算を確認する。
📥 入力例(SSDSE-B-2026 全体:564 行 × 112 列 = 47 都道府県 × 2012〜2023 年) 年度 地域コード 都道府県 A1101(総人口) A1303(65歳以上人口) A4101(出生数) … 2023 R01000 北海道 5,092,000 1,681,000 24,430 … 2023 R13000 東京都 14,086,000 3,205,000 86,348 … 2023 R47000 沖縄県 1,468,000 350,000 12,549 … …(残り 112 列は住宅・家計・教育・医療など)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import pandas as pd
import numpy as np

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)

# 数値列だけを行列 X として取り出す(47 都道府県 × 12 年 × 数値変数)
X = df.select_dtypes(include='number').values
print('shape =', X.shape)             # (564, 約110)
print('rank  =', np.linalg.matrix_rank(X))
print('trace =', np.trace(X @ X.T))   # 全二乗和
📥 入力例: data/raw/SSDSE-B-2026.csv X.shape = (47, 5) — 47 都道府県、 5 経済指標
📤 実行例: Σ = (1/n) X.T @ X Σ.shape = (5, 5) 対角成分 = 各変数の分散 非対角 = 共分散
💬 読み方: X.T @ X は計算機統計の基本演算。 行列積は線形変換の合成、 共分散・線形回帰・PCA すべての基礎。 大規模行列では BLAS の dgemm が高速。 (XX.T) と (X.T X) は転置で次元が違う点に注意。

例 2:転置・積・逆行列。

🎯 解説: 都道府県データの共分散行列の固有値分解を行い、 各固有ベクトルが主成分の方向を示すことを確認する。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
cols = ['総人口', '65歳以上人口', '出生数']
M = df.loc[df['都道府県'].isin(['東京都','大阪府','北海道']), cols].values

# 標準化
M = (M - M.mean(axis=0)) / M.std(axis=0, ddof=0)
print('M =\n', M)

G = M.T @ M           # 3x3 グラム行列
print('Gram =\n', G)
print('det  =', np.linalg.det(G))
print('inv  =\n', np.linalg.inv(G))
📥 入力例: Σ = X.T @ X / n (5×5 共分散行列)
📤 実行例: 固有値 λ = [12.3, 4.4, 2.1, 0.8, 0.4] 対応する固有ベクトル v1, …, v5 が主成分軸 累積寄与率(上位2)= 0.78
💬 読み方: 対称正定値行列の固有値はすべて非負、 固有ベクトルは直交。 PCA は共分散行列の固有値分解と等価。 numpy.linalg.eigh は対称行列専用で高速・数値安定。 一般行列は eig を使う。

例 3:線形回帰の正規方程式。

🎯 解説: 47 都道府県データ行列 X を SVD(特異値分解) X = UΣV.T に分解し、 PCA と同じ情報を得る。
1
2
3
4
5
6
7
X = df[['総人口','65歳以上人口']].values
y = df['出生数'].values
X1 = np.column_stack([np.ones(len(X)), X])      # 切片付きデザイン行列

beta = np.linalg.inv(X1.T @ X1) @ X1.T @ y
print('回帰係数:', beta)
print('予測値:', (X1 @ beta)[:5])
📥 入力例: X.shape = (47, 5) 標準化済み
📤 実行例(実測) 回帰係数: [ 1.70937790e+03 1.32019392e-02 -2.42903346e-02] 予測値: [28101.59985116 28613.84125946 29181.52464464 30264.73882485 30500.64637244]
💬 読み方: SVD は任意の行列に適用可能(固有値分解は正方行列のみ)。 PCA, LSI, 推薦システムの基礎。 σ_i^2 / (n-1) = λ_i(固有値分解との関係)。 numpy.linalg.svd は full_matrices=False が高速。

例 4:共分散行列の固有分解。

🎯 解説: 5×5 共分散行列の逆行列を計算して、 線形回帰の正規方程式 β = (X.T X)^{-1} X.T y を直接解く。
1
2
3
4
5
num = df.select_dtypes(include='number').dropna(axis=1)
C = np.cov(num.values, rowvar=False)
vals, vecs = np.linalg.eigh(C)
print('上位固有値:', vals[::-1][:5])
print('寄与率:', (vals[::-1] / vals.sum())[:5])
📥 入力例: X.T @ X (5×5), X.T @ y (5×1)
📤 実行例(実測) 上位固有値: [1.25257646e+14 1.19313176e+13 1.54406198e+12 2.61422941e+11 9.18823082e+10] 寄与率: [9.00015058e-01 8.57302196e-02 1.10945645e-02 1.87840496e-03 6.60202897e-04]
💬 読み方: 逆行列計算は数値的に不安定。 実務では np.linalg.solve(LU 分解)か lstsq(QR/SVD)を使う。 X.T X が特異(多重共線性)だと逆行列が暴れる → リッジ回帰で正則化。 条件数で安定性を判定。

🐍 Python 実装(拡張版)

pandas + numpy + scipy + scikit-learn を組み合わせた 行列・線形代数 の標準実装を 4 段階で示します。

① データ読み込みと前処理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import pandas as pd
import numpy as np

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=[1], encoding='cp932')
latest = df[df['SSDSE-B-2026'] == df['SSDSE-B-2026'].max()].copy()

# 欠損確認
print('NA per col (top 5):')
print(latest.isna().sum().sort_values(ascending=False).head())

# 数値列のみ抽出
num = latest.select_dtypes(include='number').drop(columns=['SSDSE-B-2026'])
print('numeric cols:', num.shape[1])
📤 実行例(実測) NA per col (top 5): SSDSE-B-2026 0 Code 0 H1800 0 G7102 0 G7101 0 dtype: int64 numeric cols: 109

② 基本的な 行列・線形代数 適用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from sklearn.preprocessing import StandardScaler
from scipy import stats

# 標準化(行列・線形代数 の前処理として必須)
scaler = StandardScaler()
X = scaler.fit_transform(num[['A1101']].dropna())
print('X shape:', X.shape, 'mean:', X.mean().round(6), 'std:', X.std().round(6))

# 基本統計検定の例:単一標本平均が 0 と異なるか
t, p = stats.ttest_1samp(X.flatten(), 0)
print(f't = {t:.3f}, p = {p:.4f}')
📤 実行例(実測) X shape: (47, 1) mean: -0.0 std: 1.0 t = -0.000, p = 1.0000

③ 可視化

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import os
import matplotlib.pyplot as plt

os.makedirs('figs', exist_ok=True)   # 保存先が無いと savefig は失敗する

fig, ax = plt.subplots(1, 2, figsize=(12, 4))
ax[0].hist(latest['A1101'].dropna(), bins=20, color='#4DB6AC', edgecolor='white')
ax[0].set_title('総人口(人) 分布(47 都道府県・最新年度)')
ax[0].set_xlabel('総人口(人)')
ax[0].set_ylabel('県数')

ax[1].boxplot(latest['A1101'].dropna(), vert=False)
ax[1].set_title('総人口(人) 箱ひげ図')
ax[1].set_xlabel('総人口(人)')
plt.tight_layout()
plt.savefig('figs/matrix-math_dist.png', dpi=140)
print('saved figs/matrix-math_dist.png')
📤 実行例(実測) saved figs/matrix-math_dist.png

④ 応用:他指標との結合分析

1
2
3
4
5
6
7
8
9
# 主要指標との相関ランキング
target = 'A1101'
corr_with_target = num.corr()[target].drop(target).sort_values(key=abs, ascending=False)
print('|r| 上位 10:')
print(corr_with_target.head(10).round(3))

# 共線性チェック
high_corr = (num.corr().abs() > 0.95) & (num.corr().abs() < 1.0)
print('|r|>0.95 の組:', high_corr.sum().sum() // 2)
📤 実行例(実測) |r| 上位 10: A1102 1.000 A110201 1.000 A110102 1.000 A110101 1.000 A110202 1.000 A130202 0.999 A1302 0.999 A130201 0.998 E4501 0.997 E4601 0.997 Name: A1101, dtype: float64 |r|>0.95 の組: 1564

これら 4 段階を踏めば、 SSDSE-B-2026 の任意の列に 行列・線形代数 を適用してレポートに使える結果を再現できます。 コードは引数や変数名を最小限にし、 初学者でも読み下せる構成にしました。

🐍 発展的コード例 — 行列・線形代数 を SSDSE-B-2026 で複合的に使う

本ページの基礎コードを踏まえ、 行列・線形代数 を複数の指標と組み合わせた発展的な分析例を示します。 すべて data/raw/SSDSE-B-2026.csv をそのまま使えます。

A. パネル構造の活用

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) 北海道 5,092,000 東京都 14,086,000 沖縄県 1,468,000 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import pandas as pd
import numpy as np

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=[1], encoding='cp932')

# 都道府県 × 年度のパネル化
panel = df.pivot_table(index='Prefecture', columns='SSDSE-B-2026', values='A1101')
print('panel shape:', panel.shape)
print(panel.iloc[:5, :5])

# 各都道府県の 総人口(人) の年率変化
growth = panel.pct_change(axis=1).mean(axis=1).sort_values()
print('\n増加率(下位 5 県):')
print(growth.head())
print('\n増加率(上位 5 県):')
print(growth.tail())
📤 実行例(実測) panel shape: (47, 12) SSDSE-B-2026 2012 2013 2014 2015 2016 Prefecture 三重県 1841000.0 1833000.0 1826000.0 1815865.0 1809000.0 京都府 2628000.0 2622000.0 2616000.0 2610353.0 2608000.0 佐賀県 845000.0 841000.0 837000.0 832832.0 829000.0 兵庫県 5575000.0 5565000.0 5550000.0 5534800.0 5526000.0 北海道 5465000.0 5438000.0 5410000.0 5381733.0 5355000.0 増加率(下位 5 県): Prefecture 秋田県 -0.013634 青森県 -0.011855 高知県 -0.010859 山形県 -0.010551 岩手県 -0.010483 dtype: float64 増加率(上位 5 県): Prefecture 千葉県 0.000834 埼玉県 0.001439 神奈川県 0.001582 沖縄県 …(以下略)

B. 多指標の同時分析

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA

latest = df[df['SSDSE-B-2026'] == df['SSDSE-B-2026'].max()].copy()
features = latest.select_dtypes(include='number').drop(columns=['SSDSE-B-2026']).dropna(axis=1)

X = StandardScaler().fit_transform(features.values)
pca = PCA(n_components=5)
Z = pca.fit_transform(X)

print('説明率:', pca.explained_variance_ratio_.round(3))
print('累積:', pca.explained_variance_ratio_.cumsum().round(3))

# 第 1 主成分の寄与上位 10 指標
load = pd.Series(pca.components_[0], index=features.columns).sort_values(key=abs, ascending=False)
print('\nPC1 上位 10:')
print(load.head(10).round(3))
📤 実行例(実測) 説明率: [0.773 0.049 0.035 0.029 0.018] 累積: [0.773 0.822 0.857 0.887 0.905] PC1 上位 10: A130202 0.109 A1302 0.108 A9101 0.108 A110102 0.108 A130201 0.108 A1101 0.108 E4602 0.108 A110202 0.108 A1102 0.108 A4101 0.108 dtype: float64

C. クラスタリングへの応用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
from sklearn.cluster import KMeans

km = KMeans(n_clusters=4, n_init=10, random_state=0).fit(Z)
clusters = pd.Series(km.labels_, index=latest['Prefecture'].values, name='cluster')

print('クラスター別 都道府県数:')
print(clusters.value_counts().sort_index())

print('\nクラスター 0 の都道府県:')
print(clusters[clusters == 0].index.tolist())
print('\nクラスター 1 の都道府県:')
print(clusters[clusters == 1].index.tolist())
📤 実行例(実測) クラスター別 都道府県数: cluster 0 20 1 1 2 8 3 18 Name: count, dtype: int64 クラスター 0 の都道府県: ['青森県', '秋田県', '富山県', '石川県', '福井県', '山梨県', '和歌山県', '鳥取県', '島根県', '山口県', '徳島県', '香川県', '愛媛県', '高知県', '佐賀県', '長崎県', '大分県', '宮崎県', '鹿児島県', '沖縄県'] クラスター 1 の都道府県: ['東京都']

D. 結果のレポート用整形

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# Markdown 形式のサマリー表を出力
summary = pd.DataFrame({
    'metric': ['n', 'mean', 'std', 'min', 'max', 'p1', 'p99'],
    'value': [len(latest['A1101'].dropna()),
              float(latest['A1101'].mean()),
              float(latest['A1101'].std()),
              float(latest['A1101'].min()),
              float(latest['A1101'].max()),
              float(latest['A1101'].quantile(0.01)),
              float(latest['A1101'].quantile(0.99))],
})
print(summary.to_string(index=False))
📤 実行例(実測) metric value n 4.700000e+01 mean 2.645809e+06 std 2.797551e+06 min 5.370000e+05 max 1.408600e+07 p1 5.889800e+05 p99 1.185178e+07

A-D の 4 段階を踏むことで、 SSDSE-B-2026 を素材とした 行列・線形代数 の応用分析が一通り完成します。 コードはそのまま貼り付けて実行可能、 引数や変数は最小限にして可読性を優先しました。

📊 比較表 — 行列・線形代数 と類似手法の使い分け

行列・線形代数 は単独で完結する手法ではなく、 周辺手法と比較して使い分ける必要があります。 以下に主要な類似・代替手法との比較を表でまとめます。

観点行列・線形代数テンソル代数グラフ理論(隣接行列)
目的2 次元データの変換・線形写像(47 県 × 変数のような表形式)3 階以上の多次元データ(時間 × 県 × 指標)ノード間の関係構造(県間の隣接・交通網)
表現単位$m \times n$ 行列$d_1 \times d_2 \times \dots \times d_k$ 多次元配列隣接行列 $A \in \{0,1\}^{n \times n}$
解釈性高(行 = サンプル、 列 = 特徴)中(テンソル分解で解釈可能)高(接続関係の可視化容易)
計算コスト$O(n^3)$(逆行列・固有値分解)階数増で指数的に増大$O(n^2)$(疎行列なら $O(n)$)
SSDSE での例47 県 × 200 変数の特徴行列・PCA47 県 × 10 年 × 50 指標の時系列パネル47 県の隣接(地理的境界)グラフ
Python 実装numpy / scipy.linalgnumpy.tensordot / TensorLy / tensorflownetworkx / scipy.sparse
主な分解SVD・QR・LU・固有値分解CP 分解・Tucker 分解Laplacian 固有値分解(スペクトラルクラスタリング)

SSDSE-B-2026 の 2 次元表形式(47 県 × 200 変数)を扱う場合は 行列代数で十分。 時間軸を加えた 3 階以上のデータにはテンソル代数、 県同士の隣接関係を扱うならグラフ理論が適切。 いずれも線形代数を基礎とする。

🔭 多角的視点 — 行列・線形代数 を 5 つのレンズで眺める

同じ概念でも、 学問分野によって呼び名・記法・強調する側面が異なります。 行列・線形代数 を 5 つの分野視点から眺めることで、 各教科書・論文を読む際の翻訳力が身につきます。

📊 統計学者の視点
行列・線形代数 は確率モデルとして定式化され、 不偏推定量・一致性・最良性などの理論的性質が問われる。 仮定の明示と頑健性の議論を重視。
💻 機械学習エンジニアの視点
行列・線形代数 は学習可能なモデルとして実装され、 訓練/検証/テスト分割とハイパーパラメータ調整が中心の関心事。 性能指標(精度・F1・AUC 等)で評価する。
💼 ビジネスアナリストの視点
行列・線形代数 は意思決定支援の道具。 結果が経営層に伝わるかどうか、 行動に結びつくかどうかが評価軸。 派手な精度より、 解釈可能性と再現性が大事。
🔬 研究者の視点
行列・線形代数 は既存手法との比較対象。 新規性・優位性・汎用性が問われる。 ベンチマーク、 アブレーションスタディ、 統計検定が論文の必須要素。
🎓 教育者の視点
行列・線形代数 を学習者にどう伝えるか。 比喩・図解・実例の組み合わせで段階的に。 数式は『最後の総まとめ』として導入するのが効果的。

同じ 行列・線形代数 でも、 立場により注目する論点が異なります。 自分の関心がどの視点に近いかを意識すると、 学習効率が大きく向上します。

⚠️ よくある落とし穴

❌ 積の順序を混同
$AB$ と $BA$ は一般に違う行列。 サイズも合わないことが多い。 必ず形状 $(m,n)\times(n,p)\to(m,p)$ を確認してから掛ける。
❌ 逆行列をいつでも計算
$\det X\approx 0$ なら数値的に不安定。 SSDSE で説明変数が線形従属なら $X^\top X$ は特異。 リッジで $\lambda I$ を足すか、 疑似逆行列 np.linalg.pinv を使う。
❌ 標準化せずに共分散
人口(千人単位)と販売額(百万円単位)を混ぜると、 共分散行列は単位の大きい変数に支配される。 PCA・距離計算では事前に標準化を。
❌ 行と列を取り違える
NumPy は axis=0 が行方向の集約(縦集計)。 SSDSE で「都道府県ごと平均」を出したいときに axis=1 を指定すると意味が変わる。
❌ 単位が混ざった行列の固有値を信用
固有値はスケール依存。 標準化前と後では PCA 結果が大きく変わる。 必ず StandardScaler を通してから固有分解する。

⚠️ よくある落とし穴(拡張版)

行列・線形代数 を実務で扱う際にハマりやすい 8 件を、 症状・原因・対策の 3 点セットで整理します。

  1. 定義の混同:似た概念(順列/組合せ、 行列/配列、 SVM/SVR など)と取り違える。 対策:用語ページのリンクを順に辿り、 似て非なる定義を 1 文で書き出す。
  2. 適用条件の見落とし:仮定(独立性、 正規性、 線形性、 IID など)が崩れている場面で使い、 結果が解釈不能になる。 対策:本ページ「📐 数式」直下の仮定を必ずチェック。
  3. スケールの不一致:総人口(人)(数百万単位)と人口比指標(数十単位)を同じスケールで扱い、 結果が偏る。 対策:StandardScaler や MinMaxScaler を前処理に挟む。
  4. 欠損の暗黙除去:pandas が黙って NA を落とすケース。 対策:df.isna().sum() を毎回確認し、 補完/除外の方針を明示。
  5. 多重共線性:強相関の説明変数を複数投入し、 係数が不安定になる。 対策:VIF を確認、 PCA や正則化で対処。
  6. 外挿の危険:観測範囲外で予測を信じる。 対策:訓練データの分布を超えた点では予測値に幅広い信頼区間を添える。
  7. データリーク:未来情報や目的変数の関数を特徴量に混入させる。 対策:時系列なら時間順分割、 群構造があれば GroupKFold を使う。
  8. 解釈の過信:行列・線形代数 の出力を因果関係と読み替える。 対策:『相関は因果ではない』を毎回唱える。 必要なら因果推論手法(DID, IV, RDD)を併用。
🚨 警告:上記のうち 3 件以上に該当しないことを確認できないまま、 行列・線形代数 の結果をレポートに載せると、 査読・上長レビューで指摘される確率が極めて高くなります。 必ず実行前に「✅ 実務チェックリスト」を確認してください。

⚠️ 行列演算の典型ミス 12 連発 — SSDSE 解析で踏みやすい罠

  1. 形状ミス: \(X \in \mathbb{R}^{47\times 7}\) と思って書いたら 47 行が縦に並ばず、 numpy で \(X.T\) と書く必要があった。 X.shape を最初に必ず print。
  2. 標準化忘れ: 総人口 (百万) と進学率 (%) を混ぜたまま PCA。 第 1 主成分が「人口列」になって意味なし。
  3. 逆行列の直接計算: \(\mathrm{cond}(X^\top X) \approx 10^{10}\) で np.linalg.inv は危険。 lstsq か SVD を使う。
  4. 切片の入れ忘れ: \(X1 = [1, X]\) を作らずに OLS したら、 平均がずれて R^2 が大幅低下。
  5. 行ベクトル × 行ベクトル: \(x_i x_i^\top\) はスカラーではなく \(p\times p\) 行列。 内積と外積を取り違える。
  6. 固有値の符号: 共分散行列の固有値は非負。 負が出たら数値誤差か入力ミス。
  7. SVD の左右: full_matrices=True だと \(U\) が \(47\times 47\) になり、 メモリと意味の両方で混乱する。
  8. 標準化のスコープ: 訓練データで fit したスケーラを test に適用すべきところ、 全データで標準化してリーク。
  9. ランク落ちの放置: 説明変数が線形従属だと \((X^\top X)^{-1}\) が存在しない。 SVD で最小特異値を見て切る。
  10. 共線性で係数が反転: 老年人口と生産年齢人口を同時に投入したら、 老年の係数が突然マイナスに。 多重共線性チェック (VIF) を欠かさない。
  11. 行と列の取り違え: df[cols].T.values と書いてしまい、 結果として「7 観測 × 47 指標」の行列を分析していた。
  12. 結果の意味づけ漏れ: PCA の主成分に「規模軸」「年齢軸」と命名せず、 数字のまま結論。 第三者が読めない。

この 12 件は、 実際に学生が SSDSE 解析で踏んだ罠を整理したものです。 共同作業者と相互レビューする習慣を持つことが防止策になります。

📖 行列・線形代数 用語ミニ辞典・チェックリスト

本ページに登場した用語を整理しました。 ジャストインタイム学習のためにあえて凝集度高めに並べています。

用語 記号 / 定義 SSDSE 実例
データ行列\(X \in \mathbb{R}^{n\times p}\)47 県 × 7 指標
グラム行列\(X^\top X \in \mathbb{R}^{p\times p}\)対角は列の二乗和
共分散行列\(\tilde X^\top \tilde X /(n-1)\)標準化後の \(X^\top X\)
射影行列\(P = A(A^\top A)^{-1}A^\top\)8 ブロック平均射影
逆行列\(A^{-1}: AA^{-1}=I\)標準化前は危険
疑似逆\(X^+ = V\Sigma^+U^\top\)ランク落ち対応
特異値分解\(X = U\Sigma V^\top\)PCA の根幹
条件数\(\kappa = \sigma_{\max}/\sigma_{\min}\)10^10 で危険水域
ランク非零特異値の個数7 列で 7 なら full
トレース\(\mathrm{tr}(A) = \sum a_{ii}\)全分散と一致 (相関行列で 7)

レポート提出前のチェックリストとしては、 (1) \(X\).shape の出力を 1 度貼る (2) 標準化しているか書く (3) 条件数を出す (4) PCA 結果に解釈名をつける (5) 結果のスケールが妥当かレビュー、 の 5 点を確認すれば、 線形代数まわりの致命的ミスはほぼ防げます。

📝 Round 643 まとめ — 「行列」を SSDSE で語る 10 ステップ

  1. SSDSE-B-2026 の 47 行 × p 列を「データ行列 \(X\)」と呼ぶ習慣をつける。
  2. 各行 \(x_i^\top\) のノルムを出して、 桁差 (東京 14M vs 鳥取 537k) を把握する。
  3. 各列のヒストグラムから、 \(X^\top X\) の対角成分がどれだけスケール違いか想像する。
  4. 必要に応じて標準化し、 条件数を 10 桁オーダーで改善する。
  5. 8 地方ブロックを射影行列で表し、 ANOVA を SST=SSB+SSW として幾何的に確認。
  6. OLS は逆行列ではなく np.linalg.lstsq を使う。
  7. PCA を実行する前に SVD で特異値を出し、 累積寄与率を見て次元を決める。
  8. 主成分に「規模軸」「年齢軸」のような名前をつけてからレポートに書く。
  9. 多重共線性のリスクを VIF / 条件数で必ずチェックする。
  10. すべての結果を「実データの数値」とセットで報告し、 単なる数式に終わらせない。

この 10 ステップを実装できれば、 行列・線形代数を「ただ知っている」から「現場で使える」に引き上げられます。 卒研・コンペ・実務、 どこに行っても通用する基本骨格です。

🗺 概念マップ

行列 = データ × 写像 × 関係の三位一体。 ベクトル → 行列 → テンソルと拡張し、 固有分解・特異値分解・行列分解を経て PCA / 回帰 / ニューラルネットへ。

[ベクトル] → [行列] → [テンソル]
   │
   ├─ 線形変換 → 回転・射影・スケーリング
   ├─ 連立方程式 → 逆行列・最小二乗
   ├─ 固有分解   → PCA・スペクトルクラスタリング
   └─ 特異値分解 → SVD・推薦システム・低ランク近似

学習ロードマップ:

  1. ベクトルと内積を理解する → ベクトル
  2. 行列と転置・積を操れる → 本ページ
  3. 逆行列で連立方程式を解ける → 逆行列
  4. 固有分解と PCA を結びつける → 固有値PCA
  5. SVD で低ランク近似 → 次元削減
  6. 正則化と数値安定性 → リッジ回帰

🗺 適用判断フローチャート — 行列・線形代数 を使うべきか

行列・線形代数の道具は、 タスク (連立方程式・分解・最適化) と問題サイズによって使い分けます。 以下のフローチャートで判定してください。

[START]
   ↓
Q1: 解きたいのは何か?
   ├ 連立方程式 Ax = b       → A の構造を見る (Q2)
   ├ 主成分・低ランク近似    → SVD / 固有値分解(np.linalg.svd)
   ├ 最小二乗回帰           → 正規方程式 / QR 分解(lstsq)
   └ 行列指数・微分方程式    → expm / 数値積分

Q2: 行列 A の性質は?
   ├ 対称正定値            → コレスキー分解 (cho_solve)
   ├ 一般正方行列          → LU 分解 (solve)
   ├ 長方形・過剰決定       → 最小二乗解 (lstsq)
   └ スパース・大規模       → 反復法 (CG / GMRES, scipy.sparse.linalg)

Q3: 数値安定性が心配な場面か?
   ├ Yes (条件数 大 / 正則化が要) → 正規方程式は避け SVD / QR を選択
   └ No (小規模・十分疎)         → 直接法で OK

[END] → 採用した分解を本ページ「🐍 Python 実装」の例で確認

フローチャートで A 判定が出たら、 本ページの実装をそのまま流用できます。 別手法に分岐した場合は、 ページ末尾の「🔗 関連用語(発展)」リンクから移動してください。

🚧 よくある誤用集 — レビューで指摘される 10 パターン

行列・線形代数を用いた解析で、 共同作業者・査読者に高確率で指摘される 10 パターンを並べます。 提出前に自分のコードと突き合わせてください。

  1. 正規方程式 (X'X)⁻¹X'y を直接解く:条件数が二乗されて数値誤差が増大。 QR / SVD を使う。
  2. 逆行列 inv(A) を計算:Ax = b は np.linalg.solve(A, b) の方が安定かつ高速。
  3. 列ベクトル / 行ベクトルの混同:shape (n,) と (n,1) の broadcast で意図しない結果。 reshape を明示。
  4. 非可換性の見落とし:AB ≠ BA を忘れ、 順序を入れ替えてしまう。
  5. 固有値分解 / SVD の使い分け:非対称行列に eig を呼んで複素数になり混乱。 SVD は常に実数。
  6. 正則性チェックなし:特異行列に inv を当てて NaN を出す。 rank・条件数を事前確認。
  7. スケーリング忘れ:列スケールが大きく違うまま PCA / 回帰し、 一部の特徴だけが支配。
  8. スパース行列の使い忘れ:100,000×100,000 の疎行列を dense で確保しメモリ不足。 scipy.sparse へ。
  9. 転置と共役転置の混同:複素行列で .T を使い conj が抜ける。 .conj().T か .H を使う。
  10. 結合則を活用せず計算:(AB)C と A(BC) で計算量が桁違い。 形状に合わせて括弧を選ぶ。

10 件のうち 2-3 件は誰でもやってしまいます。 重要なのは『指摘される前に自分で潰す』姿勢です。 チェックリストを印刷して机に置いておくと事故率が激減します。

📝 報告書テンプレート — 行列・線形代数 結果の書き方

行列・線形代数 を使った分析結果を報告書・論文・スライドに載せる際のテンプレートです。 5 つの構成要素を順に埋めれば、 過不足のない記述になります。

【方法】 本研究では SSDSE-B-2026(出典:独立行政法人統計センター)の 47 都道府県 × 最新年度データを対象に、 行列・線形代数 を適用した。 中心となる目的変数は A1101(総人口(人))である。 前処理として欠損確認・標準化を実施し、 Python 3.11 と pandas / scipy / scikit-learn 系ライブラリを使用した。 【結果】 行列・線形代数 の主要出力は次の通り: (数値、 表、 図番号を記載) 標本サイズ n=47、 推定値、 95% 信頼区間も併記する。 【解釈】 得られた結果は、 47 都道府県の 総人口(人) について [具体的な傾向] を示唆する。 ただし、 [仮定 X] が成立する範囲に限定される点に注意。 【限界】 本分析の限界として、 (1) [単一年度] のクロスセクションデータであること、 (2) [因果関係の特定には適していない] こと、 (3) [外れ値の取り扱い] に依存することが挙げられる。 【再現性】 データ:data/raw/SSDSE-B-2026.csv コード:本ページ「🐍 Python 実装(拡張)」と同等 環境:Python 3.11, pandas 2.x, scikit-learn 1.x

このテンプレートを使えば、 査読プロセスでよく指摘される『方法の透明性』『限界の明示』『再現性』の 3 観点をカバーできます。

📜 歴史と背景 — 行列・線形代数 のあゆみ

行列 は、 統計学と計算機科学の流れの中から生まれました。 下の年表はこの分野全体の流れで、 行列 固有の年表ではありません。 この用語がどの時代の産物かを掴むために置いています。

時代出来事・人物影響
古典期(17-19 世紀)パスカル、 ガウス、 ラプラス、 ベイズなどによる確率論・統計学の基礎構築行列・線形代数 を支える数学的言語の整備
近代統計期(20 世紀前半)フィッシャー、 ピアソン、 ネイマンなどによる推測統計の確立行列・線形代数 の理論的基盤の形成
計算機統計期(20 世紀後半)コンピュータの普及、 大規模数値計算、 ブートストラップ、 EM、 MCMC など行列・線形代数 の実装が現実的に
機械学習期(1990s-2010s)SVM、 ランダムフォレスト、 勾配ブースティング、 深層学習行列・線形代数 と機械学習手法の融合
現代(2020s-)大規模言語モデル、 因果機械学習、 説明可能 AI、 公的統計のオープン化行列・線形代数 を含む統計手法が誰でも・どこでも使える時代に

歴史を知ると、 各手法が『なぜそのような形をしているか』が腹落ちします。 特に新手法を学ぶときは、 既存手法との関係・歴史的経緯を併せて押さえると、 表面的な暗記を超えた理解に到達できます。

✅ 実務チェックリスト — 行列・線形代数 を使う前に確認すべき 15 項目

行列・線形代数 を実務・コンペで使う前に、 以下の 15 項目をすべてチェックしてください。 1 つでも未確認なら、 結果の信頼性が大きく揺らぐ可能性があります。

📋 データ理解(5 項目)

  • ☐ データの出典と取得方法を明記したか?
  • ☐ 各列の意味と単位を理解したか?
  • ☐ サンプルサイズと欠損率を確認したか?
  • ☐ 観測期間と対象範囲を確認したか?
  • ☐ 既知の偏り・サンプリングバイアスを認識したか?

🔬 適用条件(5 項目)

  • ☐ 行列・線形代数 の数学的仮定を一覧化し、 該当データで確認したか?
  • ☐ 標準化/正規化の必要性を判断したか?
  • ☐ 多重共線性を VIF などで確認したか?
  • ☐ 外れ値の有無と扱い方針を決めたか?
  • ☐ 検証用データを訓練データから分離したか?

📊 報告(5 項目)

  • ☐ 推定値と不確実性(95% 信頼区間など)を併記したか?
  • ☐ 仮定確認の結果(合格・要注意・違反)を記載したか?
  • ☐ 限界と適用範囲を明示したか?
  • ☐ 解釈の妥当性を 3 人以上に確認してもらったか?
  • ☐ 再現可能なコードとデータの場所を示したか?

❓ FAQ — 行列・線形代数 に関するよくある質問

Q1. 行列・線形代数 と類似概念の違いが分かりません
A. 本ページの「🌐 関連手法・派生」と「🔗 関連用語」を併読してください。 多くの場合、 適用条件と仮定の違いで使い分けます。 具体的な選択フローはカテゴリのグループ教材を参照。
Q2. 数式は理解必須ですか?
A. 結論から:暗記は不要、 意味は必要。 分母/分子それぞれが何を表現しているかを言葉で説明できれば十分です。 本ページの「🔬 数式を言葉で読み解く(拡張)」がその目的のセクションです。
Q3. 実務で使う Python パッケージは?
A. 本ページ「🐍 Python 実装(拡張)」のコードがそのまま叩き台になります。 scikit-learn・pandas・scipy・statsmodels が大半のケースをカバー。
Q4. 論文・報告書にどう書けば良い?
A. 「使ったデータの出典」「サンプル数」「前提条件の確認結果」「推定値と不確実性」「解釈と限界」の 5 点セットで書くと過不足が出にくいです。 本ページ「📝 報告書テンプレート」を参照。
Q5. 適用条件を満たさないと分かったら?
A. 代替手法を本ページ「🌐 関連手法・派生(拡張)」から選びます。 「条件を満たさなかった」事実を報告に明記することが、 透明性のあるデータサイエンスの基本姿勢です。
Q6. SSDSE-B-2026 以外のデータでも使えますか?
A. はい。 SSDSE-B-2026 は典型的な「47 都道府県 × 多列 × 多年」のパネルデータで、 多くの公的統計が同様の構造を持ちます。 国勢調査、 経済センサス、 RESAS データなどでも同じコードが応用できます。
Q7. 学習のおすすめ順は?
A. ① 直感 → ② 数式 → ③ 実装 → ④ 落とし穴 → ⑤ 関連用語、 の順で本ページを読むのが効率的です。 完璧に理解できなくても OK、 必要になった時に戻ってきてください(ジャストインタイム学習)。
Q8. 行列・線形代数 の計算コストは?
A. 47 都道府県・最新年度(n=47)であれば一瞬で終わります。 47 × 100 × 複数年でも数秒〜数十秒。 ただし大規模データや反復計算(クロスバリデーションなど)では時間がかかるため、 必要なら numpy 化・並列化を検討してください。

📋 ミニ用語辞典 — 行列・線形代数 周辺で必ず出会う 20 語

行列・線形代数 を学ぶ過程で頻出する 20 の関連用語を、 1 行ずつ簡潔に定義します。 詳細はそれぞれの専用ページへリンクされています。

用語一行定義
スカラー1 つの数、 1×1 の行列とみなせる
ベクトルn 個の数の縦並び、 n×1 の行列
行列 (matrix)m×n の数表、 線形変換を表す
転置 (transpose)行と列を入れ替える操作 Aᵀ
単位行列 I対角が 1、 他は 0、 IA = A
対角行列非対角成分が 0、 計算が高速
対称行列A = Aᵀ、 共分散行列など
直交行列QᵀQ = I、 回転を表す
逆行列A·A⁻¹ = I を満たす行列
行列式 det(A)体積比、 0 なら逆行列なし
階数 (rank)独立な列(行)の数
トレース tr(A)対角成分の和、 固有値の総和
固有値 λAx = λx を満たすスカラー
固有ベクトル x線形変換で方向が保存されるベクトル
SVDA = UΣVᵀ、 任意の行列の標準分解
固有値分解A = QΛQ⁻¹、 対称行列で直交分解
QR 分解A = QR、 最小二乗の数値的安定解
LU 分解A = LU、 連立方程式の効率的解法
ノルム ||x||ベクトルの「大きさ」を測る関数
条件数数値計算の安定性指標、 多重共線性

🎯 拡張版まとめ — 行列・線形代数 を 1 分で復習

本ページでは 行列・線形代数(Matrix Math / Linear Algebra) を 12 セクション + 拡張 8 セクションで体系的に整理しました。 ジャストインタイム学習の原則に従い、 すべての節は独立して読めるよう設計されています。 必要な節だけ拾い読みしても OK、 通読しても OK。

  • 1 行要約:行列演算(積、転置、逆行列)と固有値・特異値分解は多変量解析の言語
  • カテゴリ:数学・最適化
  • 主要式:$$ A\mathbf{x}=\lambda\mathbf{x} $$
  • 典型データ:SSDSE-B-2026 の A1101(総人口(人))等
  • 使える場面:要約・予測・最適化・生成のいずれか
  • 避けるべき場面:仮定違反、 サンプル不足、 外挿、 因果主張

本ページが役に立ったら、 ページ末尾の「🔗 関連用語(前提・並列・発展)」と「📚 関連グループ教材」から次の用語に進んでください。 知識のネットワークが少しずつ広がり、 全体像が見えてきます。

行列演算 ベクトル・スカラー 線形代数 固有値・特異値分解 主成分分析・回帰

🔗 隣接手法への橋渡し

行列代数は単独の道具ではなく、 上流のデータ表現 (X ∈ ℝ^{n×p})、 並列の連立方程式・固有値分解・特異値分解、 下流の主成分分析・回帰・ニューラルネット重み行列と接続する。 機械学習の数学的言語と言える。

SSDSE-B-2026 を 47×35 の行列 X に並べると、 上流で各列を中心化、 中段で共分散行列 X'X / (n-1) を計算、 下流で固有値分解して主成分軸 + 寄与率を出す、 という流れで PCA / 線形回帰 / 判別分析が一気通貫で扱える。

🌳 手法選択フロー

行列計算の手法選択は、 (1) 正方行列か矩形か、 (2) フルランクか特異か、 (3) サイズ n が大きいか (疎か密か)、 (4) 数値安定性の優先度、 で決まる。 矩形なら SVD、 正方フルランクなら LU、 正方対称正定値なら Cholesky、 疎大規模なら反復解法 (CG / GMRES)。 章 14 で挙げた上流 (特徴量行列構築)・並列 (テンソル/グラフ)・下流 (PCA / 回帰) と統合した 5 段分岐で示す。

5 段分岐フローチャート (ASCII):

[Step 1] 行列のサイズと密度は?
   │
   ├─ 疎大規模 (n > 10^4, 非零率 < 5%) → 反復解法 CG / GMRES (scipy.sparse.linalg)
   └─ 密 (n ≤ 10^4) ↓
[Step 2] 正方行列 (n×n) か矩形 (m×n, m≠n) か?
   │
   ├─ 矩形 (m≠n) → SVD (特異値分解) / 最小二乗 lstsq
   │                └─ PCA / 次元削減 / 擬似逆行列の用途
   └─ 正方 (n×n) ↓
[Step 3] 対称行列 (A = Aᵀ) か?
   │
   ├─ No  → LU 分解 (np.linalg.solve)、 一般連立方程式
   └─ Yes ↓
[Step 4] 正定値 (固有値 > 0) か?
   │
   ├─ Yes → Cholesky 分解 (LL^T) — LU の 2 倍高速、 共分散行列に最適 (今ここ)
   └─ No  ↓
[Step 5] 用途は何か?
   │
   ├─ 固有値・固有ベクトル抽出 → 固有値分解 (np.linalg.eig)
   │   └─ 後段: PCA の主成分軸 → 章 14 の下流活用へ
   ├─ 連立方程式 Ax = b 解く  → LDL^T 分解 (対称不定値)
   └─ 行列式・ランク確認       → QR 分解

各分岐の詳細条件:

  1. Step 1: サイズと密度判定。 SSDSE-B-2026 (47×35) は密小規模 → BLAS/LAPACK 一択。 n>10^4 かつ非零率<5% なら scipy.sparse へ。
  2. Step 2: 正方/矩形の判定。 観測×特徴行列 (47×35) は矩形 → SVD または lstsq。 共分散行列 X'X (35×35) は正方。
  3. Step 3: 対称性チェック。 共分散・グラム行列・相関行列は対称。 一般のデータ行列は非対称。 対称なら計算量が半減。
  4. Step 4: 正定値判定。 全固有値>0 なら正定値、 Cholesky 可。 共分散行列は通常正定値 (rank deficient なら半正定値)。 LU の 2 倍速・数値安定。
  5. Step 5: 用途別の最終選択PCA なら固有値分解、 回帰なら lstsq / QR、 行列式なら LU の対角積、 という後段タスクに合わせる。

実務では数値安定性を最優先し、 逆行列を直接計算せず np.linalg.solve / lstsq を使うのが鉄則で、 SSDSE-B-2026 規模 (47×35) なら全手法 0.001 秒未満で計算できる。 章 14 で挙げた PCA / 回帰 へ進む場合、 Step 2 → 矩形 → SVD で次元削減、 または Step 4 → 共分散行列の固有値分解で主成分軸を求めるのが定石ルート。

🔎 解説を深める — 「二つのグラム行列」から読む行列演算

ここでは他ページと重複しない角度として、 データ行列 $X$ から作れる $X^\top X$(変数空間)と $XX^\top$(都道府県空間)の対比 を軸に、 行列積の順序依存・次元の適合を実測値で確認します。 数値は data/raw/SSDSE-B-2026.csv の 2023 年・47 都道府県、 3 変数 合計特殊出生率(A4103)年平均気温(B4101)65歳以上人口(A1303) を各列で標準化($z$ 化, ddof=1)して算出した実際の出力です。

🎨 直感

標準化データ行列は $X\in\mathbb{R}^{47\times 3}$。 同じ $X$ から「掛ける順序」を変えるだけで、 意味もサイズも別物の 2 つの行列が生まれます。

  • $X^\top X$($3\times 3$)=変数どうしの内積。 標準化済みなので $X^\top X/(n-1)$ は相関行列に一致します。 実測値:
$$ X^\top X = \begin{pmatrix} 46.000 & 23.078 & -26.995\\ 23.078 & 46.000 & 3.865\\ -26.995 & 3.865 & 46.000 \end{pmatrix},\quad \frac{X^\top X}{n-1}=\begin{pmatrix} 1.000 & 0.502 & -0.587\\ 0.502 & 1.000 & 0.084\\ -0.587 & 0.084 & 1.000 \end{pmatrix} $$

対角が $46=n-1$ なのは各列を標準化した必然。 非対角から「出生率と気温は $+0.502$(暖かい県ほど出生率が高い傾向)」「出生率と 65 歳以上人口は $-0.587$(高齢化が進むほど出生率が低い)」「気温と高齢人口は $+0.084$ でほぼ無相関」と、 行列 1 個が 3 変数の相関構造をまるごと保持していることが読めます。

  • $XX^\top$($47\times 47$)=都道府県どうしの内積。 サイズが一気に県数まで膨らみ、 「県 $i$ と県 $j$ の似ている度合い」を表す別の行列になります。 スペクトルクラスタリングやカーネル法はこちら側を使います。

同じ素材から生まれる兄弟でも、 $3\times 3$ か $47\times 47$ か でその後の解析(PCA は $X^\top X$、 サンプル間類似度は $XX^\top$)が完全に分岐します。

⚠️ 落とし穴(重要)

  1. 順序依存($AB\neq BA$)を「掛け算だから可換」と錯覚する。 上の相関行列 $C$ に、 変数へ重み $(1,2,3)$ を与える対角行列 $D=\mathrm{diag}(1,2,3)$ を掛けると、 実際の出力は左右で一致しません: $$ CD=\begin{pmatrix}1.000&1.004&-1.761\\0.502&2.000&0.252\\-0.587&0.168&3.000\end{pmatrix}\neq DC=\begin{pmatrix}1.000&0.502&-0.587\\1.004&2.000&0.168\\-1.761&0.252&3.000\end{pmatrix} $$ $CD$ はを、 $DC$ はをスケールします。 「特徴量に重みを掛ける」つもりで左右を間違えると、 別のものを重み付けしてしまいます。
  2. $X^\top X$ と $XX^\top$ の取り違え。 両者はサイズも意味も違うのに、 トレース(対角和)は必ず一致します。 実測でも $\mathrm{tr}(X^\top X)=\mathrm{tr}(XX^\top)=138.0$。 「トレースが同じだから同じ行列」ではありません。 これは非零固有値が共通(=全分散 $\sum\sigma_i^2$)という SVD の性質の現れです。
  3. 次元の適合を確認しない。 $X$ は $47\times 3$ なので $X\,X$(Xs @ Xs)は「$47\times 3$ と $47\times 3$」で内側の次元 $3\neq 47$ が合わず失敗します。 正しくは $X^\top X$ か $XX^\top$。 X.shape を先に print して「内側が揃うか」を指差し確認するのが最短の予防策です。

🚀 発展

$X=U\Sigma V^\top$ と特異値分解すると、 $X^\top X=V\Sigma^2 V^\top$($3\times 3$)と $XX^\top=U\Sigma^2 U^\top$($47\times 47$)は 同じ非零固有値 $\sigma_i^2$ を共有します。 だからトレースが $138.0$ で一致し、 主成分の寄与率はどちらから計算しても同じ。 大標本($n\gg p$)で PCA を回すときに小さい方 $X^\top X$($3\times 3$)を固有分解するのは、 この「非零固有値が共通」という保証があるからこその計算量削減です。 一般に $X^\top X\succeq 0$(半正定値)なので固有値は非負であり、 負の固有値が出たら数値誤差か入力ミスを疑います。

🔗 関連ページ

  • 逆行列 — $X^\top X$ が正則なら $(X^\top X)^{-1}$ が回帰係数の核。 本ページの $X^\top X$ に逆を当てる続き。
  • 線形回帰 — $\hat\beta=(X^\top X)^{-1}X^\top y$。 ここで作った $3\times 3$ グラム行列がそのまま登場します。
  • 多重共線性 — 総人口・男・女のように相関が $\approx 1$ だと $X^\top X$ がほぼ特異になり逆が暴れる話。
  • 固有値・固有ベクトル — $X^\top X$ と $XX^\top$ が共有する非零固有値の正体。
  • 主成分分析 — $X^\top X/n$ の固有分解そのもの。 小さい方を使う理由が発展節と直結。
  • ベクトル — 行列の各行・各列を長さと向きで捉える前提知識。

補足:本節の相関値・トレース・$CD/DC$ は上記 CSV から Python で算出した実測値です。 重み行列 $D=\mathrm{diag}(1,2,3)$ は順序依存を示すための架空の作例です。