質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.80%

Pandasのビン分割

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,023

williamsArk

score 46

ビン分割について教えてください。
Pythonの学習において、ビン分割といったものをやっているのですが、以下のようになりました。ビン分割は大まかに値などを分割する(年齢が20代〜30代〜のように)というところは学習しました。ただそれでも、出力結果の意味を細部まで理解できていません。御尽力くださると助かります。

import pandas as pd
from pandas import DataFrame

attri_data1 = {"ID":[100,101,102,103,104,106,108,110,111,113]
        ,"city":["Tokyo","Osaka","Kyoto","Hokkaido","Tokyo","Tokyo","Osaka","Kyoto","Hokkaido","Tokyo"]
        ,"birth_year":[1990,1989,1992,1997,1982,1991,1988,1990,1995,1981]
        ,"name":["Hiroshi","Akiko","Yuki","Satoru","Steeve","Mituru","Aoi","Tarou","Suguru","Mitsuo"]}
attri_data_frame1 = DataFrame(attri_data1)

pd.cut(attri_data_frame1.ID, 2)


上を実行した結果、下のようになりました。
Out[1]: 
0    (99.987, 106.5]
1    (99.987, 106.5]
2    (99.987, 106.5]
3    (99.987, 106.5]
4    (99.987, 106.5]
5    (99.987, 106.5]
6     (106.5, 113.0]
7     (106.5, 113.0]
8     (106.5, 113.0]
9     (106.5, 113.0]
Name: ID, dtype: category
Categories (2, interval[float64]): [(99.987, 106.5] < (106.5, 113.0]]

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

とりあえず質問のコードをもとに簡単に説明を。

質問のコード上では ID の値は

最小値 : 100
最大値 : 113

となっております。
現状のコードでは pandas.cut(bins=2) となっており、IDを2つのカテゴリーに分けるよう指示されておりますので、IDの最大値と最小値の中間の値 106.5 境に2分割し

  • IDが106.5以下の場合 : 1つ目のカテゴリー (99.987, 106.5]
  • IDが106.5より大きい場合 : 2つ目のカテゴリー (106.5, 113.0]

として、各IDの値がどちらのカテゴリーに属するかを返します。

ここで表記の括弧ですが、これはその値を含むか否か - 含む場合大括弧[] 含まない場合は小括弧() - で記述されています。

pandas.cut()のデフォルト動作としては右側の値(大きい方の値)を含むようにカテゴリー分けします。右側の値を含まない ようにカテゴリー分けしたい場合は right=False パラメータを設定してください。

ただ、これらの表記は「このカテゴリーは何なのか」を示す単なる表記 ですのでそれほど気にする必要はないのかなと個人的には思います。 単にカテゴリ分けした結果だけが欲しい場合はpandas.cut()のパラメータに labels=False を渡してください。1つ目のカテゴリーに属する場合は0を、1つ目のカテゴリーに属する場合は1を返すようになります。

またここで、1つ目のカテゴリーの左側の値(小さい方の値)が 99.987 となっているのは、IDの最小値100 を1つ目のカテゴリーとして扱う為に設定されている(pandas内部で何かしらの計算で自動的に算出された)値ですので、こちらもあまり気にする必用はありません。

あと、IDの値の最大値と最小値の中間点ではなく、明示的な値でデータを分割したい場合は、bins パラメータに数値(分割数) ではなく 数値のリスト を渡します。例えば 

  • 0より大きく108以下の場合 : 1つ目のカテゴリー
  • 108より大きく200以下の場合 : 2つ目のカテゴリー

として分割したい場合は、pandas.cut(bins=[0,108,200]) などと書きます。この場合どちらにも属さないIDがあった場合NaNを返しますのでご注意ください。


【補足】
不正確な記述をしていたので補足

pandas には pandas.intervalという区間を表すオブジェクトがあるようです。

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Interval.html

で、pandas.cut()はどの intervalオブジェクトに属しているかでカテゴリー分けしているようです
ですので、(99.987, 106.5] のような記述は 「単なる表記」 ではなく、「どのintervalオブジェクトに属しているか」という意味合いになりますね。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/10 09:35

    大変詳細に説明をいただき助かりました。ビン分割という言葉に馴染みがなかったので、困惑していましたが、少し前進できたと思います。ありがとうございました。

    キャンセル

0

pd.cut などで調べると詳しい解説記事がいくつか見つかると思います。
https://note.nkmk.me/python-pandas-cut-qcut-binning/

今回IDを分割しようとしていますが、全く意味がないように見えます。

基本的にはリストで与えられた値を等間隔に分割するものなので、
pd.cut(attri_data_frame1.birth_year,2(とか3とか)) のほうが意味はあると思います。

ちなみに

これら
(99.987, 106.5]
(106.5, 113.0]
の見方としては、99.987以上106.5未満の分類1と106.5以上113.0未満の分類2
という意味になります (a, b] はa < x <=b)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/10 09:36

    回答いただきましてありがとうございました。この値は基本的にあまり意味がないのですね。学習者にとっては少し困惑するものでしたね。参考になりました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る