pandasを使用したデータセット内の数値型欠損値の補完方法
この記事では、pandasライブラリを使用して信用データセット内の欠損値を補完する方法について説明します。以下の手順に従って進めます。
- データの読み込み(CSVファイルまたはExcelファイル)
- データの基本情報の確認
- 欠損値の確認
- 最頻値や中央値を使用して欠損値を補完
- すべての列に対してループ処理で欠損値を補完
1. データの読み込み
CSVファイルやExcelファイルからデータを読み込むには、次のコードを使用します。
import pandas as pd
# CSVファイルの読み込み
df_csv = pd.read_csv('data.csv')
# Excelファイルの読み込み
df_excel = pd.read_excel('data.xlsx')
2. データの基本情報の確認
次のようにデータフレームの情報を確認できます。
# 各列のデータタイプ、非欠損値数、メモリ使用量を表示
print(df_csv.info())
# 行数と列数を表示
print(df_csv.shape)
# 列名の一覧を取得
print(df_csv.columns)
# 数値型の統計情報を取得
print(df_csv.describe())
# 各列のデータタイプを確認
print(df_csv.dtypes)
3. 欠損値の確認
各列における欠損値の合計を以下のように確認できます。
missing_values = df_csv.isna().sum()
print(missing_values)
例えば、次のような結果が得られることがあります。
Id 0
Home Ownership 0
Annual Income 1557
Years in current job 371
Tax Liens 0
Number of Open Accounts 0
Years of Credit History 0
Maximum Open Credit 0
Number of Credit Problems 0
Months since last delinquent 4081
Bankruptcies 14
Purpose 0
Term 0
Current Loan Amount 0
Current Credit Balance 0
Monthly Debt 0
Credit Score 1557
Credit Default 0
dtype: int64
4. 最頻値や中央値を使用して欠損値を補完
以下は、数値型の列に対して最頻値や中央値を使って欠損値を補完する例です。
for column in df_csv.columns:
if pd.api.types.is_numeric_dtype(df_csv[column]):
if df_csv[column].isna().any():
most_frequent = df_csv[column].mode()[0] if not df_csv[column].mode().empty else None
median_value = df_csv[column].median()
if most_frequent is not None:
df_csv[column].fillna(most_frequent, inplace=True)
else:
df_csv[column].fillna(median_value, inplace=True)
# 補完後の欠損値確認
print(df_csv.isna().sum())
補完後、次のような結果が得られる場合があります。
Id 0
Home Ownership 0
Annual Income 0
Years in current job 371
Tax Liens 0
Number of Open Accounts 0
Years of Credit History 0
Maximum Open Credit 0
Number of Credit Problems 0
Months since last delinquent 0
Bankruptcies 0
Purpose 0
Term 0
Current Loan Amount 0
Current Credit Balance 0
Monthly Debt 0
Credit Score 0
Credit Default 0
Years in current job (numeric) 0
dtype: int64
5. 特定の列に対する処理
「Years in current job」のようなオブジェクト型の列については、データを数値化してから最頻値や中央値を使用して補完することも可能です。
print(df_csv["Years in current job"].dtype) # dtype: object