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

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

ファイル
  1. はじめに
  2. 問59 レシート明細データフレーム(df_receipt)の売上金額(amount)を顧客ID(customer_id)ごとに合計し、売上金額合計を平均0、標準偏差1に標準化して顧客ID、売上金額合計とともに表示せよ。標準化に使用する標準偏差は、不偏標準偏差と標本標準偏差のどちらでも良いものとする。ただし、顧客IDが”Z”から始まるのものは非会員を表すため、除外して計算すること。結果は10件表示させれば良い。
  3. 問60 レシート明細データフレーム(df_receipt)の売上金額(amount)を顧客ID(customer_id)ごとに合計し、売上金額合計を最小値0、最大値1に正規化して顧客ID、売上金額合計とともに表示せよ。ただし、顧客IDが”Z”から始まるのものは非会員を表すため、除外して計算すること。結果は10件表示させれば良い。
  4. 問61 レシート明細データフレーム(df_receipt)の売上金額(amount)を顧客ID(customer_id)ごとに合計し、売上金額合計を常用対数化(底=10)して顧客ID、売上金額合計とともに表示せよ。ただし、顧客IDが”Z”から始まるのものは非会員を表すため、除外して計算すること。結果は10件表示させれば良い。
  5. 問62 レシート明細データフレーム(df_receipt)の売上金額(amount)を顧客ID(customer_id)ごとに合計し、売上金額合計を自然対数化(底=e)して顧客ID、売上金額合計とともに表示せよ。ただし、顧客IDが”Z”から始まるのものは非会員を表すため、除外して計算すること。結果は10件表示させれば良い。
  6. Pythonのコードやライブラリーについて知りたい場合
  7. 独学でデータ分析をしている方へ

はじめに

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

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

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

問59 レシート明細データフレーム(df_receipt)の売上金額(amount)を顧客ID(customer_id)ごとに合計し、売上金額合計を平均0、標準偏差1に標準化して顧客ID、売上金額合計とともに表示せよ。標準化に使用する標準偏差は、不偏標準偏差と標本標準偏差のどちらでも良いものとする。ただし、顧客IDが”Z”から始まるのものは非会員を表すため、除外して計算すること。結果は10件表示させれば良い。

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

これは、問52と同じ処理です。

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

次に、売上金額合計平均0標準偏差1標準化します。

なお、その標準偏差は、不偏標準偏差標本標準偏差どちらでも良いものとされています。

まずは、標準偏差について勉強していきましょう。

平均からの隔たりの大きさを表す偏差があります。

偏差」は個々のデータの散らばりを示す事ができますが、データ全体の散らばりを見る時、単純に「偏差」の平均を求めるだけではうまくいきません

なぜなら、「偏差」の平均は必ず0になるので、データ全体の散らばりを比較することができなくなるからです。

そこで、それぞれの「偏差」を2乗し、マイナスの値をなくした上で全てを足し合わせた値偏差二乗和)の平均を求めることで、データ全体の散らばりの程度を図ることができます。

これを「分散」と言います。

ただし、「分散」は「偏差」の2乗なので、平均を比較したりすることはできません

例えば、100人の年齢の平均50歳だとして、分散の単位はその2乗になるので、250です。

これでは、次元が異なるため、平均と分散の値をそのまま比較したり計算したりすることはできません

そこで、同じ次元にそろえるため、「分散」の正の平方根をとります。この値が「標準偏差」です。

それでは、平均0に、標準偏差1とするpreprocessing.scale()を使用して、売上金額合計平均0標準偏差1標準化します。

df_sales_amount['amount_sss'] = preprocessing.scale(df_sales_amount['amount'])

問60 レシート明細データフレーム(df_receipt)の売上金額(amount)を顧客ID(customer_id)ごとに合計し、売上金額合計を最小値0、最大値1に正規化して顧客ID、売上金額合計とともに表示せよ。ただし、顧客IDが”Z”から始まるのものは非会員を表すため、除外して計算すること。結果は10件表示させれば良い。

はじめにやる処理は問59と同じです。

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

本問は、売上金額合計最小値0最大値1正規化する必要があります。

それには、最小値0最大値1正規化するpreprocessing.minmax_scale()を使用します。

df_sales_amount['amount_mm'] = preprocessing.minmax_scale(df_sales_amount['amount'])

問61 レシート明細データフレーム(df_receipt)の売上金額(amount)を顧客ID(customer_id)ごとに合計し、売上金額合計を常用対数化(底=10)して顧客ID、売上金額合計とともに表示せよ。ただし、顧客IDが”Z”から始まるのものは非会員を表すため、除外して計算すること。結果は10件表示させれば良い。

はじめの処理は、問59問60と同じです。

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

本問は、売上金額合計常用対数化(底=10)する必要があります。

np.log10()を使用すれば、常用対数(底=10)に変換できます。

なお、’amount‘には、もあります。

対数化するデータの中に0含まれている場合は計算できないので、1を加えてください。

df_sales_amount['amount_log10'] = np.log10(df_sales_amount['amount']+1)

問62 レシート明細データフレーム(df_receipt)の売上金額(amount)を顧客ID(customer_id)ごとに合計し、売上金額合計を自然対数化(底=e)して顧客ID、売上金額合計とともに表示せよ。ただし、顧客IDが”Z”から始まるのものは非会員を表すため、除外して計算すること。結果は10件表示させれば良い。

はじめの処理は、同じです。

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

本問は、売上金額合計自然対数化(底=e)する必要があります。

np.log()を使用すれば、常用対数(底=e)に変換できます。

こちらも、データに0が含まれる場合は、変換できるように+1してください。

df_sales_amount['amount_loge'] = np.log(df_sales_amount['amount']+1)

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

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

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

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

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