論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
ノイズ
Noise
ML基礎

🔖 キーワード索引

#観測誤差#信号 vs 雑音#ランダム成分#SN比#ロバスト#外れ値

noise」は統計データ分析の文脈で扱う重要概念のひとつ。 本ページでは「noise」を取り巻く中核キーワードを以下にチップで一覧化する。 各キーワードは関連する概念・手法・道具立てを含み、 文献検索や学習計画の起点になる。

noise統計分析SSDSE-B-2026前提条件適用範囲落とし穴関連手法Python 実装検証方法

これらのキーワードは「noise の理解 → 適用 → 検証」のプロセスを構成する。 各章で詳しく解説する。

💡 30秒で分かる結論

🍰 まずはやさしく

ノイズはデータの小さな揺れのことです。

本当の値を知るために使います。

スマホの電波が乱れるときのようなものです。

ここではノイズの種類と対策を読みます。

ノイズ:観測に含まれる偶然変動

📍 文脈ボックス

🍰 まずはやさしく

ノイズはデータ分析の基本ルールです。

正しくデータを扱うために使います。

部活の記録をまとめる時にも役立ちます。

ここでは定義や実装について読みます。

この用語は ML基礎 カテゴリに属します。 関連する別称・略号:(なし)

論文・実務レポートで ノイズ が登場したら、 まず本ページの「30秒で分かる結論」と「直感で掴む」を読めば、 その文脈で何を言っているか把握できます。

本ページでは「noise」を扱う。 統計データ分析コンペティション (2026) の教材で、 SSDSE-B-2026 (47 都道府県 × 複数年 × 100 超列) の実データを使った再現可能な学習を目指す。

「noise」は統計・データサイエンスの体系における重要概念のひとつ。 本ページは「定義・直感・数式・実装・落とし穴・関連手法」の 6 視点で構成され、 各視点は独立して読めるが順序通り読むと体系的な理解が得られる。

🎨 直感で掴む

🍰 まずはやさしく

ノイズは測り間違いのようなものです。

本当の正体を見抜くために使います。

気温計で測るたびに数字が変わる例です。

ここではノイズの正体を直感的に読みます。

気温計で 25.3 °C を読んだ。 本当の気温は 25.0 °C で、 +0.3 のズレは ノイズ。 同じ場所で 10 回測れば 24.8〜25.2 など、 真値の周りで揺らぐ。 揺らぎが小さいほどデータは信頼でき、 揺らぎが大きいと「読み取った数字」だけでは判断を誤る。

「信号」と「ノイズ」を分解する

SSDSE-B-2026 の都道府県「年平均気温 (B4101)」を例にとる。 各県の気温は緯度・標高・海洋性といった構造的要因 (=信号) と、 観測日や測定機器のばらつき (=ノイズ) の合計値。 解析の目的は信号を取り出し、 ノイズを「不確実性」として正しく報告すること。 ノイズを 0 にはできないが、 サンプルを増やせば平均化で薄められる。

ノイズの種類特徴
白色雑音独立同分布 (i.i.d.)、 全周波数に均等熱雑音、 サイコロの目
有色雑音時間相関あり、 特定周波数に偏る月別ノイズ、 ARMA 残差
1/f ノイズ低周波が強い、 長期記憶株価変動、 半導体フリッカ
外れ値型 (impulse)時折大きな突出が出るセンサ故障、 入力ミス
乗法ノイズ$y = (1+\varepsilon) \cdot y_{\text{true}}$画像のスペックル、 機器の % 誤差
系統誤差 (バイアス)ランダムでなく一方向機器の零点ずれ、 サンプリングバイアス

📌 「ノイズ」と一括りにせず、 種類を見極めることが第一歩。 白色雑音なら平均化で消えるが、 系統誤差は何度測っても消えない ── キャリブレーションが必要。

SN 比 (Signal-to-Noise Ratio) の感覚

$\text{SNR} = \sigma_{\text{signal}}^2 / \sigma_{\text{noise}}^2$ で定義される。 SNR が 1 を切るとノイズが信号より大きく、 ほとんど何も見えない。 デシベル表記 $\text{SNR}_\text{dB} = 10 \log_{10}(\text{SNR})$ では、 SNR=10 (= 10dB) なら「ノイズの 10 倍の信号」、 SNR=100 (= 20dB) なら「100 倍」。 SSDSE のような国家統計では SNR は通常 100 以上、 個人センサデータでは 1〜10 が普通。

「ノイズ」を扱う 3 つの心構え

  1. 「ノイズは消すもの」より「測るもの」: まずノイズの量と性質を測定する。 SD・分布形・ACF を見れば対処が決まる。
  2. サンプル増で薄める前に分布を確認: i.i.d. でなければ $\sqrt{N}$ 則は破綻する。 時系列・空間データでは特に注意。
  3. ノイズは情報源にもなる: 1/f ノイズの強さは長期記憶を、 周波数スペクトルは隠れた周期性を、 分布の形は物理過程を示唆する ── 「邪魔者」とだけ見ない。

🎨 ホワイトノイズと有色ノイズ — 周波数特性で見分ける

ノイズは時間領域では「不規則な変動」に見えますが、 周波数領域でスペクトル密度 (PSD) を計算すると、 一気に 素性が割れます。 PSD が周波数によらず一定なものを ホワイトノイズ、 周波数に対し 1/f に比例して減衰するものを ピンクノイズ (1/f ノイズ)、 1/f² で減衰するものを ブラウン (レッド) ノイズと呼びます。 都道府県データの「年次変動」もこのスペクトル分析で性質を判別できます。

名前PSD の傾き自己相関代表例
ホワイトf⁰ (フラット)なし (δ関数)電子回路の熱雑音、 量子化誤差
ピンク (1/f)f⁻¹緩やかに減衰音楽信号、 心拍 RR 間隔、 株価変動
ブラウンf⁻²強い長期相関ブラウン運動、 拡散現象
ブルーf⁺¹負相関 (高周波強調)ディザリング、 網膜の桿体配置

🐍 SSDSE-B-2026 の人口データから「ノイズ成分」を抽出して PSD 分析

このコードでやること: SSDSE-B-2026 の data/raw/SSDSE-B-2026.csv から都道府県別の数値変数を時系列として取り扱い、 トレンド (移動平均) を差し引いた残差を「ノイズ」とみなして scipy.signal.welch で PSD を推定する。 出力された傾きから、 そのデータが白色ノイズか有色ノイズかを判定する。

📥 入力データ (SSDSE-B-2026、 47 都道府県を 1 次元シーケンスとして扱う):

地域コード A1101 総人口(系列値) R01000 5092000 (北海道) R13000 14086000 (東京都) ... ... R47000 1468000 (沖縄県)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import pandas as pd
import numpy as np
from scipy.signal import welch
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['SSDSE-B-2026'] == 2023]                  # 2023 年の 47 都道府県
signal = df['A1101'].values.astype(float)            # A1101 総人口 を 1 次元シーケンス扱い
trend = pd.Series(signal).rolling(window=5, center=True).mean().bfill().ffill().values
noise = signal - trend
f, Pxx = welch(noise, nperseg=16)
mask = f > 0
slope = np.polyfit(np.log10(f[mask]), np.log10(Pxx[mask]), 1)[0]
print(f'ノイズ標準偏差    : {noise.std():,.1f}')
print(f'PSD log-log 傾き  : {slope:+.3f}')
print(f'判定              : ' + ('白色' if abs(slope) < 0.3 else ('ピンク' if slope > -1.5 else 'ブラウン')))

📤 実行すると次の出力が得られる:

ノイズ標準偏差 : 1,883,602.7 PSD log-log 傾き : -0.215 判定 : 白色

💬 都道府県 (地域コード順) の総人口から 5 点移動平均トレンドを差し引いた残差成分は、 約 188 万人の標準偏差を持ち、 PSD の log-log 傾きは −0.22 と平坦に近く 白色ノイズ寄りの性質を示します。 つまり局所トレンドを除くと、 隣り合う県の人口の増減はほぼ無相関ということです。 もし傾きが −1 に近ければピンク、 −2 に近ければブラウンとなり、 それに応じて適切なデノイジング手法 (LP フィルタ、 ウェーブレット、 移動平均の窓幅) を理論的に選択できます。

📶 SNR とデノイジング — 信号対雑音比の改善で見えてくるもの

信号処理で最も重要な指標が SNR (Signal-to-Noise Ratio) です。 信号電力 P_s とノイズ電力 P_n の比をデシベル単位で表現します:

$$ \mathrm{SNR_{dB}} = 10 \log_{10} \left( \frac{P_s}{P_n} \right) = 20 \log_{10} \left( \frac{A_s}{A_n} \right) $$

SNR が 0 dB なら信号とノイズが同じ電力、 +20 dB なら信号がノイズの 100 倍、 −10 dB ならノイズの方が 10 倍大きいことを意味します。 デノイジングは SNR を改善する操作で、 移動平均・ローパスフィルタ・ウェーブレット縮小・カルマンフィルタなど多様な手法があります。

🐍 SSDSE-B-2026 の総人口系列を移動平均トレンドと比較 → 平滑化で SNR がどう変わるか計測

このコードでやること: SSDSE-B-2026 の A1101 総人口列を観測系列 (noisy) とみなし、 その 5 点移動平均をクリーンなトレンド (信号) と定義。 ここでの SNR は「トレンドのパワー / (観測−トレンド) 残差のパワー」で、 窓幅 3, 5, 7 の移動平均で平滑化したときに SNR がどう変化するかを測る。

📥 入力データ (SSDSE-B-2026 の A1101 総人口、 観測系列として扱う):

地域コード A1101 総人口 (観測系列) R01000 5092000 (北海道) R13000 14086000 (東京都) ... ... R47000 1468000 (沖縄県)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
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]
# 「クリーン信号」= 5 点移動平均で平滑化したトレンド成分
clean = df['A1101'].values.astype(float)             # A1101 総人口
trend = pd.Series(clean).rolling(5, center=True).mean().bfill().ffill().values
# 「観測系列」= 実際の SSDSE 元値 (= trend + 実残差)
noisy = clean
def snr_db(s, n):
    return 10 * np.log10((s**2).mean() / (n**2).mean())
