Pandasにはデータの概要情報を一括で取得してくれる便利関数describeが存在します。使い方自体は非常にシンプルですがデータ分析の際に扱っているデータの概要や偏りが手軽に分かるのでよく使われます。

本記事では

  • describe関数の使い方

について解説します。

describe関数

describe関数は特に引数を指定しない状態で使われることが多く、以下のようにとりあえずデータが与えられた際に概要を把握するケースに頻繁に使われます。


In [1]: import pandas as pd

In [2]: import numpy as np # 乱数生成のためにNumPyをインポートしておく。

In [8]: data = np.random.randint(-10,10,size=100).reshape(20,5)

In [9]: df = pd.DataFrame(data,columns=['A','B','C','D','E'])

In [10]: df # 数値の羅列だけだとよく分からない部分が多い
Out[10]:
     A   B   C   D   E
0    9   6   8   5  -2
1   -5  -3   3   9   4
2    9  -9  -2 -10   6
3   -5   8  -1   0   0
4   -3   2  -8   1  -5
5    4  -4  -5  -7   0
6   -7  -1  -1   2   7
7   -6  -7 -10   5  -7
8  -10   5   6  -8  -9
9    9   5  -2  -9  -8
10   6 -10  -2   9   0
11   7  -4   8  -5  -8
12  -8   4 -10   8   5
13  -8  -9  -1  -2   2
14   1  -1   2   3   0
15   6  -9   8  -1  -8
16  -5   9   5   7   4
17   6  -6   2   4 -10
18   9   2  -3   9   2
19   0  -6  -6  -5  -4

In [11]: df.describe() # describe関数でとりあえず概要表示
Out[11]:
               A          B          C          D          E
count  20.000000  20.000000  20.000000  20.000000  20.000000
mean    0.450000  -1.400000  -0.450000   0.750000  -1.550000
std     6.847781   6.167828   5.689094   6.381511   5.472178
min   -10.000000 -10.000000 -10.000000 -10.000000 -10.000000
25%    -5.250000  -6.250000  -3.500000  -5.000000  -7.250000
50%     0.500000  -2.000000  -1.000000   1.500000   0.000000
75%     6.250000   4.250000   3.500000   5.500000   2.500000
max     9.000000   9.000000   8.000000   9.000000   7.000000

先ほど使ったのは数値データのみで構成されるDataFrameでしたので数値データ用の統計量が揃っています。 上からcount,mean,std,min,25%,50%,75%,maxと並んでいますが統計をやったことのある方にはすぐにピンと来る名称だと思います。 日本語に直しますと順にデータ個数、平均、標準偏差、最小値、第一四分位数、第二四分位数、第三四分位数、最大値と並んでいます。この辺りの解説は後述します。

APIドキュメント

簡単な使い方がわかったところでAPIドキュメントを見てみましょう。 DataFrameに対しても、Seriesに対しても使い方は全く一緒です。

pandas.<DataFrame or Series>.describe(percentiles=None,include=None,exclude=None)

params:

パラメータ名 概要
percentiles 数値のリスト (省略可能)初期値None
分位数の分位を指定します。小さいものから順に並べた時全体の上位何%の所にどんな値があるかがわかります。初期値は[0.25,0.5,0.75]。0~1の間の値で指定します。
include ‘all’,データ型のリスト
もしくはNone
(省略可能)初期値None
Seriesでは無視される引数。どのデータ型を対象に統計量を返すかを指定します。’all’だと全てです。
exclude データ型のリスト
もしくはNone
(省略可能)初期値None
統計量を返すさい、どのデータ型を含む列データを除外するかを指定します。

returns:

SeriesやDataFrameの要約統計量が返されます。

APIドキュメントを見る限り、どんなデータ型に対して統計量を表示するかを指定するものが含まれています。

  • 数値データならnumpy.number
  • オブジェクトデータならnumpy.object
  • Pandasのカテゴリカルな列データならば'category'

で指定できます。 特に何も指定しないと数値データが含まれていればオブジェクトとカテゴリカルデータの統計量は表示されません。

次にpercentilesですが、これは最も小さい値を0、大きい値を1にした場合、小さい順に並べ直した時の上位何%にどんな値が存在しているかを表示させることができます。 デフォルトの設定では[0.25,0.5,0.75]と、データ全体を四分割した時の境界にあたる値がいくらなのかという、いわゆる四分位数を表示させています。

統計量の意味

まずはデータのタイプによって表示される統計量が違うことを確認しましょう。

数値データからdescribe関数で具体的な統計量を見てみます。

In [12]: s = pd.Series([0,22,4])

In [13]: s.describe()
Out[13]:
count     3.000000
mean      8.666667
std      11.718931
min       0.000000
25%       2.000000
50%       4.000000
75%      13.000000
max      22.000000
dtype: float64

これらの統計量を表にしてまとめると以下のようになります。

表示名 説明 Pandasで相当する関数
count データの個数を表します。 DataFrame.count,Series.count
mean 数値データの平均を表します。 DataFrame.mean,Series.mean
std 数値データの標準偏差を表します。 DataFrame.std, Series.std
min 最小値を表します。 DataFrame.min,Series.min
max 最大値を表します。 DataFrame.max,Series.max
25%,50%,75% 四分位数を表します。(区切る部分はpercentiles引数で変更可能) DataFrame.quantile,Series.quantile

次にカテゴリカルデータ(オブジェクト)。

In [14]: s = pd.Series(['a','aa','A','A','b','b'])

In [15]: s.describe()
Out[15]:
count     6
unique    4
top       b
freq      2
dtype: object
表示名 説明 Pandasで相当する関数
count データ個数を表します。 DataFrame.count,Series.count
unique ユニークな値がいくつ存在するかを表します。 Series.unique,pandas.unique
top 最も多く出現した要素の値を表します(最頻値)。 DataFrame.mode, Series.mode
freq topで返された値の出現回数を表します。 Series.value_counts

timestamp型ですとオブジェクトデータに加えて始点や終点も表示してくれます。

In [16]: s = pd.Series([
    ...:   np.datetime64("2018-01-01"),
    ...:   np.datetime64("2017-03-28"),
    ...:   np.datetime64("2018-08-15")
    ...: ])

In [17]: s.describe()
Out[17]:
count                       3
unique                      3
top       2018-01-01 00:00:00
freq                        1
first     2017-03-28 00:00:00
last      2018-08-15 00:00:00
dtype: object

表示名 説明 Pandasで相当する関数
first 最も時間が古いものを表します。 DataFrame.min,Series.min
last 最も時間が新しいものを表します。 DataFrame.max,Series.max

引数percentilesで分位数指定

0~1の間でどの分位数を見たいかを指定します。 デフォルトでは[0.25,0.5,0.75]の3つの値が指定されていますがいくつ設定しても構いません。

具体的に指定してみましょう。

In [18]: data = np.random.randn(100) # 乱数の生成

In [19]: s = pd.Series(data)

In [20]: s.describe() # 特にpercentilesを指定しない状態
Out[20]:
count    100.000000
mean      -0.126139
std        1.003399
min       -2.263241
25%       -0.783021
50%       -0.171385
75%        0.529982
max        2.384144
dtype: float64

In [21]: s.describe(percentiles=[0.1,0.2,0.5]) # 10%,20%,50%
Out[21]:
count    100.000000
mean      -0.126139
std        1.003399
min       -2.263241
10%       -1.375358
20%       -1.115418
50%       -0.171385
max        2.384144
dtype: float64

In [22]: s.describe(percentiles=[0.1,0.2,0.5,0.89]) # 4つ指定することも可能
Out[22]:
count    100.000000
mean      -0.126139
std        1.003399
min       -2.263241
10%       -1.375358
20%       -1.115418
50%       -0.171385
89%        1.042747
max        2.384144
dtype: float64


In [24]: s.describe(percentiles=[0,0.2,0.99]) # 0にすると最小値と一致する。1なら最大値
Out[24]:
count    100.000000
mean      -0.126139
std        1.003399
min       -2.263241
0%        -2.263241
20%       -1.115418
50%       -0.171385
99%        1.943355
max        2.384144
dtype: float64

引数include,excludeを使う

includeexcludeを使うことでどのデータを使うかを指定することが可能です。

In [26]: df = pd.DataFrame({
    ...:   "number":[0,1,-1,3],
    ...:   "object":['a','b','b','c'],
    ...:   "categorical": pd.Categorical(['d','e','f','g'])
    ...: }) # まずはデータを作る

In [27]: df.describe() # 何も指定しないと数値データのみ
Out[27]:
         number
count  4.000000
mean   0.750000
std    1.707825
min   -1.000000
25%   -0.250000
50%    0.500000
75%    1.500000
max    3.000000

In [28]: df.describe(include='all') # include='all'にするとdescribeで表示できるアイテムを全て表示する
Out[28]:
       categorical    number object
count            4  4.000000      4
unique           4       NaN      3
top              g       NaN      b
freq             1       NaN      2
mean           NaN  0.750000    NaN
std            NaN  1.707825    NaN
min            NaN -1.000000    NaN
25%            NaN -0.250000    NaN
50%            NaN  0.500000    NaN
75%            NaN  1.500000    NaN
max            NaN  3.000000    NaN

数値データを省いてみます。 exclude=np.numberで省くことが可能です。 省くと他のオブジェクトデータの統計量が表示されます。

In [30]: df.describe(exclude=np.number)
Out[30]:
       categorical object
count            4      4
unique           4      3
top              g      b
freq             1      2

オブジェクトデータとカテゴリカルデータだけを表示させます。

In [31]: df.describe(include=np.object)
Out[31]:
       object
count       4
unique      3
top         b
freq        2

In [32]: df.describe(include='category')
Out[32]:
       categorical
count            4
unique           4
top              g
freq             1

オブジェクトと数値データだけ表示させます。

In [33]: df.describe(include=[np.object,np.number])
Out[33]:
          number object
count   4.000000      4
unique       NaN      3
top          NaN      b
freq         NaN      2
mean    0.750000    NaN
std     1.707825    NaN
min    -1.000000    NaN
25%    -0.250000    NaN
50%     0.500000    NaN
75%     1.500000    NaN
max     3.000000    NaN

まとめ

今回はdescribe関数について扱いました。 使い方そのものには難しさはなく、非常に手軽に実行できる関数となっています。 ただ、数値データとオブジェクトデータが混合しているDataFrameで概要を表示させる時、全ての列データについての概要がみたかったらinclude='all'をつけるのを忘れないようにしましょう。

若干表が見にくくなるかもしれませんが、この関数を使うと扱っているデータについて大まかな情報を理解することができるはずです。

参考