Forum de Statistiques
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Les posteurs les plus actifs de la semaine

Le Deal du moment :
Dates stocks PS5 : stocks imminents chez Amazon et ...
Voir le deal

Outsider

Aller en bas

Outsider Empty Outsider

Message par Particule le Mar 30 Juin 2020 - 12:59

Bonjour

Je possède une série de référence et une série de données à tester. Les éléments de mes séries sont supposées être les résultats d'une variable aléatoire Xref et X. Ma série de référence est caractérisée par sa moyenne et son écart-type.

Je souhaiterais identifier dans ma série à tester les éléments anormalement élevés c'est-à-dire les éléments dont la valeur s'écarte un peu trop de la série de référence en terme de probabilité.  

Voici comment je procède. Je considère que les valeurs anormalement élevées de ma série à tester sont celles qui sont situées au-delà d'un seuil q tel que P(Xref > q) <= α où par exemple α = 0.05 (cette valeur est bien-sûr subjective). Voici mon code :

Code:
x_ref = c(1, 1, 1, 2, 2, 1, 2, 3, 2, 2, 2, 1, 2, 2 , 3, 3, 2, 1, 2, 3, 1, 2, 3, 2, 1) # Données de référence
x = c(1, 1, 2, 2, 3, 4, 5, 2, 2, 2, 2, 1, 2, 2, 3, 2, 1, 2, 2, 1, 2, 3, 2, 1)         # Données à tester

alpha = 0.05

q <- quantile(x_ref,1-alpha, names=FALSE)
#Valeur q telle que F(k) >= 1-alpha <---> P(X <= q) >= 1-alpha <----> P(Xref > q) <= alpha
print(paste0("Valeur seuil = ", Valeur_seuil))
par(mfrow = c(1,2))
plot(x, xlab= "x", ylab= "Occurrences", ylim=c(0, max(x)))
abline(col = 'red', h=Valeur_seuil)
abline(col = 'blue', h=µ)

Toutes les valeurs de ma série à tester situées au-dessus de la ligne rouge sont considérées comme anormales compte-tenu de ma définition d'une valeur anormale. Le résultat trouvé pour la série à tester considère les valeurs 4 et 5 comme anormales ce qui était attendu...

Que pensez-vous de cette méthode et du code ?

Particule

Nombre de messages : 12
Date d'inscription : 11/07/2018

Revenir en haut Aller en bas

Outsider Empty Re: Outsider

Message par Eric Wajnberg le Mar 30 Juin 2020 - 18:51

Bonjour,

Plusieurs remarques :

Le code est faux. Le lancer renvoi des messages d'erreur. Peut-être faut-il remplacer "q" by "Valeur_seuil" et "µ" by "mean(x)" ?

Sinon, l'idée est a priori ok, mais une valeur qui a moins de 5 chances sur 100 de sortir n'est pas forcément "anormale". Il faudrait que vous précisiez l'objectif de votre approche.

Enfin, une autre approche est, plutôt que de partir sur la distribution empirique de x_ref et x, de partir plutôt sur la distribution (théorique) attendue. Par exemple, les valeurs de x_ref et de x sont des entiers, et de valeurs faibles. Ca ressemble à des comptages, et la loi sous-jacente pourrait être une loi de Poisson. On pourrait donc (facilement) calculer le quantile théorique à 5% de la loi de Poisson correspondante et fonder la décision sur ce seuil, etc.

HTH, Eric.
Eric Wajnberg
Eric Wajnberg

Nombre de messages : 1188
Date d'inscription : 14/09/2012

Revenir en haut Aller en bas

Outsider Empty Re: Outsider

Message par Particule le Mar 30 Juin 2020 - 21:27

Bonjour Eric,

Merci pour votre réponse. Effectivement le code renvoie une erreur car il manquait la définition de µ. Le code corrigé est plus bas.  

L'objectif est de détecter des valeurs anormalement élevées dans une série de données (quelque soit la nature de ces données) compte-tenu d'une série de référence dans laquelle les données sont par définition correctes. Si une valeur de la série à tester s'éloigne "trop" des valeurs de référence, une alerte est lancée à l'utilisateur qui devra vérifier par lui-même si la valeur trouvée est effectivement anormalement élevée ou s'il s'agit juste d'une valeur normale dont la probabilité d'occurrence est très faible.

Il s'agit effectivement de comptage de microplastiques dans l'océan mais les distributions sous-jacentes sont en fait inconnues (ce ne sont pas des lois de Poisson ni des lois normales...). Les valeurs réelles sont de l'ordre de 10 000. Quoi qu'il en soit, la détection doit fonctionner quelque soit la loi qui décrit les séries.

La distribution théorique (ou distribution de référence) dont vous parlez est justement celle qui décrit la série de référence mais cette distribution n'est pas décrite par une loi connue.

Autrement que par cette méthode, je ne vois pas comment détecter des valeurs anormalement élevées dans ma série à tester en se basant sur la série de référence dont les valeurs sont par définition normales.

L'idée serait de détecter dans la série à tester les valeurs qui s'éloignent trop de la valeur moyenne des valeurs de la série de référence. Un seuil pourrait être défini pour préciser "trop".  

Code:

x_ref = c(1, 1, 1, 2, 2, 1, 2, 3, 2, 2, 2, 1, 2, 2 , 3, 3, 2, 1, 2, 3, 1, 2, 3, 2, 1) # Données de référence
x = c(1, 1, 2, 2, 3, 4, 5, 2, 2, 2, 2, 1, 2, 2, 3, 2, 1, 2, 2, 1, 2, 3, 2, 1) # Données à tester

alpha = 0.05

q <- quantile(x_ref,1-alpha, names=FALSE)
Valeur_seuil <- q
print(paste0("Valeur seuil = ", Valeur_seuil))
par(mfrow = c(1,2))
plot(x, xlab= "x", ylab= "y", ylim=c(0, max(x)))
abline(col = 'red', h=Valeur_seuil)
hist(x,col="#F5D0A9",xlab="x",ylab="y",tck=0.01)
box()

Particule

Nombre de messages : 12
Date d'inscription : 11/07/2018

Revenir en haut Aller en bas

Outsider Empty Re: Outsider

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum