#30 ピボットテーブル(2)

>100 Views

November 17, 23

スライド概要

さて、「2nd STEP 集計とグラフ描画」は、最後のスライドとなります。

ここまで見ていただき、ありがとうございました。

データサイエンティストが、どのようなプログラムを書いているのか、試行錯誤も含めて、よく分かったと思います。プログラムを書くという作業の背景を理解して、ビジネスの現場でデータ思考を心がけていただくことを期待します。

また、これらのスライドで、データサイエンスに興味を持ち、もっと高度なプログラムを書いてみたいと思った方もいることでしょう。下記ブログの参考図書を参考に、データサイエンスの大海原に漕ぎ出していきましょう。

本セクションでは、円グラフに現れている数値が本当に価格帯ごとの比率(%)になっているかどうかをピボットテーブル+αで確認していきます。

グラフで傾向をつかむだけでなく、その数値を把握することを求められるケースがしばしばありますので、ピボットテーブルで求めたクロス集計表にひと手間加えて、比率(%)がわかる表の作り方を身に付けましょう。「pivot_table」では、欠損値を含めないで集計しますので、欠損値を確認したり、データ型を変えたり、結構、手間がかかります。

また、一気に、比率を求めてしまう方法として、データフレームの各行に対して関数を適用する「apply」と1行で記載できる関数を定義する「lambda」を組み合わせることも身に付けていきましょう。

76 データ名[データ名.isna().any(axis=1)]

77 データ名.replace(“元の要素”, “新しい要素”)

78 データ名.apply(関数, axis=1)

79 lambda 引数:処理内容

まとめとして、データを「見える化」するためのグラフ・集計表の目的別手法も掲載しました。復習の意味で、参考にしてください。

1st STEP同様、動画、追加情報は下記のブログを参考にしてください!

■この動画のブログ

●データサイエンス チュートリアル
https://tutorial4datascience.blogspot.com/

■参考URL

●【5分で分かる】箱ひげ図のPythonでの書き方を学ぼう!

https://toukei-lab.com/python-boxplot

profile-image

すべてのビジネスパーソンが意思決定プロセスにデータを活用する思考を身につけ、ブルシットジョブをこの世からなくしていきましょう!

関連スライド

各ページのテキスト
1.

1 2nd STEP 集計とグラフ描画 Section 28 ピボットテーブル(2) 76 データ名[データ名.isna().any(axis=1)] 77 データ名.replace(“元の要素”, “新しい要素”) 78 データ名.apply(関数, axis=1) 79 lambda 引数:処理内容

2.

2 Section 28 ピボットテーブル(2) Section 26では、価格帯ごとに購入価格の比率(%)を示す円グラフを描きましたが、本セ クションでは、円グラフに現れている数値が本当に価格帯ごとの比率(%)になっているかどうか をピボットテーブル+αで確認していきます。 グラフで傾向をつかむだけでなく、その数値を把握することを求められるケースがしばしばあります ので、ピボットテーブルで求めたクロス集計表にひと手間加えて、比率(%)がわかる表の作り 方を身に付けましょう。 1. 「pivot_table」と欠損値 よく見ると円グラフには凡例に「null」という項目があります。これは、列「価格帯」に欠損値が含ま れ、 「Plotly」が欠損値の合計量やその比率を計算し、円グラフに反映してくれているためです。 しかし、「pivot_table」では、欠損値を省いて計算してしまいますので、まずは、準備として、欠 損値に適当な値を穴埋め(置換)しておく必要があります。 そのために、このセクションでは、欠損値が一つ以上ある行のみを抽出し、そのデータでプログラム を書きていきます。これは、欠損値が少ないので表示されないからです。プログラムの結果の変化 を確認しながら進めるために欠損値のみのデータでデータ型や文字列の置換を行っていきます。

3.

3 Section 28 ピボットテーブル(2) ⑳ データ名.isna().sum() ⑳を用い、円グラフで使ったデータ「id_pos11」に欠損値があるかどうか調べてみます。 列「価格帯」のみに、欠損値が存在します。 これは、 Section 18で決めた価格帯の定義が、 (0, 5] 、(5, 10] 、(10, 15] 、(15, 20] 、(20, 25] で、25より大きい値は欠損してしまっているからで す。 【参照】(数字1, 数字2] → 「数字1より大きく、数字2以下」

4.

4 Section 28 ピボットテーブル(2) 2.欠損値を持つ行を抽出 欠損値が一つ以上ある行のみを抽出するには、㉓(※)以外にも、下記のプログラムで行 うことができます。 76 データ名[データ名.isna().any(axis=1)] Section 9の「⑳ データ名.isna().sum()」では、「isna」を「sum」と組み合わせることによっ て、欠損値をカウントしました。「isna」は、各要素に対して判定を行い、欠損値NaNであ ればTrue、欠損値でなければFalseを表示する機能を持っています。 また、「any」には、少なくとも1つがTrueであるかどうかを判定する機能を持ち、引数に 「axis=1」を入れると行方向で判定します。 「isna」と組み合わせることにより、行方向で欠 損値が少なくとも一つある行のみを抽出したindexが「Series」で取得できます。 そのindexを「データ名[ ]」の「 [ ] 」内で指定することにより、欠損値が一つ以上ある行のみ を抽出した「DataFrame」を取得することができます。 ※ ㉓は、該当列のデータ型が「object」である場合のみ有効なものです。今回は、データ型 が「category」ですので、㉓は使えません。

