IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Problème avec les fonctions statistiques : Variance, Stddev, etc


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2011
    Messages : 60
    Par défaut Problème avec les fonctions statistiques : Variance, Stddev, etc
    Bonjour,

    Je rencontre un problème avec l'utilisation des fonctions statistiques d'Oracle. Je ne trouve pas les même résultats lorsque je fais les calcules de mon coté.

    Je vais prendre l'exemple 2 de ce site : http://www.statcan.gc.ca/edu/power-p...214891-fra.htm

    Si je reproduit cet exemple, je trouve :
    écart type oracle : 2.2894.... au lieu de 2.25....
    la variance aussi est différente.

    voici ma table et ses valeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    CREATE TABLE farmers (workers number, freq number, xf number, diff number, diff2 number, diff2f number);
     
    INSERT INTO farmers (workers) Values (0);
    INSERT INTO farmers (workers) Values (1);
    INSERT INTO farmers (workers) Values (2);
    INSERT INTO farmers (workers) Values (2);
    INSERT INTO farmers (workers) Values (3);
    INSERT INTO farmers (workers) Values (3);
    INSERT INTO farmers (workers) Values (3);
    INSERT INTO farmers (workers) Values (4);
    INSERT INTO farmers (workers) Values (4);
    INSERT INTO farmers (workers) Values (4);
    INSERT INTO farmers (workers) Values (4);
    INSERT INTO farmers (workers) Values (4);
    INSERT INTO farmers (workers) Values (4);
    INSERT INTO farmers (workers) Values (5);
    INSERT INTO farmers (workers) Values (5);
    INSERT INTO farmers (workers) Values (5);
    INSERT INTO farmers (workers) Values (5);
    INSERT INTO farmers (workers) Values (5);
    INSERT INTO farmers (workers) Values (6);
    INSERT INTO farmers (workers) Values (6);
    INSERT INTO farmers (workers) Values (6);
    INSERT INTO farmers (workers) Values (6);
    INSERT INTO farmers (workers) Values (7);
    INSERT INTO farmers (workers) Values (7);
    INSERT INTO farmers (workers) Values (7);
    INSERT INTO farmers (workers) Values (8);
    INSERT INTO farmers (workers) Values (8);
    INSERT INTO farmers (workers) Values (8);
    INSERT INTO farmers (workers) Values (9);
    INSERT INTO farmers (workers) Values (9);
    Mon programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    DECLARE
     
      CURSOR worker IS
        SELECT distinct workers from farmers;
     
      exist     NUMBER;
      counter   NUMBER;
      average   NUMBER;
      varaianc  NUMBER;
      varaianco NUMBER;
      stddevo   NUMBER;
     
    BEGIN
      FOR i IN worker LOOP
     
        SELECT count(freq) INTO exist FROM farmers WHERE workers = i.workers;
     
        -- Avoid to calculate the frequence
        IF exist = 0 THEN
          SELECT count(workers)
            INTO counter
            FROM farmers
           WHERE workers = i.workers;
     
          UPDATE farmers
             SET FREQ = counter,
                 XF  =
                 (workers * counter)
           WHERE workers = i.workers;
        END IF;
      END LOOP;
     
      SELECT sum(sum(distinct xf)) / sum(sum(distinct freq))
        INTO average
        FROM farmers
       GROUP BY workers;
     
      FOR i IN worker LOOP
     
        SELECT count(diff) INTO exist FROM farmers WHERE workers = i.workers;
     
        -- Avoid to calculate diff, ...
        IF exist = 0 THEN
     
          UPDATE farmers
             SET DIFF   = workers - average,
                 DIFF2 =
                 (workers - average) * (workers - average),
                 DIFF2F =
                 (workers - average) * (workers - average) * freq
           WHERE workers = i.workers;
        END IF;
      END LOOP;
     
      SELECT sum(sum(distinct diff2f))/sum(sum(distinct freq))
        INTO varaianc
        FROM farmers
       GROUP BY workers;
     
     
      SELECT variance(workers) INTO varaianco FROM farmers;
      SELECT stddev(workers) INTO stddevo FROM farmers;
     
     
      dbms_output.put_line('variance : ' || varaianc);
      dbms_output.put_line('oracle variance : ' || varaianco);
      dbms_output.put_line('standard dev : ' || sqrt(varaianc));
      dbms_output.put_line('oracle standard dev : ' || sqrt(varaianco));
     
    END;

    Je ne trouve aucune documentation sur comment Oracle fait calcule.
    Donc si quelqu'un voit où se trouve le problème...

    Merci d'avance.

  2. #2
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Salut !

    En fait, il y a deux estimateurs pour la variance... et ta formule varie légèrement.
    http://fr.wikipedia.org/wiki/Varianc...ilit%C3%A9s%29

    Je reprends ton calcul, mais je le compacte en une requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SQL> WITH t AS
      2  (SELECT avg(workers) avgw
      3     FROM farmers)
      4  select sum(power(workers - avgw, 2)) / (count(*)-1) s2n1, avg(power(workers - avgw, 2)) s2n, variance(workers) oras2n
      5  from farmers
      6    cross join t
      7  /
     
          S2N1        S2N     ORAS2N
    ---------- ---------- ----------
    5,24137931 5,06666667 5,24137931
    C'est pas une preuve absolue, mais je parierais qu'Oracle ajuste sa variance, en calculant sa variance sur "n-1"

    (Un grand merci à Sanna mon amie statisticienne allemande qui m'avait expliqué ça il y a quelques années... même si je n'ai pas retenu le vrai sens de tout ça )

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2011
    Messages : 60
    Par défaut
    Merci pour ta réponse pacmann.

    J'ai moi aussi eu le droit à une explication concernant le n-1 par un ami physicien

    Je te remercie au passage pour ta requête, je n'aurais jamais pensé à un cross join utilisé de cette façon !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problèmes avec les fonctions et replace
    Par Tommyl dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 01/12/2006, 21h34
  2. Problème avec les fonctions
    Par gizida dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 19/07/2006, 14h15
  3. Réponses: 2
    Dernier message: 10/05/2005, 10h58
  4. Problème avec les fonctions
    Par jvachez dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 13/01/2004, 12h06
  5. [Postgresql]Problème avec les fonctions ...
    Par fet dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/10/2003, 09h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo