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を使う
includeとexcludeを使うことでどのデータを使うかを指定することが可能です。
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'をつけるのを忘れないようにしましょう。
若干表が見にくくなるかもしれませんが、この関数を使うと扱っているデータについて大まかな情報を理解することができるはずです。
 人工知能の今と一歩先を発信するメディア
人工知能の今と一歩先を発信するメディア
