import numpy as np
import pandas as pd
import seaborn as snsデータの要約
データを入手したら,分析を行う前にまずデータの概観を把握することが重要。データセットにどのような変数が含まれているかを確認し,それぞれの変数の記述統計量 (平均値,分位点,分散など)を求め,必要であれば変数間の相関関係を調べてみる。これにより,欠損値や異常値が含まれていないかということや,どのような仮説を検証することができそうかなど,分析の方向性を決めることができる。
ここでは,Pythonのseabornに含まれているirisデータを例に,データの要約統計量を求める方法を説明する。
Pythonのパッケージ,pandas,numpy,seabornを利用するのであらかじめインストールしておく。
まず,インストールしたパッケージを読み込む。
データの概観
練習としてseabornに組み込まれているサンプル・データirisを概観してみよう。まず,サンプル・データirisを読み込む。
iris = sns.load_dataset('iris')seabornのload_dataset()はpandas.DataFrameオブジェクトを直接返すため,データフレームとしてすぐに利用できる。
irisというデータフレームが作成される。irisデータには,植物のアヤメ150個体について,種類 (3分類),萼片 (がくへん)の長さと幅,花弁 (かべん)の長さと幅の5つの変数が記録されている。このデータは,機械学習による分類などの練習用データとしてよく用いられているデータである。
データにどのような変数が含まれているかは,info()メソッドを使って確かめられる。
iris.info()<class 'pandas.core.frame.DataFrame'>
RangeIndex: 150 entries, 0 to 149
Data columns (total 5 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 sepal_length 150 non-null float64
1 sepal_width 150 non-null float64
2 petal_length 150 non-null float64
3 petal_width 150 non-null float64
4 species 150 non-null object
dtypes: float64(4), object(1)
memory usage: 6.0+ KB
irisデータは,行数 (観測数)が150,列数 (変数の数)が5であることがわかる。また,それぞれの変数のはじめのいくつかの観測値を見ることができるので,データのイメージがつかめる。float64やobjectはそれぞれの変数の型で,float64は実数型,objectは文字列型やカテゴリ型であることを表している。
info()の結果からわかるように,行や列のインデックスは0から始まるということに注意しよう (Rではインデックスは1から始まる)。
それぞれの変数の意味は以下の通り。
| 変数名 | 説明 |
|---|---|
sepal_length |
萼片の長さ |
sepal_width |
萼片の幅 |
petal_length |
花弁の長さ |
petal_width |
花弁の幅 |
species |
アヤメの種類 |
また,head()メソッドを使うと,はじめのいくつかの観測値を見ることができる。
iris.head()| sepal_length | sepal_width | petal_length | petal_width | species | |
|---|---|---|---|---|---|
| 0 | 5.1 | 3.5 | 1.4 | 0.2 | setosa |
| 1 | 4.9 | 3.0 | 1.4 | 0.2 | setosa |
| 2 | 4.7 | 3.2 | 1.3 | 0.2 | setosa |
| 3 | 4.6 | 3.1 | 1.5 | 0.2 | setosa |
| 4 | 5.0 | 3.6 | 1.4 | 0.2 | setosa |
要約統計表の作成
describe()メソッド
データ全体のイメージがつかめたら,次は記録されている変数の要約統計表を作成してみよう。describe()メソッドを用いれば,データフレームに含まれるすべての数値型変数の要約統計量を表示させることができる。
iris.describe()| sepal_length | sepal_width | petal_length | petal_width | |
|---|---|---|---|---|
| count | 150.000000 | 150.000000 | 150.000000 | 150.000000 |
| mean | 5.843333 | 3.057333 | 3.758000 | 1.199333 |
| std | 0.828066 | 0.435866 | 1.765298 | 0.762238 |
| min | 4.300000 | 2.000000 | 1.000000 | 0.100000 |
| 25% | 5.100000 | 2.800000 | 1.600000 | 0.300000 |
| 50% | 5.800000 | 3.000000 | 4.350000 | 1.300000 |
| 75% | 6.400000 | 3.300000 | 5.100000 | 1.800000 |
| max | 7.900000 | 4.400000 | 6.900000 | 2.500000 |
数値型の変数について,観測数(count),平均値(mean),標準偏差(std),最小値(min),第一四分位(25%),中央値(50%),第三四分位(75%),最大値(max)が表示される。
文字列やカテゴリ型の変数については,value_counts()を使うと度数分布表が表示される。
iris['species'].value_counts()species
setosa 50
versicolor 50
virginica 50
Name: count, dtype: int64
データフレームから特定の変数を取り出す
データフレームから特定の変数を取り出すには,データフレーム名の後に角括弧[]を使って,列名をリスト形式で指定する。たとえば,df[['a', 'b']]はdfから変数aとbの2つの変数が含まれるデータフレームとなる。
[[]]の意味について
外側の[]はpandasのDataFrameに対するインデックス操作で,内側の[]はPythonのリスト(複数の列名を指定するため)である。単一の列を選択する場合はdf['a'](Seriesを返す)だが,複数の列を選択する場合はdf[['a', 'b']](DataFrameを返す)となる。
逆にデータフレームから指定した変数を除外したいときには,drop()メソッドを使う。たとえば,df.drop(columns=['a'])はdfから変数aを除いたデータフレームとなる。
特定の変数についてのみ要約統計量を求めたい場合には,列を選択してからdescribe()メソッドを使えば良い。
iris[['sepal_length', 'sepal_width']].describe()| sepal_length | sepal_width | |
|---|---|---|
| count | 150.000000 | 150.000000 |
| mean | 5.843333 | 3.057333 |
| std | 0.828066 | 0.435866 |
| min | 4.300000 | 2.000000 |
| 25% | 5.100000 | 2.800000 |
| 50% | 5.800000 | 3.000000 |
| 75% | 6.400000 | 3.300000 |
| max | 7.900000 | 4.400000 |
agg()メソッドを使う
より柔軟にカスタマイズして要約統計表を作成したい場合には,agg()メソッド(またはaggregate()メソッド)を用いる。agg()メソッドは,統計量名をリストで指定する。
# すべての数値列に複数の統計量を適用
iris.drop(columns=['species']).agg(['mean', 'std', 'max', 'median', 'min', 'var', 'count', 'sum'])| sepal_length | sepal_width | petal_length | petal_width | |
|---|---|---|---|---|
| mean | 5.843333 | 3.057333 | 3.758000 | 1.199333 |
| std | 0.828066 | 0.435866 | 1.765298 | 0.762238 |
| max | 7.900000 | 4.400000 | 6.900000 | 2.500000 |
| median | 5.800000 | 3.000000 | 4.350000 | 1.300000 |
| min | 4.300000 | 2.000000 | 1.000000 | 0.100000 |
| var | 0.685694 | 0.189979 | 3.116278 | 0.581006 |
| count | 150.000000 | 150.000000 | 150.000000 | 150.000000 |
| sum | 876.500000 | 458.600000 | 563.700000 | 179.900000 |
利用可能な統計量
agg()メソッドで利用できる主な統計量を以下の表に示す。
| 統計量 | 指定方法 |
|---|---|
| 観測数 | 'count' |
| 平均値 | 'mean' |
| 中央値 | 'median' |
| 標準偏差 | 'std' |
| 分散 | 'var' |
| 最小値 | 'min' |
| 最大値 | 'max' |
| 合計値 | 'sum' |
関数の定義
関数を定義して用いることも可能。
# 第一四分位
def q25(x):
return x.quantile(0.25)
# 第三四分位
def q75(x):
return x.quantile(0.75)
# 範囲
def range_func(x):
return x.max() - x.min()
# 数値列だけを選択してから集計
iris.drop(columns=['species']).agg([q25, q75, range_func])| sepal_length | sepal_width | petal_length | petal_width | |
|---|---|---|---|---|
| q25 | 5.1 | 2.8 | 1.6 | 0.3 |
| q75 | 6.4 | 3.3 | 5.1 | 1.8 |
| range_func | 3.6 | 2.4 | 5.9 | 2.4 |
グループ別集計での使用
agg()メソッドは,groupby()と組み合わせてグループ別の集計を行う際に特に有用である。
# 種別ごとに要約統計量を計算
iris.groupby('species').agg(['mean'])| sepal_length | sepal_width | petal_length | petal_width | |
|---|---|---|---|---|
| mean | mean | mean | mean | |
| species | ||||
| setosa | 5.006 | 3.428 | 1.462 | 0.246 |
| versicolor | 5.936 | 2.770 | 4.260 | 1.326 |
| virginica | 6.588 | 2.974 | 5.552 | 2.026 |
表のスタイリング
レポートや論文に貼り付けるための表を作成するには,pandasのスタイリング・メソッドを使う。
(
iris.drop(columns=['species'])
.describe()
.style
.format("{:.2f}")
.set_caption("iris データの要約統計量")
)| sepal_length | sepal_width | petal_length | petal_width | |
|---|---|---|---|---|
| count | 150.00 | 150.00 | 150.00 | 150.00 |
| mean | 5.84 | 3.06 | 3.76 | 1.20 |
| std | 0.83 | 0.44 | 1.77 | 0.76 |
| min | 4.30 | 2.00 | 1.00 | 0.10 |
| 25% | 5.10 | 2.80 | 1.60 | 0.30 |
| 50% | 5.80 | 3.00 | 4.35 | 1.30 |
| 75% | 6.40 | 3.30 | 5.10 | 1.80 |
| max | 7.90 | 4.40 | 6.90 | 2.50 |
とくに,html形式で出力したいときには,.to_html(),latex形式で出力する際には,.to_latex()を適用する。
相関表
次に,変数間の相関を求めよう。相関表を求めるにはcorr()メソッドを使う。
iris.drop(columns=['species']).corr()| sepal_length | sepal_width | petal_length | petal_width | |
|---|---|---|---|---|
| sepal_length | 1.000000 | -0.117570 | 0.871754 | 0.817941 |
| sepal_width | -0.117570 | 1.000000 | -0.428440 | -0.366126 |
| petal_length | 0.871754 | -0.428440 | 1.000000 | 0.962865 |
| petal_width | 0.817941 | -0.366126 | 0.962865 | 1.000000 |