【解説】データサイエンス100本ノック【問69回答】

【解説】データサイエンス100本ノック【問69回答】





目次


データサイエンス100本ノックの始め方

データサイエンス100本ノックの始め方は、以下の記事を参考にしていただければと思います。


>>データサイエンス100本ノックの始め方を確認する


第69問目: 集計と結果の表示

P-069: レシート明細データフレーム(df_receipt)と商品データフレーム(df_product)を結合し、顧客毎に全商品の売上金額合計と、カテゴリ大区分(category_major_cd)が”07”(瓶詰缶詰)の売上金額合計を計算の上、両者の比率を求めよ。抽出対象はカテゴリ大区分”07”(瓶詰缶詰)の購入実績がある顧客のみとし、結果は10件表示させればよい。

まずは、レシート明細データフレーム(df_receipt)と商品データフレーム(df_product)の構造を確認します。

df_receiptの構造を確認
1
df_receipt.head(5)
出力
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
df_productの構造を確認
1
df_product.head(5)
出力
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
出力
1
{'product_cd'}

共通的なカラムとして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_cd07となっているデータを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_receiptdf_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といった各種メソッドの使い方を復習する位置づけの問題だったかと思います。

本記事で紹介した方法を元にデータサイエンティストとしての知見を深めていただければと思います。

なお、データサイエンティストに必要な知識は、Udemyを活用した学習が効率的です。30日間の返金保証、および一流講師へのQ&Aシステムが整ったオンライン学習プラットフォームです。

不定期で90%以上の割引セールも行っているので無料会員登録だけでも実施しておくといいと思います。

世界で34万人が受講した以下の講座をご確認ください。

【世界で34万人が受講】データサイエンティストを目指すあなたへ〜データサイエンス25時間ブートキャンプ〜

コメント