print(f'観測値の SNR      : {snr_db(trend, noisy-trend):.2f} dB')
for w in [3, 5, 7]:
    denoised = pd.Series(noisy).rolling(w, center=True).mean().bfill().ffill().values
    print(f'window={w} 後 SNR : {snr_db(trend, denoised-trend):.2f} dB')

📤 実行すると次の出力が得られる:

観測値の SNR : 4.42 dB window=3 後 SNR : 11.18 dB window=5 後 SNR : ∞ dB (一致) window=7 後 SNR : 13.91 dB

💬 窓幅 5 はトレンド定義そのものなので残差ゼロとなり SNR が発散しますが、 これは「平滑化窓と評価対象が同一」という縮退ケース。 実務では、 SSDSE のように 真の信号が未知な場合、 クロスバリデーションで窓幅を選択するか、 ウェーブレット縮小 (PyWavelets) や Kalman filter のような周波数選択的・状態空間的なデノイジングに移行します。 「ノイズ除去で信号が消えないか」を常に交差検証することが鉄則です。

🎮 触って理解する

真の関数 (信号) は緑の曲線 y = sin(2πx) です。 ここに標準偏差 σ のガウスノイズを足したものが青い点の 観測データ。 σ を上げるほど点は散らばり、 SN 比 (信号対雑音比) が下がって「真の関係」が埋もれていきます。 移動平均の 窓幅 w を広げると観測データを平滑化 (オレンジ線) してノイズを薄められますが、 広げ過ぎると信号のカーブまで潰れて逆に真値から離れます ── これが平滑化のトレードオフです。

💡 グラフ上を上下にドラッグ (タッチ可) してもノイズの大きさ σ を変えられます。

信号の標準偏差
0.707
ノイズの標準偏差 (実測)
0.000
SN 比 (分散比)
SN 比 (dB)
生データの対真値 RMSE
0.000
平滑化後の対真値 RMSE
0.000

この実験から読み取れること

直感 → 落とし穴 → 発展

直感: 観測データ = 真の信号 (再現性のある構造) + ランダムな乱れ (ノイズ)。 ノイズは「消す」より「量と性質を測る」ものだと捉えると、 SN 比という共通のものさしで扱えるようになります。

よくある落とし穴 ── ノイズを学習してしまう (過学習): この実験の平滑化で窓幅を 狭く し過ぎると、 移動平均線が個々の観測点、 つまりノイズにぴったり張り付きます。 これは柔軟なモデルがノイズまで再現してしまう 過学習 (オーバーフィッティング) と同じ現象で、 訓練データでは誤差が小さくても真値 (未知データ) からは離れます。 少数点だけ見えた「上がり下がり」を本物のパターンと勘違いする 見せかけのパターン (spurious pattern) にも要注意です。 モデルの複雑さと誤差の関係は バイアス-バリアンス で整理できます。

発展: ノイズを抑える主な道具立ては 3 系統。 (1) 信号処理 ── 移動平均・ローパスフィルタ・ウェーブレット縮小・カルマンフィルタで周波数や状態空間の観点からノイズを分離する。 (2) 正則化 ── モデルに罰則を課して過度な柔軟性を抑え、 ノイズへの過剰適合を防ぐ。 (3) アンサンブル ── 多数のモデルや再標本を平均してノイズ由来のばらつきを打ち消す (√N 則の応用)。 外れ値型ノイズには ロバスト統計外れ値 処理が有効です。

📐 定義・数式

🍰 まずはやさしく

ノイズは数式で表せるズレのことです。

計算で誤差をまとめるために使います。

買い物での端数のようなものです。

ここではノイズの計算式について読みます。

【観測値の分解 (加法的ノイズ)】
$$ y_{\text{obs}} = y_{\text{true}} + \varepsilon, \quad \varepsilon \sim \mathcal{N}(0, \sigma^2) $$

観測値 $y_{\text{obs}}$ は真の値 $y_{\text{true}}$ にランダム誤差 $\varepsilon$ が加わったもの。 多くのモデルは $\varepsilon$ が平均 0、 分散 $\sigma^2$ のガウス分布を仮定する。

【SN 比 (Signal-to-Noise Ratio)】
$$ \text{SNR} = \frac{\sigma_{\text{signal}}^2}{\sigma_{\text{noise}}^2}, \qquad \text{SNR}_{\text{dB}} = 10 \log_{10}(\text{SNR}) $$

信号と雑音の分散比。 dB 表記で 20dB = SNR 100、 40dB = 10000。 通信工学では 30dB 以上が「クリア」とされる。

【$N$ サンプル平均で SNR が $N$ 倍になる】
$$ \bar{y}_N = \frac{1}{N} \sum_{i=1}^N y_i = y_{\text{true}} + \frac{1}{N}\sum_i \varepsilon_i, \quad \text{Var}(\bar{y}_N) = \frac{\sigma^2}{N} $$

i.i.d. ノイズなら、 $N$ 個の観測を平均すると分散は $1/N$ に縮む。 標準偏差は $1/\sqrt{N}$。 → SNR は $N$ 倍。 これがビッグデータの威力の源泉。

【ノイズの自己相関 (有色雑音の指標)】
$$ R_\varepsilon(\tau) = \mathbb{E}[\varepsilon_t \, \varepsilon_{t+\tau}] $$

時刻ずれ $\tau$ での相関。 白色雑音なら $R_\varepsilon(0) = \sigma^2,\,R_\varepsilon(\tau \neq 0) = 0$。 有色雑音は $\tau \neq 0$ でも非ゼロ。 自己相関 ACF プロットで判定可能。

【ノイズ除去 (移動平均フィルタ)】
$$ \hat{y}_t = \frac{1}{2k+1}\sum_{i=-k}^{k} y_{t+i} $$

窓幅 $2k+1$ の単純移動平均で平滑化。 $k$ が大きいほどノイズは消えるが、 信号の高周波成分 (= 急峻な変化) も消える。 信号 vs ノイズ分離はトレードオフ。

📐 SNR と CRLB——どこまで小さくできるかの理論的下限

ノイズ対策の最終目標は「信号を可能な限り正確に推定すること」である。では、 与えられた SNR でどこまで精度を上げられるか? その理論的下限を与えるのが Cramér-Rao 下界(CRLB)である。本節では SNR の定義を整理し、 CRLB を導入してフィルタ設計の限界を議論する。

12.1 SNR の 4 つの定義と使い分け

SNR(信号対雑音比)は分野ごとに微妙に異なる定義を持つ。混同すると論文を読み違えるので整理する。

定義数式用途単位
パワー比$P_{\text{signal}}/P_{\text{noise}}$信号処理、通信無次元または dB
振幅比$A_{\text{signal}}/\sigma_{\text{noise}}$計測工学、 統計無次元
PSNR$10 \log_{10}(\text{MAX}^2 / \text{MSE})$画像・映像評価dB
SNR per sample$E_s/N_0$デジタル通信dB

1 dB = 10 log₁₀(比) なので、 SNR 20 dB はパワー比 100、 振幅比 10 に相当する。SNR 0 dB は信号とノイズが同じパワー、 SNR -10 dB は信号がノイズの 1/10——これでも適切な処理を施せば情報抽出は可能で、 GPS は典型的に -20 dB 以下の信号を扱う。「SNR が低い = 情報なし」ではなく、 「SNR が低い = 工夫が必要」である。

12.2 Cramér-Rao 下界(CRLB)

パラメータ $\theta$ を観測 $y$ から推定するとき、 任意の不偏推定量 $\hat{\theta}$ の分散には下限がある:

$$\mathrm{Var}(\hat{\theta}) \geq \frac{1}{I(\theta)}, \quad I(\theta) = -E\left[\frac{\partial^2 \log p(y|\theta)}{\partial \theta^2}\right]$$

ここで $I(\theta)$ はフィッシャー情報量である。たとえば $y_i = \theta + n_i$、 $n_i \sim \mathcal{N}(0, \sigma^2)$ の単純ガウシアン観測で $N$ サンプル観測した場合、 CRLB は $\sigma^2/N$ となる。これは標本平均の分散と一致するので、 標本平均は CRLB を達成する最良の不偏推定量(efficient estimator)である。

応用:周波数推定の CRLB は $\mathrm{Var}(\hat{f}) \geq 6/(SNR \cdot N^3)$ となり、 観測時間 $N$ を 2 倍に増やすと精度は 8 倍向上する。これは GPS や AIS(船舶位置情報)で重要な指針となる。一方、 位相推定は $1/(SNR \cdot N)$ で SNR の影響が支配的——観測時間より受信機 LNA の性能を上げる方が効く。CRLB を計算することで「投資すべき方向」が定量的に分かる。

SSDSE-B-2026 の標本平均:人口の都道府県 47 件平均(2023 年 A1101) 標本平均: 2,645,809 人 標本標準偏差: 2,797,551 人 推定誤差の理論下限(CRLB): σ/√N = 2,797,551/√47 ≈ 408,065 実際の標本平均の標準誤差(SE): 408,065 人 → CRLB と一致 ✓ → 標本平均は efficient estimator として理論的に最良

12.3 Matched フィルタと最適受信機

白色ガウシアン雑音下で「既知信号が含まれているか」を判定する最適な受信機は Matched フィルタである。受信信号 $r(t) = s(t) + n(t)$ に対し、信号 $s(t)$ の時間反転 $h(t) = s(T-t)$ で畳み込むと、 出力 SNR が最大化される。レーダー、ソナー、デジタル通信、 重力波検出(LIGO)まで、 全て Matched フィルタの応用である。

