EDA ワークフローとデータプロファイリング
df.info()、df.describe()、欠損値監査、データ型チェック、カーディナリティ分析を行います。
「EDA ワークフローとデータプロファイリング」はCoddyKit上の無料Learn AI with Pythonレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn AI with Python学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn AI with Pythonコースには全4レッスンが含まれています。
探索的データ分析とは
探索的データ分析(EDA)は、モデリングの前に、どのようなデータセットに対しても最初に行う作業です。目的は、構造を理解し、問題を見つけ、データに対する直感を養うことです。
体系的なEDAの最初の確認チェックリストでは、次の問いに答えます。データの規模はどのくらいか。各列のデータ型は何か。欠損値はどこにあるか。重複はあるか。値はどのように分布しているか。
- データ品質の問題を早期に発見できます
- クリーニングが必要な特徴量を判断できます
- 後で検証する仮説を立てられます
データの読み込み
まずDataFrameを読み込み、head()とshapeで簡単に内容を確認します。
shapeは(rows, columns)というタプルを返すため、扱っているデータの規模をすぐに把握できます。
import pandas as pd
df = pd.read_csv("customers.csv")
print(df.shape) # (10000, 8)
print(df.head()) # first 5 rowsdf.info() — 型と非 null 件数
df.info()は、最初に実行するコマンドとして最も役立つものです。各列の名前、dtype、非 null 件数を出力します。
数値列がobjectとして表示される場合は、何か問題があります(余分なテキスト、カンマ、通貨記号などが含まれている可能性があります)。列によって非 null 件数が異なる場合は、欠損データがあります。
df.info()
# <class pandas.DataFrame>
# RangeIndex: 10000 entries
# age 9800 non-null float64
# city 10000 non-null object
# income 9500 non-null float64df.describe() — 数値の要約
df.describe()は、すべての数値列について、件数、平均、標準偏差、最小値、四分位数(25/50/75%)、最大値を返します。
危険な兆候がないか確認しましょう。たとえば、年齢列のminが-1になっている、maxが75パーセンタイルを大きく上回っている(外れ値)、平均が中央値から大きく離れている(歪み)といったケースです。
print(df.describe())
# Use include="all" to also summarize categorical columns
print(df.describe(include="all"))df.isnull().sum() — 欠損値のカウント
isnull()とsum()を連結すると、列ごとの欠損値を数えられます。さらに.sum()を追加すると、全体の合計を求められます。
深刻度を判断するには、割合に変換します。欠損率が60%の列は削除を検討する価値がありますが、2%の欠損であれば簡単に補完できます。
print(df.isnull().sum())
missing_pct = df.isnull().sum() / len(df) * 100
print(missing_pct.sort_values(ascending=False))df.duplicated().sum() — 重複行の検索
df.duplicated()は、以前の行と完全に同じ行を示すブール値のSeriesを返します。これを合計すると、重複がいくつあるかを数えられます。
subsetを使うと、重複を特定のキー列に限定できます。idが一意であるべき場合に便利です。
print(df.duplicated().sum()) # exact duplicate rows
print(df.duplicated(subset=["id"]).sum()) # duplicate ids
df = df.drop_duplicates()value_counts() — カテゴリの頻度
value_counts()は、列内の各一意な値が何回現れるかを集計します。カテゴリデータを調べる際の定番のツールです。
生の件数ではなく割合を確認するにはnormalize=Trueを使い、欠損値も集計に含めるにはdropna=Falseを使います。
print(df["city"].value_counts())
print(df["city"].value_counts(normalize=True))
print(df["city"].value_counts(dropna=False))カーディナリティの確認
カーディナリティとは、列に含まれる異なる値の数で、nunique()で求められます。
- 低カーディナリティ(カテゴリが少数) → one-hot encodingに適しています。
- 高カーディナリティ(ユーザーIDなど、数千個の一意な文字列) → 通常、そのままでは有用な特徴量になりません。
for col in df.select_dtypes("object").columns:
print(col, "->", df[col].nunique(), "unique")定数列とIDのような列の発見
プロファイリングでは、次の2つの極端なケースに注意する価値があります。
- 定数列(
nunique() == 1)には情報がないため、削除します。 - IDのような列(
nunique() == len(df))は行ごとに一意であり、ほとんどのモデルにとって有用な情報を何も持たないため、削除を検討します。
n = len(df)
for col in df.columns:
u = df[col].nunique()
if u == 1:
print(col, "is constant")
elif u == n:
print(col, "is ID-like")dtypesとメモリ使用量
df.dtypesを確認して列が正しく格納されていることを確かめ、df.memory_usage(deep=True)でメモリを多く消費している列を見つけます。
数値型をダウンキャストし、カーディナリティの低い文字列をcategoryに変換すると、大規模なデータセットではメモリ使用量を大幅に削減できます。
print(df.dtypes)
print(df.memory_usage(deep=True))
df["city"] = df["city"].astype("category")再利用可能なプロファイリング用スニペット
チェックリスト全体を1つのヘルパーにまとめると、新しいデータセットに対して毎回同じ初回確認を行えます。
DataFrameを読み込んだらすぐに実行することで、データの形状、型、欠損、重複、カーディナリティをただちに確認できます。
def profile(df):
print("Shape:", df.shape)
print(df.info())
print("Missing:\n", df.isnull().sum())
print("Dupes:", df.duplicated().sum())
for c in df.select_dtypes("object"):
print(c, df[c].nunique(), "unique")
profile(df)クイックチェック:欠損値
各列の欠損値の割合を求めたいとします。
まとめ:EDAの最初の確認チェックリスト
これで、どのデータセットにも使える、繰り返し実行可能な最初の確認手順が整いました。
- 規模とプレビューには
shapeとhead() - dtypeと非 null 件数には
info() - 数値の要約と外れ値の手がかりには
describe() - 欠損には
isnull().sum() - 重複行には
duplicated().sum() - カテゴリの頻度とカーディナリティには
value_counts()とnunique()
次は、単変量分析で個々の列を詳しく調べます。
よくある質問
「EDA ワークフローとデータプロファイリング」レッスンは無料ですか?
はい。「EDA ワークフローとデータプロファイリング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn AI with Pythonコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn AI with Pythonコースには全4レッスンが含まれています。
「EDA ワークフローとデータプロファイリング」で何を学びますか?
df.info()、df.describe()、欠損値監査、データ型チェック、カーディナリティ分析を行います。 ブラウザで直接実行するハンズオンコードでLearn AI with Pythonを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Learn AI with Pythonを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLearn AI with Pythonは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「EDA ワークフローとデータプロファイリング」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLearn AI with Pythonレッスンでコードを書いて実行できますか?
はい。すべてのLearn AI with Pythonレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- EDA ワークフローとデータプロファイリング
- 単変量解析
- 二変量解析と多変量解析
- 特徴量分布と目的変数の分析