
- はじめに
- 問90 レシート明細データフレーム(df_receipt)は2017年1月1日〜2019年10月31日までのデータを有している。売上金額(amount)を月次で集計し、学習用に12ヶ月、テスト用に6ヶ月のモデル構築用データを3セット作成せよ。
- 問91 顧客データフレーム(df_customer)の各顧客に対し、売上実績がある顧客数と売上実績がない顧客数が1:1となるようにアンダーサンプリングで抽出せよ。
- 問92 顧客データフレーム(df_customer)では、性別に関する情報が非正規化の状態で保持されている。これを第三正規化せよ。
- 問93 商品データフレーム(df_product)では各カテゴリのコード値だけを保有し、カテゴリ名は保有していない。カテゴリデータフレーム(df_category)と組み合わせて非正規化し、カテゴリ名を保有した新たな商品データフレームを作成せよ。
- Pythonのコードやライブラリーについて知りたい場合
- 独学でデータ分析をしている方へ
はじめに
問90~問93のコードの説明を初心者や初学者でもわかるような方法でまとめました。
データサイエンス100本ノックのはじめ方は、以下のブログ記事を参考にしてください。
>>【Google Colabはじめ方】データサイエンス100本ノックーデータサイエンティスト協会
問90 レシート明細データフレーム(df_receipt)は2017年1月1日〜2019年10月31日までのデータを有している。売上金額(amount)を月次で集計し、学習用に12ヶ月、テスト用に6ヶ月のモデル構築用データを3セット作成せよ。
df_receiptから売上金額(amount)を月次で集計するために、まずは、df_receiptから日付データであるsales_ymdと売上金額のamountを抽出します。
df_tmp = df_receipt[['sales_ymd','amount']].copy()
sales_ymというカラムを作成し、月次で集計するため、sales_ymdの6番目までを抽出します。
df_tmp['sales_ym'] = df_tmp['sales_ymd'].astype('str').str[0:6]
そして、amountを月次で集計します。
df_tmp = df_tmp.groupby('sales_ym').amount.sum().reset_index()
学習用に12ヶ月、テスト用に6ヶ月のモデル構築用データを関数を用いて3セット作成します。
def split_data(df,train_size,test_size,slide_window,start_point):
train_start = start_point * slide_window
test_start = train_start + train_size
return df[train_start : test_start],df[test_start : test_start + test_size]
df_train_1,df_test_1 = split_data(df_tmp,train_size=12,test_size=6,slide_window=6,start_point=0)
df_train_2,df_test_2 = split_data(df_tmp, train_size=12, test_size=6, slide_window=6, start_point=1)
df_train_3,df_test_3 = split_data(df_tmp, train_size=12, test_size=6, slide_window=6, start_point=2)
問91 顧客データフレーム(df_customer)の各顧客に対し、売上実績がある顧客数と売上実績がない顧客数が1:1となるようにアンダーサンプリングで抽出せよ。
まず、df_receiptから、顧客の売上合計を抽出します。
df_tmp = df_receipt.groupby('customer_id').amount.sum().reset_index()
次に、df_customerと上記df_tmpを左外部結合します。
df_tmp = pd.merge(df_customer,df_tmp,how='left',on='customer_id')
buy_flgを作成し、amountに金額があるものは1、NaNには0を表示させます。
df_tmp['buy_flg'] = df_tmp['amount'].apply(lambda x:0 if np.isnan(x) else 1)
下処理が終わりましたので、これをもとに、売上実績がある顧客数と売上実績がない顧客数が1:1となるようにアンダーサンプリングします。
サンプルに不均衡がある場合には、その不均衡を揃える必要があります。
それには、サンプルが多いデータを削減し、サンプルを均一にするという方法があり、これをアンダーサンプリングといいます。
print('アンダーサンプリング前')
print('0の件数', len(df_tmp.query('buy_flg == 0')))
print('1の件数', len(df_tmp.query('buy_flg == 1')))
0つまり、売上実績がない顧客数のほうが多いですね。それでは、アンダーサンプリングをしていきます。
rs = RandomUnderSampler(random_state=1)
df_sample, _ = rs.fit_resample(df_tmp, df_tmp.buy_flg)
それでは、結果をみてましょう。
print('アンダーサンプリング後')
print('0の件数', len(df_sample.query('buy_flg == 0')))
print('1の件数', len(df_sample.query('buy_flg == 1')))
問92 顧客データフレーム(df_customer)では、性別に関する情報が非正規化の状態で保持されている。これを第三正規化せよ。
正規化とは、データの一元管理を可能にするために、データを取り扱いやすいように設計することです。
データ間の関連性を分析し、最適なグループ化を図ることを目的としています。
正規化には第五正規化までありますが、今回は、第三正規化までが答えとなります。
それでは、以下のコードにより性別に関する情報を第三正規化してみましょう。
なお、正規化(Normalization)と言われる場合には、最小値0.0~最大値1.0にスケーリングすることを指す場合もあります。
df_gender = df_customer[['gender_cd','gender']].drop_duplicates()
df_customer_s =df_customer.drop(columns='gender')
問93 商品データフレーム(df_product)では各カテゴリのコード値だけを保有し、カテゴリ名は保有していない。カテゴリデータフレーム(df_category)と組み合わせて非正規化し、カテゴリ名を保有した新たな商品データフレームを作成せよ。
df_product内のcategory_small_cdに一致するdf_categoryのそれぞれのカテゴリ名の組み合わせなので、df_productとdf_categoryをcategory_small_cdを軸に内部結合します。
df_product_full = pd.merge(df_product,df_category[['category_small_cd',
'category_major_name',
'category_medium_name',
'category_small_name']],how='inner',on='category_small_cd')
df_product_full
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
独学でデータ分析をしている方へ
機械学習やデータサイエンス・データ分析を独学で学ぶには、どうしたらよいかをまとめてみましたので、興味がある方はこちらのブログ記事をご覧ください。
