データ分析の実務において、欠損値(NaN)の取り扱いは解析の精度を左右する極めて重要な工程です。
2026年現在、AIによる自動データクレンジング技術が進化していますが、依然としてPandasを用いた手動での微調整はデータサイエンティストにとって必須のスキルと言えます。
データセットから欠損値を単純に削除するのではなく、文脈に応じて適切に穴埋めを行うことで、情報の損失を最小限に抑えることが可能です。
本記事では、Pandasで頻用される「fillna」と、より高度な推論が可能な「interpolate」の使い分けについて、具体的な実装例を交えて解説します。
Pandasにおける欠損値処理の重要性
データ収集の過程では、センサーの故障や入力漏れ、通信エラーなどにより、どうしても欠損値が発生してしまいます。
これらの欠損値を放置すると、統計量の計算が歪んだり、機械学習アルゴリズムがエラーを起こしたりする原因となります。
特に時系列データや連続的な変化を伴うデータでは、欠損値の前後関係を考慮した補間が不可欠です。
Pandasには欠損値を扱うための強力なメソッドが備わっており、それらを正しく使い分けることでデータ品質を劇的に向上させることができます。
まずは、最も基本的な手法であるfillnaメソッドから見ていきましょう。
基本の「fillna」メソッドによる穴埋め
fillnaは、欠損値を指定した固定値や統計値、あるいは直前の値で埋めるためのメソッドです。
非常にシンプルで使い勝手が良いため、データの性質が不連続である場合や、特定のルールで埋めたい場合に適しています。
特定の値や統計値での補完
最も単純な方法は、欠損値を0や「Unknown」といった固定値で埋める方法です。
また、列の平均値(mean)や中央値(median)を使用して、全体の傾向を維持したまま補完することも一般的です。
import pandas as pd
import numpy as np
# サンプルデータの作成
df = pd.DataFrame({
'A': [1, 2, np.nan, 4, 5],
'B': [np.nan, 2, 3, np.nan, 5]
})
# 平均値で補完する
df_filled = df.fillna(df.mean())
print(df_filled)
A B
0 1.0 3.333333
1 2.0 2.000000
2 3.0 3.000000
3 4.0 3.333333
4 5.0 5.000000
このように、列ごとの統計値を採用することで、データ全体の分布への影響を抑えることができます。
前後の値を利用する手法(ffillとbfill)
fillnaには、メソッド引数としてffill(前の値で埋める)やbfill(後の値で埋める)を指定する機能があります。
これは、直近のデータが継続していると仮定できるカテゴリカルデータや、周期性のないデータにおいて非常に有効です。
2026年現在のPandas最新仕様では、method引数よりも直接「ffill()」「bfill()」メソッドを呼び出すことが推奨されています。
# 直前の値で埋める
df_ffilled = df.ffill()
print(df_ffilled)
A B
0 1.0 NaN
1 2.0 2.0
2 2.0 3.0
3 4.0 3.0
4 5.0 5.0
インデックスの0行目がNaNの場合、ffillでは埋めるべき「前の値」がないため、NaNのまま残る点に注意が必要です。
高度な補間を実現する「interpolate」メソッド
fillnaが単純な置き換えを行うのに対し、interpolateは既知のデータから欠損値を推定(補間)するためのメソッドです。
特に、気温の変化や株価の推移など、連続的に変化する数値データにおいてその真価を発揮します。
線形補間(Linear Interpolation)の仕組み
デフォルトの設定である「linear」は、欠損値の前後にある2点を直線で結び、その間の値を算出します。
等間隔に並んだデータにおいて、最も標準的かつ計算負荷の低い手法です。
# 線形補間を適用
s = pd.Series([1, np.nan, np.nan, 4])
s_interpolated = s.interpolate()
print(s_interpolated)
0 1.0
1 2.0
2 3.0
3 4.0
dtype: float64
1と4の間にある2つの欠損値が、等間隔の「2.0」と「3.0」で埋められていることがわかります。
時系列データに特化した時間補間
データが日付や時間のインデックスを持っている場合、method='time'を指定することで時間の経過に応じた補間が可能になります。
例えば、1月1日と1月10日のデータがあり、その間のデータが欠損している場合、日付の距離に基づいて値を算出します。
不規則な間隔でサンプリングされた時系列データでは、単純な線形補間よりも正確な結果が得られます。
# 時系列データの作成
time_index = pd.to_datetime(['2026-01-01', '2026-01-02', '2026-01-05'])
df_time = pd.DataFrame({'value': [10, np.nan, 50]}, index=time_index)
# 時間軸に基づいた補間
df_time_interp = df_time.interpolate(method='time')
print(df_time_interp)
value
2026-01-01 10.0
2026-01-02 20.0
2026-01-05 50.0
1月2日の値が、5日までの経過日数に応じて適切に計算されていることが確認できます。
非線形な関係を捉える多項式・スプライン補完
現実のデータは必ずしも直線的に変化するわけではありません。
加速度的に変化するデータや、曲線を描くデータに対しては、method='polynomial'(多項式)やmethod='spline'(スプライン)が有効です。
これらを使用するには、order引数で次数を指定する必要があります。
# 2次曲線的なデータの補間
df_poly = pd.Series([1, np.nan, 9, 16])
df_poly_interp = df_poly.interpolate(method='polynomial', order=2)
print(df_poly_interp)
ただし、次数を高くしすぎると過学習のような状態になり、不自然な値が生成されるリスクがあるため注意してください。
fillnaとinterpolateの使い分けの基準
どちらのメソッドを使用すべきか迷った際は、以下の基準で判断することをおすすめします。
| 特徴 | fillna | interpolate |
|---|---|---|
| 主な用途 | 定数、統計値、前後参照による補完 | 数学的推論に基づく値の推定 |
| 適したデータ | カテゴリカルデータ、不連続な数値 | 時系列データ、物理的な観測値 |
| メリット | 処理が高速で理解しやすい | データの滑らかさを維持できる |
| デメリット | 変化が急激になる可能性がある | 計算コストが高く、過補間のリスクがある |
基本的には、「データが連続しているか」を第一の判断基準にすると良いでしょう。
アンケートの結果やID、ステータスコードのようなデータにはfillnaが適しています。
一方で、センサーログや経済指標などの流れがあるデータにはinterpolateが最適です。
実務で役立つ欠損値補間のベストプラクティス
補間処理を行う際には、単にメソッドを適用するだけでなく、いくつかのテクニックを組み合わせることが重要です。
1. 連続する欠損値への制限(limit引数)
あまりにも長い期間データが欠損している場合、補間によって生成された値は信頼性が低くなります。
limit引数を使用することで、連続して補完する個数を制限し、信頼できない推論を防ぐことができます。
# 最大2つまでしか補間しない
df.interpolate(limit=2)
大規模なデータ欠損を隠蔽してしまうと、後の分析で誤った結論を導く恐れがあります。
2. 補完方向の制御(limit_direction)
デフォルトでは「forward(前方)」に補間されますが、limit_direction='both'を指定することで、データが存在する全方向に補間を広げることができます。
これにより、データの端にある欠損値も柔軟に処理することが可能になります。
3. 補間後の可視化
補間を行った後は、必ず散布図や折れ線グラフで結果を確認するようにしましょう。
数値だけを見ていると気づかないような、不自然なスパイクや不連続点を発見することができます。
2026年のデータ分析環境では、MatplotlibやSeabornを用いた簡易的な視覚チェックをパイプラインに組み込むことが推奨されています。
まとめ
Pandasにおける欠損値補間は、単なる穴埋め作業ではなく、データに込められた意味を復元するプロセスです。
「fillna」は確実なルールに基づいた補完に適しており、「interpolate」はデータの連続性を重視した高度な推論に適しています。
データの性質を見極め、適切なアルゴリズムを選択することで、分析の信頼性は飛躍的に高まります。
まずはシンプルな線形補間から試し、必要に応じて時間軸や非線形モデルへとステップアップしていきましょう。
本記事が、皆様のデータクレンジング作業をよりスマートにする一助となれば幸いです。
