Commit 63d4d846 authored by Laurence Viry's avatar Laurence Viry
Browse files

ajout l'exemple introR - MOOC

parent 3b1209f8
Pipeline #9254 passed with stages
in 23 seconds
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Introduction au language R\n",
"\n",
"L'exemple utilisé dans ce résumé de cours est issu du MOOC \"Introduction à la statistique avec R\" de l'Université Paris-Sud avec Christophe Lalanne & Bruno Falissard (FUN).\n",
"\n",
"On considère le fichier de données \"smp1.csv\" relatif à l'étude santé mentale en prison, réalisée en 2004 et\n",
"financée par le Ministère de la Justice et le Ministère de la Santé. Cette étude a porté sur 799 détenus masculins tirés au sort dans les prisons de France métropolitaine. Nous avons un extrait de 9 variables avec :\n",
"\n",
"* l'âge,<br\\>\n",
"* la profession du détenu,<br\\>\n",
"* l'existence d'un diagnostic de dépression, de schizophrénie, réalisé par 2 cliniciens, c'est\n",
"un diagnostic consensuel,<br\\>\n",
"* le niveau de gravité éventuelle de la pathologie du détenu, ici gravité consensuelle également,<br\\>\n",
"* le nombre d'enfants du détenu.<br\\>\n",
"\n",
"et 3 variables représentant la personnalité du détenu:\n",
"\n",
"* le niveau de recherche de sensation (**rs**)<br\\>\n",
"* le niveau d'évitement du danger (**ed**)<br\\>\n",
"* et le niveau de dépendance à la récompense (**dr**)<br\\>\n",
"\n",
"## Importation des données et manipulation des variables\n",
"\n",
"Le chargement du fichier **smp1.csv** se fait à l’aide de la fonction **read.csv()**, qui permet de lire des fichiers\n",
"CSV. Le *séparateur de champ* est un point-virgule, et *le séparateur décimal* une virgule. Les données seront associées à la variable **smp** à l’aide de l’opérateur d’affectation **\"<-\"**.\n",
"\n",
"On considère le répertoire contenant le fichier smp1.csv comme répertoire de travail, en utilisant la fonction **setwd()**."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"setwd('/home/viryl/notebooks/CED-IntroR/TP/data')\n",
"smp <- read.csv(\"smp1.csv\",header=TRUE,sep=\";\",dec=\",\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Une fois que les données sont importées, la variable **smp** sera disponible dans l’espace de travail(“workspace” ou \"Environment\"), comme on peut le vérifier avec la commande **ls()**.\n",
"\n",
"Les dimensions du tableau de données peuvent être obtenues à l’aide de la fonction **dim()**, et la fonction\n",
" **names()** fournit le nom des variables.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ls()\n",
"dim(smp)\n",
"names(smp)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"La commande **str()** fournit un résumé de l’ensemble des variables avec leurtype(ou mode de représentation)\n",
"\n",
" - *int*: pour les variables numériques,\n",
" - *factor*: pour les variables catégorielles\n",
" - et un aperçu des 10 premières observations.\n",
" \n",
" "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"str(smp)\n",
"summary(smp)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Une autre commande utile pour inspecter la structure de données est la commande **summary()** qui fournit un résumé descriptif univarié pour chaque variable. \n",
"\n",
"Dans le cas **des variables numériques**, R indique les principaux\n",
" indicateurs de tendance centrale(moyenne et médiane) et de dispersion(étendue,intervalle inter-quartile), ainsi\n",
"que le nombre de valeurs manquantes représentées par le symbole NA.\n",
"\n",
"Dans le cas **des variables catégorielles**, R fournit un tableau d’effectifs, c’est-à-dire le nombre d’observations associées à chacune des modalités de la variable."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"summary(smp)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Travailler avec des variables numériques\n",
"\n",
"Pour afficher l’ensemble des observations recueillies pour une variable donnée, on tapera le nom de cette variable préfixé du nom du dataframe suivi du signe **$**. L’expression **smp$age** désignera ainsi les valeurs prises par la variable \"age\" dans le dat-frame **smp**.\n",
"\n",
"Plutôt que d’afficher l’ensemble des valeurs, on peut vouloir limiter l’affichage à certaines observations, que l’on désignera par leur numéro. On peut ainsi choisir d’afficher, la première, les deux premières, ou la première et la troisième observation à l’aide des instructions suivantes:"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"31"
],
"text/latex": [
"31"
],
"text/markdown": [
"31"
],
"text/plain": [
"[1] 31"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<ol class=list-inline>\n",
"\t<li>31</li>\n",
"\t<li>49</li>\n",
"</ol>\n"
],
"text/latex": [
"\\begin{enumerate*}\n",
"\\item 31\n",
"\\item 49\n",
"\\end{enumerate*}\n"
],
"text/markdown": [
"1. 31\n",
"2. 49\n",
"\n",
"\n"
],
"text/plain": [
"[1] 31 49"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<ol class=list-inline>\n",
"\t<li>31</li>\n",
"\t<li>50</li>\n",
"</ol>\n"
],
"text/latex": [
"\\begin{enumerate*}\n",
"\\item 31\n",
"\\item 50\n",
"\\end{enumerate*}\n"
],
"text/markdown": [
"1. 31\n",
"2. 50\n",
"\n",
"\n"
],
"text/plain": [
"[1] 31 50"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"smp$age[1]\n",
"smp$age[c(1,2)]\n",
"smp$age[c(1,3)]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"ou un ensemble d’observations consécutives en utilisant la notation **[i:j]** Pour afficher les 10 premières observations.\n"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<ol class=list-inline>\n",
"\t<li>31</li>\n",
"\t<li>49</li>\n",
"\t<li>50</li>\n",
"\t<li>47</li>\n",
"\t<li>23</li>\n",
"\t<li>34</li>\n",
"\t<li>24</li>\n",
"\t<li>52</li>\n",
"\t<li>42</li>\n",
"\t<li>45</li>\n",
"</ol>\n"
],
"text/latex": [
"\\begin{enumerate*}\n",
"\\item 31\n",
"\\item 49\n",
"\\item 50\n",
"\\item 47\n",
"\\item 23\n",
"\\item 34\n",
"\\item 24\n",
"\\item 52\n",
"\\item 42\n",
"\\item 45\n",
"\\end{enumerate*}\n"
],
"text/markdown": [
"1. 31\n",
"2. 49\n",
"3. 50\n",
"4. 47\n",
"5. 23\n",
"6. 34\n",
"7. 24\n",
"8. 52\n",
"9. 42\n",
"10. 45\n",
"\n",
"\n"
],
"text/plain": [
" [1] 31 49 50 47 23 34 24 52 42 45"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"smp$age[1:10]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"La commande **summary()** fonctionne également avec une variable et fournit, comme dans le cas d’un dataframe,\n",
" un résumé numérique de la distribution de la variable selon son type."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
" Min. 1st Qu. Median Mean 3rd Qu. Max. NA's \n",
" 19.0 28.0 37.0 38.9 48.0 83.0 2 "
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"[1] NA"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"summary(smp$age)\n",
"min(smp$age)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Eneffet,danslecasoùunevariablecontientdesdonnéesmanquantes,ilfautindiquerexplicitementàRcequel’on\n",
"souhaitefairedesvaleursmanquantes.Pardéfaut,Rnesupprimepaslesvaleursmanquantes,commeonpeutle\n",
"vérifierdansl’aideenligne(\n",
"na.rm = FALSE\n",
"),etsecontentederenvoyerlavaleur\n",
"NA\n",
"poursignaleràl’utilisateur\n",
"quecertainesdonnéessontmanquantes."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"min(smp$age,na.rm=TRUE)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"L’étenduedesvaleursobservéess’obtientavec\n",
"range()\n",
"qui,contrairementà\n",
"min()\n",
",estunecommandequi\n",
"renvoiedesrésultatsmultiples(danscecas,leminimumetlemaximumdelavariable\n",
"age\n",
")."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<ol class=list-inline>\n",
"\t<li>19</li>\n",
"\t<li>83</li>\n",
"</ol>\n"
],
"text/latex": [
"\\begin{enumerate*}\n",
"\\item 19\n",
"\\item 83\n",
"\\end{enumerate*}\n"
],
"text/markdown": [
"1. 19\n",
"2. 83\n",
"\n",
"\n"
],
"text/plain": [
"[1] 19 83"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"'integer'"
],
"text/latex": [
"'integer'"
],
"text/markdown": [
"'integer'"
],
"text/plain": [
"[1] \"integer\""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"2"
],
"text/latex": [
"2"
],
"text/markdown": [
"2"
],
"text/plain": [
"[1] 2"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"19"
],
"text/latex": [
"19"
],
"text/markdown": [
"19"
],
"text/plain": [
"[1] 19"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"83"
],
"text/latex": [
"83"
],
"text/markdown": [
"83"
],
"text/plain": [
"[1] 83"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"range(smp$age,na.rm=TRUE)\n",
"rg_age <- range(smp$age,na.rm=TRUE)\n",
"class(rg_age)\n",
"length(rg_age)\n",
"rg_age[1]\n",
"rg_age[2]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Travailler avec les variables binaires"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Représentation des variables qualitatives"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Recodage des variables\n",
"\n",
"Considéronslavariable\n",
"n.enfant\n",
",quireprésentelenombred’enfantsdanslafamilledurépondant.Unsimple\n",
"tableaud’effectifsconfirmeralanaturediscrètedecettevariable,et"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"\n",
" 0 1 2 3 4 5 6 7 8 9 10 11 13 <NA> \n",
" 214 220 125 101 55 31 7 7 7 2 2 1 1 26 "
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"table(smp$n.enfant,useNA =\"always\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"onnoteraquel’onpeuttrèsbieneffectuerun\n",
"tableaud’effectifsàpartird’uneconditionlogique,parexempledénombrerlesindividusayant4enfantsoumoinset\n",
"ceuxayantplusde4enfants,commeillustréci-dessous:"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"\n",
"FALSE TRUE \n",
" 715 58 "
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"table(smp$n.enfant >4)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Supposons à présent que l’on souhaite regrouper dans une même classe les individus ayant 5 enfants ou plus. Pour\n",
"cela, il suffit de convertir la variable **n.enfant** en facteur, puis d’agréger ces derniers niveauxgrâce à la commande levels()."
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"6"
],
"text/latex": [
"6"
],
"text/markdown": [
"6"
],
"text/plain": [
"[1] 6"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"\n",
" 0 1 2 3 4 5+ \n",
"214 220 125 101 55 58 "
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"smp$n.enfant.cat <-factor(smp$n.enfant)\n",
"levels(smp$n.enfant.cat)[6:13] <-\"5+\"\n",
"nlevels(smp$n.enfant.cat)\n",
"# table de frequences\n",
"table(smp$n.enfant.cat)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Il est également possible de recoder en variable qualitative des variables continues à l’origine. Par exemple, avec la\n",
" variable age, il serait tout à fait possible de créer une variable **age.cat** à 4 classes d’effectifs à peu près équilibrés à l’aide de la commande **cut()**. Avec cette commande, il est important de préciser l’option **\"include.lowest = TRUE\"** pour ne pas oublier d’inclure l’observation dont l’âge vaut l’âge minimal, puisque pardéfaut les intervalles ont des bornes ouvertes(c’est-à-dire n’incluant pas) à gauche."
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"\n",
"[19,25] (25,35] (35,45] (45,83] \n",
" 136 223 207 231 "
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"smp$age.cat <-cut(smp$age,breaks =c(19, 25, 35, 45, 83),include.lowest =TRUE)\n",
"table(smp$age.cat)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Sauvegarde de données\n",
"\n",
"Il est tout à fait possible de sauvegarder des données au format **RData**, qui est un format propre au logiciel R. Cela facilite l’archivage de résultats intermédiaires ou l’enregistrement d’un tableau de données nettoyé(recodage de\n",
" valeurs manquantes ou modalités de variables qualitatives,correction des erreurs de saisie,etc.)ou augmenté de\n",
" variables auxiliaires. Pour cela, on utilisera la commande **save()**. La commande **load()** permet quant à elle de\n",
" recharger des données sauvegardées au format **RData**. L’extension du ficher peu-être indifféremment **RData** ou **rda**."
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [],
"source": [
"save(smp,file =\"smp_v1.rda\")\n",
"dir(pattern =\"rda\")"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [],
"source": [
"load(\"smp_v1.rda\")"
]
},