欠損値処理#
データを収集する機器の不具合やデータ自体の性質から欠損値(missing value) が時として生じます。時系列データの場合は、csvファイルの一部が欠けているような状況です。
線形回帰モデル、決定木、ニューラルネットワークなど、多くのモデルは欠損値があるデータを直接扱えません。また、時系列モデリングにおいては、サンプリング間隔が一定であることを仮定している場合が多く、欠損値を含む時刻を単に除外する対応もできません。
したがって、データの前処理の段階で欠損値を確認し、何らかの方法で補完する必要があります。
ここでは、簡単な欠損値補完の方法を解説します。
まず、「可視化/データの準備」と同様に欠損値を含むデータを読み込みます。
import warnings
import pandas as pd
import numpy as np
fname = "../data/2020413_raw.csv"
df = pd.read_csv(fname, index_col=0, parse_dates=True, encoding="shift-jis")
pandasでは、欠損値は isnull() または isna() で確認できます。
# 欠損値がある行を表示
rows_with_missing = df[df.isnull().any(axis=1)]
print("欠損値がある行数:", len(rows_with_missing))
# 欠損値がある列を表示
cols_with_missing = df.columns[df.isnull().any()].tolist()
print("欠損値がある列:", cols_with_missing)
欠損値がある行数: 24
欠損値がある列: ['気化器温度_PV', '熱交換器出口温度(リサイクルガス)_PV']
このデータでは、"気化器温度_PV"と"熱交換器出口温度(リサイクルガス)_PV"の2つの列に欠損値があります。
実際に、生のcsvファイルを見てみると None と書かれた場所があり、これがpandasで自動的にnull と判定されて読み込まれています。
欠損値の処理方法には、「ひとつ前(または後)と同じ値で埋める」「線形補完する」「平均値で埋める」「中央値で埋める」など、いくつか方法がありますが、今回は簡単のために直前と同じ値で埋めてしまいます。
df_processed = df.fillna(method="ffill")
print("欠損値がある列:", df_processed.columns[df_processed.isnull().any()].tolist())
/tmp/ipykernel_570601/138454473.py:1: FutureWarning: DataFrame.fillna with 'method' is deprecated and will raise in a future version. Use obj.ffill() or obj.bfill() instead.
df_processed = df.fillna(method="ffill")
欠損値がある列: []
小括#
以上で、最低限のデータの読み込み+加工が終了しました。
次からはこの読み込んだ pandas.Dataframe を用いて、可視化や分析を行います。
参考文献.#
本橋智光. 前処理大全[データ分析のためのSQL/R/Python実践テクニック]