さまざまなテストからのデータをプロットしています。テストでは、たまたま1つの外れ値(たとえば0.1)がありますが、他のすべての値は3桁小さくなっています。
matplotlibを使用して、範囲に対してプロットします[0, max_data_value]
データを拡大して、プロットのx軸を台無しにする外れ値を表示しないようにするにはどうすればよいですか?
単純に95パーセンタイルを取り、[0, 95_percentile]
x軸に範囲を設定する必要がありますか?
さまざまなテストからのデータをプロットしています。テストでは、たまたま1つの外れ値(たとえば0.1)がありますが、他のすべての値は3桁小さくなっています。
matplotlibを使用して、範囲に対してプロットします[0, max_data_value]
データを拡大して、プロットのx軸を台無しにする外れ値を表示しないようにするにはどうすればよいですか?
単純に95パーセンタイルを取り、[0, 95_percentile]
x軸に範囲を設定する必要がありますか?
外れ値に対する単一の「最良の」テストはありません。理想的には、アプリオリ情報を組み込む必要があります(たとえば、「このパラメーターは、何とかしてxを超えてはなりません...」)。
外れ値のほとんどのテストでは、95パーセンタイルやその他の分散ベースの測定値ではなく、中央絶対偏差を使用します。そうしないと、計算される分散/標準偏差が外れ値によって大きく歪められます。
これは、より一般的な外れ値テストの1つを実装する関数です。
def is_outlier(points, thresh=3.5):
"""
Returns a boolean array with True if points are outliers and False
otherwise.
Parameters:
-----------
points : An numobservations by numdimensions array of observations
thresh : The modified z-score to use as a threshold. Observations with
a modified z-score (based on the median absolute deviation) greater
than this value will be classified as outliers.
Returns:
--------
mask : A numobservations-length boolean array.
References:
----------
Boris Iglewicz and David Hoaglin (1993), "Volume 16: How to Detect and
Handle Outliers", The ASQC Basic References in Quality Control:
Statistical Techniques, Edward F. Mykytka, Ph.D., Editor.
"""
if len(points.shape) == 1:
points = points[:,None]
median = np.median(points, axis=0)
diff = np.sum((points - median)**2, axis=-1)
diff = np.sqrt(diff)
med_abs_deviation = np.median(diff)
modified_z_score = 0.6745 * diff / med_abs_deviation
return modified_z_score > thresh
使用例として、次のようにします。
import numpy as np
import matplotlib.pyplot as plt
# The function above... In my case it's in a local utilities module
from sci_utilities import is_outlier
# Generate some data
x = np.random.random(100)
# Append a few "bad" points
x = np.r_[x, -3, -10, 100]
# Keep only the "good" points
# "~" operates as a logical not operator on boolean numpy arrays
filtered = x[~is_outlier(x)]
# Plot the results
fig, (ax1, ax2) = plt.subplots(nrows=2)
ax1.hist(x)
ax1.set_title('Original')
ax2.hist(filtered)
ax2.set_title('Without Outliers')
plt.show()
ジョーが述べたように外れ値を拒否することに煩わされておらず、これを行うのが純粋に美的な理由である場合は、プロットのx軸の制限を設定するだけです。
plt.xlim(min_x_data_value,max_x_data_value)
値は、表示する必要のある制限です。
plt.ylim(min,max)
y軸にも制限を設定するように機能します。
私は通常、関数を介してデータを渡しnp.clip
ます。データの最大値と最小値の合理的な見積もりがある場合は、それを使用してください。妥当な推定値がない場合は、クリップされたデータのヒストグラムが裾のサイズを示します。外れ値が実際に単なる外れ値である場合、裾は小さいはずです。
私が実行するのは次のようなものです:
import numpy as np
import matplotlib.pyplot as plt
data = np.random.normal(3, size=100000)
plt.hist(np.clip(data, -15, 8), bins=333, density=True)
データの適切な値が見つかるまでクリッピング関数の最小値と最大値を変更すると、結果を比較できます。
この例では、多くの意味のある情報を削除しているため、最大値 8 が適切ではないことがすぐにわかります。尾は見えないので、-15 の最小値で問題ありません。
おそらく、これに基づいて、許容範囲に従ってテールのサイズを最小化する適切な境界を見つけるコードを書くことができます。