{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# TP5 - Outils numériques pour les Statistiques Descriptives \n",
    "\n",
    "Rappel : les commandes écrites en Python s'exécutent directement dans ce notebook Jupyter avec la commande `Ctrl+Entrée`, ou `Shift+Entrée` pour passer directement à la cellule suivante.\n",
    "\n",
    "Le but de cette séance de TP est de revenir sur la droite de régression, \n",
    "- en utilisant Excel sur les données footprint,\n",
    "- en manipulant avec Python les données de la SAé \"Exploitation d'une base de données\". Ces données sont fournies dans le fichier \"Medicaments.xlsx\"."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Exercice 1 : A traiter dans le fichier Excel TP1 (dans Moodle si perdu).\n",
    "1) Créer un nouvel onglet baptisé TP5 dans lequel vous copierez les deux colonnes \"Total Ecological Footprint (Consumption)\" et \"Number of Earths  required\". Dans la suite, ces variables s'appelleront CONSU et NEARTH comme dans le TP4. \n",
    "2) A l'aide des \"boutons\" permettant de créer des graphiques, représenter le nuage de points associé aux variables CONSU et NEARTH. Ce nuage ressemble-t-il à une droite ? \n",
    "3) Calculer, à l'aide des fonctions Excel appropriées, le coefficient de corrélation entre les variables CONSU et NEARTH, ainsi que les coefficients de l’équation de la droite de regression de NEARTH en fonction de CONSU. Comparez avec ce que vous avez obtenu lors du TP4.\n",
    "4) Ajouter la droite de régression sur le graphique de nuage de points (il y a une instruction magique qui le fait automatiquement \"Ajouter une tendance linéaire\").\n",
    "5) Quels sont les deux pays représentés par les points les plus extrêmes du nuage de points? \n",
    "6) Recommencer (graphique + droite) avec les variables \"Total Biocapacity\" (BIO) et \"Ecological (Deficit) or Reserve\" (ECO)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Exercice 2 : à traiter dans ce Notebook, avec les données \"Medicaments\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# On importe les bibliothèques qui nous seront utiles\n",
    "from pandas import *  # pour lire, importer et manipuler des données sous forme tableur\n",
    "from numpy import *  # pour faire des calculs\n",
    "from matplotlib.pylab import * # pour faire des graphiques"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**1.** Ouvrir le fichier `Medicaments.xlsx` et constater que le classeur contient plusieurs feuilles. Importer chaque feuille dans un dataframe séparé en utilisant la fonction `read_excel` et l'option `sheet_name=...` pour désigner le numéro de la feuille. Afficher le format de chacun de ces dataframes."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(15789, 9)\n",
      "(8081, 5)\n",
      "(20845, 11)\n"
     ]
    }
   ],
   "source": [
    "# Importation des données dans des dataframe\n",
    "dfMed = read_excel('Medicaments.xlsx', sheet_name=0)\n",
    "dfGen = read_excel('Medicaments.xlsx', sheet_name=1)\n",
    "dfPres = read_excel('Medicaments.xlsx', sheet_name=2)\n",
    "# Affichage des formats\n",
    "print(shape(dfMed))\n",
    "print(shape(dfGen))\n",
    "print(shape(dfPres))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**2.** Afficher succesivement les premières lignes des dataframes \"pour voir\". Repérer les variables quantitatives. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Code CIS</th>\n",
       "      <th>Dénomination du médicament</th>\n",
       "      <th>Forme pharmaceutique</th>\n",
       "      <th>Voies d'administration</th>\n",
       "      <th>Statut administratif de l’AMM</th>\n",
       "      <th>Etat de commercialisation</th>\n",
       "      <th>Date d’AMM (format JJ/MM/AAAA)</th>\n",
       "      <th>Titulaire(s)</th>\n",
       "      <th>EstSurveillance</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>60002283</td>\n",
       "      <td>ANASTROZOLE ACCORD 1 mg, comprimé pelliculé</td>\n",
       "      <td>comprimé pelliculé</td>\n",
       "      <td>orale</td>\n",
       "      <td>Autorisation active</td>\n",
       "      <td>Commercialisée</td>\n",
       "      <td>jeudi 28 octobre 2010</td>\n",
       "      <td>ACCORD HEALTHCARE FRANCE</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>60002746</td>\n",
       "      <td>ACTAEA RACEMOSA FERRIER, degré de dilution com...</td>\n",
       "      <td>granules et&nbsp;&nbsp;solution en gouttes en gouttes</td>\n",
       "      <td>orale;sublinguale</td>\n",
       "      <td>Autorisation active</td>\n",
       "      <td>Commercialisée</td>\n",
       "      <td>jeudi 3 janvier 2008</td>\n",
       "      <td>FERRIER</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>60003620</td>\n",
       "      <td>BECLOSPIN 800 microgrammes/2ml suspension pour...</td>\n",
       "      <td>suspension pour inhalation par nébuliseur</td>\n",
       "      <td>inhalée</td>\n",
       "      <td>Autorisation active</td>\n",
       "      <td>Commercialisée</td>\n",
       "      <td>vendredi 6 janvier 2006</td>\n",
       "      <td>CHIESI</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>60004277</td>\n",
       "      <td>FENOFIBRATE TEVA 100 mg, gélule</td>\n",
       "      <td>gélule</td>\n",
       "      <td>orale</td>\n",
       "      <td>Autorisation active</td>\n",
       "      <td>Commercialisée</td>\n",
       "      <td>vendredi 6 décembre 1996</td>\n",
       "      <td>TEVA SANTE</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>60004487</td>\n",
       "      <td>TRAMADOL EG L.P. 200 mg, comprimé à libération...</td>\n",
       "      <td>comprimé à libération prolongée</td>\n",
       "      <td>orale</td>\n",
       "      <td>Autorisation active</td>\n",
       "      <td>Commercialisée</td>\n",
       "      <td>lundi 7 septembre 2009</td>\n",
       "      <td>EG LABO - LABORATOIRES EUROGENERICS</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Code CIS                         Dénomination du médicament  \\\n",
       "0  60002283        ANASTROZOLE ACCORD 1 mg, comprimé pelliculé   \n",
       "1  60002746  ACTAEA RACEMOSA FERRIER, degré de dilution com...   \n",
       "2  60003620  BECLOSPIN 800 microgrammes/2ml suspension pour...   \n",
       "3  60004277                    FENOFIBRATE TEVA 100 mg, gélule   \n",
       "4  60004487  TRAMADOL EG L.P. 200 mg, comprimé à libération...   \n",
       "\n",
       "                          Forme pharmaceutique Voies d'administration  \\\n",
       "0                           comprimé pelliculé                  orale   \n",
       "1  granules et  solution en gouttes en gouttes      orale;sublinguale   \n",
       "2    suspension pour inhalation par nébuliseur                inhalée   \n",
       "3                                       gélule                  orale   \n",
       "4              comprimé à libération prolongée                  orale   \n",
       "\n",
       "  Statut administratif de l’AMM Etat de commercialisation  \\\n",
       "0           Autorisation active            Commercialisée   \n",
       "1           Autorisation active            Commercialisée   \n",
       "2           Autorisation active            Commercialisée   \n",
       "3           Autorisation active            Commercialisée   \n",
       "4           Autorisation active            Commercialisée   \n",
       "\n",
       "  Date d’AMM (format JJ/MM/AAAA)                         Titulaire(s)  \\\n",
       "0          jeudi 28 octobre 2010             ACCORD HEALTHCARE FRANCE   \n",
       "1           jeudi 3 janvier 2008                              FERRIER   \n",
       "2        vendredi 6 janvier 2006                               CHIESI   \n",
       "3       vendredi 6 décembre 1996                           TEVA SANTE   \n",
       "4         lundi 7 septembre 2009  EG LABO - LABORATOIRES EUROGENERICS   \n",
       "\n",
       "   EstSurveillance  \n",
       "0            False  \n",
       "1            False  \n",
       "2            False  \n",
       "3            False  \n",
       "4            False  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dfMed.head()\n",
    "# les variables quantitatives de ce tableau sont les suivantes : (à compléter)\n",
    "# pas de variable quantitative dans ce tableau !"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Identifiant du groupe générique</th>\n",
       "      <th>Code CIS</th>\n",
       "      <th>Numéro de tri</th>\n",
       "      <th>Libellé du groupe générique</th>\n",
       "      <th>Type de générique</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>68053454</td>\n",
       "      <td>2</td>\n",
       "      <td>CIMETIDINE 200 mg - TAGAMET 200 mg, comprimé e...</td>\n",
       "      <td>générique</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>7</td>\n",
       "      <td>65812914</td>\n",
       "      <td>3</td>\n",
       "      <td>RANITIDINE (CHLORHYDRATE DE) équivalant à RANI...</td>\n",
       "      <td>générique</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>66333404</td>\n",
       "      <td>3</td>\n",
       "      <td>RANITIDINE (CHLORHYDRATE DE) équivalant à RANI...</td>\n",
       "      <td>générique</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>10</td>\n",
       "      <td>61541821</td>\n",
       "      <td>1</td>\n",
       "      <td>RANITIDINE (CHLORHYDRATE DE) équivalant à RANI...</td>\n",
       "      <td>princeps</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>10</td>\n",
       "      <td>62349845</td>\n",
       "      <td>3</td>\n",
       "      <td>RANITIDINE (CHLORHYDRATE DE) équivalant à RANI...</td>\n",
       "      <td>générique</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Identifiant du groupe générique  Code CIS  Numéro de tri  \\\n",
       "0                                2  68053454              2   \n",
       "1                                7  65812914              3   \n",
       "2                                8  66333404              3   \n",
       "3                               10  61541821              1   \n",
       "4                               10  62349845              3   \n",
       "\n",
       "                         Libellé du groupe générique Type de générique  \n",
       "0  CIMETIDINE 200 mg - TAGAMET 200 mg, comprimé e...         générique  \n",
       "1  RANITIDINE (CHLORHYDRATE DE) équivalant à RANI...         générique  \n",
       "2  RANITIDINE (CHLORHYDRATE DE) équivalant à RANI...         générique  \n",
       "3  RANITIDINE (CHLORHYDRATE DE) équivalant à RANI...          princeps  \n",
       "4  RANITIDINE (CHLORHYDRATE DE) équivalant à RANI...         générique  "
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dfGen.head()\n",
    "# les variables quantitatives de ce tableau sont les suivantes : (à compléter) \n",
    "# pas de variable quantitative dans ce tableau !"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Code CIP13</th>\n",
       "      <th>Code CIS</th>\n",
       "      <th>Code CIP7</th>\n",
       "      <th>Libellé de la présentation</th>\n",
       "      <th>Etat de commercialisation</th>\n",
       "      <th>Date de la déclaration de commercialisation</th>\n",
       "      <th>Taux de remboursement</th>\n",
       "      <th>Prix hors honoraire de dispensation</th>\n",
       "      <th>Honoraire de dispensation</th>\n",
       "      <th>Prix honoraire compris</th>\n",
       "      <th>EstActive</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>3400921603637</td>\n",
       "      <td>62083608</td>\n",
       "      <td>2160363</td>\n",
       "      <td>4 poche(s) bicompartimenté(e)(s) polymère mult...</td>\n",
       "      <td>Déclaration d'arrêt de commercialisation</td>\n",
       "      <td>lundi 10 juin 2024</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>3400921604696</td>\n",
       "      <td>64304674</td>\n",
       "      <td>2160469</td>\n",
       "      <td>1 flacon(s) polyéthylène de 5 ml avec compte-g...</td>\n",
       "      <td>Déclaration de commercialisation</td>\n",
       "      <td>jeudi 6 septembre 2012</td>\n",
       "      <td>0.65</td>\n",
       "      <td>3.57</td>\n",
       "      <td>1.02</td>\n",
       "      <td>4.59</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3400921609080</td>\n",
       "      <td>66674494</td>\n",
       "      <td>2160908</td>\n",
       "      <td>4 seringue(s) préremplie(s) en verre de 0,5 ml...</td>\n",
       "      <td>Déclaration de commercialisation</td>\n",
       "      <td>jeudi 5 janvier 2012</td>\n",
       "      <td>0.65</td>\n",
       "      <td>527.68</td>\n",
       "      <td>1.02</td>\n",
       "      <td>528.70</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3400921610550</td>\n",
       "      <td>68739115</td>\n",
       "      <td>2161055</td>\n",
       "      <td>plaquette(s) thermoformée(s) PVC PVDC aluminiu...</td>\n",
       "      <td>Déclaration de commercialisation</td>\n",
       "      <td>vendredi 4 mai 2012</td>\n",
       "      <td>0.15</td>\n",
       "      <td>2.63</td>\n",
       "      <td>1.02</td>\n",
       "      <td>3.65</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>3400921610840</td>\n",
       "      <td>61350136</td>\n",
       "      <td>2161084</td>\n",
       "      <td>plaquette(s) polyamide aluminium PVC-Aluminium...</td>\n",
       "      <td>Déclaration de commercialisation</td>\n",
       "      <td>jeudi 5 février 2015</td>\n",
       "      <td>0.65</td>\n",
       "      <td>6.15</td>\n",
       "      <td>1.02</td>\n",
       "      <td>7.17</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      Code CIP13  Code CIS  Code CIP7  \\\n",
       "0  3400921603637  62083608    2160363   \n",
       "1  3400921604696  64304674    2160469   \n",
       "2  3400921609080  66674494    2160908   \n",
       "3  3400921610550  68739115    2161055   \n",
       "4  3400921610840  61350136    2161084   \n",
       "\n",
       "                          Libellé de la présentation  \\\n",
       "0  4 poche(s) bicompartimenté(e)(s) polymère mult...   \n",
       "1  1 flacon(s) polyéthylène de 5 ml avec compte-g...   \n",
       "2  4 seringue(s) préremplie(s) en verre de 0,5 ml...   \n",
       "3  plaquette(s) thermoformée(s) PVC PVDC aluminiu...   \n",
       "4  plaquette(s) polyamide aluminium PVC-Aluminium...   \n",
       "\n",
       "                  Etat de commercialisation  \\\n",
       "0  Déclaration d'arrêt de commercialisation   \n",
       "1          Déclaration de commercialisation   \n",
       "2          Déclaration de commercialisation   \n",
       "3          Déclaration de commercialisation   \n",
       "4          Déclaration de commercialisation   \n",
       "\n",
       "  Date de la déclaration de commercialisation  Taux de remboursement  \\\n",
       "0                          lundi 10 juin 2024                    NaN   \n",
       "1                      jeudi 6 septembre 2012                   0.65   \n",
       "2                        jeudi 5 janvier 2012                   0.65   \n",
       "3                         vendredi 4 mai 2012                   0.15   \n",
       "4                        jeudi 5 février 2015                   0.65   \n",
       "\n",
       "   Prix hors honoraire de dispensation  Honoraire de dispensation  \\\n",
       "0                                  NaN                        NaN   \n",
       "1                                 3.57                       1.02   \n",
       "2                               527.68                       1.02   \n",
       "3                                 2.63                       1.02   \n",
       "4                                 6.15                       1.02   \n",
       "\n",
       "   Prix honoraire compris  EstActive  \n",
       "0                     NaN       True  \n",
       "1                    4.59       True  \n",
       "2                  528.70       True  \n",
       "3                    3.65       True  \n",
       "4                    7.17       True  "
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dfPres.head()\n",
    "# les variables quantitatives de ce tableau sont les suivantes : (à compléter)\n",
    "# \"Taux de remboursement\", \"Prix hors honoraire\", \"Honoraires de dispensation\"\n",
    "# et \"Prix honoraire compris\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**3.** Pour la suite, on va se concentrer sur la feuille \"Présentations\". \n",
    "\n",
    "Exécuter les lignes du bloc ci-dessous puis interroger Python en invoquant les fonctions adéquates afin de répondre aux questions écrites en commentaire dans les blocs suivants.  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "colonnes = [\n",
    "    \"CIP13\", \"CIS\", \"CIP7\", \"LIB\", \"ETA\",\n",
    "    \"DAT\", \"TX\", \"PHH\", \"HD\", \"PHC\", \"ACT\"\n",
    "]\n",
    "dfPres.columns = colonnes\n",
    "dfX = dfPres[dfPres.TX>0]\n",
    "C = dfX.columns\n",
    "V = dfX.values\n",
    "T = dfX.CIS"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.DataFrame'>\n",
      "(13052, 11)\n",
      "           CIP13       CIS     CIP7  \\\n",
      "1  3400921604696  64304674  2160469   \n",
      "2  3400921609080  66674494  2160908   \n",
      "3  3400921610550  68739115  2161055   \n",
      "4  3400921610840  61350136  2161084   \n",
      "5  3400921611731  61630825  2161173   \n",
      "\n",
      "                                                 LIB  \\\n",
      "1  1 flacon(s) polyéthylène de 5 ml avec compte-g...   \n",
      "2  4 seringue(s) préremplie(s) en verre de 0,5 ml...   \n",
      "3  plaquette(s) thermoformée(s) PVC PVDC aluminiu...   \n",
      "4  plaquette(s) polyamide aluminium PVC-Aluminium...   \n",
      "5  plaquette(s) polyamide aluminium PVC-Aluminium...   \n",
      "\n",
      "                                ETA                     DAT    TX     PHH  \\\n",
      "1  Déclaration de commercialisation  jeudi 6 septembre 2012  0.65    3.57   \n",
      "2  Déclaration de commercialisation    jeudi 5 janvier 2012  0.65  527.68   \n",
      "3  Déclaration de commercialisation     vendredi 4 mai 2012  0.15    2.63   \n",
      "4  Déclaration de commercialisation    jeudi 5 février 2015  0.65    6.15   \n",
      "5  Déclaration de commercialisation    jeudi 5 février 2015  0.65    3.42   \n",
      "\n",
      "     HD     PHC   ACT  \n",
      "1  1.02    4.59  True  \n",
      "2  1.02  528.70  True  \n",
      "3  1.02    3.65  True  \n",
      "4  1.02    7.17  True  \n",
      "5  1.02    4.44  True  \n"
     ]
    }
   ],
   "source": [
    "# quel est le type de la variable dfX ?\n",
    "print(type(dfX))\n",
    "# réponse: dfX est de type dataframe\n",
    "\n",
    "# quel est le format de la variable dfX ?\n",
    "print(shape(dfX))\n",
    "# réponse: dfX a pour format 13052x11, càd 13052 lignes et 11 colonnes\n",
    "\n",
    "# que contient la variable dfX ? \n",
    "print(dfX.head()) \n",
    "# réponse: dfX contient les données de la feuille \"Présentations\" restreintes\n",
    "# aux médicaments dont les taux de remboursement sont connus."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.Index'> (11,)\n",
      "Index(['CIP13', 'CIS', 'CIP7', 'LIB', 'ETA', 'DAT', 'TX', 'PHH', 'HD', 'PHC',\n",
      "       'ACT'],\n",
      "      dtype='str')\n"
     ]
    }
   ],
   "source": [
    "# que contient la variable C ? (type, format, description)\n",
    "print(type(C), C.shape)\n",
    "print(C)\n",
    "# réponse: C est un pandas.Index, de longueur 11, contenant les noms des 11\n",
    "# colonnes de dfX"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'numpy.ndarray'> (13052, 11)\n",
      "[[3400921604696 64304674 2160469\n",
      "  '1 flacon(s) polyéthylène de 5 ml avec compte-gouttes'\n",
      "  'Déclaration de commercialisation']\n",
      " [3400921609080 66674494 2160908\n",
      "  '4 seringue(s) préremplie(s) en verre de 0,5 ml dans stylo pré-rempli'\n",
      "  'Déclaration de commercialisation']\n",
      " [3400921610550 68739115 2161055\n",
      "  'plaquette(s) thermoformée(s) PVC PVDC aluminium de 6 capsule(s)'\n",
      "  'Déclaration de commercialisation']\n",
      " [3400921610840 61350136 2161084\n",
      "  'plaquette(s) polyamide aluminium PVC-Aluminium de 30 comprimé(s)'\n",
      "  'Déclaration de commercialisation']\n",
      " [3400921611731 61630825 2161173\n",
      "  'plaquette(s) polyamide aluminium PVC-Aluminium de 30 comprimé(s)'\n",
      "  'Déclaration de commercialisation']]\n"
     ]
    }
   ],
   "source": [
    "# que contient la variable V ? (type, format, description)\n",
    "print(type(V), V.shape)\n",
    "print(V[0:5, 0:5])\n",
    "# réponse: V est un numpy.ndarray, de format 13052x11, contenant les données de\n",
    "# dfX sous forme de array"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.Series'> (13052,)\n",
      "1    64304674\n",
      "2    66674494\n",
      "3    68739115\n",
      "4    61350136\n",
      "5    61630825\n",
      "Name: CIS, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "# que contient la variable T ? (type, format, description)\n",
    "print(type(T), T.shape)\n",
    "print(T[0:5])\n",
    "# réponse: T est une pandas.Series de longueur 13052 qui contient le code CIS\n",
    "# des médicaments dont le taux de remboursement est connu."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**4.** On s'intéresse aux médicaments dont le \"Prix honoraire compris\" (PHC) est connu. Pour cela, on va restreindre les données aux lignes pour lesquelles `PHC>0`, ces données constitueront un dataframe nommé `dfP`. Ensuite, en utilisant une variable du type `dataframe` ou du type `array` (au choix), calculer la moyenne, la médiane et l'écart-type de la variable PHC. Commenter l'écart entre la moyenne et la médiane."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1      4.59\n",
      "2    528.70\n",
      "3      3.65\n",
      "4      7.17\n",
      "5      4.44\n",
      "Name: PHC, dtype: float64\n",
      "[4.59 528.7 3.65 7.17 4.44]\n",
      "le PHC moyen des médicaments est :\n",
      "188 188 euros\n",
      "le PHC médian des médicaments est :\n",
      "9 9 euros\n",
      "l'écart-type du PHC des médicaments est\n",
      "1455 1455 euros\n"
     ]
    }
   ],
   "source": [
    "# restriction des données aux médicaments dont le PHC est connu\n",
    "dfP = dfPres[dfPres.PHC>0] # données de type dataframe \n",
    "W = dfP.values # données de type array\n",
    "\n",
    "# variable PHC\n",
    "Prix = dfP.PHC # type dataframe \n",
    "print(Prix[0:5]) # pour \"voir\"\n",
    "P = W[:,9] # PHC est la colonne n°9, type array\n",
    "print(P[0:5]) # pour \"voir\"\n",
    "\n",
    "# calcul de la moyenne, la médiane, l'écart-type \n",
    "print('le PHC moyen des médicaments est :')\n",
    "print(round(mean(P)), round(mean(Prix)), 'euros')\n",
    "print('le PHC médian des médicaments est :')\n",
    "print(round(median(P)), round(median(Prix)), 'euros')\n",
    "print(\"l'écart-type du PHC des médicaments est\")\n",
    "print(round(std(P)), round(std(Prix)), 'euros')\n",
    "\n",
    "# Commentaire. On constate que la médiane est beaucoup plus petite que la\n",
    "# moyenne, ce qui est dû au fait que beaucoup de médicaments ont un prix faible\n",
    "# (tirent la médiane vers 0) et quelques médicaments ont un prix très élévé\n",
    "# (tirent la moyenne vers les grandes valeurs)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**5.** Comparer les indicateurs calculés à la question 4. avec les mêmes indicateurs calculés sur tous les médicaments contenus dans la base de données (y compris ceux dont le PHC n'est pas connu (!)). Commenter."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "le PHC moyen de tous les médicaments est : 188.34149726439082 nan\n",
      "le PHC médian de tous les médicaments est nan nan\n",
      "l'écart-type du PHC de tous les médicaments est 1455.4094909157805 nan\n"
     ]
    }
   ],
   "source": [
    "# calcul des indicateurs\n",
    "PPrix = dfPres.PHC\n",
    "PP = PPrix.values\n",
    "print('le PHC moyen de tous les médicaments est :', mean(PPrix), mean(PP))\n",
    "print('le PHC médian de tous les médicaments est', median(PPrix), median(PP))\n",
    "print(\"l'écart-type du PHC de tous les médicaments est\", std(PPrix), std(PP))\n",
    "# commentaire: les données manquantes peuvent induire des 'nan' dans les\n",
    "# réponses. On remarque qu'elles ne sont pas traitées de la même manière\n",
    "# suivant le type de variable utilisé et suivant la fonction utilisée."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**6.** On va maintenant étudier conjointement les variables PHC et PHH. Pour cela, il faut d'abord ne considérer que les médicaments pour lesquels ces variables sont connues (!). Construire un tel tableau de données dans un dataframe nommé `dfPP`. Comparer les longueurs de `dfP` et `dfPP`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "12977 12910\n"
     ]
    }
   ],
   "source": [
    "dfPP = dfP[dfP.PHH>0]\n",
    "print(len(dfP), len(dfPP))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**7.** Tracer les boîtes à moustaches de la variable PHC et de la variable PHH (pour les médicaments dont les prix sont connus !) sur le même graphique. Ce graphique permet-il de comparer les deux variables? "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on function boxplot_frame in module pandas.plotting:\n",
      "\n",
      "boxplot_frame(\n",
      "    self: DataFrame,\n",
      "    column=None,\n",
      "    by=None,\n",
      "    ax=None,\n",
      "    fontsize: int | None = None,\n",
      "    rot: int = 0,\n",
      "    grid: bool = True,\n",
      "    figsize: tuple[float, float] | None = None,\n",
      "    layout=None,\n",
      "    return_type=None,\n",
      "    backend=None,\n",
      "    **kwargs\n",
      ")\n",
      "    Make a box plot from DataFrame columns.\n",
      "\n",
      "    Make a box-and-whisker plot from DataFrame columns, optionally grouped\n",
      "    by some other columns. A box plot is a method for graphically depicting\n",
      "    groups of numerical data through their quartiles.\n",
      "    The box extends from the Q1 to Q3 quartile values of the data,\n",
      "    with a line at the median (Q2). The whiskers extend from the edges\n",
      "    of box to show the range of the data. By default, they extend no more than\n",
      "    `1.5 * IQR (IQR = Q3 - Q1)` from the edges of the box, ending at the farthest\n",
      "    data point within that interval. Outliers are plotted as separate dots.\n",
      "\n",
      "    For further details see\n",
      "    Wikipedia's entry for `boxplot <https://en.wikipedia.org/wiki/Box_plot>`_.\n",
      "\n",
      "    Parameters\n",
      "    ----------\n",
      "    column : str or list of str, optional\n",
      "        Column name or list of names, or vector.\n",
      "        Can be any valid input to :meth:`pandas.DataFrame.groupby`.\n",
      "    by : str or array-like, optional\n",
      "        Column in the DataFrame to :meth:`pandas.DataFrame.groupby`.\n",
      "        One box-plot will be done per value of columns in `by`.\n",
      "    ax : object of class matplotlib.axes.Axes, optional\n",
      "        The matplotlib axes to be used by boxplot.\n",
      "    fontsize : float or str\n",
      "        Tick label font size in points or as a string (e.g., `large`).\n",
      "    rot : float, default 0\n",
      "        The rotation angle of labels (in degrees)\n",
      "        with respect to the screen coordinate system.\n",
      "    grid : bool, default True\n",
      "        Setting this to True will show the grid.\n",
      "    figsize : A tuple (width, height) in inches\n",
      "        The size of the figure to create in matplotlib.\n",
      "    layout : tuple (rows, columns), optional\n",
      "        For example, (3, 5) will display the subplots\n",
      "        using 3 rows and 5 columns, starting from the top-left.\n",
      "    return_type : {'axes', 'dict', 'both'} or None, default 'axes'\n",
      "        The kind of object to return. The default is ``axes``.\n",
      "\n",
      "        * 'axes' returns the matplotlib axes the boxplot is drawn on.\n",
      "        * 'dict' returns a dictionary whose values are the matplotlib\n",
      "          lines of the boxplot.\n",
      "        * 'both' returns a namedtuple with the axes and dict.\n",
      "        * when grouping with ``by``, a Series mapping columns to\n",
      "          ``return_type`` is returned.\n",
      "\n",
      "        If ``return_type`` is `None`, a NumPy array\n",
      "        of axes with the same shape as ``layout`` is returned.\n",
      "    backend : str, default None\n",
      "        Backend to use instead of the backend specified in the option\n",
      "        ``plotting.backend``. For instance, 'matplotlib'. Alternatively, to\n",
      "        specify the ``plotting.backend`` for the whole session, set\n",
      "        ``pd.options.plotting.backend``.\n",
      "\n",
      "    **kwargs\n",
      "        All other plotting keyword arguments to be passed to\n",
      "        :func:`matplotlib.pyplot.boxplot`.\n",
      "\n",
      "    Returns\n",
      "    -------\n",
      "    result\n",
      "        See Notes.\n",
      "\n",
      "    See Also\n",
      "    --------\n",
      "    Series.plot.hist: Make a histogram.\n",
      "    matplotlib.pyplot.boxplot : Matplotlib equivalent plot.\n",
      "\n",
      "    Notes\n",
      "    -----\n",
      "    The return type depends on the `return_type` parameter:\n",
      "\n",
      "    * 'axes' : object of class matplotlib.axes.Axes\n",
      "    * 'dict' : dict of matplotlib.lines.Line2D objects\n",
      "    * 'both' : a namedtuple with structure (ax, lines)\n",
      "\n",
      "    For data grouped with ``by``, return a Series of the above or a numpy\n",
      "    array:\n",
      "\n",
      "    * :class:`~pandas.Series`\n",
      "    * :class:`~numpy.array` (for ``return_type = None``)\n",
      "\n",
      "    Use ``return_type='dict'`` when you want to tweak the appearance\n",
      "    of the lines after plotting. In this case a dict containing the Lines\n",
      "    making up the boxes, caps, fliers, medians, and whiskers is returned.\n",
      "\n",
      "    Examples\n",
      "    --------\n",
      "\n",
      "    Boxplots can be created for every column in the dataframe\n",
      "    by ``df.boxplot()`` or indicating the columns to be used:\n",
      "\n",
      "    .. plot::\n",
      "        :context: close-figs\n",
      "\n",
      "        >>> np.random.seed(1234)\n",
      "        >>> df = pd.DataFrame(\n",
      "        ...     np.random.randn(10, 4), columns=[\"Col1\", \"Col2\", \"Col3\", \"Col4\"]\n",
      "        ... )\n",
      "        >>> boxplot = df.boxplot(column=[\"Col1\", \"Col2\", \"Col3\"])  # doctest: +SKIP\n",
      "\n",
      "    Boxplots of variables distributions grouped by the values of a third\n",
      "    variable can be created using the option ``by``. For instance:\n",
      "\n",
      "    .. plot::\n",
      "        :context: close-figs\n",
      "\n",
      "        >>> df = pd.DataFrame(np.random.randn(10, 2), columns=[\"Col1\", \"Col2\"])\n",
      "        >>> df[\"X\"] = pd.Series([\"A\", \"A\", \"A\", \"A\", \"A\", \"B\", \"B\", \"B\", \"B\", \"B\"])\n",
      "        >>> boxplot = df.boxplot(by=\"X\")\n",
      "\n",
      "    A list of strings (i.e. ``['X', 'Y']``) can be passed to boxplot\n",
      "    in order to group the data by combination of the variables in the x-axis:\n",
      "\n",
      "    .. plot::\n",
      "        :context: close-figs\n",
      "\n",
      "        >>> df = pd.DataFrame(np.random.randn(10, 3), columns=[\"Col1\", \"Col2\", \"Col3\"])\n",
      "        >>> df[\"X\"] = pd.Series([\"A\", \"A\", \"A\", \"A\", \"A\", \"B\", \"B\", \"B\", \"B\", \"B\"])\n",
      "        >>> df[\"Y\"] = pd.Series([\"A\", \"B\", \"A\", \"B\", \"A\", \"B\", \"A\", \"B\", \"A\", \"B\"])\n",
      "        >>> boxplot = df.boxplot(column=[\"Col1\", \"Col2\"], by=[\"X\", \"Y\"])\n",
      "\n",
      "    The layout of boxplot can be adjusted giving a tuple to ``layout``:\n",
      "\n",
      "    .. plot::\n",
      "        :context: close-figs\n",
      "\n",
      "        >>> boxplot = df.boxplot(column=[\"Col1\", \"Col2\"], by=\"X\", layout=(2, 1))\n",
      "\n",
      "    Additional formatting can be done to the boxplot, like suppressing the grid\n",
      "    (``grid=False``), rotating the labels in the x-axis (i.e. ``rot=45``)\n",
      "    or changing the fontsize (i.e. ``fontsize=15``):\n",
      "\n",
      "    .. plot::\n",
      "        :context: close-figs\n",
      "\n",
      "        >>> boxplot = df.boxplot(grid=False, rot=45, fontsize=15)  # doctest: +SKIP\n",
      "\n",
      "    The parameter ``return_type`` can be used to select the type of element\n",
      "    returned by `boxplot`.  When ``return_type='axes'`` is selected,\n",
      "    the matplotlib axes on which the boxplot is drawn are returned:\n",
      "\n",
      "    .. plot::\n",
      "        :context: close-figs\n",
      "\n",
      "        >>> boxplot = df.boxplot(column=[\"Col1\", \"Col2\"], return_type=\"axes\")\n",
      "        >>> type(boxplot)\n",
      "        <class 'matplotlib.axes._axes.Axes'>\n",
      "\n",
      "    When grouping with ``by``, a Series mapping columns to ``return_type``\n",
      "    is returned:\n",
      "\n",
      "    .. plot::\n",
      "        :context: close-figs\n",
      "\n",
      "        >>> boxplot = df.boxplot(column=[\"Col1\", \"Col2\"], by=\"X\", return_type=\"axes\")\n",
      "        >>> type(boxplot)\n",
      "        <class 'pandas.Series'>\n",
      "\n",
      "    If ``return_type`` is `None`, a NumPy array of axes with the same shape\n",
      "    as ``layout`` is returned:\n",
      "\n",
      "    .. plot::\n",
      "        :context: close-figs\n",
      "\n",
      "        >>> boxplot = df.boxplot(column=[\"Col1\", \"Col2\"], by=\"X\", return_type=None)\n",
      "        >>> type(boxplot)\n",
      "        <class 'numpy.ndarray'>\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(DataFrame.boxplot)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/var/folders/_r/4bk715xn7p73n0wfmpbl5nzh0000gn/T/ipykernel_35583/3322071937.py:1: MatplotlibDeprecationWarning: The 'labels' parameter of boxplot() has been renamed 'tick_labels' since Matplotlib 3.9; support for the old name will be dropped in 3.11.\n",
      "  boxplot([log10(dfPP.PHC), log10(dfPP.PHH)], labels=['PHC', 'PHH'])\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "boxplot([log10(dfPP.PHC), log10(dfPP.PHH)], labels=['PHC', 'PHH'])\n",
    "# commentaire : on ne voit pas grand chose ! les deux boîtes à moustaches sont\n",
    "# complètement écrasées, les valeurs extrêmes ont l'air presque identiques.\n",
    "show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**8.** On va maintenant chercher à établir un lien de corrélation entre PHC et PHH. Pour ces deux variables, calculer le coefficient de corrélation, puis représenter le nuage de points ainsi que la droite de régression d'une variable en fonction de l'autre et donner son équation. Il faudra commencer par choisir quelle variable est la variable explicative, l'autre étant nécessairement la variable expliquée. Commenter la valeur du coefficient de corrélation et l'allure du nuage de points; ces résultats étaient-ils prévisibles? "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "coeff de corrélation 0.9999999216459355\n"
     ]
    }
   ],
   "source": [
    "# Choix des varaibles explicative (PHH) et expliquée (PHC) \n",
    "X = dfPP.PHH\n",
    "Y = dfPP.PHC\n",
    "RXY = (mean(X * Y) - mean(X) * mean(Y)) / (std(X) * std(Y))\n",
    "print(\"coeff de corrélation\", RXY) \n",
    "# commentaire : le coeff est pratiquement égal à 1, on pouvait s'y attendre car\n",
    "# PHC = PHH + HD où HD est la variable \"honoraire de dispensation\" qui n'est\n",
    "# pas une constante (ne prend pas la même valeur pour tous les médicaments). \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhYAAAGzCAYAAABzfl4TAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAANaJJREFUeJzt3Ql4VNX9//FvEggBQoJhkR0CyBIjQdYim7LJIgr+rEq1IqKtClaq1gKyyGb4i1XciogiWlREFCiERRRZFBAUUXYFwyY7SEJYEkjm/3xvmzQJCWTmnjuZ5f16nqlklnNPztxmPnO2G+JyuVwCAABgQKiJQgAAAAgWAADAKHosAACAMQQLAABgDMECAAAYQ7AAAADGECwAAIAxBAsAAGAMwQIAABhDsAACTFpamjz44INSpUoVCQkJkSFDhogvqlOnjtx///3iK5599lmrvQDYQ7BAwJgxY4b1wZB9i4iIkAYNGsjgwYPlyJEjOc9bsWKF9ficOXMKLEc/7CIjIwt8bO7cudKjRw+pWLGihIeHS7Vq1eTOO++U5cuXi6947rnnrLZ45JFH5F//+pf88Y9/LLa6rFmzxvrAPnXqlASbop6P2fS+p556Sho1aiRlypSRsmXLSvPmzWX8+PEFtp8/nIsITiWKuwKAaWPHjpXY2Fg5f/68fPXVVzJlyhRZtGiRbNmyxfqD7Qm9pM4DDzxgfVhcf/318sQTT1g9AocOHbL+wHfu3Fm+/vprueGGG6S46QfL7373Oxk9enRxV8UKFmPGjLHCWvny5fM8tnPnTgkNDfzvNkU5Hzds2CA9e/a0epvuvfdeK1Cob7/9ViZOnCirVq2Szz77zO/ORQQnggUCjn6La9GihfVvHRKoUKGCvPjiizJ//nzp16+fR2X+4x//sP6Q67CClpW7y/yZZ56xegZKlPCN/zsdPXpU4uLixNeVKlVKgsGVzkftjejbt6+EhYXJ999/b/VY5DZhwgSZNm2aX56LCE6B/3UBQa9Tp05WGyQnJ3vUFufOnZPExETrD/4LL7xQ4Di8Dje0atXqsuVkZWXJ5MmT5dprr7W6xa+++mr585//LL/99tslcw9uueUW69utlqnPrVu3rrz33nuXLT97iEd/z6SkpJwu+D179uQEjoEDB1rH1TITEhLk3XffzVOGPldfo7/nm2++KfXq1bMCQMuWLa1v1fnt2LHD6n6vVKmSlC5dWho2bGh9uCkdAvnb3/5m/Vu/seevT0FzLH755Rf5/e9/LzExMda3ee150d+loN9z9uzZ1odujRo1rN9Hv6nv2rVLikLbVn8nfZ3+jlOnTi30uTNnzrR6EPT303rdfffdsn//fjF1Puqxf/31Vysk5A8VSt+vESNGGD0XAScRaxHwdu/ebf1Xvynmdvr0aTl+/Pglz09PT7/kQ+jkyZPWN0T9VukpDRH6TXPAgAHyl7/8xfpgee2116xvqdp1XbJkyZzn6gfkHXfcYQWB/v37y/Tp060PYf2A02BSkMaNG1vfVv/6179aH7ZPPvmkdb9+6OsH0o033miVq2P8+kH/8ccfW2XqN+bHH388T1kffPCB1T5aZ/3wev755+X222+3Pviz6/njjz9K+/btrZ//9Kc/WUFB23rBggXWB74+/6effpIPP/xQXnrpJWsuQHZ9CqJzDLT7/uzZs1b76PulwefWW2+15sPot/rcdIhAh1J0XkJKSopVx3vuuUe++eaby74Pmzdvlm7duln10PBz8eJFa9hIP8Dz099j5MiRVnjS3oZjx47Jq6++Kh06dLDet/zDO56cj//+97+t0KLv95WYOhcBR7mAAPHOO++49JT+/PPPXceOHXPt37/fNWvWLFeFChVcpUuXdh04cMB63pdffmk973K3smXL5pT78ssvW/fNnTvX47qtXr3aKuP999/Pc/+SJUsuub927drWfatWrcq57+jRo65SpUq5nnzyySseS1/fq1evPPdNnjzZKnPmzJk592VkZLjatGnjioyMdKWmplr3JScnW8/TNjt58mTOc+fPn2/dv2DBgpz7OnTo4CpXrpxr7969eY6VlZWV8+9JkyZZr9NyC6pn//79c34eMmSI9Vxtq2ynT592xcbGuurUqePKzMzM8/41btzYlZ6efsn7tHnz5su2T58+fVwRERF56r1t2zZXWFiY9fpse/bsse6bMGFCntdr+SVKlLjkfk/Px6uuusqVkJBw2bJMnouA0xgKQcDp0qWL9W20Zs2aVre1rvDQSW3Vq1fP87xRo0bJsmXLLrnpt9ncUlNTrf+WK1fO4zpp70B0dLR07drV6iXJvmkPhNbvyy+/zPN8nSOhvQHZ9PfRYQbtMfCEThbUCX6555hoT4P2DOiEwZUrV+Z5/l133SVXXXVVzs/Z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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# nuage de points\n",
    "scatter(log10(X), log10(Y))\n",
    "title('PHC en fonction de PCC')\n",
    "show()\n",
    "# commentaire : les points semblent alignés. Ce n'est pas exactement le cas,\n",
    "# en fait Y = X + HD avec HD qui vaut 1.02 ou 2.76, ce n'est pas une constante. \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "la droite de régression de PHC en fonction de PHH est :\n",
      "y = 0.9999829331196621 x + 1.2423414075169035\n"
     ]
    }
   ],
   "source": [
    "# droite de régression de Y en fonction de X\n",
    "a = RXY * std(Y) / std(X)\n",
    "b = mean(Y) - a*mean(X)\n",
    "scatter(log10(X), log10(Y))\n",
    "scatter(log10(mean(X)), log10(mean(Y)))\n",
    "plot(log10(X), log10(a*X + b))\n",
    "title('PHC en fonction de PHH')\n",
    "show()\n",
    "print('la droite de régression de PHC en fonction de PHH est :')\n",
    "print('y =', a, 'x +', b) \n",
    "# commentaire : on ne distingue pas le fait que certains points ne sont pas sur\n",
    "# la droite ! (ils se trouvent très près de 0). L'équation est presque de la\n",
    "# forme y = x + b avec b entre 1.02 et 2.76, ce qu'on pouvait prévoir "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on function boxplot in module matplotlib.pyplot:\n",
      "\n",
      "boxplot(\n",
      "    x: ArrayLike | Sequence[ArrayLike],\n",
      "    *,\n",
      "    notch: bool | None = None,\n",
      "    sym: str | None = None,\n",
      "    vert: bool | None = None,\n",
      "    orientation: Literal['vertical', 'horizontal'] = 'vertical',\n",
      "    whis: float | tuple[float, float] | None = None,\n",
      "    positions: ArrayLike | None = None,\n",
      "    widths: float | ArrayLike | None = None,\n",
      "    patch_artist: bool | None = None,\n",
      "    bootstrap: int | None = None,\n",
      "    usermedians: ArrayLike | None = None,\n",
      "    conf_intervals: ArrayLike | None = None,\n",
      "    meanline: bool | None = None,\n",
      "    showmeans: bool | None = None,\n",
      "    showcaps: bool | None = None,\n",
      "    showbox: bool | None = None,\n",
      "    showfliers: bool | None = None,\n",
      "    boxprops: dict[str, Any] | None = None,\n",
      "    tick_labels: Sequence[str] | None = None,\n",
      "    flierprops: dict[str, Any] | None = None,\n",
      "    medianprops: dict[str, Any] | None = None,\n",
      "    meanprops: dict[str, Any] | None = None,\n",
      "    capprops: dict[str, Any] | None = None,\n",
      "    whiskerprops: dict[str, Any] | None = None,\n",
      "    manage_ticks: bool = True,\n",
      "    autorange: bool = False,\n",
      "    zorder: float | None = None,\n",
      "    capwidths: float | ArrayLike | None = None,\n",
      "    label: Sequence[str] | None = None,\n",
      "    data=None\n",
      ") -> dict[str, Any]\n",
      "    Draw a box and whisker plot.\n",
      "\n",
      "    The box extends from the first quartile (Q1) to the third\n",
      "    quartile (Q3) of the data, with a line at the median.\n",
      "    The whiskers extend from the box to the farthest data point\n",
      "    lying within 1.5x the inter-quartile range (IQR) from the box.\n",
      "    Flier points are those past the end of the whiskers.\n",
      "    See https://en.wikipedia.org/wiki/Box_plot for reference.\n",
      "\n",
      "    .. code-block:: none\n",
      "\n",
      "              Q1-1.5IQR   Q1   median  Q3   Q3+1.5IQR\n",
      "                           |-----:-----|\n",
      "           o      |--------|     :     |--------|    o  o\n",
      "                           |-----:-----|\n",
      "         flier             <----------->            fliers\n",
      "                                IQR\n",
      "\n",
      "\n",
      "    Parameters\n",
      "    ----------\n",
      "    x : Array or a sequence of vectors.\n",
      "        The input data.  If a 2D array, a boxplot is drawn for each column\n",
      "        in *x*.  If a sequence of 1D arrays, a boxplot is drawn for each\n",
      "        array in *x*.\n",
      "\n",
      "    notch : bool, default: :rc:`boxplot.notch`\n",
      "        Whether to draw a notched boxplot (`True`), or a rectangular\n",
      "        boxplot (`False`).  The notches represent the confidence interval\n",
      "        (CI) around the median.  The documentation for *bootstrap*\n",
      "        describes how the locations of the notches are computed by\n",
      "        default, but their locations may also be overridden by setting the\n",
      "        *conf_intervals* parameter.\n",
      "\n",
      "        .. note::\n",
      "\n",
      "            In cases where the values of the CI are less than the\n",
      "            lower quartile or greater than the upper quartile, the\n",
      "            notches will extend beyond the box, giving it a\n",
      "            distinctive \"flipped\" appearance. This is expected\n",
      "            behavior and consistent with other statistical\n",
      "            visualization packages.\n",
      "\n",
      "    sym : str, optional\n",
      "        The default symbol for flier points.  An empty string ('') hides\n",
      "        the fliers.  If `None`, then the fliers default to 'b+'.  More\n",
      "        control is provided by the *flierprops* parameter.\n",
      "\n",
      "    vert : bool, optional\n",
      "        .. deprecated:: 3.11\n",
      "            Use *orientation* instead.\n",
      "\n",
      "            This is a pending deprecation for 3.10, with full deprecation\n",
      "            in 3.11 and removal in 3.13.\n",
      "            If this is given during the deprecation period, it overrides\n",
      "            the *orientation* parameter.\n",
      "\n",
      "        If True, plots the boxes vertically.\n",
      "        If False, plots the boxes horizontally.\n",
      "\n",
      "    orientation : {'vertical', 'horizontal'}, default: 'vertical'\n",
      "        If 'horizontal', plots the boxes horizontally.\n",
      "        Otherwise, plots the boxes vertically.\n",
      "\n",
      "        .. versionadded:: 3.10\n",
      "\n",
      "    whis : float or (float, float), default: 1.5\n",
      "        The position of the whiskers.\n",
      "\n",
      "        If a float, the lower whisker is at the lowest datum above\n",
      "        ``Q1 - whis*(Q3-Q1)``, and the upper whisker at the highest datum\n",
      "        below ``Q3 + whis*(Q3-Q1)``, where Q1 and Q3 are the first and\n",
      "        third quartiles.  The default value of ``whis = 1.5`` corresponds\n",
      "        to Tukey's original definition of boxplots.\n",
      "\n",
      "        If a pair of floats, they indicate the percentiles at which to\n",
      "        draw the whiskers (e.g., (5, 95)).  In particular, setting this to\n",
      "        (0, 100) results in whiskers covering the whole range of the data.\n",
      "\n",
      "        In the edge case where ``Q1 == Q3``, *whis* is automatically set\n",
      "        to (0, 100) (cover the whole range of the data) if *autorange* is\n",
      "        True.\n",
      "\n",
      "        Beyond the whiskers, data are considered outliers and are plotted\n",
      "        as individual points.\n",
      "\n",
      "    bootstrap : int, optional\n",
      "        Specifies whether to bootstrap the confidence intervals\n",
      "        around the median for notched boxplots. If *bootstrap* is\n",
      "        None, no bootstrapping is performed, and notches are\n",
      "        calculated using a Gaussian-based asymptotic approximation\n",
      "        (see McGill, R., Tukey, J.W., and Larsen, W.A., 1978, and\n",
      "        Kendall and Stuart, 1967). Otherwise, bootstrap specifies\n",
      "        the number of times to bootstrap the median to determine its\n",
      "        95% confidence intervals. Values between 1000 and 10000 are\n",
      "        recommended.\n",
      "\n",
      "    usermedians : 1D array-like, optional\n",
      "        A 1D array-like of length ``len(x)``.  Each entry that is not\n",
      "        `None` forces the value of the median for the corresponding\n",
      "        dataset.  For entries that are `None`, the medians are computed\n",
      "        by Matplotlib as normal.\n",
      "\n",
      "    conf_intervals : array-like, optional\n",
      "        A 2D array-like of shape ``(len(x), 2)``.  Each entry that is not\n",
      "        None forces the location of the corresponding notch (which is\n",
      "        only drawn if *notch* is `True`).  For entries that are `None`,\n",
      "        the notches are computed by the method specified by the other\n",
      "        parameters (e.g., *bootstrap*).\n",
      "\n",
      "    positions : array-like, optional\n",
      "        The positions of the boxes. The ticks and limits are\n",
      "        automatically set to match the positions. Defaults to\n",
      "        ``range(1, N+1)`` where N is the number of boxes to be drawn.\n",
      "\n",
      "    widths : float or array-like\n",
      "        The widths of the boxes.  The default is 0.5, or ``0.15*(distance\n",
      "        between extreme positions)``, if that is smaller.\n",
      "\n",
      "    patch_artist : bool, default: :rc:`boxplot.patchartist`\n",
      "        If `False` produces boxes with the Line2D artist. Otherwise,\n",
      "        boxes are drawn with Patch artists.\n",
      "\n",
      "    tick_labels : list of str, optional\n",
      "        The tick labels of each boxplot.\n",
      "        Ticks are always placed at the box *positions*. If *tick_labels* is given,\n",
      "        the ticks are labelled accordingly. Otherwise, they keep their numeric\n",
      "        values.\n",
      "\n",
      "        .. versionchanged:: 3.9\n",
      "            Renamed from *labels*, which is deprecated since 3.9\n",
      "            and will be removed in 3.11.\n",
      "\n",
      "    manage_ticks : bool, default: True\n",
      "        If True, the tick locations and labels will be adjusted to match\n",
      "        the boxplot positions.\n",
      "\n",
      "    autorange : bool, default: False\n",
      "        When `True` and the data are distributed such that the 25th and\n",
      "        75th percentiles are equal, *whis* is set to (0, 100) such\n",
      "        that the whisker ends are at the minimum and maximum of the data.\n",
      "\n",
      "    meanline : bool, default: :rc:`boxplot.meanline`\n",
      "        If `True` (and *showmeans* is `True`), will try to render the\n",
      "        mean as a line spanning the full width of the box according to\n",
      "        *meanprops* (see below).  Not recommended if *shownotches* is also\n",
      "        True.  Otherwise, means will be shown as points.\n",
      "\n",
      "    zorder : float, default: ``Line2D.zorder = 2``\n",
      "        The zorder of the boxplot.\n",
      "\n",
      "    Returns\n",
      "    -------\n",
      "    dict\n",
      "      A dictionary mapping each component of the boxplot to a list\n",
      "      of the `.Line2D` instances created. That dictionary has the\n",
      "      following keys (assuming vertical boxplots):\n",
      "\n",
      "      - ``boxes``: the main body of the boxplot showing the\n",
      "        quartiles and the median's confidence intervals if\n",
      "        enabled.\n",
      "\n",
      "      - ``medians``: horizontal lines at the median of each box.\n",
      "\n",
      "      - ``whiskers``: the vertical lines extending to the most\n",
      "        extreme, non-outlier data points.\n",
      "\n",
      "      - ``caps``: the horizontal lines at the ends of the\n",
      "        whiskers.\n",
      "\n",
      "      - ``fliers``: points representing data that extend beyond\n",
      "        the whiskers (fliers).\n",
      "\n",
      "      - ``means``: points or lines representing the means.\n",
      "\n",
      "    Other Parameters\n",
      "    ----------------\n",
      "    showcaps : bool, default: :rc:`boxplot.showcaps`\n",
      "        Show the caps on the ends of whiskers.\n",
      "    showbox : bool, default: :rc:`boxplot.showbox`\n",
      "        Show the central box.\n",
      "    showfliers : bool, default: :rc:`boxplot.showfliers`\n",
      "        Show the outliers beyond the caps.\n",
      "    showmeans : bool, default: :rc:`boxplot.showmeans`\n",
      "        Show the arithmetic means.\n",
      "    capprops : dict, default: None\n",
      "        The style of the caps.\n",
      "    capwidths : float or array, default: None\n",
      "        The widths of the caps.\n",
      "    boxprops : dict, default: None\n",
      "        The style of the box.\n",
      "    whiskerprops : dict, default: None\n",
      "        The style of the whiskers.\n",
      "    flierprops : dict, default: None\n",
      "        The style of the fliers.\n",
      "    medianprops : dict, default: None\n",
      "        The style of the median.\n",
      "    meanprops : dict, default: None\n",
      "        The style of the mean.\n",
      "    label : str or list of str, optional\n",
      "        Legend labels. Use a single string when all boxes have the same style and\n",
      "        you only want a single legend entry for them. Use a list of strings to\n",
      "        label all boxes individually. To be distinguishable, the boxes should be\n",
      "        styled individually, which is currently only possible by modifying the\n",
      "        returned artists, see e.g. :doc:`/gallery/statistics/boxplot_demo`.\n",
      "\n",
      "        In the case of a single string, the legend entry will technically be\n",
      "        associated with the first box only. By default, the legend will show the\n",
      "        median line (``result[\"medians\"]``); if *patch_artist* is True, the legend\n",
      "        will show the box `.Patch` artists (``result[\"boxes\"]``) instead.\n",
      "\n",
      "        .. versionadded:: 3.9\n",
      "\n",
      "    data : indexable object, optional\n",
      "        If given, all parameters also accept a string ``s``, which is\n",
      "        interpreted as ``data[s]`` if ``s`` is a key in ``data``.\n",
      "\n",
      "    See Also\n",
      "    --------\n",
      "    .Axes.bxp : Draw a boxplot from pre-computed statistics.\n",
      "    violinplot : Draw an estimate of the probability density function.\n",
      "\n",
      "    Notes\n",
      "    -----\n",
      "\n",
      "    .. note::\n",
      "\n",
      "        This is the :ref:`pyplot wrapper <pyplot_interface>` for `.axes.Axes.boxplot`.\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(boxplot)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "iut",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.14.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