5.

5 Section 28 ピボットテーブル(2) 76 データ名[データ名.isna().any(axis=1)] 76を用い、円グラフで使ったデータ「id_pos11」のうち、欠損値が一つ以上ある行のみを抽出 します。 結果の一部

6.

6 Section 28 ピボットテーブル(2) 3.欠損値のデータ型を確認、変換 ここで、欠損値を持つ行を抽出したデータ のデータ型を確認してみましょう。 欠損値が存在する列「価格帯」のデータ 型は、カテゴリー変数となっています。 これは、列「価格帯」はビンのラベルで、 25より大きい値が欠損値になっていますの で、欠損値とは言えカテゴリー変数なので す。 カテゴリー変数は、初めに定めた「-5」、 「5-10」、「10-15」、「15-20」、「25-」以 外に他の値に置換できません。

7.

7 Section 28 ピボットテーブル(2) ⑱ データ名.astype({“列名”:データ型}) そこで、セクション 8の⑱を用い、欠損値のデータ型を文字列型に変換(キャスト)したものを id_pos11_missing_2と宣言します。 「価格帯」が、「NaN」から「nan」に変化しました。 ちなみに、データ型を確認すると「object」になっています。これは、Pandasの性質なので、しょう がないですね。

8.

8 Section 28 ピボットテーブル(2) 4.置換 次に、文字列型の「nan」を、文字列型の「null」に置き換えていきます。 文字や数値を置換するには、「replace」を使います。 77 データ名.replace(“元の要素”, “新しい要素”) 「replace」をつかうと、置換された結果が表示されますが、元のDataFrameが変更されたわけ ではありません。引数「inplace=True」を加えると元のDataFrameが変更されます。

9.

9 Section 28 ピボットテーブル(2) 77 データ名.replace(“元の要素”, “新しい要素”) 「価格帯」を文字型にした「id_pos11_missing_2」の「価格帯」の「nan」を「null」に変換して いきましょう。 確かに置換されたことが確認できました。

10.

10 Section 28 ピボットテーブル(2) ⑱ データ名.astype({“列名”:データ型}) 77 データ名.replace(“元の要素”, “新しい要素”) 欠損値が「null」に置換されていることが確認できましたので、同様な処理を「id_pos11」で行い、 その結果を「id_pos14_1」と宣言します。

11.

11 Section 28 ピボットテーブル(2) 75 データ名.pivot_table(index=“列名1”, value=“列名2” , aggfunc=‘関数’, 他の引数) 欠損値を「null」に変換した「id_pos14_1」をピボットテーブルで集計し、「 id_pos14_2」と宣言 します。 index(まとめる項目)に「価格帯」、 columns(分割する項目)は省略、 values(計算する値)に「Total」、関数に「sum」を使います。総計の行も追加します。

12.

12 Section 28 ピボットテーブル(2) 75 データ名.pivot_table(index=“列名1”, value=“列名2” , aggfunc=‘関数’, 他の引数) 「id_pos14_2」をコピーし、 「id_pos14_3」とし、その各行を総計の「7302820.154」で割った 値の列「比率」を追加しましょう。これで、円グラフの数値と比較できます。円グラフの数値は、正 しく算出されていますね(円グラフは%ですから、100を掛けたものになります)。

13.

13 Section 28 ピボットテーブル(2) 5.apply+lambda 価格帯ごとの比率を求める表が出来上がりましたが、せっかくですから、データフレームの各行に 対して関数を適用する「apply」と1行で記載できる関数を定義する「lambda」を組み合わせて 一気に比率を求める表を作成してみましょう。 データ名. apply (関数, axis=1) lambda 引数:処理内容 半角スペース 自分で作成した関数を定義して、それを各行に適用する手法は、機械学習のプログラムを行う 時によく使いますから、今後のさらなる学習のために、その基本形を押さえていきましょう。

14.

14 Section 28 ピボットテーブル(2) 6.apply applyは、データフレームの各行、もしくは各列に対して関数を適用するものです。 「axis=1」ならば「各行」、「axis=0」ならば「各列」に関数を適用させます。 78 データ名.apply(関数, axis=1) 7.lambda 1行で書き切れる簡単な関数は、「lambda」を使います。 「lambda」は無名関数とも呼ばれ、 lambdaで始まるプログラムは複数行にまたがって記述はで きません。 79 lambda 引数:処理内容 「lambda」と「引数」の間は、必ず半角スペースを入れてください。 また、復習になりますが、関数とは予め決められている計算や処理のこと、引数とは関数で使わ れる数値などのデータのことです。

15.

15 Section 28 ピボットテーブル(2) 78 データ名.apply(関数, axis=1) 79 lambda 引数:処理内容 「pivot_table」に、カンマで続けて、78、79のプログラムを書くと、一気に価格帯ごとの比率を求 めることができます。

16.

16 Section 28 ピボットテーブル(2) 参考 グラフ・集計表のまとめ データを「見える化」するためのグラフ・集計表は、下記のように使い分けます。 ※ 箱ひげ図は割愛しましたので、図に参考資料のリンクを貼ってあります。 1変量 2変量 比率 円グラフ 状態・比較 ヒストグラム・棒グラフ 推移 折れ線グラフ 量×量 散布図 質×量 箱ひげ図 質×質 クロス集計表 出典:星野崇宏,上田雅夫. 「マーケティング・リサーチ入門 」. 有斐閣, 2018, p51