データ分析実践
中級問題チェック

問題 24 /40

外れ値の検出方法として、誤っているものはどれか。

選択 1

Plotly Expressのbox関数による確認。

選択 2

pandasのquantileメソッドによる確認。

選択 3

正規分布と2σ範囲による確認。

選択 4

pandasのcut関数で%を指定して確認。

解説

選択肢4が正解です。 次の身長のDataFrameで確認します。 df = pd.DataFrame( {'身長': [155, 158, 160, 163, 165, 166, 170, 175, 178, 200]}) ▶︎ 【選択肢1】 Plotly Expressのbox関数による確認。 正しい説明です。 px.box(df, y='身長') ▶︎
Plotly Expressのグラフは、要素にマウスオーバーすると値を確認できます。 上の箱ひげ図は、一番上の外れ値にマウスオーバーしており、身長=200が外れ値であることが確認できます。 箱ひげ図の外れ値は、四分位範囲(25%〜75%)から1.5倍以上離れた値が外れ値になります。 【選択肢2】 pandasのquantileメソッドによる確認。 正しい説明です。 quantileメソッドは分位点の値を特定できます。 例えば、95%〜100%の範囲にある値を外れ値と仮定して、quantileメソッドに「0.95」の引数を指定します。引数は百分率(%)の値ではなく、小数で指定します。 df.quantile(0.95) ▶︎ 身長 190.1 全体の95%の位置にある値が、190.1であることが分かります。これを超える値が外れ値になります。 このDataFrameはデータ数が少ないため、目視で「200」が外れ値であることを確認できますが、通常はqueryメソッドなどでレコードを特定します。 df.query('身長 > 190.1') ▶︎ 必要に応じて該当の行を削除することで、外れ値を除外します。 【選択肢3】 正規分布と2σ範囲による確認。 正しい説明です。 2σは「標準偏差の2倍」という意味です。データが正規分布の場合、標準偏差の2倍を超える範囲は、両端の約2.5%になります。この2.5%の範囲にある値を外れ値と考えて、値を特定します。 df.quantile(q=[0.025, 0.975]) ▶︎ 2.5%の位置にある値が155.675、97.5%の位置にある値が195.050と分かりました。これを超える両端の値が外れ値になります。 【選択肢4】 pandasのcut関数で%を指定して確認。 誤った説明です。 cut関数は値をカテゴリに変換する関数です。 例えば身長の値を160と170で分ける場合、以下の記述になります。 pd.cut(df['身長'], bins=[0, 160, 170, 201], right=False) ▶︎ 0 [0, 160) 1 [0, 160) 2 [160, 170) 3 [160, 170) 4 [160, 170) 5 [160, 170) 6 [170, 201) 7 [170, 201) 8 [170, 201) 9 [170, 201) この場合、各値は以下のカテゴリに属することがわかります。 インデックス0〜1 ▶︎ [0, 160) *0以上、160未満 インデックス2〜5 ▶︎ [160, 170) *160以上、170未満 インデックス6〜9 ▶︎ [170, 201) *170以上、201未満 cut関数のbins引数は割合を指定するのではなく、データの値を直接指定します。身長であれば160や170などの値を指定してカテゴリを分けます。quantileメソッドの0.025(2.5%)のように、割合を指定することはできません。 選択肢2のquantileメソッドで外れ値の閾値を特定できているのであれば、cut関数でも閾値を指定して外れ値を特定することができます。 pd.cut(df['身長'], bins=[0, 155.675, 195.050, 201], right=False) ▶︎ 0 [0.0, 155.675) 1 [155.675, 195.05) 2 [155.675, 195.05) 3 [155.675, 195.05) 4 [155.675, 195.05) 5 [155.675, 195.05) 6 [155.675, 195.05) 7 [155.675, 195.05) 8 [155.675, 195.05) 9 [195.05, 201.0) 両端の2.5%を外れ値とした場合、インデックス0とインデックス9が外れ値のカテゴリに属することが分かります。 (公式書籍 p.181-185)