Ich möchte in dieser Antwort zwei Methoden angeben, eine Lösung basierend auf "z score" und eine Lösung basierend auf "IQR".
Der in dieser Antwort angegebene Code funktioniert sowohl für einzelne Dim- numpy
Arrays als auch für mehrere numpy
Arrays.
Importieren wir zunächst einige Module.
import collections
import numpy as np
import scipy.stats as stat
from scipy.stats import iqr
z Score-basierte Methode
Diese Methode prüft, ob die Anzahl außerhalb der drei Standardabweichungen liegt. Basierend auf dieser Regel gibt die Methode true zurück, wenn der Wert ein Ausreißer ist. Wenn nicht, wird false zurückgegeben.
def sd_outlier(x, axis = None, bar = 3, side = 'both'):
assert side in ['gt', 'lt', 'both'], 'Side should be `gt`, `lt` or `both`.'
d_z = stat.zscore(x, axis = axis)
if side == 'gt':
return d_z > bar
elif side == 'lt':
return d_z < -bar
elif side == 'both':
return np.abs(d_z) > bar
IQR-basierte Methode
Diese Methode prüft, ob der Wert kleiner q1 - 1.5 * iqr
oder größer als ist q3 + 1.5 * iqr
, was der Plotmethode von SPSS ähnlich ist.
def q1(x, axis = None):
return np.percentile(x, 25, axis = axis)
def q3(x, axis = None):
return np.percentile(x, 75, axis = axis)
def iqr_outlier(x, axis = None, bar = 1.5, side = 'both'):
assert side in ['gt', 'lt', 'both'], 'Side should be `gt`, `lt` or `both`.'
d_iqr = iqr(x, axis = axis)
d_q1 = q1(x, axis = axis)
d_q3 = q3(x, axis = axis)
iqr_distance = np.multiply(d_iqr, bar)
stat_shape = list(x.shape)
if isinstance(axis, collections.Iterable):
for single_axis in axis:
stat_shape[single_axis] = 1
else:
stat_shape[axis] = 1
if side in ['gt', 'both']:
upper_range = d_q3 + iqr_distance
upper_outlier = np.greater(x - upper_range.reshape(stat_shape), 0)
if side in ['lt', 'both']:
lower_range = d_q1 - iqr_distance
lower_outlier = np.less(x - lower_range.reshape(stat_shape), 0)
if side == 'gt':
return upper_outlier
if side == 'lt':
return lower_outlier
if side == 'both':
return np.logical_or(upper_outlier, lower_outlier)
Wenn Sie die Ausreißer herausfiltern möchten, verwenden Sie einen numpy
Selektor.
Einen schönen Tag noch.