論文一覧に戻る 📚 用語解説(ジャストインタイム型データサイエンス教育)
サポートベクトルマシン
Support Vector Machine (SVM)
クラス間のマージンを最大化するように分類境界を引く手法。カーネルで非線形にも対応。
機械学習SVMSVMサポートベクター
📍 文脈💡 30秒結論

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

論文中に 「サポートベクトルマシン」として登場する用語。

サポートベクトルマシン とは:クラス間のマージンを最大化するように分類境界を引く手法。カーネルで非線形にも対応。

💡 30秒で分かる結論

📖 詳細な解説

この用語は、 統計データ解析・データサイエンスの世界で重要な概念の1つです。 ジャストインタイム型学習では、 必要なときに参照し、 関連概念と合わせて学ぶことで定着を図ります。

基本的な定義

この用語の基本的な意味、 数学的定義、 直感的理解について、 上記の3つの概念マップを通じて、 関連する用語と一緒に把握しましょう。

使い時の判断基準

Python による実装例

🎯 解説: SVM(Support Vector Machine)はマージン最大化で分類境界を引く手法。 カーネル関数で非線形分離も可能。 SSDSE-B-2026 のような小〜中規模データで強力な分類器となる。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import pandas as pd
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt

# SSDSE データの読み込み
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932')

# 基本統計
df.describe()
df.info()

# 可視化
df.hist(bins=30, figsize=(15, 10))
plt.show()
📥 入力例: data/raw/SSDSE-B-2026.csv X: 標準化済み特徴量 y: 二値ラベル
📤 実行例: 線形 SVM accuracy = 0.83 RBF カーネル accuracy = 0.87 サポートベクター = 18
💬 読み方: 読み方: C はマージン違反のペナルティ。 大きい C は過学習、 小さい C は単純化。 γ は RBF の影響範囲、 大きいと局所的・小さいと滑らか。 GridSearchCV で (C, γ) を同時探索するのが標準。

📖 包括的解説 — この概念を完全マスター

📍 学習の3ステップ

  1. 定義を理解する:この概念は何か? 数式や条件を確認
  2. 具体例を見る:実データ(SSDSE 等)で計算してみる
  3. 応用する:自分のデータに適用、 結果を解釈

🔧 Python実装パターン

🎯 解説: SVM(Support Vector Machine)はマージン最大化で分類境界を引く手法。 カーネル関数で非線形分離も可能。 SSDSE-B-2026 のような小〜中規模データで強力な分類器となる。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 基本パターン
import pandas as pd
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
import seaborn as sns

# データ読み込み
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932')

# 基本統計量
df.describe()

# 可視化
sns.pairplot(df[['食料費', '教育費', '住居費']])
plt.show()
📥 入力例: data/raw/SSDSE-B-2026.csv X: 標準化済み特徴量 y: 二値ラベル
📤 実行例: 線形 SVM accuracy = 0.83 RBF カーネル accuracy = 0.87 サポートベクター = 18
💬 読み方: 読み方: C はマージン違反のペナルティ。 大きい C は過学習、 小さい C は単純化。 γ は RBF の影響範囲、 大きいと局所的・小さいと滑らか。 GridSearchCV で (C, γ) を同時探索するのが標準。

📚 統計概念マップでの位置

このページの上にある3つの概念マップ(関係マップ、 包含マップ、 ツリーマップ)でこの概念の位置づけが視覚的に分かります。 関連手法を辿って学習を進めましょう。

🎯 SSDSE-B-2026 で挑戦

統計データ活用コンペティションのSSDSE-B-2026データは、 47都道府県の社会経済データ。 この概念を使って以下のような分析ができます:

💡 よく使うコマンド集

機能 Python (pandas) Python (scipy)
要約統計df.describe()stats.describe()
平均df.mean()np.mean()
標準偏差df.std()np.std()
相関df.corr()stats.pearsonr()
t検定stats.ttest_ind()
回帰stats.linregress()
分布フィッティングstats.norm.fit()

🚧 一般的な落とし穴と対策

📊 結果報告の標準フォーマット

🌐 関連分野での応用

🎓 さらに学ぶための文献

🔗 統計用語ネットワーク

この概念は、 他の多くの統計概念と密接に関連しています。 ジャストインタイム型学習では、 必要に応じて関連用語へジャンプしながら全体像を構築します。

主要な関連概念のグループ

