Précédent   Forum des professionnels en informatique > Bases de données > Firebird
Firebird Forum d'entraide sur le SGBD Firebird. Avant de poster -> F.A.Q Firebird, Tutoriels
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/10/2007, 21h15   #1
Membre à l'essai
 
Inscription : avril 2003
Messages : 123
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 123
Points : 24
Points : 24
Par défaut calcul de variance et d'écart type

J'utilise IB6 open source, donc pas grand chose au niveau opérateurs statistiques : MIN, MAX, AVG, COUNT, SUM
Je souhaite calculer la variance d'élément "value" d'une table "Tbl". Il me faut donc faire la somme des carrés des différences entre les "value" et moyenne, le tout divisé par le nombre d'éléments.
Je travaille donc autour de la requête suivante :

Select SUM( (tbl.value - AVG(tbl.value) * (tbl.value - AVG(tbl.value)) / MOY(tbl.value) AS Variance
From tbl

mais j'ai une erreur d'aggregat ("invalide aggregate reference"); certainement au niveau de l'insertion de AVG dans SUM.

Une idée ?

Merci
__________________
Température de l'eau : 28 °
Température extérieure : 32°
Température au fond du verre : 50° ~ 55°
------ Mangez des bananes ----------
bidson est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2007, 21h17   #2
Membre à l'essai
 
Inscription : avril 2003
Messages : 123
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 123
Points : 24
Points : 24
Il faut lire :

Select SUM( (tbl.value - AVG(tbl.value)) * (tbl.value - AVG(tbl.value)) / MOY(tbl.value) AS Variance
From tbl

Il manquait une parenthèse !
Mais le problème deumerre !

Merci
__________________
Température de l'eau : 28 °
Température extérieure : 32°
Température au fond du verre : 50° ~ 55°
------ Mangez des bananes ----------
bidson est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2007, 22h15   #3
Membre expérimenté
 
Avatar de Haywire
 
Homme
Développeur Java
Inscription : mars 2006
Messages : 463
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : Belgique

Informations professionnelles :
Activité : Développeur Java
Secteur : Finance

Informations forums :
Inscription : mars 2006
Messages : 463
Points : 536
Points : 536
Je ne sais pas si ça va arranger le problème mais il manque toujours une parenthèse.

Select SUM
( ==> où est la parenthèse qui ferme celle ci ?
(tbl.value - AVG(tbl.value))
*
(tbl.value - AVG(tbl.value))
/ MOY(tbl.value) AS Variance
From tbl
Haywire est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/10/2007, 00h29   #4
Membre éclairé
 
Avatar de TryExceptEnd
 
Homme
Développeur informatique
Inscription : octobre 2006
Messages : 435
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2006
Messages : 435
Points : 347
Points : 347
En fait les fonctions d'agrégation imbriquées
Code :
SELECT SUM(colonne - AVG(colonne))
ne sont pas supportées par IB6, ni d'ailleurs par FB 2.0.1 que j'utilise.
Utilise plutôt une procédure stockée.
__________________
Si vous êtes libre, choisissez le Logiciel Libre.
TryExceptEnd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/10/2007, 09h35   #5
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
Variance = carré de l'écart type = (Sx² - (Sx)² /n) /(n-1)))

SELECT (SUM(x*x) -((SUM(x)*SUM(x)/COUNT(*))/COUNT(*)-1)))

cf Joe Celko
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/10/2007, 10h45   #6
Membre éclairé
 
Avatar de TryExceptEnd
 
Homme
Développeur informatique
Inscription : octobre 2006
Messages : 435
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2006
Messages : 435
Points : 347
Points : 347
En enlevant la derniére parenthèse, ça marche mais le résultat que j'ai eu sur un test n'est apparament pas un écart type même au carré, puisque c'est un énorme chiffre.
__________________
Si vous êtes libre, choisissez le Logiciel Libre.
TryExceptEnd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/10/2007, 13h35   #7
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
bah, faute dans le bouquin alors

c'est plutot ça en fait :
(SUM(x*x)/COUNT(*)) -((SUM(x)/COUNT(*))*(SUM(x)/COUNT(*)))

enfin tu as l'idée, vérifie la formule
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/10/2007, 14h17   #8
Membre à l'essai
 
Inscription : avril 2003
Messages : 123
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 123
Points : 24
Points : 24
bravo et merci !

la formule est bien :

Variance = carré de l'écart type = (Sx² - (Sx)² /n) / n
i.e : ( SUM(x * x) - ( (SUM(x) * SUM(x)) / COUNT(x) )) / COUNT(x)
ou
Variance = carré de l'écart type = Sx² / n - (Sx / n)²
i.e : (SUM(x*x)/COUNT(*)) -((SUM(x)/COUNT(*))*(SUM(x)/COUNT(*)))
__________________
Température de l'eau : 28 °
Température extérieure : 32°
Température au fond du verre : 50° ~ 55°
------ Mangez des bananes ----------
bidson est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h33.


 
 
 
 
Partenaires

Hébergement Web