Je voudrais fournir deux méthodes dans cette réponse, la solution basée sur le "z score" et la solution basée sur "IQR".
Le code fourni dans cette réponse fonctionne sur les deux dim simples. numpy
et de multiples numpy
le tableau.
Importons d'abord quelques modules.
import collections
import numpy as np
import scipy.stats as stat
from scipy.stats import iqr
Méthode basée sur le score z
Cette méthode permet de vérifier si le nombre se situe en dehors des trois écarts types. Sur la base de cette règle, si la valeur est aberrante, la méthode retournera true, sinon, elle retournera 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
Méthode basée sur l'IQR
Cette méthode testera si la valeur est inférieure à q1 - 1.5 * iqr
ou supérieure à q3 + 1.5 * iqr
qui est similaire à la méthode de traçage de 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)
Enfin, si vous souhaitez filtrer les valeurs aberrantes, utilisez un filtre numpy
sélecteur.
Passez une bonne journée.