Pandas 活用 ビン分割するcut関数とqcut関数(動画あり)

AI

Pandas でビン分割する関数として、cut関数とqcut関数があります。
今回はこの2つの使い分けについて説明します。

Pandas bin分割

ビン分割とは離散的な範囲を作り分析するためのものですが、ヒストグラムの階級にあたるものです。
ヒストグラムの説明はこちらのページがわかりやすいです。

スポンサーリンク

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関数と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動画で使用したものです。

bin.ipynb

タイトルとURLをコピーしました