【解説】データサイエンス100本ノック【問77〜78 回答】
当ページのリンクには広告が含まれています。
- 第77問目: 外れ値・異常値(外れ値除外)
- 第78問目: 外れ値・異常値(四分位点範囲を利用した外れ値判定)
- まとめ: データサイエンス100本ノック【問77〜78 回答】で外れ値・異常値判定を学びました
データサイエンス100本ノックの始め方は、以下の記事を参考にしていただければと思います。
第77問目: 外れ値・異常値(外れ値除外)
外れ値とは、他の値から大きく外れた値のことです。
外れ値を検出する手順は以下の2stepです
- 標準化する
- 平均値からある閾値以上離れたデータを抽出する
本問を解きながら具体的な流れを確認しましょう。
まずは、df_receiptの売上金額(amount)を顧客ID(customer_id)ごとに合計したデータを代入します。
文字の前方一致(カラム名.str.startswith)について確認する
1 | df_sales_amount = df_receipt.query('not customer_id.str.startswith("Z")', engine='python').groupby('customer_id').agg({'amount':'sum'}).reset_index() |
1 | customer_id amount |
標準化を行います。
標準化はStandardScalerクラスを使用して行います。
1 | scaler = preprocessing.StandardScaler() |
1 | customer_id amount amount_ss |
問題の指定通り、平均から3σ以上離れたものを10件抽出します。
1 | df_sales_amount.query('abs(amount_ss) >= 3').head(10) |
1 | customer_id amount amount_ss |
これで完了です。
第78問目: 外れ値・異常値(四分位点範囲を利用した外れ値判定)
P-078: レシート明細データフレーム(df_receipt)の売上金額(amount)を顧客単位に合計し、合計した売上金額の外れ値を抽出せよ。ただし、顧客IDが”Z”から始まるのものは非会員を表すため、除外して計算すること。なお、ここでは外れ値を第一四分位と第三四分位の差であるIQRを用いて、「第一四分位数-1.5×IQR」よりも下回るもの、または「第三四分位数+1.5×IQR」を超えるものとする。結果は10件表示させれば良い。
四分位点とは、データを4分の1に分割する分位点のことです。
四分位数については、以下の記事で詳しく説明しています。
>> 【解説】四分位点を学ぶ | データサイエンス100本ノック【問55 回答】 - omathin blog
外れ値を判定する際に、IQR(四分位範囲)を利用する方法があります。
IQRとは、第一四分位Q1と第三四分位Q3の差を取ったものです。
一般的に、このIQRを使用して「第一四分位数-1.5×IQR」より下回るものと「第三四分位数+1.5×IQR」を超えるものを外れ値として考えます。
実際に本問を解きながら外れ値の算出をしてみたいと思います。
まずは、df_receiptの売上金額(amount)を顧客ID(customer_id)ごとに合計したデータをsf_sales_amountに代入します。
1 | df_sales_amount = df_receipt.query('not customer_id.str.startswith("Z")', engine='python').groupby('customer_id').agg({'amount':'sum'}).reset_index() |
1 | customer_id amount |
第一四分位数と第三四分位数を求めます。
1 | pct75 = np.percentile(df_sales_amount['amount'], q=75) |
1 | customer_id amount |
これで完成です。
まとめ: データサイエンス100本ノック【問77〜78 回答】で外れ値・異常値判定を学びました
本記事で紹介した方法を元にデータサイエンティストとしての知見を深めていただければと思います。
なお、データサイエンティストに必要な知識は、TechAcademyのデータサイエンスコースでの学習がおすすめです。