論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
データクレンジング(詳細)
Data Cleansing (Detail)
データ前処理

🔖 キーワード索引(拡張版)

このページに登場する主要キーワード。 クリックで該当セクションへ。

💡 30 秒結論 📍 文脈 🎨 直感 📐 定義・数式 🔬 数式を言葉で読み解く 🧮 実値で計算してみる 🐍 Python ⚠️ 落とし穴 🌐 関連手法・派生 🔗 関連用語 📚 関連グループ教材・レシピ・FAQ 🗺 概念マップ 🔗 隣接手法への橋渡し 🌳 手法選択フロー

💡 30秒で分かる結論

🍰 まずはやさしく

データの汚れを落とす掃除のような作業です。

正しく分析するために使います。

スマホの連絡先の重複を消すようなことです。

データの直し方を順番に学びます。

データクレンジング(詳細)とは、 生データに含まれる欠損値・外れ値・重複・表記ゆれ・型不整合を系統的に検出し、 解析可能な状態へ整える一連の工程(欠損値処理/外れ値処理/重複除去/表記ゆれ統一/型変換/名寄せ)。

📍 文脈ボックス — あなたが今見ているもの

🍰 まずはやさしく

データ分析の準備をするためのページです。

正しい結果を出すために必ず行います。

部活の出席簿を整理する感覚に似ています。

このページで学べる3つの方法を紹介します。

あなたは データクレンジング(詳細)(Data Cleansing (Detail)) の用語ページを読んでいる。 これは「データ前処理」カテゴリに属し、 データ収集の直後・分析やモデル構築の直前に必ず通る中核工程である。 本ページは 3 つの読み方を提供する:

  1. 15 分で全体像:このすぐ下の「30 秒結論」→「直感で掴む」→「実値計算」 3 セクションだけを通読すれば十分。
  2. 60 分で実装まで:「Python 実装」セクションを写経し、 SSDSE-B-2026 で手元で再現する。
  3. 半日で実務応用:後半の「クレンジング・レシピ集」「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 とも)。 本ページは データクレンジング(概要) の詳細編である。

🎯 いつ・どこで使うか

📋 前提条件・適用範囲

クレンジングを設計するときは、 次の前提を先に確認してください:

📐 数式または定義

クレンジングの各工程は、 次の 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) 以来の名寄せ理論の中心である。

📜 歴史・系譜(データクレンジング)

出来事データクレンジングとの関係
1969Fellegi & Sunter: レコードリンケージ理論名寄せを確率モデルとして定式化した古典
1970Codd: リレーショナルモデル主キー・参照整合性などスキーマ検査の基礎
1976Rubin: 欠損メカニズム(MCAR/MAR/MNAR)「削除か補完か」を選ぶ理論的根拠
1977Tukey: 探索的データ解析(EDA)・箱ひげ図IQR × 1.5 フェンスによる外れ値検出の起源
1987Little & Rubin: Statistical Analysis with Missing Data欠損データ解析の標準教科書
2000Rahm & Do: データクリーニングの分類論文単一ソース/複数ソース × スキーマ/インスタンスの汚れ分類
2003Dasu & Johnson: Exploratory Data Mining and Data Cleaning「分析時間の大半はクレンジング」を体系化
2010Google Refine(現 OpenRefine)公開GUI ベースの表記ゆれ統一・クラスタリング照合の定番ツール
2011van Buuren: mice(R の多重代入パッケージ)MAR 下の実用的補完が誰でも使える形に
2014Wickham: 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: 基本統計

意味minmedianmaxstd
A1101総人口537,000 (鳥取)1,549,00014,086,000 (東京)2.80e6
A4103合計特殊出生率0.99 (東京)1.301.60 (沖縄)0.13
A130365歳以上人口179,000 (鳥取)524,0003,205,000 (東京)6.94e5
B4101年平均気温11.0 (北海道)17.423.8 (沖縄)2.05
A9101婚姻件数1,810 (鳥取)5,59971,774 (東京)1.31e4

STEP 3: 主要指標間の相関(クレンジング前の整合性チェック)

ペアPearson r解釈
A1101 vs A91010.989総人口と婚姻件数はほぼ完全相関 → 多重共線性に注意
A1101 vs A4103-0.564人口と出生率は中程度の負相関(大都市ほど出生率低い)
B4101 vs A4103+0.502気温と出生率は中等度の正相関(南日本ほど高い)
A1303/A1101 vs A4103+0.201高齢化率と出生率は弱い正相関(ほぼ無相関)

