🔖 キーワード索引(拡張版)
このページに登場する主要キーワード。 クリックで該当セクションへ。
💡 30秒で分かる結論
🍰 まずはやさしく
データの汚れを落とす掃除のような作業です。
正しく分析するために使います。
スマホの連絡先の重複を消すようなことです。
データの直し方を順番に学びます。
データクレンジング(詳細)とは、 生データに含まれる欠損値・外れ値・重複・表記ゆれ・型不整合を系統的に検出し、 解析可能な状態へ整える一連の工程(欠損値処理/外れ値処理/重複除去/表記ゆれ統一/型変換/名寄せ)。
- 分野:データ前処理 — 📚 データエンジニアリング(ETL の T を担う中核工程)
- 本記事の題材:SSDSE-B-2026(47 都道府県 × 2012〜2023 年度の社会指標)に、 欠損確認 → 型変換 → 重複除去 → 表記ゆれ検査 → 外れ値処理を順番に適用する。 対象列の例:
A1101 総人口、 A4103 合計特殊出生率、 B4101 年平均気温。
- チェック指標:欠損率・重複行数・型整合性・値域(スキーマ検査)。
- 注意:外れ値 = 誤りとは限らない(東京都の総人口は「正しい外れ値」)。 削除する前に必ず原因を診断するのが鉄則。
- 後半のクレンジング・レシピ集・FAQ 20 問・演習問題・産業界活用 6 件で実務理解を完成させる。
📍 文脈ボックス — あなたが今見ているもの
🍰 まずはやさしく
データ分析の準備をするためのページです。
正しい結果を出すために必ず行います。
部活の出席簿を整理する感覚に似ています。
このページで学べる3つの方法を紹介します。
あなたは データクレンジング(詳細)(Data Cleansing (Detail)) の用語ページを読んでいる。 これは「データ前処理」カテゴリに属し、 データ収集の直後・分析やモデル構築の直前に必ず通る中核工程である。
本ページは 3 つの読み方を提供する:
- 15 分で全体像:このすぐ下の「30 秒結論」→「直感で掴む」→「実値計算」 3 セクションだけを通読すれば十分。
- 60 分で実装まで:「Python 実装」セクションを写経し、 SSDSE-B-2026 で手元で再現する。
- 半日で実務応用:後半の「クレンジング・レシピ集」「FAQ 20 問」「産業界活用事例」で実務適用パターンをインプットする。
本記事のすべての計算は data/raw/SSDSE-B-2026.csv(2012〜2023 年度の 47 都道府県 × 12 年 = 564 行、 113 指標)を用いて行われる。 合成データ・乱数生成は一切使わない。
🎨 直感で掴む
🍰 まずはやさしく
料理の下ごしらえのような作業です。
使いやすい状態に整えるために行います。
野菜の泥を洗うようにデータをきれいにします。
判断基準と具体的なやり方を解説します。
クレンジング処理の 詳細編 では、 欠損補完・型統一・重複削除・表記揺れ・外れ値・スキーマ整合といった 6 工程を、 SSDSE-B-2026 の都道府県 × 年度パネルを題材に 1 つずつ実装可能なレベルまで分解する。 「とりあえず dropna()」のような粗い対処ではなく、 「なぜその列が欠損するのか」「補完で意味が壊れないか」を判断する基準を整える。
以下では、 6 工程 (欠損補完 → 型統一 → 重複削除 → 表記揺れ統一 → 外れ値処理 → スキーマ整合) を SSDSE-B-2026 都道府県 × 年度パネルで 1 つずつ pandas コードに落とし、 「MCAR/MAR/MNAR の判定に基づく補完手法選択」「IQR×1.5 と Tukey の違い」「正規表現での表記揺れ統一」など、 単なる dropna() を超えた判断基準を整えます。
🎨 直感で掴む — 比喩と具体例
データクレンジング(詳細)を、 統計を学んだばかりの人に説明するときの比喩を 3 つ用意した。
🍳 下ごしらえ比喩
データクレンジングは料理の下ごしらえ。 泥(欠損・重複)を洗い、 皮(表記ゆれ)をむき、 傷んだ部分(誤入力)を除いて食材(データ)を調理可能にする。 どんな一流シェフ(高性能モデル)でも、 下ごしらえ抜きの食材からは食べられる料理を作れない。
📚 図書館の蔵書整理比喩
同じ著者が「東京都」「東京」「Tokyo」と 3 通りで登録されていたら、 蔵書検索は 3 分の 1 しかヒットしない。 名寄せ・表記ゆれ統一は、 バラバラの登録名を 1 つの正式名に揃える司書の仕事に相当する。
🩺 健康診断比喩
クレンジングは「まず検査、 次に治療」。 欠損率・重複数・型・値域を診断してから、 補完・除去・変換という処置を選ぶ。 診断なしに手術(一括 dropna())をすると、 健康な組織(正しい外れ値)まで切除してしまう。
もう一歩深い直感
SSDSE-B-2026 の 47 都道府県を例にとる。 同じ「汚れ」でも、 種類ごとに適切な処置が異なる:
| 汚れの種類 | 典型的な症状 | SSDSE-B-2026 を扱うときの処置例 |
| 欠損値 | 集計値が実態より小さく/大きく出る | 欠損率を診断し、 MCAR なら削除・MAR なら補完(fillna / KNNImputer) |
| 外れ値 | 平均・回帰係数が少数の値に引きずられる | A1101 総人口の東京都は「正しい外れ値」→ 削除せず対数変換や RobustScaler で吸収 |
| 重複行 | 件数・平均が水増しされる | 県 × 年度をキーに drop_duplicates・主キー一意性の assert |
| 表記ゆれ・型不整合 | 同じ県が別扱い・数値列が文字列扱い | value_counts() で表記を点検し、 to_numeric / NFKC 正規化で統一 |
同じ 47 県 × 113 列 の表でも、 汚れの種類を診断してから処置を選ぶかどうかで、 後段の分析の信頼性がまるで変わる。 これがクレンジングを「詳細に」学ぶ理由である。
📐 定義
🍰 まずはやさしく
データを解析できる状態に整える作業です。
分析の前に間違いや抜けを直すために使います。
買い物リストの書き方を統一するようなことです。
詳しい手順とルールについて説明します。
データクレンジング(詳細):生データに含まれる欠損値・外れ値・重複・表記ゆれ・型不整合を系統的に検出し、 欠損値処理・外れ値処理・重複除去・表記ゆれ統一・型変換・名寄せの 6 工程によって解析可能な状態へ整える一連の作業。
英語名 Data Cleansing(Data Cleaning とも)。 本ページは データクレンジング(概要) の詳細編である。
🎯 いつ・どこで使うか
- 欠損補完・外れ値処理・型変換・表記揺れの正規化・重複排除など、 分析やモデル投入の前段に必ず入る工程として登場します。
- 📚 データエンジニアリング パイプラインの中で、 ETL の T (Transform) や ELT の T を担う中核作業です。
- クレンジング規則をコード化し版管理することで、 後続の分析結果の再現性 (Reproducibility) を担保できます。
📋 前提条件・適用範囲
クレンジングを設計するときは、 次の前提を先に確認してください:
- スキーマの把握:各列の意味・単位・型・値域(付録 A の列リファレンス参照)を先に文書化する
- 欠損メカニズム:MCAR / MAR / MNAR のどれかで補完・削除の妥当性が変わる(欠損メカニズム)
- 外れ値の由来:入力ミスか真の極端値かをドメイン知識で判定してから処置を選ぶ
- キーの定義:重複判定に使う主キー(SSDSE-B なら県 × 年度)を明示する
- 元データの保全:生データは上書きせず、 処理済みデータを別ファイルで版管理する
📐 数式または定義
クレンジングの各工程は、 次の 3 つの基本量で数式として書き下せる。 データ行列を $$X = (x_{ij})$$($$i$$ 行 = 観測、 $$j$$ 列 = 変数、 $$N$$ 行)とする。
(1) 列 $$j$$ の欠損率:
$$r_j = \frac{1}{N} \sum_{i=1}^{N} \mathbb{1}\{x_{ij} \text{ が欠損}\}$$
(2) IQR 法(Tukey のフェンス)による外れ値判定:四分位点 $$Q_1, Q_3$$、 $$\mathrm{IQR} = Q_3 - Q_1$$ として
$$x_{ij} \notin [\,Q_1 - 1.5\,\mathrm{IQR},\; Q_3 + 1.5\,\mathrm{IQR}\,] \;\Rightarrow\; \text{外れ値候補}$$
(3) Z-score 法による外れ値判定:列平均 $$\bar{x}_j$$、 標準偏差 $$s_j$$ として
$$z_{ij} = \frac{x_{ij} - \bar{x}_j}{s_j}, \qquad |z_{ij}| > 3 \;\Rightarrow\; \text{外れ値候補}$$
本記事の SSDSE-B-2026(2023 年度断面、 $$N=47$$)では、 全列で $$r_j = 0$$(欠損なし)、 A1101 総人口の IQR 上方フェンス超えは 9 県、 東京都の Z-score は約 $$+4.1$$ となる(実測値は後述の Python 実装参照)。
📐 数式の深掘り — 欠損メカニズムの 3 分類
「削除してよい欠損」と「補完すべき欠損」の区別は、 欠損指示行列 $$M = (m_{ij})$$(欠損なら 1)の確率構造で定義される(Rubin, 1976)。 データを観測部分 $$X_{obs}$$ と欠損部分 $$X_{mis}$$ に分けると:
MCAR (Missing Completely At Random)
$$P(M \mid X_{obs}, X_{mis}) = P(M)$$
欠損が完全にランダム。 リストワイズ削除しても推定に偏りは生じない(サンプル数は減る)。
MAR (Missing At Random)
$$P(M \mid X_{obs}, X_{mis}) = P(M \mid X_{obs})$$
欠損確率が観測済みの値にのみ依存。 単純削除は偏るが、 観測値を使う多重代入(MICE / IterativeImputer)で妥当に補完できる。
MNAR (Missing Not At Random)
$$P(M \mid X_{obs}, X_{mis}) \ne P(M \mid X_{obs})$$
欠損確率が欠損値そのものに依存(例:値が大きいほど無回答)。 通常の補完では偏りが残り、 選択モデル等の明示的なモデリングが必要になる。
重複と名寄せの定式化
重複除去は「主キー $$k(i)$$(SSDSE-B なら県 × 年度)が等しい行の集合から代表 1 行を残す」操作。 名寄せ(レコードリンケージ)はその緩和版で、 文字列類似度 $$\mathrm{sim}(a, b)$$(編集距離・Jaro-Winkler など)が閾値 $$\tau$$ を超えるペアを同一エンティティ候補とみなす:
$$\mathrm{sim}(a, b) \ge \tau \;\Rightarrow\; a, b \text{ を同一候補として照合レビュー}$$
閾値 $$\tau$$ を上げると取りこぼし(同一なのに別扱い)が増え、 下げると誤結合(別なのに同一扱い)が増える。 この精度と再現率のトレードオフが Fellegi–Sunter (1969) 以来の名寄せ理論の中心である。
📜 歴史・系譜(データクレンジング)
| 年 | 出来事 | データクレンジングとの関係 |
| 1969 | Fellegi & Sunter: レコードリンケージ理論 | 名寄せを確率モデルとして定式化した古典 |
| 1970 | Codd: リレーショナルモデル | 主キー・参照整合性などスキーマ検査の基礎 |
| 1976 | Rubin: 欠損メカニズム(MCAR/MAR/MNAR) | 「削除か補完か」を選ぶ理論的根拠 |
| 1977 | Tukey: 探索的データ解析(EDA)・箱ひげ図 | IQR × 1.5 フェンスによる外れ値検出の起源 |
| 1987 | Little & Rubin: Statistical Analysis with Missing Data | 欠損データ解析の標準教科書 |
| 2000 | Rahm & Do: データクリーニングの分類論文 | 単一ソース/複数ソース × スキーマ/インスタンスの汚れ分類 |
| 2003 | Dasu & Johnson: Exploratory Data Mining and Data Cleaning | 「分析時間の大半はクレンジング」を体系化 |
| 2010 | Google Refine(現 OpenRefine)公開 | GUI ベースの表記ゆれ統一・クラスタリング照合の定番ツール |
| 2011 | van Buuren: mice(R の多重代入パッケージ) | MAR 下の実用的補完が誰でも使える形に |
| 2014 | Wickham: Tidy Data 論文 | クレンジングのゴール状態(整然データ)を定義 |
| 2018- | Great Expectations などデータ品質フレームワーク | クレンジング規則を宣言的に記述し CI/CD で検証する潮流 |
🔬 数式を言葉で読み解く(4 段ナレーション)
🎬 ナレーション 1:欠損率 $$r_j$$ — 「どの列がどれだけ欠けているか」
$$r_j = \frac{1}{N}\sum_i \mathbb{1}\{x_{ij}\text{ が欠損}\}$$ は「列 $$j$$ の欠損セルの割合」。 指示関数 $$\mathbb{1}\{\cdot\}$$ は欠損なら 1、 そうでなければ 0 を返すので、 その平均がそのまま欠損率になる。
クレンジングの最初の仕事は、 全列の $$r_j$$ を一覧にする「欠損マップ」作り。 SSDSE-B-2026 は公的統計として整備済みなので全列 $$r_j = 0$$ だが、 業務データでは列ごとに 0〜数十 % とばらつくのが普通で、 $$r_j$$ の大きさと欠損メカニズム(MCAR/MAR/MNAR)の組合せで削除・補完を選ぶ。
🎬 ナレーション 2:IQR フェンス — 「箱ひげ図のヒゲの外」
$$[\,Q_1 - 1.5\,\mathrm{IQR},\ Q_3 + 1.5\,\mathrm{IQR}\,]$$ は Tukey が箱ひげ図とともに定義した「普通の値の範囲」。 四分位点を使うため外れ値そのものに影響されにくいのが長所。
SSDSE-B-2026 の A1101 総人口(2023 年度)では、 上方フェンスを超えるのは東京都・神奈川県・大阪府・愛知県・埼玉県・千葉県・兵庫県・福岡県・北海道の 9 県。 これらは誤入力ではなく「大都市圏」という実体なので、 削除ではなく対数変換で吸収するのが正解となる。
🎬 ナレーション 3:Z-score $$z_{ij}$$ — 「平均から標準偏差いくつ分か」
$$z_{ij} = (x_{ij} - \bar{x}_j)/s_j$$ は値を「平均 0・標準偏差 1」の物差しに載せ替えた量。 $$|z| > 3$$(3σ ルール)を外れ値候補とするのが慣例だが、 平均 $$\bar{x}_j$$ と標準偏差 $$s_j$$ 自体が外れ値に引きずられる弱点がある。
実測では東京都の総人口の Z-score は約 $$+4.1$$。 「正規分布なら数万分の 1 の珍しさ」だが、 人口分布はそもそも正規ではないため、 Z-score は機械的な削除基準ではなく診断の目安として使う。
🎬 ナレーション 4:$$P(M \mid X)$$ — 「欠損の出方は何に依存するか」
欠損指示行列 $$M$$ の条件付き確率 $$P(M \mid X_{obs}, X_{mis})$$ を読むと、 3 分類の違いが一目で分かる。 右辺に何も残らなければ MCAR(完全ランダム)、 観測値 $$X_{obs}$$ だけ残れば MAR、 欠損値 $$X_{mis}$$ が残れば MNAR。
実務では「アンケートの高収入層ほど収入欄が空欄」のような MNAR が珍しくなく、 このときは fillna(平均) のような単純補完では偏りが取れない。 数式のどこに $$X_{mis}$$ が残るかが、 補完手法選択の分水嶺である。
🧮 実値で計算してみる(SSDSE-B-2026 47 都道府県)
data/raw/SSDSE-B-2026.csv を 年度 2023 の 47 行に絞り、 関係する指標を取り出して手計算ベースの確認をする。
STEP 1: データを眺める(年度 2023 の抜粋)
Prefecture A1101 A4103 A1303 B4101 A9101
北海道 5,092,000 1.06 1,681,000 11.0 17,281
東京都 14,086,000 0.99 3,205,000 17.6 71,774
大阪府 8,763,000 1.19 2,424,000 18.0 38,513
愛知県 7,477,000 1.29 1,923,000 17.5 31,759
沖縄県 1,468,000 1.60 350,000 23.8 6,316
鳥取県 537,000 1.44 179,000 16.6 1,810
… (全 47 県)
STEP 2: 基本統計
| 列 | 意味 | min | median | max | std |
| A1101 | 総人口 | 537,000 (鳥取) | 1,549,000 | 14,086,000 (東京) | 2.80e6 |
| A4103 | 合計特殊出生率 | 0.99 (東京) | 1.30 | 1.60 (沖縄) | 0.13 |
| A1303 | 65歳以上人口 | 179,000 (鳥取) | 524,000 | 3,205,000 (東京) | 6.94e5 |
| B4101 | 年平均気温 | 11.0 (北海道) | 17.4 | 23.8 (沖縄) | 2.05 |
| A9101 | 婚姻件数 | 1,810 (鳥取) | 5,599 | 71,774 (東京) | 1.31e4 |
STEP 3: 主要指標間の相関(クレンジング前の整合性チェック)
| ペア | Pearson r | 解釈 |
| A1101 vs A9101 | 0.989 | 総人口と婚姻件数はほぼ完全相関 → 多重共線性に注意 |
| A1101 vs A4103 | -0.564 | 人口と出生率は中程度の負相関(大都市ほど出生率低い) |
| B4101 vs A4103 | +0.502 | 気温と出生率は中等度の正相関(南日本ほど高い) |
| A1303/A1101 vs A4103 | +0.201 | 高齢化率と出生率は弱い正相関(ほぼ無相関) |
STEP 4: クレンジング設計で決めるべき 5 項目(チェックリスト)
- ✅ 対象列 = A1101 総人口, A4103 合計特殊出生率, B4101 年平均気温 など(付録 A の列リファレンスで単位・値域を確認)
- ✅ 主キー = 県 × 年度(重複判定の基準)
- ✅ 欠損の処置 = 欠損率と MCAR/MAR/MNAR の診断結果で削除/補完を選択
- ✅ 外れ値の処置 = 東京都など「正しい外れ値」は削除せず対数変換・クリッピングで吸収
- ✅ 検収指標 = 欠損率, 重複行数, 型整合性, 値域(スキーマ検査)
🧮 数式に値を入れて手で計算する: 重複除去後の件数
例題として 10,000 件の会員名簿を想定し、 完全重複・部分重複の除去後の有効件数を手計算する(SSDSE-B-2026 は重複ゼロなので、 ここだけ架空の件数を使った練習問題である)。
Step 1: クリーニング工程別残存件数
| 工程 | 除外件数 | 残存 |
| 元データ | — | 10,000 |
| 完全重複削除 | 500 | 9,500 |
| キー欠損除外 | 200 | 9,300 |
| 外れ値除外 | 300 | 9,000 |
| 名寄せ統合 | 1000 | 8,000 |
Step 2: クレンジング率
除外合計 = 500+200+300+1000 = 2,000
クレンジング率 = 2000/10000 = 0.20 (20%)
最終有効率 = 8000/10000 = 0.80
🐍 Python で再現
| import numpy as np
removed = np.array([500, 200, 300, 1000])
total = 10000
remain = total - removed.sum()
print(f"除外合計: {removed.sum()}")
print(f"最終有効: {remain}")
print(f"有効率: {remain/total:.2f}")
|
📤 実行結果
除外合計: 2000
最終有効: 8000
有効率: 0.80
💬 手計算 (Step 2) 8000 件 / 0.80 と Python 出力が完全一致。
🐍 Python での扱い
SSDSE-B-2026 のような公的統計データを Python で扱う際の基本パターン:
📥 入力例(SSDSE-B-2026 全体:564 行 × 112 列 = 47 都道府県 × 2012〜2023 年)
年度 地域コード 都道府県 A1101(総人口) A1303(65歳以上人口) A4101(出生数) …
2023 R01000 北海道 5,092,000 1,681,000 24,430 …
2023 R13000 東京都 14,086,000 3,205,000 86,348 …
2023 R47000 沖縄県 1,468,000 350,000 12,549 …
…(残り 112 列は住宅・家計・教育・医療など)
1
2
3
4
5
6
7
8
9
10
11
12 | import pandas as pd
import numpy as np
# データ読み込み
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
print(df.shape)
print(df.dtypes)
print(df.describe())
# 「クレンジング処理」の文脈で扱う場合の例:
# 分野: データ前処理
# 関連手法は同カテゴリの他用語を参照してください。
|
具体的なコードは データエンジニアリング を参照してください。
📝 レポートでの報告
分析結果を報告するときに含めるべき情報:
- 使ったデータ:出典・期間・サンプル数
- 適用条件の確認:前提が満たされているか
- 計算結果:数値だけでなく不確実性(CI・SE)も
- 解釈:何を意味するか、 何を意味しないか
- 限界:適用範囲外への拡張は避ける
✅ チェックリスト
- □ 「クレンジング処理」を使う場面か再確認したか
- □ データの尺度・分布・サンプル数を確認したか
- □ 前提条件を満たしているか
- □ 計算した値だけでなく不確実性も把握したか
- □ 解釈と限界を区別したか
- □ 関連グループ教材で全体像を確認したか
🔗 同カテゴリの他用語
🐍 Python 実装(データクレンジング詳細編、 SSDSE-B-2026)
実装 1: 最小再現コード
🎯 このコードでやること:SSDSE-B-2026 の 47 都道府県データに対して欠損・型・重複の 3 点診断を行い、 欠損率・重複行数・型整合性を確認する。
📥 入力データ(SSDSE-B-2026.csv 抜粋、 47 都道府県 × 113 列):
年度 Code Prefecture A1101 A4103 A1303 ...
2023 R01000 北海道 5092000 1.06 1681000 ...
2023 R13000 東京都 14086000 0.99 3205000 ...
2023 R47000 沖縄県 1468000 1.60 350000 ...
...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | import pandas as pd
import numpy as np
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
# 1. 欠損確認
print("欠損数 (列ごと 上位5):")
print(df.isnull().sum().sort_values(ascending=False).head())
# 2. 型確認
print("\n型情報:")
print(df.dtypes.value_counts())
# 3. 重複行
print(f"\n重複行: {df.duplicated().sum()}")
# 4. 数値列の基本統計(2023 年度断面)
print("\n総人口の基本統計:")
print(df[df['SSDSE-B-2026']==2023]['A1101'].describe())
|
📤 実行結果:
欠損数 (列ごと 上位5):
SSDSE-B-2026 0
Code 0
H1800 0
G7102 0
G7101 0
dtype: int64
型情報:
int64 104
float64 6
object 2
Name: count, dtype: int64
重複行: 0
総人口の基本統計:
count 4.70e+01
mean 2.65e+06
std 2.80e+06
min 5.37e+05
max 1.41e+07
Name: A1101, dtype: float64
💬 結果の読み方:SSDSE-B-2026 はクレンジング済みデータなので欠損 0・重複 0。 しかし総人口は最小 約54万人(鳥取) ~ 最大 約1409万人(東京) と巨大な裾を持つ。 そのまま線形回帰に投入すると東京が外れ値として効きすぎる → 対数変換 or 標準化が必須。
実装 2: 比較・拡張
🎯 このコードでやること:実装 1 の診断を踏まえ、 IQR 法による外れ値検出と、 対数変換による「削除しない外れ値処理」を実装する。
📥 入力データ:実装 1 と同じ SSDSE-B-2026(年度 2023)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | import pandas as pd
import numpy as np
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df_2023 = df[df['SSDSE-B-2026']==2023].copy()
# 外れ値検出: IQR 法で総人口の外れ値県を表示
q1, q3 = df_2023['A1101'].quantile([0.25, 0.75])
iqr = q3 - q1
upper = q3 + 1.5 * iqr
outliers = df_2023[df_2023['A1101'] > upper][['Prefecture','A1101']].sort_values('A1101', ascending=False)
print("総人口 上方外れ値県:")
print(outliers.to_string(index=False))
# 対数変換でクレンジング
df_2023['log_pop'] = np.log10(df_2023['A1101'])
print(f"\n対数変換後 std: {df_2023['log_pop'].std():.3f}")
print(f"対数変換前 cv : {df_2023['A1101'].std()/df_2023['A1101'].mean():.3f}")
|
📤 実行結果:
総人口 上方外れ値県:
Prefecture A1101
東京都 14086000
神奈川県 9229000
大阪府 8763000
愛知県 7477000
埼玉県 7331000
千葉県 6257000
兵庫県 5370000
福岡県 5103000
北海道 5092000
対数変換後 std: 0.349
対数変換前 cv : 1.057
💬 結果の読み方:IQR 法で 9 県が上方外れ値と判定された。 これらは『大都市圏』という意味のある集団なので削除ではなく対数変換で対処する。 対数変換後(log10)の標準偏差は 0.35 に縮み(変換前の変動係数 1.06 と比べて桁スケールが圧縮され)、 モデルが安定する。
🐍 Python 実装 第 3 弾(多段階クレンジング・パイプライン)
🎯 このコードでやること:重複除去 → 型変換 → 外れ値クリッピング → 標準化の 4 段階を順番に適用し、 各段階のログを残す。
📥 入力データ:SSDSE-B-2026(2012〜2023 の全年度を含む)。
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 | # 多段階クレンジング: 重複・型・外れ値・正規化を順に
import pandas as pd
import numpy as np
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df_2023 = df[df['SSDSE-B-2026']==2023].copy()
# Step A: 重複行削除
before = len(df_2023)
df_2023 = df_2023.drop_duplicates()
print(f"Step A: 重複除去 {before} -> {len(df_2023)} 行")
# Step B: 型確認・修正
df_2023['A1101'] = pd.to_numeric(df_2023['A1101'], errors='coerce')
df_2023['B4101'] = pd.to_numeric(df_2023['B4101'], errors='coerce')
print(f"Step B: 数値変換後 型 = {df_2023['A1101'].dtype}, {df_2023['B4101'].dtype}")
# Step C: 外れ値クリッピング (Winsorize 1-99%)
lo, hi = df_2023['A1101'].quantile([0.01, 0.99])
df_2023['A1101_w'] = df_2023['A1101'].clip(lo, hi)
print(f"Step C: クリッピング後 max = {df_2023['A1101_w'].max():.0f} (元 {df_2023['A1101'].max():.0f})")
# Step D: Z-score 標準化
df_2023['A1101_z'] = (df_2023['A1101_w'] - df_2023['A1101_w'].mean()) / df_2023['A1101_w'].std()
print(f"Step D: 標準化後 mean = {df_2023['A1101_z'].mean():.6f}, std = {df_2023['A1101_z'].std():.4f}")
print(f"\n東京の Z-score: {df_2023[df_2023['Prefecture']=='東京都']['A1101_z'].values[0]:.3f}")
|
📤 実行結果:
Step A: 重複除去 47 -> 47 行
Step B: 数値変換後 型 = int64, float64
Step C: クリッピング後 max = 11851780 (元 14086000)
Step D: 標準化後 mean = -0.000000, std = 1.0000
東京の Z-score: 3.544
💬 結果の読み方:4 段階クレンジング後、 東京の Z-score は 3.54 で『約 3.5σ 外れ値』(クリッピング前の生 Z-score は約 4.1)。 クリッピングを 1-99% で穏やかに行ったため、 東京の値は約 14.1M → 11.9M に圧縮されたが、 依然として外れ。 さらなる処理が必要なら対数変換 or 別モデル化を検討。
🚑 トラブルシューティング
| 症状 | 原因候補 | 処方箋 |
| read_csv で UnicodeDecodeError | エンコーディング不一致 | SSDSE 系は encoding='cp932' を指定(BOM 付き UTF-8 なら utf-8-sig) |
| 数値列なのに dtype が object | 「-」「…」などの記号・カンマ・全角数字の混入 | na_values=['-'] で読み込み、 pd.to_numeric(errors='coerce') で変換 |
| 先頭行に日本語ラベルが混ざる | SSDSE の 2 行ヘッダー | skiprows=[1] で 2 行目(日本語項目名)を読み飛ばす |
| 集計値が公式統計より小さい | 欠損を 0 で埋めた/必要行を削除しすぎた | 欠損フラグ列で処理前後を追跡し、 assert で総計を検査 |
| 結合したら行数が増えた | キー重複(1 対多結合) | 結合前に df.duplicated(subset=キー).sum() を確認、 merge(validate='one_to_one') |
| 同じ県が 2 つに分かれて集計される | 表記ゆれ(全角/半角・空白・旧字) | value_counts() で目視点検 → NFKC 正規化・置換マスタで統一 |
| 平均・相関が処理後に激変 | 過剰な外れ値除去 | 処理前後のヒストグラム・散布図を比較し、 削除ではなく変換で吸収 |
| 年度を跨ぐと値の桁が違う | 単位変更・定義変更 | スキーマ表(列名・単位・値域)を年度ごとに確認し、 単位換算を明示 |
🚀 次に学ぶべき関連用語
本ページを読み終えたら、 以下の関連用語ページに進んでさらに理解を深めよう:
前半 6 つはクレンジングの各工程を深掘りする用語、 後半 2 つはクレンジングのゴール(整然データ)と下流工程(特徴量設計)である。
🏭 産業界活用 詳細(4 業界深掘り)
1) 公共政策・統計行政(クレンジングの主戦場)
SSDSE-B-2026 のような都道府県別社会指標を政策評価に使う場合、 分析前に「年度間で定義や単位が変わっていないか」「『-』などの記号が欠損として正しく読み込まれているか」を検査するのがクレンジングの仕事。 公的統計は整備度が高い一方、 複数年度・複数統計の結合時に単位・コード体系の不一致が混入しやすい。 本記事の Python 実装 1-5 の診断手順はそのまま流用可能。
2) EC・小売(顧客・商品マスタ)
顧客名簿の名寄せ(同一人物が「山田太郎」「ヤマダ タロウ」で二重登録)、 商品マスタの表記ゆれ(「500ml」「500ML」「500ml」)が典型課題。 重複除去を誤ると会員数・販売数が水増しされ、 需要予測やレコメンドの学習データが汚染される。 全角半角の NFKC 正規化と置換マスタの整備が鍵。
3) 医療・公衆衛生
電子カルテ・レセプトデータは欠損が MNAR になりやすい代表例(重症患者ほど検査値が多く、 健康な人ほど記録が少ない)。 「欠損 = 測定なし」と「0 = 陰性」の区別、 施設ごとの単位(mg/dL と mmol/L)の統一が、 疾患リスク分析の信頼性を左右する。 SSDSE-B-2026 の I510120 一般病院数のような集計統計と突合する際も、 集計基準日のずれに注意。
4) 観光・宿泊分析(右裾の長い指標)
SSDSE-B-2026 の G7101 延べ宿泊者数は右裾が極端に長い列の典型で、 2023 年実測では約 170 万人泊(最小県)〜 約 8,027 万人泊(東京都)と、 上位観光地に極端に集中する。 クレンジング設計では「対数変換で吸収するか」「外れ値(東京)を別扱いするか」「年度パネルとして扱うか」を必ず決める。 同様に地価・売上のような右裾の長い実務データでも、 対数変換と外れ値の扱いの判断が品質を左右する。
📘 ステップバイステップ・チュートリアル
STEP 1: 環境準備
📥 入力例(SSDSE-B-2026 全体:564 行 × 112 列 = 47 都道府県 × 2012〜2023 年)
年度 地域コード 都道府県 A1101(総人口) A1303(65歳以上人口) A4101(出生数) …
2023 R01000 北海道 5,092,000 1,681,000 24,430 …
2023 R13000 東京都 14,086,000 3,205,000 86,348 …
2023 R47000 沖縄県 1,468,000 350,000 12,549 …
…(残り 112 列は住宅・家計・教育・医療など)
| # 必要なパッケージをインストール
# pip install pandas numpy scikit-learn matplotlib seaborn
# データを読み込む
import pandas as pd
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
print(f"形状: {df.shape}")
print(f"年度: {df['SSDSE-B-2026'].unique()}")
|
STEP 2: 探索的データ分析 (EDA)
| df_2023 = df[df['SSDSE-B-2026']==2023]
print(df_2023.describe()[['A1101','A4103','B4101']])
# 出生率上位・下位 5 県
top5 = df_2023.nlargest(5, 'A4103')[['Prefecture','A4103']]
bot5 = df_2023.nsmallest(5, 'A4103')[['Prefecture','A4103']]
print("\n出生率 高い 5 県:")
print(top5.to_string(index=False))
print("\n出生率 低い 5 県:")
print(bot5.to_string(index=False))
|
STEP 3: 相関ヒートマップ
| import seaborn as sns
import matplotlib.pyplot as plt
cols = ['A1101','A4103','B4101','A1303','A9101','I510120']
corr = df_2023[cols].corr()
plt.figure(figsize=(8,6))
sns.heatmap(corr, annot=True, fmt='.2f', cmap='RdBu_r', center=0)
plt.title('SSDSE-B-2026 相関ヒートマップ')
plt.tight_layout()
plt.savefig('correlation_heatmap.png', dpi=120)
|
STEP 4: クレンジング済みデータをモデルへ(Pipeline でリーク防止)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | from sklearn.linear_model import Ridge
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.model_selection import cross_val_score
X = df_2023[['A1101','A1303','A9101','B4101','B4106']]
y = df_2023['A4103']
pipe = Pipeline([
('sc', StandardScaler()),
('reg', Ridge(alpha=1.0))
])
scores = cross_val_score(pipe, X, y, cv=5, scoring='r2')
print(f"5-fold CV R^2: {scores.mean():.3f} +/- {scores.std():.3f}")
|
STEP 5: クレンジング前後の検証・可視化・記録
処理前後のヒストグラム・箱ひげ図・散布図を比較し、 「行数・列数がどう変わったか」「主要な相関関係が保存されているか」をログとして残す。 クレンジングが成功したかは『欠損が消えた』ことではなく、 『分析目的に必要な情報が壊れていない』ことで判断する。
🐍 Python 実装 第 4 弾(文字列クレンジング)
🎯 このコードでやること:文字列列(都道府県名)の表記ゆれ・文字数・接尾辞を点検し、 名寄せの前段となる診断を行う。
📥 入力データ:SSDSE-B-2026.csv(年度 2023, 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
25 | # 文字列クレンジング: 都道府県名の表記揺れチェック
import pandas as pd
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df_2023 = df[df['SSDSE-B-2026']==2023].copy()
# 表記ゆれの検出ヒューリスティック
print(f"県名ユニーク数: {df_2023['Prefecture'].nunique()}")
print(f"全レコード数: {len(df_2023)}")
# 末尾「県」「都」「府」「道」の集計
def suffix(s):
for ch in ['県','都','府','道']:
if s.endswith(ch):
return ch
return 'その他'
df_2023['suf'] = df_2023['Prefecture'].apply(suffix)
print("\n末尾分類:")
print(df_2023['suf'].value_counts())
# 文字数チェック
df_2023['len'] = df_2023['Prefecture'].str.len()
print(f"\n県名の文字数: min={df_2023['len'].min()}, max={df_2023['len'].max()}")
print(f"最長県: {df_2023[df_2023['len']==df_2023['len'].max()]['Prefecture'].values}")
|
📤 実行結果:
県名ユニーク数: 47
全レコード数: 47
末尾分類:
県 43
都 1
府 2
道 1
Name: suf, dtype: int64
県名の文字数: min=3, max=4
最長県: ['和歌山県' '神奈川県' '鹿児島県']
💬 結果の読み方:47 都道府県 = 1 都・1 道・2 府・43 県。 文字数は 3〜4 で、 4 文字は『和歌山県』『神奈川県』『鹿児島県』。 SSDSE-B-2026 は表記ゆれゼロのクリーンデータだが、 自治体名・町村名を扱う場合は『市』『町』『郡』も混在し、 さらに同名町村(例: 府中市が東京と広島)が頻出。
🐍 Python 実装 第 5 弾(スケール変換 4 種の比較)
🎯 このコードでやること:スケール変換 4 種(Standard / MinMax / Robust / Yeo-Johnson)を比較し、 外れ値(東京都)の効き方が手法でどう変わるかを実測する。
📥 入力データ:SSDSE-B-2026.csv(年度 2023)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | # 数値列のスケール変換 4 種を比較
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler, PowerTransformer
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df_2023 = df[df['SSDSE-B-2026']==2023].copy()
x = df_2023[['A1101']].values
scalers = {
'Standard': StandardScaler(),
'MinMax': MinMaxScaler(),
'Robust': RobustScaler(),
'YeoJohnson': PowerTransformer(method='yeo-johnson'),
}
for name, sc in scalers.items():
z = sc.fit_transform(x).ravel()
tk_idx = list(df_2023['Prefecture']).index('東京都')
print(f"{name:12s}: 東京={z[tk_idx]:+.2f}, min={z.min():+.2f}, max={z.max():+.2f}, std={z.std():.2f}")
|
📤 実行結果:
Standard : 東京=+4.13, min=-0.76, max=+4.13, std=1.00
MinMax : 東京=+1.00, min=+0.00, max=+1.00, std=0.20
Robust : 東京=+7.82, min=-0.63, max=+7.82, std=1.73
YeoJohnson : 東京=+1.94, min=-2.09, max=+1.94, std=1.00
💬 結果の読み方:東京の値は Standard で +4.13、 RobustScaler では +7.82(中央値・IQR ベース)、 YeoJohnson で +1.94(パワー変換)。 外れ値の効きは RobustScaler が最大、 YeoJohnson が最小。 クレンジング設計では『その後のモデルが何を仮定するか』で選ぶ。
📝 演習問題(解説付き、 5 問)
問 A:ある列の欠損率が 3% と 40% のとき、 それぞれどう対処すべきか?
▼ 解答と解説
解答:欠損率だけでは決められない。 まず欠損メカニズム(MCAR/MAR/MNAR)を診断する。 目安として、 低欠損率 × MCAR なら行削除でも偏りは小さいが、 高欠損率の列は補完しても情報の大半が人工値になるため「列ごと落とす/欠損フラグ列を残す」ことも検討する。
解説:欠損が他の観測値と相関している(MAR)場合、 削除はサンプルを系統的に偏らせる。 多重代入(MICE / IterativeImputer)が候補。 「欠損したこと自体が情報」なら欠損フラグ列を必ず残す。
問 B:出生率(A4103)を log 変換すべきか?
▼ 解答と解説
解答:不要(むしろ非推奨)。
解説:A4103 合計特殊出生率は 0.99 〜 1.60 の狭い範囲で歪度小。 log 変換しても分布形状はほとんど変わらない。 一方、 A1101 総人口(約54万〜1409万)は強い右裾なので log 変換が有効。 『どの列を log するか』をクレンジング設計の段階で列ごとに決める。
問 C:「東京」「東京都」「Tokyo」が混在する県名列をどう統一する?
▼ 解答と解説
解答:(1) value_counts() で全表記を列挙、 (2) NFKC 正規化(全角半角・大文字小文字)、 (3) 正式名称の置換マスタ(辞書)で写像、 (4) 変換後にユニーク数が 47 になることを assert で検査。
解説:手作業の逐次置換はやり直しが利かない。 「置換マスタ + 検査」をコード化しておけば、 データが更新されても同じ規則を再適用できる(再現性)。 OpenRefine のクラスタリング照合も有効。
問 D:重複行の判定キーはどう決める? SSDSE-B-2026 の場合は?
▼ 解答と解説
解答:「現実世界で 1 つの実体を表す列の組」を主キーにする。 SSDSE-B-2026 なら県(Code または Prefecture)× 年度(先頭列 SSDSE-B-2026)。 全列一致の完全重複は drop_duplicates()、 キー重複は duplicated(subset=['SSDSE-B-2026','Code']) で検出する。
解説:全列一致だけを見ると、 「同じ県 × 年度なのに値が微妙に違う」部分重複を見逃す。 部分重複は入力ミスか更新差分かをドメイン判断で解消し、 どちらを残したかを記録する。
問 E:外れ値への対処は「削除」だけではない。 3 通り挙げよ。
▼ 解答と解説
解答:
- 変換で吸収:対数変換・Yeo-Johnson 変換で裾を縮める(東京都の総人口はこれが第一候補)。
- クリッピング(winsorize):上下 1% を分位点の値で置換し、 極端値の影響を上限で抑える。
- 頑健手法で受け流す:中央値・IQR・RobustScaler・Huber 回帰など、 外れ値に鈍感な統計・モデルを使う。
解説:削除は「誤入力と確認できた場合」の最終手段。 実測では東京都の Z-score は +4.0 だが、 これは誤りではなく実体なので、 削除すると都市と地方の構造という本質情報が失われる。
⚠️ よくある落とし穴
❌ リーケージ(全体統計でスケーリング)
症状: 検証 R²=0.95 と高いのに本番で 0.5 まで落ちる。 原因: 全 47 県の平均・分散で StandardScaler を fit してから train/test に分割し、 テスト情報が訓練統計量経由でリークしている。 回避: `Pipeline([scaler, model])` を組み、 `cross_val_score` 経由で fold 内 fit を強制する。
❌ 過剰な外れ値除去
症状: 「綺麗な相関」が出るが東京・大阪を除外したため首都圏政策の議論に使えない。 原因: 3σ ルールで自動カットし、 実体経済の本質である集中分布を破壊している。 回避: ドメイン文脈で外れ値か入力ミスかを判定し、 RobustScaler や log 変換で「除去せず吸収」する設計に切り替える。
❌ スケーラーを目的別に使い分けない
症状: MinMaxScaler を適用したら新規県 (テスト時) が 1.0 を超えて勾配ブースティングが発散した。 原因: 訓練データの最大値で範囲を固定し、 分布外データに対応できない。 回避: 木モデルは無変換、 線形・距離系は StandardScaler、 外れ値多い列は RobustScaler と列ごとに選ぶ。
❌ 単位・表記揺れの未統一
症状: SSDSE-B-2026 を年度跨ぎで結合したら同じ「消費支出(L3221)」が円と千円で混在し、 グラフが折れ線で崩壊。 原因: 元データの単位定義を確認せず concat した。 回避: スキーマ表 (列名・単位・型・値域) を先に書き、 結合前に `assert df['L3221'].min() > 1e5` 等の検査を入れる(実測では L3221 消費支出の 2023 年下限は 223,423 円)。
❌ 欠損を 0 で埋める
症状: 「観光入込客数」が NaN の県が 0 として平均に混じり、 全国平均が 30% 低く出る。 原因: 欠損 (測定なし) と 0 (本当にゼロ) を区別せず `fillna(0)` した。 回避: 欠損フラグ列を追加し、 KNNImputer や IterativeImputer で機構別 (MCAR/MAR/MNAR) に補完戦略を変える。
🙅 よくある誤解 3 つ
誤解 1:「クレンジング=前処理・特徴量エンジニアリングと同じもの」
クレンジングは前処理の
一部であり、 目的は「誤り・不整合の除去」。 一方
特徴量エンジニアリングの目的は「予測に効く情報の創出」(比率を作る・交互作用を作る等)。 「高齢化率 = A1303 / A1101 を作る」のは特徴量設計、 「A1101 が文字列で入っているのを数値に直す」のがクレンジング。 混同すると『どこまで直したら分析に進んでよいか』が判断できなくなる。
誤解 2:「欠損はとにかく削除(または平均で補完)すればよい」
削除は MCAR のときだけ偏りなし。 MAR/MNAR で削除するとサンプルが系統的に偏る。 逆に平均値補完は分散を人工的に縮め、 相関を歪める。
削除 vs 補完は欠損メカニズムの診断結果で選ぶものであり、 万能のデフォルトは存在しない(
欠損メカニズム参照)。
誤解 3:「外れ値=誤りだから消してよい」
外れ値には「入力ミス(年齢 200 歳)」と「真の極端値(東京都の総人口)」の 2 種類がある。 前者は修正・削除の対象だが、 後者はデータの本質。 SSDSE-B-2026 で東京都を除外すると「人口と経済指標の強い関係」という現実そのものが消える。 IQR や 3σ は候補の検出器であって、 削除の自動執行装置ではない。
🔗 関連用語 — 前提・並列・発展
前提となる用語 (クレンジング前に押さえる)
並列に位置する用語 (前処理パイプラインの近接工程)
発展先の用語 (クレンジング後に進む)
📝 最終ノート — データクレンジング(詳細)の重要性
本ページで データクレンジング(Data Cleansing) の詳細を展開した。 内容を 3 行でまとめれば:
- クレンジングは分析プロジェクトの上流工程であり、 工数の 60-80% を占めつつ結果の信頼性を決める。
- 欠損・外れ値・重複・表記ゆれ・型は「まず診断、 次に処置」— 一括 dropna のような機械的処理は禁物。
- 本ページの 5 段階 Python 実装 + クレンジング・レシピ集 + FAQ 20 問を反復することで、 実務で使えるクレンジング・スキルが身につく。
次は 欠損値、 外れ値、 整然データ (Tidy Data) のページに進もう。 本ページで扱った欠損率・IQR・Z-score が、 これらの概念とどう絡むかが見えてくる。
🖼 クレンジング処理の前後を可視化で検証する
クレンジング処理は 「前」「中」「後」 の 3 段階で必ず可視化チェックします。 ここでは SSDSE-B-2026 の都道府県データを念頭に、 各段階での確認図と読み取りポイントをまとめます。
図1: クレンジング前のヒストグラムで 外れ値・歪み・データ欠落 を一望する。 SSDSE-B-2026 の総人口列ヒストグラムでは、 東京都 (約 1,409 万人) が右に大きく外れ、 中央値の倍以上のスケールで突出。 この時点で 「外れ値処理が要るか」 「対数変換が必要か」 が見極められる。 ヒストグラムが想定外の形 (双峰・極端な右偏) になっていたら、 入力データに型崩れや結合ミスが含まれている可能性が高い。
図2: 箱ひげ図で外れ値の位置と数を定量的に確認する。 SSDSE-B の都道府県別変数では、 ほとんどの数値列で東京・大阪・神奈川など人口上位の都市が外れ値として識別される。 これらを 機械的に除外するか、 ドメイン的に保持するか、 を決めるのがクレンジングの本質的な意思決定。 箱ひげの IQR を基準にした自動処理は便利だが、 全国平均との文脈を理解せずに適用すると、 重要な情報を失う。
図3: クレンジング後に 2 変数の散布図を描き、 期待される相関 (例: 総人口 A1101 ↔ 婚姻件数 A9101 の強い正相関、 実測 r=0.989) が残っているかを確認する。 クレンジングを過剰に行うと、 本来の関係性が散布図から消えてしまう。 SSDSE-B-2026 で外れ値を除いた後でも、 主要関係が崩れていないことを 必ず 散布図で確認するのが鉄則。 これを怠ると、 後段の回帰モデルや相関分析が誤った結論を返す。
クレンジングは 「処理を施せば良くなる」 という単純な操作ではなく、 処理ごとに情報の取捨選択が発生する 慎重な工程です。 図 1 → 2 → 3 の順に毎回確認することで、 過剰除去や欠損誤処理を防げます。
| 段階 | 主に使う図 | 見るポイント | 処置の決定材料 |
| 前 | ヒストグラム | 分布形状、 範囲、 ピーク数 | 変換要否、 ビン設定 |
| 中 | 箱ひげ図 | 外れ値の位置・数・大きさ | 除外・置換・保持 |
| 後 | 散布図 / 相関行列 | 関係性の保存度 | 処理の妥当性確認 |
✅ 理解度チェック
- クレンジング前後で同じヒストグラムを比べる目的は何か? (ヒント: 想定外の歪み・型崩れの検知)
- IQR ベースの外れ値検知が、 SSDSE-B-2026 の都道府県データで問題を起こしやすい理由は?
- 欠損値を平均値で埋めるとき、 失われる情報の種類は何か?
- カテゴリ変数の表記揺れ (「東京」「東京都」「東京都」) を統一する一般的手段は?
- クレンジング後にもとの分析目的と照らして 「過剰処理」 を検知する図はどれか?
→ すべて即答できれば、 クレンジング工程の意思決定を独力で行える段階。 不安な項目は本ページの前半セクションを再読してください。
📝 補足: クレンジング処理の実務 3 パターン
クレンジングは状況に応じて使い分けます。 ここでは 探索的分析 (EDA)、 本番モデル学習、 ダッシュボード配信 の 3 シーンで頻出する実務パターンを SSDSE-B-2026 を念頭に整理します。
パターン A: 探索的分析 (EDA)
EDA 段階のクレンジングは 「最小限」 が原則です。 SSDSE-B-2026 の都道府県データなら、 数値型を確認 (df.dtypes)、 欠損集計 (df.isna().sum())、 重複行検出 (df.duplicated().sum()) の 3 点で終わらせ、 外れ値除外や欠損補完はまだ行いません。 早すぎる除外は 「本来見るべき外れ値」 を見逃させるからです。 東京都は人口・経済の多くの指標で外れ値ですが、 これを最初から除外すると都市・地方ギャップの議論ができなくなります。
パターン B: 本番モデル学習
機械学習モデル用のクレンジングは 「再現性」 が最重要です。 sklearn.pipeline.Pipeline や ColumnTransformer を使い、 「欠損補完 → 標準化 → ワンホットエンコード」 を 1 つのオブジェクトにまとめ、 訓練データで fit、 テストデータで transform のみを行う構造にします。 これを怠ると、 テストデータの統計量が学習にリークし、 評価が過大になります。 SSDSE-B-2026 で 47 都道府県を訓練 8 割・テスト 2 割に分けるシナリオでも、 この原則は変わりません。
パターン C: ダッシュボード配信
経営層・分析者向けのダッシュボード配信では、 「集計時に意味が変わらない」 処理が選ばれます。 欠損は中央値補完、 外れ値はキャップ (上下 1% を 99 パーセンタイル値で置換) など、 統計値が大きくブレない手法を採用します。 過剰な除外をすると 「表示される総人口が公式統計と乖離する」 という事故が起こり、 信頼を失います。 SSDSE-B-2026 のような公的データを配信する場合は、 必ず元データのソースを明示し、 行った処理を透明化 してください。
| シーン | 処理方針 | 使うツール | よくある失敗 |
| EDA | 最小限、 観察優先 | pandas describe / isna | 早すぎる外れ値除外 |
| モデル学習 | 再現性重視 | sklearn Pipeline | テストデータのリーク |
| ダッシュボード | 統計量を保つ | winsorize / median 補完 | 公式統計との乖離 |
これら 3 パターンを 「目的によって違うクレンジングが必要」 という観点で理解しておくと、 同じ SSDSE-B-2026 データから何種類ものクリーンな派生データセットを作れるようになります。 1 つのデータセットを 「これがクリーン」 と固定する発想は危険で、 用途ごとに処理パイプラインを分ける運用が現代的なベストプラクティスです。 とくに学習用とダッシュボード用は 必ず別パイプライン で管理してください。
最後に、 クレンジングは 「自分で実装する」 と 「ライブラリに任せる」 の使い分け が重要です。 SSDSE-B-2026 程度の規模 (47 行) では pandas で十分ですが、 数百万行を超える場合は pyjanitor、 cleanlab、 great-expectations といった専用ツールを併用すべきです。 とくに great-expectations はデータ品質を YAML で宣言的に契約でき、 CI/CD に組み込むことで「データの劣化」を検知できます。 大規模化したら必ずチェックしてください。
追加 Tips: クレンジングと欠損のメカニズム
欠損には大きく 3 種類あります。 (a) MCAR (Missing Completely At Random): 完全にランダムに欠ける。 削除しても偏りは生じない。 (b) MAR (Missing At Random): 他の観測値に依存して欠ける。 例えば年齢が高い人ほど特定項目を答えない傾向など。 (c) MNAR (Missing Not At Random): 欠損自体が値に依存する。 例えば収入が高い人ほど収入を答えない。 この区別を意識せずに欠損を一律平均値補完すると、 (b)(c) の場合に推定が深刻に歪みます。 SSDSE-B-2026 のような公的統計では欠損は少ないですが、 業務データではこの 3 区分の見極めが分析の出発点です。
MCAR なら削除や単純補完で OK ですが、 MAR は 多重代入法 (sklearn.experimental.IterativeImputer や R の mice パッケージ) を、 MNAR は 選択モデル (Heckman の二段階推定など) を検討します。 「欠損は単に埋めるもの」 という素朴な発想を超えて、 「欠損のメカニズム自体が情報」 という視点を持つと、 クレンジングが単なる前処理から分析の本質的な一部に変わります。
追加 Tips: クレンジングの自動化と再現性
クレンジング処理を Jupyter のセルに散在させると、 数か月後に同じ処理を再実行できなくなります。 必ず 関数化 し、 入力と出力のスキーマを docstring に明記し、 unit test を書く運用にしてください。 pytest で 「欠損数が処理前後でどう変わったか」 「特定の数値が想定範囲内か」 を自動チェックすれば、 データ品質の劣化を CI で検知できます。
またクレンジング処理の 順序 は結果に大きく影響します。 例えば 「重複削除 → 欠損補完」 と 「欠損補完 → 重複削除」 では、 補完によって新たに重複が生まれる場合の処理結果が変わります。 SSDSE-B-2026 では問題になりにくいですが、 ID 列のないログデータなどでは順序を文書化し、 リファクタリング時に順序を変えないように注意してください。 さらに 「クレンジング処理の各ステップで何行・何列が変わったか」 を log として残すと、 後で問題が起きたときに原因特定が劇的に早まります。
クレンジングのチェックリスト (実務版)
- 型を確認したか (
df.dtypes)
- 欠損集計を行ったか (
df.isna().sum())
- 重複行を確認したか (
df.duplicated().sum())
- 外れ値の有無を箱ひげ図で確認したか
- カテゴリ変数の表記揺れを確認したか (
df['col'].value_counts())
- クレンジング前後で行数・列数の変化を log したか
- パイプラインを関数化したか
- テストデータへのリーク防止策を取ったか
- クレンジングの順序を文書化したか
- 公式統計との乖離をチェックしたか
このチェックリストを SSDSE-B-2026 で 1 度通せば、 ほぼすべての公的データに対して同じ手順で品質保証が行えるようになります。 大規模データでも基本は同じで、 処理対象の規模に応じてツールを置き換えるだけです。 クレンジングは「データ分析の地味だが最も時間がかかる工程」 と言われますが、 ここを丁寧にやることが分析全体の信頼性を決めます。
追加 Tips: クレンジングと文化・組織
クレンジングは技術だけの問題ではなく、 組織文化の問題でもあります。 「データはきれいで当然」 という前提で動く組織では、 クレンジングに割かれる時間が見えず、 分析の納期が常に遅延します。 逆に 「データは汚いのが普通」 という前提を共有する組織では、 クレンジングを正当な作業時間として認め、 品質改善への投資が継続されます。 SSDSE-B のような公的データは比較的きれいですが、 業務システムから取り出した生データは想像以上に汚いものです。 この事実を経営層に納得してもらうところからクレンジングの仕事は始まります。
また、 クレンジングを行うときの最重要原則は 「元データを上書きしない」 です。 元 CSV はそのまま保持し、 クレンジング済みデータは別ファイル (例: data/processed/ssdse_clean_v01.parquet) として保存し、 バージョン番号で管理します。 これを怠ると 「3 か月前の分析を再現できない」 という致命的な事故が起こります。 git LFS や DVC (Data Version Control) を導入し、 データ自体もバージョン管理する文化を作ると、 クレンジング処理の透明性と再現性が大幅に向上します。 大規模化したら必ず検討してください。
最後に、 クレンジングの結果は 「分析仮説に対する答え」 ではなく、 「分析の前提条件」 であることを忘れないでください。 クレンジングで失われた情報は永久に戻りません。 そのため、 元データのバックアップと、 クレンジング理由のドキュメント化が、 分析全体の信頼性を支える土台になります。 SSDSE-B-2026 で身につけたクレンジング感覚は、 そのまま実務の大規模データでも通用するものです。
クレンジングを学ぶ次のステップ
本ページでクレンジングの基礎・実務パターン・組織文化までを押さえました。 次に学ぶべきは 外れ値処理 (定量的な検知と除外基準)、 欠損値 (MCAR/MAR/MNAR の理論)、 標準化 (スケーリングと前処理の自動化) です。 これらを順に押さえると、 クレンジングを 「データを綺麗にする」 段階から 「分析に最適な状態に整える」 段階まで深められます。
並行して、 DataFrame・データクレンジング (概要)・欠損メカニズム・Tidy data の各用語ページを巡回すると、 「データの理想形」 と 「現実の汚いデータ」 のギャップを埋める一連のスキルが体系化できます。 とくに Tidy data の概念は、 「クレンジングのゴール状態」 を端的に定義しており、 押さえる価値があります。 SSDSE-B-2026 のような既に Tidy なデータからスタートすると、 Tidy 化の重要性が逆に分かりにくいことがあるので、 意識して理解を深めてください。
クレンジングは単発の技能ではなく、 「データを扱う限り一生使い続ける基盤スキル」 です。 統計学・機械学習・可視化のあらゆる分野は、 クレンジング済みデータの存在を前提としており、 ここが甘いと後段すべてが揺らぎます。 逆に言うと、 クレンジングを丁寧にこなせる人は、 どの分析プロジェクトでも信頼を獲得できます。 SSDSE-B-2026 という公的データで一度しっかりやり切る経験は、 その後のキャリア全体を支える資産になります。 ぜひ本ページの内容を実データで手を動かし、 自分なりのクレンジングプロトコルを 1 つ作り上げてください。 そのプロトコルが、 あなたの分析の品質保証書になります。
最後に補足として、 クレンジング処理を行う際の 「やりすぎ」 の感覚 を持つことの重要性を強調します。 外れ値を全部除き、 欠損を全部埋め、 表記揺れを完全に統一すると、 一見綺麗なデータになりますが、 そこから得られる分析結果はしばしば「過剰に滑らかな現実離れした結論」 になりがちです。 たとえば SSDSE-B-2026 で東京都の総人口(A1101)と婚姻件数(A9101)を外れ値として除外すると、 「人口と婚姻件数には強い相関がない」 (実測では両者の相関 r=0.989) という現実と矛盾する結論が出てきます。 これは外れ値の機械的除外が招く典型的な落とし穴です。 クレンジングは 「データの不要なノイズを除く」 ことが目的であり、 「データの本質を曲げる」 ことではない、 という原則を常に意識してください。 この感覚は経験でしか身につかず、 SSDSE-B-2026 のような小規模で実例の多いデータで何度も練習することが、 最速の習得経路です。
クレンジング処理を独立した工程としてだけでなく、 「分析仮説と一体で考える」 段階に達すると、 分析者として一段上のレベルになります。 「この仮説を検証するためにはどこまでのクレンジングが必要か」 「逆にどのクレンジングは仮説検証を妨げるか」 を事前に設計できるようになると、 同じデータでも引き出せる知見の質が大きく変わります。 SSDSE-B-2026 で何度も練習し、 ぜひこの段階を目指してください。 学習のロードマップとしては、 まず本ページの 「やってみよう」 ブロックを順に手を動かして実行し、 次に外れ値処理・欠損値の各ページに進むのが理想です。 そして最終的には Tidy data の概念に立ち戻り、 「自分のクレンジング処理は Tidy 化を達成しているか」 を毎回確認する習慣をつけてください。 この往復が、 データ分析者としての成長を加速させる最良の練習になり、 実務での品質保証スキルにもそのまま直結します。
📚 関連グループ教材
🏭 産業界での活用事例(6 件)
| 業界 | 用途 | データクレンジングの役割 | クレンジングを怠ると |
| EC・小売 | 需要予測・レコメンド | 商品マスタの表記ゆれ統一・顧客の重複登録の名寄せ | 会員数・販売数が水増しされ予測が歪む |
| 金融・与信 | 信用スコアリング | 収入欄の欠損(MNAR になりやすい)診断・単位統一 | 高収入層の無回答を平均補完して審査が偏る |
| 製造 | 不良予測 | センサー欠測とスパイク(誤計測)の除去・時刻同期 | 誤計測を「異常」と学習して誤報が増える |
| 医療 | 疾患スクリーニング | 「欠損 = 未検査」と「0 = 陰性」の区別、 検査単位の統一 | 未検査患者が「健康」と誤集計される |
| 広告 | CTR / CVR 予測 | ボットトラフィック・重複インプレッションの除去 | クリック率が過大評価され入札が崩れる |
| 公共政策 | 地域指標分析 | SSDSE-B-2026 のような統計の年度間定義差・記号欠損の整備 | 年度比較が単位混在で無意味になる |
⚖️ 関連手法 比較表
| 処置 | 対象の汚れ | 長所 | 短所 | 使いどころ |
| リストワイズ削除(dropna) | 欠損 | 実装が単純・人工値を作らない | MCAR 以外では偏る・サンプル減 | 欠損率が低く MCAR と診断できたとき |
| 平均・中央値補完 | 欠損 | 行数を保てる | 分散縮小・相関の歪み | 影響の小さい補助列の応急処置 |
| 多重代入(MICE / IterativeImputer) | 欠損 | MAR 下で妥当・不確実性も表現 | 実装・説明コストが高い | 主要変数の欠損が MAR のとき |
| IQR / Z-score 検出 + 目視判定 | 外れ値 | 候補を機械的に列挙できる | 削除の自動執行は危険 | 外れ値の一次スクリーニング |
| 対数変換・Yeo-Johnson | 外れ値(真の極端値) | 情報を捨てずに裾を縮める | 解釈の単位が変わる | 総人口・延べ宿泊者数など右裾の長い列 |
| winsorize(クリッピング) | 外れ値 | 統計量のブレを抑える | 閾値の恣意性 | ダッシュボード等の集計配信 |
| NFKC 正規化 + 置換マスタ | 表記ゆれ | 再適用可能・検査可能 | マスタ整備の手間 | 県名・商品名などのカテゴリ列 |
| drop_duplicates + キー検査 | 重複 | 実体 1 つ = 1 行を保証 | キー設計を誤ると誤削除 | 結合・集計の前に必ず |
💥 失敗例ケーススタディ
ケース 1: 外れ値を機械的に全削除して結論が反転
あるチームが SSDSE-B-2026 の分析で、 IQR フェンスを超えた行をすべて自動削除した。 A1101 総人口では東京都・神奈川県・大阪府など大都市 9 県が消え、 「人口と経済指標にはほとんど関係がない」という現実と矛盾する結論に。 外れ値検出はあくまで候補列挙であり、 誤入力か真の極端値かの判定を挟むべきだった。
ケース 2: 欠損を 0 で埋めて全国平均が過小に
公的統計の「-」(該当なし・秘匿)を数値 0 として読み込んだまま集計し、 全国平均が実態より大きく下振れした。 「欠損(測定なし)」と「0(本当にゼロ)」は意味が違う。 na_values=['-'] で欠損として読み込み、 欠損フラグ列で処理を追跡するルールが要る。
ケース 3: 生データを上書きして再現不能に
Jupyter 上で生 CSV に直接クレンジングを重ね、 そのまま上書き保存。 数か月後に「どの行をなぜ削除したか」を問われて再現できず、 分析全体が差し戻しになった。 生データは読み取り専用とし、 処理済みデータは data/processed/ に別名・版番号付きで保存、 処理は関数化してログを残すのが鉄則。
📝 演習問題(5 問)
問 1(基礎)
データクレンジングの「6 大工程」を順番に挙げよ。
▼ 解答
欠損値処理 → 型変換(スキーマ整合) → 重複除去 → 表記ゆれ統一(名寄せ) → 外れ値検出・処置 → 整合性の最終検査。 順序は状況で前後するが、 「診断 → 処置 → 検査」の骨格は共通。
問 2(診断)
SSDSE-B-2026 を読み込んだ直後に必ず確認すべき 3 点は? pandas のメソッド名とともに答えよ。
▼ 解答
(1) 型:df.dtypes(数値列が object になっていないか)、 (2) 欠損:df.isna().sum()、 (3) 重複:df.duplicated().sum()。 加えて df.shape で行数が想定(47 県 × 12 年 = 564 行)と一致するかを検査する。
問 3(欠損と 0 の区別)
「観光入込客数が NaN の県」を 0 で埋めてはいけない理由を説明せよ。
▼ 解答
NaN は「測定・報告がない」こと、 0 は「観光客が本当にゼロ」ことを意味し、 両者は別情報。 0 埋めすると平均・合計が実態より小さく歪む。 欠損フラグ列を残し、 メカニズム(MCAR/MAR/MNAR)に応じて削除か補完かを選ぶ。
問 4(順序依存)
「重複削除 → 欠損補完」と「欠損補完 → 重複削除」で結果が変わり得るのはなぜか?
▼ 解答
補完によって行の値が揃い、 新たに重複が生まれることがあるため。 逆に先に重複を消すと補完の統計量(平均など)が変わる。 処理順序を文書化し、 各ステップで行数・列数の変化をログに残すことで、 順序依存の事故を検知できる。
問 5(設計)
「同じデータでも用途によってクレンジングは変わる」— EDA・本番モデル学習・ダッシュボード配信の 3 用途での方針の違いを述べよ。
▼ 解答
EDA は最小限(観察を優先し早すぎる除外をしない)、 モデル学習は再現性(Pipeline 化して fit/transform を分離、 テストへのリーク防止)、 ダッシュボードは統計量の保存(中央値補完・winsorize など集計が公式統計と乖離しない処理)。 詳細は本文「実務 3 パターン」参照。
📖 関連用語辞典(10 語)
| 用語 | 1 行定義 |
| 欠損値 (Missing Value) | 記録されるべきなのに存在しない値。 NaN / None / 「-」など表現は多様。 |
| 欠損メカニズム | 欠損の発生構造。 MCAR(完全ランダム)/ MAR(観測値依存)/ MNAR(欠損値依存)。 |
| 補完 (Imputation) | 欠損を推定値で埋める処理。 平均・中央値・KNN・多重代入(MICE)など。 |
| 外れ値 (Outlier) | 分布から大きく離れた値。 誤入力と真の極端値の 2 種類がある。 |
| winsorize(クリッピング) | 上下の極端値を分位点の値で置換し、 影響を上限で抑える処理。 |
| 表記ゆれ | 同一実体の複数表記(東京/東京都/Tokyo)。 NFKC 正規化・置換マスタで統一。 |
| 名寄せ(レコードリンケージ) | キーが揃わないレコード間で同一実体を照合・統合する処理。 |
| 型変換 (Type Conversion) | 文字列 ↔ 数値 ↔ 日付 ↔ カテゴリなど、 列を正しい dtype に直す処理。 |
| スキーマ | 列名・型・単位・値域・キー制約の仕様。 クレンジングの検収基準になる。 |
| 整然データ (Tidy Data) | 1 行 = 1 観測、 1 列 = 1 変数、 1 表 = 1 観測単位。 クレンジングのゴール形。 |
📚 参考文献
- Little, R. J. A., Rubin, D. B. (2019). Statistical Analysis with Missing Data (3rd ed.). Wiley. — 欠損データ解析の標準書。
- Dasu, T., Johnson, T. (2003). Exploratory Data Mining and Data Cleaning. Wiley. — データクリーニングの体系的教科書。
- Ilyas, I. F., Chu, X. (2019). Data Cleaning. ACM Books. — 重複検出・整合性制約の計算機科学的整理。
- Wickham, H. (2014). Tidy Data. Journal of Statistical Software, 59(10). — クレンジングのゴール形(整然データ)。
- SSDSE(教育用標準データセット). 独立行政法人統計センター.
data/raw/SSDSE-B-2026.csv. — 本記事の全計算で使用。
- pandas ユーザーガイド Working with missing data: pandas.pydata.org/docs/user_guide/missing_data.html
- 『Pythonによるデータ分析入門』Wes McKinney 著、 オライリー・ジャパン. — 第 7 章「データのクリーニングと前処理」。
📕 拡張ハンドブック(実務 10 ステップ)
- スキーマ表の作成:列名・意味・単位・型・値域・キーを 1 枚に文書化(付録 A が雛形)。
- 生データの保全:元 CSV は読み取り専用にし、 処理済みは
data/processed/ に版番号付きで保存。
- 読み込み検査:encoding(SSDSE 系は cp932)・skiprows・
na_values を確認し、 行数・列数を assert。
- 欠損診断:列ごとの欠損率を集計し、 MCAR/MAR/MNAR を仮判定して削除・補完を決定。
- 型変換:object 化した数値列を
to_numeric、 日付を to_datetime、 カテゴリを category に。
- 重複検査:完全重複と主キー重複(県 × 年度)を分けて検出・解消。
- 表記ゆれ統一:
value_counts() で点検 → NFKC 正規化 → 置換マスタ適用 → ユニーク数を検査。
- 外れ値処置:IQR / Z-score で候補列挙 → 誤入力か実体かを判定 → 変換・クリッピング・保持を選択。
- 前後比較の検証:ヒストグラム・箱ひげ・散布図と主要統計量で「情報が壊れていないか」を確認。
- パイプライン化・記録:処理を関数化して unit test とログを付け、 CI で品質劣化を検知。
🍳 50 連発レシピ(データクレンジング × SSDSE-B-2026)
クレンジングの定番操作を 50 通り並べる。 すべて pandas / scikit-learn で SSDSE-B-2026 に適用できる。
read_csv(encoding='cp932', skiprows=[1]) で正しく読み込む
na_values=['-'] で記号を欠損として読む
df.shape を想定行数(564)と assert で照合
df.dtypes で object 化した数値列を洗い出す
df.isna().sum() で欠損マップを作る
df.isna().mean() で列ごとの欠損率を出す
- 欠損フラグ列(
df['x'].isna().astype(int))を追加
dropna(subset=...) でキー欠損行だけ削除
fillna(median) の中央値補完(応急処置と明記)
- 群別補完(県別・地方別の中央値で埋める)
interpolate() で年度方向の線形補間
ffill / bfill でパネルの前方・後方補完
- KNNImputer で近傍県から補完
- IterativeImputer(MICE 相当)で多変量補完
pd.to_numeric(errors='coerce') で型を数値へ
pd.to_datetime で日付文字列をパース
astype('category') でカテゴリ型に変換
- カンマ・単位付き数値文字列を正規表現で除去
- 全角数字 → 半角(NFKC 正規化)
str.strip() で前後空白を除去
str.upper() / lower() で大文字小文字統一
- 置換マスタ(辞書)で表記ゆれを正式名へ写像
- 変換後のユニーク数(47)を assert で検査
duplicated().sum() で完全重複を検出
duplicated(subset=['SSDSE-B-2026','Code']) でキー重複を検出
drop_duplicates(keep='last') で更新差分を残す
merge(validate='one_to_one') で結合の多重化を防ぐ
- 県コード(R01000 等)で他統計と名寄せ
- 編集距離・Jaro-Winkler で曖昧照合の候補を出す
- IQR × 1.5 フェンスで外れ値候補を列挙
- Z-score |z| > 3 で外れ値候補を列挙
- Isolation Forest で多変量の異常行を検出
- 外れ値候補をドメイン知識で「誤入力/実体」に仕分け
clip(lo, hi) で 1-99% winsorize
np.log10 で右裾の長い列を対数変換
- PowerTransformer(Yeo-Johnson)で歪度を縮小
- StandardScaler / RobustScaler を列特性で使い分け
- 値域検査(
assert (df['A4103'].between(0, 3)).all())
- 参照整合性検査(県コードがマスタに存在するか)
- 単位の統一(千円 ↔ 百万円)を換算列で明示
- 年度ソートの統一(
sort_values(['Code','SSDSE-B-2026']))
reset_index(drop=True) でインデックスを整える
- melt / pivot で整然データ(Tidy)形式へ変形
- 処理前後の行数・列数・統計量をログ出力
- クレンジング処理を関数化して docstring に仕様を書く
- pytest で「欠損 0・重複 0・値域内」を自動テスト
- Great Expectations で品質規則を宣言的に記述
- 処理済みデータを
data/processed/*_v01.parquet で版管理
- DVC / git で生データとコードの対応を追跡
- クレンジング判断(削除理由・閾値)を README に記録
❓ FAQ(20 問)
Q1. データクレンジングと前処理・特徴量エンジニアリングはどう違う?
クレンジングは前処理の一部で「誤り・不整合の除去」が目的。 特徴量エンジニアリングは「予測に効く情報の創出」が目的。 高齢化率 = A1303/A1101 を作るのは特徴量設計、 A1101 の型を直すのがクレンジング。
Q2. クレンジングの作業順序に正解はある?
「読み込み検査 → 欠損診断 → 型変換 → 重複除去 → 表記ゆれ統一 → 外れ値処置 → 最終検査」が標準形。 ただし補完 → 重複除去のように順序依存があるため、 順序を文書化して固定することが「正解」に相当する。
Q3. 欠損は削除と補完のどちらがよい?
欠損メカニズム次第。 MCAR で欠損率が低ければ削除で問題ないが、 MAR なら多重代入が妥当、 MNAR は補完しても偏りが残る。 「とりあえず dropna」は最も危険なデフォルト。
Q4. 平均値補完の何が問題?
分散が人工的に縮み、 他変数との相関も歪む。 補完値が大量に同じ値になるためヒストグラムにスパイクが立つ。 使うなら「応急処置」と明記し、 欠損フラグ列を残す。
Q5. 外れ値はどの基準で検出すべき?
IQR × 1.5(分布の裾に頑健)と Z-score 3σ(平均・分散ベース)が二大定番。 多変量なら Isolation Forest。 いずれも「候補の列挙」であり、 削除判断はドメイン知識で行う。
Q6. 東京都のような「正しい外れ値」はどう扱う?
削除せず、 対数変換・Yeo-Johnson・RobustScaler などで影響を吸収する。 削除すると都市・地方の構造という本質情報が消える(本文ケース 1 参照)。
Q7. 重複行はどうやって見つける?
完全重複は df.duplicated().sum()、 実務ではキー重複(県 × 年度など)を duplicated(subset=...) で見るのが本命。 結合前のキー一意性検査が事故防止の要。
Q8. 表記ゆれはどこまで自動化できる?
NFKC 正規化・大文字小文字・空白除去までは完全自動化可能。 「府中市(東京)と府中市(広島)」のような同名異実体は自動化できず、 コード(自治体コード等)での照合が必要。
Q9. SSDSE-B-2026 を読み込むときの注意点は?
encoding='cp932'、 2 行目の日本語ラベルを skiprows=[1] で飛ばす、 「-」を na_values で欠損扱いにする、 の 3 点。 読み込み後に df.shape が 564 行(47 県 × 12 年)かを確認。
Q10. クレンジング済みかどうかはどう判定する?
スキーマ表(型・単位・値域・キー制約)に対する検査がすべて通ること。 「欠損 0・重複 0・型一致・値域内・キー一意」の 5 点セットを assert やテストで自動化する。
Q11. 0 と欠損はどう区別する?
0 は「測って本当にゼロ」、 欠損は「測っていない/報告がない」。 集計への影響が全く違うため、 読み込み時に記号(-、 …、 N/A)を必ず欠損として取り込み、 fillna(0) は意味的に正しい場合のみに限定。
Q12. パネルデータ(県 × 年度)のクレンジングで特有の注意は?
年度間の定義・単位変更、 県コードの改定、 年度方向の補間(interpolate/ffill)が使えるかの確認。 SSDSE-B-2026 は 47 県 × 12 年 = 564 行なので、 各県が 12 行ずつあるかを検査する。
Q13. クレンジングでデータリークは起きる?
起きる。 全データの平均・分散で補完やスケーリングを fit してから訓練/テストに分けると、 テスト情報が漏れる。 sklearn の Pipeline で「訓練 fold 内で fit」を強制するのが対策。
Q14. どこまでやったら「やりすぎ」?
処理前後で主要な相関・分布の形が変わり、 公式統計と乖離し始めたら過剰処理のサイン。 「ノイズを除く」が目的であり「データの本質を曲げる」のは目的外(本文の可視化検証参照)。
Q15. クレンジングの工数はどのくらい見込む?
CRISP-DM の経験則ではデータ準備がプロジェクト工数の 60-80%。 見積もりに入れないと納期が必ず崩れる。
Q16. Excel でのクレンジングはあり?
小規模の目視点検には有効だが、 操作履歴が残らず再現性がない。 数百行を超えるか、 繰り返し実行があるなら pandas / OpenRefine に移行すべき。
Q17. クレンジング規則はどう管理する?
コード(関数)+ 置換マスタ + テストを git で版管理。 宣言的に書くなら Great Expectations で「期待するデータの姿」を YAML 化し、 CI で毎回検証する。
Q18. 大規模データでは何が変わる?
基本原則は同じで、 ツールが変わる。 pandas → Polars / Spark、 目視点検 → サンプリング点検 + 統計的プロファイリング(pandas-profiling 等)。 品質検査の自動化が必須になる。
Q19. クレンジングを間違えたらどう気付く?
処理前後の行数・統計量ログ、 公式統計との突合、 可視化(ヒストグラム・散布図)の 3 点。 「結果が急にきれいになった」ときほど疑う。
Q20. 学習の次の一歩は?
欠損値・外れ値・整然データの各ページを読み、 本ページのレシピ 50 連発を SSDSE-B-2026 で実際に手を動かして通すこと。
📚 参考論文(10 件)
- Rubin, D. B. (1976). Inference and missing data. Biometrika, 63(3), 581-592. — MCAR/MAR/MNAR の原典。
- Fellegi, I. P., Sunter, A. B. (1969). A theory for record linkage. JASA, 64(328), 1183-1210. — 名寄せの古典。
- Rahm, E., Do, H. H. (2000). Data cleaning: Problems and current approaches. IEEE Data Engineering Bulletin, 23(4), 3-13.
- Kim, W. et al. (2003). A taxonomy of dirty data. Data Mining and Knowledge Discovery, 7(1), 81-99.
- Wickham, H. (2014). Tidy data. Journal of Statistical Software, 59(10), 1-23.
- van Buuren, S., Groothuis-Oudshoorn, K. (2011). mice: Multivariate imputation by chained equations in R. Journal of Statistical Software, 45(3), 1-67.
- Chandola, V., Banerjee, A., Kumar, V. (2009). Anomaly detection: A survey. ACM Computing Surveys, 41(3), 1-58.
- Hellerstein, J. M. (2008). Quantitative data cleaning for large databases. UNECE report.
- Chu, X., Ilyas, I. F., Krishnan, S., Wang, J. (2016). Data cleaning: Overview and emerging challenges. SIGMOD.
- Gebru, T. et al. (2018). Datasheets for datasets. arXiv:1803.09010. — データ品質・出所のドキュメント化。
🏁 まとめ — 本ページで身についたこと
本ページを通読・実装した読者は、 以下の 15 のスキルを獲得した:
- クレンジング 6 大工程を順序立てて説明できる
- SSDSE-B-2026 を cp932 / skiprows=[1] で正しくロードできる
- 欠損率・重複行数・型整合性の 3 点診断ができる
- 5 段階の Python 実装を写経・改造できる
- MCAR / MAR / MNAR を区別して補完を選べる
- IQR と Z-score の外れ値検出を使い分けられる
- 「正しい外れ値」を削除せず変換で吸収できる
- winsorize・対数変換・RobustScaler を列特性で選べる
- 県 × 年度キーで重複・結合の検査ができる
- 表記ゆれを NFKC 正規化 + 置換マスタで統一できる
- 欠損と 0 を区別してデータを読み込める
- クレンジング前後を可視化で検証できる
- 処理を関数化し行数・統計量のログを残せる
- 生データ非破壊・版管理の運用ができる
- 用途別(EDA/モデル/ダッシュボード)に方針を変えられる
次のステップは 欠損値、 外れ値、 整然データ の各ページに進み、 個々のテクニックを深掘りすること。
📎 付録 A — SSDSE-B-2026 主要列リファレンス
| 列コード | 意味 | 単位 | 2023 年 47 県値の範囲 |
| A1101 | 総人口 | 人 | 537,000 〜 14,086,000 |
| A1102 | 日本人人口 | 人 | 532,000 〜 13,448,000 |
| A1301 | 15歳未満人口 | 人 | 65,000 〜 1,513,000 |
| A1302 | 15〜64歳人口 | 人 | 294,000 〜 9,368,000 |
| A1303 | 65歳以上人口 | 人 | 179,000 〜 3,205,000 |
| A4101 | 出生数 | 人 | 3,263 〜 86,348 |
| A4103 | 合計特殊出生率 | — | 0.99 〜 1.60 |
| A9101 | 婚姻件数 | 件 | 1,810 〜 71,774 |
| A9201 | 離婚件数 | 件 | 781 〜 20,016 |
| B4101 | 年平均気温 | ℃ | 11.0 〜 23.8 |
| B4106 | 降水日数(年間) | 日 | 72 〜 170 |
| B4109 | 降水量(年間) | mm | 830 〜 3,003 |
| E1101 | 幼稚園数 | 園 | 18 〜 959 |
| E2101 | 小学校数 | 校 | 114 〜 1,323 |
| E3101 | 中学校数 | 校 | 56 〜 800 |
| C3301 | 着工建築物数 | 件 | 2,246 〜 41,817 |
| I510120 | 一般病院数 | 施設 | 37 〜 588 |
| I5102 | 一般診療所数 | 施設 | 474 〜 14,894 |
| J2503 | 保育所等数 | か所 | 132 〜 3,611 |
| J2526 | 保育所等保育士数 | 人 | 1,451 〜 58,595 |
📎 付録 B — 47 都道府県コード一覧
| コード | 県名 | 地方 | コード | 県名 | 地方 |
| R01000 | 北海道 | 北海道 | R25000 | 滋賀県 | 近畿 |
| R02000 | 青森県 | 東北 | R26000 | 京都府 | 近畿 |
| R03000 | 岩手県 | 東北 | R27000 | 大阪府 | 近畿 |
| R04000 | 宮城県 | 東北 | R28000 | 兵庫県 | 近畿 |
| R05000 | 秋田県 | 東北 | R29000 | 奈良県 | 近畿 |
| R06000 | 山形県 | 東北 | R30000 | 和歌山県 | 近畿 |
| R07000 | 福島県 | 東北 | R31000 | 鳥取県 | 中国 |
| R08000 | 茨城県 | 関東 | R32000 | 島根県 | 中国 |
| R09000 | 栃木県 | 関東 | R33000 | 岡山県 | 中国 |
| R10000 | 群馬県 | 関東 | R34000 | 広島県 | 中国 |
| R11000 | 埼玉県 | 関東 | R35000 | 山口県 | 中国 |
| R12000 | 千葉県 | 関東 | R36000 | 徳島県 | 四国 |
| R13000 | 東京都 | 関東 | R37000 | 香川県 | 四国 |
| R14000 | 神奈川県 | 関東 | R38000 | 愛媛県 | 四国 |
| R15000 | 新潟県 | 中部 | R39000 | 高知県 | 四国 |
| R16000 | 富山県 | 中部 | R40000 | 福岡県 | 九州 |
| R17000 | 石川県 | 中部 | R41000 | 佐賀県 | 九州 |
| R18000 | 福井県 | 中部 | R42000 | 長崎県 | 九州 |
| R19000 | 山梨県 | 中部 | R43000 | 熊本県 | 九州 |
| R20000 | 長野県 | 中部 | R44000 | 大分県 | 九州 |
| R21000 | 岐阜県 | 中部 | R45000 | 宮崎県 | 九州 |
| R22000 | 静岡県 | 中部 | R46000 | 鹿児島県 | 九州 |
| R23000 | 愛知県 | 中部 | R47000 | 沖縄県 | 沖縄 |
| R24000 | 三重県 | 中部 | — | — | — |
📒 クイック・リファレンスカード(印刷推奨)
データクレンジング(詳細) — 1 分で振り返り
| 項目 | 内容 | SSDSE-B-2026 での例 |
| ① スキーマ確認 | 列名・型・単位・値域を文書化 | 付録 A の列リファレンス |
| ② 読み込み検査 | encoding / skiprows / na_values | cp932・skiprows=[1]・na_values=['-'] |
| ③ 欠損診断 | 欠損率 + MCAR/MAR/MNAR 判定 | 全列 欠損 0 を確認 |
| ④ 型変換 | object → 数値・日付・カテゴリ | to_numeric(errors='coerce') |
| ⑤ 重複検査 | 完全重複 + 主キー重複 | 県 × 年度キーで重複 0 |
| ⑥ 表記ゆれ統一 | NFKC 正規化 + 置換マスタ | 県名ユニーク数 47 を assert |
| ⑦ 外れ値処置 | 検出は機械・判定はドメイン | 東京都 (z≈+4.0) は対数変換で吸収 |
| ⑧ 前後検証 | 分布・相関の保存を可視化で確認 | ヒストグラム・箱ひげ・散布図 |
| ⑨ 記録 | 行数・統計量の変化をログ | 各 Step の print / assert |
| ⑩ 版管理 | 生データ非破壊・処理済みを別保存 | data/processed/*_v01.parquet |
🗺 概念マップ(データクレンジングの位置づけ)
データクレンジングはデータ分析プロジェクトのデータ準備段階にある「整形工程」。 以下の階層関係で位置づけられる:
🌐 データエンジニアリング
└── 🧹 データクレンジング(詳細) ← 本ページ
├── 🕳 欠損値処理 (削除 / 補完 / モデル予測補完)
├── 📏 型変換・スキーマ整合 (str ↔ int, datetime, category)
├── 🔁 重複行・キー重複の検出 (drop_duplicates / 主キー検査)
├── 🏷 表記揺れ・名寄せ (大文字小文字 / 全角半角 / 同義語マスタ)
├── 📉 外れ値・異常値の検出 (IQR / Z-score / Isolation Forest)
└── 🔍 スキーマ・整合性チェック (型・範囲・参照整合)
│
▼
✨ 特徴量エンジニアリング
│
▼
🤖 モデル学習・評価
│
▼
🚀 デプロイ・運用
📌 1 枚まとめ(持ち帰り用)
データクレンジング(詳細)を 1 枚で説明する
| 項目 | 内容 |
| 定義 | 生データに含まれる欠損・外れ値・重複・表記揺れを系統的に検出し、解析可能な状態へ整える一連の工程 |
| 6 大工程 | 欠損処理 / 型変換 / 重複削除 / 表記揺れ統合 / 外れ値検出 / スキーマ整合検査 |
| 本記事の題材 | SSDSE-B-2026 47 都道府県データ (年度パネル・欠損・型不揃いを含む) |
| 主結論 | 下流の特徴量エンジニアリング・モデル学習の前提となり、 ML プロジェクトの工数 60-80% を占める (CRISP-DM) |
| 関連用語 | 欠損値 / 外れ値 / 名寄せ / 型変換 / スキーマ / 特徴量エンジニアリング |
| 注意点 | 「とりあえず dropna」「中央値補完」は分散縮小・相関歪みを招く。 列ごとの欠損理由を診断してから処理を決定 |
🧭 用語間ナビゲーション
関連する用語ページを「学習の流れ」で並べた。 上から順に読むと理解が深まる:
- データ収集 — 上流工程・データソースの確保
- データエンジニアリング — 親カテゴリ・パイプライン全体
- データクレンジング — 概念編 (本ページは詳細編)
- データクレンジング(詳細) — このページ
- 欠損値 — 6 工程の 1 つ目
- 外れ値 — 6 工程の 5 つ目
- データバイアス — クレンジングで気付くべき歪み
- データガバナンス — 完成度を測る評価軸
- 特徴量エンジニアリング — クレンジング後の下流工程
- CRISP-DM — クレンジングを位置づける業界標準フレーム
📕 用語別ディープダイブ(データクレンジング)
クレンジング工程の標準化(CRISP-DM / TDSP)
業界標準のクレンジング工程は CRISP-DM や Microsoft TDSP で 6 段階に標準化されている:(1) 業務理解、 (2) データ理解、 (3) データ準備、 (4) モデリング、 (5) 評価、 (6) 展開。 データクレンジングは主に (3) に該当し、 全体の 60-80% の工数を占めると言われる。
クレンジング失敗のコスト
| 失敗パターン | 影響範囲 | 復旧コスト |
| 重複行を見逃す | モデル偏り・統計量過大 | 中(再学習) |
| 外れ値を残す | 線形モデルが歪む | 低(再学習で済む) |
| 型変換ミス | 計算結果が全部間違い | 高(全体やり直し) |
| 表記揺れを統合せず | 同一エンティティが別物扱い | 高(マスタ修正) |
| 欠損を中央値で埋める | 分散縮小・相関歪み | 中〜高 |
🍳 さらに 20 連発(クレンジング細分化キーワード 51〜70)
- 重複削除
- 欠損補完
- 中央値補完
- 平均値補完
- MICE
- IQR外れ値
- Z-score外れ値
- Isolation Forest
- RobustScaler
- StandardScaler
- MinMaxScaler
- PowerTransformer
- log変換
- sqrt変換
- BoxCox
- YeoJohnson
- 名寄せ
- 正規表現
- 日付パース
- 型変換
🎁 持ち帰り 10 項目
- クレンジングは分析工数の 60-80% を占め、 結果の信頼性を決める上流工程
- 順序は「診断(型・欠損・重複・表記・外れ値)→ 処置 → 検査」— いきなり処置しない
- 欠損は MCAR/MAR/MNAR を診断してから削除・補完を選ぶ
- 「欠損(測定なし)」と「0(本当にゼロ)」を混同しない
- 外れ値 = 誤りとは限らない(東京都の総人口は正しい外れ値)
- 削除は最終手段 — 対数変換・winsorize・頑健統計で「吸収」を先に検討
- 重複判定は主キー(SSDSE-B なら県 × 年度)を明示してから
- 表記ゆれは NFKC 正規化 + 置換マスタ + ユニーク数検査で再現可能に
- 生データは上書きせず、 処理済みを別ファイルで版管理
- 処理前後の行数・統計量・分布をログと可視化で必ず検証
🔗 隣接手法への橋渡し
クレンジング詳細は収集と特徴量設計の境界を埋める実装層。
型確認 → 欠損処理 → 重複削除 → 外れ値検出 → 派生変数生成 → 再検証の流れで、 各段の処理を再現可能にすることが要点。
🌳 手法選択フロー
クレンジング詳細は欠損 → 外れ値 → 文字列正規化 → 結合の順で処理する。
- 型と欠損は処理したか? Yes → 次へ。 No → データ型・尺度 と 欠損値 を先に確認
- 重複と外れ値は? Yes → 次へ。 No → 主キー(県 × 年度)の重複検査と 外れ値 の診断を先に行う
- 文字列正規化と単位統一は? Yes → 整然データ (Tidy Data) へ進む。 No → 正規表現 と 名寄せ で表記・単位を統一する
少量欠損なら平均補完、 構造欠損なら多重代入、 外れ値が誤入力なら除去、 真の極端値なら頑健統計、 と「欠損/外れ値の性質」で選ぶ。