SNR 改善量は $\mathrm{SNR}_{\text{out}} = 2E/N_0$ となり、信号エネルギー $E$ とノイズパワースペクトル密度 $N_0$ のみで決まる。信号波形の細かい形状は SNR に影響しない——これがレーダーで「長いチャープパルスでもパルス圧縮で短いパルスと同等の距離分解能が得られる」原理である。

🔬 数式を言葉で読み解く

数式に出てくる記号の意味を 1 つずつ確認しましょう。

$y_{\text{obs}}$
観測値 (observed)。 センサ値、 統計調査値、 アンケート回答など、 実際に手元に届くデータ。
$y_{\text{true}}$
真の値 (latent / unobserved)。 直接は観測できない本質的な量。 統計モデルで推定対象。
$\varepsilon$ (epsilon)
ノイズ項 / 誤差項 / 残差。 平均 0 のガウス分布が標準仮定 (中心極限定理から正当化される)。
$\sigma$ (sigma)
ノイズの標準偏差。 大きいほど信頼性が低い。 「観測値の 95% は $y_{\text{true}} \pm 2\sigma$ に入る」と読める。
$\sigma^2$
ノイズ分散。 加算性があり、 独立な誤差源が複数あれば $\sigma_{\text{total}}^2 = \sum \sigma_i^2$。
$\mathcal{N}(0, \sigma^2)$
平均 0、 分散 $\sigma^2$ のガウス (正規) 分布。 ノイズの「標準モデル」だが、 重い裾の現象では Cauchy・Student-$t$ 等を使う。
$\bar{y}_N$
$N$ サンプル平均。 標準誤差 (SE) は $\sigma/\sqrt{N}$ で減衰 ── サンプル数を 4 倍にすればノイズは半分になる。
SNR / SNRdB
Signal-to-Noise Ratio。 比または dB 表記。 SNR=1 (0dB) は信号とノイズが同等、 SNR=100 (20dB) は信号が圧倒的。
$R_\varepsilon(\tau)$
時刻ずれ $\tau$ におけるノイズの自己相関関数。 ACF プロットで可視化。 白色雑音は $\tau \ne 0$ でゼロ。

数値感覚で押さえる ── SSDSE-B-2026 で SNR を計算

2023 年 47 都道府県年平均気温 (B4101) の信号: 標準偏差 2.03 °C (北海道 11.0 ~ 沖縄 23.8)。 観測ノイズ (測器精度) を $\sigma = 0.1$ °C と仮定すると、 SNR $= 2.03^2 / 0.1^2 \approx 411 \approx 26.1$ dB。 国家統計レベルでは信号が圧倒的に大きい ── 「都道府県差」を議論するときノイズはほぼ無視できる。 個人センサ (家庭用温湿度計、 $\sigma=1$ °C) だと SNR $\approx 4$ (約 6 dB) に下がる。

「単位」と「ノイズ」のスケーリング

同じ気温データを「°C → K」に変えてもノイズの絶対値は変わらない (17.6 °C = 290.75 K、 0.5 °C = 0.5 K のまま)。 しかし「°C → %気温偏差」など相対量に変換すると、 ノイズの比例関係が変わる。 「ノイズは絶対値で記述するか相対値で記述するか」を区別すること ── センサ仕様書では絶対 SD、 経済指標では % 換算が多い。 SSDSE の人口データ (万人単位) は加算性のあるノイズで、 対数化 (log A1101) すると %単位の乗法ノイズとして扱える。

🔬 数式を言葉で読み解く (2):「平均化でなぜ SNR が増えるか」

分散の式 $\text{Var}(\bar{y}_N) = \sigma^2 / N$ を言葉で説明する。

  1. $N$ 個の観測 $y_1, \ldots, y_N$ を平均する」 ── どれも同じ真値 $y_{\text{true}}$ + ランダムノイズ。
  2. 平均すると真値は変わらない」 ── 期待値の線形性 $\mathbb{E}[\bar{y}] = y_{\text{true}}$ で済む。
  3. ノイズはランダム → 半分は正・半分は負」 ── 足すと打ち消し合う。
  4. 独立性のおかげで分散は足し算可能」 ── $\text{Var}(\varepsilon_1 + \cdots + \varepsilon_N) = N\sigma^2$ (独立同分布)。
  5. $1/N$ で割ると分散は $1/N^2$ 倍になる」 ── $\text{Var}(\bar{y}) = N\sigma^2 / N^2 = \sigma^2 / N$。
  6. 標準偏差は $1/\sqrt{N}$ で減衰」 ── サンプル 100 倍で誤差 10 分の 1、 1 万倍で 100 分の 1。

注意点: この性質は独立同分布 (i.i.d.)のとき。 同じ機器を 1000 回使えば系統誤差は消えず、 単に平均値の系統偏りが残る ── 「機器を変える」「測定者を変える」のがバイアス除去の本道。

🔬 数式を言葉で読み解く(ノイズ)

ノイズ(noise)とは、観測データに混入する不要な変動成分の総称である。本来知りたい「信号(signal)」に対し、測定機器の限界・環境変動・人的入力ミス・通信時の量子化誤差など、さまざまな由来で混入する。データサイエンスの実務では「ノイズをどう減らすか」「ノイズの中に隠れた本物の信号をどう取り出すか」が、モデル精度・解釈性・意思決定の信頼性を左右する。

1. 観測モデル:信号 + ノイズ

最も基本的な観測モデルは次式で表される。

$$y_i = f(x_i) + \varepsilon_i, \quad \varepsilon_i \sim \mathcal{N}(0, \sigma^2)$$

ここで $y_i$ は観測値、 $f(x_i)$ は真の信号、 $\varepsilon_i$ がノイズ成分である。ノイズが平均 0・分散 $\sigma^2$ の正規分布に従うと仮定するのが最も普及した形(ガウシアンノイズ)で、回帰モデルや誤差伝播理論の前提となる。記号を 1 つずつ言葉で説明すると次のとおり。

2. ノイズの 4 大分類

分類由来典型例対策
ガウシアンノイズ温度ゆらぎ・熱雑音センサー測定値の細かい揺れ平均化・ローパスフィルタ
ショットノイズ離散事象(光子計数等)暗い画像のざらつき露光時間延長・ポアソン正則化
量子化ノイズA/D 変換の丸め整数化された測定値の誤差ビット深度の向上
外れ値ノイズ入力ミス・機器故障身長 17000cm のような桁違いロバスト統計・データクレンジング

3. 信号対雑音比 (SNR)

ノイズの「強さ」は単独では意味を持たず、信号と比較して初めて評価できる。代表的指標が 信号対雑音比 (Signal-to-Noise Ratio; SNR)である。

$$\mathrm{SNR} = \frac{\mathrm{Var}(f(x))}{\mathrm{Var}(\varepsilon)} = \frac{\sigma_{\text{signal}}^2}{\sigma_{\text{noise}}^2}$$

デシベル表記:$\mathrm{SNR}_{\mathrm{dB}} = 10 \log_{10}(\sigma_{\text{signal}}^2 / \sigma_{\text{noise}}^2)$。SNR が大きいほど信号が支配的、小さいほどノイズに埋もれている、と読む。一般に SNR が 10 dB を下回ると、機械学習モデルでも有意な特徴を取り出すのが難しくなる。

散布図(信号 vs ノイズ)
図 1:信号と観測値(信号+ノイズ)の散布図。ノイズが大きいほど点が縦方向に散らばる。

4. ノイズ分布の可視化

残差 $r_i = y_i - \hat{f}(x_i)$ のヒストグラムを描けば、ノイズが想定通り正規分布に従うかを目視できる。歪みや裾の重さがあるなら、最尤推定・最小二乗法の仮定が崩れている合図となる。

ヒストグラム(ノイズ分布)
図 2:残差ヒストグラム。釣鐘型なら正規ノイズ、左右非対称なら系統誤差混入の可能性。

5. デノイジング(ノイズ削減)の代表手法

  1. 移動平均・ローパスフィルタ:時系列の局所平均で高周波ノイズを除去。窓幅の選択がトレードオフ。
  2. カルマンフィルタ:観測モデルと状態遷移モデルを組み合わせ、逐次的に最適推定値を更新。GPS・IMU の融合で標準。
  3. ウェーブレット変換:信号を多重解像度に分解し、ノイズ成分のウェーブレット係数を閾値処理して除去(ソフト/ハード閾値)。
  4. ロバスト回帰:M 推定・Huber 損失で外れ値ノイズの影響を抑制。
  5. 正則化:L1/L2 罰則を加え、過剰なノイズ適合(過学習)を抑制。
  6. アンサンブル平均:複数の独立観測の平均で $\sigma_{\text{noise}}$ は $1/\sqrt{n}$ に低減される(中心極限定理)。
  7. オートエンコーダ:DNN で潜在表現を学習し、復元誤差最小化によりノイズ成分を排除(denoising autoencoder)。

6. SN比別に見た機械学習モデルの精度

SNR が下がるほど、同じモデル・同じ特徴量でも予測精度は劇的に悪化する。下図は SNR を変化させたときの精度(仮想実験)。

箱ひげ図(SN比別精度)
図 3:SNR が高いほど精度の中央値が高く、ばらつきも小さい。低 SNR では中央値が下がり外れ値も増える。

7. ノイズが ML モデルに与える 3 つの影響

8. 業務応用例

9. ノイズと公的統計データ(SSDSE-B-2026 への示唆)

SSDSE-B-2026 のような公的統計でも、調査票回収率の地域差、回答者の自己申告バイアス、集計時の四捨五入など、形式は違えどノイズは必ず存在する。例えば「人口 1000 人当たり医師数」のような比率は、分母(人口)の小さい自治体ほど分子側の少数変動の影響を受け、見かけ上のばらつきが大きく見える(ラベル統計学でいう small numbers の問題)。こうした現象もノイズの一種であり、地図化や順位比較の際は信頼区間を併記すべきである。

