Help us understand the problem. What is going on with this article?

データに含まれる外れ値の処理を国別の社会経済データを使って考える

手元に以下のデータがあるとき、

  • 国名(167ヵ国)
  • 乳幼児死亡率
  • 輸出額(GDP換算)
  • 輸入額(GDP換算)
  • 健康への出費
  • 収入
  • インフレ率
  • 寿命
  • 出生率
  • 一人当たりGDP

このデータ(167行 × 9列)をもとに支援をするべき国を選定するシチュエーションを考える。

そのために、クラスター分析を用いて国をいくつかのグループに分類する場面が考えられるだろう。

データには次の図のように、外れ値が含まれている。
これらの外れ値はしばしば主成分分析やクラスター分析に影響を与えてしまう。

この記事ではこのデータを使って外れ値の処理を考える。

df.plot(kind='box',subplots=True,layout=(3,3), sharex=False,figsize = (20,7), 
plt.show() 

boxes01.png

データの分類

与えられたデータは大きく二つに分けられる。
1つは、社会経済的なデータ

  • 収入
  • 輸出入
  • インフレ率
  • 一人当たりGDP

がそれにあたる。
もうひとつは、健康に関するデータである。

  • 乳幼児死亡率
  • 寿命
  • 出生率
  • 医療費

がそれにあたる。

今回のシチュエーション(支援すべき国の決定)では、収入・一人当たりGDP・寿命・医療費が少なく、インフレ率・乳幼児死亡率が高い国が支援すべき国なのは明らかだろう。

ところで、収入・一人当たりGDP・輸出入には外れ値が多く含まれる。これらの外れ値をそのまま使うと支援するべき国のクラスター分析においてなんらかの影響をあたえてしまう。そこでこれらの外れ値を処理しなければならない。

方針1 一定の範囲を除外する

処理の方法として一番単純なのは、データから外れ値となる一定の範囲を除外してしまうことだ。
だが、そうしないのには理由がある。
簡単に言うと、外れ値の重要度がそれぞれ異なるからだ。
今回は支援すべき国を決定するシチュエーションなのである。乳幼児死亡率が極端に高い国は非常に悪い状況下にあると容易に予測できるので、優先的に対処しなければならない。つまり、乳幼児死亡率の外れ値の重要度は高い。

したがって、外れ値の大きいものを基準としてデータの範囲を狭めてしまうと本来の目的にそぐわないデータになってしまう。
一方で、外れ値の小さいものを基準にすると結果に影響を与える外れ値が残りすぎてしまう。

たとえば、元のデータの5%分位点を基準に外れ値を削除してみよう。

df_5percent_outlier_removed = df.copy()

for i in df_5percent_outlier_removed.columns:
    Q1 = df_5percent_outlier[i].quantile(0.05)
    Q3 = df_5percent_outlier[i].quantile(0.95)
    df_5percent_outlier_removed = df_5percent_outlier_removed[(df_5percent_outlier_removed[i] >= Q1) & (df_5percent_outlier_removed[i] <= Q3)]
df_5percent_outlier_removed.shape
#=> 62,9

外れ値は削除できたが、データは元のデータの約1/3になってしまった。

同様にして元のデータの2.5%分位点を基準に外れ値を削除した場合は元のデータのおよそ2/3(99×9)が残る。これはそこまで悪くない数字だ。
だが、

  • 不要な外れ値をうまく除外し
  • データの量を保てる

よりよい方法はないだろうか。

方針2 データによって除外する範囲を変える。

もとのデータの1.5%分位点で外れ値を処理すると次の図のようになる。

outlier.png

見ての通り、一人当たりGDPを除けばほとんど外れ値の処理ができている。

このとき、データは120×9である。
つぎに同様にして一人当たりGDPの5%分位点を基準に処理すればよい。
処理した後のデータは108×9となる。
一人当たりGDPの外れ値の影響を抑えつつ、2.5%分位
点を基準にするよりも多くのデータを残せた。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away