Pythonic moyen de détection de valeurs aberrantes dans une dimensions de l'observation de données
Pour les données fournies, je veux mettre les valeurs aberrantes (défini par 95% confidense niveau ou 95% quantile de la fonction ou de ce qui est nécessaire) comme des valeurs nan. Voici mes données et le code que j'utilise actuellement. Je serais heureux si quelqu'un pouvait m'expliquer davantage.
import numpy as np, matplotlib.pyplot as plt
data = np.random.rand(1000)+5.0
plt.plot(data)
plt.xlabel('observation number')
plt.ylabel('recorded value')
plt.show()
- Vous savez que vos données mieux, mais je pense que Winsorising de mieux que de suppression. En outre, si l'ensemble de ces données que nan, et puis vous avez à gérer cela. Jetez un oeil à np.percentile de la fonction.
- Pour info: Détecter et exclure les valeurs aberrantes dans les Pandas dataframe
Vous devez vous connecter pour publier un commentaire.
Le problème avec l'aide de
percentile
est que les points identifiés comme des valeurs aberrantes est une fonction de la taille de votre échantillon.Il y a un grand nombre de moyens de test pour les valeurs aberrantes, et vous devriez réfléchir à la façon dont vous les classer. Idéalement, vous devriez utiliser une information a priori (par exemple, "rien au-dessus/en-dessous de cette valeur est irréaliste parce que...")
Toutefois, une commune, pas trop déraisonnable aberrantes test est de supprimer des points en fonction de leur "median absolute deviation".
Voici une implémentation pour la N-dimensionnelle de cas (à partir de quelques lignes de codes pour un papier ici: https://github.com/joferkington/oost_paper_code/blob/master/utilities.py):
Ceci est très similaire à une de mes précédentes réponses, mais je voulais illustrer la taille de l'échantillon effets en détail.
Comparons un percentile basée sur des valeurs aberrantes test (similaire à @CTZhu réponse) avec une médiane de-absolu-de déviation (MAD) de test pour différentes tailles d'échantillon:
Avis que le FOU à base de classificateur fonctionne correctement indépendamment de l'échantillon de la taille, tandis que le percentile en fonction de classificateur de classe le plus de points, plus la taille de l'échantillon est, indépendamment de si oui ou non ils sont en fait des valeurs aberrantes.
random.rand()
), ou pouvez toujours suivre certaines autres distributions, la plupart du temps. Si les données sont toujours uniformément dérangé, je ne suis pas sûr à propos de l'utilisationMAD
.diff
est calculé de la norme L2 (**2
); la médiane est la valeur qui minimise la norme L1, alors que dans L2 norme "moyenne" est le centre; je m'attendais à ce que si vous commencez avec une médiane de séjour en norme L1. avez-vous des raisons**2
fonctionnerait mieux que des valeurs absolues dans le calcul dediff
?mad_based_outlier
semble différent de l'original en nist.gov. Lemed_abs_deviation
calculé dans le code est différent de la définition de la moyenne de l'écart absolu.axis
kwarg ànp.sum
- Ce n'est pas de retourner une seule valeur, c'est le retour de la somme sur le dernier axe, qui est un tableau. Par exemple:np.sum(np.ones((3, 4)), axis=-1)
rendementsarray([4, 4, 4])
.statsmodel.robust.mad
ici. Êtes-vous au courant de divergence?np.sqrt(diff)
avant le calcul de la médiane dediff
?abs(points - median)
mais il a compliqué les choses!De détection de valeurs aberrantes dans un dimensionnelle des données dépend de sa distribution
1- Distribution Normale :
Dans ce cas, vous pouvez facilement utiliser toutes les méthodes qui incluent veux dire ,comme l'intervalle de confiance de 3 ou de 2 déviations standard(ic à 95% ou à 99,7%) en conséquence pour une distribution normale des données (théorème de la limite centrale et de l'échantillonnage et de la distribution de la moyenne d'échantillon).Je est une méthode très efficace.
Expliqué dans la Khan Academy, des statistiques et des Probabilités d'échantillonnage de la distribution de la bibliothèque.
Un autre moyen est l'intervalle de prédiction si vous voulez de l'intervalle de confiance de points de données plutôt que de les dire.
Les valeurs de données sont distribuées de façon aléatoire sur une plage:
signifie peut-être pas une juste représentation des données, car la moyenne est facilement influencé par les valeurs aberrantes (très petites ou les grandes valeurs du jeu de données qui ne sont pas typiques)
La médiane est une autre façon de mesurer le centre numérique de l'ensemble de données.
Median Absolute deviation - une méthode qui mesure la distance de tous les points de la médiane en termes de distance médiane
http://www.itl.nist.gov/div898/handbook/eda/section3/eda35h.htm - a une bonne explication, comme expliqué dans Joe kingston portant la réponse ci-dessus
2 - Distribution Symétrique : Nouveau Median Absolute Deviation est une bonne méthode si le z-score de calcul et le seuil est modifié en conséquence
Explication :
http://eurekastatistics.com/using-the-median-absolute-deviation-to-find-outliers/
3 - Distribution Asymétrique : Double MAD - Double Median Absolute Deviation
Dans l'explication ci-dessus lien
Attacher mon code python pour la référence :
medianIndex = int(points.size/2)
. Aussi, si j'exécute le code et de définir un seuil à zéro, il se bloque avec le messagename 'sys' is not defined
. Dernièrement, leself
dans l'appel de fonction n'est jamais utilisée.J'ai adapté le code de http://eurekastatistics.com/using-the-median-absolute-deviation-to-find-outliers et il donne les mêmes résultats que Joe kingston portant, mais utilise L1 de distance au lieu de L2 de distance, et a un support pour les distributions asymétriques. L'original R code n'a pas eu de Joe 0.6745 multiplicateur, donc j'ai aussi ajouté que, pour des raisons de cohérence au sein de ce thread. Pas sûr à 100% si c'est nécessaire, mais rend la comparaison des pommes avec des pommes.
y_mad[y < m]
avecy_mad[y <= m]
,ety_mad[y > m]
avecy_mad[y >= m]
, sinon lors de la y égal à m, y_mad est égal à zéro.[256.0, 256.0, 268.0, 2422.0, 2953.0, 3607.0, 4452.0, 4918.0, 6118.0, 9068.0, 10045.0, 11378.0]
. Qui sont les valeurs aberrantes dans votre pensée?Utilisation
np.percentile
comme @Martin a suggéré:numpy
. (numpy
lui-même ne contient que les données de base de la structure et de quelques opérations de base. C'est délibérément réduite). Vous pouvez faire un argument quiscipy.stats
serait un bon endroit pour une valeur aberrante test, mais il ya beaucoup d'entre eux, et il n'y a pas de meilleur test. Par conséquent, il n'y a pas actuellement d'une seule fonction de valeurs aberrantes d'essai.sm.robust.mad
. Je ne suis pas sûr qu'il y a des installations pour univariée des valeurs aberrantes, les tests, mais il y en a pour influence/de valeurs aberrantes dans un cadre de régression. Va voir sur l'ajout de certains outils pour univariée de détection de valeurs aberrantes.Bien une solution simple peut aussi être, en supprimant quelque chose qui, en dehors de 2 écarts-types(ou 1,96):
xrange
en python 3 ?