From: | Stephane Bortzmeyer <bortzmeyer(at)nic(dot)fr> |
---|---|
To: | Sébastien DINOT <sebastien(dot)dinot(at)free(dot)fr> |
Cc: | pgsql-fr-generale(at)postgresql(dot)org |
Subject: | Re: Calcul de médiane |
Date: | 2007-02-21 11:22:58 |
Message-ID: | 20070221112258.GA25559@nic.fr |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-fr-generale |
On Wed, Feb 21, 2007 at 11:12:13AM +0100,
Sébastien DINOT <sebastien(dot)dinot(at)free(dot)fr> wrote
a message of 79 lines which said:
> Pour mémoire, la médiane est différente de la moyenne :
Oui, et, dans 90 % de cas où on utilise la moyenne, on devrait
utiliser la médiane à la place.
http://www.bortzmeyer.org/mediane-et-moyenne.html
Si on met vos données ainsi :
CREATE TABLE Data (
valeur FLOAT,
occurrences INTEGER);
INSERT INTO Data (valeur, occurrences) VALUES (0, 5);
INSERT INTO Data (valeur, occurrences) VALUES (10, 45);
INSERT INTO Data (valeur, occurrences) VALUES (12, 1);
INSERT INTO Data (valeur, occurrences) VALUES (20, 75);
INSERT INTO Data (valeur, occurrences) VALUES (25, 19);
INSERT INTO Data (valeur, occurrences) VALUES (30, 25);
INSERT INTO Data (valeur, occurrences) VALUES (480, 1);
INSERT INTO Data (valeur, occurrences) VALUES (50, 29);
Et que, pour aider, on crée les fonctions auxiliaires suivantes :
CREATE OR REPLACE FUNCTION occurrences_cumulees(FLOAT) RETURNS INTEGER AS
'SELECT sum(occurrences)::INTEGER FROM Data WHERE Valeur <= $1;'
LANGUAGE SQL;
CREATE OR REPLACE FUNCTION Moitie_population() RETURNS INTEGER AS
'SELECT sum(occurrences)::INTEGER/2 FROM Data;'
LANGUAGE SQL;
La médiane peut alors se calculer facilement :
SELECT min(valeur) AS median FROM Data
WHERE occurrences_cumulees(valeur) >= Moitie_population();
Testons :
essais=> SELECT valeur, occurrences, occurrences_cumulees(valeur) FROM Data ORDER BY valeur;
valeur | occurrences | occurrences_cumulees
--------+-------------+----------------------
0 | 5 | 5
10 | 45 | 50
12 | 1 | 51
20 | 75 | 126
25 | 19 | 145
30 | 25 | 170
50 | 29 | 199
480 | 1 | 200
(8 rows)
essais=> SELECT min(valeur) AS median FROM Data
essais-> WHERE occurrences_cumulees(valeur) >= Moitie_population();
median
--------
20
(1 row)
From | Date | Subject | |
---|---|---|---|
Next Message | Stephane Bortzmeyer | 2007-02-21 12:59:30 | Re: Calcul de médiane |
Previous Message | Sébastien DINOT | 2007-02-21 10:12:13 | Calcul de médiane |