
- はじめに
- 問75 顧客データフレーム(df_customer)からランダムに1%のデータを抽出し、先頭から10件データを抽出せよ。
- 問76 顧客データフレーム(df_customer)から性別(gender_cd)の割合に基づきランダムに10%のデータを層化抽出し、性別ごとに件数を集計せよ。
- 問77 レシート明細データフレーム(df_receipt)の売上金額(amount)を顧客単位に合計し、合計した売上金額の外れ値を抽出せよ。ただし、顧客IDが”Z”から始まるのものは非会員を表すため、除外して計算すること。なお、ここでは外れ値を平均から3σ以上離れたものとする。結果は10件表示させれば良い。
- 問78 レシート明細データフレーム(df_receipt)の売上金額(amount)を顧客単位に合計し、合計した売上金額の外れ値を抽出せよ。ただし、顧客IDが”Z”から始まるのものは非会員を表すため、除外して計算すること。なお、ここでは外れ値を第一四分位と第三四分位の差であるIQRを用いて、「第一四分位数-1.5×IQR」よりも下回るもの、または「第三四分位数+1.5×IQR」を超えるものとする。結果は10件表示させれば良い。
- Pythonのコードやライブラリーについて知りたい場合
- 独学でデータ分析をしている方へ
はじめに
問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_lowとamount_hightを使用していますので、変数名の前に「@」を付けてください。
df_sales_amount.query('amount < @amount_low or @amount_hight < amount').head(10)
Pythonのコードやライブラリーについて知りたい場合
Pythonはデータ分析でよく使われている言語です。
この機会にPythonのコードの打ち方・ライブラリーについてもっと知りたいと思った方は、以下のブログ記事をご覧ください。
データ分析入門・データサイエンス初心者・初学者向けにデータ分析でよく使うPythonをまとめました。
>>【データ分析初心者】Python構文~if文、format記法とf文字列~
>>【データ分析初心者】Python構文~for文、range関数、zip関数、enumerate関数~
>>【データ分析初心者】Python構文~無名関数lambda式、内包表記、map関数~
>>【データ分析初心者】Pandas~loc[]、iloc[]、スライス、drop()、isin()~
>>【データ分析初心者】Matplotlib、Seabornーscatter、hist、countplot 、barplot
独学でデータ分析をしている方へ
機械学習やデータサイエンス・データ分析を独学で学ぶには、どうしたらよいかをまとめてみましたので、興味がある方はこちらのブログ記事をご覧ください。
