Re: Calcul de médiane

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)

In response to

Responses

Browse pgsql-fr-generale by date

  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