

データサイエンティスト協会の100本ノックがGitHubに公開しているデータとPythonコードを初心者にでも分かるように解説していきます。
今回は58~64本です。内容は主に、データから新たなデータを作成する「変数を変える方法」について解説していきます。
Pythonの環境設定は以下の記事を参考にして下さい。
【2021年最新】M1 mac でanacondaをインストールする方法
【2021年最新】WindowsでAnacondaをインストールする方法
- 変数を変える
- P-058: 顧客データフレーム(df_customer)の性別コード(gender_cd)をダミー変数化し、顧客ID(customer_id)とともに抽出せよ。結果は10件表示させれば良い。
- P-059: レシート明細データフレーム(df_receipt)の売上金額(amount)を顧客ID(customer_id)ごとに合計し、合計した売上金額を平均0、標準偏差1に標準化して顧客ID、売上金額合計とともに表示せよ。標準化に使用する標準偏差は、不偏標準偏差と標本標準偏差のどちらでも良いものとする。ただし、顧客IDが”Z”から始まるのものは非会員を表すため、除外して計算すること。結果は10件表示させれば良い。
- P-060: レシート明細データフレーム(df_receipt)の売上金額(amount)を顧客ID(customer_id)ごとに合計し、合計した売上金額を最小値0、最大値1に正規化して顧客ID、売上金額合計とともに表示せよ。ただし、顧客IDが”Z”から始まるのものは非会員を表すため、除外して計算すること。結果は10件表示させれば良い。
- P-061: レシート明細データフレーム(df_receipt)の売上金額(amount)を顧客ID(customer_id)ごとに合計し、合計した売上金額を常用対数化(底=10)して顧客ID、売上金額合計とともに表示せよ。ただし、顧客IDが”Z”から始まるのものは非会員を表すため、除外して計算すること。結果は10件表示させれば良い。
- P-062: レシート明細データフレーム(df_receipt)の売上金額(amount)を顧客ID(customer_id)ごとに合計し、合計した売上金額を自然対数化(底=e)して顧客ID、売上金額合計とともに表示せよ。ただし、顧客IDが”Z”から始まるのものは非会員を表すため、除外して計算すること。結果は10件表示させれば良い。
- P-063: 商品データフレーム(df_product)の単価(unit_price)と原価(unit_cost)から、各商品の利益額を算出せよ。結果は10件表示させれば良い。
- P-064: 商品データフレーム(df_product)の単価(unit_price)と原価(unit_cost)から、各商品の利益率の全体平均を算出せよ。 ただし、単価と原価にはNULLが存在することに注意せよ。
変数を変える
まずは、以下からダウンロードして下さい。
P-058: 顧客データフレーム(df_customer)の性別コード(gender_cd)をダミー変数化し、顧客ID(customer_id)とともに抽出せよ。結果は10件表示させれば良い。
import pandas as pd df_customer = pd.read_csv("customer.csv") pd.get_dummies(df_customer[["customer_id","gender_cd"]],columns=["gender_cd"]).head(10)
カテゴリ変数は機械学習する前にダミー変数化します。
【Python初心者】カテゴリ変数をダミー変数に置き変える方法|機械学習に必要な前処理
P-059: レシート明細データフレーム(df_receipt)の売上金額(amount)を顧客ID(customer_id)ごとに合計し、合計した売上金額を平均0、標準偏差1に標準化して顧客ID、売上金額合計とともに表示せよ。標準化に使用する標準偏差は、不偏標準偏差と標本標準偏差のどちらでも良いものとする。ただし、顧客IDが”Z”から始まるのものは非会員を表すため、除外して計算すること。結果は10件表示させれば良い。
from sklearn import preprocessing df_receipt = pd.read_csv("receipt.csv") df_59 = df_receipt.query("not customer_id.str.startswith('Z')", engine="python") df_59 = df_59.groupby("customer_id").amount.sum().reset_index() df_59["amount_ss"] = preprocessing.scale(df_59["amount"]) df_59.head(10)
新しいデータセットの中身を確認してみましょう。
平均値が0,標準偏差が1となっており、標準化できていることが分かります。
P-060: レシート明細データフレーム(df_receipt)の売上金額(amount)を顧客ID(customer_id)ごとに合計し、合計した売上金額を最小値0、最大値1に正規化して顧客ID、売上金額合計とともに表示せよ。ただし、顧客IDが”Z”から始まるのものは非会員を表すため、除外して計算すること。結果は10件表示させれば良い。
from sklearn.preprocessing import minmax_scale df_60 = df_receipt.query("not customer_id.str.startswith('Z')", engine="python") df_60 = df_60.groupby("customer_id").amount.sum().reset_index() df_60["amount_ss"] = minmax_scale(df_60["amount"]) df_60.head(10)
データの中身を確認してみましょう。
最小値が0,最大値が1になっており、正規化できていることが分かります。
【Python初心者】正規化・標準化する方法|機械学習に必要な前処理
P-061: レシート明細データフレーム(df_receipt)の売上金額(amount)を顧客ID(customer_id)ごとに合計し、合計した売上金額を常用対数化(底=10)して顧客ID、売上金額合計とともに表示せよ。ただし、顧客IDが”Z”から始まるのものは非会員を表すため、除外して計算すること。結果は10件表示させれば良い。
import numpy as np df_61 = df_receipt.query("not customer_id.str.startswith('Z')", engine="python") df_61 = df_61.groupby("customer_id").amount.sum().reset_index() df_61["amount_log10"] = np.log10(df_61["amount"]) df_61.head(10)
np.log10 とするだけで、常用対数化ができます。
常用対数化した数値をもとに戻すには、10に常用対数化した数値をべき乗すればよいです。
きちんと、1298 と元に戻りましたね。
P-062: レシート明細データフレーム(df_receipt)の売上金額(amount)を顧客ID(customer_id)ごとに合計し、合計した売上金額を自然対数化(底=e)して顧客ID、売上金額合計とともに表示せよ。ただし、顧客IDが”Z”から始まるのものは非会員を表すため、除外して計算すること。結果は10件表示させれば良い。
df_62 = df_receipt.query("not customer_id.str.startswith('Z')", engine="python") df_62 = df_62.groupby("customer_id").amount.sum().reset_index() df_62["amount_loge"] = np.log(df_62["amount"]) df_62.head(10)
自然対数化するには、np.log することでできます。
もとに戻すには、ネイピア数をべき乗します。
ネイピア数の詳細は省きますが、以下のコードで表します。
np.e
出力:
2.718281828459045
P-063: 商品データフレーム(df_product)の単価(unit_price)と原価(unit_cost)から、各商品の利益額を算出せよ。結果は10件表示させれば良い。
df_63 = df_product.copy() # データをそのままコピーする df_63["unit_profit"] = df_63["unit_price"]-df_63["unit_cost"] df_63.head(10)
データセットのデータを足したり、引いたり、演算を使うことができます。
そして、そのデータをデータセットに付け加えることができます。
P-064: 商品データフレーム(df_product)の単価(unit_price)と原価(unit_cost)から、各商品の利益率の全体平均を算出せよ。 ただし、単価と原価にはNULLが存在することに注意せよ。
df_product = pd.read_csv("product.csv") df_64 = df_product.copy() df_64["unit_profit_rate"] = (df_64["unit_price"]-df_64["unit_cost"])/df_64["unit_price"] df_64["unit_profit_rate"].mean(skipna=True)
単価ーコストを単価で割ることで、利益率が分かります。
この式を新しい変数をとして、データセットに追加できます。
データサイエンティスト協会の100本ノックを解説|ダウンロードから読み込みまで
データサイエンティスト協会の100本ノックを解説|データの抽出
データサイエンティスト協会の100本ノックを解説|変数の一部を使ってデータを抽出する
データサイエンティスト協会の100本ノックを解説|ソート(順序で整列)
データサイエンティスト協会の100本ノックを解説|グループ分け
データサイエンティスト協会の100本ノック|新たなデータフレームの作成
コメント