Tôi muốn cung cấp hai phương pháp trong câu trả lời này, giải pháp dựa trên "điểm z" và giải pháp dựa trên "IQR".
Mã được cung cấp trong câu trả lời này hoạt động trên cả numpy
mảng mờ đơn và nhiều numpy
mảng.
Trước tiên, hãy nhập một số mô-đun.
import collections
import numpy as np
import scipy.stats as stat
from scipy.stats import iqr
phương pháp dựa trên điểm z
Phương pháp này sẽ kiểm tra xem con số có nằm ngoài ba độ lệch chuẩn hay không. Dựa trên quy tắc này, nếu giá trị lớn hơn, phương thức sẽ trả về true, nếu không, trả về false.
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
Phương pháp dựa trên IQR
Phương pháp này sẽ kiểm tra nếu giá trị nhỏ hơn q1 - 1.5 * iqr
hoặc lớn hơn q3 + 1.5 * iqr
, tương tự như phương pháp biểu đồ của SPSS.
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)
Cuối cùng, nếu bạn muốn lọc ra các ngoại lệ, hãy sử dụng một numpy
bộ chọn.
Chúc một ngày tốt lành.