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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

2回答

2221閲覧

Pandasのビン分割

williamsArk

総合スコア46

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2019/05/08 10:53

ビン分割について教えてください。
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]]

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

質問のコード上では 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/09 02:49

編集2019/05/09 03:23
magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

williamsArk

2019/05/10 00:35

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

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/08 11:39

tetsunosuke

総合スコア1292

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

williamsArk

2019/05/10 00:36

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問