IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

Détection de valeurs aberrantes


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations forums :
    Inscription : Mars 2012
    Messages : 13
    Par défaut Détection de valeurs aberrantes
    Bonjour à tous,

    Dans le cadre d'une mission que l'on ma confiée, je dois, entre autres, m'occuper de nettoyer des séries de données annuelles de 4 capteurs de température de toutes leurs valeurs aberrantes (bugs des capteurs, températures trop élevées, etc...).
    Pour chaque station météo, j'ai donc 4 capteurs placés au même endroit mais à des hauteurs différentes. Mon jeu de données se présente donc de la manière suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    capt1   capt2   capt3   capt4   date_time
    -0.25	-2.43	-3.25	-2.37	01/01/2008 00:00
    -0.18	-2.37	-3.18	-2.25	01/01/2008 00:15
    -0.25	-2.5	-3.37	-2.56	01/01/2008 00:30
    -0.25	-2.37	-3.31	-2.37	01/01/2008 00:45
    -0.25	-2.56	-3.37	-2.68	01/01/2008 01:00
    -0.25	-2.56	-3.43	-2.56	01/01/2008 01:15
    -0.25	-2.56	-3.43	-2.37	01/01/2008 01:30
    -0.25	-2.62	-3.56	-2.81	01/01/2008 01:45
    -0.25	-2.68	-3.5	-2.75	01/01/2008 02:00
    J'ai une mesure de température toutes les 15mn, tous les jours sur une année entière (soit environ 35000 mesures par capteur et par an).

    Mon soucis actuel est donc de trouver une fonction robuste qui puisse scanner ces 4 colonnes de données, y détecter les valeurs aberrantes et les remplacer par NA.

    J'ai déjà essayé avec l'écart type ("sd"), mais cela ne fonctionne pas assez étant donné l'importance du jeu de données.
    J'ai également essayé en lui demandant de remplacer par NA les valeurs supérieures et inférieures à un certain seuil (par exemple +40 et -40°C). Cela fonctionne mais ça ne permet pas de détecter et de supprimer les petits pics aberrants comme dans l'exemple ci-dessous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    capt1   capt2   capt3   capt4   date_time
    2.43	4.93	6.18	6.93	09/01/2008 15:30
    2.43	4.81	6.18	6.93	09/01/2008 15:45
    6.93	4.68	6.18	6.93	09/01/2008 16:00
    2.93	4.93	7.93	6.43	09/01/2008 16:15
    2.93	4.43	5.81	6.18	09/01/2008 16:30
    6.93	4.43	5.68	15.93   09/01/2008 16:45
    6.93	4.31	7.93	15.93	09/01/2008 17:00
    7.93	4.43	15.93	15.93	09/01/2008 17:15
    7.93	4.43	5.43	15.68	09/01/2008 17:30
    7.93	7.93	5.06	7.68	09/01/2008 17:45
    7.93	7.93	5.93	15.93	09/01/2008 18:00
    7.93	7.93	5.93	15.68	09/01/2008 18:15
    On voit pour le capt4 une augmentation brutale de 10°C en 15mn (de 6.18 à 15.93°C) de la température, ce qui est très probablement faux, et que cette erreur persiste ensuite plusieurs fois (sauf pour le 7.68°C qui doit être juste).
    J'aimerais donc arriver à pouvoir supprimer ces valeurs fausses (en l'occurence dans cet exemple tous les 15.93°C faux et encore d'autres erreurs du même type) dans ma série de données.
    Existe-il une méthode statistique sous R qui puisse détecter ces valeurs et les remplacer par NA?
    En cherchant un peu, je suis tombé sur la fonction cov.mcd de la librairie "MASS" mais je ne sais pas ce qu'elle vaut et si elle peut m'aider.
    Merci beaucoup d'avance pour vos idées et votre aide!

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 6
    Par défaut
    Bonjour jeff6868,

    Désolé de te décevoir mais je n'ai pas de solution à ton problème car j'ai approximativement la même problème que toi , donc par contre j'attends les aides qui pourraient suivre moi aussi

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations forums :
    Inscription : Mars 2012
    Messages : 13
    Par défaut
    Salut anthony,

    Ecoute, moi j'ai trouvé une solution à ce problème de valeurs fausses qui se répètent sur un autre forum. Si par exemple 2 valeurs fausses se suivent, il s'agit de comparer la 2e fausse non pas à la première fausse mais avec la dernière valeur "juste" relevée, à partir de la conditions que tu définis. Donc ca peut fonctionner pour une longue série de valeurs fausses (même si celles-ci ne sont pas tout à fait égales mais fausses quand même).
    Je te donne l'exemple de mon code si ça peut t'aider dans le tien:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    out2NA <- function(x,maxi,seuil){
        st1 = NULL
        temp <- st1[1] <- x[1] # variable temporaire mémorisant la dernière valeur "correcte" relevée
        st1 <- ifelse (abs(x)>maxi, NA,x)        
        for (i in 2:length(x)){
       if(!is.na(x[i])){
         if((((x[i]) - temp) >= seuil)&(abs(x[i])<=temp+15)){
           st1[i] <- NA
         }else {
         #&(abs(x[i])>=abs(x[i+1])-0.6)
          temp <- st1[i] <- x[i]
               }
       }
     } 
     
        return(st1)          
        }
    Par contre j'ai un autre soucis, peut être que tu peux m'aider.
    Je bosse en fait sur 4 colonnes. Un exemple ci-dessous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    dat1   dat2   dat3   dat4
      2      4      3     5
      5      1      2     8
      0      0      0     0
      1      3      6     1
    Je souhaiterais supprimer et remplacer par NA les valeurs identiques dans les 4 colonnes (dans le bout de code que j'ai mis au début), c'est à dire passer du tableau ci-dessus à celui-ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    dat1   dat2   dat3   dat4
      2      4      3     5
      5      1      2     8
      NA     NA     NA   NA
      1      3      6     1
    Tu as une idée comment faire? J'ai essayé avec unique() ou duplicated() mais je n'arrive pas pour l'instant

  4. #4
    Modératrice

    Femme Profil pro
    Statisticienne, Fondatrice de la société DACTA
    Inscrit en
    Juin 2010
    Messages
    893
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Statisticienne, Fondatrice de la société DACTA

    Informations forums :
    Inscription : Juin 2010
    Messages : 893
    Par défaut
    Bonjour,

    Voici une idée qui me semble fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    ## matrice de données créée pour tester la fonction ##
     
    M<-matrix(c(2,4,3,5,5,1,2,8,0,0,0,0,1,3,6,1,1,1,1,2,8,8,8,8),byrow=TRUE,ncol=4)
     
    M
         [,1] [,2] [,3] [,4]
    [1,]    2    4    3    5
    [2,]    5    1    2    8
    [3,]    0    0    0    0
    [4,]    1    3    6    1
    [5,]    1    1    1    2
    [6,]    8    8    8    8
     
     
    ## fonction qui va tester si tous les éléments d'un vecteur sont identiques :
    si oui elle va retourner un vecteur de NA, si non elle va retourner le vecteur initial ##
     
    testunique<-function(x)
    {
    	u<-unique(x)
     
    	if(length(u)==1)
    	{
    		res<-rep(NA,length(x))
    	}
    	else
    	{
    		res<-x
    	}
     
    	return(res)
    }
     
     
    ## on va utiliser une fonction de la famille "apply" pour appliquer la fonction précédente 
    sur toutes les lignes de notre matrice M ##
     
    Z<-t(apply(M,1,testunique))
     
    Z
         [,1] [,2] [,3] [,4]
    [1,]    2    4    3    5
    [2,]    5    1    2    8
    [3,]   NA   NA   NA   NA
    [4,]    1    3    6    1
    [5,]    1    1    1    2
    [6,]   NA   NA   NA   NA
    Si vous voulez plus d'explications, n'hésitez pas.
    Pour obtenir des infos sur les fonctions de type "apply", tapez dans R : ?apply, ?sapply, ...


    Cordialement,

    A.D.

    Forum R
    Fournir le code utilisé (pensez aux balises code !), les packages nécessaires, ainsi qu'un court mais représentatif extrait du jeu de données et les éventuels messages d'erreur.
    Recherche d'informations concernant R : RSiteSearch / tutoriels : http://r.developpez.com/cours/ .

    Pensez également au bouton "Résolu" et à voter (en bas à droite des messages) lorsque vous avez obtenu une réponse satisfaisante.

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations forums :
    Inscription : Mars 2012
    Messages : 13
    Par défaut
    Bonjour,

    Tout d'abord merci pour votre réponse et vos explications détaillées.
    J'ai appliqué votre proposition à mon script en l'adaptant, et cela fonctionne parfaitement! Merci beaucoup!

    Je profite de votre savoir suprême en langage R pour vous poser une dernière question à propos de mon script, car il me reste un dernier problème à résoudre pour que toutes mes données soient correctement filtrées.

    Mes données concernent des mesures de température. J'ai tout d'abord créé une série temporelle afin entre autres de remplacer par NA les jours où il n'y a pas eu de mesures (donc du NA introduit au préalable de la fonction supprimant les valeurs aberrantes).
    J'applique ensuite une fonction qui vise à supprimer les valeurs aberrantes qui se répètent (ou non) avec le code ci-dessous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    out2NA <- function(x,maxi,seuil){
        st1 = NULL
        temp <- st1[1] <- x[1] # variable temporaire mémorisant la dernière valeur "correcte" relevée
        st1 <- ifelse (abs(x)>maxi, NA,x)        
        for (i in 2:length(x)){
       if(!is.na(x[i])){   
         if((((x[i]) - temp) >= seuil)){
           st1[i] <- NA
         }else {
         #&(abs(x[i])>=abs(x[i+1])-0.6)
          temp <- st1[i] <- x[i]
               }
       }
     }

    J'aimerais encore pouvoir dire sous R (dans le code ci-dessus) qu'il applique donc ce calcul avec la fonction "temp", mais qu'il arrête le calcul lorsqu'il rencontre du NA qui a été déjà créé (et donc qu'il reparte à partir de la première valeur après le NA). A l'heure actuelle, si la dernière valeur mesurée est fausse avant une période sans mesure (donc avec du NA), il va comparer la première valeur après la fin du NA avec la dernière valeur "juste" rencontrée.
    Par exemple, si le 15 janvier à 12:00 il fait 5°C (c'est juste), à 12:15 il fait 20°C (c'est faux) et à partir de 12:30 jusqu'au 10 mars par exemple il n'y a pas eu de mesures (donc du NA), il va comparer la première valeur du 10 mars avec la dernière "juste" du 15 Janvier, du coup l'écart est naturellement important (sans être faux) et il va mettre du NA à toutes les valeurs "justes" de mars (j'ai observé le cas en testant), car pour lui il y a un bond trop important entre les 2 données (et donc avec les valeurs qui suivent aussi).
    J'espère avoir été clair. Y'a-t-il une façon de lui dire ça (qu'il arrête le calcul quand il rencontre du NA, ou bien qu'il tienne en compte le NA dans le calcul pour arrêter la suppression)?
    En vous remerciant d'avance.
    Bonne fin de journée
    Cordialement

  6. #6
    Modératrice

    Femme Profil pro
    Statisticienne, Fondatrice de la société DACTA
    Inscrit en
    Juin 2010
    Messages
    893
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Statisticienne, Fondatrice de la société DACTA

    Informations forums :
    Inscription : Juin 2010
    Messages : 893
    Par défaut
    Bonjour,

    Je n'ai pas trop le temps de regarder votre code en détails pour le moment, mais comme vous semblez faire une boucle, pourquoi ne pas stocker à chaque itération (dans une variable DER par exemple) la dernière valeur uniquement si celle-ci est différente de NA (sinon la variable DER conserve sa valeur), et effectuer vos comparaisons par rapport à cette dernière valeur stockée dans DER?

    Je ne sais pas si c'est très clair, peut-être que cela peut vous donner une piste...


    Cordialement,

    A.D.

    Forum R
    Fournir le code utilisé (pensez aux balises code !), les packages nécessaires, ainsi qu'un court mais représentatif extrait du jeu de données et les éventuels messages d'erreur.
    Recherche d'informations concernant R : RSiteSearch / tutoriels : http://r.developpez.com/cours/ .

    Pensez également au bouton "Résolu" et à voter (en bas à droite des messages) lorsque vous avez obtenu une réponse satisfaisante.

Discussions similaires

  1. [XL-2010] Détection de valeur et numérotation incrémentée
    Par Kaera dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 07/12/2011, 22h24
  2. Réponses: 3
    Dernier message: 18/08/2009, 14h24
  3. Détection des valeurs aberrantes
    Par Boolbola dans le forum R
    Réponses: 3
    Dernier message: 15/01/2009, 09h36
  4. Valeur aberrante
    Par _debutant dans le forum SAS Base
    Réponses: 7
    Dernier message: 19/02/2008, 11h32
  5. Réponses: 1
    Dernier message: 13/03/2007, 09h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo