ฉันต้องการให้สองวิธีในคำตอบนี้วิธีแก้ปัญหาตาม "คะแนน z" และวิธีการแก้ปัญหาตาม "IQR"
รหัสที่ให้ไว้ในคำตอบนี้ใช้ได้กับทั้งnumpy
อาร์เรย์แบบสลัวเดียวและหลายnumpy
อาร์เรย์
ก่อนอื่นมานำเข้าโมดูลกันก่อน
import collections
import numpy as np
import scipy.stats as stat
from scipy.stats import iqr
วิธีคะแนน z
วิธีนี้จะทดสอบว่าตัวเลขอยู่นอกค่าเบี่ยงเบนมาตรฐานทั้งสามหรือไม่ ตามกฎนี้หากค่าผิดปกติเมธอดจะคืนค่าจริงถ้าไม่ส่งกลับเท็จ
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
วิธีนี้จะทดสอบว่าค่าน้อยกว่าq1 - 1.5 * iqr
หรือมากกว่าq3 + 1.5 * iqr
ซึ่งคล้ายกับวิธีการลงจุดของ 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)
สุดท้ายหากคุณต้องการกรองสิ่งผิดปกติออกให้ใช้numpy
ตัวเลือก
ขอให้มีความสุขในวันนี้