

データサイエンティスト協会の100本ノックがGitHubに公開しているデータとPythonコードを初心者にでも分かるように解説していきます。
今回は75~78本です。内容は主に、データから新たなデータを作成する「データのサンプリング方法」について解説していきます。
Pythonの環境設定は以下の記事を参考にして下さい。
【2021年最新】M1 mac でanacondaをインストールする方法
【2021年最新】WindowsでAnacondaをインストールする方法
- データのサンプリング方法
- P-075: 顧客データフレーム(df_customer)からランダムに1%のデータを抽出し、先頭から10件データを抽出せよ。
- P-076: 顧客データフレーム(df_customer)から性別(gender_cd)の割合に基づきランダムに10%のデータを層化抽出データし、性別ごとに件数を集計せよ。
- P-077: レシート明細データフレーム(df_receipt)の売上金額(amount)を顧客単位に合計し、合計した売上金額の外れ値を抽出せよ。ただし、顧客IDが”Z”から始まるのものは非会員を表すため、除外して計算すること。なお、ここでは外れ値を平均から3σ以上離れたものとする。結果は10件表示させれば良い。
- P-078: レシート明細データフレーム(df_receipt)の売上金額(amount)を顧客単位に合計し、合計した売上金額の外れ値を抽出せよ。ただし、顧客IDが”Z”から始まるのものは非会員を表すため、除外して計算すること。なお、ここでは外れ値を第一四分位と第三四分位の差であるIQRを用いて、「第一四分位数-1.5×IQR」よりも下回るもの、または「第三四分位数+1.5×IQR」を超えるものとする。結果は10件表示させれば良い。
データのサンプリング方法
まずは、以下からダウンロードして下さい。
P-075: 顧客データフレーム(df_customer)からランダムに1%のデータを抽出し、先頭から10件データを抽出せよ。
import pandas as pd df_customer = pd.read_csv("customer.csv") df_customer.sample(frac=0.01).head(10)
samplt() 内の引数である、frac= に抽出したい割合を指定することで、一部のデータを抽出できます。ここでは、ランダムにデータが抽出されるため、出力結果のデータは毎回違うデータになりますが、割合は同じです。
P-076: 顧客データフレーム(df_customer)から性別(gender_cd)の割合に基づきランダムに10%のデータを層化抽出データし、性別ごとに件数を集計せよ。
from sklearn.model_selection import train_test_split _, df_76 = train_test_split(df_customer, # 分割するデータを指定 test_size=0.1, # 分割する割合を指定 stratify=df_customer["gender_cd"], # 分割前後でも同じ割合となる変数を指定 random_state=1) # 再現性があるようにランダムを指定 df_76.groupby("gender_cd").agg({"customer_id":"count"})
train_test_split は機械学習の分野では必ず使うものです。
ここでは、単純なデータの分割として使用します。
データの数を確認してみましょう。
もとのデータ(df_customer)、もとのデータの10%(df_76)、残りのデータび90%(_)
10%と90%に分割できていることが確認できます。
P-077: レシート明細データフレーム(df_receipt)の売上金額(amount)を顧客単位に合計し、合計した売上金額の外れ値を抽出せよ。ただし、顧客IDが”Z”から始まるのものは非会員を表すため、除外して計算すること。なお、ここでは外れ値を平均から3σ以上離れたものとする。結果は10件表示させれば良い。
from sklearn import preprocessing df_receipt = pd.read_csv("receipt.csv") df_77 = df_receipt.query("not customer_id.str.startswith('Z')",engine="python").\ groupby("customer_id").amount.sum().reset_index() df_77["amount_ss"] = preprocessing.scale(df_77["amount"]) # "amount"を標準化 df_77.query("abs(amount_ss)>=3").head(10)
最初の2行は “customer_id” に “Z” が付いている非会員を除去しています。
そして、df_77[“amount”] を標準化(平均値:0、標準偏差:1)します。そのデータの絶対値が3以上(3以上、−3以下)のデータを外れ値と設定して表示させています。
P-078: レシート明細データフレーム(df_receipt)の売上金額(amount)を顧客単位に合計し、合計した売上金額の外れ値を抽出せよ。ただし、顧客IDが”Z”から始まるのものは非会員を表すため、除外して計算すること。なお、ここでは外れ値を第一四分位と第三四分位の差であるIQRを用いて、「第一四分位数-1.5×IQR」よりも下回るもの、または「第三四分位数+1.5×IQR」を超えるものとする。結果は10件表示させれば良い。
import numpy as np df_78 = df_receipt.query("not customer_id.str.startswith('Z')",engine="python").\ groupby("customer_id").agg({"amount":"sum"}).reset_index() pct_25 = np.percentile(df_78["amount"],q=25) # 第一四分位数(25パーセンタイル) pct_75 = np.percentile(df_78["amount"],q=75) # 第三四分位数(75パーセンタイル) iqr = pct_75 - pct_25 # 四分位範囲(第一四分位数から第三四分位数の範囲) amount_low = pct_25-(iqr*1.5) amount_hight = pct_75+(iqr*1.5) df_78.query("amount < @amount_low or @amount_hight < amount").head(10)
この問題も外れ値の除去を行いますが、外れ値の設定が全問と違います。
今回の外れ値は、「第一四分位数-1.5×IQR」よりも下回るもの、または「第三四分位数+1.5×IQR」を超えるものですので、まずは、第一四分位数(pct_25)と第三四分位数(pct_75)を設定します。
そのデータから四分位範囲を設定します。(iqr)
さらに、外れ値の基準として最低値(amount_low)と最高値(amount_hight)を指定します。
そして、その値を使って外れ値を表示させています。
では外れ値の基準としている値を確認してみましょう。
print(amount_low,"~",amount_hight)
出力:
-4104.0 ~ 8302.0
つまり、P-078 の出力結果で表示されている “amount” は、−4104.0 から 8302.0 の間の値になっていることになります。
この外れ値の設定は少しややこしいですが、一般的な箱ひげ図では、この基準で外れ値を表していることが多いです。箱ひげ図の描き方
データサイエンティスト協会の100本ノックを解説|ダウンロードから読み込みまで
データサイエンティスト協会の100本ノックを解説|データの抽出
データサイエンティスト協会の100本ノックを解説|変数の一部を使ってデータを抽出する
データサイエンティスト協会の100本ノックを解説|ソート(順序で整列)
データサイエンティスト協会の100本ノックを解説|グループ分け
データサイエンティスト協会の100本ノック|新たなデータフレームの作成
データサイエンティスト協会の100本ノック|特徴量エンジニアリング
コメント