10. ✅ 理解度チェック

  1. SNR が 20 dB の信号と 0 dB の信号、どちらが信号成分の方が大きいか? (答:20 dB の方が信号 100 倍。0 dB は信号とノイズが同等)
  2. 独立な観測を 100 回平均すると、ガウシアンノイズの標準偏差はおよそ何分の 1 になるか? (答:$\sqrt{100}=10$ 分の 1)
  3. 外れ値ノイズに強い回帰手法を 1 つ挙げよ。 (答:Huber 回帰・RANSAC・最小絶対偏差 (LAD) など)

11. まとめ

ノイズは「除去すべき敵」ではなく「観測そのものの一部」として理解するのが正攻法である。信号モデル・観測モデルを明示的に書き下し、SNR で量的に把握し、適切なフィルタ・正則化・ロバスト手法で扱う——この一連の流れがあって初めて、データ分析は「結果を信頼できる」段階に到達する。

🔬 ノイズ源の物理的・統計的分類(深掘り)

ノイズを実務で扱うには、まず「どこから来たか」を物理的・統計的に分類することが第一歩である。発生源が分かれば、後段のフィルタ設計や前処理が圧倒的に楽になる。本節では、信号処理・統計・機械学習の各分野で頻出する 8 種のノイズ源を、SSDSE-B-2026 のような公的統計データと結び付けて整理する。

11.1 加法的ノイズと乗法的ノイズ

もっとも基本的な区別は「足し算で乗るか、 掛け算で乗るか」である。加法的ノイズ $y = x + n$ は熱雑音・量子化雑音などの典型例で、信号の振幅に依存しない一定強度を持つ。一方、 乗法的ノイズ $y = x \cdot n$ は光学画像のスペックル、 レーダー信号の干渉などで現れ、信号が強いほどノイズも強くなる。対数変換 $\log y = \log x + \log n$ で乗法的ノイズは加法的に変換でき、 線形フィルタが適用可能になる——これが「対数を取ると分散が安定する」効果の本質である。

分類モデル典型例対策
加法的ガウシアン$y = x + \mathcal{N}(0, \sigma^2)$センサ熱雑音、量子化誤差線形フィルタ・移動平均
加法的非ガウシアン$y = x + n$, $n \sim$ heavy-tailed外れ値、衝撃ノイズメジアンフィルタ、Huber 損失
乗法的$y = x \cdot n$スペックル、ショット雑音対数変換後にフィルタ
畳み込み的$y = h * x + n$ぼけ、残響、リバーブデコンボリューション、Wiener フィルタ
量子化$y = Q(x)$AD 変換、画像 8 bit 化ディザリング、 増分エンコーディング
欠損$y_i = $ NaN with prob $p$調査回答漏れ、センサ断多重代入、 EM アルゴリズム
ラベルノイズ$\tilde{y} = y \oplus n$(離散)アノテーションミスnoise-aware loss、 共教師
分布シフト$p_{\text{test}} \neq p_{\text{train}}$共変量変化、概念ドリフトdomain adaptation、 再学習

11.2 1/f ノイズ(ピンクノイズ)とフラクタル構造

白色雑音はあらゆる周波数で同じパワーを持つ理想化されたモデルだが、 現実の多くの自然現象——心拍変動、 株価変動、 河川流量、 地震波——のパワースペクトルは周波数 $f$ の逆数に比例して減衰する。これを 1/f ノイズ(ピンクノイズ)と呼び、 時間軸でも自己相似(フラクタル)構造を持つ。SSDSE-B-2026 で言えば、 都道府県別の人口時系列を長期的に観測すると、年単位の変動の中に月単位の変動が、 さらにその中に週単位の変動が——という入れ子構造が現れる。これは独立同分布な白色雑音モデルでは捉えられず、 ARFIMA や Hurst 指数による長期記憶モデリングが必要になる。

ピンクノイズの重要な性質は、 平均化による減衰が白色雑音より遅いことである。$N$ サンプル平均で白色雑音は $\sigma/\sqrt{N}$ に減衰するが、 ピンクノイズは $\sigma/N^{H-1/2}$($H$ は Hurst 指数で 0.5 < H < 1)でしか減衰しない。つまり「もっと観測すれば消える」という常識が通用しない世界である。気候・経済・地震・神経活動の長期データを扱うときは、 まず periodogram を両対数プロットして傾きが -1 に近いかを確認する習慣を付けたい。

11.3 ショット雑音(ポアソン雑音)と計数統計

光検出器・放射線計測器・粒子加速器など、 離散的な事象を計数するセンサーでは、 計数値 $N$ そのものに $\sqrt{N}$ の固有のばらつきが生じる。これはポアソン分布から導かれる根本的限界で、 検出器を改良しても消せない物理的下限である。SNR は $N/\sqrt{N} = \sqrt{N}$ となり、 信号を 100 倍長く観測すると SNR は 10 倍にしか改善しない。CT スキャンの放射線量を半分にすると、 ノイズは $\sqrt{2}$ 倍に増えるという経験則の根拠でもある。

公的統計でも類似の構造が現れる。人口 1000 人の小規模自治体で「年間出生数」を観測する場合、 真の出生率が 0.01 でも観測値は $\mathcal{P}(10)$ に従い、 ±3 程度の自然変動が乗る。これを「出生率が変動した」と解釈してはいけない。比率の信頼区間は $\hat{p} \pm 1.96\sqrt{\hat{p}(1-\hat{p})/n}$ で表され、 分母 $n$ が小さいと幅が広がる——これも一種のショットノイズである。

ポアソン分布のパラメータ λ における SNR λ = 10 → SNR = √10 ≈ 3.16 λ = 100 → SNR = √100 = 10.0 λ = 1000 → SNR = √1000 ≈ 31.6 → 観測回数 100 倍で SNR は 10 倍にしか改善しない(平方根則)

11.4 量子化雑音とディザリング

連続値の物理量を有限ビットのデジタル値に変換する AD コンバータでは、 必ず四捨五入によるノイズが入る。$b$ ビット量子化での量子化ステップ $\Delta = (x_{\max}-x_{\min})/2^b$ に対し、 量子化雑音の分散は $\Delta^2/12$ となり、 これが SNR の理論上限を決める。CD オーディオの 16 bit / 44.1 kHz では SNR が約 96 dB、 ハイレゾの 24 bit では約 144 dB となる。これ以上は AD コンバータの物理限界を超えており、 ソフトウェア側でいくら工夫しても改善しない。

面白いのは、 意図的に微小なノイズを加える「ディザリング」という手法である。信号レベルが量子化ステップ以下の小さな変動を、 量子化前にディザノイズを足してから量子化すると、 統計的にその微小信号が復元できる。これは「ノイズを加えると情報が増える」という直感に反する現象で、 確率共鳴(stochastic resonance)と呼ばれる広い現象群の一例である。

🧮 実値で計算してみる

SSDSE-B-2026 の都道府県年平均気温 (B4101) を題材に、 (A) ノイズ重畳後の SNR 計算、 (B) 平均化による SNR 改善、 (C) 移動平均で時系列ノイズ除去のトレードオフ、 を順に手計算する。

A. ノイズ重畳と SNR 計算 (47 県データ)

STEP A1 真値読み込み
SSDSE-B-2026 から 2023 年 47 県の B4101 (年平均気温、 °C)。 最低 11.0 (北海道)、 最高 23.8 (沖縄)、 信号 SD = 2.03 °C。
STEP A2 ノイズ生成 (測器精度 $\sigma=0.5$ °C と仮定)
$\varepsilon_i \sim \mathcal{N}(0, 0.5^2)$ を 47 個生成、 $y_{\text{obs},i} = y_{\text{true},i} + \varepsilon_i$。
STEP A3 SNR の算出
$\text{SNR} = 2.03^2 / 0.5^2 = 4.12 / 0.25 = 16.48$、 dB 換算 $10 \log_{10}(16.48) = 12.17$ dB。
STEP A4 解釈
SNR ≈ 16 倍 → 信号 (47 県の地理差) は雑音 (測定誤差) の約 16 倍。 「北海道 vs 沖縄」程度の差は明瞭に出るが、 「埼玉 vs 千葉」のような近隣県は誤差で区別困難。
SSDSE-B-2026 47 県年平均気温 B4101 (2023 年、 °C) 北海道 (11.0) → 観測値 11.15 ノイズ +0.15 東京 (17.6) → 観測値 17.63 ノイズ +0.03 沖縄 (23.8) → 観測値 24.24 ノイズ +0.44 … (全 47 県) 信号 SD = 2.03 °C ノイズ SD = 0.50 °C SNR = 16.48 SNR_dB = +12.17 dB ← 信号が雑音の 約 16 倍

B. 平均化で SNR を改善

STEP B1 同じ県を $N$ 日測定する想定 (= $N$ 回観測の平均)
理論: SE($\bar{y}_N$) = $\sigma / \sqrt{N}$。 SNR は $N$ 倍。
STEP B2 $N=4, 16, 100$ で確認
SE 減衰: $0.50 \to 0.25 \to 0.125 \to 0.050$。 SNR 増加: $16 \to 66 \to 264 \to 1648$。
N SE = σ/√N SNR SNR_dB 1 0.500 16.48 +12.2 dB 4 0.250 65.9 +18.2 dB 16 0.125 263.7 +24.2 dB 100 0.050 1648 +32.2 dB 10000 0.005 164800 +52.2 dB

C. 移動平均フィルタの窓幅トレードオフ

気温時系列に $\sigma=2.0$ のガウス雑音を載せたとき、 窓幅 $k$ の移動平均でどこまでノイズが除去できるか、 また信号 (季節変動) がどれだけ削られるかをシミュレーション。

窓幅 $2k+1$残差ノイズ SD信号歪み判定
31.16 °C13.1%緩い (ノイズ残)
70.76 °C8.5%バランス良好
310.35 °C4.2%強め平滑 (この設定では残差最小)
910.91 °C11.4%過剰平滑 (信号削りで残差増)

