🌬

【2日目】色んなEDAを試してみる【2021アドベントカレンダー】

2021/12/02に公開

2021年1人アドベントカレンダー(機械学習)、2日目の記事になります。

https://qiita.com/advent-calendar/2021/solo_advent_calendar

テーマは EDA になります。

EDA は探索的データ分析 (Explanatory Data Analysis)のことです。

https://www.ibm.com/jp-ja/cloud/learn/exploratory-data-analysis

(自分は全然出来てないのですが...)機械学習は基本データの特徴を捉えて模倣する技術、ととらえると、そもそもデータがどんな特徴を持っているのか、どんな分布になっているのかが重要です。

生データを眺めていても全体感がわかりませんし、巨大なデータを眺めようものなら時間がいくらあっても足りません。

ここは便利なライブラリを活用したいところです。

Colab のコードはこちら Open In Colab

describe

Pandas であれば、describe() を使うことで数値データであれば平均値や最大値、最小値、四分位範囲を確認することができます。

四分位範囲とは、データのちらばり具合を求めるもので、第1四分位数から第3四分位数までの範囲(データの中央50%部分の範囲)のことを指します。

https://data-viz-lab.com/iqr#:~:text=四分位範囲とは、データのちらばり,のことを指します。

引数に include="all" を指定すればカテゴリーデータであってもユニーク数や最頻値を確認することができます。

df.describe(include='all')

Pandas-Profile

Pandas-Profile を使うと、describe() よりも高度なEDAを簡単に表示することができます。

from pandas_profiling import ProfileReport

profile = ProfileReport(df, title="Pandas Profiling Report")
profile.to_notebook_iframe()

https://pandas-profiling.github.io/pandas-profiling/docs/master/rtd/index.html

Sweetviz

Sweetviz も Pandas-Profile と同様、EDAを簡単に表示することができます。

import sweetviz as sv
from IPython.display import HTML

my_report = sv.analyze(df)
my_report.show_html()
HTML("/content/SWEETVIZ_REPORT.html")

https://github.com/fbdesignpro/sweetviz

ベン図でカテゴリデータの分布を確認

分割した学習データとテストデータの内容が全く違う場合、いくら学習してもいい予測はできないかもしれないので確認してみましょう。

from matplotlib_venn import venn2
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split

train, test = train_test_split(df, test_size=0.3, random_state=42)

plt.figure(figsize=(10, 20))

for i, column in enumerate(df.select_dtypes(include=object).columns):

    plt.subplot(10, 4, i+1)
    set1 = set(train[column])
    set2 = set(test[column])

    plt.title(column)
    venn2([set1, set2], ('Train', 'Test'))

plt.tight_layout()
plt.show()

ヒストグラムで数値データの分布を比較

極端な外れ値がないか、数値の分布が予測しやすそうな形状をしているかはたまたカオスかどうか、ざっと確認してみます。

import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split

train, test = train_test_split(df, test_size=0.3, random_state=42)

for i, column in enumerate(df.select_dtypes(include='number').columns):

    print("nanの数 train:", train[column].isnull().sum(), "test:", test[column].isnull().sum())

    plt.figure(figsize=(10, 40))

    plt.subplot(20, 2, i*2+1)
    plt.title("train:" + column)
    n, bins, _  = plt.hist(train[column].dropna())
    xs = (bins[:-1] + bins[1:])/2
    ys = n.astype(int)
    for x, y in zip(xs, ys):
        plt.text(x, y, str(y), horizontalalignment="center")

    plt.subplot(20, 2, i*2+2)
    plt.title("test:" + column)
    n, bins, _  = plt.hist(test[column].dropna())
    xs = (bins[:-1] + bins[1:])/2
    ys = n.astype(int)
    for x, y in zip(xs, ys):
        plt.text(x, y, str(y), horizontalalignment="center")

    plt.show()

plt.tight_layout()

https://www.haya-programming.com/entry/2019/01/11/191302

相関係数をヒートマップで確認

相関係数とは 2つのデータまたは確率変数の間にある線形な関係の強弱を測る指標になります。

https://ja.wikipedia.org/wiki/相関係数

単純に考えれば目的変数と相関のある特徴量を多く学習させれば、いい予測モデルができそうです。
(現実はそんなに甘くないですが...)

import matplotlib.pyplot as plt
import seaborn as sns

sns.heatmap(df.corr(), square=True, annot=True)

https://qiita.com/Hawaii/items/3f4e91cf9b86676c202f

PairPlot

seaborn の pairplot() を使うと、各カラム同士の散布を簡単に表示することができます。

import matplotlib
import seaborn as sns
import warnings 
warnings.filterwarnings('ignore')

plt.figure(figsize=(40, 40))
sns.pairplot(
             df, 
             hue='Genre', 
             diag_kind = 'kde',
             plot_kws = {'alpha': 0.6, 's': 80, 'edgecolor': 'k'},
             markers='+',
             height = 4
             );

全データをPairPlotすると表が大きすぎるので、カラムも指定できる。


plt.figure(figsize=(40, 40))
sns.pairplot(
             df, 
             hue='Genre', 
             diag_kind = 'kde',
             plot_kws = {'alpha': 0.6, 's': 80, 'edgecolor': 'k'},
             vars = ['Rank', 'VGChartz_Score', 'Critic_Score'],
             markers='+',
             height = 4
             );

https://note.nkmk.me/python-seaborn-pandas-pairplot/

2日目は以上になります、最後までお読みいただきありがとうございました。

参考書籍

EDAメインではないですが、kaggleをテーマにEDAについても触れられてますし、2021/12/2時点でkindle版は無料です。

https://www.amazon.co.jp/dp/B08R6V54VB

Discussion