pandasでは連続したデータを離散化したり、分析のための区間分けを簡単におこなうことができる。

cut関数でデータを区間ごとに分ける

まずは、とあるグループの年齢データを区間ごとに4つのビンに分割する例を見ていこう。

import pandas as pd

ages = [20, 29, 58, 41, 19, 22, 34, 29, 38, 21]

年齢リストを用意したら、次は19歳〜25歳、26歳〜35歳、36歳〜45歳、46歳〜60歳と、4つのビンに分けるためのリストを用意する。

bins = [18, 25, 35, 45, 60]

ここまで用意できたらpandasのcut関数を使用する。

cats = pd.cut(ages, bins)

# [(18, 25], (25, 35], (45, 60], (35, 45], (18, 25], (18, 25], (25, 35], (25, 35], (35, 45], (18, 25]]
# Categories (4, interval[int64]): [(18, 25] < (25, 35] < (35, 45] < (45, 60]]

cut関数で戻されるオブジェクトは、特殊なカテゴリ型のオブジェクトで、出力結果を見ると、第一引数で渡したagesの各値が、第二引数に渡したbinsのどの区間に入るかが記載されているのが分かる。

カテゴリ型オブジェクトのcodesプロパティ

このカテゴリ型のオブジェクトは、codesというプロパティを持ち、agesの各値が何番目のビンに属するか、ビンのインデックス番号を確認できる。

cats.codes
# array([0, 1, 3, 2, 0, 0, 1, 1, 2, 0], dtype=int8)

カテゴリ型オブジェクトのcategoriesプロパティ

また、カテゴリ型オブジェクトはcategoriesというプロパティを持ち、これには定義したビンの情報が含まれている。

cats.categoriesries
# IntervalIndex([(18, 25], (25, 35], (35, 45], (45, 60]]
#               closed='right',
#               dtype='interval[int64]')

それぞれのビンに何件のデータが含まれるかを確認する

pandasのvalue_counts関数の引数に、カテゴリ型オブジェクトのcatsを渡せば、それぞれのビンに何件のデータが含まれるかを確認することができる。

pd.value_counts(cats)
# (18, 25]    4
# (25, 35]    3
# (35, 45]    2
# (45, 60]    1
# dtype: int64

ちなみにビンとして使われている区間表記は数学の表記法と同じく、左側の値は開区間(その値を含まない)を意味し、右側の値は閉区間(その値を含む)を意味する。

ビンに任意のラベル名を設定する

cut関数のlabelsオプションにラベル名をリストとして渡せば、ビンの名前を任意の値に設定することもできる。

cats = pd.cut(ages, bins, labels=['Adult', 'Master', 'Master2', 'Master3'])

pd.value_counts(cats)
# Adult      4
# Master     3
# Master2    2
# Master3    1
# dtype: int64