【問52~問53】データサイエンス100本ノック 解説

※アフィリエイト広告を利用しています。

ファイル

はじめに

問52~問53のコードの説明を初心者や初学者でもわかるような方法でまとめました。

データサイエンス100本ノックのはじめ方は、以下のブログ記事を参考にしてください。

>>【Google Colabはじめ方】データサイエンス100本ノックーデータサイエンティスト協会

問52 レシート明細データフレーム(df_receipt)の売上金額(amount)を顧客ID(customer_id)ごとに合計の上、売上金額合計に対して2,000円以下を0、2,000円より大きい金額を1に2値化し、顧客ID、売上金額合計とともに10件表示せよ。ただし、顧客IDが”Z”から始まるのものは非会員を表すため、除外して計算すること。

まず、「(df_receipt)の売上金額(amount)を顧客ID(customer_id)ごとに合計」したデータフレームを作成します。なお、「顧客IDが“Z”から始まるのものは非会員を表すため、除外」します。

この処理は、問34、問35、問38、問39で使用したものと同じです。

df_sales_amount = df_receipt.query('not customer_id.str.startswith("Z") ',engine='python').groupby('customer_id').amount.sum().reset_index()

次に、売上金額合計に対して2,000円以下を0、2,000円より大きい金額を1に2値化したカラムを作成し、顧客ID、売上金額合計とともに10件表示します。

2値化したカラムをsales_flagとし、「売上金額合計に対して2,000円以下を0、2,000円より大きい金額を1」については、df.apply(lambda 引数: 返り値)を用いて表示します。

df_sales_amount['sales_flag'] = df_sales_amount['amount'].apply(lambda x:1 if x > 2000 else 0)

問53 顧客データフレーム(df_customer)の郵便番号(postal_cd)に対し、東京(先頭3桁が100〜209のもの)を1、それ以外のものを0に2値化せよ。さらにレシート明細データフレーム(df_receipt)と結合し、全期間において売上実績がある顧客数を、作成した2値ごとにカウントせよ。

顧客データフレーム(df_customer)の郵便番号(postal_cd)に対し、2値化した後に全期間において売上実績がある顧客数をカウントします。

まずは、df_customerからcustomer_idとpostal_cdを抽出します(のちに結合するときにcustomer_idをキーとするため)。

df_tmp = df_customer[['customer_id','postal_cd']]

このデータフレームに対し、postal_flgというカラムを作成し、その中身は、postal_cdの先頭3桁が100〜209となっているものは1、それ以外のものは0とするのでlambda式を用います。

“123-4567“という文字列から先頭の3桁を抽出するには、xは、スライスを使って抽出します。

ただし、100〜209という数字の範囲でないと抽出できないため、int型に変換する必要があります。

df_tmp['postal_flag'] = df_tmp['postal_cd'].apply(lambda x:1 if 100 <= int(x[0:3]) <= 209 else 0)

以下の警告文は.copyを用いてdf_tmpを最初にセットすれば消えます。

/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:2: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

次に、上記のものをレシート明細データフレーム(df_receipt)とmergeで結合します。

df_merge = pd.merge(df_tmp,df_receipt,how='inner',on='customer_id')

最後に、全期間において売上実績がある顧客数を、作成した2値ごとにカウントする方法ですが、groupby()を用いて、postal_flgでグルーピングし、customer_idの数を集計します。

df_merge.groupby('postal_flg').agg({'customer_id':'nunique'})

Pythonのコードやライブラリーについて知りたい場合

Pythonはデータ分析でよく使われている言語です。

この機会にPythonのコードの打ち方・ライブラリーについてもっと知りたいと思った方は、以下のブログ記事をご覧ください。

独学でデータ分析をしている方へ

機械学習やデータサイエンス・データ分析を独学で学ぶには、どうしたらよいかをまとめてみましたので、興味がある方はこちらのブログ記事をご覧ください。