📌 窓幅は信号の変動の特性時間に合わせる。 季節変動 (周期 365 日) なら窓 7〜31 が妥当。 月平均なら 30 日固定、 週次変動を捉えるなら 7 日窓。

🧮 数式に値を入れて手で計算する: SN 比

合成信号と雑音から SN 比 (dB) を計算する。

Step 1: 信号と雑音のパワー

信号 P_s = 100 雑音 P_n = 1 SNR (倍率) = 100/1 = 100

Step 2: dB 表記

SNR_dB = 10 log₁₀(100) = 20 dB SNR=10 → 10 dB SNR=1000 → 30 dB

🐍 Python で再現

1
2
3
4
5
import numpy as np
ratios = np.array([10, 100, 1000, 10000])
dB = 10 * np.log10(ratios)
print(f"SN比 (倍率): {ratios}")
print(f"dB: {dB}")

📤 実行結果

SN比 (倍率): [ 10 100 1000 10000] dB: [10. 20. 30. 40.]

💬 手計算 (Step 2) 20dB と Python 出力が完全一致。

🐍 Python 実装

7 つのハンズオン: (1) SSDSE 47 県気温に雑音を載せて SNR 計測、 (2) 平均化で SNR 改善を実測、 (3) 移動平均フィルタで時系列ノイズ除去、 (4) Savitzky-Golay フィルタの比較、 (5) LOWESS で非線形平滑化、 (6) ACF プロットでノイズ色判定、 (7) ロバスト統計 (中央値・MAD) で外れ値型ノイズ対応。 全例で data/raw/SSDSE-B-2026.csv を使用。

① SSDSE 47 県気温に雑音を載せて SNR を測る

🎯 このコードでやること: SSDSE-B-2026 から「年平均気温 (B4101)」を 47 県分読み込み、 $\sigma=0.5$ °C のガウス雑音を加えた観測値を作り、 SNR を実測する。

📥 入力データ: data/raw/SSDSE-B-2026.csv の B4101 列。

Prefecture B4101 (°C、 年平均気温) 01 北海道 11.0 13 東京都 17.6 27 大阪府 18.0 47 沖縄県 23.8 … (47 県)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import numpy as np
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
temp = df[df['SSDSE-B-2026'] == 2023]['B4101'].values.astype(float)   # °C 年平均気温

rng = np.random.default_rng(42)
noise = rng.normal(0, 0.5, len(temp))
obs   = temp + noise

snr    = temp.var() / noise.var()
snr_db = 10 * np.log10(snr)
print(f'信号 SD = {temp.std():.2f} °C')
print(f'ノイズ SD = {noise.std():.2f} °C')
print(f'SNR    = {snr:.2f}   SNR_dB = {snr_db:.2f} dB')

📤 実行結果:

信号 SD = 2.03 °C ノイズ SD = 0.39 °C SNR = 27.04 SNR_dB = 14.32 dB

💬 結果の読み方: 信号 (47 県の地理差) のばらつき 2.03 °C に対し、 注入したノイズは標本 47 個で SD 0.39 °C。 SNR ≈ 27、 14.3 dB。 → 「都道府県差を語る分析」ではノイズの影響は小さい。 「近隣県の 0.3 °C 差」を主張するならノイズと差が拮抗するため要注意。

② $N$ 回観測の平均で SNR が $N$ 倍になることを実測

🎯 このコードでやること: 同じ気温データに対し、 ノイズ重畳 → 平均化を $N \in \{1, 4, 16, 100, 10000\}$ で繰り返し、 残差 SD と SNR の関係をプロット。

📥 入力データ: ①と同じ気温 (47 県)。 シミュレーションで各県を $N$ 回観測したことにする。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import numpy as np
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
temp = df[df['SSDSE-B-2026'] == 2023]['B4101'].values.astype(float)
rng = np.random.default_rng(0)
SIGMA = 0.5

print(f'   N    SE実測     SE理論     SNR        SNR_dB')
for N in [1, 4, 16, 100, 10000]:
    # 各県 N 回の観測 → 平均
    noise_avg = rng.normal(0, SIGMA, (N, len(temp))).mean(axis=0)
    se_emp    = noise_avg.std()
    se_theory = SIGMA / np.sqrt(N)
    snr       = temp.var() / noise_avg.var()
    print(f'{N:5d}  {se_emp:8.4f}  {se_theory:8.4f}  {snr:10.1f}  {10*np.log10(snr):+6.2f} dB')

📤 実行結果:

N SE実測 SE理論 SNR SNR_dB 1 0.4220 0.5000 23.1 +13.63 dB 4 0.2699 0.2500 56.4 +17.51 dB 16 0.1306 0.1250 240.6 +23.81 dB 100 0.0582 0.0500 1211.8 +30.83 dB 10000 0.0050 0.0050 161203.6 +52.07 dB

💬 結果の読み方: 実測 SE は理論 $\sigma/\sqrt{N}$ に沿って減衰する ($N=1$ は標本 47 個ぶんの揺らぎで多少ずれるが、 $N$ が増えるほど一致)。 $N$ を 100 倍にすると SD は 10 分の 1、 SNR は 100 倍、 SNR_dB は +20 dB。 → 「精度を 10 倍にしたい」=サンプル数 100 倍が必要。 これがコスト感の根拠。

③ 移動平均フィルタで時系列ノイズ除去 (窓幅スイープ)

🎯 このコードでやること: 47 県気温を「12 ヶ月分の周期信号 + ガウス雑音」に拡張し、 窓幅 $k \in \{3, 7, 15, 31, 91\}$ で移動平均を取って、 ノイズ残差 SD と信号歪みを比較する。

📥 入力データ: SSDSE 各県の年平均気温 + 月別変動 (季節項) を仮想生成。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import numpy as np
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
tokyo_temp = df[(df['SSDSE-B-2026'] == 2023) & (df['Prefecture'] == '東京都')]['B4101'].astype(float).iloc[0]  # 17.6 °C

t = np.arange(365)
signal = tokyo_temp + 10 * np.sin(2*np.pi*t/365 - np.pi/2)  # 季節変動
noise  = np.random.default_rng(0).normal(0, 2.0, 365)
obs    = signal + noise

print(f'窓幅  残差ノイズ SD   信号歪み %')
for w in [3, 7, 15, 31, 91]:
    smoothed = pd.Series(obs).rolling(w, center=True, min_periods=1).mean().values
    noise_residual_sd = (smoothed - signal).std()
    signal_distortion = abs(signal - smoothed).mean() / signal.std() * 100
    print(f'{w:4d}     {noise_residual_sd:.3f}         {signal_distortion:5.1f} %')

📤 実行結果:

窓幅 残差ノイズ SD 信号歪み % 3 1.157 13.1 % 7 0.757 8.5 % 15 0.496 5.6 % 31 0.353 4.2 % 91 0.910 11.4 %

💬 結果の読み方: 窓を広げるとノイズは確実に減るが、 同時に信号 (季節変動) の振幅も削られる。 $k=7$ が「残差 0.76 / 歪み 8.5%」でバランス良好。 $k=91$ は窓が広すぎて季節変動そのものを潰し、 残差 (信号損失込み) がむしろ増える ── 用途に応じて窓幅を選ぶ。

④ Savitzky-Golay フィルタで信号を保ちつつ平滑化

🎯 このコードでやること: 移動平均より高度な Savitzky-Golay フィルタ (窓内多項式回帰) で、 信号の極値を保ったままノイズ除去する。 ピーク位置の保存が重要なクロマトグラフィー・分光器で標準。

📥 入力データ: ③と同じ東京の年気温時系列。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import numpy as np
from scipy.signal import savgol_filter
import pandas as pd

t = np.arange(365)
signal = 17.6 + 10 * np.sin(2*np.pi*t/365 - np.pi/2)
noise  = np.random.default_rng(0).normal(0, 2.0, 365)
obs    = signal + noise

sg = savgol_filter(obs, window_length=31, polyorder=3)
ma = pd.Series(obs).rolling(31, center=True, min_periods=1).mean().values

print(f'         残差 SD    最大値 (true=27.6)   最小値 (true=7.6)')
print(f'真値      0.00      {signal.max():6.2f}             {signal.min():6.2f}')
print(f'生 obs   {(obs-signal).std():5.2f}     {obs.max():6.2f}             {obs.min():6.2f}')
print(f'移動平均  {(ma-signal).std():5.2f}     {ma.max():6.2f}             {ma.min():6.2f}')
print(f'SavGol   {(sg-signal).std():5.2f}     {sg.max():6.2f}             {sg.min():6.2f}')

📤 実行結果:

残差 SD 最大値 (true=27.6) 最小値 (true=7.6) 真値 0.00 27.60 7.60 生 obs 2.02 31.82 3.16 移動平均 0.35 27.51 7.16 SavGol 0.53 27.85 6.83

💬 結果の読み方: 残差 SD は移動平均 (0.35) のほうが小さく、 単純な正弦波+白色雑音ではノイズ除去は移動平均が有利。 一方 SavGol は多項式近似のためピーク付近の形状追従がよく、 ピーク高の誤差は両者とも ±0.3 °C 以内で拮抗する。 分光ピークや心電図 R 波のように鋭いピークを保ちたい場面ほど SavGol の優位が明確になる。

⑤ LOWESS で非線形平滑化

🎯 このコードでやること: statsmodels.api.nonparametric.lowess で非線形平滑化。 局所重み付き回帰で、 信号形状を仮定せずに滑らかな曲線を引く。

📥 入力データ: ④と同じ年気温データ。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import numpy as np
import statsmodels.api as sm

t = np.arange(365)
signal = 17.6 + 10 * np.sin(2*np.pi*t/365 - np.pi/2)
obs    = signal + np.random.default_rng(0).normal(0, 2.0, 365)

for frac in [0.05, 0.15, 0.30]:
    smoothed = sm.nonparametric.lowess(obs, t, frac=frac, return_sorted=False)
    resid_sd = (smoothed - signal).std()
    print(f'LOWESS frac={frac:4.2f}  残差 SD={resid_sd:.3f}')

📤 実行結果:

LOWESS frac=0.05 残差 SD=0.619 LOWESS frac=0.15 残差 SD=0.363 LOWESS frac=0.30 残差 SD=0.597

💬 結果の読み方: frac=0.15 (= 局所窓 55 日相当) で残差 SD 0.36 と最良。 frac が小さすぎる (0.05=18 日) と過小平滑、 大きすぎる (0.30=110 日) と過剰平滑。 「最適窓幅を決めずに sweep して決定」が実務的。

⑥ ACF プロットで「白色 vs 有色」を判定

🎯 このコードでやること: 2 種類のノイズ (白色 i.i.d. vs AR(1) 有色) の自己相関 ACF を比較し、 有色雑音の検出方法を示す。

📥 入力データ: 1000 ポイントの合成系列 (SSDSE 由来でないが、 概念デモ用)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import numpy as np
from statsmodels.tsa.stattools import acf

rng = np.random.default_rng(0)
white  = rng.normal(0, 1, 1000)

# AR(1): x_t = 0.7 * x_(t-1) + noise   ← 有色 (低周波強調)
colored = np.zeros(1000)
for i in range(1, 1000):
    colored[i] = 0.7 * colored[i-1] + rng.normal()

acf_white   = acf(white,   nlags=5, fft=True)
acf_colored = acf(colored, nlags=5, fft=True)
print('lag    白色 ACF     有色 ACF')
for k in range(6):
    print(f'{k:3d}   {acf_white[k]:+8.4f}  {acf_colored[k]:+8.4f}')

📤 実行結果:

lag 白色 ACF 有色 ACF 0 +1.0000 +1.0000 1 +0.0058 +0.6917 2 -0.0061 +0.4890 3 +0.0073 +0.3562 4 +0.0132 +0.2424 5 -0.0367 +0.1567

💬 結果の読み方: 白色雑音は lag≥1 で ACF が ±0.05 内 (ノイズ域)。 一方 AR(1) は ACF が $\rho_k = 0.7^k$ で減衰し、 lag 5 でもまだ 0.17。 → 「ACF が長く減衰しない」=有色雑音の証拠。 ARIMA・状態空間モデル等で扱うべき。

⑦ ロバスト統計 (中央値・MAD) で外れ値型ノイズに対応

🎯 このコードでやること: 47 都道府県人口 (A1101) の中心と散らばりを、 「平均 + SD」と「中央値 + MAD」で比較。 東京の外れ値が両者にどう影響するかを見る。

📥 入力データ: SSDSE-B-2026 の A1101 (47 県人口、 万人)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import numpy as np
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
pop = df[df['SSDSE-B-2026'] == 2023]['A1101'].values.astype(float) / 1e4     # 万人

mean, sd  = pop.mean(), pop.std()
med, mad  = np.median(pop), np.median(np.abs(pop - np.median(pop))) * 1.4826  # normalized MAD
print(f'全 47 県:')
print(f'  mean = {mean:7.2f}    SD  = {sd:7.2f} (非ロバスト)')
print(f'  median={med:7.2f}    MAD = {mad:7.2f} (ロバスト)')

# 東京を除外
pop2 = pop[pop < 1000]      # 東京 (1409 万) を除外
print(f'東京除外 (46 県):')
print(f'  mean = {pop2.mean():7.2f}    SD  = {pop2.std():7.2f}   → 平均 -25 万、 SD -55')
print(f'  median={np.median(pop2):7.2f}    → 中央値ほぼ変わらず (ロバスト)')

📤 実行結果:

全 47 県: mean = 264.58 SD = 276.76 (非ロバスト) median= 154.90 MAD = 92.37 (ロバスト) 東京除外 (46 県): mean = 239.71 SD = 221.79 → 平均 -25 万、 SD -55 median= 150.85 → 中央値ほぼ変わらず (ロバスト)

💬 結果の読み方: 東京 1 件を除くだけで平均が 25 万人・SD が 80 動く ── 非ロバスト統計の脆弱性。 一方、 中央値と MAD はほぼ変わらない (154→152、 MAD は維持)。 「外れ値型ノイズ (impulse)」に対しては平均よりロバスト統計を使うべき。

🐍 フィルタ設計の Python 実例(実データ + 段階的検証)

本節では、SSDSE-B-2026 の人口時系列(仮想的に拡張)と、 公的医療統計の年次値を想定した時系列データを対象に、 ノイズ除去フィルタの代表 5 種を Python で実装し、結果を比較する。

13.1 移動平均フィルタ(最も基本)

このコードでやること:SSDSE-B-2026 の都道府県人口(時系列模擬)に対し、窓幅 5 の単純移動平均(SMA)と指数移動平均(EMA)を pandas で計算し、 ノイズ除去効果を比較する。

📥 入力データ(SSDSE-B-2026 から都道府県別人口 47 件 + 時間軸方向に 20 期分の擬似時系列):

SSDSE-B-2026 から読み込み: 都道府県 期1 期2 期3 ... 期20 北海道 5092000 5085000 5078000 ... 5010000 青森県 1184000 1181000 1178000 ... 1150000 ... ※ 実データは pd.read_csv('data/raw/SSDSE-B-2026.csv') で取得
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import pandas as pd
import numpy as np

# SSDSE-B-2026 2023 年 47 都道府県の総人口を取得
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
pop_series = df[df['SSDSE-B-2026'] == 2023]['A1101'].values.astype(float)  # A1101 総人口

# 単純移動平均 (SMA) と指数移動平均 (EMA)
s = pd.Series(pop_series)
sma5 = s.rolling(window=5, center=True).mean()
ema5 = s.ewm(span=5).mean()

print(f"原系列の標準偏差     : {s.std():,.0f}")
print(f"SMA(5) 後の標準偏差  : {sma5.std():,.0f}")
print(f"EMA(span=5) 後の標準偏差: {ema5.std():,.0f}")
print(f"SMA のノイズ削減率   : {(1 - sma5.std()/s.std())*100:.1f}%")

📤 実行すると次の出力が得られる:

原系列の標準偏差 : 2,797,551 SMA(5) 後の標準偏差 : 1,802,822 EMA(span=5) 後の標準偏差: 1,653,944 SMA のノイズ削減率 : 35.6%

💬 都道府県人口は値域の幅が極めて大きい(東京 1409 万、 鳥取 54 万)ため、 地域コード順の系列に 5 点移動平均をかけると標準偏差が約 36% 縮む。 ただしこれは「隣接県をならして山を削った」結果でもあり、 本来の時系列ノイズ除去は定常的(平均値が一定)な系列で意味を持つ点に注意。

13.2 メジアンフィルタ(外れ値に強い)

このコードでやること:SSDSE-B-2026 の出生数 (A4101) を昇順ソートして滑らかな曲線にし、 3 点に「報告ミスによる 10 倍スパイク」を混入。 移動平均 (SMA) とメジアンフィルタの外れ値除去性能を RMSE で比較する。

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A4101(出生数) 北海道 24,430 東京都 86,348 沖縄県 12,549 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
from scipy.signal import medfilt
import pandas as pd
import numpy as np

# SSDSE-B-2026 2023 年の出生数を取得し、昇順ソートで滑らかな曲線にする
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
births = np.sort(df[df['SSDSE-B-2026'] == 2023]['A4101'].values.astype(float))  # A4101 出生数

# 47 件中 3 件に「集計ミスを想定した 10 倍値」を混入
contaminated = births.copy()
contaminated[10] = births[10] * 10   # 外れ値
contaminated[25] = births[25] * 10
contaminated[40] = births[40] * 10

# メジアンフィルタ vs. 移動平均
sma3 = pd.Series(contaminated).rolling(3, center=True).mean().bfill().ffill().values
med3 = medfilt(contaminated, kernel_size=3)

print(f"真値との RMSE (原)     : {np.sqrt(((contaminated-births)**2).mean()):,.0f}")
print(f"真値との RMSE (SMA(3)) : {np.sqrt(((sma3-births)**2).mean()):,.0f}")
print(f"真値との RMSE (Med(3)) : {np.sqrt(((med3-births)**2).mean()):,.0f}")

📤 実行例:

真値との RMSE (原) : 46,965 真値との RMSE (SMA(3)) : 27,289 真値との RMSE (Med(3)) : 4,634

💬 移動平均は外れ値を周囲に「染み出させてしまう」ため、 RMSE は 27,289 までしか改善しない。一方、 メジアンフィルタは孤立スパイクをほぼ完全に排除でき、 RMSE は 4,634 と約 6 倍の精度差。「外れ値混入の懸念があるならまずメジアン」が鉄則である。

13.3 Savitzky-Golay フィルタ(信号形状を保つ)

このコードでやること:scipy.signal.savgol_filter を使い、 SSDSE-B-2026 の年齢階級別人口分布(疑似時間軸)にノイズが乗ったときの平滑化効果を確認する。多項式次数 2、 窓幅 7 で、 ピーク位置を保ちつつノイズを除去する。

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) 北海道 5,092,000 東京都 14,086,000 沖縄県 1,468,000 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
from scipy.signal import savgol_filter
import pandas as pd
import numpy as np

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
# 都道府県を総人口順にソートして系列扱い(滑らかな曲線を作る)
sorted_pop = np.sort(df[df['SSDSE-B-2026'] == 2023]['A1101'].values.astype(float))

# Savitzky-Golay(多項式次数 2、 窓幅 7)
sg = savgol_filter(sorted_pop, window_length=7, polyorder=2)

print(f"原系列のピーク値: {sorted_pop.max():,.0f}")
print(f"SG 後のピーク値 : {sg.max():,.0f}")
print(f"ピーク保存率    : {sg.max()/sorted_pop.max()*100:.2f}%")
print(f"系列ノイズ低減率: {(1 - np.std(np.diff(sg))/np.std(np.diff(sorted_pop)))*100:.1f}%")

📤 実行例:

原系列のピーク値: 14,086,000 SG 後のピーク値 : 13,087,167 ピーク保存率 : 92.91% 系列ノイズ低減率: 36.2%

💬 総人口を昇順に並べた曲線に対し、 Savitzky-Golay は最大値(東京)を 92.9% 保ちながら、 隣接差分で測ったノイズを約 36% 減らせる。 東京は突出した外れ値なので窓幅 7 では多少削れるが、 なだらかな中位県ではピーク形状がよく保たれる。スペクトル解析・クロマトグラフィ・心電図解析など「ピーク位置が大事な解析」での定番。

13.4 カルマンフィルタ(モデル + 観測の最適融合)

このコードでやること:1 次元のランダムウォーク + ガウシアン観測ノイズに対し、 単純カルマンフィルタで真の状態を推定する。SSDSE-B-2026 のような年次データに「観測精度の異なる複数調査の融合」を行う最小例。

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) 北海道 5,092,000 東京都 14,086,000 沖縄県 1,468,000 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import pandas as pd
import numpy as np

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
obs = df[df['SSDSE-B-2026'] == 2023]['A1101'].values.astype(float)  # A1101 総人口 (観測値)

# カルマンフィルタ (1D)
x_est = obs[0]      # 初期推定
P = 1e10            # 初期分散
Q = 1e8             # プロセス雑音
R = 1e10            # 観測雑音

filtered = []
for y in obs:
    P = P + Q
    K = P / (P + R)
    x_est = x_est + K * (y - x_est)
    P = (1 - K) * P
    filtered.append(x_est)

filtered = np.array(filtered)
print(f"原系列分散  : {obs.var():.2e}")
print(f"KF 後の分散 : {filtered.var():.2e}")
print(f"分散削減率  : {(1 - filtered.var()/obs.var())*100:.1f}%")

📤 実行例:

原系列分散 : 7.66e+12 KF 後の分散 : 6.69e+11 分散削減率 : 91.3%

💬 単純な逐次平滑化として動作している。実用ではプロセス雑音 Q と観測雑音 R をデータから推定する EM 拡張、 状態方程式の多次元化(位置 + 速度)で本格的な追跡フィルタになる。pykalman・filterpy などのライブラリ利用が現実的。

13.5 ウェーブレット閾値処理(時間-周波数局所デノイズ)

このコードでやること:PyWavelets で離散ウェーブレット変換 → 小さい係数を 0 に → 逆変換、 という典型的なウェーブレット閾値デノイズを SSDSE-B-2026 人口時系列に適用する。

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) 北海道 5,092,000 東京都 14,086,000 沖縄県 1,468,000 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import pywt
import numpy as np
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
signal = df[df['SSDSE-B-2026'] == 2023]['A1101'].values.astype(float)  # A1101 総人口

# DWT (Daubechies 4) で分解
coeffs = pywt.wavedec(signal, 'db4', level=3)

# 万能閾値 (universal threshold): t = sigma * sqrt(2 log N)
sigma = np.median(np.abs(coeffs[-1])) / 0.6745
N = len(signal)
threshold = sigma * np.sqrt(2 * np.log(N))

# 詳細係数のみ閾値処理 (ソフト閾値)
new_coeffs = [coeffs[0]] + [pywt.threshold(c, threshold, mode='soft')
                              for c in coeffs[1:]]
denoised = pywt.waverec(new_coeffs, 'db4')[:N]

print(f"閾値 t = {threshold:,.0f}")
print(f"原系列分散  : {signal.var():.2e}")
print(f"デノイズ後分散: {denoised.var():.2e}")
print(f"分散削減率  : {(1 - denoised.var()/signal.var())*100:.1f}%")

📤 実行例:

閾値 t = 3,210,972 原系列分散 : 7.66e+12 デノイズ後分散: 1.96e+12 分散削減率 : 74.4%

💬 ウェーブレット閾値処理は「局所的な急峻変化(東京の極端値)」を保ちつつ、 緩やかなノイズだけを除去する点が強み。地震波解析、 fMRI 脳画像、 株価変動など、 時間-周波数局在性を持つ信号で広く使われる。

🧠 ベイズ的ノイズ処理——事前分布で「補完」する

古典的なフィルタは観測データのみから推定するが、 ベイズ的アプローチは「ノイズが乗る前の信号がどう振る舞うはず」という事前知識を確率分布で表現し、 観測と統合する。これにより、 SNR が極端に低い状況でも高精度な推定が可能になる。

14.1 ベイズ的推定の基本:MAP と MMSE

観測 $y = x + n$, $n \sim \mathcal{N}(0, \sigma^2)$、 信号の事前分布 $p(x)$ が既知のとき、 MAP 推定(最大事後確率)と MMSE 推定(最小平均二乗誤差)は異なる解を与える:

$$\hat{x}_{\text{MAP}} = \arg\max_x p(x|y) = \arg\max_x [p(y|x) p(x)]$$ $$\hat{x}_{\text{MMSE}} = E[x|y] = \int x \cdot p(x|y) dx$$

事前分布がガウシアン $\mathcal{N}(\mu_0, \tau^2)$ なら両者は一致し、 重み付き平均:

$$\hat{x} = \frac{\tau^2}{\tau^2 + \sigma^2} y + \frac{\sigma^2}{\tau^2 + \sigma^2} \mu_0$$

SNR が高い($\sigma^2 \ll \tau^2$)なら観測 $y$ を信用し、 SNR が低い($\sigma^2 \gg \tau^2$)なら事前平均 $\mu_0$ に引き寄せる——これがベイズ推定の「縮小(shrinkage)」効果である。James-Stein 推定、 ridge 回帰、 経験ベイズ階層モデル、 全て同じ原理で動いている。

14.2 全変動最小化(Total Variation Denoising)

事前分布が「信号は区分定数(piecewise constant)であるべき」という性質を持つなら、 全変動 $\mathrm{TV}(x) = \sum_i |x_{i+1} - x_i|$ をペナルティとして付ける。Rudin-Osher-Fatemi モデルは:

$$\hat{x} = \arg\min_x \frac{1}{2}\|y - x\|_2^2 + \lambda \mathrm{TV}(x)$$

$\ell_1$ ノルムなので解は「平らな区間 + 急な段差」となり、 鋭いエッジを保ちながらノイズを除去できる。医療画像のセグメンテーション、 SAR レーダー画像のデノイズ、 株価トレンドの抽出など、「区分的に一定」が妥当な信号で強い。

事前分布の仮定対応するペナルティ結果の性質
ガウシアン$\ell_2$ ノルム滑らかな解(Tikhonov 正則化)
ラプラス$\ell_1$ ノルムスパースな解(LASSO)
区分定数TV ノルムエッジ保存(ROF モデル)
区分線形TGV ノルム勾配連続 + エッジ保存
非局所自己相似非局所平均テクスチャ保存

14.3 経験ベイズ階層モデル——SSDSE 統計の「縮小推定」

SSDSE-B-2026 で「市町村別の発症率」を推定する場面を考える。小規模自治体は分母が小さく、 推定値のばらつきが大きい——これに対し、 各自治体の発症率 $\theta_i$ が共通の事前分布 $\theta_i \sim \mathcal{N}(\mu, \tau^2)$ から生成されると仮定する経験ベイズモデルが有効である。

結果として、 各自治体の推定値は「自分の観測値」と「全体平均」の重み付き平均となり、 小規模自治体ほど全体平均に引き寄せられる(borrowing strength)。これにより、 偶然のばらつき(ノイズ)が抑制され、 真の地理的パターンが浮き彫りになる。米 BLS の労働統計、 欧州癌登録、 日本の人口推計など、 公的統計の現場標準である。

14.4 確率モデルと不確実性の伝播

ノイズ処理の最終目標は単に「ノイズを減らす」ことではなく、「推定結果に残る不確実性を定量化する」ことである。MCMC、 変分推論、 SMC(粒子フィルタ)などのベイズ計算手法は、 事後分布 $p(\theta|y)$ を直接サンプリングし、 信頼区間や予測区間を提供する。「点推定値 ± 標準誤差」ではなく、「事後分布の 95% HDI」を出すべき時代になっている。

SSDSE-B-2026 を使った階層モデルの実装例として、 PyMC や Stan がよく利用される。階層的に「都道府県平均 → 市町村」へ情報を引き継ぐ構造を組むと、 観測ノイズによるばらつきの中から、 本質的な地域差を抽出できる。

⚠️ よくある落とし穴

この用語を使うときに陥りがちな失敗パターン。 経験者ほどここに 1 度はハマっています。

❌ ノイズと外れ値の混同
ガウス雑音と impulse 型 (極端値) は別物。 同じ「ノイズ」と呼ぶが、 前者は SD で記述、 後者は MAD・分位点で記述すべき。 ロバスト統計の出番。
❌ ノイズの過小評価 (「測器は正確」幻想)
「カタログ精度 ±0.1 °C」と書いてあっても、 設置環境・経年劣化で実誤差はその 2-5 倍。 必ず同条件で複数回測定して実測 SD を取る。 仕様だけ信じない。
❌ ノイズ除去のしすぎ (over-smoothing)
窓幅が大きすぎる移動平均は、 信号のピーク・急峻な変化を削ってしまう。 「滑らかさ」と「忠実度」のトレードオフ。 ピーク位置を残したいなら Savitzky-Golay や LOWESS。
❌ 系統誤差 (バイアス) との混同
ノイズ = ランダム、 系統誤差 = 一方向の偏り。 ノイズは平均で消えるが、 バイアスは何度測っても消えない。 「機器の零点ずれ」「サンプリングバイアス」はノイズではなく修正対象のバイアス
❌ 独立性を仮定し続ける (有色雑音の見落とし)
SD/SNR の計算式は i.i.d. (独立同分布) 仮定。 時系列・空間データではほぼ常に相関がある (AR、 季節性、 空間自己相関)。 ACF や Ljung-Box 検定で確認し、 必要なら ARIMA・GP・SVD などで対応。
❌ ガウス仮定の機械的適用
中心極限定理を盾にガウスを使うが、 重い裾 (heavy-tailed) 現象 ── 金融収益率、 ネット遅延、 ファイルサイズ ── は Cauchy・Student-$t$・Pareto のほうが妥当。 Q-Q プロットで裾を確認する。
❌ ノイズを「除去すべきもの」と固定観念
SGD のノイズは局所最適脱出機構、 Adversarial training のノイズは頑健化、 Dropout はノイズによる正則化 ── ノイズが有用な場面も多い。 「常に除去」とは決めつけず、 目的に応じて使い分ける。

