📍 あなたが今見ているもの
論文中に 「サポートベクトルマシン」 として登場する用語。
サポートベクトルマシン とは:クラス間のマージンを最大化するように分類境界を引く手法。カーネルで非線形にも対応。
💡 30秒で分かる結論 定義 :クラス間のマージンを最大化するように分類境界を引く手法。カーネルで非線形にも対応。カテゴリ :機械学習
📖 詳細な解説
この用語は、 統計データ解析・データサイエンスの世界で重要な概念の1つです。 ジャストインタイム型学習では、 必要なときに参照し、 関連概念と合わせて学ぶことで定着を図ります。
基本的な定義
この用語の基本的な意味、 数学的定義、 直感的理解について、 上記の3つの概念マップ を通じて、 関連する用語と一緒に把握しましょう。
使い時の判断基準
データの種類は何か(連続値 / カテゴリ / 順序)
サンプルサイズは十分か(n > 30 が目安)
仮定は満たされているか(正規性、 独立性等)
結果の解釈に必要な情報は揃っているか
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ステップ
定義を理解する :この概念は何か? 数式や条件を確認
具体例を見る :実データ(SSDSE 等)で計算してみる
応用する :自分のデータに適用、 結果を解釈
🔧 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()
🚧 一般的な落とし穴と対策
外れ値の影響 :散布図・ 箱ひげ図で確認、 ロバスト手法も検討
サンプルサイズ不足 :power analysis で事前に確認
仮定の違反 :正規性、 独立性、 等分散性をチェック
多重比較問題 :補正(Bonferroni、 FDR)を適用
p-hacking :事前登録(pre-registration)で防ぐ
因果と相関の混同 :観察データから因果結論を出さない
📊 結果報告の標準フォーマット
点推定 :得られた値
不確実性 :信頼区間または標準誤差
サンプルサイズ :n を明記
効果量 :実質的な意義
p値 :統計的有意性
仮定の確認 :診断プロット
🌐 関連分野での応用
マーケティング :A/Bテスト、 顧客分析
医療 :臨床試験、 疫学研究
金融 :リスク管理、 ポートフォリオ
製造 :品質管理、 工程最適化
公共政策 :効果評価、 計画立案
研究 :仮説検証、 探索的解析
🎓 さらに学ぶための文献
Wasserman "All of Statistics"
Hastie, Tibshirani & Friedman "The Elements of Statistical Learning"
Gelman & Hill "Data Analysis Using Regression"
VanderPlas "Python Data Science Handbook"
🔗 統計用語ネットワーク
この概念は、 他の多くの統計概念と密接に関連しています。 ジャストインタイム型学習では、 必要に応じて関連用語へジャンプしながら全体像を構築します。
主要な関連概念のグループ
グループ
主要概念
記述統計 平均、 中央値、 最頻値、 分散、 標準偏差、 共分散、 相関係数
可視化 ヒストグラム、 散布図、 箱ひげ図、 ヒートマップ
推測統計 標本平均、 標準誤差、 信頼区間、 p値、 有意水準
確率分布 正規分布、 t分布、 χ²分布、 F分布、 二項分布
仮説検定 t検定、 F検定、 χ²検定、 ノンパラ検定
回帰 単回帰、 重回帰、 OLS、 Ridge、 LASSO
分類 ロジスティック回帰、 決定木、 SVM、 k-NN
教師なし学習 クラスタリング、 PCA、 因子分析
時系列 ARIMA、 VAR、 指数平滑法、 自己相関
因果推論 DiD、 IV、 傾向スコア、 交絡変数
前処理 標準化、 正規化、 欠損値処理、 多重共線性対策
評価 R²、 残差、 CV、 RMSE、 効果量
学習順序の推奨
記述統計(平均、 分散、 標準偏差)
可視化(ヒストグラム、 散布図)
確率分布(正規分布)
推測統計(標準誤差、 信頼区間、 p値)
仮説検定(t検定、 χ²検定)
相関と回帰(単回帰、 重回帰)
多変量解析(PCA、 クラスタリング)
機械学習(決定木、 RF、 NN)
時系列・因果推論(応用)
📚 統計学習の総合ガイド
🎯 学習目標
このページの概念をマスターすることで、 以下のスキルが身につきます:
定義と公式を正確に理解
適切な使用場面を判断
Python で実装し、 結果を可視化
仮定の確認と診断
結果の解釈と報告
限界と注意点の理解
関連手法との使い分け
📊 SSDSE-B-2026 データの構造
このコンペの主要データセット(SSDSE-B-2026)の構造:
47都道府県 × 過去複数年(パネル形式)
112列の社会経済指標
人口、 出生、 死亡、 婚姻、 経済、 教育、 環境、 家計など多次元
政府統計を統合した信頼性の高いデータ
🔍 主要な変数群
カテゴリ
変数例
人口 総人口、 年齢別人口、 性別人口
人口動態 出生数、 死亡数、 合計特殊出生率、 婚姻数
気候 気温、 降水量、 降水日数
教育 幼小中高校数、 教員数、 生徒数、 大学進学率
経済 求職件数、 求人件数、 旅館数
医療 病院数、 診療所数、 歯科診療所
家計 消費支出、 食料費、 住居費、 教育費等の項目別
💡 ジャストインタイム型学習
このガイドは「必要なときに必要な知識 」を提供する設計:
論文中の用語をクリック → 該当の用語解説へジャンプ(ポップアップ)
概念マップで関連用語を辿る
包含マップで体系を把握
ツリーマップで全体を俯瞰
Python コードをコピーして実行
SSDSE データで実際に試す
🛠️ 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, γ) を同時探索するのが標準。
📈 報告書テンプレート
分析結果を報告する際の標準的な構成:
背景・目的 :なぜこの分析が必要か
データ :出所、 サンプルサイズ、 期間
方法 :使用した統計手法、 仮定
結果 :図表、 統計量、 検定結果
解釈 :結果が何を意味するか
限界 :分析の制約
結論 :要点まとめ、 今後の課題
🗺️ 統計手法選択フローチャート
Q1: 何を知りたい?
記述したい → 平均、 分散、 ヒストグラム
比較したい → t検定、 ANOVA、 χ²検定
関係を見たい → 相関、 回帰
予測したい → 回帰、 機械学習
分類したい → ロジスティック回帰、 SVM、 RF
グループ分けしたい → クラスタリング
次元を減らしたい → PCA、 因子分析
因果関係を知りたい → RCT、 IV、 DiD、 PSM
Q2: データの種類は?
連続値 → t検定、 ANOVA、 線形回帰
カテゴリ → χ²検定、 ロジスティック回帰
順序 → ノンパラ検定、 順位回帰
カウント → ポアソン回帰、 負の二項回帰
時系列 → ARIMA、 VAR、 状態空間
パネル → 固定効果、 ランダム効果
Q3: サンプルサイズは?
n < 30 :ノンパラ、 ベイズ、 ブートストラップ
30 ≤ n < 200 :古典的検定、 単純な回帰
n ≥ 200 :複雑なモデル、 機械学習
n ≥ 10000 :深層学習も可能
Q4: 仮定は?
正規性 :満たす → パラメトリック / 満たさない → ノンパラ
独立性 :必須 / 違反 → クラスター調整、 時系列モデル
等分散性 :満たす → OLS / 違反 → WLS、 ロバスト
📏 効果量の参照表
p値だけでなく効果量も併記するのが現代統計の標準。 主要な指標と Cohen の解釈基準:
統計量
効果量
小
中
大
2群平均差 Cohen's d 0.2 0.5 0.8
相関 r 0.1 0.3 0.5
線形回帰 R² 0.02 0.13 0.26
ANOVA η² (eta²) 0.01 0.06 0.14
χ² Cramér's V 0.1 0.3 0.5
ロジスティック Odds Ratio 1.5 2.5 4.0
🗺️ 概念マップ — 3つの視点で体系を理解する
サポートベクトルマシン がデータサイエンスの体系の中でどこに位置するか を、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。
📍 体系階層のパス
🌐 体系階層に未登録
① 🔗 関係マップ — 「他の手法とどう繋がっているか」
中心の概念から放射状に、 前提・兄弟・発展形・応用先 などの関係性を矢印で結びます。 横の繋がり を見るのに最適。 ノードをドラッグ 、 ホイールでズーム 、 クリックで遷移 。
凡例: 現在の用語 上位カテゴリ 兄弟(並列) 前提 発展形 応用先 2階層先
② ⭕ 包含マップ — 「どのカテゴリに含まれているか」
大きな円が小さな円を包含 する Circle Packing 図。 「サポートベクトルマシン」は緑色でハイライト 。
カテゴリ円をクリック :その内部にズームイン
白背景クリック :1階層戻る
用語円をクリック :詳細ページへ遷移
マウスホバー :階層パス表示
③ 🌳 ツリーマップ — 「面積で見るボリューム比較」
長方形を入れ子に分割した Treemap 図。 各分野の規模感 を面積で比較。 「サポートベクトルマシン」は緑色でハイライト 。
カテゴリ矩形をクリック :その内部にドリルダウン
パンくず(上のリンク)クリック :その階層に戻る
用語矩形をクリック :詳細ページへ遷移
マウスホバー :階層パスと値を表示
🎯 3つのマップの使い分け
マップ
分かること
こんな時に見る
🔗 関係マップ 手法間の横の関係 (前提→発展→応用) 「次に何を学べばよい?」 学習順序の判断
⭕ 包含マップ 分類体系の入れ子構造 (上位⊃下位) 「この手法はどんなジャンルに属する?」
🌳 ツリーマップ 分野の規模比較 (面積=ボリューム) 「データサイエンス全体の俯瞰像」
💡 ジャストインタイム学習のヒント :3つの視点を行き来することで、 概念を多角的に 理解できます。 包含マップやツリーマップはズーム/ドリルダウン で大分類から細部まで探索できます。
🔖 キーワード索引 — SVM を多角的に理解する
サポートベクターマシン(SVM, Support Vector Machine)を確実に使いこなすための関連キーワードを難易度別に整理しました。
🟢 基礎キーワード(まず押さえる)
分離超平面(separating hyperplane) :2 クラスを分ける(d−1)次元の境界面。 SVM の中核概念。
マージン(margin) :分離超平面から最も近いデータ点までの距離。 SVM はこれを最大化。
サポートベクター :マージン上または内側にある観測点。 これらだけが分類器を決定する。
ハードマージン SVM :データが完全に線形分離可能と仮定する基本形。
ソフトマージン SVM :誤分類を許容するスラック変数 ξ を導入。 実務ではこちらが標準。
正則化パラメータ C :ソフトマージンでの誤分類ペナルティの重み。 大きいほどハードに近づく。
🟡 中級キーワード
カーネル(kernel) :高次元写像を内積で代用する関数。 RBF、 多項式、 線形、 シグモイドなど。
カーネルトリック(kernel trick) :明示的に高次元写像せず内積だけで非線形分類を実現。
RBF カーネル(Gaussian) :K(x, y) = exp(−γ‖x−y‖²)。 最も汎用的。 γ で局所性を制御。
多項式カーネル :K(x, y) = (γx·y + r)ᵈ。 d で次数を選ぶ。
双対形式(dual problem) :ラグランジュ乗数 αᵢ で表現した最適化問題。 サポートベクターが見える。
ヒンジ損失(hinge loss) :max(0, 1 − yᵢf(xᵢ))。 SVM の損失関数。
🔴 上級キーワード
SMO(Sequential Minimal Optimization) :libsvm の実装アルゴリズム。 2 変数ずつ最適化。
ν-SVM(nu-SVM) :C の代わりに ν を使う変種。 ν はサポートベクター割合の上限・誤分類割合の下限。
One-Class SVM :教師なしの異常検知。 正常データの輪郭を学習。
サポートベクター回帰(SVR) :回帰問題への拡張。 ε-不感帯(ε-insensitive zone)。
マルチクラス SVM :1-vs-1、 1-vs-rest、 Crammer-Singer 法など。
VC 次元と汎化誤差 :統計学習理論での SVM の理論保証。
🧮 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 のような小〜中規模データで強力な分類器となる。
📋 コピー 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 のような小〜中規模データで強力な分類器となる。
📋 コピー 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, γ) を同時探索するのが標準。
🐍 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 点を確認してください。