
- はじめに
- 問87 顧客データフレーム(df_customer)では、異なる店舗での申込みなどにより同一顧客が複数登録されている。名前(customer_name)と郵便番号(postal_cd)が同じ顧客は同一顧客とみなし、1顧客1レコードとなるように名寄せした名寄顧客データフレーム(df_customer_u)を作成せよ。ただし、同一顧客に対しては売上金額合計が最も高いものを残すものとし、売上金額合計が同一もしくは売上実績がない顧客については顧客ID(customer_id)の番号が小さいものを残すこととする。
- 問88 前設問で作成したデータを元に、顧客データフレームに統合名寄IDを付与したデータフレーム(df_customer_n)を作成せよ。ただし、統合名寄IDは以下の仕様で付与するものとする。
- 問89 売上実績がある顧客に対し、予測モデル構築のため学習用データとテスト用データに分割したい。それぞれ8:2の割合でランダムにデータを分割せよ。
- Pythonのコードやライブラリーについて知りたい場合
- 独学でデータ分析をしている方へ
はじめに
問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_customerとdf_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_xとcustomer_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のコードの打ち方・ライブラリーについてもっと知りたいと思った方は、以下のブログ記事をご覧ください。
データ分析入門・データサイエンス初心者・初学者向けにデータ分析でよく使うPythonをまとめました。
>>【データ分析初心者】Python構文~if文、format記法とf文字列~
>>【データ分析初心者】Python構文~for文、range関数、zip関数、enumerate関数~
>>【データ分析初心者】Python構文~無名関数lambda式、内包表記、map関数~
>>【データ分析初心者】Pandas~loc[]、iloc[]、スライス、drop()、isin()~
>>【データ分析初心者】Matplotlib、Seabornーscatter、hist、countplot 、barplot
独学でデータ分析をしている方へ
機械学習やデータサイエンス・データ分析を独学で学ぶには、どうしたらよいかをまとめてみましたので、興味がある方はこちらのブログ記事をご覧ください。
