データを最初に読み込んだ時に、なんとなくの傾向/分布をみることから始まります。
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
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)
Pandasだけでここまで可視化することができました。
特に2の分布を見るところは、平均と偏差の傾向を掴み、最後は細かい山の形(二つの山が混ざってないかなど)を抑えることができます。
ここから先、カテゴリデータで分解していくにはpivottablejsを使うと楽です。