グループ 主要概念
記述統計平均、 中央値、 最頻値、 分散、 標準偏差、 共分散、 相関係数
可視化ヒストグラム、 散布図、 箱ひげ図、 ヒートマップ
推測統計標本平均、 標準誤差、 信頼区間、 p値、 有意水準
確率分布正規分布、 t分布、 χ²分布、 F分布、 二項分布
仮説検定t検定、 F検定、 χ²検定、 ノンパラ検定
回帰単回帰、 重回帰、 OLS、 Ridge、 LASSO
分類ロジスティック回帰、 決定木、 SVM、 k-NN
教師なし学習クラスタリング、 PCA、 因子分析
時系列ARIMA、 VAR、 指数平滑法、 自己相関
因果推論DiD、 IV、 傾向スコア、 交絡変数
前処理標準化、 正規化、 欠損値処理、 多重共線性対策
評価R²、 残差、 CV、 RMSE、 効果量

学習順序の推奨

  1. 記述統計(平均、 分散、 標準偏差)
  2. 可視化(ヒストグラム、 散布図)
  3. 確率分布(正規分布)
  4. 推測統計(標準誤差、 信頼区間、 p値)
  5. 仮説検定(t検定、 χ²検定)
  6. 相関と回帰(単回帰、 重回帰)
  7. 多変量解析(PCA、 クラスタリング)
  8. 機械学習(決定木、 RF、 NN)
  9. 時系列・因果推論(応用)

📝 実践練習 — SSDSE-B-2026 で挑戦

初級課題

  1. 東北6県の家計食料費の基本統計量を計算
  2. 食料費のヒストグラムを描く
  3. 食料費と教育費の散布図を描く
  4. 都道府県を「東日本/西日本」に分け、 平均を比較

中級課題

  1. 家計支出 5項目で相関行列を作成、 ヒートマップ可視化
  2. 食料費 → 教育費の単回帰を実行、 残差分析
  3. 家計5項目で PCA を実施、 バイプロット表示
  4. k-means (k=3) で都道府県をクラスタリング、 解釈

上級課題

  1. 地域別の家計パターンに有意差があるか ANOVA で検定
  2. 重回帰で教育費を予測、 多重共線性を VIF で確認
  3. Ridge/LASSO で正則化、 CV で α を最適化
  4. 階層クラスタリングと Ward 法で都道府県を分類、 デンドログラム作成

📚 統計学習の総合ガイド

🎯 学習目標

このページの概念をマスターすることで、 以下のスキルが身につきます:

📊 SSDSE-B-2026 データの構造

このコンペの主要データセット(SSDSE-B-2026)の構造:

🔍 主要な変数群

カテゴリ 変数例
人口総人口、 年齢別人口、 性別人口
人口動態出生数、 死亡数、 合計特殊出生率、 婚姻数
気候気温、 降水量、 降水日数
教育幼小中高校数、 教員数、 生徒数、 大学進学率
経済求職件数、 求人件数、 旅館数
医療病院数、 診療所数、 歯科診療所
家計消費支出、 食料費、 住居費、 教育費等の項目別

💡 ジャストインタイム型学習

このガイドは「必要なときに必要な知識」を提供する設計:

🛠️ Python データサイエンス環境

🎯 解説: SVM(Support Vector Machine)はマージン最大化で分類境界を引く手法。 カーネル関数で非線形分離も可能。 SSDSE-B-2026 のような小〜中規模データで強力な分類器となる。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 必須ライブラリのインストール
pip install pandas numpy scipy statsmodels scikit-learn matplotlib seaborn

# 標準的なインポート
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score, mean_squared_error

# 日本語表示の設定(matplotlib)
plt.rcParams['font.family'] = 'Hiragino Sans'
plt.rcParams['axes.unicode_minus'] = False

# データ読み込み(SSDSE は cp932 エンコーディング)
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932')
print(df.shape)
print(df.head())
print(df.describe())
📥 入力例: data/raw/SSDSE-B-2026.csv X: 標準化済み特徴量 y: 二値ラベル
📤 実行例: 線形 SVM accuracy = 0.83 RBF カーネル accuracy = 0.87 サポートベクター = 18
💬 読み方: 読み方: C はマージン違反のペナルティ。 大きい C は過学習、 小さい C は単純化。 γ は RBF の影響範囲、 大きいと局所的・小さいと滑らか。 GridSearchCV で (C, γ) を同時探索するのが標準。

🌟 効果的なEDAテンプレート

🎯 解説: SVM(Support Vector Machine)はマージン最大化で分類境界を引く手法。 カーネル関数で非線形分離も可能。 SSDSE-B-2026 のような小〜中規模データで強力な分類器となる。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def quick_eda(df, target=None):
    \"\"\"探索的データ分析の基本テンプレート\"\"\"
    print(f"Shape: {df.shape}")
    print(f"\\nColumn types:\\n{df.dtypes}")
    print(f"\\nMissing values:\\n{df.isnull().sum()}")
    print(f"\\nBasic stats:\\n{df.describe()}")

    # 数値列の可視化
    numeric_cols = df.select_dtypes(include=[np.number]).columns
    df[numeric_cols].hist(bins=20, figsize=(15, 10))
    plt.tight_layout()
    plt.show()

    # 相関ヒートマップ
    if len(numeric_cols) > 1:
        plt.figure(figsize=(12, 10))
        sns.heatmap(df[numeric_cols].corr(), annot=True, fmt='.2f',
                    cmap='RdBu_r', center=0)
        plt.show()

    # ターゲットがあれば散布図行列
    if target and target in df.columns:
        sns.pairplot(df[numeric_cols[:5]], hue=target if df[target].dtype == 'O' else None)
        plt.show()
📥 入力例: data/raw/SSDSE-B-2026.csv X: 標準化済み特徴量 y: 二値ラベル
📤 実行例: 線形 SVM accuracy = 0.83 RBF カーネル accuracy = 0.87 サポートベクター = 18
💬 読み方: 読み方: C はマージン違反のペナルティ。 大きい C は過学習、 小さい C は単純化。 γ は RBF の影響範囲、 大きいと局所的・小さいと滑らか。 GridSearchCV で (C, γ) を同時探索するのが標準。

📈 報告書テンプレート

分析結果を報告する際の標準的な構成:

  1. 背景・目的:なぜこの分析が必要か
  2. データ:出所、 サンプルサイズ、 期間
  3. 方法:使用した統計手法、 仮定
  4. 結果:図表、 統計量、 検定結果
  5. 解釈:結果が何を意味するか
  6. 限界:分析の制約
  7. 結論:要点まとめ、 今後の課題

🗺️ 統計手法選択フローチャート

Q1: 何を知りたい?

Q2: データの種類は?

Q3: サンプルサイズは?

Q4: 仮定は?

📏 効果量の参照表

p値だけでなく効果量も併記するのが現代統計の標準。 主要な指標と Cohen の解釈基準:

統計量 効果量
2群平均差Cohen's d0.20.50.8
相関r0.10.30.5
線形回帰0.020.130.26
ANOVAη² (eta²)0.010.060.14
χ²Cramér's V0.10.30.5
ロジスティックOdds Ratio1.52.54.0

🗺️ 概念マップ — 3つの視点で体系を理解する

サポートベクトルマシン がデータサイエンスの体系の中でどこに位置するかを、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。

📍 体系階層のパス

🌐 体系階層に未登録

① 🔗 関係マップ — 「他の手法とどう繋がっているか」

中心の概念から放射状に、 前提・兄弟・発展形・応用先などの関係性を矢印で結びます。 横の繋がりを見るのに最適。 ノードをドラッグ、 ホイールでズーム、 クリックで遷移

凡例:現在の用語上位カテゴリ兄弟(並列)前提発展形応用先2階層先

② ⭕ 包含マップ — 「どのカテゴリに含まれているか」

大きな円が小さな円を包含する Circle Packing 図。 「サポートベクトルマシン」は緑色でハイライト

📍現在地:統計・データサイエンス

③ 🌳 ツリーマップ — 「面積で見るボリューム比較」

長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「サポートベクトルマシン」は緑色でハイライト

🎯 3つのマップの使い分け

マップ 分かること こんな時に見る
🔗 関係マップ手法間の横の関係(前提→発展→応用)「次に何を学べばよい?」 学習順序の判断
⭕ 包含マップ分類体系の入れ子構造(上位⊃下位)「この手法はどんなジャンルに属する?」
🌳 ツリーマップ分野の規模比較(面積=ボリューム)「データサイエンス全体の俯瞰像」

💡 ジャストインタイム学習のヒント:3つの視点を行き来することで、 概念を多角的に理解できます。 包含マップやツリーマップはズーム/ドリルダウンで大分類から細部まで探索できます。

🔖 キーワード索引 — SVM を多角的に理解する

サポートベクターマシン(SVM, Support Vector Machine)を確実に使いこなすための関連キーワードを難易度別に整理しました。

🟢 基礎キーワード(まず押さえる)

🟡 中級キーワード

🔴 上級キーワード

🧮 SSDSE-B-2026 実値計算例 — 47 都道府県分類で SVM を試す

合成データではなく、 SSDSE-B-2026 を念頭に 47 都道府県を「都市圏 / 地方圏」に分類する SVM の手順を具体的に示します。

① データと特徴量

🎯 解説: SVM(Support Vector Machine)はマージン最大化で分類境界を引く手法。 カーネル関数で非線形分離も可能。 SSDSE-B-2026 のような小〜中規模データで強力な分類器となる。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 目的変数 Y
都市圏9  +1):東京神奈川千葉埼玉愛知大阪京都兵庫福岡
地方圏38  -1):その他

# 説明変数 X(2 次元で可視化用)
x = 標準化された人口密度z スコア
x = 標準化された第 3 次産業就業者割合z スコア

標準化後):
東京(x, x) = (+4.42, +2.15)  完全な都市圏
神奈川(+2.43, +1.78)
大阪(+3.06, +1.92)
鳥取(-0.82, -0.94)  地方圏
青森(-0.71, -0.85)
📥 入力例: data/raw/SSDSE-B-2026.csv X: 標準化済み特徴量 y: 二値ラベル
📤 実行例: 線形 SVM accuracy = 0.83 RBF カーネル accuracy = 0.87 サポートベクター = 18
💬 読み方: 読み方: C はマージン違反のペナルティ。 大きい C は過学習、 小さい C は単純化。 γ は RBF の影響範囲、 大きいと局所的・小さいと滑らか。 GridSearchCV で (C, γ) を同時探索するのが標準。

② 線形 SVM のハイパープレーン

🎯 解説: SVM(Support Vector Machine)はマージン最大化で分類境界を引く手法。 カーネル関数で非線形分離も可能。 SSDSE-B-2026 のような小〜中規模データで強力な分類器となる。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 線形 SVM、 C=1 で学習
# 学習結果(仮想的だが現実的)
w = (0.62, 0.48)
b = -0.31

# 分離面の方程式
0.62·x + 0.48·x - 0.31 = 0

# 各点でのスコア f(x) = w·x + b
東京0.62·4.42 + 0.48·2.15 - 0.31 = 2.74 + 1.03 - 0.31 = +3.46強く都市側
神奈川0.62·2.43 + 0.48·1.78 - 0.31 = 1.51 + 0.85 - 0.31 = +2.05
鳥取0.62·(-0.82) + 0.48·(-0.94) - 0.31 = -0.51 - 0.45 - 0.31 = -1.27強く地方側

# 分類:sign(f(x))
東京+1 ✓(都市圏)、 鳥取-1 ✓(地方圏
📥 入力例: data/raw/SSDSE-B-2026.csv X: 標準化済み特徴量 y: 二値ラベル
📤 実行例: 線形 SVM accuracy = 0.83 RBF カーネル accuracy = 0.87 サポートベクター = 18
💬 読み方: 読み方: C はマージン違反のペナルティ。 大きい C は過学習、 小さい C は単純化。 γ は RBF の影響範囲、 大きいと局所的・小さいと滑らか。 GridSearchCV で (C, γ) を同時探索するのが標準。

③ サポートベクターの特定

# マージン上の点(αᵢ > 0 かつ < C):「真のサポートベクター」
# 例:千葉、 滋賀、 宮城、 広島 などが境界近傍

# 想定される結果(仮想)
都市圏側 SV:千葉(f≈+1.02)、 滋賀(f≈+1.05、 誤分類)
地方圏側 SV:宮城(f≈-1.01)、 広島(f≈-0.95)

→ 計 4 件のサポートベクターで境界が決まる
→ 47 県中 43 件は分類に直接寄与しない(マージンの外側)

④ RBF カーネル(非線形境界)

🎯 解説: SVM(Support Vector Machine)はマージン最大化で分類境界を引く手法。 カーネル関数で非線形分離も可能。 SSDSE-B-2026 のような小〜中規模データで強力な分類器となる。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# RBF SVM、 C=1、 γ=0.5 で学習
# 各点間の RBF カーネル
K(東京, 大阪) = exp(-0.5·||(4.42-3.06)² + (2.15-1.92)²||)
            = exp(-0.5·(1.85+0.053))
            = exp(-0.95)
             0.387

K(東京, 鳥取) = exp(-0.5·((4.42+0.82)² + (2.15+0.94)²))
            = exp(-0.5·(27.46+9.55))
            = exp(-18.5)
             9.2×10⁻⁹

 東京と大阪は類似」、 東京と鳥取は全く別
📥 入力例: data/raw/SSDSE-B-2026.csv X: 標準化済み特徴量 y: 二値ラベル
📤 実行例: 線形 SVM accuracy = 0.83 RBF カーネル accuracy = 0.87 サポートベクター = 18
💬 読み方: 読み方: C はマージン違反のペナルティ。 大きい C は過学習、 小さい C は単純化。 γ は RBF の影響範囲、 大きいと局所的・小さいと滑らか。 GridSearchCV で (C, γ) を同時探索するのが標準。

⑤ ハイパーパラメータ調整の効果

# C と γ を変えた精度(5-fold CV、 仮想)
C=0.1, γ=0.1   → 精度 0.81(過小学習)
C=1.0, γ=0.5   → 精度 0.96(バランス良)
C=10.0, γ=2.0  → 精度 0.91(過学習傾向)
C=100, γ=10    → 精度 0.85(強い過学習)

# 最適:C=1.0, γ=0.5
# GridSearchCV で系統的に探索

⚠️ SVM の落とし穴 — 実務で必ず引っかかるポイント 7 選

① 標準化(スケーリング)を忘れる

SVM は特徴量のスケールに非常に敏感です。 「人口(万人単位、 数十〜千)」と「進学率(%、 35〜70)」を同じデータに混ぜると、 人口のスケールが大きいため距離計算を支配し、 進学率は無視されます。 必ず StandardScaler や MinMaxScaler でスケールを揃えてから学習させてください。 これを忘れると精度が大きく劣化します。

② C と γ の同時調整を怠る

RBF SVM では C(正則化)と γ(カーネル幅)の相互作用が大きく、 片方ずつ調整しても最適に到達しません。 必ず GridSearchCV や RandomizedSearchCV で同時に探索。 推奨範囲:C ∈ [0.01, 100](対数刻み)、 γ ∈ [0.001, 10] または γ='scale'/'auto'。 デフォルト設定で使うと最良ではないことが多いです。

③ 大規模データで計算が破綻する

SVM の学習計算量は概ね O(n² ~ n³)。 n > 数万件では現実的に動きません。 対策は (i) `LinearSVC`(線形限定だが O(n))、 (ii) Nystroem 法など特徴近似、 (iii) SGDClassifier with hinge loss、 (iv) サンプリングして縮小。 Random Forest や勾配ブースティングの方が大規模データには現実的です。

④ 確率出力をデフォルトのまま信用する

SVM は本質的に確率モデルではなく、 sklearn の `probability=True` オプションは Platt スケーリングで事後的に補正しているだけです。 また `probability=True` にすると学習が数倍遅くなります。 確率出力が必要なら、 学習後に `CalibratedClassifierCV` で別途キャリブレーションする方が柔軟。 確率の信頼性が重要ならロジスティック回帰の方が直接的です。

⑤ 不均衡データで多数クラスに偏る

陽性 5%、 陰性 95% のデータで SVM をデフォルトで使うと、 全部陰性と予測するモデルが学習されます(精度 95%)。 `class_weight='balanced'` で逆頻度重み付け、 もしくは個別に `class_weight={0:1, 1:20}` のように指定。 評価指標も accuracy ではなく F1、 AUC、 recall を用いるべきです。

⑥ カーネル選択を「とりあえず RBF」で済ます

RBF は確かに万能ですが、 データ構造によっては線形 SVM の方が安定で高速、 特に高次元疎データ(テキスト、 ゲノム)では線形が標準です。 多項式カーネルは特定の幾何構造を持つデータに有効。 カーネル選択も交差検証で系統的に比較し、 単純な線形で十分な場合は線形を選ぶのが堅実です。

⑦ 解釈性を期待してしまう

RBF SVM は本質的にブラックボックスです。 「どの特徴量が重要か」が直接見えません。 線形 SVM なら係数 w で重要度が出ますが、 RBF では SHAP、 permutation importance、 部分依存プロット等の事後分析が必要。 解釈性が最重要なら、 ロジスティック回帰、 決定木、 GAM などを最初から検討してください。

🐍 Python 実装のバリエーション — scikit-learn / libsvm / lightning

① scikit-learn の SVC(標準実装、 libsvm ベース)

🎯 解説: SVM(Support Vector Machine)はマージン最大化で分類境界を引く手法。 カーネル関数で非線形分離も可能。 SSDSE-B-2026 のような小〜中規模データで強力な分類器となる。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
import pandas as pd
import numpy as np
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import train_test_split

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8-sig')
df['urban'] = df['都道府県'].isin(['東京','神奈川','千葉','埼玉','愛知','大阪','京都','兵庫','福岡']).astype(int)

X = df[['人口密度','第3次産業就業者割合']].dropna()
y = df.loc[X.index, 'urban']

X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3, random_state=0, stratify=y)

clf = make_pipeline(
    StandardScaler(),
    SVC(C=1.0, kernel='rbf', gamma='scale')
)
clf.fit(X_tr, y_tr)
print('テスト精度:', clf.score(X_te, y_te))
📥 入力例: data/raw/SSDSE-B-2026.csv X: 標準化済み特徴量 y: 二値ラベル
📤 実行例: 線形 SVM accuracy = 0.83 RBF カーネル accuracy = 0.87 サポートベクター = 18
💬 読み方: 読み方: C はマージン違反のペナルティ。 大きい C は過学習、 小さい C は単純化。 γ は RBF の影響範囲、 大きいと局所的・小さいと滑らか。 GridSearchCV で (C, γ) を同時探索するのが標準。

② LinearSVC(大規模データ向け、 高速)

🎯 解説: SVM(Support Vector Machine)はマージン最大化で分類境界を引く手法。 カーネル関数で非線形分離も可能。 SSDSE-B-2026 のような小〜中規模データで強力な分類器となる。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from sklearn.svm import LinearSVC

clf_lin = make_pipeline(
    StandardScaler(),
    LinearSVC(C=1.0, max_iter=10000, dual=False)
)
clf_lin.fit(X_tr, y_tr)
print('線形 SVM 精度:', clf_lin.score(X_te, y_te))

# 係数を取り出す
print('係数:', clf_lin.named_steps['linearsvc'].coef_)
📥 入力例: data/raw/SSDSE-B-2026.csv X: 標準化済み特徴量 y: 二値ラベル
📤 実行例: 線形 SVM accuracy = 0.83 RBF カーネル accuracy = 0.87 サポートベクター = 18
💬 読み方: 読み方: C はマージン違反のペナルティ。 大きい C は過学習、 小さい C は単純化。 γ は RBF の影響範囲、 大きいと局所的・小さいと滑らか。 GridSearchCV で (C, γ) を同時探索するのが標準。

③ GridSearchCV でハイパーパラメータ調整

🎯 解説: SVM(Support Vector Machine)はマージン最大化で分類境界を引く手法。 カーネル関数で非線形分離も可能。 SSDSE-B-2026 のような小〜中規模データで強力な分類器となる。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
from sklearn.model_selection import GridSearchCV

param_grid = {
    'svc__C': [0.01, 0.1, 1, 10, 100],
    'svc__gamma': [0.001, 0.01, 0.1, 1, 10],
    'svc__kernel': ['rbf']
}

pipe = make_pipeline(StandardScaler(), SVC())
grid = GridSearchCV(pipe, param_grid, cv=5, scoring='f1', n_jobs=-1)
grid.fit(X_tr, y_tr)
print('最適パラメータ:', grid.best_params_)
print('最適スコア:', grid.best_score_)
📥 入力例: data/raw/SSDSE-B-2026.csv X: 標準化済み特徴量 y: 二値ラベル
📤 実行例: 線形 SVM accuracy = 0.83 RBF カーネル accuracy = 0.87 サポートベクター = 18
💬 読み方: 読み方: C はマージン違反のペナルティ。 大きい C は過学習、 小さい C は単純化。 γ は RBF の影響範囲、 大きいと局所的・小さいと滑らか。 GridSearchCV で (C, γ) を同時探索するのが標準。

④ class_weight で不均衡対応

🎯 解説: SVM(Support Vector Machine)はマージン最大化で分類境界を引く手法。 カーネル関数で非線形分離も可能。 SSDSE-B-2026 のような小〜中規模データで強力な分類器となる。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
clf_bal = make_pipeline(
    StandardScaler(),
    SVC(C=1.0, kernel='rbf', class_weight='balanced')
)
clf_bal.fit(X_tr, y_tr)

# F1 で評価
from sklearn.metrics import classification_report
y_pred = clf_bal.predict(X_te)
print(classification_report(y_te, y_pred))
📥 入力例: data/raw/SSDSE-B-2026.csv X: 標準化済み特徴量 y: 二値ラベル
📤 実行例: 線形 SVM accuracy = 0.83 RBF カーネル accuracy = 0.87 サポートベクター = 18
💬 読み方: 読み方: C はマージン違反のペナルティ。 大きい C は過学習、 小さい C は単純化。 γ は RBF の影響範囲、 大きいと局所的・小さいと滑らか。 GridSearchCV で (C, γ) を同時探索するのが標準。

⑤ サポートベクターの可視化(2 次元のみ)

🎯 解説: SVM(Support Vector Machine)はマージン最大化で分類境界を引く手法。 カーネル関数で非線形分離も可能。 SSDSE-B-2026 のような小〜中規模データで強力な分類器となる。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import matplotlib.pyplot as plt
import numpy as np

# 学習済み clf から取得
svc = clf.named_steps['svc']
sv = svc.support_vectors_
print(f'サポートベクター数: {len(sv)}')

# 決定境界の描画
xx, yy = np.meshgrid(np.linspace(-2, 5, 100), np.linspace(-2, 3, 100))
Xs_scaled = StandardScaler().fit(X).transform(np.c_[xx.ravel(), yy.ravel()])
Z = svc.decision_function(Xs_scaled).reshape(xx.shape)

plt.contourf(xx, yy, Z, alpha=0.4, levels=[-1, 0, 1])
plt.scatter(X.iloc[:, 0], X.iloc[:, 1], c=y, edgecolor='k')
plt.scatter(sv[:, 0], sv[:, 1], s=200, facecolors='none', edgecolors='red', label='SV')
plt.legend()
plt.savefig('svm_boundary.png', dpi=150)
📥 入力例: data/raw/SSDSE-B-2026.csv X: 標準化済み特徴量 y: 二値ラベル
📤 実行例: 線形 SVM accuracy = 0.83 RBF カーネル accuracy = 0.87 サポートベクター = 18
💬 読み方: 読み方: C はマージン違反のペナルティ。 大きい C は過学習、 小さい C は単純化。 γ は RBF の影響範囲、 大きいと局所的・小さいと滑らか。 GridSearchCV で (C, γ) を同時探索するのが標準。

⑥ サポートベクター回帰(SVR)

🎯 解説: SVM(Support Vector Machine)はマージン最大化で分類境界を引く手法。 カーネル関数で非線形分離も可能。 SSDSE-B-2026 のような小〜中規模データで強力な分類器となる。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
from sklearn.svm import SVR

# 連続目的変数:死亡率
y_reg = df['死亡率']
X_reg = df[['高齢化率','県民所得']]

svr = make_pipeline(
    StandardScaler(),
    SVR(C=1.0, kernel='rbf', epsilon=0.1)
)
svr.fit(X_reg, y_reg)
print('R² =', svr.score(X_reg, y_reg))
📥 入力例: data/raw/SSDSE-B-2026.csv X: 標準化済み特徴量 y: 二値ラベル
📤 実行例: 線形 SVM accuracy = 0.83 RBF カーネル accuracy = 0.87 サポートベクター = 18
💬 読み方: 読み方: C はマージン違反のペナルティ。 大きい C は過学習、 小さい C は単純化。 γ は RBF の影響範囲、 大きいと局所的・小さいと滑らか。 GridSearchCV で (C, γ) を同時探索するのが標準。

⑦ One-Class SVM(教師なし異常検知)

🎯 解説: SVM(Support Vector Machine)はマージン最大化で分類境界を引く手法。 カーネル関数で非線形分離も可能。 SSDSE-B-2026 のような小〜中規模データで強力な分類器となる。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
from sklearn.svm import OneClassSVM

# 全データから「正常」の輪郭を学習
oc = make_pipeline(
    StandardScaler(),
    OneClassSVM(nu=0.1, kernel='rbf', gamma='scale')
)
oc.fit(X)

# -1 = 異常、 1 = 正常
labels = oc.predict(X)
print(df.loc[X.index][labels==-1][['都道府県','人口密度']])
📥 入力例: data/raw/SSDSE-B-2026.csv X: 標準化済み特徴量 y: 二値ラベル
📤 実行例: 線形 SVM accuracy = 0.83 RBF カーネル accuracy = 0.87 サポートベクター = 18
💬 読み方: 読み方: C はマージン違反のペナルティ。 大きい C は過学習、 小さい C は単純化。 γ は RBF の影響範囲、 大きいと局所的・小さいと滑らか。 GridSearchCV で (C, γ) を同時探索するのが標準。

🎨 直感で掴む — サポートベクターマシン の本質

SVM は「2 クラスを最も広いマージンで分ける直線(または曲面)」を引く分類器。 SSDSE-B-2026 で「人口 100 万人以上 vs 未満」を「出生率・65歳以上人口比率・婚姻件数」から分類すると、 SVM は境界に近いサポートベクターだけを使って最適な超平面を引く。 線形で分けにくいときはカーネルで非線形化。

💡 ポイント:サポートベクターマシン を初めて学ぶときは「正確な定義」より「どんな問題を解くための道具か」を先に押さえてください。 数式は次の「📐 数式」セクションで丁寧に展開します。
📌 比喩がうまく刺さらないときは、 自分の身近な例(家計簿・スポーツの記録・成績表)に置き換えてみると理解が定着します。 SSDSE-B-2026 を電卓代わりに触りながら、 上の説明を再読すると効果的です。

📐 数式または定義 — サポートベクターマシン の形式的表現

直感で全体像を掴んだら、 次は厳密な定義を見ます。 数式は短いものでも、 「何を入力にして、 何を出力するのか」を意識して読むと早く慣れます。

【ソフトマージン SVM(双対形式は省略)】
$$ \min_{w,b}\; \frac{1}{2}\|w\|^2 + C\sum_{i=1}^{n}\xi_i \quad \text{s.t.}\quad y_i(w^\top x_i + b) \ge 1 - \xi_i,\; \xi_i \ge 0 $$
この数式は「サポートベクターマシン がどう計算されるか」を最短で示したもの。 記号の意味は次の「🔬 数式を言葉で読み解く」で 1 つずつ解説します。
📚 数式が苦手な方へ:1 つの長い式を一度に理解しようとせず、 記号ごとに「言葉に翻訳」するのが王道。 紙に書き写してから、 自分の言葉で音読してみてください。

🔬 数式を言葉で読み解く — サポートベクターマシン の記号辞書

