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

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

ファイル

はじめに

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

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

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

問75 顧客データフレーム(df_customer)からランダムに1%のデータを抽出し、先頭から10件データを抽出せよ。

またはランダムに抽出するsample()を使用します。

引数flacには、抽出する割合を指定します。

今回は、1%なのでflac⁼0.01です。

df_customer.sample(frac=0.01).head(10)

問76 顧客データフレーム(df_customer)から性別(gender_cd)の割合に基づきランダムに10%のデータを層化抽出し、性別ごとに件数を集計せよ。

層化抽出というのは、母集団をいくつかのグループ)に分割し、それらのから標本を抽出する方法をいいます。

例えば、あるデータの80%男性20%女性だった場合、データからランダム5つのグループを抽出する時に、男性グループのデータを4つ(80%)女性グループのデータを1つ(20%)抽出する方法です。

層化抽出には、train_test_split()を使用します。

train_test_split()は、機械学習を行う際に、訓練データテストデータ二分割するときによく用いられます。

今回は10%のデータを取り出すため、10%90%にデータに分割しますが、90%の方のデータは使いません

そのため、コードの文頭に返り値を求めない_を入れて、で区切ります。

10%抽出する場合は、引数test_size=0.1にします。

引数stratify均等に分割させたいデータを指定すると、そのデータの値の比率が元のデータと一致するように分割されます。

_,df_tmp = train_test_split(df_customer,test_size=0.1,stratify=df_customer['gender_cd'])

性別ごとに件数を集計しないといけないので、以下のようにします。

df_tmp.groupby('gender_cd').agg({'customer_id':'count'})

問77 レシート明細データフレーム(df_receipt)の売上金額(amount)を顧客単位に合計し、合計した売上金額の外れ値を抽出せよ。ただし、顧客IDが”Z”から始まるのものは非会員を表すため、除外して計算すること。なお、ここでは外れ値を平均から3σ以上離れたものとする。結果は10件表示させれば良い。

レシート明細データフレーム(df_receipt)の売上金額(amount)を顧客IDが”Z”から始まるのものは非会員を表すため、除外して、顧客単位合計する方法は、問52と同じです。

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

次に、上記の合計した売上金額から外れ値平均から3σ以上離れたもの)を10件抽出する必要があります。

そのためにはまず、外れ値を検出するには、平均を0に、標準偏差を1になるpreprocessing.StandardScaler()標準化します。

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

データを見てみるとの数値があるので、abs()を用いて絶対値とした上で、平均値から3σ以上離れたデータ10件抽出します。

df_sales_amount.query('abs(amount_ss) >= 3').head(10)

問78 レシート明細データフレーム(df_receipt)の売上金額(amount)を顧客単位に合計し、合計した売上金額の外れ値を抽出せよ。ただし、顧客IDが”Z”から始まるのものは非会員を表すため、除外して計算すること。なお、ここでは外れ値を第一四分位と第三四分位の差であるIQRを用いて、「第一四分位数-1.5×IQR」よりも下回るもの、または「第三四分位数+1.5×IQR」を超えるものとする。結果は10件表示させれば良い。

レシート明細データフレーム(df_receipt)の売上金額(amount)を顧客IDが“Z”から始まるのものは非会員を表すため、除外して、顧客単位合計する方法は、問77と同じですね。

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

違う点は、外れ値第一四分位第三四分位であるIQRを用いて、「第一四分位数-1.5×IQR」よりも下回るもの、または「第三四分位数+1.5×IQR」を超えるものとする点ですね。

まず、第一四分位第三四分位を作成します。これは、問55でやりました。

pct25 = np.quantile(df_sales_amount['amount'],0.25)
pct75 = np.quantile(df_sales_amount['amount'],0.75)

次に、第一四分位第三四分位であるIQRも作成します。

iqr = pct75 - pct25

そして、「第一四分位数-1.5×IQR」よりも下回るもの、または「第三四分位数+1.5×IQR」を超えるものを作成します。

amount_low = pct25 - (iqr * 1.5)
amount_hight = pct75 + (iqr * 1.5)

最後に、上記外れ値10件表示します。なお、今回はquery内の条件式変数であるamount_lowamount_hight使用していますので、変数名の前に「@」を付けてください。

df_sales_amount.query('amount < @amount_low or @amount_hight < amount').head(10)

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

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

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

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

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