Python

Python基礎:cut( ), qcut( )

スポンサーリンク

はじめに

今回はビン分割の方法を扱います。ビン分割は連続データを区切ってカテゴリ分けする操作です。年齢を年代別にしたり、体重を階級別にしたりするような操作となります。pandasにcut( ),qcut( )が用意されています。この違い・使い方についてみていきましょう。

サンプルデータ

200人分の身長のデータを作ることにしましょう。

# idと身長のデータを作成
id=list(range(200))
data=[random.randint(150, 195) for i in range(200)]

# データフレームの作成
height_data=pd.DataFrame({'id':id,'身長':data})
height_data.head()

ビン分割

cut( )とqcut( )の違いは、値をもとに分割するか(cut)、量をもとに分割するか(qcut)の違いです。

  • cut
    cutは値をもとに分割する方法です。境界値を指定して分割します。
  • qcut
    qcutは量をもとに分割する方法です。値の大きさ順に並べて、指定した数で等分します。

まずはcutから見ていくことにしましょう。

cut( )

これを身長のデータだとして、150~155,156~160,161~165,166~170,171~175,176~180,181~185,186~190,191~195にわけることにしましょう。

# cutでビン分割
pd.cut(height_data['身長'],[149,155,160,165,170,175,180,185,190,195])

分類したレンジごとの数を知りたければvalue_counts( )を用いて次のようにすることができます。

# 分割後、レンジごとに集計
pd.cut(data,[149,155,160,165,170,175,180,185,190,195]).value_counts()

qcut( )

次にqcut( )による分割です。qcut( )は値の大きさ順にデータを等分してくれます。ここでは、9つに分類することにしましょう。

pd.qcut(height_data['身長'],9)

cut( )のときと同様に、レンジごとに集計してみましょう。

pd.qcut(height_data['身長'],9).value_counts()

カテゴリ化する

数値を区切ってカテゴリ化するのだから、分割した後の各レンジにラベルを付けておくとわかりやすいです。例えば、身長のデータを分割して、SS, S, M, L, LLにわけてみましょう。

labels=['SS','S','M','L','LL']
pd.cut(height_data['身長'], [149,160,170,180,190,200],labels=labels)

groupbyを使って次のように集計することもできます。

size=pd.cut(height_data['身長'], [149,160,170,180,190,200],labels=labels)
height_data.groupby(size).size()

このように、データフレームの列項目ではなくてもgroupby( )することができます。もちろん、次のようにデータフレームの列項目としてsizeという項目を持たせてもよいでしょう。

height_data['size']=pd.cut(height_data['身長'], [149,160,170,180,190,200],labels=labels)
height_data.groupby('size').size()

もちろん、まったく同じ結果です。

スポンサーリンク

まとめ

いかがでしたか?今回はcut( )、qcut( )によるビン分割を扱いました。連続データをカテゴリ化して扱うことはよくあります。(今回の例のように身長のデータや年齢、体重など)

理解すると、簡単ですね。身に着けておきましょう。

コメント

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