élimination des données et représentation graphique

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

hajer labidi
Messages : 42
Enregistré le : 03 Jan 2009, 11:30

élimination des données et représentation graphique

Messagepar hajer labidi » 12 Mar 2009, 17:48

Bonjour,

j'ai un tableau où les valeurs sont prises toutes les 15 mn, c’est à dire 4 fois par heure, ainsi on peut avoir 96 valeurs au plus dans un jour, comme on peut avoir beaucoup moins que ce nombre vu la suppression des donnée invalides

-en fait, j’essaie de supprimer les moyennes des journées quand les données ne sont pas disponible pour plus de 12heures, mais j'arrive pas à le faire.
voici un extrait du tableau pour 3 jours:

Code : Tout sélectionner

> O3
                   date concentration
1   2005-01-01 00:15:00            11
2   2005-01-01 00:30:00            13
3   2005-01-01 00:45:00            13
4   2005-01-01 01:00:00            14
5   2005-01-01 01:15:00            12
6   2005-01-01 01:30:00            17
7   2005-01-01 01:45:00            20
8   2005-01-01 02:00:00            18
9   2005-01-01 02:15:00            16
10  2005-01-01 02:30:00            16
11  2005-01-01 02:45:00            14
12  2005-01-01 03:00:00            16
13  2005-01-01 03:15:00            18
14  2005-01-01 03:30:00            20
15  2005-01-01 03:45:00            20
16  2005-01-01 04:00:00            19
17  2005-01-01 04:15:00            17
18  2005-01-01 04:30:00            14
19  2005-01-01 04:45:00            15
20  2005-01-01 05:00:00            17
21  2005-01-01 05:15:00            17
22  2005-01-01 05:30:00            18
23  2005-01-01 05:45:00            17
24  2005-01-01 06:00:00            16
25  2005-01-01 06:15:00            16
26  2005-01-01 06:30:00            14
27  2005-01-01 06:45:00            12
28  2005-01-01 07:00:00            13
29  2005-01-01 07:15:00            11
30  2005-01-01 07:30:00             9
31  2005-01-01 07:45:00            11
32  2005-01-01 08:00:00             5
33  2005-01-01 08:15:00             7
34  2005-01-01 08:30:00             9
35  2005-01-01 08:45:00             7
36  2005-01-01 09:00:00             8
37  2005-01-01 09:15:00            12
38  2005-01-01 09:30:00            13
39  2005-01-01 09:45:00            14
40  2005-01-01 10:00:00            16
41  2005-01-01 10:15:00            15
42  2005-01-01 10:30:00            16
43  2005-01-01 10:45:00            18
44  2005-01-01 11:00:00            15
45  2005-01-01 11:15:00            18
46  2005-01-01 11:30:00            16
47  2005-01-01 11:45:00            20
48  2005-01-01 12:00:00            22
49  2005-01-01 12:15:00            19
50  2005-01-01 12:30:00            16
51  2005-01-01 12:45:00            20
52  2005-01-01 13:00:00            21
53  2005-01-01 13:15:00            16
54  2005-01-01 13:30:00            11
55  2005-01-01 13:45:00             9
56  2005-01-01 14:00:00            10
57  2005-01-01 14:15:00            17
58  2005-01-01 14:30:00            17
59  2005-01-01 14:45:00            14
60  2005-01-01 15:00:00             9
61  2005-01-01 15:15:00            16
62  2005-01-01 15:30:00            18
63  2005-01-01 15:45:00            17
64  2005-01-01 16:00:00            13
65  2005-01-01 16:15:00            13
66  2005-01-01 16:30:00             8
67  2005-01-01 16:45:00             8
68  2005-01-01 17:00:00             4
69  2005-01-01 17:15:00             3
70  2005-01-01 17:30:00             2
71  2005-01-01 17:45:00             2
72  2005-01-01 18:00:00             2
73  2005-01-01 18:15:00             2
74  2005-01-02 00:45:00            17
75  2005-01-02 01:00:00            19
76  2005-01-02 01:15:00            17
77  2005-01-02 01:30:00            18
78  2005-01-02 01:45:00            21
79  2005-01-02 02:00:00            21
80  2005-01-02 03:30:00            22
81  2005-01-02 03:45:00            22
82  2005-01-02 04:00:00            23
83  2005-01-02 21:30:00            16
84  2005-01-02 21:45:00            21
85  2005-01-02 22:00:00            20
86  2005-01-02 22:15:00            21
87  2005-01-02 22:30:00            24
88  2005-01-02 22:45:00            25
89  2005-01-02 23:00:00            27
90  2005-01-02 23:15:00            25
91  2005-01-02 23:30:00            26
92  2005-01-02 23:45:00            27
93  2005-01-03 00:00:00            26
94  2005-01-03 00:15:00            28
95  2005-01-03 00:30:00            29
96  2005-01-03 00:45:00            30
97  2005-01-03 01:00:00            30
98  2005-01-03 01:15:00            30
99  2005-01-03 01:30:00            30
100 2005-01-03 01:45:00            32
101 2005-01-03 02:00:00            32
102 2005-01-03 02:15:00            32
103 2005-01-03 02:30:00            32
104 2005-01-03 02:45:00            32
105 2005-01-03 03:00:00            33
106 2005-01-03 03:15:00            33
107 2005-01-03 03:30:00            34
108 2005-01-03 03:45:00            34
109 2005-01-03 04:00:00            33
110 2005-01-03 04:15:00            34
111 2005-01-03 04:30:00            32
112 2005-01-03 04:45:00            31