📦 ノイズ分類 早見カタログ

場面別にどのノイズモデルを採用するかの早見表。

領域代表ノイズ分布対処法
センサ計測熱雑音、 量子化誤差ガウス白色平均化、 Kalman
画像ショットノイズ、 ガウス、 スペックルポアソン or ガウスnon-local means、 BM3D、 DAE
金融時系列マイクロ構造ノイズ、 ジャンプCauchy/Student-$t$ 重い裾GARCH、 stochastic vol
音声背景音、 マイク自雑音非定常ガウス + 突発音Wiener、 spectral subtraction
機械学習データラベルノイズ、 入力外れ値混合 + impulsenoisy student、 Co-teaching
アンケート回答者バイアス、 デフォルトバイアス系統 + ガウス傾向スコア、 再重み付け
GPS/位置マルチパス誤差、 電離層誤差空間相関 + ガウスKalman、 補強信号
DL 訓練SGD ノイズ、 Dropout人工的に導入除去でなく活用する

📌 「ノイズはガウス」「ノイズは除去すべき」は古典的近似と古典的目標。 現代は領域知識に応じた分布ノイズの活用が標準。

✨ ノイズは「敵」だけでない ── 活用 5 場面

機械学習・最適化・プライバシ・芸術 ── 様々な現場でノイズは意図的に注入されている。 「除去すべきもの」一辺倒の見方を改めよう。

1. SGD のノイズ = 暗黙の正則化

バッチ全体でなくミニバッチで勾配を計算すると、 サンプリングによるノイズが入る。 このノイズが浅い局所最適や鞍点からの脱出機構として機能し、 また平坦な (汎化する) 極小に向かう暗黙のバイアスを生む。 LR / バッチサイズが SGD ノイズの強度を決める。

2. Dropout = 学習時のニューロンランダム消去

学習時、 各ニューロンを確率 $p$ で消去するノイズ注入。 「アンサンブル効果」と「共適応抑制」で汎化性能を改善 (Srivastava et al., 2014)。 推論時は重みを $\times(1-p)$ してデノイズ。 NLP・CV の標準テクニック。

3. Data Augmentation = 入力データへのノイズ注入

画像なら回転・ノイズ・カットアウト、 音声なら時間伸縮・SpecAugment、 NLP なら EDA・back-translation。 「ノイズで多様化されたデータ」で学習することで、 未知データへの頑健性が上がる。 MixUp は 2 サンプルを線形混合する究極系。

4. 差分プライバシー (DP) = 出力にラプラスノイズ追加

$\varepsilon$-DP 保証のため、 統計クエリ結果に $\text{Laplace}(\Delta f / \varepsilon)$ ノイズを足す。 個人の有無で結果が変わらず、 プライバシ保護と統計分析を両立。 Apple・Google・米国国勢調査 2020 で実用化。

5. 拡散モデル (Stable Diffusion) = ノイズから画像生成

逆プロセスでノイズを徐々に除去して画像を生成する Denoising Diffusion Probabilistic Model (DDPM)。 ノイズが「データ多様体上の自由度」を表現する媒体になる。 2022 年以降の生成 AI の主役。

🗺 概念マップ

関連概念を視覚的に整理した概念マップ。

noise 信号対雑音比 外れ値検出 平滑化 ノイズ除去 誤差項 ロバスト統計

概念マップは「ノイズの源 (測定誤差・記録誤差・サンプリングゆらぎ) → モデル前提 (Y = f(X) + ε)」「ノイズ除去 (フィルタ・平滑化) vs 利用 (DP / data augmentation)」の対比を整理する。 SSDSE-B-2026 では「人口」のような国勢調査値はノイズが小さいが、 「観光客数」のような推計値は記録ノイズが大きく、 同じ前処理は適用できない。

🔗 隣接手法への橋渡し

ノイズの扱いは前処理・モデリング・評価の全段階で必要になる。

SSDSE-B-2026 の都道府県データでは「観光客数 / 商業販売額 / 出生率」などノイズの大きい指標に対し、 3 年移動平均 + bootstrap CI を組み合わせる処理が初級教材として通用する。

🌳 手法選択フロー

ノイズ対策の選択は「ノイズの性質と推定したい量」で決まる。

  1. 白色雑音か? 移動平均・カルマンフィルタで平滑化可能
  2. 外れ値混入 中央値ベースの頑健推定 (MAD、 Huber loss) で軽減
  3. 系統的ずれ これはノイズではなくバイアス。 原因を特定して補正する

SSDSE-B-2026 のような行政統計はノイズより集計誤差や定義変更の影響が大きい。 まず metadata で集計範囲・対象年を確認するのが先。

🔍 解説深化 — 「分母の大きさ」が決めるノイズ:de Moivre の視点

本文ではノイズを「時間・周波数」(白色/有色、 PSD) と「機械学習」(ラベルノイズ、 正則化) の角度から見た。 ここでは SSDSE のような集計統計に固有のノイズ ── 比率指標の揺らぎが分母のサイズで決まるという、 まだ本文で扱っていない角度を掘り下げる。 鍵は 1730 年代に de Moivre が導いた $\mathrm{SE} = \sigma / \sqrt{n}$ という一本の式である。

💡 直感 ── 全数調査にも「ノイズの床」がある

婚姻・出生のような「件数」は国への届出の全数集計で、 測定誤差はほぼゼロ。 それでも「人口千人あたり婚姻率」は年ごとに揺れる。 各人が結婚するかどうかは確率的な事象なので、 件数 $C$ 自体がポアソン的に揺らぎ ($\mathrm{SD} \approx \sqrt{C}$)、 率に直すと偶然変動の下限は $\sqrt{C}/n$ となる ── 分母 $n$ が小さい県ほどこの「ノイズの床」が高い。 SSDSE-B-2026 (A9101 婚姻件数 ÷ A1101 総人口 × 1000) の 2023 年実測値で確かめると:

総人口 (2023)婚姻件数 (2023)婚姻率 (‰)ポアソン下限 √C/n実測の年次変動 SD*比 (実測/下限)
鳥取県537,0001,8103.37±0.0790.1972.5 倍
島根県650,0002,0953.22±0.0700.1151.6 倍
高知県666,0001,9852.98±0.0670.1071.6 倍
大阪府8,763,00038,5134.39±0.0220.22310.0 倍
神奈川県9,229,00038,1764.14±0.0210.21610.2 倍
東京都14,086,00071,7745.10±0.0190.31116.4 倍

* 年次変動 SD = 2012–2023 年の婚姻率の前年差 (11 個) の標準偏差。 表の全数値は data/raw/SSDSE-B-2026.csv から算出した実測値。

ポアソン下限は予想通り鳥取が東京の約 4 倍 (0.079 vs 0.019)。 ところが実測の年次変動は逆に東京 (0.311) の方が鳥取 (0.197) より大きい。 観測される揺らぎ = 実トレンド + 共通ショック + 偶然ノイズ であり、 全国婚姻率がコロナ禍で 4.733‰ (2019) → 4.166‰ (2020) へ急落したような本物のショックが、 水準の高い大都市ほど絶対値として大きく効くからだ。 「揺れの大きさ」だけではノイズ量は測れない ── これが本節の核心である。

⚠️ 落とし穴(重要) ── 揺らぎの「何割が偶然か」は県のサイズで変わる

注目すべきは表の右端、 実測変動 ÷ ポアソン下限の比だ。 東京は 16.4 倍 ── 年次変動のほぼ全てが実質的な変化 (シグナル)。 一方、 高知・島根は 1.6 倍 ── 観測された年次変動のかなりの部分が偶然変動だけで説明できてしまう (47 都道府県の中央値は 3.4 倍、 最小は高知の 1.6 倍、 最大は東京の 16.4 倍)。 ここから 3 つの実務的教訓が出る:

🚀 発展 ── サイズ依存ノイズを飼いならす 3 つの道具

  1. ファネルプロット: 横軸に分母サイズ $n$、 縦軸に率を取り、 全国平均 $\pm 2\sqrt{p(1-p)/n}$ の管理限界 (漏斗型の曲線) を引く。 限界の外に出た県だけを「シグナル」と判定する。 医療の施設間成績比較 (Spiegelhalter 2005) の標準ツールで、 都道府県比較にそのまま流用できる。
  2. 経験ベイズ縮小 (shrinkage): 小県の率を全国平均方向へ引き寄せて推定する (James–Stein 推定量の系譜)。 分母が小さいほど強く縮小されるため、 ノイズ由来の極端な値が自動的に緩和される。 疾病マッピング (小地域の疾病率推定) で必須の技法。
  3. 分散安定化変換: ポアソン計数には平方根変換、 二項比率には arcsin 変換を施すと、 分散がほぼ一定になり、 サイズの異なる県同士を同じ土俵で比較・回帰できる。

本文の SN 比の言葉で言い直すと、 集計統計の SNR は分母サイズに比例して向上する ($\mathrm{SNR} \propto n$、 ノイズ分散が $1/n$ で減るため)。 「東京のデータは信頼できて鳥取は信頼できない」のではなく、 「両者の不確実性の幅が違う」 ── その幅を明示するのが誠実な分析である。 なお本節の婚姻率は実データそのものであり、 合成デモは含まない。

🔗 関連ページ