当ページのリンクには広告が含まれています。
目次
データサイエンス100本ノックの始め方
データサイエンス100本ノックの始め方は、以下の記事を参考にしていただければと思います。
>>データサイエンス100本ノックの始め方を確認する
第69問目: 集計と結果の表示
P-069: レシート明細データフレーム(df_receipt)と商品データフレーム(df_product)を結合し、顧客毎に全商品の売上金額合計と、カテゴリ大区分(category_major_cd)が”07”(瓶詰缶詰)の売上金額合計を計算の上、両者の比率を求めよ。抽出対象はカテゴリ大区分”07”(瓶詰缶詰)の購入実績がある顧客のみとし、結果は10件表示させればよい。
まずは、レシート明細データフレーム(df_receipt)と商品データフレーム(df_product)の構造を確認します。
出力1 2 3 4 5 6
| sales_ymd sales_epoch store_cd receipt_no receipt_sub_no customer_id product_cd quantity amount 0 20181103 1541203200 S14006 112 1 CS006214000001 P070305012 1 158 1 20181118 1542499200 S13008 1132 2 CS008415000097 P070701017 1 81 2 20170712 1499817600 S14028 1102 1 CS028414000014 P060101005 1 170 3 20190205 1549324800 S14042 1132 1 ZZ000000000000 P050301001 1 25 4 20180821 1534809600 S14025 1102 2 CS025415000050 P060102007 1 90
|
出力1 2 3 4 5 6
| product_cd category_major_cd category_medium_cd category_small_cd unit_price unit_cost 0 P040101001 04 0401 040101 198.0 149.0 1 P040101002 04 0401 040101 218.0 164.0 2 P040101003 04 0401 040101 230.0 173.0 3 P040101004 04 0401 040101 248.0 186.0 4 P040101005 04 0401 040101 268.0 201.0
|
両者のデータフレームの結合を考えます。mergeを使うのかconcatのどちらを使うのかを判断するために、2つのデータフレームに共通的なカラムが存在するかを確認します。
mergeとconcatの解説はこちら
共通的なカラムの存在を確認する1 2 3 4
| df_receipt_columns = df_receipt.columns df_product_columns = df_product.columns df_and = set(df_receipt_columns) & set(df_product_columns) df_and
|
共通的なカラムとしてproduct_cd
が存在していることがわかったためmerge
を用いて結合します。
その上で顧客ごとに全商品の売上金額の合計を算出します。
内部結合とは何かを確認する
mergeを用いて内部結合1 2
| df_tmp_1 = pd.merge(df_receipt, df_product, how='inner', on='product_cd').groupby('customer_id').agg({'amount':'sum'}).reset_index() df_tmp_1
|
出力1 2 3 4 5 6 7 8 9 10 11 12 13
| customer_id amount 0 CS001113000004 1298 1 CS001114000005 626 2 CS001115000010 3044 3 CS001205000004 1988 4 CS001205000006 3337 ... ... ... 8302 CS051513000004 551 8303 CS051515000002 265 8304 CS052212000002 192 8305 CS052514000001 178 8306 ZZ000000000000 12395003 8307 rows × 2 columns
|
次にcategory_major_cd
が07
となっているデータをquery
メソッドを用いて抽出します。
queryメソッドの使い方を確認する
queryメソッドでcategory_mafor_cdが07となっているデータを抽出1 2
| df_product_07 = df_product.query('category_major_cd == "07"') df_product_07.head(10)
|
出力1 2 3 4 5 6 7 8 9 10 11
| product_cd category_major_cd category_medium_cd category_small_cd unit_price unit_cost 1609 P070101001 07 0701 070101 38.0 29.0 1610 P070101002 07 0701 070101 45.0 34.0 1611 P070101003 07 0701 070101 48.0 36.0 1612 P070101004 07 0701 070101 55.0 41.0 1613 P070101005 07 0701 070101 70.0 53.0 1614 P070101006 07 0701 070101 75.0 56.0 1615 P070101007 07 0701 070101 75.0 56.0 1616 P070101008 07 0701 070101 78.0 59.0 1617 P070101009 07 0701 070101 78.0 59.0 1618 P070101010 07 0701 070101 80.0 60.0
|
df_receipt
とdf_product_07
内部結合し顧客毎の売上金額の合計値を算出します。これで瓶詰缶詰の売上金額合計のデータフレームが作成されます。
df_receiptとdf_product_07内部結合し顧客毎の売上金額の合計値を算出1 2
| df_tmp_2 = pd.merge(df_receipt, df_product_07, how='inner', on='product_cd').groupby('customer_id').agg({'amount':'sum'}).reset_index() df_tmp_2.head(10)
|
出力1 2 3 4 5 6 7 8 9 10 11
| customer_id amount 0 CS001113000004 1298 1 CS001114000005 486 2 CS001115000010 2694 3 CS001205000004 346 4 CS001205000006 2004 5 CS001212000027 200 6 CS001212000031 296 7 CS001212000046 108 8 CS001212000070 308 9 CS001213000018 145
|
df_tmp_1とdf_tmp_2を共通カラムをcustomer_id
に指定して内部結合を行います。
df_tmp_1とdf_tmp_2を共通カラムをcustomer_idに指定して内部結合1 2
| df_tmp_3 = pd.merge(df_tmp_1, df_tmp_2, how='inner', on='customer_id') df_tmp_3
|
出力1 2 3 4 5 6 7 8 9 10 11 12 13
| customer_id amount_x amount_y 0 CS001113000004 1298 1298 1 CS001114000005 626 486 2 CS001115000010 3044 2694 3 CS001205000004 1988 346 4 CS001205000006 3337 2004 ... ... ... ... 6860 CS051212000001 336 68 6861 CS051513000004 551 233 6862 CS052212000002 192 102 6863 CS052514000001 178 68 6864 ZZ000000000000 12395003 6943009 6865 rows × 3 columns
|
出力結果のうち、amount_xとなっているのが、全商品の売上金額合計で、amount_yが瓶詰缶詰の売上金額合計になります。
両者の比率を算出し、rate_07
という新たなカラムに格納します。
1 2
| df_tmp_3['rate_07'] = df_tmp_3['amount_y'] / df_tmp_3['amount_x'] df_tmp_3.head(10)
|
出力1 2 3 4 5 6 7 8 9 10 11
| customer_id amount_x amount_y rate_07 0 CS001113000004 1298 1298 1.000000 1 CS001114000005 626 486 0.776358 2 CS001115000010 3044 2694 0.885020 3 CS001205000004 1988 346 0.174044 4 CS001205000006 3337 2004 0.600539 5 CS001212000027 448 200 0.446429 6 CS001212000031 296 296 1.000000 7 CS001212000046 228 108 0.473684 8 CS001212000070 456 308 0.675439 9 CS001213000018 243 145 0.596708
|
これで完成です。
まとめ: データサイエンス100本ノックの69問目の解法を説明しました
本記事は、「【解説】データサイエンス100本ノック【問69回答】」というテーマでまとめました。
これまで学んできたmergeやqueryといった各種メソッドの使い方を復習する位置づけの問題だったかと思います。
本記事で紹介した方法を元にデータサイエンティストとしての知見を深めていただければと思います。
なお、データサイエンティストに必要な知識は、TechAcademyのデータサイエンスコースでの学習がおすすめです。