特徴量分布と目的変数の分析
特徴量と目的変数の関係、クラス不均衡の検出、相互情報量を分析します。
「特徴量分布と目的変数の分析」はCoddyKit上の無料Learn AI with Pythonレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn AI with Python学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn AI with Pythonコースには全4レッスンが含まれています。
なぜ特徴量を目的変数と比較して分析するのか
目的変数とは、予測したい変数のことです。モデル構築のためにEDAを行う目的は、どの特徴量が実際に目的変数と関係しているのかを把握することです。
このレッスンでは、特徴量と目的変数の関係を示すプロット、相互情報量による情報量の測定、クラスの不均衡の検出、変換による歪みの補正について学びます。
特徴量と目的変数 — 数値の目的変数
目的変数が数値の場合、featureとtargetの散布図によって、その特徴量が予測に役立つ情報を持っているかどうかが分かります。
明確な傾向があれば、その特徴量は予測に役立ちます。形のない雲状の分布であれば、おそらく役立ちません。
import seaborn as sns
import matplotlib.pyplot as plt
sns.scatterplot(x="rooms", y="price", data=df, alpha=0.4)
plt.show()特徴量と目的変数 — カテゴリカルな目的変数
目的変数がクラスラベルの場合は、各クラス内で特徴量の分布を比較します。KDEが重なっていれば、その特徴量によるクラスの分離はうまくできません。曲線が明確に分かれていれば、その特徴量は有用です。
sns.kdeplot(data=df, x="balance", hue="churned", common_norm=False, fill=True)
plt.title("Balance by churn status")
plt.show()箱ひげ図でクラスの分布を比較する
グループ化した箱ひげ図も、特徴量とクラスの関係を確認する方法です。x軸に目的変数のクラス、y軸に特徴量を配置します。
クラス間で中央値が異なっていれば、その特徴量はクラスの判別に役立ちます。
sns.boxplot(x="churned", y="tenure", data=df)
plt.show()クラスの不均衡を検出する
クラスの不均衡とは、ある目的変数のクラスが別のクラスを大幅に上回っている状態です(例:不正なしが95%、不正ありが5%)。この状態では正解率が誤解を招き、モデルが多数派クラスに偏ってしまいます。
目的変数に対して単純な値のカウントを行うことで確認できます。
print(df["churned"].value_counts())
# 0 9200
# 1 800割合を求める value_counts(normalize=True)
生の件数だけでは、不均衡の深刻さが分かりにくいことがあります。normalize=Trueを指定すると件数が割合に変換されるため、そのままパーセンテージとして読み取れます。
print(df["churned"].value_counts(normalize=True))
# 0 0.92
# 1 0.08 -> only 8% positive class不均衡が重要な理由
負例が92%ある場合、常に「いいえ」と予測するモデルでも正解率は92%になりますが、実際には役に立ちません。そのため、早い段階で不均衡を確認することが重要です。
対策には、リサンプリング(少数派のオーバーサンプリング/多数派のアンダーサンプリング)、クラスの重み付け、正解率の代わりに適合率・再現率・F1などの指標を使う方法があります。
相互情報量 — 情報量を測定する
相互情報量は、ある特徴量を知ることで目的変数に関する不確実性がどれだけ減少するかを測定します。相関とは異なり、非線形な関係も捉えられます。
分類の目的変数に対しては、scikit-learnにmutual_info_classifが用意されています。
from sklearn.feature_selection import mutual_info_classif
X = df[["balance", "tenure", "rooms"]]
y = df["churned"]
mi = mutual_info_classif(X, y, random_state=42)
print(dict(zip(X.columns, mi)))相互情報量で特徴量を順位付けする
相互情報量(MI)のスコアを並べ替えたSeriesにすると、特徴量の重要度をすばやく順位付けできます。MIが高いほど、その特徴量は目的変数についてより多くの情報を持っています。
これは、モデルを学習させる前の初期段階で行うフィルタリングとして非常に有効です。
import pandas as pd
from sklearn.feature_selection import mutual_info_classif
mi = mutual_info_classif(X, y, random_state=42)
scores = pd.Series(mi, index=X.columns).sort_values(ascending=False)
print(scores)歪んだ特徴量に対する対数変換
右に歪んだ特徴量(所得、件数、価格など)は、対数変換を行うと扱いやすくなることがよくあります。対数変換によって長い裾が圧縮され、より左右対称に近い形になります。
0を安全に扱えるように、np.log1p(1 + xの対数)を使います。
import numpy as np
df["income_log"] = np.log1p(df["income"])
print(df["income"].skew(), "->", df["income_log"].skew())変換前と変換後:変換を可視化する
変換によって改善されたかどうかは、必ず変換前と変換後をプロットして確認してください。対数変換後の分布は、より左右対称の釣鐘型に近くなるはずです。
import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1, 2)
df["income"].hist(ax=ax[0]); ax[0].set_title("Raw")
np.log1p(df["income"]).hist(ax=ax[1]); ax[1].set_title("log1p")
plt.show()クイックチェック:歪んだ特徴量を修正する
ある特徴量が大きく右に歪んでおり、0の値もいくつか含んでいます。
まとめ:特徴量と目的変数の分析
特徴量と予測対象である目的変数を関連付ける方法を学びました。
- 散布図/KDE/箱ひげ図で特徴量と目的変数の関係を確認する
value_counts(normalize=True)でクラスの不均衡を検出し、定量化するmutual_info_classifで、非線形な関係も含めて情報量に基づき特徴量を順位付けするnp.log1pで右に歪んだ特徴量を扱いやすくする
これで探索的データ分析は完了です。次は、Web APIからデータを収集します。
よくある質問
「特徴量分布と目的変数の分析」レッスンは無料ですか?
はい。「特徴量分布と目的変数の分析」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn AI with Pythonコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn AI with Pythonコースには全4レッスンが含まれています。
「特徴量分布と目的変数の分析」で何を学びますか?
特徴量と目的変数の関係、クラス不均衡の検出、相互情報量を分析します。 ブラウザで直接実行するハンズオンコードでLearn AI with Pythonを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Learn AI with Pythonを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLearn AI with Pythonは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「特徴量分布と目的変数の分析」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLearn AI with Pythonレッスンでコードを書いて実行できますか?
はい。すべてのLearn AI with Pythonレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- EDA ワークフローとデータプロファイリング
- 単変量解析
- 二変量解析と多変量解析
- 特徴量分布と目的変数の分析