データ分析の現場において、欠損値(NaN)の扱いは避けては通れない重要な課題です。
欠損値を放置すると統計的な計算が正しく行われないだけでなく、機械学習モデルの学習時にエラーを引き起こす原因となります。
本記事では、PythonのPandasライブラリを用いて、欠損値を「平均値」で効率的に補完する実戦的なテクニックを詳しく紹介します。
Pandasにおける欠損値処理の重要性
現実世界のデータセットには、測定ミスやアンケートの無回答などにより、多くの欠損値が含まれていることが一般的です。
欠損値が含まれたまま平均や分散を計算すると、分析結果が歪んでしまうリスクがあります。
特に数値データにおいては、データの全体像を損なわないために、平均値を用いた補完が最も標準的な手法の一つとして採用されています。
Pandasでは、fillna()メソッドを活用することで、数行のコードでこの処理を完結させることが可能です。
基本的な平均値埋めの方法(fillna)
まずは、特定の列に含まれる欠損値を、その列の平均値で置き換える基本的な方法を確認しましょう。
Pandasのmean()関数を使用すると、欠損値を除外した上での平均値を簡単に算出できます。
2026年現在のPandasでは、計算効率とメモリ管理の観点から、破壊的な変更(inplace=True)を避け、新しいオブジェクトを生成して代入する手法が推奨されています。
単一の列を平均値で補完する
以下のコード例では、サンプルデータを作成し、特定の列の欠損値を平均値で埋める手順を示します。
import pandas as pd
import numpy as np
# サンプルデータの作成
df = pd.DataFrame({
'商品名': ['A', 'B', 'C', 'D', 'E'],
'価格': [100, 200, np.nan, 400, np.nan],
'在庫数': [10, 20, 30, np.nan, 50]
})
# 「価格」列の平均値を算出
price_mean = df['価格'].mean()
# fillnaを使用して欠損値を平均値で埋める
df['価格'] = df['価格'].fillna(price_mean)
print(df)
商品名 価格 在庫数
0 A 100.0 10.0
1 B 200.0 20.0
2 C 233.3 30.0
3 D 400.0 NaN
4 E 233.3 50.0
このように、欠損値(NaN)があった箇所に算出された平均値が代入されていることがわかります。
複数列をまとめて処理する
複数の数値列に対して一括で平均値補完を行いたい場合は、各列の平均値を一度に算出し、それをfillna()に渡すと効率的です。
# 数値型の列のみを対象に平均値を算出
numeric_cols = df.select_dtypes(include=[np.number]).columns
df[numeric_cols] = df[numeric_cols].fillna(df[numeric_cols].mean())
print(df)
この手法を用いれば、大規模なデータセットでも記述を簡潔に保つことができます。
条件別の平均値埋め(GroupByの活用)
実戦的なデータ分析では、全体の平均値ではなく、特定のカテゴリごとの平均値で補完したい場面が多くあります。
例えば、男女別の平均身長や、部署別の平均給与などで補完するケースです。
このような場合には、groupby()とtransform()を組み合わせる手法が非常に強力です。
# カテゴリ付きのサンプルデータ
df = pd.DataFrame({
'部署': ['営業', '営業', '技術', '技術', '技術'],
'売上': [500, np.nan, 800, 700, np.nan]
})
# 部署ごとの平均値で欠損値を埋める
df['売上'] = df['売上'].fillna(df.groupby('部署')['売上'].transform('mean'))
print(df)
このコードを実行すると、「営業」の欠損値には営業部署の平均が、「技術」の欠損値には技術部署の平均が自動的に適用されます。
データの文脈を考慮した補完を行うことで、より精度の高いデータ分析が可能になります。
平均値埋めを行う際の注意点
平均値埋めは非常に便利な手法ですが、万能ではありません。
以下の点に注意して適用を判断してください。
| 項目 | 注意すべき理由 |
|---|---|
| 外れ値の影響 | 極端に大きな値や小さな値がある場合、平均値がそれらに引っ張られてしまい、不適切な補完値になる可能性があります。 |
| データの分散の変化 | 大量の欠損値を平均値で埋めると、データのバラツキ(分散)が不自然に小さくなり、統計検定の結果に影響を与えることがあります。 |
| データリークの防止 | 機械学習の予測モデルを作成する場合、テストデータの情報を平均値計算に含めないよう、学習データのみで平均を算出する必要があります。 |
もし外れ値の影響が懸念される場合は、平均値の代わりに中央値(median)を使用することも検討してください。
Pandas 2.x/3.x時代のモダンな書き方
2026年現在のモダンなPandas環境では、Copy-on-Write設定が標準化されている場合が多くあります。
そのため、元のデータフレームを直接書き換えるのではなく、処理結果を明示的に変数へ再代入するスタイルが基本です。
また、データ型(dtype)が混在している場合にmean()を呼び出すと警告が出る可能性があるため、事前に数値列のみをフィルタリングする処理が推奨されます。
# モダンな推奨スタイル:数値列のみ抽出して処理
numeric_df = df.select_dtypes(include='number')
df[numeric_df.columns] = numeric_df.fillna(numeric_df.mean())
このように、型安全なコードを記述する習慣をつけることで、将来的なライブラリのアップデートにも強いプログラムになります。
まとめ
Pandasのfillna()を用いた平均値補完は、欠損値処理における最も基本的かつ重要なテクニックの一つです。
単純な全体平均の適用から、groupby()を用いたカテゴリ別の補完まで、状況に応じて使い分けることが重要です。
一方で、外れ値の影響やデータリークのリスクを常に意識することも忘れてはいけません。
本記事で紹介したテクニックを活用し、クリーンで精度の高いデータセットを作成してください。
より高度な補完が必要な場合は、多変量補完(IterativeImputer)などの手法も検討してみると良いでしょう。