l’idée qui m’est venue est de compter les données disponible pour une journée est si elles sont moins que (96/2) on élimine toutes les données appartenant à cette journées.
mais bon, je ne sais vraiment pas comment procéder.
j’espère que quelqu’un pourrait m’aider...

-ma deuxième question est la suivante : y a t-il un moyen pour diviser le tableau semaine par semaine et représenter graphiquement les moyennes journalières de toute l'année sur une seule semaine ?

Merci d’avance pour votre aide
Cordialement

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Re: élimination des données et représentation graphique

Messagepar Renaud Lancelot » 13 Mar 2009, 05:14

hajer labidi a écrit :l’idée qui m’est venue est de compter les données disponible pour une journée est si elles sont moins que (96/2) on élimine toutes les données appartenant à cette journées.
mais bon, je ne sais vraiment pas comment procéder.
j’espère que quelqu’un pourrait m’aider...


Si votre jeu de données a la structure suivante

Code : Tout sélectionner

> str(dfr)
'data.frame':   112 obs. of  3 variables:
 $ date         : POSIXct, format: "2005-01-01 00:15:00" "2005-01-01 00:30:00" "2005-01-01 00:45:00" "2005-01-01 01:00:00" ...
 $ concentration: int  11 13 13 14 12 17 20 18 16 16 ...
 $ jour         :Class 'Date'  num [1:112] 12784 12784 12784 12784 12784 ...


c'est-à-dire si la variable date est bien reconnue comme une date, vous pouvez extraire le jour:

Code : Tout sélectionner

> dfr$jour <- format(dfr$date, format = "%x")
> table(dfr$jour)

01/01/2005 02/01/2005 03/01/2005
        73         19         20


et ensuite, by vous permet de faire ce que vous voulez:

Code : Tout sélectionner

> Liste <- by(dfr,
+             list(jour = dfr$jour),
+             function(x){
+               if(nrow(x) >= 48)
+                 data.frame(jour = unique(x$jour),
+                            m = mean(x$concentration))
+               else
+                 NULL
+               })
> Liste
jour: 01/01/2005
        jour        m
1 01/01/2005 13.58904
----------------------------------------------------------------------------------------------------------------------------------------------------------
jour: 02/01/2005
NULL
----------------------------------------------------------------------------------------------------------------------------------------------------------
jour: 03/01/2005
NULL


Dans le cas général, vous pouvez empiler les éléments de la liste dans un tableau:

Code : Tout sélectionner

> do.call("rbind", Liste)
                 jour        m
01/01/2005 01/01/2005 13.58904


-ma deuxième question est la suivante : y a t-il un moyen pour diviser le tableau semaine par semaine et représenter graphiquement les moyennes journalières de toute l'année sur une seule semaine ?


Comprends pas...

Pour extraire les semaines à partir des dates:

Code : Tout sélectionner

> dfr$semaine <- format(dfr$date, format = "%W")
> table(dfr$semaine)

00 01
92 20


Renaud

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Messagepar Serge Rapenne » 13 Mar 2009, 08:46

Bonjour,

