{"id":166,"date":"2015-05-27T08:58:13","date_gmt":"2015-05-27T08:58:13","guid":{"rendered":"http:\/\/cms04397.apps-1and1.net\/?p=166"},"modified":"2015-05-27T08:58:13","modified_gmt":"2015-05-27T08:58:13","slug":"test-t-de-student-avec-oracle","status":"publish","type":"post","link":"https:\/\/blog.tiran.stream\/?p=166","title":{"rendered":"Test t de Student avec Oracle"},"content":{"rendered":"<p style=\"text-align: justify;\">Le minist\u00e8re de l&rsquo;environnement confie la surveillance de la qualit\u00e9 de l&rsquo;air \u00e0 des associations agr\u00e9\u00e9es. Celles-ci publient r\u00e9guli\u00e8rement des relev\u00e9s de mesure des niveaux de pr\u00e9sence de divers polluants.<\/p>\n<p style=\"text-align: justify;\">Pour la r\u00e9gion Centre, l&rsquo;association s&rsquo;appelle Lig&rsquo;Air et les donn\u00e9es collect\u00e9es sont accessibles sur leur site internet: <a href=\"http:\/\/www.ligair.fr\" target=\"_blank\">http:\/\/www.ligair.fr<\/a><\/p>\n<p style=\"text-align: justify;\">L&rsquo;ergonomie du site est tr\u00e8s bonne. On peut choisir une station de collecte (toutes n&rsquo;analysent pas les m\u00eames polluants) et une p\u00e9riode d&rsquo;analyse. Les r\u00e9sultats peuvent ensuite \u00eatre visualis\u00e9s graphiquement ou export\u00e9s au format Excel.<\/p>\n<p style=\"text-align: justify;\">Par curiosit\u00e9, je me suis int\u00e9ress\u00e9 aux collectes r\u00e9alis\u00e9es en\u00a0deux points particuliers de l&rsquo;agglom\u00e9ration de la ville de Tours:<\/p>\n<ul style=\"list-style-type: square; text-align: justify;\">\n<li>une zone de trafic routier assez dense en bordure de l&rsquo;A10: <a href=\"http:\/\/www.ligair.fr\/stations-de-mesure\/tours-pompidou\" target=\"_blank\">Tours &#8211; Pompidou<\/a><\/li>\n<li>une\u00a0zone plus r\u00e9sidentielle: <a href=\"http:\/\/www.ligair.fr\/stations-de-mesure\/tours-la-bruyere\" target=\"_blank\">Tours &#8211; La Bruy\u00e8re<\/a><\/li>\n<\/ul>\n<p style=\"text-align: justify;\">Le niveau de \u00ab\u00a0particules en suspension 10\u00b5m\u00a0\u00bb est mesur\u00e9\u00a0par ces deux stations et je cherche ici \u00e0 d\u00e9terminer s&rsquo;il est significativement diff\u00e9rent pour les deux zones.<\/p>\n<p style=\"text-align: justify;\">Pour cela, je vais effectuer un test <a href=\"http:\/\/fr.wikipedia.org\/wiki\/Test_de_Student\" target=\"_blank\">t de Student<\/a> sur les donn\u00e9es collect\u00e9es la semaine derni\u00e8re.<\/p>\n<p style=\"text-align: justify;\"><strong>Chargement des donn\u00e9es<\/strong><\/p>\n<p style=\"text-align: justify;\">Les donn\u00e9es \u00e9tant r\u00e9cup\u00e9r\u00e9es au format Excel, une conversion au format CSV est r\u00e9alis\u00e9e en premier lieu. Cf <a href=\"http:\/\/blog.tiran.info\/conversion-xls-vers-csv\">post<\/a>\u00a0correspondant.<\/p>\n<p style=\"text-align: justify;\">Le fichier converti utilis\u00e9 dans cet article est disponible ici:\u00a0<a href=\"https:\/\/blog.tiran.stream\/wp-content\/uploads\/2015\/05\/lig-air-derniere-semaine.csv\">lig-air-derniere-semaine<\/a><\/p>\n<p style=\"text-align: justify;\">J&rsquo;utilise ici la technique de table externe pour \u00ab\u00a0publier\u00a0\u00bb les donn\u00e9es (en effet, ces derni\u00e8res\u00a0ne sont pas \u00e0 proprement parler \u00ab\u00a0charg\u00e9es\u00a0\u00bb) en base:<\/p>\n<pre>SQL&gt; CREATE OR REPLACE DIRECTORY datadir AS 'C:\\RTI\\Stats';\n\nDirectory created.\n\nSQL&gt;\nSQL&gt; CREATE TABLE exttab_qualite_air\n  2  (\n  3     dt         DATE,\n  4     bruyere    NUMBER,\n  5     pompidou   NUMBER\n  6  )\n  7  ORGANIZATION EXTERNAL\n  8     (TYPE oracle_loader\n  9           DEFAULT DIRECTORY datadir\n 10              ACCESS PARAMETERS\n 11                  (\n 12                  RECORDS DELIMITED BY NEWLINE\n 13                  SKIP 1\n 14                  FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '\"'\n 15                  MISSING FIELD VALUES ARE NULL\n 16                  (dt CHAR DATE_FORMAT DATE MASK \"DD\/MM\/YYYY HH24:MI\", bruyere, pompidou)\n 17                  )\n 18           LOCATION ('lig-air-derniere-semaine.csv'));\n\nTable created.\n\nSQL&gt;<\/pre>\n<p><strong>V\u00e9rification des conditions d\u2019application du test de Student<\/strong><\/p>\n<ul style=\"text-align: justify;\">\n<li><a href=\"https:\/\/fr.wikipedia.org\/wiki\/Test_de_normalit%C3%A9\" target=\"_blank\">Normalit\u00e9<\/a> des \u00e9chantillons<\/li>\n<\/ul>\n<p style=\"text-align: justify;\">La proc\u00e9dure <a href=\"https:\/\/docs.oracle.com\/database\/121\/ARPLS\/d_stat_f.htm#ARPLS68476\" target=\"_blank\">NORMAL_DIST_FIT<\/a> du package DBMS_STAT_FUNCS permet de v\u00e9rifier l&rsquo;ad\u00e9quation de la distribution de nos \u00e9chantillons avec une loi normale. Plusieurs tests sont disponibles (<a href=\"http:\/\/fr.wikipedia.org\/wiki\/Test_de_Shapiro-Wilk\" target=\"_blank\">Shapiro-Wilk<\/a>, <a href=\"http:\/\/fr.wikipedia.org\/wiki\/Test_de_Kolmogorov-Smirnov\" target=\"_blank\">Kolmogorov-Smirnov<\/a> etc..) via le param\u00e8tre TEST_TYPE.<\/p>\n<p style=\"text-align: justify;\">Ci-dessous, on teste la normalit\u00e9 de l\u2019\u00e9chantillon POMPIDOU avec le test de Shapiro-Wilk et celle de l\u2019\u00e9chantillon BRUYERE avec le test de Kolmogorov-Smirnov :<\/p>\n<pre>SQL&gt; SET SERVEROUTPUT ON FORMAT WRAPPED\nSQL&gt;\nSQL&gt; DECLARE\n  2     l_mean    NUMBER;\n  3     l_stdev   NUMBER;\n  4     l_sig     NUMBER;\n  5  BEGIN\n  6     DBMS_OUTPUT.put_line ('-------------------------------------------------');\n  7     DBMS_OUTPUT.put_line ('- Test de Shapiro - Wilks [POMPIDOU]');\n  8     DBMS_OUTPUT.put_line ('-------------------------------------------------');\n  9     DBMS_OUTPUT.put_line (' ');\n 10\n 11     DBMS_STAT_FUNCS.NORMAL_DIST_FIT (ownername    =&gt; USER,\n 12                                      tablename    =&gt; 'EXTTAB_QUALITE_AIR',\n 13                                      columnname   =&gt; 'POMPIDOU',\n 14                                      test_type    =&gt; 'SHAPIRO_WILKS',\n 15                                      mean         =&gt; l_mean,\n 16                                      stdev        =&gt; l_stdev,\n 17                                      sig          =&gt; l_sig);\n 18     DBMS_OUTPUT.put_line ('p-valeur: ' || ROUND (l_sig, 3));\n 19     DBMS_OUTPUT.put_line ('Moyenne: ' || ROUND (l_mean, 3));\n 20     DBMS_OUTPUT.put_line ('Ecart Type: ' || ROUND (l_stdev, 3));\n 21     DBMS_OUTPUT.put_line (' ');\n 22\n 23     l_mean := NULL;\n 24     l_stdev := NULL;\n 25     DBMS_OUTPUT.put_line ('-------------------------------------------------');\n 26     DBMS_OUTPUT.put_line ('- Test de Kolmogorov - Smirnov [BRUYERE]');\n 27     DBMS_OUTPUT.put_line ('-------------------------------------------------');\n 28     DBMS_STAT_FUNCS.NORMAL_DIST_FIT (ownername    =&gt; USER,\n 29                                      tablename    =&gt; 'EXTTAB_QUALITE_AIR',\n 30                                      columnname   =&gt; 'BRUYERE',\n 31                                      test_type    =&gt; 'KOLMOGOROV_SMIRNOV',\n 32                                      mean         =&gt; l_mean,\n 33                                      stdev        =&gt; l_stdev,\n 34                                      sig          =&gt; l_sig);\n 35     DBMS_OUTPUT.put_line ('p-valeur: ' || ROUND (l_sig, 3));\n 36     DBMS_OUTPUT.put_line ('Moyenne: ' || ROUND (l_mean, 3));\n 37     DBMS_OUTPUT.put_line ('Ecart Type: ' || ROUND (l_stdev, 3));\n 38     DBMS_OUTPUT.put_line (' ');\n 39  END;\n 40  \/\n-------------------------------------------------\n- Test de Shapiro - Wilks [POMPIDOU]\n-------------------------------------------------\n\nW value : .9888824771661467424766391097812566472472\np-valeur: .22\nMoyenne: 12.766\nEcart Type: 5.182\n\n-------------------------------------------------\n- Test de Kolmogorov - Smirnov [BRUYERE]\n-------------------------------------------------\nD value : .083441939506389419096614147948279169237\np-valeur: .189\nMoyenne: 10.759\nEcart Type: 5.049\n\n\nPL\/SQL procedure successfully completed.\n\nSQL&gt;<\/pre>\n<p>Pour les deux tests, l&rsquo;hypoth\u00e8se nulle (H0) correspond au fait que nos \u00e9chantillons sont extraits d&rsquo;une population normalement distribu\u00e9e.<\/p>\n<p style=\"text-align: justify;\">La p-value \u00e9tant dans\u00a0les deux cas (BRUYERE &amp; POMPIDOU) sup\u00e9rieure au seuil de 5%, nous ne pouvons pas rejeter H0 et l&rsquo;hypoth\u00e8se de normalit\u00e9 est donc compatible avec nos donn\u00e9es.<\/p>\n<p style=\"text-align: justify;\">A noter que le nombre d&rsquo;observation \u00e9tant relativement important, on aurait pu se passer de cette v\u00e9rification dans la mesure o\u00f9 en vertu du <a href=\"http:\/\/fr.wikipedia.org\/wiki\/Th%C3%A9or%C3%A8me_central_limite\" target=\"_blank\">Th\u00e9or\u00e8me Central Limite<\/a>, les moyennes de variables al\u00e9atoires tendent \u00e0 converger vers une distribution gaussienne pour de \u00ab\u00a0grands\u00a0\u00bb (&gt;30) \u00e9chantillons.<\/p>\n<ul>\n<li style=\"text-align: justify;\"><a href=\"http:\/\/fr.wikipedia.org\/wiki\/Homosc%C3%A9dasticit%C3%A9\" target=\"_blank\">Homosc\u00e9dasticit\u00e9 <\/a><\/li>\n<\/ul>\n<p style=\"text-align: justify;\">Un <a href=\"http:\/\/fr.wikipedia.org\/wiki\/Test_de_Fisher\" target=\"_blank\">test de Fisher<\/a> peut \u00eatre utilis\u00e9 pour valider la concordance des variances. La fonction <a href=\"http:\/\/docs.oracle.com\/database\/121\/SQLRF\/functions185.htm#SQLRF06318\" target=\"_blank\">STATS_F_TEST<\/a> permet sa mise en \u0153uvre en base. Cette fonction prend deux champs en argument, le premier sert de crit\u00e8re de regroupement et le second contient les donn\u00e9es \u00e0 analyser.<br \/>\nPour se ramener dans ce cas de figure, on utilise une clause WITH (subquery factoring) au sein de laquelle les deux colonnes sont fusionn\u00e9es via un op\u00e9rateur UNION ALL:<\/p>\n<pre>SQL&gt; WITH releves\n  2       AS (SELECT 'P' station, pompidou val FROM exttab_qualite_air\n  3           UNION ALL\n  4           SELECT 'B' station, bruyere val FROM exttab_qualite_air)\n  5  SELECT STATS_F_TEST (station,\n  6                       val,\n  7                       'STATISTIC',\n  8                       'B')\n  9            f_value,\n 10         STATS_F_TEST (station, val, 'TWO_SIDED_SIG') p_value\n 11    FROM releves;\n\n   F_VALUE    P_VALUE\n---------- ----------\n.949371992 .739270937\n\nSQL&gt;<\/pre>\n<p>Ici, il s&rsquo;agit d&rsquo;un test bilat\u00e9ral (TWO_SIDED_SIG) avec pour\u00a0hypoth\u00e8se nulle que\u00a0les variances des deux populations dont sont pr\u00e9lev\u00e9s les \u00e9chantillons sont \u00e9gales.<br \/>\nComme la p-valeur est sup\u00e9rieure au seuil de 5%, nous ne rejetons pas H0 et on consid\u00e8re que les donn\u00e9es sont compatibles avec l&rsquo;hypoth\u00e8se d&rsquo;homosc\u00e9dasticit\u00e9.<\/p>\n<p style=\"text-align: justify;\"><strong>R\u00e9alisation du test de Student<\/strong><\/p>\n<p style=\"text-align: justify;\">Une fois les conditions d&rsquo;utilisation valid\u00e9es, on peut r\u00e9aliser le test via la fonction <a href=\"http:\/\/docs.oracle.com\/database\/121\/SQLRF\/functions190.htm#SQLRF06323\" target=\"_blank\">STATS_T_TEST_INDEP<\/a>:<\/p>\n<pre>SQL&gt; WITH releves\n  2       AS (SELECT 'P' station, pompidou val FROM exttab_qualite_air\n  3           UNION ALL\n  4           SELECT 'B' station, bruyere val FROM exttab_qualite_air)\n  5  SELECT STATS_T_TEST_INDEP (station,\n  6                             val,\n  7                             'STATISTIC',\n  8                             'P')\n  9            t_value,\n 10         STATS_T_TEST_INDEP (station,\n 11                             val,\n 12                             'ONE_SIDED_SIG',\n 13                             'P')\n 14            p_value_unilateral\n 15    FROM releves;\n\n   T_VALUE P_VALUE_UNILATERAL\n---------- ------------------\n 3.5687916         .000205995\n\nSQL&gt;<\/pre>\n<p>Sous l&rsquo;hypoth\u00e8se H0, on consid\u00e8re que les moyennes des niveaux de pr\u00e9sence des particules en suspension ne sont pas statistiquement diff\u00e9rente entre les deux stations.<br \/>\nLa p-valeur du test \u00e9tant tr\u00e8s faible, on rejette H0 au b\u00e9n\u00e9fice de l&rsquo;hypoth\u00e8se alternative selon laquelle il y a bien une diff\u00e9rence statistiquement significative entre les deux sites.<\/p>\n<p style=\"text-align: justify;\">De plus, comme on a r\u00e9alis\u00e9 un test unilat\u00e9ral avec le site de Pompidou \u00ab\u00a0P\u00a0\u00bb comme r\u00e9f\u00e9rence haute, on peut dire que la moyenne du niveau de pr\u00e9sence de particules est significativement plus \u00e9lev\u00e9e sur ce site par rapport \u00e0 celui de Bruy\u00e8re.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Le minist\u00e8re de l&rsquo;environnement confie la surveillance de la qualit\u00e9 de l&rsquo;air \u00e0 des associations agr\u00e9\u00e9es. Celles-ci publient r\u00e9guli\u00e8rement des<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"colormag_page_container_layout":"default_layout","colormag_page_sidebar_layout":"default_layout","footnotes":""},"categories":[6,14,16],"tags":[],"class_list":["post-166","post","type-post","status-publish","format-standard","hentry","category-oracle","category-statistique","category-tests-dhypotheses"],"_links":{"self":[{"href":"https:\/\/blog.tiran.stream\/index.php?rest_route=\/wp\/v2\/posts\/166","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.tiran.stream\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.tiran.stream\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.tiran.stream\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.tiran.stream\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=166"}],"version-history":[{"count":0,"href":"https:\/\/blog.tiran.stream\/index.php?rest_route=\/wp\/v2\/posts\/166\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.tiran.stream\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=166"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.tiran.stream\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=166"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.tiran.stream\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=166"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}