「noise」は統計データ分析の文脈で扱う重要概念のひとつ。 本ページでは「noise」を取り巻く中核キーワードを以下にチップで一覧化する。 各キーワードは関連する概念・手法・道具立てを含み、 文献検索や学習計画の起点になる。
これらのキーワードは「noise の理解 → 適用 → 検証」のプロセスを構成する。 各章で詳しく解説する。
🍰 まずはやさしく
ノイズはデータの小さな揺れのことです。
本当の値を知るために使います。
スマホの電波が乱れるときのようなものです。
ここではノイズの種類と対策を読みます。
ノイズ:観測に含まれる偶然変動
🍰 まずはやさしく
ノイズはデータ分析の基本ルールです。
正しくデータを扱うために使います。
部活の記録をまとめる時にも役立ちます。
ここでは定義や実装について読みます。
この用語は 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}}$ | 画像のスペックル、 機器の % 誤差 |
| 系統誤差 (バイアス) | ランダムでなく一方向 | 機器の零点ずれ、 サンプリングバイアス |
📌 「ノイズ」と一括りにせず、 種類を見極めることが第一歩。 白色雑音なら平均化で消えるが、 系統誤差は何度測っても消えない ── キャリブレーションが必要。
$\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 が普通。
ノイズは時間領域では「不規則な変動」に見えますが、 周波数領域でスペクトル密度 (PSD) を計算すると、 一気に 素性が割れます。 PSD が周波数によらず一定なものを ホワイトノイズ、 周波数に対し 1/f に比例して減衰するものを ピンクノイズ (1/f ノイズ)、 1/f² で減衰するものを ブラウン (レッド) ノイズと呼びます。 都道府県データの「年次変動」もこのスペクトル分析で性質を判別できます。
| 名前 | PSD の傾き | 自己相関 | 代表例 |
|---|---|---|---|
| ホワイト | f⁰ (フラット) | なし (δ関数) | 電子回路の熱雑音、 量子化誤差 |
| ピンク (1/f) | f⁻¹ | 緩やかに減衰 | 音楽信号、 心拍 RR 間隔、 株価変動 |
| ブラウン | f⁻² | 強い長期相関 | ブラウン運動、 拡散現象 |
| ブルー | f⁺¹ | 負相関 (高周波強調) | ディザリング、 網膜の桿体配置 |
このコードでやること: SSDSE-B-2026 の data/raw/SSDSE-B-2026.csv から都道府県別の数値変数を時系列として取り扱い、 トレンド (移動平均) を差し引いた残差を「ノイズ」とみなして scipy.signal.welch で PSD を推定する。 出力された傾きから、 そのデータが白色ノイズか有色ノイズかを判定する。
📥 入力データ (SSDSE-B-2026、 47 都道府県を 1 次元シーケンスとして扱う):
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 'ブラウン'))) |
📤 実行すると次の出力が得られる:
💬 都道府県 (地域コード順) の総人口から 5 点移動平均トレンドを差し引いた残差成分は、 約 188 万人の標準偏差を持ち、 PSD の log-log 傾きは −0.22 と平坦に近く 白色ノイズ寄りの性質を示します。 つまり局所トレンドを除くと、 隣り合う県の人口の増減はほぼ無相関ということです。 もし傾きが −1 に近ければピンク、 −2 に近ければブラウンとなり、 それに応じて適切なデノイジング手法 (LP フィルタ、 ウェーブレット、 移動平均の窓幅) を理論的に選択できます。
信号処理で最も重要な指標が 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 の A1101 総人口列を観測系列 (noisy) とみなし、 その 5 点移動平均をクリーンなトレンド (信号) と定義。 ここでの SNR は「トレンドのパワー / (観測−トレンド) 残差のパワー」で、 窓幅 3, 5, 7 の移動平均で平滑化したときに SNR がどう変化するかを測る。
📥 入力データ (SSDSE-B-2026 の A1101 総人口、 観測系列として扱う):
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') |
📤 実行すると次の出力が得られる:
💬 窓幅 5 はトレンド定義そのものなので残差ゼロとなり SNR が発散しますが、 これは「平滑化窓と評価対象が同一」という縮退ケース。 実務では、 SSDSE のように 真の信号が未知な場合、 クロスバリデーションで窓幅を選択するか、 ウェーブレット縮小 (PyWavelets) や Kalman filter のような周波数選択的・状態空間的なデノイジングに移行します。 「ノイズ除去で信号が消えないか」を常に交差検証することが鉄則です。
真の関数 (信号) は緑の曲線 y = sin(2πx) です。 ここに標準偏差 σ のガウスノイズを足したものが青い点の 観測データ。 σ を上げるほど点は散らばり、 SN 比 (信号対雑音比) が下がって「真の関係」が埋もれていきます。 移動平均の 窓幅 w を広げると観測データを平滑化 (オレンジ線) してノイズを薄められますが、 広げ過ぎると信号のカーブまで潰れて逆に真値から離れます ── これが平滑化のトレードオフです。
💡 グラフ上を上下にドラッグ (タッチ可) してもノイズの大きさ σ を変えられます。
直感: 観測データ = 真の信号 (再現性のある構造) + ランダムな乱れ (ノイズ)。 ノイズは「消す」より「量と性質を測る」ものだと捉えると、 SN 比という共通のものさしで扱えるようになります。
よくある落とし穴 ── ノイズを学習してしまう (過学習): この実験の平滑化で窓幅を 狭く し過ぎると、 移動平均線が個々の観測点、 つまりノイズにぴったり張り付きます。 これは柔軟なモデルがノイズまで再現してしまう 過学習 (オーバーフィッティング) と同じ現象で、 訓練データでは誤差が小さくても真値 (未知データ) からは離れます。 少数点だけ見えた「上がり下がり」を本物のパターンと勘違いする 見せかけのパターン (spurious pattern) にも要注意です。 モデルの複雑さと誤差の関係は バイアス-バリアンス で整理できます。
発展: ノイズを抑える主な道具立ては 3 系統。 (1) 信号処理 ── 移動平均・ローパスフィルタ・ウェーブレット縮小・カルマンフィルタで周波数や状態空間の観点からノイズを分離する。 (2) 正則化 ── モデルに罰則を課して過度な柔軟性を抑え、 ノイズへの過剰適合を防ぐ。 (3) アンサンブル ── 多数のモデルや再標本を平均してノイズ由来のばらつきを打ち消す (√N 則の応用)。 外れ値型ノイズには ロバスト統計 や 外れ値 処理が有効です。
🍰 まずはやさしく
ノイズは数式で表せるズレのことです。
計算で誤差をまとめるために使います。
買い物での端数のようなものです。
ここではノイズの計算式について読みます。
観測値 $y_{\text{obs}}$ は真の値 $y_{\text{true}}$ にランダム誤差 $\varepsilon$ が加わったもの。 多くのモデルは $\varepsilon$ が平均 0、 分散 $\sigma^2$ のガウス分布を仮定する。
信号と雑音の分散比。 dB 表記で 20dB = SNR 100、 40dB = 10000。 通信工学では 30dB 以上が「クリア」とされる。
i.i.d. ノイズなら、 $N$ 個の観測を平均すると分散は $1/N$ に縮む。 標準偏差は $1/\sqrt{N}$。 → SNR は $N$ 倍。 これがビッグデータの威力の源泉。
時刻ずれ $\tau$ での相関。 白色雑音なら $R_\varepsilon(0) = \sigma^2,\,R_\varepsilon(\tau \neq 0) = 0$。 有色雑音は $\tau \neq 0$ でも非ゼロ。 自己相関 ACF プロットで判定可能。
窓幅 $2k+1$ の単純移動平均で平滑化。 $k$ が大きいほどノイズは消えるが、 信号の高周波成分 (= 急峻な変化) も消える。 信号 vs ノイズ分離はトレードオフ。
ノイズ対策の最終目標は「信号を可能な限り正確に推定すること」である。では、 与えられた SNR でどこまで精度を上げられるか? その理論的下限を与えるのが Cramér-Rao 下界(CRLB)である。本節では SNR の定義を整理し、 CRLB を導入してフィルタ設計の限界を議論する。
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 が低い = 工夫が必要」である。
パラメータ $\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 を計算することで「投資すべき方向」が定量的に分かる。
白色ガウシアン雑音下で「既知信号が含まれているか」を判定する最適な受信機は 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 つずつ確認しましょう。
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) すると %単位の乗法ノイズとして扱える。
分散の式 $\text{Var}(\bar{y}_N) = \sigma^2 / N$ を言葉で説明する。
注意点: この性質は独立同分布 (i.i.d.)のとき。 同じ機器を 1000 回使えば系統誤差は消えず、 単に平均値の系統偏りが残る ── 「機器を変える」「測定者を変える」のがバイアス除去の本道。
ノイズ(noise)とは、観測データに混入する不要な変動成分の総称である。本来知りたい「信号(signal)」に対し、測定機器の限界・環境変動・人的入力ミス・通信時の量子化誤差など、さまざまな由来で混入する。データサイエンスの実務では「ノイズをどう減らすか」「ノイズの中に隠れた本物の信号をどう取り出すか」が、モデル精度・解釈性・意思決定の信頼性を左右する。
最も基本的な観測モデルは次式で表される。
$$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 つずつ言葉で説明すると次のとおり。
| 分類 | 由来 | 典型例 | 対策 |
|---|---|---|---|
| ガウシアンノイズ | 温度ゆらぎ・熱雑音 | センサー測定値の細かい揺れ | 平均化・ローパスフィルタ |
| ショットノイズ | 離散事象(光子計数等) | 暗い画像のざらつき | 露光時間延長・ポアソン正則化 |
| 量子化ノイズ | A/D 変換の丸め | 整数化された測定値の誤差 | ビット深度の向上 |
| 外れ値ノイズ | 入力ミス・機器故障 | 身長 17000cm のような桁違い | ロバスト統計・データクレンジング |
ノイズの「強さ」は単独では意味を持たず、信号と比較して初めて評価できる。代表的指標が 信号対雑音比 (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 を下回ると、機械学習モデルでも有意な特徴を取り出すのが難しくなる。

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

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

SSDSE-B-2026 のような公的統計でも、調査票回収率の地域差、回答者の自己申告バイアス、集計時の四捨五入など、形式は違えどノイズは必ず存在する。例えば「人口 1000 人当たり医師数」のような比率は、分母(人口)の小さい自治体ほど分子側の少数変動の影響を受け、見かけ上のばらつきが大きく見える(ラベル統計学でいう small numbers の問題)。こうした現象もノイズの一種であり、地図化や順位比較の際は信頼区間を併記すべきである。
ノイズは「除去すべき敵」ではなく「観測そのものの一部」として理解するのが正攻法である。信号モデル・観測モデルを明示的に書き下し、SNR で量的に把握し、適切なフィルタ・正則化・ロバスト手法で扱う——この一連の流れがあって初めて、データ分析は「結果を信頼できる」段階に到達する。
ノイズを実務で扱うには、まず「どこから来たか」を物理的・統計的に分類することが第一歩である。発生源が分かれば、後段のフィルタ設計や前処理が圧倒的に楽になる。本節では、信号処理・統計・機械学習の各分野で頻出する 8 種のノイズ源を、SSDSE-B-2026 のような公的統計データと結び付けて整理する。
もっとも基本的な区別は「足し算で乗るか、 掛け算で乗るか」である。加法的ノイズ $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、 再学習 |
白色雑音はあらゆる周波数で同じパワーを持つ理想化されたモデルだが、 現実の多くの自然現象——心拍変動、 株価変動、 河川流量、 地震波——のパワースペクトルは周波数 $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 に近いかを確認する習慣を付けたい。
光検出器・放射線計測器・粒子加速器など、 離散的な事象を計数するセンサーでは、 計数値 $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$ が小さいと幅が広がる——これも一種のショットノイズである。
連続値の物理量を有限ビットのデジタル値に変換する 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) 移動平均で時系列ノイズ除去のトレードオフ、 を順に手計算する。
気温時系列に $\sigma=2.0$ のガウス雑音を載せたとき、 窓幅 $k$ の移動平均でどこまでノイズが除去できるか、 また信号 (季節変動) がどれだけ削られるかをシミュレーション。
| 窓幅 $2k+1$ | 残差ノイズ SD | 信号歪み | 判定 |
|---|---|---|---|
| 3 | 1.16 °C | 13.1% | 緩い (ノイズ残) |
| 7 | 0.76 °C | 8.5% | バランス良好 |
| 31 | 0.35 °C | 4.2% | 強め平滑 (この設定では残差最小) |
| 91 | 0.91 °C | 11.4% | 過剰平滑 (信号削りで残差増) |
📌 窓幅は信号の変動の特性時間に合わせる。 季節変動 (周期 365 日) なら窓 7〜31 が妥当。 月平均なら 30 日固定、 週次変動を捉えるなら 7 日窓。
合成信号と雑音から SN 比 (dB) を計算する。
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}") |
💬 手計算 (Step 2) 20dB と 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-B-2026 から「年平均気温 (B4101)」を 47 県分読み込み、 $\sigma=0.5$ °C のガウス雑音を加えた観測値を作り、 SNR を実測する。
📥 入力データ: data/raw/SSDSE-B-2026.csv の B4101 列。
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') |
📤 実行結果:
💬 結果の読み方: 信号 (47 県の地理差) のばらつき 2.03 °C に対し、 注入したノイズは標本 47 個で SD 0.39 °C。 SNR ≈ 27、 14.3 dB。 → 「都道府県差を語る分析」ではノイズの影響は小さい。 「近隣県の 0.3 °C 差」を主張するならノイズと差が拮抗するため要注意。
🎯 このコードでやること: 同じ気温データに対し、 ノイズ重畳 → 平均化を $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') |
📤 実行結果:
💬 結果の読み方: 実測 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} %') |
📤 実行結果:
💬 結果の読み方: 窓を広げるとノイズは確実に減るが、 同時に信号 (季節変動) の振幅も削られる。 $k=7$ が「残差 0.76 / 歪み 8.5%」でバランス良好。 $k=91$ は窓が広すぎて季節変動そのものを潰し、 残差 (信号損失込み) がむしろ増える ── 用途に応じて窓幅を選ぶ。
🎯 このコードでやること: 移動平均より高度な 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 は移動平均 (0.35) のほうが小さく、 単純な正弦波+白色雑音ではノイズ除去は移動平均が有利。 一方 SavGol は多項式近似のためピーク付近の形状追従がよく、 ピーク高の誤差は両者とも ±0.3 °C 以内で拮抗する。 分光ピークや心電図 R 波のように鋭いピークを保ちたい場面ほど SavGol の優位が明確になる。
🎯 このコードでやること: 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}') |
📤 実行結果:
💬 結果の読み方: frac=0.15 (= 局所窓 55 日相当) で残差 SD 0.36 と最良。 frac が小さすぎる (0.05=18 日) と過小平滑、 大きすぎる (0.30=110 日) と過剰平滑。 「最適窓幅を決めずに sweep して決定」が実務的。
🎯 このコードでやること: 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≥1 で ACF が ±0.05 内 (ノイズ域)。 一方 AR(1) は ACF が $\rho_k = 0.7^k$ で減衰し、 lag 5 でもまだ 0.17。 → 「ACF が長く減衰しない」=有色雑音の証拠。 ARIMA・状態空間モデル等で扱うべき。
🎯 このコードでやること: 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} → 中央値ほぼ変わらず (ロバスト)') |
📤 実行結果:
💬 結果の読み方: 東京 1 件を除くだけで平均が 25 万人・SD が 80 動く ── 非ロバスト統計の脆弱性。 一方、 中央値と MAD はほぼ変わらない (154→152、 MAD は維持)。 「外れ値型ノイズ (impulse)」に対しては平均よりロバスト統計を使うべき。
本節では、SSDSE-B-2026 の人口時系列(仮想的に拡張)と、 公的医療統計の年次値を想定した時系列データを対象に、 ノイズ除去フィルタの代表 5 種を Python で実装し、結果を比較する。
このコードでやること:SSDSE-B-2026 の都道府県人口(時系列模擬)に対し、窓幅 5 の単純移動平均(SMA)と指数移動平均(EMA)を pandas で計算し、 ノイズ除去効果を比較する。
📥 入力データ(SSDSE-B-2026 から都道府県別人口 47 件 + 時間軸方向に 20 期分の擬似時系列):
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}%") |
📤 実行すると次の出力が得られる:
💬 都道府県人口は値域の幅が極めて大きい(東京 1409 万、 鳥取 54 万)ため、 地域コード順の系列に 5 点移動平均をかけると標準偏差が約 36% 縮む。 ただしこれは「隣接県をならして山を削った」結果でもあり、 本来の時系列ノイズ除去は定常的(平均値が一定)な系列で意味を持つ点に注意。
このコードでやること:SSDSE-B-2026 の出生数 (A4101) を昇順ソートして滑らかな曲線にし、 3 点に「報告ミスによる 10 倍スパイク」を混入。 移動平均 (SMA) とメジアンフィルタの外れ値除去性能を RMSE で比較する。
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 は 27,289 までしか改善しない。一方、 メジアンフィルタは孤立スパイクをほぼ完全に排除でき、 RMSE は 4,634 と約 6 倍の精度差。「外れ値混入の懸念があるならまずメジアン」が鉄則である。
このコードでやること:scipy.signal.savgol_filter を使い、 SSDSE-B-2026 の年齢階級別人口分布(疑似時間軸)にノイズが乗ったときの平滑化効果を確認する。多項式次数 2、 窓幅 7 で、 ピーク位置を保ちつつノイズを除去する。
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}%") |
📤 実行例:
💬 総人口を昇順に並べた曲線に対し、 Savitzky-Golay は最大値(東京)を 92.9% 保ちながら、 隣接差分で測ったノイズを約 36% 減らせる。 東京は突出した外れ値なので窓幅 7 では多少削れるが、 なだらかな中位県ではピーク形状がよく保たれる。スペクトル解析・クロマトグラフィ・心電図解析など「ピーク位置が大事な解析」での定番。
このコードでやること:1 次元のランダムウォーク + ガウシアン観測ノイズに対し、 単純カルマンフィルタで真の状態を推定する。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 | 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}%") |
📤 実行例:
💬 単純な逐次平滑化として動作している。実用ではプロセス雑音 Q と観測雑音 R をデータから推定する EM 拡張、 状態方程式の多次元化(位置 + 速度)で本格的な追跡フィルタになる。pykalman・filterpy などのライブラリ利用が現実的。
このコードでやること:PyWavelets で離散ウェーブレット変換 → 小さい係数を 0 に → 逆変換、 という典型的なウェーブレット閾値デノイズを 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 | 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}%") |
📤 実行例:
💬 ウェーブレット閾値処理は「局所的な急峻変化(東京の極端値)」を保ちつつ、 緩やかなノイズだけを除去する点が強み。地震波解析、 fMRI 脳画像、 株価変動など、 時間-周波数局在性を持つ信号で広く使われる。
古典的なフィルタは観測データのみから推定するが、 ベイズ的アプローチは「ノイズが乗る前の信号がどう振る舞うはず」という事前知識を確率分布で表現し、 観測と統合する。これにより、 SNR が極端に低い状況でも高精度な推定が可能になる。
観測 $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 回帰、 経験ベイズ階層モデル、 全て同じ原理で動いている。
事前分布が「信号は区分定数(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 ノルム | 勾配連続 + エッジ保存 |
| 非局所自己相似 | 非局所平均 | テクスチャ保存 |
SSDSE-B-2026 で「市町村別の発症率」を推定する場面を考える。小規模自治体は分母が小さく、 推定値のばらつきが大きい——これに対し、 各自治体の発症率 $\theta_i$ が共通の事前分布 $\theta_i \sim \mathcal{N}(\mu, \tau^2)$ から生成されると仮定する経験ベイズモデルが有効である。
結果として、 各自治体の推定値は「自分の観測値」と「全体平均」の重み付き平均となり、 小規模自治体ほど全体平均に引き寄せられる(borrowing strength)。これにより、 偶然のばらつき(ノイズ)が抑制され、 真の地理的パターンが浮き彫りになる。米 BLS の労働統計、 欧州癌登録、 日本の人口推計など、 公的統計の現場標準である。
ノイズ処理の最終目標は単に「ノイズを減らす」ことではなく、「推定結果に残る不確実性を定量化する」ことである。MCMC、 変分推論、 SMC(粒子フィルタ)などのベイズ計算手法は、 事後分布 $p(\theta|y)$ を直接サンプリングし、 信頼区間や予測区間を提供する。「点推定値 ± 標準誤差」ではなく、「事後分布の 95% HDI」を出すべき時代になっている。
SSDSE-B-2026 を使った階層モデルの実装例として、 PyMC や Stan がよく利用される。階層的に「都道府県平均 → 市町村」へ情報を引き継ぐ構造を組むと、 観測ノイズによるばらつきの中から、 本質的な地域差を抽出できる。
この用語を使うときに陥りがちな失敗パターン。 経験者ほどここに 1 度はハマっています。
場面別にどのノイズモデルを採用するかの早見表。
| 領域 | 代表ノイズ | 分布 | 対処法 |
|---|---|---|---|
| センサ計測 | 熱雑音、 量子化誤差 | ガウス白色 | 平均化、 Kalman |
| 画像 | ショットノイズ、 ガウス、 スペックル | ポアソン or ガウス | non-local means、 BM3D、 DAE |
| 金融時系列 | マイクロ構造ノイズ、 ジャンプ | Cauchy/Student-$t$ 重い裾 | GARCH、 stochastic vol |
| 音声 | 背景音、 マイク自雑音 | 非定常ガウス + 突発音 | Wiener、 spectral subtraction |
| 機械学習データ | ラベルノイズ、 入力外れ値 | 混合 + impulse | noisy student、 Co-teaching |
| アンケート | 回答者バイアス、 デフォルトバイアス | 系統 + ガウス | 傾向スコア、 再重み付け |
| GPS/位置 | マルチパス誤差、 電離層誤差 | 空間相関 + ガウス | Kalman、 補強信号 |
| DL 訓練 | SGD ノイズ、 Dropout | 人工的に導入 | 除去でなく活用する |
📌 「ノイズはガウス」「ノイズは除去すべき」は古典的近似と古典的目標。 現代は領域知識に応じた分布とノイズの活用が標準。
機械学習・最適化・プライバシ・芸術 ── 様々な現場でノイズは意図的に注入されている。 「除去すべきもの」一辺倒の見方を改めよう。
バッチ全体でなくミニバッチで勾配を計算すると、 サンプリングによるノイズが入る。 このノイズが浅い局所最適や鞍点からの脱出機構として機能し、 また平坦な (汎化する) 極小に向かう暗黙のバイアスを生む。 LR / バッチサイズが SGD ノイズの強度を決める。
学習時、 各ニューロンを確率 $p$ で消去するノイズ注入。 「アンサンブル効果」と「共適応抑制」で汎化性能を改善 (Srivastava et al., 2014)。 推論時は重みを $\times(1-p)$ してデノイズ。 NLP・CV の標準テクニック。
画像なら回転・ノイズ・カットアウト、 音声なら時間伸縮・SpecAugment、 NLP なら EDA・back-translation。 「ノイズで多様化されたデータ」で学習することで、 未知データへの頑健性が上がる。 MixUp は 2 サンプルを線形混合する究極系。
$\varepsilon$-DP 保証のため、 統計クエリ結果に $\text{Laplace}(\Delta f / \varepsilon)$ ノイズを足す。 個人の有無で結果が変わらず、 プライバシ保護と統計分析を両立。 Apple・Google・米国国勢調査 2020 で実用化。
逆プロセスでノイズを徐々に除去して画像を生成する Denoising Diffusion Probabilistic Model (DDPM)。 ノイズが「データ多様体上の自由度」を表現する媒体になる。 2022 年以降の生成 AI の主役。
関連概念を視覚的に整理した概念マップ。
概念マップは「ノイズの源 (測定誤差・記録誤差・サンプリングゆらぎ) → モデル前提 (Y = f(X) + ε)」「ノイズ除去 (フィルタ・平滑化) vs 利用 (DP / data augmentation)」の対比を整理する。 SSDSE-B-2026 では「人口」のような国勢調査値はノイズが小さいが、 「観光客数」のような推計値は記録ノイズが大きく、 同じ前処理は適用できない。
ノイズの扱いは前処理・モデリング・評価の全段階で必要になる。
SSDSE-B-2026 の都道府県データでは「観光客数 / 商業販売額 / 出生率」などノイズの大きい指標に対し、 3 年移動平均 + bootstrap CI を組み合わせる処理が初級教材として通用する。
ノイズ対策の選択は「ノイズの性質と推定したい量」で決まる。
SSDSE-B-2026 のような行政統計はノイズより集計誤差や定義変更の影響が大きい。 まず metadata で集計範囲・対象年を確認するのが先。
本文ではノイズを「時間・周波数」(白色/有色、 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,000 | 1,810 | 3.37 | ±0.079 | 0.197 | 2.5 倍 |
| 島根県 | 650,000 | 2,095 | 3.22 | ±0.070 | 0.115 | 1.6 倍 |
| 高知県 | 666,000 | 1,985 | 2.98 | ±0.067 | 0.107 | 1.6 倍 |
| 大阪府 | 8,763,000 | 38,513 | 4.39 | ±0.022 | 0.223 | 10.0 倍 |
| 神奈川県 | 9,229,000 | 38,176 | 4.14 | ±0.021 | 0.216 | 10.2 倍 |
| 東京都 | 14,086,000 | 71,774 | 5.10 | ±0.019 | 0.311 | 16.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 つの実務的教訓が出る:
本文の SN 比の言葉で言い直すと、 集計統計の SNR は分母サイズに比例して向上する ($\mathrm{SNR} \propto n$、 ノイズ分散が $1/n$ で減るため)。 「東京のデータは信頼できて鳥取は信頼できない」のではなく、 「両者の不確実性の幅が違う」 ── その幅を明示するのが誠実な分析である。 なお本節の婚姻率は実データそのものであり、 合成デモは含まない。