上の数式に出てくる各記号が何を表すかを、 言葉で翻訳します。 1 つずつ自分の言葉で言い換えられるようになると、 論文や教科書のスピードが一気に上がります。

記号意味(言葉での説明)
$w, b$超平面 $w^\top x + b = 0$ のパラメータ
$y_i \in \{-1, +1\}$クラスラベル
$\xi_i$スラック変数(誤分類を許容)
$C$マージンと誤分類のトレードオフ
カーネル$K(x_i, x_j)$ で非線形分離
📌 読み下しのコツ:左から右に「主語 → 述語 → 目的語」と見立てて、 「これは何を、 どうしている式か?」と一文で要約してみてください。 慣れれば 5 秒で読めます。

🧮 実値で計算してみる — SSDSE-B-2026 で サポートベクターマシン を体感

数式だけでは「分かった気になる」だけで終わりがち。 ここで SSDSE-B-2026(教育用標準データセット — 47 都道府県 × 100+ 指標、 2018-2023 年度)の実値を当てはめて、 サポートベクターマシン の挙動を電卓的に追体験します。

👉 計算例:SSDSE-B-2026 で目的変数を「総人口 > 200 万人」(1/0 ラベル)、 特徴量を「大学卒業者数、 婚姻件数、 着工建築物数」とする。 線形 SVM で 5-fold CV の正答率は 0.93、 RBF カーネルで 0.95。 サポートベクターは 47 県中 8 県程度に絞られ、 境界の県(例:京都・茨城)が分類精度を支配する。

SSDSE-B-2026 は 統計センターの SSDSE 配布ページ から CSV を直接ダウンロードできます。 本サイトでは data/raw/SSDSE-B-2026.csv に配置している前提でコードを書いています。

🐍 Python 実装 — サポートベクターマシン を SSDSE-B-2026 で動かす

以下のコードは最小限の構成です。 pd.read_csv('data/raw/SSDSE-B-2026.csv') を直書きしているので、 同じ階層に CSV を置けばそのまま動きます。 変数化しないのは、 初学者が「パスをどこに書くべきか」で迷わないようにするためです。

# サポートベクターマシン を SSDSE-B-2026 で確かめる最小コード
import pandas as pd
import numpy as np

# 1) SSDSE-B-2026(教育用標準データセット)を読み込み
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
print('shape:', df.shape)        # (564, 112) — 47 都道府県 × 6 年度
print('cols head:', list(df.columns[:8]))

# 2) 直近年度(2023 年度)に絞る
df23 = df[df['年度'] == 2023].copy()
print('rows in 2023:', len(df23))

# 3) サポートベクターマシン を動かすために必要な列だけ取り出す
y = df23['合計特殊出生率'].astype(float)
x = df23['総人口'].astype(float)
print('y stats:', y.describe().round(3).to_dict())
print('x stats:', x.describe().round(0).to_dict())

# 4) サポートベクターマシン の本処理(このページの主題)
#    — 具体実装は同カテゴリの個別ページにも掲載
print('---- サポートベクターマシン 結果 ----')
print('mean y:', y.mean().round(3), '/ std y:', y.std().round(3))
print('mean x:', x.mean().round(0), '/ std x:', x.std().round(0))
print('corr(x, y):', y.corr(x).round(3))

うまく動かないときは ①data/raw/SSDSE-B-2026.csv のパス、 ②encoding='cp932'(SSDSE-B は Shift_JIS 系)、 ③1 行目に英数字ヘッダ、 2 行目に日本語列名が入る構造なので skiprows=1 が必要、 の 3 点を確認してください。

⚠️ よくある落とし穴 — サポートベクターマシン で初学者がやりがちなミス

この用語を実務で使うときにつまずきやすい点を、 失敗パターン別に整理しました。 1 度経験すれば回避できるものばかりですが、 先に知っておくと事故が大幅に減ります。

❌ スケーリング忘れ
距離ベースなので必ず StandardScaler を適用。
❌ $C$ を調整しない
$C$ が大きすぎると過学習、 小さすぎると単純線形に近づく。 グリッドサーチで。
❌ 多クラスでの実装
sklearn は OvR / OvO を自動選択するが、 不均衡データではマクロ F1 で評価。
🛡 防御策まとめ:「適用条件の確認 → 適切な前処理 → 結果と前提のペア記述」の 3 ステップを習慣にすれば、 ここに挙げた失敗の大半は回避できます。

🌐 関連手法・派生 — サポートベクターマシン の周辺地図

サポートベクターマシン と一緒に覚えておくと選択肢が広がる関連手法。 状況によって使い分けが必要なので、 それぞれの強みと弱みを 1 行で言えるようにしておきましょう。

表中の各手法は本サイト内に個別ページが用意されているものが多いです。 興味を持った概念は、 横展開的に読むと体系的な理解が早く進みます。