Pandas でビン分割する関数として、cut関数とqcut関数があります。
今回はこの2つの使い分けについて説明します。
ビン分割とは離散的な範囲を作り分析するためのものですが、ヒストグラムの階級にあたるものです。
ヒストグラムの説明はこちらのページがわかりやすいです。
cut関数
早速サンプルを使って説明します。
次のコードはNumpyのrandint関数で10から100までの整数を12個作成してDataFrame化しています。
import numpy as np import pandas as pd frame = pd.DataFrame({'data1':np.random.randint(10,100,12)}) print(frame['data1'])
結果
0 14
1 55
2 10
3 91
4 20
5 25
6 75
7 67
8 22
9 76
10 86
11 64
Name: data1, dtype: int64
次にcut関数でデータを4つにビン分割します。
quartiles = pd.cut(frame.data1,4) quartiles
結果
0 (9.919, 30.25]
1 (50.5, 70.75]
2 (9.919, 30.25]
3 (70.75, 91.0]
4 (9.919, 30.25]
5 (9.919, 30.25]
6 (70.75, 91.0]
7 (50.5, 70.75]
8 (9.919, 30.25]
9 (70.75, 91.0]
10 (70.75, 91.0]
11 (50.5, 70.75]
Name: data1, dtype: category
Categories (4, interval[float64]): [(9.919, 30.25] < (30.25, 50.5] < (50.5, 70.75] < (70.75, 91.0]]
さて、ここでcut関数がどのようにビン分割しているか、簡単に再現してみます。(実際の内部処理ではありません)
data_range = (frame['data1'].max() - frame['data1'].min())/4 print('4分割した時の1範囲:',data_range) y = frame['data1'].min() bins = [frame['data1'].min()] for _ in range(4): y += data_range bins.append(y) bins
結果
4分割した時の1範囲: 20.25
[10, 30.25, 50.5, 70.75, 91.0]
最初の値がcut関数のものと違いますが、それぞれのビン分割する値はcut関数の結果と同じです。
cut関数は最小値の値から最大値の値の範囲を指定して分割数で割って決められています。
つまりビンの大きさがどれも同じとなるように計算されています。その結果ビンに入る値の数はどれもまちまちになります。
次にグループ化することで基本統計量を算出してみます。
def get_stats(group): return {'min':group.min(),'max':group.max(),'count':group.count(),'mean':group.mean()} grouped = frame.data1.groupby(quartiles) grouped.apply(get_stats).unstack()
結果
min | max | count | mean | |
---|---|---|---|---|
data1 | ||||
(9.919, 30.25] | 10.0 | 25.0 | 5.0 | 18.2 |
(30.25, 50.5] | NaN | NaN | 0.0 | NaN |
(50.5, 70.75] | 55.0 | 67.0 | 3.0 | 62.0 |
(70.75, 91.0] | 75.0 | 91.0 | 4.0 | 82.0 |
次にこのframe[‘data1’]のデータでヒストグラム を描くと次のようになります。
import matplotlib.pyplot as plt plt.hist(frame['data1'],bins=4)
qcut関数
qcut関数はビン分割をするときに、ビンの中の個数が均等になるように分割するものです。
cut関数で使用したDataFrameの値を今度はqcutで分割しています。
grouping = pd.qcut(frame.data1, 4) grouping
結果
0 (9.999, 21.5]
1 (21.5, 59.5]
2 (9.999, 21.5]
3 (75.25, 91.0]
4 (9.999, 21.5]
5 (21.5, 59.5]
6 (59.5, 75.25]
7 (59.5, 75.25]
8 (21.5, 59.5]
9 (75.25, 91.0]
10 (75.25, 91.0]
11 (59.5, 75.25]
Name: data1, dtype: category
Categories (4, interval[float64]): [(9.999, 21.5] < (21.5, 59.5] < (59.5, 75.25] < (75.25, 91.0]]
grouped = frame.data1.groupby(grouping) grouped.apply(get_stats).unstack()
結果
min | max | count | mean | |
---|---|---|---|---|
data1 | ||||
(9.999, 21.5] | 10.0 | 20.0 | 3.0 | 14.666667 |
(21.5, 59.5] | 22.0 | 55.0 | 3.0 | 34.000000 |
(59.5, 75.25] | 64.0 | 75.0 | 3.0 | 68.666667 |
(75.25, 91.0] | 76.0 | 91.0 | 3.0 | 84.333333 |
参考になった書籍
Pandasを使いこなすための必携の本。Pandasの作者自ら書いた本でNumpyやPandasの使い方が詳細に書かれている。
今回使用したサンプルもこの本のbin分割サンプルを簡素化したものに変えて説明しています。
Pythonサンプルのダウンロード
ここでダウンロードする「bin.ipynb」ファイルは、このPandas動画で使用したものです。
コメントを投稿するにはログインしてください。