Si tu traite des données de pollution atmosphérique, tu trouveras peut être le package "Qair" utile. Il est disponible sur sourceforge (http://sourceforge.net/projects/packagerqair/ . Il s'agit d'un package développé par une personne d'un réseau de surveillance français contenant des fonctions propres à notre activité : transformation moyenne 1/4 horaire -> moyenne horaire -> moyenne journalière, rose des vents, rose de pollution, profil journalier ou hebdomadaire, calcul de valeurs réglementaires .... Une fonction permet de rapatrier automatiquement les valeurs depuis notre base de données (ne fonctionne à ce jour qu'avec XR, le logiciel de poste central de la marque Iséo) mais elle doit pouvoir être adapté pour toutes bases de données avec ODBC. Il utilise les règles de calculs françaises notamment sur les arrondis et sur le taux de fonctionnement nécessaire pour calculer les moyennes qui est de 75% dans notre cas, mais la encore l'adaptation ne doit pas être trop difficile.

Serge

hajer labidi
Messages : 42
Enregistré le : 03 Jan 2009, 11:30

Messagepar hajer labidi » 14 Mar 2009, 02:51

Bonsoir,

Merci beaucoup Renaud, votre aide m’est vraiment précieuse et le code marche très bien.
-J’espère que vous pouvez m’expliquer ceci: 'str(dfr)' a indiqué que les données sont en fonction de 2 variables et non 3, ça n'a rien changé au résultat et le reste fonctionne exactement comme vous l’avez expliqué!

Code : Tout sélectionner

> str(dfr)
'data.frame':   112 obs. of  2 variables:
 $ date         : POSIXct, format: "2005-01-01 00:15:00" "2005-01-01 00:30:00" "2005-01-01 00:45:00" "2005-01-01 01:00:00" ...
 $ concentration: num  11 13 13 14 12 17 20 18 16 16 ...


-en empilant les éléments de la liste dans le tableau il s'avère que la colonne de la date se rèpète une deux fois, est il possible de ne garder qu'une seule colonne de date?


-pour ma 2ème question: j'essaie d'avoir plusieurs courbes superposées de manière à ce que chaque courbe représente une semaine de l'année, et le graphe a comme abscisse les 7 jours de la semaine .

@Serge

Si tu traite des données de pollution atmosphérique, tu trouveras peut être le package "Qair" utile. Il est disponible sur sourceforge (http://sourceforge.net/projects/packagerqair/ .

merci pour votre lien
effectivement je traite les données de la pollution atmosphérique
j’ai essayé de faire le téléchargement malheureusement ce n’est pas réussi.

Merci
Cordialement

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 14 Mar 2009, 06:52

hajer labidi a écrit :-en empilant les éléments de la liste dans le tableau il s'avère que la colonne de la date se rèpète une deux fois, est il possible de ne garder qu'une seule colonne de date?


Il n'y en a qu'une seule, mais par défaut, le facteur d'agrégation devient le nom de la ligne qui est affiché à l'écran. Il suffit de renommer les lignes:

Code : Tout sélectionner

result <- do.call("rbind", Liste)
rownames(result) <- seq(nrow(result))


-pour ma 2ème question: j'essaie d'avoir plusieurs courbes superposées de manière à ce que chaque courbe représente une semaine de l'année, et le graphe a comme abscisse les 7 jours de la semaine .


Voici un exemple en repartant du tableau initial

Code : Tout sélectionner

> summary(dfr)
      date                     concentration 
 Min.   :2005-01-01 00:15:00   Min.   : 2.00 
 1st Qu.:2005-01-01 07:11:15   1st Qu.:13.00 
 Median :2005-01-01 14:07:30   Median :17.00 
 Mean   :2005-01-01 21:17:24   Mean   :18.13 
 3rd Qu.:2005-01-02 21:48:45   3rd Qu.:22.00 
 Max.   :2005-01-03 04:45:00   Max.   :34.00 


Le principe est de créer des séries chronologiques empilées (une série = une semaine) avec tous les points possibles, les concentrations manquantes étant mises à NA. Cela permet de visualiser les "trous" même si on relie les points adjacents par une ligne. Pour arriver à ce résultat, on crée un jeu de données intermédiaire contenant tous les temps possibles dans une semaine donnée, entre temps minimum et maximum observées.

Code : Tout sélectionner

> dfr$Year <- format(dfr$date, format="%Y")
> dfr$Week <- format(dfr$date, format="%W")
>
> dfr$date <- as.POSIXct(dfr$date, tz = "")
> Liste <- by(dfr,
+             list(Year = dfr$Year, Week = dfr$Week),
+             function(x){
+                 debut <- min(x$date); fin <- max(x$date)
+                 xdate <- seq(from = debut, to = fin, by = "15 min")
+                 tmp <- data.frame(date = xdate,
+                                   Week = format(xdate, format="%W"),
+                                   Year = format(xdate, format="%Y"))
+                 X <- merge(x, tmp, all = TRUE)
+                 X$Time <- as.numeric(X$date - debut)
+                 X
+                 })
>
> Data <- do.call("rbind", Liste)
> str(Data)
'data.frame':   211 obs. of  5 variables:
 $ date         : POSIXct, format: "2005-01-01 00:15:00" "2005-01-01 00:30:00" "2005-01-01 00:45:00" "2005-01-01 01:00:00" ...
 $ Year         : chr  "2005" "2005" "2005" "2005" ...
 $ Week         : chr  "00" "00" "00" "00" ...
 $ concentration: int  11 13 13 14 12 17 20 18 16 16 ...
 $ Time         : num  0 900 1800 2700 3600 4500 5400 6300 7200 8100 ...


On utilise ensuite la fonction xyplot du package lattice. Ci-dessous deux exemples basiques:

Code : Tout sélectionner

library(lattice)
xyplot(concentration ~ Time, groups = Week, data = Data,
       type = c("g", "b"), auto.key = TRUE)

xyplot(concentration ~ Time | Week, data = Data,
       type = c("g", "b"),)


Renaud

hajer labidi
Messages : 42
Enregistré le : 03 Jan 2009, 11:30

Messagepar hajer labidi » 17 Mar 2009, 11:14

Re Bonjour,

en appliquant le code qui permet de supprimer les moyennes journalières quand les données sont moins de 48, sur la totalité du tableau contenant plus que 30 000 valeurs, j'étais surprise d'avoir ce message

Code : Tout sélectionner

Il y a eu 50 avis ou plus (utilisez warnings() pour voir les 50 premiers)

et puis en tapant Liste pour avoir les moyennes j'ai eu
-NULL: pour les jours qui devraient être supprimés (c'est bon)
-mais NA: pour les jours qui seront validés et bizarrement pas de valeurs! :?

je comprends pas, surtout que ça a bien marché pour l'extrait que je vous ai communiqué!

pouvez vous m'aider SVP?

Merci d'avance
Cordialement

hajer labidi
Messages : 42
Enregistré le : 03 Jan 2009, 11:30

Messagepar hajer labidi » 27 Mar 2009, 00:00

Re Salut,

Le code qui permet de supprimer les jours non validés a finalement fonctionné pour l'ensemble des données.

juste une question pour mieux assimiler: en tapant

Code : Tout sélectionner

dfr$jour <- format(dfr$date, format = "%x")

Est-ce que le 'x' désigne par défaut, uniquement les dates cad sans considérer le terme du temps?

-concernant les courbes relatives aux semaines, ça n’a pas vraiment donné le résultat que je cherchais… j'ai utilisé les résultats de la première partie (cad les moyennes journalières et non les valeurs toutes les 15 mn), voici la combinaison des deux codes

Code : Tout sélectionner

dfr$jour <- format(dfr$date, format = "%x")
h<- table(dfr$jour)
Liste <- by(dfr,
             list(jour = dfr$jour),
             function(x){
               if(nrow(x) >= 48)
                 data.frame(jour = unique(x$jour),
                            m = mean(x$concentration))
               else
                 NULL
               })

result <- do.call("rbind", Liste)
rownames(result) <- seq(nrow(result))

result$Year <- format(result$jour, format="%Y")
result$Week <- format(result$jour, format="%W")
 
result$jour <- as.POSIXct(result$jour, tz = " ")
 Liste <- by(result,
             list(Year = result$Year, Week = result$Week),
             function(x){
                 debut <- min(x$jour); fin <- max(x$jour)
                 xjour <- seq(from = debut, to = fin, by = "1 day")
                 tmp <- data.frame(jour = xjour,
                                   Week = format(xjour, format="%W"),
                                   Year = format(xjour, format="%Y"))
                 X <- merge(x, tmp, all = TRUE)
                 X$Time <- as.numeric(X$jour - debut)
                 X

                 })

 Data <- do.call("rbind", Liste)

library(lattice)
xyplot(m ~ Time, groups = Week, data = Data,
       type = c("g", "b"), auto.key = TRUE)


voila, je vous explique par un exemple ce que j’essaie de faire :
sur l’axe des abscisses on trouve les jours de la semaine, du dimanche au samedi ainsi sur un mois on aura 4 courbes des 4 semaines et chaque courbe contient les valeurs journalières calculées.

Merci pour les réponses précédentes et merci pour les explications et l’aide que j'espère avoir.

Cordialement

Olivier Delaigue
Messages : 220
Enregistré le : 05 Déc 2006, 07:38

Messagepar Olivier Delaigue » 27 Mar 2009, 07:37

le format = "%x", ne désigne que la date sans l'heur, oui.
Voir ?strptime.


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité