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

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

ファイル

はじめに

問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_ymd6番目までを抽出します。

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に金額があるものは1NaNには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_productdf_categorycategory_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コードの打ち方・ライブラリーについてもっと知りたいと思った方は、以下のブログ記事をご覧ください。

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

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