DescribeをPandasだけで可視化したい

データを最初に読み込んだ時に、なんとなくの傾向/分布をみることから始まります。

Pandasのdf.describeは正しくこの時に便利で、カラムごとの基本統計量を一発で手に入れることができます。

しかし、カラムの数が多いと、表が大きくなり、把握しにくくなるため、グラフで可視化すると楽です。

Describeとは

簡単に、describeを復習しておきます。 df.describe()で以下の統計量を教えてくれます。

  • count : null値を除いたその列のレコード数
  • mean,std:平均と偏差
  • min,max:最小値と最大値
  • 50% : 中央値
  • 25%,75% : 第1四分位点と第3四分位点(順番に並べた際に、1/4,3/4番目にくるもの)

またdescribeは引数、includeまたはexcludeに[np.object]のように型を渡すことで、集計するカラムの型の対象を制御することができます。デフォルトでは、数値型のみです。

可視化してみる

基本的に最初に抑えておきたいの以下です。

  • nullの割合
  • 分布
  • 列の相関関係

いったん、seabornは使わずpandasだけでやってみます。

データの生成

import pandas as pd
import numpy as np

# 100行10列のデータ
df = pd.DataFrame(np.random.rand(100,10))

#いくつかnullに変換しておく
df[df < 0.3] = np.NaN

基礎集計

res = df.describe()
res

f:id:esu-ko:20200723191432p:plain

describeで一発ですが、流石に目で見るのは難しいです。

可視化する

毎回以下のコピペで済ましています。

#1. nullの可視化
res[res.index == 'count'].append(df.isna().sum(),ignore_index=True).T.plot.bar(stacked=True,legend=False)

#2. 分布把握系(徐々に細かくなっていく)
#平均と偏差
res[res.index=='mean'].T.plot.bar(yerr=res[res.index=='std'].values,capsize=2)

#四分位と最小最大
target = ['min','25%','50%','75%','max']
res[res.index.isin(target)].boxplot()

#分布
df[res.columns].plot(subplots=True,kind='kde')

#3. 相関
df[res.columns].corr().style.background_gradient(cmap='Oranges')

from pandas.plotting import scatter_matrix
scatter_matrix(df)
f:id:esu-ko:20200723191915p:plainf:id:esu-ko:20200723191923p:plainf:id:esu-ko:20200723191933p:plainf:id:esu-ko:20200723191955p:plainf:id:esu-ko:20200723192013p:plainf:id:esu-ko:20200723192446p:plain

Pandasだけでここまで可視化することができました。

特に2の分布を見るところは、平均と偏差の傾向を掴み、最後は細かい山の形(二つの山が混ざってないかなど)を抑えることができます。

ここから先、カテゴリデータで分解していくにはpivottablejsを使うと楽です。

esu-ko.hatenablog.com