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

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

ファイル

はじめに

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

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

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

問87 顧客データフレーム(df_customer)では、異なる店舗での申込みなどにより同一顧客が複数登録されている。名前(customer_name)と郵便番号(postal_cd)が同じ顧客は同一顧客とみなし、1顧客1レコードとなるように名寄せした名寄顧客データフレーム(df_customer_u)を作成せよ。ただし、同一顧客に対しては売上金額合計が最も高いものを残すものとし、売上金額合計が同一もしくは売上実績がない顧客については顧客ID(customer_id)の番号が小さいものを残すこととする。

1顧客1レコードとなるように名寄せした名寄顧客データフレーム(df_customer_u)を作成するために、まず、顧客ごと売上金額合計を算出します。

df_tmp = df_receipt.groupby('customer_id').amount.sum().reset_index()

次に、「同一顧客に対しては売上金額合計が最も高いものを残すものとし、売上金額合計が同一もしくは売上実績がない顧客については顧客ID(customer_id)の番号が小さいものを残す」ために、顧客データフレーム(df_customer)に上記df_tmp左外部結合し、df_customer_uに格納します。

また、amount高い順(降順)にし、顧客IDは番号が小さい順(昇順)でソートします。

df_customer_u = pd.merge(df_customer,df_tmp,how='inner',on='customer_id').sort_values(['amount','customer_id'],ascending=[False,True])

最後に、同一顧客に対しては売上金額合計が最も高いものを残すために、drop_duplicates()を使用し、重複した要素削除します。

df_customer_u.drop_duplicates(subset=['customer_name','postal_cd'],keep='first',inplace=True)

問88 前設問で作成したデータを元に、顧客データフレームに統合名寄IDを付与したデータフレーム(df_customer_n)を作成せよ。ただし、統合名寄IDは以下の仕様で付与するものとする。

  • 重複していない顧客:顧客ID(customer_id)を設定
  • 重複している顧客:前設問で抽出したレコードの顧客IDを設定

前設問で作成したdf_customer_uを元に、顧客データフレーム(df_customer)に統合名寄IDを付与したデータフレーム(df_customer_n)を作成するために、まず、df_customerdf_customer_u内部結合します。

df_customer_n = pd.merge(df_customer, df_customer_u[['customer_name', 'postal_cd', 'customer_id']], how='inner', on=['customer_name', 'postal_cd'])

df_customer_nをみると、customer_id_xcustomer_id_yがありますので、カラム名を変更します。

yのほうが、df_customer_uで所持していたcustomer_idなので、こちらを前設問で抽出したレコードの顧客ID(integration_id)とします。

df_customer_n.rename(columns={'customer_id_x':'customer_id', 'customer_id_y':'integration_id'}, inplace=True)

P-閑話: df_customer_1, df_customer_nは使わないので削除する。

del df_customer_1

del df_customer_n

問89 売上実績がある顧客に対し、予測モデル構築のため学習用データとテスト用データに分割したい。それぞれ8:2の割合でランダムにデータを分割せよ。

売上実績がある顧客のデータフレームを作成します。

df_tmp = df_receipt.groupby('customer_id').amount.sum().reset_index()
df_tmp = pd.merge(df_customer,df_tmp['customer_id'],how='inner',on='customer_id')

予測モデル構築のため学習用データテスト用データに分割するために、train_test_splitを使用します。

df_train, df_test = train_test_split(df_tmp, test_size=0.2,random_state=1)

学習用データとテスト用データが8:2の割合となっているか確認します。

print('学習データ割合:', len(df_train) / len(df_tmp))
print('テストデータ割合:', len(df_test) / len(df_tmp))

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

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

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

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

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