STEP 4: クレンジング設計で決めるべき 5 項目(チェックリスト)

  1. ✅ 対象列 = A1101 総人口, A4103 合計特殊出生率, B4101 年平均気温 など(付録 A の列リファレンスで単位・値域を確認)
  2. ✅ 主キー = 県 × 年度(重複判定の基準)
  3. ✅ 欠損の処置 = 欠損率と MCAR/MAR/MNAR の診断結果で削除/補完を選択
  4. ✅ 外れ値の処置 = 東京都など「正しい外れ値」は削除せず対数変換・クリッピングで吸収
  5. ✅ 検収指標 = 欠損率, 重複行数, 型整合性, 値域(スキーマ検査)

🧮 数式に値を入れて手で計算する: 重複除去後の件数

例題として 10,000 件の会員名簿を想定し、 完全重複・部分重複の除去後の有効件数を手計算する(SSDSE-B-2026 は重複ゼロなので、 ここだけ架空の件数を使った練習問題である)。

Step 1: クリーニング工程別残存件数

工程除外件数残存
元データ10,000
完全重複削除5009,500
キー欠損除外2009,300
外れ値除外3009,000
名寄せ統合10008,000

Step 2: クレンジング率

除外合計 = 500+200+300+1000 = 2,000 クレンジング率 = 2000/10000 = 0.20 (20%) 最終有効率 = 8000/10000 = 0.80

🐍 Python で再現

1
2
3
4
5
6
7
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())

# 「クレンジング処理」の文脈で扱う場合の例:
# 分野: データ前処理
# 関連手法は同カテゴリの他用語を参照してください。

具体的なコードは データエンジニアリング を参照してください。

📝 レポートでの報告

分析結果を報告するときに含めるべき情報:

✅ チェックリスト

🔗 同カテゴリの他用語

外れ値欠損値標準化名寄せ型変換フィルタリング処理正規表現対数変換

🐍 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 正規化・置換マスタで統一
平均・相関が処理後に激変過剰な外れ値除去処理前後のヒストグラム・散布図を比較し、 削除ではなく変換で吸収
年度を跨ぐと値の桁が違う単位変更・定義変更スキーマ表(列名・単位・値域)を年度ごとに確認し、 単位換算を明示

🚀 次に学ぶべき関連用語

本ページを読み終えたら、 以下の関連用語ページに進んでさらに理解を深めよう:

▶ 欠損値 ▶ 外れ値 ▶ 標準化 ▶ 型変換 ▶ 名寄せ ▶ 正規表現 ▶ 整然データ (Tidy Data) ▶ 特徴量エンジニアリング

前半 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 列は住宅・家計・教育・医療など)
1
2
3
4
5
6
7
8
9
# 必要なパッケージをインストール
# 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)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
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: 相関ヒートマップ

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
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 通り挙げよ。

▼ 解答と解説

解答

  1. 変換で吸収:対数変換・Yeo-Johnson 変換で裾を縮める(東京都の総人口はこれが第一候補)。
  2. クリッピング(winsorize):上下 1% を分位点の値で置換し、 極端値の影響を上限で抑える。
  3. 頑健手法で受け流す:中央値・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σ は候補の検出器であって、 削除の自動執行装置ではない。

🗺 概念マップ(データクレンジングの位置づけ)

データクレンジングはデータ分析プロジェクトのデータ準備段階にある「整形工程」。 以下の階層関係で位置づけられる:

🌐 データエンジニアリング
  └── 🧹 データクレンジング(詳細)  ← 本ページ
        ├── 🕳 欠損値処理 (削除 / 補完 / モデル予測補完)
        ├── 📏 型変換・スキーマ整合 (str ↔ int, datetime, category)
        ├── 🔁 重複行・キー重複の検出 (drop_duplicates / 主キー検査)
        ├── 🏷 表記揺れ・名寄せ (大文字小文字 / 全角半角 / 同義語マスタ)
        ├── 📉 外れ値・異常値の検出 (IQR / Z-score / Isolation Forest)
        └── 🔍 スキーマ・整合性チェック (型・範囲・参照整合)
                │
                ▼
        ✨ 特徴量エンジニアリング
                │
                ▼
        🤖 モデル学習・評価
                │
                ▼
        🚀 デプロイ・運用

📌 1 枚まとめ(持ち帰り用)

データクレンジング(詳細)を 1 枚で説明する

項目内容
定義生データに含まれる欠損・外れ値・重複・表記揺れを系統的に検出し、解析可能な状態へ整える一連の工程
6 大工程欠損処理 / 型変換 / 重複削除 / 表記揺れ統合 / 外れ値検出 / スキーマ整合検査
本記事の題材SSDSE-B-2026 47 都道府県データ (年度パネル・欠損・型不揃いを含む)
主結論下流の特徴量エンジニアリング・モデル学習の前提となり、 ML プロジェクトの工数 60-80% を占める (CRISP-DM)
関連用語欠損値 / 外れ値 / 名寄せ / 型変換 / スキーマ / 特徴量エンジニアリング
注意点「とりあえず dropna」「中央値補完」は分散縮小・相関歪みを招く。 列ごとの欠損理由を診断してから処理を決定

🧭 用語間ナビゲーション

関連する用語ページを「学習の流れ」で並べた。 上から順に読むと理解が深まる:

  1. データ収集 — 上流工程・データソースの確保
  2. データエンジニアリング — 親カテゴリ・パイプライン全体
  3. データクレンジング — 概念編 (本ページは詳細編)
  4. データクレンジング(詳細) — このページ
  5. 欠損値 — 6 工程の 1 つ目
  6. 外れ値 — 6 工程の 5 つ目
  7. データバイアス — クレンジングで気付くべき歪み
  8. データガバナンス — 完成度を測る評価軸
  9. 特徴量エンジニアリング — クレンジング後の下流工程
  10. CRISP-DM — クレンジングを位置づける業界標準フレーム

📕 用語別ディープダイブ(データクレンジング)

クレンジング工程の標準化(CRISP-DM / TDSP)

業界標準のクレンジング工程は CRISP-DM や Microsoft TDSP で 6 段階に標準化されている:(1) 業務理解、 (2) データ理解、 (3) データ準備、 (4) モデリング、 (5) 評価、 (6) 展開。 データクレンジングは主に (3) に該当し、 全体の 60-80% の工数を占めると言われる。

クレンジング失敗のコスト

失敗パターン影響範囲復旧コスト
重複行を見逃すモデル偏り・統計量過大中(再学習)
外れ値を残す線形モデルが歪む低(再学習で済む)
型変換ミス計算結果が全部間違い高(全体やり直し)
表記揺れを統合せず同一エンティティが別物扱い高(マスタ修正)
欠損を中央値で埋める分散縮小・相関歪み中〜高

🍳 さらに 20 連発(クレンジング細分化キーワード 51〜70)

  1. 重複削除
  2. 欠損補完
  3. 中央値補完
  4. 平均値補完
  5. MICE
  6. IQR外れ値
  7. Z-score外れ値
  8. Isolation Forest
  9. RobustScaler
  10. StandardScaler
  11. MinMaxScaler
  12. PowerTransformer
  13. log変換
  14. sqrt変換
  15. BoxCox
  16. YeoJohnson
  17. 名寄せ
  18. 正規表現
  19. 日付パース
  20. 型変換

🎁 持ち帰り 10 項目

  1. クレンジングは分析工数の 60-80% を占め、 結果の信頼性を決める上流工程
  2. 順序は「診断(型・欠損・重複・表記・外れ値)→ 処置 → 検査」— いきなり処置しない
  3. 欠損は MCAR/MAR/MNAR を診断してから削除・補完を選ぶ
  4. 「欠損(測定なし)」と「0(本当にゼロ)」を混同しない
  5. 外れ値 = 誤りとは限らない(東京都の総人口は正しい外れ値)
  6. 削除は最終手段 — 対数変換・winsorize・頑健統計で「吸収」を先に検討
  7. 重複判定は主キー(SSDSE-B なら県 × 年度)を明示してから
  8. 表記ゆれは NFKC 正規化 + 置換マスタ + ユニーク数検査で再現可能に
  9. 生データは上書きせず、 処理済みを別ファイルで版管理
  10. 処理前後の行数・統計量・分布をログと可視化で必ず検証
データクレンジング 欠損値処理 型変換・スキーマ整合 重複除去 表記ゆれ統一・名寄せ 外れ値検出・処置 整合性の最終検査

🔗 隣接手法への橋渡し

クレンジング詳細は収集と特徴量設計の境界を埋める実装層。

型確認 → 欠損処理 → 重複削除 → 外れ値検出 → 派生変数生成 → 再検証の流れで、 各段の処理を再現可能にすることが要点。

🌳 手法選択フロー

クレンジング詳細は欠損 → 外れ値 → 文字列正規化 → 結合の順で処理する。

  1. 型と欠損は処理したか? Yes → 次へ。 No → データ型・尺度欠損値 を先に確認
  2. 重複と外れ値は? Yes → 次へ。 No → 主キー(県 × 年度)の重複検査と 外れ値 の診断を先に行う
  3. 文字列正規化と単位統一は? Yes → 整然データ (Tidy Data) へ進む。 No → 正規表現名寄せ で表記・単位を統一する

少量欠損なら平均補完、 構造欠損なら多重代入、 外れ値が誤入力なら除去、 真の極端値なら頑健統計、 と「欠損/外れ値の性質」で選ぶ。