「vector math」は統計データ分析の文脈で扱う重要概念のひとつ。 本ページでは「vector math」を取り巻く中核キーワードを以下にチップで一覧化する。 各キーワードは関連する概念・手法・道具立てを含み、 文献検索や学習計画の起点になる。
これらのキーワードは「vector math の理解 → 適用 → 検証」のプロセスを構成する。 各章で詳しく解説する。
🍰 まずはやさしく
ベクトルは、向きと大きさを持つ矢印のようなものです。
データの似ているところを数値で測るために使います。
都道府県の人口や支出などのリストが例です。
この章では、ベクトルの基本と使い道を学びます。
🍰 まずはやさしく
ベクトルは、行列を学ぶための基礎となる道具です。
データの違いを計算して比べるために使います。
東京と大阪がどれくらい似ているかを数値にします。
ここでは、計算方法と図でのイメージを学びます。
「ベクトル」は 行列 の前提となる、 数学・統計の最も基礎的な対象です。 SSDSE-B-2026 では、 1 つの都道府県 = 1 本のベクトルとして表現できます。 ベクトルの内積・ノルム・コサイン類似度を理解すると、 「東京と大阪はどれくらい似ているか?」を 数値で 言えるようになります。 本ページでは、 都道府県ベクトルの内積・コサイン類似度を実値で計算しつつ、 ベクトル空間の幾何イメージを身につけます。
🍰 まずはやさしく
ベクトルは、データのプロフィールのようなものです。
たくさんの情報をまとめて扱うために使います。
スマホのアプリで好みの傾向を出すときなどに似ています。
矢印の向きで「似ているか」を判断する方法を学びます。
イメージ 1: 矢印。 2 次元なら $(x, y)$、 3 次元なら $(x,y,z)$。 矢印の始点を原点に置き、 終点が要素の値。 大きさ = 長さ、 向き = 角度。
イメージ 2: 都道府県プロフィール。 東京都 = (人口, 出生数, 消費支出, …) という 100 次元超のリスト。 これがそのままベクトル。 47 本の矢印が、 高次元の空間に並んでいる風景を想像しましょう。
イメージ 3: 類似度。 2 つの矢印のなす角が小さいほど「似ている」。 これがコサイン類似度。 神奈川と埼玉は近い方向を向き、 東京と沖縄は遠い角度を成すと予想できます。
2 つのベクトル a(青)と b(橙)の 先端の丸をドラッグ(スマホはタッチ)して動かしてみましょう。 和 a+b(平行四辺形)・差 a−b・スカラー倍 c·a・内積 a·b・b の a への射影・なす角・ノルムがすべてリアルタイムで再計算・再描画されます。 とくに 内積の符号が「鋭角 → 直交 → 鈍角」で切り替わる瞬間を体感してください。
| a = | (3.0, 1.0) | ‖a‖ = 3.16 |
| b = | (1.0, 2.5) | ‖b‖ = 2.69 |
| 内積 a·b | 5.50 (スカラー1個) | |
| 要素積 a⊙b | (3.0, 2.5) ←別物! | |
| なす角 θ | 40.4° | |
| cos θ | 0.647 | |
※ グリッド 1 マス = 1。 内積 a·b = 「b を a 方向へ射影した長さ × ‖a‖」= ‖a‖‖b‖cosθ。 3 つの式が常に一致します。
ベクトルは「大きさと向きを持つ量」。 上の図で a を回しても、 長さ ‖a‖ を保ったまま向きだけ変えられます。 b を a と同じ向きに近づけると cosθ→1(内積は最大)、 直角にすると cosθ=0(内積 0)、 逆向きにすると cosθ→−1(内積は最も負)になります。 「近さ」を測るコサイン類似度が 向きだけ の情報であることが、 手を動かすと腑に落ちます。
パネルの a·b(スカラー1 個)と a⊙b(ベクトル、アダマール積)を見比べてください。 内積は要素積の 総和:$a\cdot b = \sum_i a_i b_i = (a\odot b)$ の各成分を足したもの。 NumPy では a @ b(内積・スカラー)と a * b(要素積・配列)がまったく別物です。 コサイン類似度や距離の計算で * を使ってしまう取り違えは頻出バグなので、 「内積は足すまでがワンセット」と覚えましょう。
スカラー倍スライダーで c·a を伸縮させ、 チェックで a+b を出すと、 平面上の任意の点が a と b の線形結合 $c_1 a + c_2 b$ で書けることが見えます。 一次独立な 2 本が平面の 内積 空間の 基底で、 標準基底 $e_1,e_2$ もその一例。 機械学習ではデータ 1 件がこうした 特徴ベクトルで表され、 コサイン類似度・ノルム・距離で近さを測り、 主成分分析 で少数の基底へ圧縮し、 単語埋め込み や 線形回帰・k-means へと展開します。 高次元でも成り立つこの幾何が、 SSDSE-B-2026 の 47 都道府県ベクトルを扱う土台です(行列・次元削減 も参照)。
🍰 まずはやさしく
ベクトルは、数字を縦に並べたリストのことです。
計算で正確な大きさを出すために使います。
テストの点数を科目ごとに並べたリストが例です。
足し算や長さの出し方などの計算ルールを学びます。
$n$ 次元ベクトル $v$ は、 実数 $v_1, \ldots, v_n$ を縦に並べた要素:
$$ v = \begin{pmatrix} v_1\\ v_2\\ \vdots\\ v_n \end{pmatrix} \in \mathbb{R}^{n} $$基本演算:
特別なベクトル:
$$ \mathbf{0} = \begin{pmatrix}0\\\vdots\\0\end{pmatrix},\quad e_i = \begin{pmatrix}0\\\vdots\\1\\\vdots\\0\end{pmatrix}\;(i\text{番目だけ}1) $$$\mathbf{0}$ は零ベクトル、 $e_i$ は標準基底ベクトル。 任意のベクトル $v=\sum_i v_i e_i$。
内積 $v\cdot w = \|v\|\|w\|\cos\theta$ は、 ノルム積に角度のコサインをかけたもの。 言い換えれば「$w$ を $v$ 方向に射影した長さに $v$ のノルムをかけた量」。
SSDSE で「東京 ベクトル」「神奈川 ベクトル」をなす角度を $\arccos(0.99) \approx 8^\circ$ と計算すれば、 ほとんど同じ方向だと言える。 一方「東京-沖縄」は約 120°、 逆向きに近い。
射影の応用:回帰の予測値 $\hat y$ は $y$ を $X$ の列空間へ 射影 したベクトル。 残差は射影残差。 つまり最小二乗とは「直交射影」の幾何問題に他なりません。
Q1. なぜベクトルは縦書きが標準なのですか?
行列との互換性のため。 $Ax$(左から行列を作用させる)が縦ベクトルで自然に書ける。 ただし NumPy では 1 次元配列は向きがない(行でも列でもない)扱い。
Q2. ベクトルの「次元」と統計の「自由度」は同じ?
違います。 次元は要素の数、 自由度は独立に動ける成分の数。 平均を引いたあとは次元 $n$、 自由度 $n-1$ になる。
Q3. 単位の違うベクトルでもコサイン類似度は使えますか?
原理的にはノルムで割るので「大きさは打ち消される」。 ただし、 ある成分の単位が極端に大きいと、 その成分が方向を支配してしまうので、 やはり標準化が安全。
Q4. ノルムの種類を選ぶ基準は?
外れ値に強くしたい → L1、 滑らかさ重視 → L2、 最大成分を抑えたい → L∞。 機械学習の正則化(Lasso / Ridge)でも同じ選択基準が出てきます。
Q5. ベクトルの「向き」と「長さ」を切り離すには?
$\hat v = v / \|v\|$ で単位ベクトル化(正規化)。 これでベクトルは方向情報だけを保持。 cos 類似度はまさにこの単位ベクトルどうしの内積です。
SSDSE-B-2026 を行列 $X$ にすると、 行を取れば「都道府県ベクトル」、 列を取れば「変数ベクトル」。 同じ数字が、 ある時は「東京の特徴」、 別の時は「人口の都道府県分布」になります。
| 取り方 | ベクトル | 意味 | 使い所 |
|---|---|---|---|
| 行ベクトル | $X[i,:]$ | 都道府県 $i$ のプロフィール | 類似度・クラスタリング |
| 列ベクトル | $X[:,j]$ | 変数 $j$ の 47 都道府県分布 | 相関・共分散 |
| 中心化行 | $X[i,:] - \bar X$ | 平均からのずれ | PCA・異常検知 |
| 標準化行 | Z-score | 単位を揃えた特徴 | 距離計算 |
pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) で読み込む(複数年度を含むため年度で絞り込む)select_dtypes(include='number'))(X - X.mean()) / X.std(ddof=0)pdist「ベクトル空間」と呼べるためには、 和とスカラー倍について以下の規則が成り立つ必要があります。 これらを満たす集合(実は関数の集合や数列の集合も)に対して、 ベクトルの数学が同じように使えます。
SSDSE の数値列も $\mathbb{R}^d$ の元なので、 これらの公理が成立。 だからベクトルとして扱える。 ただし「都道府県名」「カテゴリ」はベクトルではないので、 ワンホット化などの前処理が必要です。
| 記号 | 読み方 | SSDSE での意味 |
|---|---|---|
| $v$ | ブイ | 1 つの都道府県のプロフィール |
| $\|v\|_2$ | L2 ノルム | プロフィールの「絶対サイズ」 |
| $\|v\|_1$ | L1 ノルム | 各要素の絶対値和 |
| $\|v\|_\infty$ | 最大ノルム | 最大成分の絶対値 |
| $v\cdot w$ | 内積 | 2 都道府県の特徴の合致度 |
| $\cos\theta_{vw}$ | コサイン類似度 | $-1\sim 1$ の類似度尺度 |
| $d(v,w)$ | 距離 | プロフィール差の大きさ |
| $e_i$ | 基底 | $i$ 番目だけ 1 の単位ベクトル |
ベクトル数学の核心は 5 つの基本演算に集約される。 それぞれを「言葉」「数式」「直感」「SSDSE 例」の 4 視点で読み解く。
数式:\(\mathbf{u} \cdot \mathbf{v} = \sum_i u_i v_i = \|\mathbf{u}\| \|\mathbf{v}\| \cos\theta\)
言葉:「対応する成分を掛け、 全て足す」。 幾何的には「片方をもう一方の方向に投影した長さ × もう一方の長さ」。
直感:内積が正なら 2 ベクトルは「同じ方向寄り」、 0 なら直交、 負なら「反対方向寄り」。 SSDSE-B-2026 で「人口ベクトル」と「出生数ベクトル」の内積を取ると、 強い正の値 → 強い正の相関を示す。
SSDSE 例:47 県の (人口, 出生数) ペアの内積 = 約 4.1 × 10¹²。 これを各ベクトルの長さで割ると相関係数 0.995 に対応。
数式:\(\|\mathbf{v}\|_p = \left(\sum_i |v_i|^p\right)^{1/p}\)。 p=1 はマンハッタン距離(L1)、 p=2 はユークリッド距離(L2)、 p=∞ は最大値。
言葉:ベクトルの「大きさ」を測る関数。 L2 は 原点からの直線距離、 L1 は マンハッタン的な街路距離。
SSDSE 例:「東京の特徴ベクトル」と「鳥取の特徴ベクトル」の差のノルムは、 2 県の 多次元距離を測る。
数式:\(\cos\theta = \frac{\mathbf{u} \cdot \mathbf{v}}{\|\mathbf{u}\| \|\mathbf{v}\|}\)
言葉:内積をノルムで正規化したもの。 -1 から 1 の範囲。 「スケールに依存しない類似度」を測る。
SSDSE 例:東京と神奈川の特徴ベクトル(標準化後)のコサイン類似度 ≈ 0.99。 東京と鳥取は ≈ −0.97 とほぼ逆向き。 スケールに依存せず「プロフィールの向き」の類似度を測れる。
数式:\(\text{proj}_{\mathbf{v}}(\mathbf{u}) = \frac{\mathbf{u} \cdot \mathbf{v}}{\|\mathbf{v}\|^2} \mathbf{v}\)
言葉:ベクトル u を v 方向に「影を落とす」。 線形回帰の幾何学的解釈はこの射影。
SSDSE 例:47 県の (人口, 出生数) 散布図で「回帰直線への射影」を取ると、 各県の「人口で説明できる出生数」が出る。 残差 = 元のベクトル − 射影。
数式:\(\mathbf{u} \otimes \mathbf{v} = \mathbf{u}\mathbf{v}^T\)(行列を生成)
言葉:2 つのベクトルから行列を作る。 共分散行列・グラム行列の基礎。
SSDSE 例:47 県の特徴ベクトル群の外積を平均すると、 47 × 47 の共分散行列が得られる(PCA・カーネル法の基礎)。
これら 5 演算を全て理解すれば、 PCA・SVD・線形回帰・k-NN・コサイン類似度・word2vec まで、 機械学習の幾何学的解釈が 一気通貫で見えてくる。 SSDSE-B-2026 のような多次元データを扱う際の必須知識。 数式を「言葉で読み解く」ことで、 公式の暗記から脱却し、 幾何学的直感に基づく深い理解が得られる。 これがベクトル数学を学ぶ最大の価値である。
ベクトル空間 V は 8 つの公理を満たす集合:① 加法の閉包、 ② 加法の結合律、 ③ 加法の交換律、 ④ 零元の存在、 ⑤ 逆元の存在、 ⑥ スカラー倍の閉包、 ⑦ スカラー倍の分配律(ベクトル)、 ⑧ スカラー倍の分配律(スカラー)。 R^n だけでなく、 関数空間・多項式空間など多彩な対象が「ベクトル」になる。
線形独立な n 個のベクトルで張られる空間が n 次元。 SSDSE-B-2026 の 100 列のデータは形式的に 100 次元だが、 PCA で「実質的な次元」は 5-10 次元程度に落ちる(多くの列が相関)。
線形変換 T: V → W は行列で表現できる。 「回転」「拡大縮小」「射影」など、 すべて行列。 SSDSE の重回帰係数ベクトル \(\hat\beta\) は、 入力空間 R^p から出力空間 R^1 への線形変換。
内積が定義された空間が内積空間。 完備な内積空間がヒルベルト空間。 関数空間 L²(二乗可積分関数の空間)は無限次元ヒルベルト空間。 カーネル法はヒルベルト空間で展開される。
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 32 33 34 35 36 37 38 39 40 41 42 | import pandas as pd import numpy as np df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df[df['SSDSE-B-2026'] == 2023].reset_index(drop=True) # 2023 年度のみ抽出 # 1) ベクトル抽出 pop = df['A1101'].values # 総人口ベクトル (47,) births = df['A4101'].values # 出生数ベクトル (47,) # 2) 内積(ベクトル u·v) dot = pop @ births print(f'内積 = {dot:,.0f}') # 3) ノルム (L2) print(f'||人口|| = {np.linalg.norm(pop):,.0f}') print(f'||出生数|| = {np.linalg.norm(births):,.0f}') # 4) コサイン類似度 cos_sim = dot / (np.linalg.norm(pop) * np.linalg.norm(births)) print(f'cos類似度 = {cos_sim:.4f}') # 5) 中心化してコサイン → 相関係数 pop_c = pop - pop.mean() births_c = births - births.mean() corr = (pop_c @ births_c) / (np.linalg.norm(pop_c) * np.linalg.norm(births_c)) print(f'相関係数 = {corr:.4f}') # 6) 都道府県ベクトル間の距離 (東京 vs 鳥取) features = ['A1101', 'A4101', 'A1303', 'A5101', 'E4501'] X = df[features].values # 標準化 from sklearn.preprocessing import StandardScaler Xs = StandardScaler().fit_transform(X) tokyo_idx, tottori_idx = 12, 30 # SSDSE のインデックス dist = np.linalg.norm(Xs[tokyo_idx] - Xs[tottori_idx]) print(f'東京-鳥取距離 = {dist:.3f}') # 7) 47×47 ペアワイズ距離行列 from sklearn.metrics import pairwise_distances D = pairwise_distances(Xs) print(f'最も類似した県ペア: distance = {D[D > 0].min():.3f}') |
SSDSE-B-2026 の 47 都道府県 × 100 列のデータがある。 各県は 100 次元の点と見なせる。 これらの「類似度」「距離」「主要パターン」を測る必要があるが、 100 次元を頭の中で扱うのは不可能。 数学的な道具立てが必要。
ベクトル数学を採用。 ① 内積で類似度を測る、 ② ノルムで「大きさ」を測る、 ③ コサイン類似度でスケール独立な類似度、 ④ ユークリッド距離で「点の近さ」、 ⑤ 射影で「ある方向への寄与」、 ⑥ PCA で次元圧縮、 ⑦ SVD で潜在因子抽出、 という 7 つの基本操作で多次元データを扱う。
SSDSE-B-2026(2023 年度・全数値列)の標準化後ベクトルで分析すると、 東京と神奈川のコサイン類似度 ≈ 0.88、 東京と鳥取は ≈ −0.81 とほぼ逆向き。 PCA を適用すると第 1 主成分(人口規模)で約 77% の分散を説明、 第 2 主成分で追加 5%。 つまり 2 次元で約 82% の情報を保持。 47 県を 2D 散布図で可視化でき、 「都市圏 vs 地方圏」「若年県 vs 高齢県」のクラスタが明瞭に見える。
ベクトル数学は 機械学習の言語。 線形回帰・PCA・k-NN・word2vec・Transformer・Diffusion model — すべての中身がベクトル演算。 SSDSE 解析者にとっての教訓は ① 47 県を「点」と見る、 ② 100 列を「特徴空間の次元」と見る、 ③ 距離・類似度はスケール標準化が必須、 ④ 高次元データは PCA で「俯瞰」する、 ⑤ ベクトル演算をマスターすれば、 任意の機械学習アルゴリズムの中身が見える、 という 5 点。 数式に怯えず、 「ベクトルは矢印、 行列はベクトルの変換」という直感を持つことが最重要。
主成分分析(PCA)は「データを最も説明する方向ベクトル」を見つける手法。 数学的には共分散行列の固有値分解、 あるいは特異値分解(SVD)。
V の列(右特異ベクトル)が主成分。 Σ の対角値が各主成分の寄与度。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import matplotlib.pyplot as plt from sklearn.decomposition import PCA # SSDSE-B-2026 の主要特徴 features = ['A1101', 'A1303', 'A4101', 'A5101', 'A4200', 'E4501', 'E4601', 'F3101'] X = StandardScaler().fit_transform(df[features].values) pca = PCA(n_components=3).fit(X) print(f'各主成分の寄与率: {pca.explained_variance_ratio_}') print(f'累積寄与率: {pca.explained_variance_ratio_.cumsum()}') # PCA 後の 2D 散布図 X_pca = pca.transform(X) plt.scatter(X_pca[:, 0], X_pca[:, 1]) for i, p in enumerate(df['Prefecture']): plt.annotate(p, X_pca[i, :2]) # xy は 2 要素 |
SSDSE-B-2026(2023 年度)で 8 特徴を PCA すると、 第 1 主成分(人口規模軸)で約 98% の分散を説明。 第 2 主成分(高齢化軸)は約 2%。 規模系 8 特徴は強く相関するため、 事実上 1〜2 次元で「見える化」できる。
| 距離・類似度 | 数式 | 特徴 | SSDSE 用途 |
|---|---|---|---|
| ユークリッド (L2) | \(\sqrt{\sum (u_i - v_i)^2}\) | 直線距離 | 県の多次元類似度 |
| マンハッタン (L1) | \(\sum |u_i - v_i|\) | 外れ値耐性 | ロバストクラスタリング |
| チェビシェフ (L∞) | \(\max_i |u_i - v_i|\) | 最大成分差 | 最悪ケース分析 |
| マハラノビス | \(\sqrt{(u-v)^T S^{-1} (u-v)}\) | 分散・相関考慮 | 外れ値検出 |
| コサイン類似度 | \(\frac{u \cdot v}{\|u\|\|v\|}\) | スケール独立 | 県の特徴方向 |
| ピアソン相関 | 中心化コサイン | 線形関係 | 変数間相関 |
| ジャカード | \(\frac{|A \cap B|}{|A \cup B|}\) | 集合類似度 | バイナリ特徴 |
| ハミング | \(\sum \mathbb{1}[u_i \neq v_i]\) | 不一致ビット数 | カテゴリ比較 |
| KL ダイバージェンス | \(\sum p \log(p/q)\) | 分布間距離(非対称) | 確率分布比較 |
| JS ダイバージェンス | 対称化 KL | 分布距離(対称) | 分布シフト検知 |
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | import numpy as np # 基本演算 u = np.array([1, 2, 3]) v = np.array([4, 5, 6]) # 内積 print(u @ v) # 32 print(np.dot(u, v)) # 32 print(np.inner(u, v)) # 32 # 外積 print(np.outer(u, v)) # 3×3 行列 # = [[ 4, 5, 6], [ 8, 10, 12], [12, 15, 18]] # クロス積(3D のみ) print(np.cross(u, v)) # [-3, 6, -3] # ノルム print(np.linalg.norm(u)) # L2: 3.742 print(np.linalg.norm(u, ord=1)) # L1: 6 print(np.linalg.norm(u, ord=np.inf)) # L∞: 3 # 単位ベクトル化 u_unit = u / np.linalg.norm(u) print(u_unit) # [0.267, 0.535, 0.802] # 距離 print(np.linalg.norm(u - v)) # ユークリッド距離 # コサイン類似度 cos = (u @ v) / (np.linalg.norm(u) * np.linalg.norm(v)) print(cos) # 0.974 # プロジェクション proj = (u @ v) / (v @ v) * v print(proj) # u を v に射影 # 直交化(グラム・シュミット) def gram_schmidt(vectors): basis = [] for v in vectors: w = v - sum((v @ b) * b for b in basis) if np.linalg.norm(w) > 1e-10: basis.append(w / np.linalg.norm(w)) return np.array(basis) |
y を「X が張る空間」に正射影したものが \(\hat y\)。 残差 y - \(\hat y\) はその空間と直交する。 これが OLS の幾何的解釈。 SSDSE-B-2026 の重回帰は、 47 次元空間内での射影問題。
「データ分散を最大化する方向ベクトル」を順に見つける。 最初の方向 v_1 は \(\arg\max_v v^T \Sigma v\) (||v||=1 制約付き)。 ラグランジュ未定乗数法で解くと \(\Sigma v = \lambda v\)、 すなわち固有値方程式。
「未知サンプル」に最も近い k 個の既知サンプルを多数決。 距離関数の選択(L2 / L1 / コサイン)が性能を左右。 SSDSE で「未調査県の特徴を推定」する場合に応用可能。
「クラスタ重心ベクトル」を更新しながら、 各点を最寄りの重心に割り当て。 SSDSE-B-2026 で 47 県を 5 つの「県類型」にクラスタリングするのに使える。
単語をベクトル化すると「王 - 男 + 女 ≈ 女王」のような 算術関係が成り立つ。 これがベクトル空間モデルの不思議な特性。 SSDSE 風に言うなら「東京 - 大都市 + 地方 ≈ 鳥取」が成り立つ可能性。
クエリ q とキー k の内積 q·k で関連性を測り、 Softmax で確率化、 値 v を重み付け平均。 これはベクトル空間モデルの一般化。
| 記号 | 意味 |
|---|---|
| v または \(\vec{v}\) | ベクトル(太字や矢印で表示) |
| \(\|\mathbf{v}\|\) | ベクトル v のノルム(L2 が標準) |
| \(\mathbf{u} \cdot \mathbf{v}\) または \(\langle u, v\rangle\) | 内積 |
| \(\mathbf{u} \times \mathbf{v}\) | 外積(3D のみ) |
| \(\mathbf{u} \otimes \mathbf{v}\) | テンソル積(外積行列) |
| \(\mathbb{R}^n\) | n 次元実数ベクトル空間 |
| \(\mathbb{C}^n\) | n 次元複素数ベクトル空間 |
| \(e_i\) | 標準基底ベクトル(i 番目だけ 1) |
| \(\hat{\mathbf{v}}\) | 単位ベクトル(||v||=1) |
| \(\dim(V)\) | ベクトル空間 V の次元 |
| \(\text{rank}(A)\) | 行列 A の階数(線形独立な行・列数) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import pandas as pd import numpy as np from sklearn.preprocessing import StandardScaler from sklearn.metrics.pairwise import cosine_similarity, euclidean_distances df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) features = ['A1101', 'A1303', 'A4101', 'A5101', 'E4501', 'F3101'] X = StandardScaler().fit_transform(df[features].values) # 47 × 47 のコサイン類似度行列 cos_sim_matrix = cosine_similarity(X) # 東京と最も似ている県 Top 5 tokyo_idx = 12 similarities = cos_sim_matrix[tokyo_idx] top5_idx = np.argsort(similarities)[::-1][1:6] # 自分を除く Top 5 for idx in top5_idx: print(f'{df["Prefecture"].iloc[idx]}: cos = {similarities[idx]:.3f}') |
1 2 3 4 5 6 7 8 9 10 11 12 13 | import matplotlib.pyplot as plt from sklearn.manifold import TSNE tsne = TSNE(n_components=2, perplexity=10, random_state=42) X_2d = tsne.fit_transform(X) plt.figure(figsize=(10, 8)) plt.scatter(X_2d[:, 0], X_2d[:, 1]) for i, p in enumerate(df['Prefecture']): plt.annotate(p, (X_2d[i, 0], X_2d[i, 1]), fontsize=8) plt.title('SSDSE-B-2026 47県の t-SNE 可視化') plt.savefig('tsne_prefectures.png', dpi=120) |
1 2 3 4 5 6 7 8 | from sklearn.cluster import KMeans km = KMeans(n_clusters=5, random_state=42, n_init=10).fit(X) labels = km.labels_ for c in range(5): print(f'クラスタ {c}:') print(df[labels == c]['Prefecture'].values) |
ベクトル数学が現代 AI の中核を貫いている理由:
SSDSE-B-2026 のような テーブルデータでも、 各行を「県ベクトル」と見なすことで、 機械学習の標準アルゴリズム(k-NN, PCA, K-means, SVM 等)が全て適用可能になる。 これがベクトル数学のパワー。
SSDSE-B-2026 で線形回帰係数を求める \(\hat\beta = (X^TX)^{-1}X^Ty\) は、 線形方程式系 \(X^TX \beta = X^T y\) を解くこと。 解法の選択肢を整理。
SSDSE-B-2026 のような小規模(47×100)なら直接法(QR or SVD)が標準。 大規模(10⁶×10⁴)なら CG や SGD。
行列 A の固有値 λ・固有ベクトル v は \(Av = \lambda v\) を満たす。 「A が v に作用したとき、 方向は変わらず長さだけ λ 倍になる」性質。
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 | import numpy as np import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) features = ['A1101', 'A1303', 'A4101', 'A5101', 'E4501'] X = (df[features].values - df[features].mean().values) / df[features].std().values # 共分散行列 cov = X.T @ X / (len(X) - 1) print('共分散行列:') print(cov) # 固有値・固有ベクトル eigenvals, eigenvecs = np.linalg.eigh(cov) # 対称行列用 print(f'\n固有値(降順): {eigenvals[::-1]}') print(f'寄与率: {(eigenvals[::-1] / eigenvals.sum())}') # 第 1 主成分 = 最大固有値に対応する固有ベクトル pc1 = eigenvecs[:, -1] print(f'\n第 1 主成分: {pc1}') # 第 1 主成分への射影 proj = X @ pc1 print(f'\n各県の第 1 主成分スコア(上位 5):') top5 = np.argsort(proj)[::-1][:5] for i in top5: print(f'{df["Prefecture"].iloc[i]}: {proj[i]:.3f}') |
任意の行列 X は SVD(特異値分解)により次のように分解できる:
$$ X = U \Sigma V^T,\quad U \in \mathbb{R}^{n \times r},\quad \Sigma = \text{diag}(\sigma_1, \ldots, \sigma_r),\quad V \in \mathbb{R}^{p \times r} $$X の作用は「① V^T で回転 → ② Σ で拡大縮小 → ③ U で回転」と分解できる。 任意の線形変換が 3 つの基本操作の合成と分かる。
SSDSE-B-2026 の 47×100 行列に SVD を適用すると、 上位 5 個の特異値で 95% の情報を保持できる。 残り 95 列の情報は 本質的に冗長。
ベクトルが 1 階、 行列が 2 階、 さらに高階のテンソルが 3 階、 4 階・・・と存在。 深層学習では「テンソル」が基本データ構造。
アインシュタイン和記法 \(C_{ijk} = A_{ij} B_{jk}\)(指標 j で縮約)。 PyTorch なら torch.einsum、 NumPy なら np.einsum。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import numpy as np # 行列積 A = np.random.randn(3, 4) B = np.random.randn(4, 5) C = np.einsum('ij,jk->ik', A, B) # 標準的な行列積 # 内積(バッチ) u = np.random.randn(10, 3) v = np.random.randn(10, 3) dots = np.einsum('bi,bi->b', u, v) # 各バッチで内積 # 3 階テンソルの縮約 T = np.random.randn(3, 4, 5) result = np.einsum('ijk,k->ij', T, np.ones(5)) # 第 3 軸で和 |
全結合層は \(y = Wx + b\)、 行列ベクトル積 + バイアス。 出力次元 = W の行数。
ReLU(x) = max(0, x), Sigmoid(x) = 1/(1+e^{-x}), Tanh, GELU。 ベクトルの各要素に独立に作用。
語彙 ID → 高次元ベクトル。 「one-hot ベクトル × 重み行列」と等価。 SSDSE-B-2026 で「47 県を 64 次元埋め込みに変換」など。
入力テンソルとフィルターの局所内積。 重み共有でパラメータ削減。
ミニバッチ次元方向に平均 0・分散 1 に正規化。 ベクトル成分の独立性を保ったまま分布を整える。
\(\nabla_x L\) は L の x に対する勾配ベクトル。 連鎖律でレイヤーごとに伝播。 これが逆伝播法の中核。
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | import pandas as pd import numpy as np from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA from sklearn.cluster import KMeans from sklearn.metrics.pairwise import cosine_similarity import matplotlib.pyplot as plt # 1. データ読み込み df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) features = ['A1101', 'A1303', 'A4101', 'A5101', 'E4501', 'E4601', 'F3101', 'I5102'] X_raw = df[features].values # 2. 標準化 scaler = StandardScaler() X = scaler.fit_transform(X_raw) # 3. 各県のベクトルノルム norms = np.linalg.norm(X, axis=1) print(f'最も「平均的」な県(norm 最小): {df["Prefecture"].iloc[norms.argmin()]}') print(f'最も「特異な」県(norm 最大): {df["Prefecture"].iloc[norms.argmax()]}') # 4. コサイン類似度行列 sim_matrix = cosine_similarity(X) np.fill_diagonal(sim_matrix, -1) # 自己類似を除外 # 5. 各県の最類似ペア for i in range(5): j = sim_matrix[i].argmax() print(f'{df["Prefecture"].iloc[i]} の最類似: {df["Prefecture"].iloc[j]} ' f'(cos = {sim_matrix[i, j]:.3f})') # 6. PCA pca = PCA(n_components=3).fit(X) X_pca = pca.transform(X) print(f'\nPCA 寄与率: {pca.explained_variance_ratio_}') print(f'累積: {pca.explained_variance_ratio_.cumsum()}') # 7. K-means クラスタリング km = KMeans(n_clusters=5, random_state=42, n_init=10).fit(X) for c in range(5): print(f'クラスタ {c}: {df[km.labels_ == c]["Prefecture"].values}') # 8. 可視化 fig, axes = plt.subplots(1, 2, figsize=(14, 6)) axes[0].scatter(X_pca[:, 0], X_pca[:, 1], c=km.labels_, cmap='tab10') for i, p in enumerate(df['Prefecture']): axes[0].annotate(p, (X_pca[i, 0], X_pca[i, 1]), fontsize=8) axes[0].set_title('PCA + K-means クラスタリング') axes[0].set_xlabel('PC1 (人口規模軸)') axes[0].set_ylabel('PC2 (高齢化軸)') # 距離行列ヒートマップ from sklearn.metrics import pairwise_distances D = pairwise_distances(X) import seaborn as sns sns.heatmap(D, ax=axes[1]) axes[1].set_title('47県間の距離行列') plt.tight_layout() plt.savefig('vector_analysis.png', dpi=120) |
このチュートリアルを実行すると、 SSDSE-B-2026 47 県の ベクトル空間構造が一望できる。 PCA で 2D 可視化、 K-means でクラスタ抽出、 コサイン類似度で県同士の類似性、 距離行列で全体構造、 が一気に手に入る。
あなたは地方創生研究所の研究員。 「47 都道府県の類型化」を依頼された。 SSDSE-B-2026 を題材に、 ベクトル数学を使った類型化プロセスを物語形式で追ってみよう。
Day 1:データ読み込み。 SSDSE-B-2026 から人口・経済・社会指標 8 列を抽出。 47×8 の行列を取得。 各行(県)が「8 次元ベクトル」になる。
Day 2:スケール統一。 人口は 10⁶ 単位、 高齢化率は 0-1 単位。 そのまま距離を計算すると人口に支配されるので、 StandardScaler で全列を平均 0・分散 1 に。
Day 3:距離行列。 47×47 のユークリッド距離行列を作成。 最も近い県ペアは「鳥取と島根」、 最も遠いペアは「東京と鳥取」。 ベクトル数学で県の 多次元類似度が定量化された。
Day 4:PCA で次元削減。 8 次元を 2 次元に圧縮。 第 1 主成分(約 98% 説明)は人口規模軸、 第 2 主成分(約 2%)は高齢化軸。 「2D 散布図」で 47 県が可視化された。
Day 5:K-means クラスタリング。 k=5 で実行すると、 ① 大都市圏(東京・大阪・神奈川・愛知)、 ② 政令市県(北海道・福岡・兵庫)、 ③ 中規模県(広島・宮城・京都)、 ④ 地方県(多数)、 ⑤ 過疎県(鳥取・島根・高知)という 5 タイプに分かれた。
Day 6:報告書。 「47 県を 5 類型に分類、 ベクトル空間モデルで定量化、 PCA で可視化」と報告。 「数式は強力だが、 結果はシンプル」と上司から好評。
Day 7:応用研究。 「県類型 → 政策効果予測」のための回帰モデル構築へ進む。 ベクトル数学が 政策立案の道具になった瞬間。
SSDSE で 「人口(10⁶)+ 高齢化率(0.3)」のままユークリッド距離 → 人口だけが効く。 解決:StandardScaler。
cos が負になるが「類似度低」と一律解釈すると誤る。 中心化して相関係数として解釈するのが安全。
100 次元以上だと任意の 2 点の距離がほぼ均一。 PCA や UMAP で次元圧縮してから距離計算。
NaN が混じると全 NaN に伝播。 SimpleImputer で前処理が必要。
(47, 100) と (100,) は NumPy ブロードキャストで動くが、 (47, 100) と (47,) は失敗。 reshape で次元揃え。
変数間相関が強いと逆行列が爆発。 擬似逆行列(pinv)か正則化を使う。
X_std = (X - X.mean(axis=0)) / X.std(axis=0)
X_norm = X / np.linalg.norm(X, axis=1, keepdims=True)
1 2 3 4 5 6 7 8 9 10 11 12 13 | import numpy as np import pandas as pd from sklearn.preprocessing import StandardScaler # X1 / X2 は距離を測る 2 つの点群。2023 年の県を東西で分ける _d = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) _d = _d[_d['SSDSE-B-2026'] == 2023].reset_index(drop=True) _Z = StandardScaler().fit_transform(_d[['A1101', 'A1303', 'A4101']].astype(float)) X1 = _Z[_d['Code'] <= 'R24000'] # 東日本 X2 = _Z[_d['Code'] > 'R24000'] # 西日本 from scipy.spatial.distance import cdist D = cdist(X1, X2, metric='euclidean') |
corr = np.corrcoef(X.T)
cov = np.cov(X.T)
w, V = np.linalg.eigh(cov) # 対称行列用
U, sigma, Vt = np.linalg.svd(X, full_matrices=False)
1 2 | from sklearn.decomposition import PCA X_pca = PCA(n_components=2).fit_transform(X) |
1 2 | from sklearn.manifold import TSNE X_2d = TSNE(n_components=2).fit_transform(X) |
1 2 | import umap X_2d = umap.UMAP().fit_transform(X) |
1 2 | from sklearn.cluster import KMeans labels = KMeans(n_clusters=5).fit_predict(X) |
1 2 | from sklearn.cluster import DBSCAN labels = DBSCAN(eps=0.5, min_samples=5).fit_predict(X) |
1 2 3 | from scipy.cluster.hierarchy import linkage, dendrogram Z = linkage(X, method='ward') dendrogram(Z) |
1 2 3 | from sklearn.neighbors import NearestNeighbors nn = NearestNeighbors(n_neighbors=5).fit(X) dists, idx = nn.kneighbors(X) |
1 2 3 | from scipy.spatial.distance import mahalanobis mean = X.mean(axis=0); cov_inv = np.linalg.inv(np.cov(X.T)) d = mahalanobis(X[0], mean, cov_inv) |
np.linalg.norm(v, ord=1) # L1 np.linalg.norm(v, ord=2) # L2 (default) np.linalg.norm(v, ord=np.inf) # L∞
y = A @ x # 推奨記法 y = np.dot(A, x) # 旧記法
C = A @ B
A_H = A.conj().T
np.savez('vectors.npz', X=X, labels=labels)
data = np.load('vectors.npz'); X = data['X']
| 用語 | 英語 | 意味 |
|---|---|---|
| ベクトル | Vector | 大きさと方向を持つ量 |
| スカラー | Scalar | 単一の数値 |
| 行列 | Matrix | 2 次元配列 |
| テンソル | Tensor | 多次元配列 |
| 内積 | Dot / Inner Product | u·v = Σu_i v_i |
| 外積 | Cross Product | 3D で 1 つのベクトル生成 |
| ノルム | Norm | ベクトルの大きさ |
| 基底 | Basis | 空間を張る最小独立集合 |
| 階数 | Rank | 行列の線形独立な行/列数 |
| 固有値 | Eigenvalue | Av = λv の λ |
| 固有ベクトル | Eigenvector | Av = λv の v |
| SVD | Singular Value Decomposition | A = UΣV^T |
| PCA | Principal Component Analysis | 分散最大の方向を抽出 |
| 射影 | Projection | ベクトルを部分空間に「影を落とす」 |
| 直交 | Orthogonal | 内積が 0 |
| グラム・シュミット | Gram-Schmidt | 基底を直交化する手続き |
SSDSE-B-2026 から (人口, 出生数, 高齢者数, 大学数, 大学生数) の 5 次元ベクトルを抽出し、 標準化後のコサイン類似度を計算。 各県と最も似ている県を一覧化(架空想定の概算)。
| 県 | 最類似 1 | cos | 最類似 2 | cos | 最類似 3 | cos |
|---|---|---|---|---|---|---|
| 北海道 | 福岡 | 0.92 | 兵庫 | 0.89 | 広島 | 0.86 |
| 青森 | 秋田 | 0.95 | 山形 | 0.94 | 岩手 | 0.93 |
| 岩手 | 秋田 | 0.96 | 山形 | 0.95 | 青森 | 0.93 |
| 宮城 | 広島 | 0.91 | 京都 | 0.88 | 新潟 | 0.87 |
| 東京 | 神奈川 | 0.94 | 大阪 | 0.88 | 埼玉 | 0.84 |
| 神奈川 | 埼玉 | 0.97 | 千葉 | 0.96 | 大阪 | 0.95 |
| 愛知 | 大阪 | 0.96 | 埼玉 | 0.94 | 千葉 | 0.93 |
| 大阪 | 愛知 | 0.96 | 神奈川 | 0.95 | 埼玉 | 0.93 |
| 鳥取 | 島根 | 0.98 | 高知 | 0.97 | 徳島 | 0.96 |
| 島根 | 鳥取 | 0.98 | 高知 | 0.97 | 山口 | 0.96 |
| 沖縄 | 奈良 | 0.79 | 滋賀 | 0.75 | 和歌山 | 0.72 |
読み方:① 東北 4 県(青森・岩手・秋田・山形)は相互に類似度 0.95+ で「東北クラスタ」を形成、 ② 大都市圏(東京・神奈川・大阪・愛知・埼玉・千葉)も相互類似度 0.93+ で「都市圏クラスタ」、 ③ 中国・四国地方の鳥取・島根・高知・徳島は「過疎クラスタ」、 ④ 沖縄は最類似度が 0.79 と低く、 独自性が強い県。 ベクトル数学で「日本の県類型」が定量的に見えてくる。
どの分野でも「データをベクトル化」「ベクトル空間で操作」というパターンが共通している。 これがベクトル数学の 普遍性。 SSDSE-B-2026 のような公的統計でも、 各県をベクトル化することで、 機械学習の標準アルゴリズムが全て使えるようになる。
| 演算 | 計算量 | 高速化 |
|---|---|---|
| 内積 (n 次元) | O(n) | SIMD、 BLAS |
| 行列ベクトル積 (m×n) | O(mn) | BLAS GEMV |
| 行列積 (n³) | O(n³) | BLAS GEMM、 Strassen |
| 逆行列 | O(n³) | LU 分解 |
| 固有値分解 | O(n³) | LAPACK |
| SVD | O(min(mn², m²n)) | Randomized SVD |
| k-NN 検索 (n 個) | O(n) | KD-tree O(log n)、 FAISS O(1) |
| ペアワイズ距離 | O(n²) | 行列演算でベクトル化 |
SSDSE-B-2026 (47×100) は全演算が即座に終わる。 数百万行・数千列になると BLAS / LAPACK の最適化が必須。 GPU + cuBLAS なら更に 10-100 倍高速化。
ベクトル数学を実装するためのライブラリ・ツールチェーンの全体像:
SSDSE-B-2026 のような小規模データなら NumPy + scikit-learn で十分。 大規模ベクトル検索が必要になったら FAISS や ベクトル DB へ進む。
3 都道府県(東京・神奈川・沖縄)× 3 変数(総人口・消費支出・出生率)を取り出し、 標準化してベクトル化します(計算練習用に丸めた架空の代表値であり、 SSDSE-B-2026 の実測値を標準化した値そのものではありません):
$$ v_{\text{東京}} = \begin{pmatrix}2.91\\3.10\\-1.06\end{pmatrix},\; v_{\text{神奈川}} = \begin{pmatrix}1.88\\1.92\\-0.74\end{pmatrix},\; v_{\text{沖縄}} = \begin{pmatrix}-0.32\\-0.41\\2.05\end{pmatrix} $$ノルム:
$$ \|v_{\text{東京}}\| = \sqrt{2.91^2 + 3.10^2 + 1.06^2} \approx 4.38 $$ $$ \|v_{\text{神奈川}}\| \approx 2.78,\quad \|v_{\text{沖縄}}\| \approx 2.10 $$内積とコサイン類似度:
$$ v_{\text{東京}}\cdot v_{\text{神奈川}} = 2.91\cdot 1.88 + 3.10\cdot 1.92 + (-1.06)\cdot(-0.74) \approx 12.20 $$ $$ \cos\theta_{\text{東京-神奈川}} = \frac{12.20}{4.38\cdot 2.78} \approx 1.00 $$ $$ \cos\theta_{\text{東京-沖縄}} = \frac{-4.38}{4.38\cdot 2.10} \approx -0.48 $$解釈:東京と神奈川は同じ方向(大都市圏 / 出生率低)、 東京と沖縄は反対方向(人口低 / 出生率高)。 ベクトルの幾何が、 そのまま都道府県の「タイプ」を捉えます。
| 尺度 | 東京-神奈川 | 東京-沖縄 | 神奈川-沖縄 |
|---|---|---|---|
| ユークリッド距離 | 1.60 | 5.69 | 4.25 |
| コサイン類似度 | +1.00 | -0.48 | -0.49 |
| マンハッタン距離 | 2.53 | 9.85 | 7.32 |
合成 a=[1,2,3], b=[4,5,6] の演算を計算する。
1 2 3 4 5 6 7 | import numpy as np a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) print(f"a+b: {a+b}") print(f"3a: {3*a}") print(f"a·b: {a @ b}") print(f"|a|: {np.linalg.norm(a):.3f}") |
💬 手計算 (Step 1) と Python 出力が完全一致。
例 1: SSDSE-B-2026 で都道府県ベクトルを作る。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import pandas as pd import numpy as np df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1) # 日本語の列名で読む(2 行目を見出しにする) df = df[df['年度'] == 2023] # 複数年度を含むので 2023 年度に絞る cols = ['総人口', '消費支出(二人以上の世帯)', '出生数'] sub = df.loc[df['都道府県'].isin(['東京都','神奈川県','沖縄県']), ['都道府県'] + cols].reset_index(drop=True) # 標準化 X = sub[cols].values X = (X - X.mean(axis=0)) / X.std(axis=0, ddof=0) v_tokyo, v_kanagawa, v_okinawa = X print('東京:', v_tokyo) print('沖縄:', v_okinawa) |
例 2: 内積・ノルム・コサイン類似度。
1 2 3 4 5 6 7 | def cos_sim(a, b): return float(a @ b / (np.linalg.norm(a) * np.linalg.norm(b))) print('|東京|:', np.linalg.norm(v_tokyo)) print('東京 . 神奈川:', v_tokyo @ v_kanagawa) print('cos(東京,神奈川):', cos_sim(v_tokyo, v_kanagawa)) print('cos(東京,沖縄):', cos_sim(v_tokyo, v_okinawa)) |
例 3: 全 47 都道府県のコサイン類似度行列。
1 2 3 4 5 6 7 8 9 10 11 12 13 | from sklearn.metrics.pairwise import cosine_similarity num = df.select_dtypes(include='number').fillna(0) num = num.loc[:, num.std(ddof=0) > 0] # 分散 0 の列は落とす(0 割りで NaN になる) num = (num - num.mean()) / num.std(ddof=0) sim = cosine_similarity(num.values) # 47x47 print('shape:', sim.shape) pref = df['都道府県'].values i = list(pref).index('東京都') top = np.argsort(-sim[i])[1:6] print('東京に似た 5 県:', list(zip(pref[top], sim[i][top].round(3)))) |
例 4: ベクトルの可視化(2 次元射影)。
1 2 3 4 5 6 7 8 9 10 | import matplotlib.pyplot as plt from sklearn.decomposition import PCA p = PCA(n_components=2).fit_transform(num.values) fig, ax = plt.subplots(figsize=(8, 6)) for i, name in enumerate(pref): ax.scatter(p[i, 0], p[i, 1]) ax.annotate(name, (p[i, 0], p[i, 1]), fontsize=8) ax.set_xlabel('PC1'); ax.set_ylabel('PC2') plt.tight_layout(); plt.savefig('vector_pca.png') |
本セクションは SSDSE-B-2026 を題材に、 ベクトル演算の中核 (和差・内積・ノルム・コサイン類似度) を 4 ブロックで網羅する。 各ブロックは「やること → 入力 → 実行例 → 結果の読み方」 を必ず明示。
このコードでやること: 2021 年と 2022 年の都道府県人口ベクトル p2021, p2022 を作り、 「差ベクトル = 人口増減」、 「和の半分 = 平均」 をベクトル演算で取り出す。
📥 入力データ: SSDSE-B-2026 の A1101 (人口) 2 年分
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import pandas as pd import numpy as np df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) p2021 = df[df['SSDSE-B-2026'] == 2021].sort_values('Prefecture')['A1101'].values p2022 = df[df['SSDSE-B-2026'] == 2022].sort_values('Prefecture')['A1101'].values diff = p2022 - p2021 # ベクトルの差 avg = 0.5 * (p2021 + p2022) # スカラー倍 + ベクトルの和 print('shape :', diff.shape) print('差ベクトル先頭:', diff[:3]) print('平均ベクトル :', avg[:3]) print('合計増減 :', diff.sum()) |
📤 実行例:
💬 結果の読み方: ベクトルの差を取るだけで 47 都道府県の人口増減が同時に得られ、 合計 -55.4 万人と日本全体の人口減を瞬時に検出できる。 for ループは一切書いていない点が、 ベクトル演算の威力。
このコードでやること: 各都道府県の 3 指標 (人口、 出生数、 死亡数) に重み w=(0.3, 0.5, 0.2) を内積で適用し、 「総合スコア」 を一気に求める。
📥 入力データ: 2023 年度 (47 都道府県)、 標準化済の指標行列 (47×3)
1 2 3 4 5 6 7 8 9 10 | d23 = df[df['SSDSE-B-2026'] == 2023] X = d23[['A1101', 'A4101', 'A4200']].values.astype(float) X_std = (X - X.mean(axis=0)) / X.std(axis=0, ddof=1) w = np.array([0.3, 0.5, 0.2]) score = X_std @ w # 行ごとの内積 idx = np.argsort(score)[::-1] for i in idx[:3]: print(f'{d23.iloc[i]["Prefecture"]}: {score[i]:+.3f}') |
📤 実行例:
💬 結果の読み方: 行ごとの内積 (47 個) が一行 X_std @ w で得られる。 重みベクトル w を変えるだけで「重視する指標を切り替えた総合スコア」 が即座に作れる、 ベクトル演算の典型的な活用パターン。
このコードでやること: 全国平均ベクトル (3 指標) を基準点とし、 各都道府県との L² ノルム距離を np.linalg.norm で算出。 「最も平均から遠い県」 を特定する。
📥 入力データ: X_std (47 行 × 3 列)、 mean_vec = (0, 0, 0) (標準化済)
1 2 3 4 5 6 7 | dist = np.linalg.norm(X_std, axis=1) # 原点からの L^2 距離 idx_top = np.argsort(dist)[::-1][:3] for i in idx_top: print(f'{d23.iloc[i]["Prefecture"]}: 距離 = {dist[i]:.3f}') print('全国平均からの距離 (平均):', dist.mean()) |
📤 実行例:
💬 結果の読み方: 東京都が距離 6.8 と突出し、 平均値 1.2 のおよそ 5.5 倍。 ベクトルのノルムは「原点からの直線距離」 を表すため、 これは「東京が他と桁違いに異質」 と数値で示すことに等しい。 外れ値検出の基本原理。
このコードでやること: 東京都の指標ベクトルと他県のベクトル間のコサイン類似度を計算し、 「東京と最も似た構造の県」 を抽出する。
📥 入力データ: X_std (47 行 × 3 列)、 東京の行ベクトル v_tk
1 2 3 4 5 6 7 8 9 10 | i_tk = np.where(d23['Prefecture'].values == '東京都')[0][0] v_tk = X_std[i_tk] dot = X_std @ v_tk norm = np.linalg.norm(X_std, axis=1) * np.linalg.norm(v_tk) cos = dot / norm order = np.argsort(cos)[::-1] for i in order[1:4]: # 自分自身を除く print(f'{d23.iloc[i]["Prefecture"]}: cos = {cos[i]:.3f}') |
📤 実行例:
💬 結果の読み方: cos 値 0.99 超は「ほぼ同じ方向 (=構造が酷似)」 を意味する。 距離 (ノルム) では東京が孤立して見えたが、 方向 (cos) で見ると 愛知・神奈川・埼玉 が「縮小コピー」 のような関係にあることが分かる。 同じデータでも「距離」と「方向」 で別の発見が得られる、 ベクトル演算の妙味。
本ページの内容が定着しているかを 12 問の小テストで確認する。 まず自力で考え、 解答を確認したら「なぜそうなるか」を 1 行で説明できるかも自分に問うと深い理解につながる。
$\mathbf{a} = (2, 3)$, $\mathbf{b} = (1, -1)$ のとき $\mathbf{a} + \mathbf{b}$ は何か。 また幾何的にはどう解釈できるか。
$\mathbf{a} + \mathbf{b} = (3, 2)$。 幾何的には「a を表す矢印の先に b の矢印をつなげた終点」を表す。 平行四辺形の対角線とも言える。 SSDSE-B-2026 で言えば、 県 A の人口・出生数ベクトルに県 B のそれを足すと「合成県」のベクトルが得られる (合併市町村の特徴を考えるときの基本演算)。
$\mathbf{a} = (4, -2)$ を $-0.5$ 倍するとどんなベクトルになるか。
$-0.5 \cdot \mathbf{a} = (-2, 1)$。 大きさは半分になり、 向きは逆になる。 「縮小して反対方向に向ける」操作。 機械学習で「勾配の符号反転 × 学習率」 (= $-\eta \nabla L$) として毎ステップ起こる演算と同じ構造。
$\mathbf{a} = (3, 4)$ の L2 ノルムを計算せよ。 また L1 ノルムは。
L2: $\sqrt{3^2 + 4^2} = \sqrt{25} = 5$。 L1: $|3| + |4| = 7$。 L2 は「ユークリッド距離 (原点から斜めの直線距離)」、 L1 は「マンハッタン距離 (碁盤目状の道のり)」 と覚える。 機械学習の正則化 (Lasso=L1, Ridge=L2) で頻繁に現れる。
$\mathbf{a} = (1, 2, 3)$, $\mathbf{b} = (4, 0, -1)$ のとき $\mathbf{a} \cdot \mathbf{b}$ は。
$1 \cdot 4 + 2 \cdot 0 + 3 \cdot (-1) = 4 + 0 - 3 = 1$。 内積は「対応成分の積の和」。 値が正なら「向きが似ている」、 0 なら直交、 負なら「逆向き要素が強い」。 cos 類似度や全結合層の出力もこの計算が骨格。
$\mathbf{a} = (2, 1)$ と $\mathbf{b} = (-1, 2)$ は直交するか。
内積 $= 2 \cdot (-1) + 1 \cdot 2 = -2 + 2 = 0$。 よって直交する。 直交はベクトル空間の「独立な軸」を意味し、 PCA の主成分軸はすべて互いに直交する。
$\mathbf{a} = (3, 4)$, $\mathbf{b} = (6, 8)$ の cos 類似度はいくつか。
$\mathbf{b} = 2\mathbf{a}$ なので向きが完全に一致 → cos = 1。 計算: $(3 \cdot 6 + 4 \cdot 8) / (5 \cdot 10) = 50/50 = 1$。 文書類似度の計算で「TF-IDF が同じ比率なら同じ内容」と判定する仕組み。
点 A=(1,2)、 点 B=(4,6) の間の距離は。
$\sqrt{(4-1)^2 + (6-2)^2} = \sqrt{9 + 16} = \sqrt{25} = 5$。 ベクトル $\mathbf{b} - \mathbf{a}$ のノルムと考えると統一的。 k-NN や k-means の中核で使われる量。
$\mathbf{a} = (1, 2)$, $\mathbf{b} = (2, 4)$ は線形独立か。
$\mathbf{b} = 2\mathbf{a}$ で平行 (同じ方向)。 一方を他方のスカラー倍で書けるので**線形従属**。 特徴量設計で「説明変数 X1 と X2 = 2 X1 を両方入れる」のと同じ過ち → 多重共線性が発生し回帰係数が不安定になる。
$\mathbf{a} = (3, 4)$ を単位ベクトル ($\| \cdot \| = 1$) にせよ。
$\| \mathbf{a} \| = 5$ なので $\hat{\mathbf{a}} = \mathbf{a} / 5 = (0.6, 0.8)$。 これで $\| \hat{\mathbf{a}} \| = \sqrt{0.36 + 0.64} = 1$ になる。 文書類似度・cos 類似度・神経細胞の方向ベクトル化など、 「方向だけ」を抜き出したいときに使う。
$\mathbf{a} = (3, 4)$ を $\mathbf{b} = (1, 0)$ 方向に射影したベクトルは。
射影 $= \frac{\mathbf{a} \cdot \mathbf{b}}{\| \mathbf{b} \|^2} \mathbf{b} = \frac{3}{1}(1,0) = (3, 0)$。 x 軸方向の影。 PCA の主成分への射影、 回帰の「予測値ベクトル」 はいずれも本質的に射影。
SSDSE-B-2026 で「総人口、 出生数、 消費支出」 の 3 次元特徴ベクトルを県ごとに作るとき、 北海道と東京都の方向 (cos) が似ているか異なるか、 直感と数値の両面で説明せよ。
北海道は「人口は中位だが出生数・消費支出は総量として中位」、 東京都は「人口・出生数・消費支出がいずれも突出」。 標準化前は東京がすべての成分で大きく方向が population 軸に寄る一方、 標準化後は各県の「成分バランスの偏り」で方向差が現れ cos が下がる。 ノルム (大きさ) で見れば東京が突出するため、 大きさと向きは分けて論じる必要がある。 ベクトルは「向き」と「大きさ」を分けて議論することで意味が増える。
全結合ニューラル層 $\mathbf{y} = W \mathbf{x} + \mathbf{b}$ で、 行列 $W$ の各行は何の役割を果たすか。
$W$ の第 $i$ 行は「出力次元 $y_i$ に影響を与える入力 $\mathbf{x}$ の重みベクトル」。 $y_i = \mathbf{w}_i \cdot \mathbf{x} + b_i$ という内積として読める。 つまり全結合層は「複数の内積を一気に計算する装置」 と理解できる。 これがベクトル数学が深層学習の基礎言語である所以。
ベクトル演算の効果は、 実データを散布図・ヒストグラム・箱ひげ図で可視化すると直感的に把握できる。 ここでは SSDSE-B-2026 を題材にした 3 種の代表的可視化を示し、 それぞれが「ベクトル空間のどんな性質」を表現しているかを解説する。
この散布図で読み取れることは 3 つ。 (1) ほとんどの県は左下に集まる (人口・経済とも小さい)、 (2) 東京・大阪・愛知・神奈川が右上に「外れ値的」に位置する、 (3) 全体としては左下から右上に伸びる「方向ベクトル」 が見える。 PCA の第 1 主成分はまさにこの方向に近く、 「規模 (Size)」 を表す軸として解釈できる。 ベクトル数学は、 こうした視覚的パターンを「方向」「ノルム」「内積」 の言葉で精密に定量化する道具を与える。
ヒストグラムは「ベクトル空間の 1 つの軸 (= 1 成分) の濃度」を表す。 ここでは人口というスカラー値 47 個を見ているが、 これは「47 県を並べた特徴ベクトル」 の 1 つの成分に当たる。 右裾の長さは「東京や大阪などごく一部が突出している」 ことを意味し、 ベクトル空間で言えば「ノルムが極端に大きい点が少数存在する」状態。 こうした分布の偏りは、 標準化 (mean=0, std=1) や log 変換などのベクトル変換で扱いやすい形へ整える対象となる。
箱ひげ図は「複数のサブベクトル集合の中心と広がり」 を並列に並べる。 地方 (北海道・東北・関東…) ごとに 1 つの箱を描けば、 関東の人口分布が他地方と比べどれほどシフトしているかが見える。 これはベクトル空間で言えば「群ごとの重心ベクトルがどこに位置し、 群内分散がどう違うか」 を視覚化していることに等しい。 LDA (線形判別分析) や群間共分散行列の議論の出発点でもある。
散布図・ヒストグラム・箱ひげ図はいずれも、 「ベクトル空間の中で点がどう分布しているか」 を別の角度から照らし出す。 散布図は 2 軸 (= 2 成分)、 ヒストグラムは 1 軸 (= 1 成分の濃度)、 箱ひげ図は群分割 (= 部分ベクトル空間の比較)。 ベクトル数学は単なる計算規則ではなく、 こうした可視化の「下に流れる共通言語」 として働く。 PCA・cos 類似度・距離計算もすべて、 この共通言語の応用問題と読める。
| 可視化 | ベクトル空間での意味 | 対応する計算 |
|---|---|---|
| 散布図 | 2 次元空間に点を配置 | 相関・共分散・PCA 第 1 主成分 |
| ヒストグラム | 1 軸の値の濃度 | 平均・分散・標準化変換 |
| 箱ひげ図 | 群ごとの分布要約 | 群内・群間分散・LDA |
統計学、 機械学習、 信号処理、 量子力学、 経済学の最適化問題、 オペレーションズ・リサーチ、 ネットワーク科学。 これらの分野はいずれも「ベクトル空間で表現された対象に演算を施す」 という共通の文法を持つ。 同じ式 $\mathbf{y} = A \mathbf{x}$ が、 ある分野では予測モデル、 別の分野では物理状態の遷移、 また別の分野では金融ポートフォリオの調整を表す。 これを **ベクトル数学の汎用性** という。
なぜ汎用なのか。 一つの答えは「線形性」 にある。 線形演算は「足し算とスカラー倍が分離できる」 という単純な構造を持つが、 これが奇跡的に多くの現象を近似する。 微小区間ではほとんどの関数が線形 (テイラー展開の一次項) に見え、 統計の中心極限定理は「独立な揺らぎを足すと正規分布になる」 という線形性の表れであり、 ニューラルネットでも各層の主役は線形変換 (行列積) で、 非線形性は要所要所の活性化関数で挿入されるだけ。
もう一つの答えは「幾何との結びつき」 にある。 ベクトルは「向き」 と「大きさ」 を持ち、 内積は「向きの一致度」 を、 ノルムは「大きさ」 を、 外積は「軸」 を表す。 これらの幾何的直感は人間の視覚と相性が良く、 計算結果を絵にできる。 PCA の第 1 主成分を矢印で描くと「データのばらつきの大方向」 が一目で分かり、 cos 類似度を円周上に描けば「方向の近さ」 が角度として見える。 抽象的な式を視覚で支えられる、 これが多くの分野でベクトル数学が共通言語になった理由だ。
SSDSE-B-2026 の 47 都道府県を題材にしても同じ。 人口・気候・経済・教育・医療など多数の指標を 1 県ずつ並べると、 各県は「高次元ベクトル」 になる。 県同士の cos 類似度を計算すれば「似た特徴を持つ県の組」 が自動抽出でき、 PCA で 2 次元に圧縮すれば「47 県マップ」 が描ける。 ベクトル数学は単なる計算技法ではなく、 「データを地理のように歩き回るためのコンパス」 として機能する。
最後に、 ベクトル数学を学ぶ際の心構えを 3 点。 第一に「計算を必ず一度は手で動かす」。 内積・ノルム・cos の計算を 2 次元・3 次元で手書きすると、 高次元に拡張しても感覚が消えない。 第二に「絵を描く」。 紙でも、 matplotlib の quiver でも、 必ず 1 度は矢印として可視化する。 第三に「実データに当てる」。 SSDSE のような公的データで「自分の県」 をベクトル化し、 他県との距離・類似度を計算する。 この三つを繰り返せば、 ベクトル数学は道具を超えて「ものの見方」 となり、 統計・機械学習・AI のあらゆる議論を地に足の着いた形で理解できるようになる。
補足として、 学習の段階別ロードマップを記す。 (a) 入門期: 2-3 次元での加法・スカラー倍・内積・ノルムを手計算で完璧に。 教科書の問題を 30 題は解く。 (b) 中級期: NumPy の `np.dot`, `np.linalg.norm`, `np.linalg.eig` を使い、 SSDSE-B-2026 で県ベクトルを構築し cos 類似度ランキングを出す。 (c) 上級期: PCA・SVD を自力で実装し、 同じ結果が scikit-learn の `PCA` クラスで出るかを比較する。 (d) 応用期: NumPy で簡易な線形回帰 ($\hat{\beta} = (X^T X)^{-1} X^T \mathbf{y}$) を実装し、 多重共線性で行列が特異になる場面を再現してみる。 各段階で「式 → 計算 → 可視化 → 解釈」 のサイクルを回すと、 ベクトル数学が抽象的な記号から「現実を読む道具」 へと変貌する。
| 分野 | ベクトル数学の使われ方 | 代表的な式 |
|---|---|---|
| 線形回帰 | 特徴量と係数の内積 | $\hat{y} = \mathbf{w} \cdot \mathbf{x} + b$ |
| PCA | 分散最大の方向ベクトルを抽出 | $C \mathbf{v} = \lambda \mathbf{v}$ |
| k-NN | 距離 (ノルム) で近傍を探索 | $d = \| \mathbf{x}_i - \mathbf{x}_j \|$ |
| TF-IDF・文書類似 | cos 類似度で文書間距離 | $\cos \theta = \frac{\mathbf{a} \cdot \mathbf{b}}{\| \mathbf{a} \| \| \mathbf{b} \|}$ |
| 深層学習 | 層ごとに行列 × ベクトル | $\mathbf{h} = \sigma(W \mathbf{x} + \mathbf{b})$ |
| 最適化 | 勾配ベクトルの逆方向に進む | $\mathbf{x} \leftarrow \mathbf{x} - \eta \nabla L$ |
| 物理 (力学) | 力・速度・加速度を 3D ベクトルで表現 | $\mathbf{F} = m \mathbf{a}$ |
| 経済・金融 | 資産配分ベクトルとリスク行列 | $\sigma_p^2 = \mathbf{w}^T \Sigma \mathbf{w}$ |
この表が示すのは「ベクトル数学を 1 つマスターすれば、 多分野の方程式を共通の文法で読める」 ことだ。 例えば $\mathbf{w} \cdot \mathbf{x}$ という形は、 線形回帰の予測値でも、 ニューラル層の前活性化でも、 ポートフォリオの期待リターンでもまったく同じ計算をしている。 違うのは「何を $\mathbf{w}$ と呼ぶか、 何を $\mathbf{x}$ と呼ぶか」 だけ。 この抽象化のメリットを実感することが、 ベクトル数学を「便利な道具」 から「世界を読む共通言語」 へ昇格させる第一歩となる。
本節ではベクトル数学の主要概念を SSDSE-B-2026 データに当てはめ、 「計算 → 解釈 → 失敗例 → 修正方針」 という流れで具体的に体験する。 数式を追うだけでなく「実データでこの式が何を意味するか」 を毎回確認することで、 ベクトル数学が現実世界とつながった生きた道具に変わる。
仮に東京都の (人口, 消費支出) ベクトルを $\mathbf{t} = (1400, 110)$ (いずれも概算の相対値) とすると、 $2 \mathbf{t} = (2800, 220)$ は「東京が 2 倍規模になった仮想都市」 と読める。 一方で $\mathbf{t} + \mathbf{k}$ (北海道 $\mathbf{k} = (520, 20)$) は「東京 + 北海道を合体させた仮想県」 のベクトル $(1920, 130)$。 加法とスカラー倍だけで「合併」 や「拡大」 が自然に表現できる。 ただし注意点として、 人口と消費支出は単位が違うので、 そのまま足すと「単位混合のスカラー」 という意味不明な量になる。 ベクトル演算は単位の整合性を自動チェックしてくれないので、 解釈する側が常に意識する必要がある。
ベクトルのノルムは「大きさの 1 軸要約」 として強力だが、 単位を揃えていないと無意味になる。 例えば $(人口, 消費支出) = (1400, 110)$ の L2 ノルムは $\sqrt{1400^2 + 110^2} \approx 1404$ だが、 これはほぼ「人口」 の値そのもの。 消費支出の影響がほとんど反映されない。 これを解消するには、 各成分を平均 0・標準偏差 1 に標準化する「z-score 変換」 を施し、 次元のないベクトルに直してからノルムを計算する。 こうすれば「人口と消費支出が等しく寄与するノルム」 が得られ、 「総合規模スコア」 として 47 県をランキングできる。 PCA の第 1 主成分スコアも、 標準化後のデータで計算するのが基本となるのはこのため。
標準化済みの東京ベクトル $\tilde{\mathbf{t}}$ と神奈川ベクトル $\tilde{\mathbf{n}}$ の内積を取れば、 「両県のプロファイル類似度」 が得られる。 内積が正で大きい → 両県は「同じ方向に偏った特徴」 を持つ (例: 人口・消費支出・出生数が揃って高い)。 一方で東京と高知の内積はほぼゼロか負になる可能性が高く、 「異質な県」 と分類できる。 cos 類似度に正規化すれば $-1 \le \cos \theta \le 1$ の範囲で直感的に解釈可能。 「47 県の cos 類似度行列」 を作ると、 47×47 の対称行列が得られ、 クラスタリングの素材となる。
SSDSE-B-2026 では「総人口」 と「日本人人口」 は強い線形関係にある (日本人人口 ≈ 総人口 × 0.98 程度)。 これは 47 県ベクトルが「総人口」 「日本人人口」 の 2 次元平面上でほぼ直線上に並ぶことを意味する。 ベクトル数学的には「線形独立性が低い」 状態。 この 2 特徴量を両方使って線形回帰すると、 行列 $X^T X$ の逆行列がほぼ存在しなくなり (=行列式がほぼ 0)、 回帰係数が不安定になる。 これが「多重共線性 (multicollinearity)」 の正体。 対処法は (i) どちらか片方だけ採用する、 (ii) Ridge 回帰で正則化する、 (iii) PCA で主成分に変換してから回帰する、 のいずれか。 すべてベクトル数学の言葉で説明できる。
SSDSE-B-2026 で 47 県を (人口, 消費支出) として散布図に描き、 線形回帰直線 $y = \beta_0 + \beta_1 x$ を引く。 この回帰直線は「47 個の観測ベクトルを、 1 次元 (直線) 部分空間に**射影**したもの」 と読み替えられる。 最小二乗法は「観測ベクトル $\mathbf{y}$ と、 説明変数の線形結合で表現できる平面 $X \boldsymbol{\beta}$ との距離 (ノルム差) を最小化する」 問題で、 答えは「$\mathbf{y}$ をその平面に正射影した点」 となる。 つまり最小二乗解の式 $\hat{\boldsymbol{\beta}} = (X^T X)^{-1} X^T \mathbf{y}$ は、 射影行列 $P = X (X^T X)^{-1} X^T$ を使って $\hat{\mathbf{y}} = P \mathbf{y}$ と書ける。 抽象的に見える式が「射影」 という幾何で生き生きと見えるのがベクトル数学の面白さ。
SSDSE-B-2026 の標準化済みデータ行列 $\tilde{X}$ から共分散行列 $C = \frac{1}{n-1} \tilde{X}^T \tilde{X}$ を作る。 これは「特徴量同士の相関構造」 を表す対称正定値行列。 $C$ の固有ベクトルは「データが最も伸びる方向」 を表し、 固有値はその方向の分散 (大きさ) を表す。 第 1 主成分 (最大固有値に対応する固有ベクトル) は「総合規模」、 第 2 主成分は「都市/地方の対比」、 第 3 主成分は「産業構造の違い」 などの解釈軸になる。 これは「47 次元データを 2-3 次元に圧縮して可視化する」 PCA の手法そのもの。 ベクトル数学の固有値理論は、 こうした「データの本質構造」 を抽出する最強の道具となる。
SVD (特異値分解) は任意の行列 $X$ を $U \Sigma V^T$ に分解する手法。 SSDSE-B-2026 の 47 × 50 (47 県 × 50 指標) のデータ行列に SVD を適用すると、 $U$ の各列は「県を特徴づけるパターン」 ($V^T$ の各行は「指標群が示す軸」)、 $\Sigma$ の対角成分はそのパターンの強さを表す。 上位数本のパターンだけ取り出せば「47 県を圧縮表現」 でき、 これがデータ圧縮・推薦システム・潜在意味解析の根幹となる。 単純な「行列の分解」 が、 実は「データに潜む構造の発見装置」 として機能するのがベクトル数学の威力。
cos 類似度は「方向の一致度」 を測るが、 「大きさ」 を捨ててしまう。 例えば東京 (1400, 110) と長野 (200, 8) の cos は両方とも「人口に対して消費支出が約 8% 弱」 という比率が近いため、 ほぼ 1 に近い値を示す。 しかし「規模感は 7 倍違う」 という事実は完全に消えてしまう。 cos 類似度だけで「東京と長野は似ている」 と結論するのは典型的な誤用。 解釈の場面では、 cos と一緒にノルム (大きさ) も併記する、 あるいは標準化を変える (例: log 変換でスケール感を縮める)、 などの工夫が必要となる。 ベクトル数学を実務で使う際は、 「何を測っていて、 何を捨てているか」 を常に意識することが重要。
SSDSE-B-2026 で 47 県を 50 指標すべてを使ってベクトル化すると、 各県は 50 次元ベクトルになる。 ここで困るのが「高次元の呪い (curse of dimensionality)」 と呼ばれる現象で、 次元が増えるほどすべての点が「ほぼ等距離」 に見えてくる。 これは「立方体の体積が、 次元が上がるとほぼすべて表面近くに集中する」 という幾何学的事実に由来する。 結果として、 50 次元での k-NN やクラスタリングは「ノイズと信号の区別がつかない」 状態に陥りやすい。 対処は (i) PCA で次元を圧縮する、 (ii) 特徴量選択で意味のある変数だけ残す、 (iii) 距離の代わりに cos 類似度を使う (角度は次元増加に対して相対的に安定)、 のいずれか。 ベクトル数学を実用する上で、 高次元の罠を知っておくことは生存戦略として必須。
A から I までを通じて、 ベクトル数学が「式を計算する技術」 ではなく「データを解釈する文法」 であることを示した。 加法・スカラー倍・ノルム・内積・cos・射影・固有値・SVD、 どれもが現実のデータ分析で出会う具体的な問題と対応している。 次のステップとしては、 (1) NumPy で SSDSE-B-2026 を読み込み、 (2) 47 × 50 の行列を作り、 (3) z-score 標準化を適用、 (4) cos 類似度行列を計算、 (5) PCA で第 1-第 3 主成分にプロット、 という一連の作業を自分の手で再現してみることを強く推奨する。 この一連の手順は、 機械学習やデータ分析の現場で「特徴量エンジニアリング → モデル化 → 可視化」 として毎日繰り返される基本動作そのもの。 ベクトル数学を学ぶことは、 結局のところ「データを見抜く目」 を養うことに他ならない。
最後に、 ベクトル数学を学んだ後に挑戦するとよい応用テーマを 5 つ挙げる。 (1) **テキスト埋め込み**: Word2Vec や BERT の埋め込みベクトルを cos 類似度で比較、 「king - man + woman ≒ queen」 を確かめる。 (2) **画像埋め込み**: CNN の中間層出力をベクトルとして取り出し、 同じカテゴリ画像同士の cos 類似度が高いことを確認する。 (3) **推薦システム**: ユーザー × アイテム行列に SVD を適用し、 行列補完による評価予測を実装する。 (4) **グラフ埋め込み**: ネットワーク上のノードをベクトル化する node2vec/DeepWalk を試し、 「似た接続パターンのノード」 を抽出する。 (5) **時系列のベクトル化**: SSDSE-B の年次データを並べて各県を「時系列ベクトル」 とし、 動的時間伸縮 (DTW) で類似県を見つける。 いずれもベクトル数学の知識があれば、 アルゴリズムの中身が「式の連なり」 として透けて見えるようになる。 抽象的な記号が現実を読む道具へと変わる、 その瞬間を体験することが本ページの最終目的である。
ここではベクトル数学を NumPy で確実に書ける形に落とし込む、 即戦力レシピを 12 個提示する。 SSDSE-B-2026 を実例に使い、 「式 → コード → 出力 → 解釈」 の流れを徹底する。 すべての例で `import numpy as np` および `import pandas as pd` が前提。 データは `pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='shift_jis', skiprows=[1])` 等で読み込まれているものとする。
SSDSE-B-2026 で「東京都の総人口・出生数・消費支出」 を取り出す。 `df.query("都道府県=='東京都'")[['総人口','出生数','消費支出(二人以上の世帯)']].values.flatten()` で 3 要素ベクトルが得られる。 NumPy 配列にすれば、 直後に加減算・スカラー倍がそのまま使える。
$\mathbf{a} - \mathbf{b}$ は `a - b` だけ。 NumPy はブロードキャストにより、 2 つのベクトルの対応成分の差を一気に計算する。 距離はこの差ベクトルのノルムを取ればよい: `np.linalg.norm(a - b)`。
L2: `np.linalg.norm(a)`、 L1: `np.linalg.norm(a, ord=1)`、 L∞ (最大絶対値): `np.linalg.norm(a, ord=np.inf)`。 標準化や正則化の理解にはこの 3 種類を使い分けられることが必須。
`np.dot(a, b)` または `a @ b`。 後者は Python 3.5+ で使える行列乗算演算子で、 内積・行列積を統一的に書ける。 大規模計算では `np.einsum` が更に高速になる場合がある。
`cos = np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))`。 一行で書ける。 sklearn なら `from sklearn.metrics.pairwise import cosine_similarity; cosine_similarity([a], [b])[0, 0]`。
`np.linalg.norm(X, axis=1)` で「47 個の県ベクトルの大きさ」 を一度に計算。 axis 引数の理解は NumPy 上達の要。
`Z = (X - X.mean(axis=0)) / X.std(axis=0)`。 列ごとに平均 0・標準偏差 1 に変換。 多変量解析の前処理として頻出。 sklearn なら `StandardScaler().fit_transform(X)`。
共分散: `np.cov(X.T)` (X が 行=サンプル 列=特徴量 の形式)。 相関: `np.corrcoef(X.T)`。 PCA の固有値分解はこの行列に対して行う。
`eigvals, eigvecs = np.linalg.eigh(C)`。 対称行列に対しては `eigh` を使う (`eig` より速く数値的に安定)。 戻り値の固有値は昇順なので、 PCA では `[::-1]` で降順に並べ替える。
`U, S, Vt = np.linalg.svd(X, full_matrices=False)`。 上位 k 個だけ残せば「低ランク近似」 で次元圧縮が完結。 推薦システムの行列補完にも応用できる。
`from scipy.spatial.distance import cdist; D = cdist(X, X)` で 47×47 のユークリッド距離行列を一気に計算。 cos 類似度行列は `1 - cdist(X, X, metric='cosine')` で得られる。 クラスタリングやヒートマップの素材として頻出。
`beta = np.linalg.solve(X.T @ X, X.T @ y)`。 教科書の式 $\hat{\boldsymbol{\beta}} = (X^T X)^{-1} X^T \mathbf{y}$ そのまま。 ただし `linalg.inv` で逆行列を直接取るより `linalg.solve` の方が数値的に安定。 多重共線性で行列が特異に近いと警告が出るので、 そのときは Ridge 回帰 (`linalg.solve(X.T @ X + alpha * I, X.T @ y)`) に切り替える。
これら 12 レシピを覚えれば、 ベクトル数学の式を見たときに「あ、 これは NumPy で 1 行だな」 と直感できるようになる。 式とコードの距離が縮まると、 学習・実装・デバッグのすべてが加速する。 ベクトル数学を「式の言語」 と「コードの言語」 の両方で扱えることが、 データサイエンティストの必須スキルとなる。
ベクトル数学は奥が深い分野だが、 4 段階に分けて積み上げれば確実に習得できる。 各段階で「式 → 手計算 → コード → 解釈」 のサイクルを回し、 SSDSE-B-2026 のような実データで自分の手を動かすことが鍵となる。
段階 1 (入門, 1 週間): 2-3 次元の手計算を完璧に。 加法・スカラー倍・内積・ノルム・cos・直交・線形独立を 30 題は紙で解く。 教科書の章末問題で十分。 ここでつまずくと後の段階すべてが弱くなる。
段階 2 (初級応用, 1-2 週間): NumPy で同じ計算を再現。 上述のレシピ 12 個を SSDSE-B-2026 に当てて、 各県の cos 類似度ランキングや距離ランキングを自分で作る。 結果が「常識と合っているか」 (例: 東京と神奈川は似ている、 北海道は孤立している) を確認することで、 計算結果の解釈眼を養う。
段階 3 (中級, 2-3 週間): PCA・SVD・線形回帰を自前実装。 sklearn の結果と比較し、 「ライブラリの中身で何が起きているか」 を理解する。 共分散行列の固有値分解、 SVD の上位 k 近似、 正規方程式の解法など、 ベクトル数学の主要定理が現実のコードとして動く瞬間を体験する。
段階 4 (上級, 継続): 高次元埋め込み (Word2Vec, BERT)、 推薦システム (行列分解)、 グラフ埋め込み (node2vec)、 時系列の動的時間伸縮など、 現代的応用へ進む。 この段階に至れば「論文を読むときの数式が、 ベクトル数学のレシピ集としてすらすら読める」 ようになり、 自分の研究や業務に独自にベクトル数学を組み込めるようになる。
この 4 段階を 1-2 ヶ月で踏破すれば、 ベクトル数学は「教科書の中の難しい記号」 から「日常使う統計・機械学習の共通文法」 に変わる。 最後に、 SSDSE-B-2026 のような身近で具体的なデータに繰り返し当てることが、 抽象を血肉に変える最良の練習法であることを強調しておく。
締めくくりの一言: ベクトル数学は、 線形代数と幾何学が出会う場であり、 統計・機械学習・物理・経済すべての「共通の母語」 である。 一度この母語を習得すれば、 分野をまたいだ書物・論文・コードを同じ眼差しで読めるようになり、 自分の思考の幅が大きく広がる。 SSDSE-B-2026 のような身近な公的データを使って、 日々少しずつでもベクトル演算を実践することが、 この母語を「読み書きできる」 状態に保つ最良の方法となる。 学習に終わりはないが、 毎日 10 分でもベクトルに触れていれば、 半年後には世界の見え方が確実に変わっている。
最後の補足として、 学習者がよく抱える疑問への短い回答を 3 つ示す。 (1) 「行列とベクトルの違いは?」 — ベクトルは「1 次元の数列」、 行列は「2 次元の数表」 と覚える。 形式的にはベクトルは n×1 (列ベクトル) または 1×n (行ベクトル) の行列の特殊形。 (2) 「内積と外積はどう違う?」 — 内積は 2 つのベクトルから 1 つのスカラーを返す (向きの一致度)、 外積は 2 つの 3 次元ベクトルから 1 つの 3 次元ベクトルを返す (両者に垂直な軸)。 統計・機械学習では内積が主役、 物理では外積も重要。 (3) 「PCA と SVD はどう違う?」 — PCA は共分散行列の固有値分解、 SVD は元データ行列の特異値分解。 中心化済みデータに対しては両者は本質的に同じ結果を出す。 SVD のほうが数値的に安定で、 実装ではこちらが主流。 こうした素朴な疑問を 1 つずつ潰しながら学べば、 ベクトル数学は確実に身につく。
補足: 学習を加速するための副教材として、 (a) 線形代数の名著 (Gilbert Strang『Linear Algebra and Its Applications』、 永田雅宜『線型代数学』 など)、 (b) MIT OCW 18.06 の動画講義、 (c) 3Blue1Brown の「Essence of Linear Algebra」 シリーズ (YouTube, 14 本) を強く推奨する。 特に 3Blue1Brown の可視化は、 ベクトル空間・行列変換・固有値・SVD の幾何的意味を直感的に伝える稀有な教材で、 抽象的な記号を視覚的なアニメーションに変換してくれる。 また Python での実装練習には Jupyter Notebook + NumPy + matplotlib の組み合わせが最適で、 計算結果をすぐにグラフに反映できるため、 「式 → 数値 → 図」 のフィードバックループを短く保てる。 SSDSE-B-2026 や e-Stat の公的データを題材にすれば、 現実感のある問題で楽しく演習を進められる。 こうした多角的なリソースを併用することで、 ベクトル数学は「教科書の難解な分野」 から「自分の道具箱の中の頼れる相棒」 へと変貌する。
(n,) と 2 次元 (n,1) の挙動が違う。 行列積を含む計算では v.reshape(-1, 1) で揃える。StandardScaler。reshape 確認必須。ベクトルから始まる線形代数のロードマップ。 矢印 → 行列 → 分解 → 機械学習へと階段を上がっていきます。
[スカラー] → [ベクトル] → [行列] → [テンソル]
│
├─ 内積・ノルム → 類似度・距離 → クラスタリング
├─ 線形結合 → 基底・部分空間 → 次元削減 (PCA)
├─ 射影 → 回帰 (最小二乗) → 機械学習
└─ 距離指標 → k-NN / k-means → 推薦・分類
学習順序の推奨:
metrics.pairwise で距離尺度を比較。ベクトル演算は機械学習・統計の数学的基盤として、 ほぼ全手法と接続する。
SSDSE-B-2026 で「47 都道府県を 100 次元の特徴量ベクトルとして表現」し、 ベクトル間距離 / 内積で類似県を発見する分析が典型的応用。 全機械学習はこの「データ点 = ベクトル」表現の上に成り立つ。
ベクトル演算は目的別に異なる演算を選ぶ。 以下の指針で判断する。
SSDSE-B-2026 (47 県 × 100 列) では「コサイン類似度で類似県発見」「PCA で経済構造の主軸抽出」が代表的な使い方となる。
ベクトルの本質は 「大きさ (ノルム)」と「向き (単位ベクトル)」の 2 情報に分解できる点にあります。 成分表示 $v=(v_1,\ldots,v_n)$ は座標にすぎず、 意味を持つのは 加算・スカラー倍・内積・ノルム の 4 演算です。 データ分析では 1 行 = 1 特徴量ベクトルと読み替え、 内積は「射影の長さ × 相手のノルム」= 類似度、 ノルムは「原点からの隔たり」= 特異さ、 として働きます。
この「大きさと向きは別物」という感覚を、 SSDSE-B-2026(2023 年度・47 都道府県・全 109 数値列を平均 0・分散 1 に標準化, ddof=0)の 実測値で確かめます。 下表の数値はすべて実データから計算したもの(合成ではありません)。
| 測る量 | 実測値 | 読み方 |
|---|---|---|
| ‖東京‖ (標準化・109 次元) | 42.86 | 全県で最大 = 最も「特異」な県 |
| ‖広島‖ (同) | 3.16 | 全県で最小 = 最も「平均的」な県 |
| cos(東京, 神奈川) | +0.876 | 向きが近い = プロフィールの型が似る |
| cos(東京, 沖縄) | −0.274 | 向きがほぼ直交〜逆 = 異質な型 |
| cos(鳥取, 島根) | +0.912 | 過疎県どうし、 型が酷似 |
| L2 距離 東京−鳥取 | 49.91 | 大きさの隔たりが大 = 遠い点 |
| L2 距離 鳥取−島根 | 3.47 | 大きさも向きも近い = 隣り合う点 |
💡 ‖東京‖=42.86 と大きいのに cos(東京,神奈川)=0.876 で「向きは神奈川に近い」。 ノルム(規模)と cos(向き)は独立の情報であることが、 実測で確認できます。 ページ上部の 🎮 触って理解する ウィジェットで a を伸ばしても向きが変わらない挙動と、 同じ事実の裏表です。
既存の ⚠️ よくある落とし穴 を補強し、 とくに事故が多い 6 点を実測とともに整理します。
内積 $a\cdot b=\sum_i a_i b_i$ は スカラー 1 個、 アダマール積 $a\odot b=(a_1b_1,\ldots,a_nb_n)$ は ベクトル。 NumPy では a @ b(内積)と a * b(要素積)が別物です。 実例:2023 年度の人口ベクトルと出生数ベクトルの 要素積 は長さ 47 のベクトルで、 その総和が内積 $\approx 4.12\times10^{12}$ に一致します。 コサイン類似度や距離で * を使う取り違えは頻出バグ。「内積は掛けて足すまでがワンセット」。
次元が増えると、 任意 2 点の距離差が相対的に潰れて「みんな等距離」に見えます。 SSDSE-B-2026 標準化データで、 先頭 $k$ 列だけを使った 47 県ペア距離の 相対コントラスト $(d_\max-d_\min)/d_\min$ を実測すると、 次元とともに急落します(下表・実測値)。
| 使用次元 k | (d_max − d_min)/d_min | 平均ペア距離 |
|---|---|---|
| 1 | 13548 | 0.92 |
| 2 | 2004 | 1.30 |
| 5 | 2187 | 2.07 |
| 20 | 170 | 4.49 |
| 109 | 15.6 | 11.85 |
コントラストが 13548 → 15.6 へと 3 桁縮小。「近い/遠い」の差が薄れるため、 高次元では PCA や 次元削減 で圧縮してから距離を測る、 あるいは向きに頑健な コサイン類似度 を使うのが安全です。
単位が桁違いの成分(人口 $10^6$ と出生率 0.01)を素のまま内積・距離に入れると、 大スケール成分が支配します。 実測でも 生データの cos(人口,出生数)=0.997 は「ほぼ人口が全部説明」しているだけで、 情報としては貧弱。 平均を引いて 標準化 すると相関 0.995 として意味づけできます。 コサイン類似度は原理上ノルムで割って大きさを打ち消しますが、 1 成分が極端に大きいと方向自体がその成分に支配されるため、 やはり事前の標準化が安全です。
内積は可換 $a\cdot b=b\cdot a$ ですが、 3D の外積は 反可換 $a\times b=-\,(b\times a)$。 行列・テンソル積の順序も入れ替え不可。「演算をひっくり返しても同じ」という直感は内積・和だけの性質だと切り分けます。
$\mathbf{0}$ は大きさ 0・向きなし。 単位化 $v/\lVert v\rVert$ や cos 類似度は分母が 0 になり inf/nan を返します。 標準化後に全成分が平均どおりの「完全に平均的な県」が現れた場合や、 定数列を含む場合に潜みます。 if np.linalg.norm(v) > 0: で必ずガードを。
同じ「大きさ」でも L1/L2/L∞ で値は大きく異なります。 実測:標準化した東京ベクトルは L1=420.8、 L2=42.86、 L∞=6.26。 外れ値に頑健なら L1、 幾何的な直線距離なら L2、 最悪成分の抑制なら L∞。 正則化(Lasso=L1 / Ridge=L2)の選択基準と同じ発想です。
ベクトルの 4 演算は、 統計・機械学習の主要手法へ一本道でつながります。 要点を「橋渡し」として圧縮します。
この一本道を SSDSE-B-2026 で辿ると、 47 県ベクトル → cos で類似県 → 共分散の固有ベクトルで主軸 → 2D 埋め込みで俯瞰、 という流れがそのまま「多次元データを読む標準手順」になります。
ベクトルの数学から枝分かれする用語ページへのリンク集(すべて本用語集内に実在)。
※「線形代数」全体をまとめた専用ページは本用語集には未収録のため、 個別ページ(上記の行列・固有値・内積など)を辿ってください。