論文中に 「ニューラルネットワーク」として登場する用語。
ニューラルネットワーク とは:脳のニューロンを模した数学モデル。複数層を重ねたものが深層学習。
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() |
このページの上にある3つの概念マップ(関係マップ、 包含マップ、 ツリーマップ)でこの概念の位置づけが視覚的に分かります。 関連手法を辿って学習を進めましょう。
統計データ活用コンペティションの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、 効果量 |
このページの概念をマスターすることで、 以下のスキルが身につきます:
このコンペの主要データセット(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()) |
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() |
分析結果を報告する際の標準的な構成:
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つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。
🌐 体系階層に未登録
中心の概念から放射状に、 前提・兄弟・発展形・応用先などの関係性を矢印で結びます。 横の繋がりを見るのに最適。 ノードをドラッグ、 ホイールでズーム、 クリックで遷移。
大きな円が小さな円を包含する Circle Packing 図。 「ニューラルネットワーク」は緑色でハイライト。
長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「ニューラルネットワーク」は緑色でハイライト。
| マップ | 分かること | こんな時に見る |
|---|---|---|
| 🔗 関係マップ | 手法間の横の関係(前提→発展→応用) | 「次に何を学べばよい?」 学習順序の判断 |
| ⭕ 包含マップ | 分類体系の入れ子構造(上位⊃下位) | 「この手法はどんなジャンルに属する?」 |
| 🌳 ツリーマップ | 分野の規模比較(面積=ボリューム) | 「データサイエンス全体の俯瞰像」 |
💡 ジャストインタイム学習のヒント:3つの視点を行き来することで、 概念を多角的に理解できます。 包含マップやツリーマップはズーム/ドリルダウンで大分類から細部まで探索できます。
ニューラルネットワークに関する用語を、 構造・学習・正則化・最適化 別に索引化します。
| カテゴリ | キーワード(日本語) | キーワード(英語) |
|---|---|---|
| 構造 | 入力層、 隠れ層、 出力層、 ニューロン、 重み、 バイアス | input/hidden/output layer, neuron, weight, bias |
| 活性化関数 | ReLU、 シグモイド、 tanh、 Leaky ReLU、 GELU、 softmax | ReLU, sigmoid, tanh, Leaky ReLU, GELU, softmax |
| 学習 | 誤差逆伝播、 勾配降下法、 損失関数、 学習率、 エポック | backpropagation, SGD, loss, learning rate, epoch |
| 最適化 | Adam、 RMSprop、 モメンタム、 AdaGrad、 学習率スケジューリング | Adam, RMSprop, momentum, AdaGrad, LR scheduling |
| 正則化 | ドロップアウト、 L1/L2正則化、 早期終了、 バッチ正規化 | dropout, L1/L2, early stopping, batch norm |
| 発展アーキ | CNN、 RNN、 LSTM、 GRU、 Transformer、 GNN、 オートエンコーダ | CNN, RNN, LSTM, GRU, Transformer, GNN, autoencoder |
SSDSE-B の都道府県データから「人口・教育支出・大学数」を入力にして「平均所得」を予測するMLP(多層パーセプトロン)を構築します。
| 層 | ユニット数 | 活性化 | パラメータ数 |
|---|---|---|---|
| 入力 | 3 | — | 0 |
| 隠れ1 | 16 | ReLU | 3×16+16 = 64 |
| 隠れ2 | 8 | ReLU | 16×8+8 = 136 |
| 出力 | 1 | 線形 | 8×1+1 = 9 |
| 合計 | 209 |
1. 標準化(入力をz化)
2. 損失関数 = MSE(平均二乗誤差)
3. 最適化 = Adam(lr=0.001)
4. バッチサイズ = 8、 エポック = 200
5. 早期終了(val_loss が10エポック改善しなければ停止)
検証R² ≈ 0.78(線形回帰の 0.62 を上回る)
ただしn=47は深層学習には少なすぎ、 過学習リスクが高い。 ドロップアウトと早期終了を併用すべき。 解釈性は線形回帰の方が圧倒的に上で、 状況に応じた使い分けが重要。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import pandas as pd from sklearn.neural_network import MLPRegressor from sklearn.preprocessing import StandardScaler from sklearn.pipeline import Pipeline from sklearn.model_selection import train_test_split df = pd.read_csv('data/raw/SSDSE-B-2024.csv', encoding='shift_jis', skiprows=1) X = df[['人口', '教育支出', '大学数']] y = df['平均所得'] X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3, random_state=0) pipe = Pipeline([ ('scaler', StandardScaler()), ('mlp', MLPRegressor(hidden_layer_sizes=(16, 8), activation='relu', max_iter=2000, random_state=0)) ]) pipe.fit(X_tr, y_tr) print('R²:', pipe.score(X_te, y_te)) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import tensorflow as tf from tensorflow.keras import layers, models, callbacks import pandas as pd from sklearn.preprocessing import StandardScaler df = pd.read_csv('data/raw/SSDSE-B-2024.csv', encoding='shift_jis', skiprows=1) X = StandardScaler().fit_transform(df[['人口', '教育支出', '大学数']]) y = df['平均所得'].values model = models.Sequential([ layers.Input(shape=(3,)), layers.Dense(16, activation='relu'), layers.Dropout(0.2), layers.Dense(8, activation='relu'), layers.Dense(1) ]) model.compile(optimizer='adam', loss='mse', metrics=['mae']) es = callbacks.EarlyStopping(patience=20, restore_best_weights=True) hist = model.fit(X, y, validation_split=0.3, epochs=300, batch_size=8, callbacks=[es], verbose=0) print('最小val_loss:', min(hist.history['val_loss'])) |
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 | import torch import torch.nn as nn from torch.utils.data import DataLoader, TensorDataset torch.manual_seed(0) class MLP(nn.Module): def __init__(self): super().__init__() self.net = nn.Sequential( nn.Linear(3, 16), nn.ReLU(), nn.Dropout(0.2), nn.Linear(16, 8), nn.ReLU(), nn.Linear(8, 1) ) def forward(self, x): return self.net(x) model = MLP() opt = torch.optim.Adam(model.parameters(), lr=1e-3, weight_decay=1e-4) loss_fn = nn.MSELoss() X_t = torch.tensor(X, dtype=torch.float32) y_t = torch.tensor(y, dtype=torch.float32).unsqueeze(1) loader = DataLoader(TensorDataset(X_t, y_t), batch_size=8, shuffle=True) for epoch in range(200): for xb, yb in loader: pred = model(xb); loss = loss_fn(pred, yb) opt.zero_grad(); loss.backward(); opt.step() |
1 2 3 4 5 6 7 8 9 10 | from tensorflow.keras import layers, Model, Input inp = Input(shape=(3,)) x = layers.Dense(16, activation='relu')(inp) x = layers.BatchNormalization()(x) x = layers.Dropout(0.2)(x) x = layers.Dense(8, activation='relu')(x) out = layers.Dense(1)(x) model = Model(inp, out) model.compile(optimizer='adam', loss='mse') |
1 2 3 4 5 6 7 8 9 10 11 12 13 | import jax, jax.numpy as jnp from flax import linen as nn class MLP(nn.Module): @nn.compact def __call__(self, x): x = nn.relu(nn.Dense(16)(x)) x = nn.relu(nn.Dense(8)(x)) return nn.Dense(1)(x) model = MLP() params = model.init(jax.random.PRNGKey(0), jnp.zeros((1, 3))) # 以下に optax で最適化ループを書く |