データの要約

データを入手したら,分析を行う前にまずデータの概観を把握することが重要。データセットにどのような変数が含まれているかを確認し,それぞれの変数の記述統計量 (平均値,分位点,分散など)を求め,必要であれば変数間の相関関係を調べてみる。これにより,欠損値や異常値が含まれていないかということや,どのような仮説を検証することができそうかなど,分析の方向性を決めることができる。

ここでは,Pythonのseabornに含まれているirisデータを例に,データの要約統計量を求める方法を説明する。

Pythonのパッケージ,pandasnumpyseabornを利用するのであらかじめインストールしておく。

まず,インストールしたパッケージを読み込む。

import numpy as np
import pandas as pd
import seaborn as sns

データの概観

練習としてseabornに組み込まれているサンプル・データirisを概観してみよう。まず,サンプル・データirisを読み込む。

iris = sns.load_dataset('iris')

seabornload_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であることがわかる。また,それぞれの変数のはじめのいくつかの観測値を見ることができるので,データのイメージがつかめる。float64objectはそれぞれの変数の型で,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から変数abの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 データの要約統計量")
)
Table 1: 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