OVH Cloud OVH Cloud

Moyenne glissante ou moving average

16 réponses
Avatar
alexia_new
Bonjour,

Quelqu'un peut-il me dire comment calculer un emoyenne glissante sous Access
? Cette fonction contrairement à Excel ne semble pas exister sous Access ?

6 réponses

1 2
Avatar
alexia_new
ERRATUM
Petit soucis dans l'envoi de mon post, il est en 3 exemplaires . ;-(
prend en compte le 1er et oublie les 2 autres. Merci. A+
Alexia



re,

J'avais oublié de préciser que le champ AnneeMois doit être trié en
ordre croissant dans la 1ere requête (ou la 2eme) pour que la 2eme
requête affiche les données de manière cohérente.



--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr



Avatar
Eric
Bonjour,

Bon, pas super cool la table mais enfin.

1 - Créer une requête RQ0 sur la table avec un champ calculé faisant la
concaténation des champs IMP Name , date_xx et ROF
CC: [IMP Name] & [Date_YYYY] & Format([Date_MM];"00") &
Format([Date_DD];"00") & [ROF]
et mettre le tri croissant sur ces champs là (dans cet ordre)

2 - Créer une nouvelle requête sur RQ0 avec en 1ere colonne un champ
Compteur défini comme suit:
Compteur: CpteDom("*";"RQ0";"CC<" & Car(34) & [CC] & Car(34))+1
CAR(34) = " car tes champs [IMP Name] contiennent des '
Mettre les autres champs utiles
*Transformer* cette requête en mode création de Table pour créer une
table contenant les données à traiter avec le compteur (les opérations
faisant appel à des fonctions de domaines sont pénalisantes, alors si en
plus on doit dans la meme requête faire calculer le compteur, on s'en
sort plus) Nb : la requête création de table sur le 2750 enregistrements
initiaux prend 1 minute environ. Soit RQ1 cette requête Création de
table et Test le nom de la table.

3 - Création d'une nouvelle requête RQ2 basée sur la table précédement
créée Test.
Les champs nécessaires et un champ calculé:
Moving Average: VraiFaux(Pas
EstNull(RechDom("compteur";"Test";"Compteur=" & [compteur]-3 & " and
[IMP Name]=" & Car(34) & [Imp Name] & Car(34)));MoyDom("[Total
Score]";"Test";"Compteur Between " & [Compteur]-3 & " and " & [Compteur]
& " And [IMP Name]=" & Car(34) & [IMP Name] & Car(34));0)

Tu auras alors pour les 2750 enregistrements tes Moving Average. C'est
quasi-instantané.

La base ici : http://cjoint.com/?cbpunaQTgv

PS : Je ne suis pas staticticien mais quelques remarques/questions:
La moving Average avec t=4 ne peut être égale à la moyenne sauf s'il y a
exactement 4 et seulement 4 observations.
Comment comparer une moyenne globale avec une moyenne glissante ?


Hello Eric,

Tout d'abord un grand merci pour ton aide. J'ai pensé que le plus simple
serait de t'envoyer ma base de donnée que j'ai limité en taille bien sûr, ce
n'est qu'un exemple mais qui reprend bien mes besoins. Tu trouveras le
fichier zippé à cette adresse : http://cjoint.com/?cbj5ppRPKr

Je t'ai mis la base de données Access, ds la requête :Requête1 conversion du
mois en string, j'ai transformé le moi du numérique en string. Dans la
requête :Requête2 Moyenne arith de total score par Imp Name, je te présente
mon calcul de moyenne arithmétique pour le champ Total score et ceci avec un
group by sur l'IMP_Name.

C'est ce calcul que je voudrais reproduire mais en utilisant cette fois la
moyenne mobile ou glissante sur par exemple les 4 derniers enregistrements
(donc avec un intervalle ou décalage de 4). Le but de la manoeuvre ici c'est
que j'accorde plus de poids ou d'importance ou records les plus récents. Je
t'ai mis dans le fichier excel ce que je souhaiterais avoir comme résultat
(en l'automatisant sous Access car j'ai un nb de records dans ma base très
important). Par contre pour ton info, je n'ai jamais programmé sous Access,
je manipule que les tables et requêtes en faisant des liens entre elles, je
sais modifier le code SQL dans les requêtes, bref je maîtrise assez bien
l'outil ; j'ai fait de l'Sql sous Oracle et sous SQL+ mais c'est tout. Je
suis statisticienne, mais pas informaticienne ... J'ai appris tout sur le
tas.

Dans le fichier Excel, tu trouveras qqs résultats :

A & W MADAGASCAR S.A.R.L. / avg = 3,046042715 et Moy mobile (t=4) =
3,046042715. Ici on a le même résultat car le nb de records est <=4 donc
moyenne mobile=moyenne arithmétique.

A chaque fois que le nb de records pour un Imp_name i donné : IMP_i est <=4
alors avg de Total score pour IMP_i = moyenne mobile de Total score pour IMP_i

AD COMPANY / avg=1,616586273 et Moy mobile (t=4) =0,051464125

AIR MADAGASCAR / avg,31536414 et Moy mobile (t=4)=3,867241505

AQUACULTURE DE LA MAHAJAMBA / avg et Moy mobile (t=4)=7,033275216

A partir de ces exemples, on voit que si on prend les 4 dernières moyennes
lissées, on a une moyenne pour le champ Total score bien inférieure à ce
quelle serait si on prenait la totalité de la période. Sur une période
récente la moyenne de Total score
est plus faible.

Voilà exposé mon problème, je suis à ton écoute si tu as une idée pour
maiguiller ou me dire comment faire. A très bientôt et merci encore pour ton
aide.




Bonjour,

Il n'est pas necesaire que (Annee-Mois) constitue la clé primaire. Pour
la suite, je remplacerai Annee par An et Mois par LeMois car annee et
mois sont des mots réservés.

Dans une fonction de Domaine ( MoyDom, RechDom, MaxDom, SomDom ...) le
3eme argument appelé critère est une clause SQL Where sans le mot Where.
Le SQL s'écrit en US. C'est pourquoi j'ai mis
MoyDom("Effectif";"JG";"cstr([annee]) & [Mois]<='" où CStr est le mot US
pour correspondant à CChaîne ( ah le french avec ses accents ^ !
Par contre, je concatène ensuite un champ de la requête, après le &
et là, étant sorti de la chaîne SQL, je dois revenir au French, même si
je le fais pas Access s'en chargera.
Oui CChaîne est une fonction qui convertit en Chaine de caractères la
variable passée. On est obligé de passer par là pour concaténer l'année
et le mois pour les calculs.

Pour répondre à ton besoin, la démarche est la suivante:

A - Création d'une requête avec les champs voulus et ajout d'un champ
concaténant l'année et le mois, et d'un champ calculé qui sert de
compteur. Soit RQALEXIA1 cette requête.

1er champ - Compteur:Compteur: CpteDom("*";"alexia";"Cstr(An) &
format(lemois,'00')<'" & [AnneeMois] & "'")+1
2eme champ - AnneeMois: CChaîne([An]) & Format([LeMois];"00")
3e champ - An
4e champ - LeMois
5e champ - Effectif

B - Création d'une requête calculant la moyenne glissante basée sur la
requête précédente:

1er champ - An
2e champ - LeMois
3e champ - Effectif
4e champ - Moving Average:
VraiFaux([Compteur]>4;MoyDom("Effectif";"RQAlexia1";"Compteur Between "
& [Compteur]-4 & " and " & [Compteur]);Null)

Remarque : Faut-il arrondir les valeurs de Moving Average ?

Et voila.

(PS: Les formules des champs calculés tiennent sur une ligne)
PS2: Si problème, je peux te mettre une BD avec ton exemple et les 2
requêtes sur cjoint.com


Bonsoir Eric,

J'ai regardé la requête et j'avoue avoir qqs questions. Déjà, est-on obligé
de mettre mois et année en clés primaires ? Ensuite en décomposant la formule
:

Avec Round: Round(MoyDom("Effectif";"JG";"cstr([annee]) & [Mois]<='" &
CChaîne([annee]) & [Mois] & "'");0)

je remarque que si j'écris : Expr2: "cstr([annee]) & [Mois]<='" &
CChaîne([annee]) & [Mois] & "'"
cela me donne comme résultat dans le champs: Expr2 :
cstr([annee]) & [Mois]<='200501', je ne comprends pas trop à quoi sert cette
partie mais je devine le but de la manip. Par contre, dès que je réduis
l'expression à : Expr1: cstr([annee]) & [Mois], ce que j'ai tapé se
transforme en Expr1: CChaîne([annee]) & [Mois] avec en résultat : 200501 (A
quoi correspond cette fonction CChaîne, visiblement à passer du format nombre
en texte ? )
Sinon, ma question est la suivante, si je veux effectuer cette moyenne
glissante en introduisant un pas de 5 (t+5) par exemple, cad que je veux
calculer la moyenne glissante avec un décalage toujours de de 1 mais avec
une moyenne calculée à chaque fois sur les 5 derniers records et ceci en
glissant de mois en mois, comment puis-je faire ?

Annee Mois Effectif Moyenne glissante pas de 5
2005 01 100
2005 02 110
2005 03 120
2005 04 110
2006 01 300 148
2006 02 303 188,6
2006 03 200 206,6
2006 04 400 262,6
2006 05 150 270,6
2006 06 350 280,6
2006 07 270 274

Merci encore pour votre aide.

Alexia



--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr




--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr



Avatar
alexia_new
Merci Eric pour toutes ces informations.je teste cela demain et te tiens au
courant.
Concernant tes questions en fin de post : j'ai calculé ds un 1er tps la
moyenne simple puis je cherche à calculer la moyenne mobile dans un second
temps mais il s'avère que parfois le nombre d'observations est inférieur à
l'intervalle choisi pour le calcul de la moving avg. Aussi, si n=4 alors on a
bien moving avg = arith avg cf A & W MADAGASCAR S.A.R.L. / avg =
3,046042715
Si n<4 par ex n=2 cf ANGE ONE ds mon fichier excel et bien là on ne peut que
calculer la moyenne arith puisque le nb d'obs n =2 et est < à l'intervalle
t=4. On peut soit faire comme excel et afficher N/a#- on ne peut pas la
calculer- ou considérer dans ce cas par défaut la moyenne arith comme
représentative ... et oui, pas le choix ! A très binetôt Monsieur l'expert
Access. Tetiens au courant et encore merci

Alexia



Bonjour,

Bon, pas super cool la table mais enfin.

1 - Créer une requête RQ0 sur la table avec un champ calculé faisant la
concaténation des champs IMP Name , date_xx et ROF
CC: [IMP Name] & [Date_YYYY] & Format([Date_MM];"00") &
Format([Date_DD];"00") & [ROF]
et mettre le tri croissant sur ces champs là (dans cet ordre)

2 - Créer une nouvelle requête sur RQ0 avec en 1ere colonne un champ
Compteur défini comme suit:
Compteur: CpteDom("*";"RQ0";"CC<" & Car(34) & [CC] & Car(34))+1
CAR(34) = " car tes champs [IMP Name] contiennent des '
Mettre les autres champs utiles
*Transformer* cette requête en mode création de Table pour créer une
table contenant les données à traiter avec le compteur (les opérations
faisant appel à des fonctions de domaines sont pénalisantes, alors si en
plus on doit dans la meme requête faire calculer le compteur, on s'en
sort plus) Nb : la requête création de table sur le 2750 enregistrements
initiaux prend 1 minute environ. Soit RQ1 cette requête Création de
table et Test le nom de la table.

3 - Création d'une nouvelle requête RQ2 basée sur la table précédement
créée Test.
Les champs nécessaires et un champ calculé:
Moving Average: VraiFaux(Pas
EstNull(RechDom("compteur";"Test";"Compteur=" & [compteur]-3 & " and
[IMP Name]=" & Car(34) & [Imp Name] & Car(34)));MoyDom("[Total
Score]";"Test";"Compteur Between " & [Compteur]-3 & " and " & [Compteur]
& " And [IMP Name]=" & Car(34) & [IMP Name] & Car(34));0)

Tu auras alors pour les 2750 enregistrements tes Moving Average. C'est
quasi-instantané.

La base ici : http://cjoint.com/?cbpunaQTgv

PS : Je ne suis pas staticticien mais quelques remarques/questions:
La moving Average avec t=4 ne peut être égale à la moyenne sauf s'il y a
exactement 4 et seulement 4 observations.
Comment comparer une moyenne globale avec une moyenne glissante ?


Hello Eric,

Tout d'abord un grand merci pour ton aide. J'ai pensé que le plus simple
serait de t'envoyer ma base de donnée que j'ai limité en taille bien sûr, ce
n'est qu'un exemple mais qui reprend bien mes besoins. Tu trouveras le
fichier zippé à cette adresse : http://cjoint.com/?cbj5ppRPKr

Je t'ai mis la base de données Access, ds la requête :Requête1 conversion du
mois en string, j'ai transformé le moi du numérique en string. Dans la
requête :Requête2 Moyenne arith de total score par Imp Name, je te présente
mon calcul de moyenne arithmétique pour le champ Total score et ceci avec un
group by sur l'IMP_Name.

C'est ce calcul que je voudrais reproduire mais en utilisant cette fois la
moyenne mobile ou glissante sur par exemple les 4 derniers enregistrements
(donc avec un intervalle ou décalage de 4). Le but de la manoeuvre ici c'est
que j'accorde plus de poids ou d'importance ou records les plus récents. Je
t'ai mis dans le fichier excel ce que je souhaiterais avoir comme résultat
(en l'automatisant sous Access car j'ai un nb de records dans ma base très
important). Par contre pour ton info, je n'ai jamais programmé sous Access,
je manipule que les tables et requêtes en faisant des liens entre elles, je
sais modifier le code SQL dans les requêtes, bref je maîtrise assez bien
l'outil ; j'ai fait de l'Sql sous Oracle et sous SQL+ mais c'est tout. Je
suis statisticienne, mais pas informaticienne ... J'ai appris tout sur le
tas.

Dans le fichier Excel, tu trouveras qqs résultats :

A & W MADAGASCAR S.A.R.L. / avg = 3,046042715 et Moy mobile (t=4) =
3,046042715. Ici on a le même résultat car le nb de records est <=4 donc
moyenne mobile=moyenne arithmétique.

A chaque fois que le nb de records pour un Imp_name i donné : IMP_i est <=4
alors avg de Total score pour IMP_i = moyenne mobile de Total score pour IMP_i

AD COMPANY / avg=1,616586273 et Moy mobile (t=4) =0,051464125

AIR MADAGASCAR / avg,31536414 et Moy mobile (t=4)=3,867241505

AQUACULTURE DE LA MAHAJAMBA / avg et Moy mobile (t=4)=7,033275216

A partir de ces exemples, on voit que si on prend les 4 dernières moyennes
lissées, on a une moyenne pour le champ Total score bien inférieure à ce
quelle serait si on prenait la totalité de la période. Sur une période
récente la moyenne de Total score
est plus faible.

Voilà exposé mon problème, je suis à ton écoute si tu as une idée pour
maiguiller ou me dire comment faire. A très bientôt et merci encore pour ton
aide.




Bonjour,

Il n'est pas necesaire que (Annee-Mois) constitue la clé primaire. Pour
la suite, je remplacerai Annee par An et Mois par LeMois car annee et
mois sont des mots réservés.

Dans une fonction de Domaine ( MoyDom, RechDom, MaxDom, SomDom ...) le
3eme argument appelé critère est une clause SQL Where sans le mot Where.
Le SQL s'écrit en US. C'est pourquoi j'ai mis
MoyDom("Effectif";"JG";"cstr([annee]) & [Mois]<='" où CStr est le mot US
pour correspondant à CChaîne ( ah le french avec ses accents ^ !
Par contre, je concatène ensuite un champ de la requête, après le &
et là, étant sorti de la chaîne SQL, je dois revenir au French, même si
je le fais pas Access s'en chargera.
Oui CChaîne est une fonction qui convertit en Chaine de caractères la
variable passée. On est obligé de passer par là pour concaténer l'année
et le mois pour les calculs.

Pour répondre à ton besoin, la démarche est la suivante:

A - Création d'une requête avec les champs voulus et ajout d'un champ
concaténant l'année et le mois, et d'un champ calculé qui sert de
compteur. Soit RQALEXIA1 cette requête.

1er champ - Compteur:Compteur: CpteDom("*";"alexia";"Cstr(An) &
format(lemois,'00')<'" & [AnneeMois] & "'")+1
2eme champ - AnneeMois: CChaîne([An]) & Format([LeMois];"00")
3e champ - An
4e champ - LeMois
5e champ - Effectif

B - Création d'une requête calculant la moyenne glissante basée sur la
requête précédente:

1er champ - An
2e champ - LeMois
3e champ - Effectif
4e champ - Moving Average:
VraiFaux([Compteur]>4;MoyDom("Effectif";"RQAlexia1";"Compteur Between "
& [Compteur]-4 & " and " & [Compteur]);Null)

Remarque : Faut-il arrondir les valeurs de Moving Average ?

Et voila.

(PS: Les formules des champs calculés tiennent sur une ligne)
PS2: Si problème, je peux te mettre une BD avec ton exemple et les 2
requêtes sur cjoint.com


Bonsoir Eric,

J'ai regardé la requête et j'avoue avoir qqs questions. Déjà, est-on obligé
de mettre mois et année en clés primaires ? Ensuite en décomposant la formule
:

Avec Round: Round(MoyDom("Effectif";"JG";"cstr([annee]) & [Mois]<='" &
CChaîne([annee]) & [Mois] & "'");0)

je remarque que si j'écris : Expr2: "cstr([annee]) & [Mois]<='" &
CChaîne([annee]) & [Mois] & "'"
cela me donne comme résultat dans le champs: Expr2 :
cstr([annee]) & [Mois]<='200501', je ne comprends pas trop à quoi sert cette
partie mais je devine le but de la manip. Par contre, dès que je réduis
l'expression à : Expr1: cstr([annee]) & [Mois], ce que j'ai tapé se
transforme en Expr1: CChaîne([annee]) & [Mois] avec en résultat : 200501 (A
quoi correspond cette fonction CChaîne, visiblement à passer du format nombre
en texte ? )
Sinon, ma question est la suivante, si je veux effectuer cette moyenne
glissante en introduisant un pas de 5 (t+5) par exemple, cad que je veux
calculer la moyenne glissante avec un décalage toujours de de 1 mais avec
une moyenne calculée à chaque fois sur les 5 derniers records et ceci en
glissant de mois en mois, comment puis-je faire ?

Annee Mois Effectif Moyenne glissante pas de 5
2005 01 100
2005 02 110
2005 03 120
2005 04 110
2006 01 300 148
2006 02 303 188,6
2006 03 200 206,6
2006 04 400 262,6
2006 05 150 270,6
2006 06 350 280,6
2006 07 270 274

Merci encore pour votre aide.

Alexia



--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr




--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr






Avatar
Eric
Bonsoir,

Si tu ne veut pas afficher 0 pour les Moving Average qui ne peuvent être
calculées (car pas asez de données), remplaces le dernier argument dans
le VraiFaux ( soit 0) par Null dans RQ2.
--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr
Avatar
alexia_new
Bonsoir Eric,
Merci bcp pour ton aide, j'ai enfin trouver le temps de tester les requêtes
et effectivement cela fonctionne super bien. Je n'ai pas tout suivi dans le
code mais l'essentiel c'est que cela tourne. Merci mille fois. Florence


Bonsoir,

Si tu ne veut pas afficher 0 pour les Moving Average qui ne peuvent être
calculées (car pas asez de données), remplaces le dernier argument dans
le VraiFaux ( soit 0) par Null dans RQ2.
--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr



Avatar
alexia_new
Bonjour Eric,

Pour info, j'ai mis un nouveau post aujourd'hui, il s'agit d'une question
relative aux requêtes imbriquées.
A bientôt
Florence


Bonsoir,

Si tu ne veut pas afficher 0 pour les Moving Average qui ne peuvent être
calculées (car pas asez de données), remplaces le dernier argument dans
le VraiFaux ( soit 0) par Null dans RQ2.
--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr



1 2