>100 Views
September 07, 23
スライド概要
Section 17では、データに含まれていた時間の「ドリルダウン」、すなわち「年」から「年月」への「ドリルダウン」を行いましたが、このセクションでは、「ドリルダウン」するための数値を新たに作っていきます。
「商品」に属する「UnitPrice(単価)」を、顧客の特徴をよく表すように分割(これを「ビニング」と言います)する方法を身に付けましょう。
それらを実現するプログラムは下記の7つです。
㊺ pd.cut( データ名[“列名”], 分割数, precision=□, right=True )
㊻ pd.cut( データ名[“列名”], 分割数 ). value_counts()
㊼ pd.cut( データ名[“列名”], [数字1, 数字2, 数字3] )
㊽ pd.cut( データ名[“列名”], [数字1, 数字2, 数字3]
, labels=[ラベル1, ラベル2, ラベル3] )
1st STEP同様、動画のテキスト、追加情報は下記のブログを参考にしてください!
■この動画のブログ
データサイエンス チュートリアル
https://tutorial4datascience.blogspot.com/
■参考URL
●ビニングに関しては、Smart-Hintが運営している「データをビニング(ビン分割)する方法|cut」がとってもわかりやすかったので、参考にしてみてはいかがでしょうか。
https://smart-hint.com/python/cut/
●フリーランスのサウンドクリエータ「パンダの中のパンダ」さんがやっている「【AIプログラミング】 ビニングでボストン住宅価格の回帰」が役に立つと思いますので、下記を参考にしてみてくださいね。
https://panda-clip.com/binnning-boston/
1 2nd STEP 集計とグラフ描画 Section 18 データを分割するビニング ㊺ pd.cut( データ名[“列名”], 分割数, precision=□, right=True ) ㊻ pd.cut( データ名[“列名”], 分割数 ). value_counts() ㊼ pd.cut( データ名[“列名”], [数字1, 数字2, 数字3] ) ㊽ pd.cut( データ名[“列名”], [数字1, 数字2, 数字3] , labels=[ラベル1, ラベル2, ラベル3] )
2 Section 18 データを分割するビニング Section 16では、データに含まれていた時間の「ドリルダウン」、すなわち「年」から「年月」へ の「ドリルダウン」を行いましたが、このセクションでは、「ドリルダウン」するための数値を新たに 作っていきます。 まずは、「商品」に属する「UnitPrice(単価)」を、顧客の特徴をよく表すように分割(こ れを「ビニング」と言います)する方法を身に付けましょう。 ビニング 商 品 UnitPrice(単価) 商 品 UnitPrice(分割)
3 Section 18 データを分割するビニング 1.データを等間隔でビニングする 「12歳、24歳、28歳、39歳、32歳」を「10代1人、20代2人、30代2人」とすることにより、データ をまとめて、わかりやすく処理することができます。このように、データの変数を分割することを「ビ ニング処理」と言います。ある集合のことを「ビン」と言い、ビンに分けるという意味でビニングと 言います。 ここでは、最大値と最小値の間を等間隔で分割するプログラムは下記のようになります。 pd.cut( データ名[“列名”], 分割数 ) これだけでもいいのですが、細かく分割の方法を指定することもできます。 「precision=□」で小数点以下何桁までの単位で分割するかを指定することができます。 何も指定しないと、 「precision=3」、すなわち小数点3桁までの単位で分割します。 「right=True」の場合、区分を「○○より大きく、△△以下」に、 「right=False」の場合、区分を「○○以上、△△未満」に分割します。 何も指定しないと、 「right=True」となりますので、区分を「○○より大きく、△△以下」に 分割します。まとめると、㊺のようになります。 ㊺ pd.cut( データ名[“列名”], 分割数, precision=□, right=True )
4 Section 18 データを分割するビニング 2.ビニングの結果 ㊺の結果は、インデックスごとに下記のように表記されます。 「right=」を何も指定しないと、 「right=True」となりますので、区分を「○○より大きく、△△以下」に分割します。 (数字1, 数字2] → 「数字1より大きく、数字2以下」 負の数字が入っているのは、最大値と最小値の間を等間隔で分割したためです。 -38.97 < x ≦7794.0 ここにすべてのビンが表記されます。
5 Section 18 データを分割するビニング 3.ビン(集合)ごとの出現回数を算出する ㊺に、「.」で続けて「value_counts」を書くことで、ビンごとの出現回数を算出することができ ます。 ㊻ pd.cut( データ名[“列名”], 分割数 ). value_counts()
6 Section 18 データを分割するビニング 4.区分を指定してビニングする ㊺のように等間隔で分割する数を指定するだけでなく、区切る境界を指定することもでき ます。その場合は、区切る境界を「リスト」で指定します。リストは、[ ]で囲んで、任意の型 (整数、浮動小数点数、文字列など)の要素を格納できます。要素には順序があり、 インデックスを用いて要素を指定できます(*Section 8の参考を参照)。 ㊼ pd.cut( データ名[“列名”], [数字1, 数字2, 数字3] ) この場合、数字3より大きい値(範囲外)の要素は「NaN」になります。 また、㊼でも、「precision=□」 「right=False」は、使用できます。 ㊺ pd.cut(データ名[“列名”], 分割数) [数字1, 数字2, 数字3]
7 Section 18 データを分割するビニング 5.区分にラベルを付ける 分割した区分にラベル(名前)を付けることも可能です。その場合は、㊼の ( ) 内、カンマ に続けて「labels=[ ラベルの名称 ]」を書きます。 [ ラベルの名称 ]は、リストにして自由に 決めることができます。 ㊽ pd.cut( データ名[“列名”], [数字1, 数字2, 数字3] , labels=[ラベル1, ラベル2, ラベル3] ) この際、区分の個数とラベルの個数を同一にすることが必要です。 また、「labels=False」とすると、「0」始まりの連番を振ることができます。 ビニングに関しては、Smart-Hintが運営している「データをビニング(ビン分割)する方法 |cut」がとってもわかりやすかったので、参考にしてみてはいかがでしょうか。 https://smart-hint.com/python/cut/
8 Section 18 データを分割するビニング ㊺ pd.cut( データ名[“列名”], 分割数, precision=□, right=True ) 1st STEPで作成した「id_pos5」に、「Total」、「Month」、「Year」を付加した「id_pos7」 の「UnitPrice(単価)」に関して、その最大値と最小値の間を等間隔で分割するプログラ ム㊺を書いていきましょう。 解説部で説明したとおり、結果は下記の通りになります。 -38.97 < x ≦7794.0 ここにすべてのビンが表記されます。
9 Section 18 データを分割するビニング ㊻ pd.cut( データ名[“列名”], 分割数 ), value_counts() 次に、㊺を用いて、ビンごとの出現回数を算出してみましょう。 -39 < x ≦7794の範囲に入るものが406,826個、その他は3個しかありません。
10 Section 18 データを分割するビニング ㊼ pd.cut( データ名[“列名”], [数字1, 数字2, 数字3] ) 今度は、㊼を用いて、(0, 5] 、(5, 10] 、(10, 15] 、(15, 20] 、(20, 25]の5つのビン(集 合)に分割してみましょう。 いい感じに分割できました。
11 Section 18 データを分割するビニング ㊽ pd.cut( データ名[“列名”], [数字1, 数字2, 数字3] , labels=[ラベル1, ラベル2, ラベル3] ) 次に、先ほどビニングした5つのビン(集合)に、それぞれ「“-5”」、「5-10」、「10-15」、 「15-20」、 「-25」というラベルを付与しましょう。 ラベルの数とビンの数は同じになるように注意しましょう。
12 Section 18 データを分割するビニング 参 考 ビニングは、機械学習にもよく用いられる「特徴量エンジニアリング」と呼ばれる手法の 一つですから、本格的にPythonを極めたい方もしっかりと身に付けていきましょう。 フリーランスのサウンドクリエータ「パンダの中のパンダ」さんがやっている「【AIプログラミング】 ビニングでボストン住宅価格の回帰」が役に立つと思いますので、下記を参考にしてみてく ださいね。 https://panda-clip.com/binnning-boston/