「ベクトル」は 行列 の前提となる、 数学・統計の最も基礎的な対象です。 SSDSE-B-2026 では、 1 つの都道府県 = 1 本のベクトルとして表現できます。 ベクトルの内積・ノルム・コサイン類似度を理解すると、 「東京と大阪はどれくらい似ているか?」を 数値で 言えるようになります。 本ページでは、 都道府県ベクトルの内積・コサイン類似度を実値で計算しつつ、 ベクトル空間の幾何イメージを身につけます。
イメージ 1: 矢印。 2 次元なら $(x, y)$、 3 次元なら $(x,y,z)$。 矢印の始点を原点に置き、 終点が要素の値。 大きさ = 長さ、 向き = 角度。
イメージ 2: 都道府県プロフィール。 東京都 = (人口, 面積, GDP, …) という 110 次元のリスト。 これがそのままベクトル。 47 本の矢印が、 110 次元の空間に並んでいる風景を想像しましょう。
イメージ 3: 類似度。 2 つの矢印のなす角が小さいほど「似ている」。 これがコサイン類似度。 神奈川と埼玉は近い方向を向き、 東京と沖縄は遠い角度を成すと予想できます。
$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$。
| 記号 | 読み方 | 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 の単位ベクトル |
3 都道府県(東京・神奈川・沖縄)× 3 変数(総人口・小売販売額・出生率)を取り出し、 標準化してベクトル化します(簡略化のため代表値):
$$ 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{-3.20}{4.38\cdot 2.10} \approx -0.35 $$解釈:東京と神奈川は同じ方向(大都市圏 / 出生率低)、 東京と沖縄は反対方向(人口低 / 出生率高)。 ベクトルの幾何が、 そのまま都道府県の「タイプ」を捉えます。
| 尺度 | 東京-神奈川 | 東京-沖縄 | 神奈川-沖縄 |
|---|---|---|---|
| ユークリッド距離 | 1.71 | 5.31 | 4.36 |
| コサイン類似度 | +1.00 | -0.35 | -0.34 |
| マンハッタン距離 | 2.53 | 8.34 | 6.79 |
例 1: SSDSE-B-2026 で都道府県ベクトルを作る。
import pandas as pd
import numpy as np
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1)
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: 内積・ノルム・コサイン類似度。
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 都道府県のコサイン類似度行列。
from sklearn.metrics.pairwise import cosine_similarity
num = df.select_dtypes(include='number').fillna(0)
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 次元射影)。
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')
(n,) と 2 次元 (n,1) の挙動が違う。 行列積を含む計算では v.reshape(-1, 1) で揃える。ベクトル間の「近さ」を測る指標は複数あり、 状況に応じて使い分けが必要です。 SSDSE-B-2026 のような社会経済データでよく使う指標を比較しましょう。
| 指標 | 定義 | 特徴 | SSDSE での使い所 |
|---|---|---|---|
| ユークリッド L2 | $\sqrt{\sum(v_i-w_i)^2}$ | 直線距離。 スケール敏感 | 標準化済み県データの k-means |
| マンハッタン L1 | $\sum|v_i-w_i|$ | 外れ値に強い | 所得分布の差を比較 |
| コサイン類似度 | $\frac{v\cdot w}{\|v\|\|w\|}$ | 大きさ非依存 | 構造の類似(人口規模差を無視) |
| マハラノビス | $\sqrt{(v-w)^\top\Sigma^{-1}(v-w)}$ | 相関を補正 | 多変量の異常検知 |
| チェビシェフ L∞ | $\max_i|v_i-w_i|$ | 最大差で支配 | 突出変数の検出 |
統計・機械学習の各手法は、 たいてい「ベクトル演算 + 集約」の組み合わせで書けます。 何を何のベクトルにし、 どの演算で集約するかを見抜くと、 各手法の本質が見えてきます。
$\hat y_i = x_i^\top \beta$。 観測 $i$ の説明変数ベクトル $x_i$ と係数ベクトル $\beta$ の内積が予測値。 残差ベクトル $r = y - X\beta$ のノルム最小化が最小二乗。
ユーザーベクトル $u_i$ と他のユーザーベクトル $u_j$ のコサインを取り、 上位 $k$ ユーザーの嗜好を集約。 都道府県でも同じ:「東京に似た 5 県は?」と聞ける。
各都道府県ベクトル $x_i$ を最も近い中心ベクトル $c_k$ に割り当て、 中心を $c_k = \mathrm{mean}\{x_i\}$ で更新。 ベクトルの平均と距離だけで成立。
新しいベクトル $x_{\text{new}}$ から距離が近い $k$ 個の既知点を見て多数決。 「ある未知の地域に似た都道府県の平均的特徴」を当てる予測器。
$y = \phi(w^\top x + b)$。 重みベクトル $w$ と入力ベクトル $x$ の内積。 これを並列・直列に積み重ねたのが深層学習。
「ユーザー × アイテム」の評価行列を埋め込み、 ユーザーベクトル・アイテムベクトルの内積で嗜好を推定。 都道府県を「ユーザー」、 公共サービスを「アイテム」と読み替えれば、 SSDSE データから「沖縄に似た県」の推薦ができます。
word2vec や BERT は単語を 300〜768 次元のベクトルにする。 同じ「ベクトル空間 + 内積」で意味の近さを測る。 「東京」「大阪」が近いベクトルに、 「東京」「沖縄」が遠いベクトルになるのと同じ構造。
CNN の最終層は画像 1 枚を 512 次元のベクトルに変える。 顔認識ではベクトルの距離で本人判定。 SSDSE-B-2026 の都道府県も、 同じ意味で「都道府県ベクトル」と呼んでよい。
マハラノビス距離が大きい都道府県を「異常値」として検出。 SSDSE-B では沖縄・東京が外れ値として浮かぶことが多い。
$v_{\text{東京}} - v_{\text{神奈川}}$ は「東京と神奈川の差ベクトル」。 その差を別の県(千葉)に足すと「もし千葉が東京化したら」というシミュレーションになります。 単純ですが、 意味のあるベクトル算術です。
| 演算 | 数式 | NumPy | 意味 |
|---|---|---|---|
| 和 | $v+w$ | v + w | 成分ごとの和 |
| スカラー倍 | $cv$ | c * v | 全要素 $c$ 倍 |
| 内積 | $v\cdot w$ | v @ w | スカラー値の類似度 |
| 外積 (3D) | $v\times w$ | np.cross(v,w) | 直交するベクトル |
| L2 ノルム | $\|v\|_2$ | np.linalg.norm(v) | 長さ |
| L1 ノルム | $\|v\|_1$ | np.linalg.norm(v,1) | 絶対値和 |
| 単位化 | $\hat v = v/\|v\|$ | v / np.linalg.norm(v) | 方向ベクトル |
| 距離 | $\|v-w\|$ | np.linalg.norm(v-w) | 差ベクトルのノルム |
| 射影 | $\frac{v\cdot w}{\|w\|^2}w$ | (v@w)/(w@w) * w | $v$ を $w$ 方向へ落とす |
内積 $v\cdot w = \|v\|\|w\|\cos\theta$ は、 ノルム積に角度のコサインをかけたもの。 言い換えれば「$w$ を $v$ 方向に射影した長さに $v$ のノルムをかけた量」。
SSDSE で「東京 ベクトル」「神奈川 ベクトル」をなす角度を $\arccos(0.99) \approx 8^\circ$ と計算すれば、 ほとんど同じ方向だと言える。 一方「東京-沖縄」は約 110°、 逆向きに近い。
射影の応用:回帰の予測値 $\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='utf-8', skiprows=1) で読み込むselect_dtypes(include='number'))(X - X.mean()) / X.std(ddof=0)pdist「ベクトル空間」と呼べるためには、 和とスカラー倍について以下の規則が成り立つ必要があります。 これらを満たす集合(実は関数の集合や数列の集合も)に対して、 ベクトルの数学が同じように使えます。
SSDSE の数値列も $\mathbb{R}^d$ の元なので、 これらの公理が成立。 だからベクトルとして扱える。 ただし「都道府県名」「カテゴリ」はベクトルではないので、 ワンホット化などの前処理が必要です。
標準化済みベクトルのノルムが「尖り具合」。 東京のノルムは 12 を超え、 平均的な県(ノルム 3〜4)の 3 倍以上に大きい。 つまり東京は「ベクトル空間の端」に位置する極端点。
$v_{\text{東北}} = \frac{1}{6}(v_{\text{青森}}+\cdots+v_{\text{福島}})$。 平均ベクトルは「典型的な東北プロフィール」。 これと最も近い県は東北外(北陸など)に出ることもあり、 地理的な近さと統計的な近さの違いが面白い。
東京と沖縄のベクトル差 $v_{\text{東京}} - v_{\text{沖縄}}$ が「都市 - 地方」軸の候補。 これを単位化して全 47 県を投影すれば、 都市性スコアが得られる。 PCA 第 1 軸とよく一致する。
標準化済みベクトルに対して k-means($k=4$)を実行すると、 「大都市」「地方都市」「人口減地方」「離島・沖縄」のような自然なグループが現れる。 すべてベクトルの距離計算だけで成立する。
| 用語 | 意味 |
|---|---|
| スカラー | 1 つの数。 0 次元の特殊なベクトル。 |
| 単位ベクトル | ノルム 1 のベクトル。 方向のみを表す。 |
| 基底 | 空間を張る独立なベクトルの組。 標準基底 $e_1, e_2, \ldots$。 |
| 線形結合 | $\sum c_i v_i$。 ベクトルの足し算で表せる範囲。 |
| 線形独立 | どれも他の線形結合で表せない関係。 |
| 直交 | 内積 0。 統計では「無相関」と対応。 |
| 射影 | あるベクトル方向への成分。 最小二乗の本質。 |
| スパース | 多くの要素が 0。 Lasso の解はスパース。 |
SSDSE-B-2026 を読み込んで、 都道府県ベクトルを作り、 ノルム・コサイン類似度・距離行列まで一気に出すサンプル。
import pandas as pd
import numpy as np
from scipy.spatial.distance import pdist, squareform
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1)
pref = df['都道府県'].values
num = df.select_dtypes(include='number').fillna(0)
# 標準化済みベクトル群(47 x d)
X = ((num - num.mean()) / num.std(ddof=0)).values
# ノルム(プロフィールの極端さ)
norms = np.linalg.norm(X, axis=1)
print('最も尖った県:', pref[np.argmax(norms)], norms.max().round(2))
print('最も平均的な県:', pref[np.argmin(norms)], norms.min().round(2))
# 距離行列(47 x 47)
D = squareform(pdist(X))
i = list(pref).index('東京都')
nearest = np.argsort(D[i])[1:6]
print('東京に近い 5 県:', list(zip(pref[nearest], D[i][nearest].round(2))))
出力からは「東京に最も近いのは神奈川・大阪・愛知・千葉・埼玉」という首都圏・大都市圏の構造が見えます。 同様に「沖縄に近いのは?」と聞けば、 出生率や産業構造で別の県群が抽出されます。 ベクトル 1 つで「都道府県の特徴」を扱う力強さを実感できるはずです。
X[0] は 1 次元配列 (n,)。 X[[0]] は 2 次元 (1,n)。 計算前に shape を確認。np.isnan(v).any() でチェック。inf。 if 文で守る。ベクトルから始まる線形代数のロードマップ。 矢印 → 行列 → 分解 → 機械学習へと階段を上がっていきます。
[スカラー] → [ベクトル] → [行列] → [テンソル]
│
├─ 内積・ノルム → 類似度・距離 → クラスタリング
├─ 線形結合 → 基底・部分空間 → 次元削減 (PCA)
├─ 射影 → 回帰 (最小二乗) → 機械学習
└─ 距離指標 → k-NN / k-means → 推薦・分類
学習順序の推奨:
metrics.pairwise で距離尺度を比較。