Bu cevapta "z skoruna" dayalı çözüm ve "IQR" tabanlı çözüm olmak üzere iki yöntem sunmak istiyorum.
Bu cevapta verilen kod hem tek dim numpy
dizisi hem de çoklu numpy
dizi üzerinde çalışır .
Öncelikle bazı modülleri içeri aktaralım.
import collections
import numpy as np
import scipy.stats as stat
from scipy.stats import iqr
z puanına dayalı yöntem
Bu yöntem, sayının üç standart sapmanın dışında olup olmadığını test edecektir. Bu kurala göre, değer aykırı ise, yöntem true, değilse, false döndürür.
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 tabanlı yöntem
Bu yöntem, değerin SPSS'nin çizim yöntemine benzer şekilde küçük q1 - 1.5 * iqr
veya büyük olup olmadığını test edecektir q3 + 1.5 * iqr
.
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)
Son olarak, aykırı değerleri filtrelemek istiyorsanız, bir numpy
seçici kullanın .
İyi günler.