「Pandasを使用した7つのデータ品質チェックの必須事項」
「Pandasを使って行うデータ品質チェックの必須7項目」
データプロフェッショナルであれば、データ品質の費用についてはおそらくよく知っているでしょう。すべてのデータプロジェクト、大きなものでも小さなものでも、重要なデータ品質チェックを実施する必要があります。
データ品質評価のためには専用のライブラリやフレームワークがあります。しかし、初心者の場合は、pandasを使用して簡単で重要なデータ品質チェックを実行することができます。このチュートリアルでその方法を学びましょう。
このチュートリアルでは、scikit-learnからCalifornia Housing Datasetを使用します。
California Housing Datasetの概要
このチュートリアルでは、Scikit-learnのdatasetsモジュールからCalifornia Housing Datasetを使用します。このデータセットには、8つの数値特徴量とターゲットの中央家の価値を示す20,000以上のレコードが含まれています。
以下のコードでデータセットをpandasのデータフレームdf
に読み込みましょう:
from sklearn.datasets import fetch_california_housingimport pandas as pd# California Housing Datasetを取得するdata = fetch_california_housing()# データセットをPandasのデータフレームに変換するdf = pd.DataFrame(data.data, columns=data.feature_names)# ターゲットの列を追加するdf['MedHouseVal'] = data.target
データセットの詳細な説明は、次のようにdata.DESCR
を実行して表示できます:
print(data.DESCR)
データセットの基本情報を取得しましょう:
df.info()
以下は出力結果です:
出力結果 >>>RangeIndex: 20640 entries, 0 to 20639Data columns (total 9 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 MedInc 20640 non-null float64 1 HouseAge 20640 non-null float64 2 AveRooms 20640 non-null float64 3 AveBedrms 20640 non-null float64 4 Population 20640 non-null float64 5 AveOccup 20640 non-null float64 6 Latitude 20640 non-null float64 7 Longitude 20640 non-null float64 8 MedHouseVal 20640 non-null float64dtypes: float64(9)memory usage: 1.4 MB
数値特徴量があるため、describe()
メソッドを使用して要約統計量を取得しましょう:
df.describe()
1. 欠損値のチェック
実世界のデータセットには、欠損値がよくあります。データを分析しモデルを構築するためには、これらの欠損値を処理する必要があります。
データ品質を確保するために、欠損値の割合が特定の許容範囲内にあるかどうかをチェックする必要があります。適切な補完戦略を使用して欠損値を補完することができます。
したがって、最初のステップは、データセットのすべての特徴量に含まれる欠損値をチェックすることです。
次のコードは、データフレームdf
の各列に欠損値があるかどうかをチェックします:
# データフレームdf内の欠損値をチェックするmissing_values = df.isnull().sum()print("欠損値:")print(missing_values)
結果は、各列の欠損値の数を示すpandasのシリーズです:
出力 >>> 欠損値: MedInc 0 HouseAge 0 AveRooms 0 AveBedrms 0 Population 0 AveOccup 0 Latitude 0 Longitude 0 MedHouseVal 0 dtype: int64
上記の通り、このデータセットには欠損値はありません。
2. 重複レコードの特定
データセット内の重複レコードは分析結果に影響を与えることがあります。したがって、必要に応じて重複レコードを確認して削除する必要があります。
以下は、df
内の重複行を特定して返すコードです。重複行がある場合、結果に含まれます:
# データフレーム内の重複行を確認するduplicate_rows = df[df.duplicated()]print("重複行:")print(duplicate_rows)
結果は空のデータフレームです。つまり、データセットには重複したレコードはありません:
出力 >>>重複行:Empty DataFrameColumns: [MedInc, HouseAge, AveRooms, AveBedrms, Population, AveOccup, Latitude, Longitude, MedHouseVal]Index: []
3. データ型の確認
データセットを分析する際には、1つ以上の特徴を変換またはスケーリングする必要がある場合があります。そのような操作を行う際に予期しないエラーを回避するために、列が予想されるデータ型であるかどうかを確認することが重要です。
以下のコードは、データフレーム df
の各列のデータ型を確認します:
# データフレーム内の各列のデータ型を確認するdata_types = df.dtypesprint("データ型:")print(data_types)
ここでは、すべての数値特徴は予想どおりの float
データ型です:
出力 >>>データ型:MedInc float64HouseAge float64AveRooms float64AveBedrms float64Population float64AveOccup float64Latitude float64Longitude float64MedHouseVal float64dtype: object
4. 外れ値の確認
外れ値は、データセット内の他の点と大きく異なるデータポイントです。前述のように、データフレームに describe()
メソッドを実行しました。
四分位値と最大値に基づいて、一部の特徴が外れ値を含んでいることがわかりました。具体的には、次の特徴です:
- MedInc
- AveRooms
- AveBedrms
- Population
外れ値を処理するアプローチの1つは、四分位範囲を使用することです。四分位数75パーセンタイルと25パーセンタイルの差を四分位範囲とします。Q1を25パーセンタイル、Q3を75パーセンタイルとすると、四分位範囲は Q3 – Q1 で求められます。
次に、四分位数とIQRを使用して区間 [Q1 - 1.5 * IQR, Q3 + 1.5 * IQR]
を定義します。この範囲外のすべてのデータポイントは外れ値です。
columns_to_check = ['MedInc', 'AveRooms', 'AveBedrms', 'Population']# 外れ値を見つけるための関数def find_outliers_pandas(data, column): Q1 = data[column].quantile(0.25) Q3 = data[column].quantile(0.75) IQR = Q3 - Q1 lower_bound = Q1 - 1.5 * IQR upper_bound = Q3 + 1.5 * IQR outliers = data[(data[column] < lower_bound) | (data[column] > upper_bound)] return outliers# 各指定された列における外れ値のレコードを見つけるoutliers_dict = {}for column in columns_to-check: outliers_dict[column] = find_outliers_pandas(df, column)# 各列の外れ値のレコードを表示するfor column, outliers in outliers_dict.items(): print(f"'{column}' における外れ値:") print(outliers) print("\n")
5. 数値範囲の検証
数値の特徴量に対する重要なチェックは、範囲の検証です。これにより、特徴量のすべての観測値が予想される範囲内の値を取ることが保証されます。
次のコードは、’MedInc’の値が予想される範囲内にあるかどうかを検証し、この基準を満たさないデータポイントを特定します:
# 'MedInc'列の数値範囲をチェックvalid_range = (0, 16) value_range_check = df[~df['MedInc'].between(*valid_range)]print("数値範囲のチェック(MedInc):")print(value_range_check)
他の数値の特徴量に対しても試すことができます。しかし、’MedInc’列のすべての値が予想される範囲内にあることがわかります:
出力 >>>数値範囲のチェック(MedInc):Empty DataFrameColumns: [MedInc, HouseAge, AveRooms, AveBedrms, Population, AveOccup, Latitude, Longitude, MedHouseVal]Index: []
6. 列間の依存関係をチェック
ほとんどのデータセットには関連する特徴量が含まれているため、列(または特徴量)間の論理的に関連する関係に基づいたチェックを含めることが重要です。
個々の特徴量は予想される範囲の値を取る場合でも、それらの間の関係は一貫していない場合があります。
このデータセットの例を示します。有効なレコードでは、’AveRooms’は通常、’AveBedRms’以上であるべきです。
# AveRoomsはAveBedroomsよりも小さくないはずの無効なデータinvalid_data = df[df['AveRooms'] < df['AveBedrms']]print("無効なレコード(AveRooms < AveBedrms):")print(invalid_data)
Californiaの住宅データセットでは、そのような無効なレコードはありません:
出力 >>>無効なレコード(AveRooms < AveBedrms):Empty DataFrameColumns: [MedInc, HouseAge, AveRooms, AveBedrms, Population, AveOccup, Latitude, Longitude, MedHouseVal]Index: []
7. 不一致なデータの入力をチェック
不一致なデータの入力は、ほとんどのデータセットにおける一般的なデータ品質の問題です。例えば:
- 日時列の一貫性のない書式設定
- カテゴリ変数値の記録の不一致
- 異なる単位での読み込みの記録
データセットでは、列のデータ型を確認し、外れ値を特定しました。しかし、不一致なデータの入力もチェックすることができます。
日付のエントリが一貫した書式であるかどうかをチェックするために、単純な例を使用します。
ここでは、正規表現をpandasのapply()
関数と組み合わせて、すべての日付エントリがYYYY-MM-DD
の書式になっているかをチェックします:
import pandas as pdimport redata = {'Date': ['2023-10-29', '2023-11-15', '23-10-2023', '2023/10/29', '2023-10-30']}df = pd.DataFrame(data)# 予想される日付の書式を定義date_format_pattern = r'^\d{4}-\d{2}-\d{2}$' # YYYY-MM-DD format# 日付値が予想される書式に一致するかをチェックする関数def check_date_format(date_str, date_format_pattern): return re.match(date_format_pattern, date_str) is not None# 'Date'列に書式チェックを適用するdate_format_check = df['Date'].apply(lambda x: check_date_format(x, date_format_pattern))# 予想される書式に従わないエントリを特定して取得するnon_adherent_dates = df[~date_format_check]if not non_adherent_dates.empty: print("予想される書式に従わないエントリ:") print(non_adherent_dates)else: print("すべての日付は予想される書式である。")
これにより、予想される書式に従わないエントリが返されます:
Output >>>予想された形式に従わないエントリ: Date2 23-10-20233 2023/10/29
まとめ
このチュートリアルでは、pandasを使った一般的なデータ品質チェックについて説明しました。
小規模なデータ分析プロジェクトでは、pandasを使ったデータ品質チェックは良い出発点です。問題やデータセットに応じて、追加のチェックを行うこともできます。
データ分析を学びたい方は、ガイド「7 Steps to Mastering Data Wrangling with Pandas and Python」をチェックしてください。
[Bala Priya C](https://twitter.com/balawc27)は、インド出身の開発者で技術ライターです。彼女は数学、プログラミング、データサイエンス、コンテンツ作成の交差点での仕事が好きです。彼女の関心と専門分野はDevOps、データサイエンス、自然言語処理です。彼女は読書、執筆、コーディング、そしてコーヒーが好きです!現在、チュートリアル、ハウツーガイド、オピニオン記事などを執筆して、開発者コミュニティとの知識共有と学習に取り組んでいます。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles