class: center, middle, title background-image: url(./img/FraMauroDetailedMap.jpg) background-size: cover background-position: 50% 50% # Les essentiels de la data science ## R : le couteau suisse des données </BR> </BR> </BR> ### Joël Gombin, avec Endi Pons <img src="./img/Logo_DATACTIVIST_TW.png" height="100px" /> .right[.footnote[<a href='https://commons.wikimedia.org/wiki/File:FraMauroDetailedMap.jpg'>source</a>]] --- class: center, middle Retrouvez les matériaux sur https://github.com/datactivist/AUAT Ces slides en ligne : http://datactivi.st/AUAT Pad collaboratif : https://frama.link/AUAT --- class: center, middle  --- class: inverse, center, middle ## Faisons connaissance https://frama.link/formationR ??? Recueillir les réponses, générer le dashboard et montrer et expliquer le code --- class: inverse, center, middle ## Un exemple de workflow ### (OSM, PostGis, R, Leaflet) test_osm.R ??? Montrer quelques capacités spatiales/GIS de R en quelques lignes --- class: inverse, center, middle ## Un exemple de workflow ### (OSM, BAN, leaflet, tmap, modélisation) https://joelgombin.github.io/makingof --- ## Vos habitudes de travail - postgis ? - QGIS ? - R ? - OSM ? - ... --- ## Vos données Essayez d'amener des données sur lesquelles vous souhaitez travailler --- ## Les objectifs (jour 1) - Comprendre les possibilités offertes par R - Comprendre le pipeline de données - Savoir importer des données dans R - Comprendre la notion de tidy data - Savoir transformer ses données en tidy - (si on a le temps) introduction à sf --- ## Le data pipeline <img src="./img/data-science.png" width="90%" style="display: block; margin: auto;" /> ??? Présenter les étapes du data pipeline Divers outils, workflows fragmentés Variante de ce pipeline : celui de School of Data --- ## Le data pipeline <img src="./img/pipeline.png" width="90%" style="display: block; margin: auto;" /> --- ## One tool to rule them all - R a comme avantage d'être un langage de programmation (= potentiel illimité) pensé exprès pour la manipulation des données (= usabilité, flexibilité) - au fil du temps, devenu un "general purpose tool" - permet d'interfacer de nombreux outils plus spécialisés - une communauté très dynamique (free software) - une syntaxe de plus en plus facile - des progrès vers [des bouts de GUI](https://rstudio.github.io/rstudioaddins/) --- ## Se faire aider * Des livres : + [R for Data Science](http://r4ds.had.co.nz) de G. Grolemund et H. Wickham + [Applied Spatial Data Analysis with R](http://gis.humboldt.edu/OLM/r/Spatial%20Analysis%20With%20R.pdf) de Bivand et al. + [An Introduction to R for Spatial Analysis and Mapping](https://www.amazon.com/Introduction-Spatial-Analysis-Mapping/dp/1446272958) de Brundson et Cumber + [R et espace](https://framabook.org/r-et-espace/), du groupe ElementR * blogs : + https://www.r-bloggers.com + https://quanti.hypotheses.org/ + https://politbistro.hypotheses.org + https://neocarto.hypotheses.org/ + http://rgeomatic.hypotheses.org/ + http://elementr.hypotheses.org/ --- ## Se faire aider * des listes de diffusion thématiques (ex : [la liste quanti](mailto:quanti@groupes.renater.fr), semin-r@mnhn.fr, r-soc@groupes.renater.fr), des forums (http://forums.cirad.fr/logiciel-R/) * un site de Q/R communautaires : http://stackoverflow.com/questions/tagged/r * twitter avec le hashtag [#Rstats](https://twitter.com/search?q=%23rstats) * les [meetup R](https://www.meetup.com/fr-FR/rparis/) * les [cheatsheets de Rstudio](https://www.rstudio.com/resources/cheatsheets/) --- ## Prise en main de Rstudio - raccourci pour exécuter une ligne de code : ctrl + entrée, pomme + entrée pour Mac --- ## Scripts, literate programming, reproducible research - toujours travailler dans le cadre d'un "projet" - ne jamais travailler dans la console - écrire des scripts - mieux : mêler texte et code au moyen de [fichiers Rmd](http://rmarkdown.rstudio.com/) - versionnage (git) - notebook - commentez ! (avec le #) ```r # ceci est un commentaire ``` --- ## Installation du tidyverse * Le `tidyverse` (ou hadleyverse) opérationnalise le workflow. Suite de packages pensés pour fonctionner ensemble * La "glue" de ce package : le "pipe" `%>%` (Ctrl/Cmd + shift + M) * Pour installer le tidyverse, entrez dans la console : `install.packages("tidyverse")` (ou via Rstudio) * `library(tidyverse)` => charge le package --- class: inverse, center, middle # Importer des données --- ## En GUI ou en CLI - bouton "Import dataset" - en CLI : package `readr` pour le CSV, `haven` pour SPSS / SAS / Stata, `readxl` pour le XLS(X), `rio` pour (presque) tout le reste *Et vous, quel(s) format(s) de données utilisez-vous habituellement ?* --- ## Importez votre premier jeu de données ! - chargement de package : `library(readr)` (ou `library(tidyverse)`) - Attention à l'assignation : `monjeudedonnees <- read_csv("monfichier.csv")` - Importons un jeu de données électoral : les résultats par commune du premier tour de l'élection présidentielle. Source : https://github.com/datactivist/presidentielle2017 (préparées avec https://github.com/joelgombin/LireMinInterieur) --- ## Importez votre premier jeu de données ! ```r suppressPackageStartupMessages(library(tidyverse)) pres2017T1_communes <- read_csv("./data/Presidentielle_2017_Resultats_Communes_T1_clean.csv") ``` ``` ## Parsed with column specification: ## cols( ## .default = col_double(), ## CodeInsee = col_character(), ## CodeDepartement = col_character(), ## Département = col_character(), ## Commune = col_character(), ## Inscrits = col_integer(), ## Abstentions = col_integer(), ## Votants = col_integer(), ## Blancs = col_integer(), ## Nuls = col_integer(), ## Exprimés = col_integer(), ## `LE PEN` = col_integer(), ## MÉLENCHON = col_integer(), ## MACRON = col_integer(), ## FILLON = col_integer(), ## LASSALLE = col_integer(), ## `DUPONT-AIGNAN` = col_integer(), ## HAMON = col_integer(), ## ASSELINEAU = col_integer(), ## POUTOU = col_integer(), ## ARTHAUD = col_integer() ## # ... with 1 more columns ## ) ``` ``` ## See spec(...) for full column specifications. ``` ## Importez votre premier jeu de données ! Si besoin, ajuster l'import au moyen des arguments `col_types`, `locale` ou encore `na` ```r pres2017T1_communes <- read_csv("./data/Presidentielle_2017_Resultats_Communes_T1_clean.csv", na = "", col_types = cols( .default = col_double(), CodeInsee = col_character(), CodeDepartement = col_character(), Département = col_character(), Commune = col_character(), Inscrits = col_integer(), Abstentions = col_integer(), Votants = col_integer(), Blancs = col_integer(), Nuls = col_integer(), Exprimés = col_integer(), `LE PEN` = col_integer(), MÉLENCHON = col_integer(), MACRON = col_integer(), FILLON = col_integer(), LASSALLE = col_integer(), `DUPONT-AIGNAN` = col_integer(), HAMON = col_integer(), ASSELINEAU = col_integer(), POUTOU = col_integer(), ARTHAUD = col_integer(), CHEMINADE = col_integer() ) ) ``` ??? Expliquer les types de variable --- ## La notion de fonction ```r sum(1, 2, 3) ``` ``` ## [1] 6 ``` ```r a <- sum(1, 2, 3) a ``` ``` ## [1] 6 ``` --- class: inverse, center, middle # Le tidyverse --- ## La notion de tidy data > “Happy families are all alike; every unhappy family is unhappy in its own way.” – Tolstoï > “Tidy datasets are all alike, but every messy dataset is messy in its own way.” – Hadley Wickham - À chaque variable sa propre colonne - À chaque observation sa propre ligne - À chaque valeur sa propre cellule --- ## La notion de tidy data <img src="./img/tidy-1.png" width="90%" style="display: block; margin: auto;" /> --- ## La notion de tidy data - À chaque observation sa propre ligne - À chaque variable sa colonne - À chaque valeur sa propre cellule > 1 jeu de données par table, dite “tibble” --- ## Un exemple de untidy data https://www.data.gouv.fr/fr/datasets/election-presidentielle-des-23-avril-et-7-mai-2017-resultats-definitifs-du-1er-tour-par-communes/ --- ## Préparer des tidy data - `dplyr` et `tidyr` - le pipe : `%>%` (Ctrl/Cmd + shift + M) - les verbes : + `filter` (et `slice`) + `arrange` + `select` (et `rename`) + `distinct` + `mutate` + `group_by` + `summarise` + `sample_n` / `sample_frac` - `stringr` peut utilement accompagner (manipulation de chaînes de caractères) --- ## Pivoter `gather` et `spread` <img src="http://r4ds.had.co.nz/images/tidy-9.png" width="90%" style="display: block; margin: auto;" /> --- ## Pivoter ```r pres2017T1_communes_long <- pres2017T1_communes %>% select(- contains("_ins")) %>% select(- contains("_exp")) %>% gather(candidat, voix, `LE PEN`:CHEMINADE) pres2017T1_communes_long ``` ``` ## # A tibble: 390,456 x 15 ## CodeInsee CodeDepartement Département Commune Inscrits ## <chr> <chr> <chr> <chr> <int> ## 1 01001 01 Ain L'Abergement-Clémenciat 598 ## 2 01002 01 Ain L'Abergement-de-Varey 209 ## 3 01004 01 Ain Ambérieu-en-Bugey 8586 ## 4 01005 01 Ain Ambérieux-en-Dombes 1172 ## 5 01006 01 Ain Ambléon 99 ## 6 01007 01 Ain Ambronay 1880 ## 7 01008 01 Ain Ambutrix 581 ## 8 01009 01 Ain Andert-et-Condon 254 ## 9 01010 01 Ain Anglefort 738 ## 10 01011 01 Ain Apremont 275 ## # ... with 390,446 more rows, and 10 more variables: Abstentions <int>, ## # Votants <int>, Blancs <int>, Blancs_vot <dbl>, Nuls <int>, ## # Nuls_vot <dbl>, Exprimés <int>, Exprimés_vot <dbl>, candidat <chr>, ## # voix <int> ``` --- ## Modifier ```r pres2017T1_communes_long <- pres2017T1_communes_long %>% mutate(ins = voix / Inscrits * 100) %>% mutate(exp = voix / Exprimés * 100) %>% print ``` ``` ## # A tibble: 390,456 x 17 ## CodeInsee CodeDepartement Département Commune Inscrits ## <chr> <chr> <chr> <chr> <int> ## 1 01001 01 Ain L'Abergement-Clémenciat 598 ## 2 01002 01 Ain L'Abergement-de-Varey 209 ## 3 01004 01 Ain Ambérieu-en-Bugey 8586 ## 4 01005 01 Ain Ambérieux-en-Dombes 1172 ## 5 01006 01 Ain Ambléon 99 ## 6 01007 01 Ain Ambronay 1880 ## 7 01008 01 Ain Ambutrix 581 ## 8 01009 01 Ain Andert-et-Condon 254 ## 9 01010 01 Ain Anglefort 738 ## 10 01011 01 Ain Apremont 275 ## # ... with 390,446 more rows, and 12 more variables: Abstentions <int>, ## # Votants <int>, Blancs <int>, Blancs_vot <dbl>, Nuls <int>, ## # Nuls_vot <dbl>, Exprimés <int>, Exprimés_vot <dbl>, candidat <chr>, ## # voix <int>, ins <dbl>, exp <dbl> ``` --- ## Pivoter ```r pres2017T1_communes_long %>% gather(metrique, valeur, voix:exp) %>% glimpse ``` ``` ## Observations: 1,171,368 ## Variables: 16 ## $ CodeInsee <chr> "01001", "01002", "01004", "01005", "01006", "... ## $ CodeDepartement <chr> "01", "01", "01", "01", "01", "01", "01", "01"... ## $ Département <chr> "Ain", "Ain", "Ain", "Ain", "Ain", "Ain", "Ain... ## $ Commune <chr> "L'Abergement-Clémenciat", "L'Abergement-de-Va... ## $ Inscrits <int> 598, 209, 8586, 1172, 99, 1880, 581, 254, 738,... ## $ Abstentions <int> 92, 25, 1962, 215, 20, 268, 91, 41, 136, 43, 5... ## $ Votants <int> 506, 184, 6624, 957, 79, 1612, 490, 213, 602, ... ## $ Blancs <int> 2, 6, 114, 21, 2, 53, 12, 1, 2, 6, 0, 2, 33, 1... ## $ Blancs_vot <dbl> 0.3952569, 3.2608696, 1.7210145, 2.1943574, 2.... ## $ Nuls <int> 9, 2, 58, 3, 0, 11, 5, 3, 11, 2, 7, 0, 12, 8, ... ## $ Nuls_vot <dbl> 1.7786561, 1.0869565, 0.8756039, 0.3134796, 0.... ## $ Exprimés <int> 495, 176, 6452, 933, 77, 1548, 473, 209, 589, ... ## $ Exprimés_vot <dbl> 97.82609, 95.65217, 97.40338, 97.49216, 97.468... ## $ candidat <chr> "LE PEN", "LE PEN", "LE PEN", "LE PEN", "LE PE... ## $ metrique <chr> "voix", "voix", "voix", "voix", "voix", "voix"... ## $ valeur <dbl> 126, 48, 1667, 306, 18, 458, 135, 40, 207, 64,... ``` --- ## Pivoter ```r pres2017T1_communes_long %>% gather(metrique, valeur, voix:exp) %>% unite(variable, candidat, metrique, sep = "_") %>% glimpse ``` ``` ## Observations: 1,171,368 ## Variables: 15 ## $ CodeInsee <chr> "01001", "01002", "01004", "01005", "01006", "... ## $ CodeDepartement <chr> "01", "01", "01", "01", "01", "01", "01", "01"... ## $ Département <chr> "Ain", "Ain", "Ain", "Ain", "Ain", "Ain", "Ain... ## $ Commune <chr> "L'Abergement-Clémenciat", "L'Abergement-de-Va... ## $ Inscrits <int> 598, 209, 8586, 1172, 99, 1880, 581, 254, 738,... ## $ Abstentions <int> 92, 25, 1962, 215, 20, 268, 91, 41, 136, 43, 5... ## $ Votants <int> 506, 184, 6624, 957, 79, 1612, 490, 213, 602, ... ## $ Blancs <int> 2, 6, 114, 21, 2, 53, 12, 1, 2, 6, 0, 2, 33, 1... ## $ Blancs_vot <dbl> 0.3952569, 3.2608696, 1.7210145, 2.1943574, 2.... ## $ Nuls <int> 9, 2, 58, 3, 0, 11, 5, 3, 11, 2, 7, 0, 12, 8, ... ## $ Nuls_vot <dbl> 1.7786561, 1.0869565, 0.8756039, 0.3134796, 0.... ## $ Exprimés <int> 495, 176, 6452, 933, 77, 1548, 473, 209, 589, ... ## $ Exprimés_vot <dbl> 97.82609, 95.65217, 97.40338, 97.49216, 97.468... ## $ variable <chr> "LE PEN_voix", "LE PEN_voix", "LE PEN_voix", "... ## $ valeur <dbl> 126, 48, 1667, 306, 18, 458, 135, 40, 207, 64,... ``` --- ## Pivoter ```r pres2017T1_communes_long %>% gather(metrique, valeur, voix:exp) %>% unite(variable, candidat, metrique, sep = "_") %>% spread(variable, valeur) %>% glimpse ``` ``` ## Observations: 35,496 ## Variables: 46 ## $ CodeInsee <chr> "01001", "01002", "01004", "01005", "0100... ## $ CodeDepartement <chr> "01", "01", "01", "01", "01", "01", "01",... ## $ Département <chr> "Ain", "Ain", "Ain", "Ain", "Ain", "Ain",... ## $ Commune <chr> "L'Abergement-Clémenciat", "L'Abergement-... ## $ Inscrits <int> 598, 209, 8586, 1172, 99, 1880, 581, 254,... ## $ Abstentions <int> 92, 25, 1962, 215, 20, 268, 91, 41, 136, ... ## $ Votants <int> 506, 184, 6624, 957, 79, 1612, 490, 213, ... ## $ Blancs <int> 2, 6, 114, 21, 2, 53, 12, 1, 2, 6, 0, 2, ... ## $ Blancs_vot <dbl> 0.3952569, 3.2608696, 1.7210145, 2.194357... ## $ Nuls <int> 9, 2, 58, 3, 0, 11, 5, 3, 11, 2, 7, 0, 12... ## $ Nuls_vot <dbl> 1.7786561, 1.0869565, 0.8756039, 0.313479... ## $ Exprimés <int> 495, 176, 6452, 933, 77, 1548, 473, 209, ... ## $ Exprimés_vot <dbl> 97.82609, 95.65217, 97.40338, 97.49216, 9... ## $ ARTHAUD_exp <dbl> 0.8080808, 1.1363636, 0.6199628, 0.535905... ## $ ARTHAUD_ins <dbl> 0.6688963, 0.9569378, 0.4658747, 0.426621... ## $ ARTHAUD_voix <dbl> 4, 2, 40, 5, 1, 9, 3, 0, 3, 4, 2, 2, 9, 3... ## $ ASSELINEAU_exp <dbl> 1.2121212, 0.5681818, 1.1004340, 1.071811... ## $ ASSELINEAU_ins <dbl> 1.0033445, 0.4784689, 0.8269276, 0.853242... ## $ ASSELINEAU_voix <dbl> 6, 1, 71, 10, 0, 11, 2, 6, 10, 1, 0, 2, 2... ## $ CHEMINADE_exp <dbl> 0.40404040, 0.00000000, 0.07749535, 0.000... ## $ CHEMINADE_ins <dbl> 0.33444816, 0.00000000, 0.05823433, 0.000... ## $ CHEMINADE_voix <dbl> 2, 0, 5, 0, 0, 1, 3, 0, 1, 0, 1, 0, 2, 2,... ## $ `DUPONT-AIGNAN_exp` <dbl> 6.868687, 3.409091, 5.362678, 4.823151, 5... ## $ `DUPONT-AIGNAN_ins` <dbl> 5.685619, 2.870813, 4.029816, 3.839590, 4... ## $ `DUPONT-AIGNAN_voix` <dbl> 34, 6, 346, 45, 4, 80, 28, 6, 33, 9, 10, ... ## $ FILLON_exp <dbl> 22.22222, 19.31818, 16.80099, 21.11468, 1... ## $ FILLON_ins <dbl> 18.394649, 16.267943, 12.625204, 16.80887... ## $ FILLON_voix <dbl> 110, 34, 1084, 197, 14, 233, 84, 44, 83, ... ## $ HAMON_exp <dbl> 5.8585859, 7.3863636, 5.3316801, 3.965702... ## $ HAMON_ins <dbl> 4.8494983, 6.2200957, 4.0065222, 3.156996... ## $ HAMON_voix <dbl> 29, 13, 344, 37, 3, 82, 23, 8, 20, 13, 10... ## $ LASSALLE_exp <dbl> 0.4040404, 0.0000000, 0.9299442, 0.643086... ## $ LASSALLE_ins <dbl> 0.3344482, 0.0000000, 0.6988120, 0.511945... ## $ LASSALLE_voix <dbl> 2, 0, 60, 6, 1, 13, 3, 8, 14, 4, 2, 0, 21... ## $ `LE PEN_exp` <dbl> 25.45455, 27.27273, 25.83695, 32.79743, 2... ## $ `LE PEN_ins` <dbl> 21.07023, 22.96651, 19.41533, 26.10922, 1... ## $ `LE PEN_voix` <dbl> 126, 48, 1667, 306, 18, 458, 135, 40, 207... ## $ MACRON_exp <dbl> 24.040404, 21.022727, 20.644761, 20.47159... ## $ MACRON_ins <dbl> 19.899666, 17.703349, 15.513627, 16.29692... ## $ MACRON_voix <dbl> 119, 37, 1332, 191, 15, 348, 95, 55, 110,... ## $ MÉLENCHON_exp <dbl> 11.91919, 18.75000, 21.88469, 13.50482, 2... ## $ MÉLENCHON_ins <dbl> 9.866221, 15.789474, 16.445376, 10.750853... ## $ MÉLENCHON_voix <dbl> 59, 33, 1412, 126, 19, 296, 89, 39, 103, ... ## $ POUTOU_exp <dbl> 0.8080808, 1.1363636, 1.4104154, 1.071811... ## $ POUTOU_ins <dbl> 0.6688963, 0.9569378, 1.0598649, 0.853242... ## $ POUTOU_voix <dbl> 4, 2, 91, 10, 2, 17, 8, 3, 5, 4, 2, 2, 15... ``` --- class: inverse, center, middle ## À vous ! ### Choisissez un jeu de données à importer et nettoyer --- ## Le data pipeline <img src="./img/pipeline.png" width="90%" style="display: block; margin: auto;" /> --- class: center, middle, inverse ## Évaluation ## https://frama.link/eval-auat-1 --- class: center, middle, title background-image: url(./img/FraMauroDetailedMap.jpg) background-size: cover background-position: 50% 50% # Analyser ses données ## R : le couteau suisse des données </BR> </BR> </BR> ### Joël Gombin, avec Endi Pons <img src="./img/Logo_DATACTIVIST_TW.png" height="100px" /> .right[.footnote[<a href='https://commons.wikimedia.org/wiki/File:FraMauroDetailedMap.jpg'>source</a>]] --- ## Objectifs (jour 2) - Solidifier les acquis d'hier - Boîte à outils : le tidyverse (suite) - Les tidydata géographiques - Analyse uni- et bi-variées - Analyse multivariée (AGD) --- ## Exercices - Importer des données en CSV - sélectionner certaines lignes en fonction d'une condition logique - ajouter une nouvelle variable - agréger/résumer les données par groupe - trier le résultat - pivoter des données --- ## Recoder des données - `recode` - `case_when` --- ## Recoder des données ```r suppressPackageStartupMessages(library(tidyverse)) elections <- read_csv("data/Presidentielle_2017_Resultats_Communes_T1_clean.csv") ``` ``` ## Parsed with column specification: ## cols( ## .default = col_double(), ## CodeInsee = col_character(), ## CodeDepartement = col_character(), ## Département = col_character(), ## Commune = col_character(), ## Inscrits = col_integer(), ## Abstentions = col_integer(), ## Votants = col_integer(), ## Blancs = col_integer(), ## Nuls = col_integer(), ## Exprimés = col_integer(), ## `LE PEN` = col_integer(), ## MÉLENCHON = col_integer(), ## MACRON = col_integer(), ## FILLON = col_integer(), ## LASSALLE = col_integer(), ## `DUPONT-AIGNAN` = col_integer(), ## HAMON = col_integer(), ## ASSELINEAU = col_integer(), ## POUTOU = col_integer(), ## ARTHAUD = col_integer() ## # ... with 1 more columns ## ) ``` ``` ## See spec(...) for full column specifications. ``` --- ## Recoder des données ```r elections %>% mutate(region = case_when( CodeDepartement %in% c("75", "77", "78", "91", "92", "93", "94", "95") ~ "Ile-de-France", TRUE ~ "Province")) %>% glimpse ``` ``` ## Observations: 35,496 ## Variables: 52 ## $ CodeInsee <chr> "01001", "01002", "01004", "01005", "01006... ## $ CodeDepartement <chr> "01", "01", "01", "01", "01", "01", "01", ... ## $ Département <chr> "Ain", "Ain", "Ain", "Ain", "Ain", "Ain", ... ## $ Commune <chr> "L'Abergement-Clémenciat", "L'Abergement-d... ## $ Inscrits <int> 598, 209, 8586, 1172, 99, 1880, 581, 254, ... ## $ Abstentions <int> 92, 25, 1962, 215, 20, 268, 91, 41, 136, 4... ## $ Abstentions_ins <dbl> 15.38462, 11.96172, 22.85115, 18.34471, 20... ## $ Votants <int> 506, 184, 6624, 957, 79, 1612, 490, 213, 6... ## $ Votants_ins <dbl> 84.61538, 88.03828, 77.14885, 81.65529, 79... ## $ Blancs <int> 2, 6, 114, 21, 2, 53, 12, 1, 2, 6, 0, 2, 3... ## $ Blancs_ins <dbl> 0.3344482, 2.8708134, 1.3277428, 1.7918089... ## $ Blancs_vot <dbl> 0.3952569, 3.2608696, 1.7210145, 2.1943574... ## $ Nuls <int> 9, 2, 58, 3, 0, 11, 5, 3, 11, 2, 7, 0, 12,... ## $ Nuls_ins <dbl> 1.5050167, 0.9569378, 0.6755183, 0.2559727... ## $ Nuls_vot <dbl> 1.7786561, 1.0869565, 0.8756039, 0.3134796... ## $ Exprimés <int> 495, 176, 6452, 933, 77, 1548, 473, 209, 5... ## $ Exprimés_ins <dbl> 82.77592, 84.21053, 75.14559, 79.60751, 77... ## $ Exprimés_vot <dbl> 97.82609, 95.65217, 97.40338, 97.49216, 97... ## $ `LE PEN` <int> 126, 48, 1667, 306, 18, 458, 135, 40, 207,... ## $ MÉLENCHON <int> 59, 33, 1412, 126, 19, 296, 89, 39, 103, 3... ## $ MACRON <int> 119, 37, 1332, 191, 15, 348, 95, 55, 110, ... ## $ FILLON <int> 110, 34, 1084, 197, 14, 233, 84, 44, 83, 4... ## $ LASSALLE <int> 2, 0, 60, 6, 1, 13, 3, 8, 14, 4, 2, 0, 21,... ## $ `DUPONT-AIGNAN` <int> 34, 6, 346, 45, 4, 80, 28, 6, 33, 9, 10, 3... ## $ HAMON <int> 29, 13, 344, 37, 3, 82, 23, 8, 20, 13, 10,... ## $ ASSELINEAU <int> 6, 1, 71, 10, 0, 11, 2, 6, 10, 1, 0, 2, 23... ## $ POUTOU <int> 4, 2, 91, 10, 2, 17, 8, 3, 5, 4, 2, 2, 15,... ## $ ARTHAUD <int> 4, 2, 40, 5, 1, 9, 3, 0, 3, 4, 2, 2, 9, 3,... ## $ CHEMINADE <int> 2, 0, 5, 0, 0, 1, 3, 0, 1, 0, 1, 0, 2, 2, ... ## $ `LE PEN_ins` <dbl> 21.07023, 22.96651, 19.41533, 26.10922, 18... ## $ MÉLENCHON_ins <dbl> 9.866221, 15.789474, 16.445376, 10.750853,... ## $ MACRON_ins <dbl> 19.899666, 17.703349, 15.513627, 16.296928... ## $ FILLON_ins <dbl> 18.394649, 16.267943, 12.625204, 16.808874... ## $ LASSALLE_ins <dbl> 0.3344482, 0.0000000, 0.6988120, 0.5119454... ## $ `DUPONT-AIGNAN_ins` <dbl> 5.685619, 2.870813, 4.029816, 3.839590, 4.... ## $ HAMON_ins <dbl> 4.8494983, 6.2200957, 4.0065222, 3.1569966... ## $ ASSELINEAU_ins <dbl> 1.0033445, 0.4784689, 0.8269276, 0.8532423... ## $ POUTOU_ins <dbl> 0.6688963, 0.9569378, 1.0598649, 0.8532423... ## $ ARTHAUD_ins <dbl> 0.6688963, 0.9569378, 0.4658747, 0.4266212... ## $ CHEMINADE_ins <dbl> 0.33444816, 0.00000000, 0.05823433, 0.0000... ## $ `LE PEN_exp` <dbl> 25.45455, 27.27273, 25.83695, 32.79743, 23... ## $ MÉLENCHON_exp <dbl> 11.91919, 18.75000, 21.88469, 13.50482, 24... ## $ MACRON_exp <dbl> 24.040404, 21.022727, 20.644761, 20.471597... ## $ FILLON_exp <dbl> 22.22222, 19.31818, 16.80099, 21.11468, 18... ## $ LASSALLE_exp <dbl> 0.4040404, 0.0000000, 0.9299442, 0.6430868... ## $ `DUPONT-AIGNAN_exp` <dbl> 6.868687, 3.409091, 5.362678, 4.823151, 5.... ## $ HAMON_exp <dbl> 5.8585859, 7.3863636, 5.3316801, 3.9657020... ## $ ASSELINEAU_exp <dbl> 1.2121212, 0.5681818, 1.1004340, 1.0718114... ## $ POUTOU_exp <dbl> 0.8080808, 1.1363636, 1.4104154, 1.0718114... ## $ ARTHAUD_exp <dbl> 0.8080808, 1.1363636, 0.6199628, 0.5359057... ## $ CHEMINADE_exp <dbl> 0.40404040, 0.00000000, 0.07749535, 0.0000... ## $ region <chr> "Province", "Province", "Province", "Provi... ``` --- ## Fusionner des jeux de données - primary keys et foreign keys - `left_join` - `right_join` - `full_join` - `inner_join` - `semi_join` - `anti_join` --- ## Left join  --- ## Left join  --- ## Inner join  --- ## Outer join .reduite[.center[]] --- ## Semi join  --- ## Anti join  --- ## Exemple (source : https://www.insee.fr/fr/information/2114596) ```r library(readxl) ZE2010 <- read_xls("./data/ZE2010 au 01-01-2017.xls", sheet = "Composition_communale", skip = 5) elections <- elections %>% left_join(ZE2010, by = c("CodeInsee" = "CODGEO")) %>% glimpse() ``` ``` ## Observations: 35,496 ## Variables: 56 ## $ CodeInsee <chr> "01001", "01002", "01004", "01005", "01006... ## $ CodeDepartement <chr> "01", "01", "01", "01", "01", "01", "01", ... ## $ Département <chr> "Ain", "Ain", "Ain", "Ain", "Ain", "Ain", ... ## $ Commune <chr> "L'Abergement-Clémenciat", "L'Abergement-d... ## $ Inscrits <int> 598, 209, 8586, 1172, 99, 1880, 581, 254, ... ## $ Abstentions <int> 92, 25, 1962, 215, 20, 268, 91, 41, 136, 4... ## $ Abstentions_ins <dbl> 15.38462, 11.96172, 22.85115, 18.34471, 20... ## $ Votants <int> 506, 184, 6624, 957, 79, 1612, 490, 213, 6... ## $ Votants_ins <dbl> 84.61538, 88.03828, 77.14885, 81.65529, 79... ## $ Blancs <int> 2, 6, 114, 21, 2, 53, 12, 1, 2, 6, 0, 2, 3... ## $ Blancs_ins <dbl> 0.3344482, 2.8708134, 1.3277428, 1.7918089... ## $ Blancs_vot <dbl> 0.3952569, 3.2608696, 1.7210145, 2.1943574... ## $ Nuls <int> 9, 2, 58, 3, 0, 11, 5, 3, 11, 2, 7, 0, 12,... ## $ Nuls_ins <dbl> 1.5050167, 0.9569378, 0.6755183, 0.2559727... ## $ Nuls_vot <dbl> 1.7786561, 1.0869565, 0.8756039, 0.3134796... ## $ Exprimés <int> 495, 176, 6452, 933, 77, 1548, 473, 209, 5... ## $ Exprimés_ins <dbl> 82.77592, 84.21053, 75.14559, 79.60751, 77... ## $ Exprimés_vot <dbl> 97.82609, 95.65217, 97.40338, 97.49216, 97... ## $ `LE PEN` <int> 126, 48, 1667, 306, 18, 458, 135, 40, 207,... ## $ MÉLENCHON <int> 59, 33, 1412, 126, 19, 296, 89, 39, 103, 3... ## $ MACRON <int> 119, 37, 1332, 191, 15, 348, 95, 55, 110, ... ## $ FILLON <int> 110, 34, 1084, 197, 14, 233, 84, 44, 83, 4... ## $ LASSALLE <int> 2, 0, 60, 6, 1, 13, 3, 8, 14, 4, 2, 0, 21,... ## $ `DUPONT-AIGNAN` <int> 34, 6, 346, 45, 4, 80, 28, 6, 33, 9, 10, 3... ## $ HAMON <int> 29, 13, 344, 37, 3, 82, 23, 8, 20, 13, 10,... ## $ ASSELINEAU <int> 6, 1, 71, 10, 0, 11, 2, 6, 10, 1, 0, 2, 23... ## $ POUTOU <int> 4, 2, 91, 10, 2, 17, 8, 3, 5, 4, 2, 2, 15,... ## $ ARTHAUD <int> 4, 2, 40, 5, 1, 9, 3, 0, 3, 4, 2, 2, 9, 3,... ## $ CHEMINADE <int> 2, 0, 5, 0, 0, 1, 3, 0, 1, 0, 1, 0, 2, 2, ... ## $ `LE PEN_ins` <dbl> 21.07023, 22.96651, 19.41533, 26.10922, 18... ## $ MÉLENCHON_ins <dbl> 9.866221, 15.789474, 16.445376, 10.750853,... ## $ MACRON_ins <dbl> 19.899666, 17.703349, 15.513627, 16.296928... ## $ FILLON_ins <dbl> 18.394649, 16.267943, 12.625204, 16.808874... ## $ LASSALLE_ins <dbl> 0.3344482, 0.0000000, 0.6988120, 0.5119454... ## $ `DUPONT-AIGNAN_ins` <dbl> 5.685619, 2.870813, 4.029816, 3.839590, 4.... ## $ HAMON_ins <dbl> 4.8494983, 6.2200957, 4.0065222, 3.1569966... ## $ ASSELINEAU_ins <dbl> 1.0033445, 0.4784689, 0.8269276, 0.8532423... ## $ POUTOU_ins <dbl> 0.6688963, 0.9569378, 1.0598649, 0.8532423... ## $ ARTHAUD_ins <dbl> 0.6688963, 0.9569378, 0.4658747, 0.4266212... ## $ CHEMINADE_ins <dbl> 0.33444816, 0.00000000, 0.05823433, 0.0000... ## $ `LE PEN_exp` <dbl> 25.45455, 27.27273, 25.83695, 32.79743, 23... ## $ MÉLENCHON_exp <dbl> 11.91919, 18.75000, 21.88469, 13.50482, 24... ## $ MACRON_exp <dbl> 24.040404, 21.022727, 20.644761, 20.471597... ## $ FILLON_exp <dbl> 22.22222, 19.31818, 16.80099, 21.11468, 18... ## $ LASSALLE_exp <dbl> 0.4040404, 0.0000000, 0.9299442, 0.6430868... ## $ `DUPONT-AIGNAN_exp` <dbl> 6.868687, 3.409091, 5.362678, 4.823151, 5.... ## $ HAMON_exp <dbl> 5.8585859, 7.3863636, 5.3316801, 3.9657020... ## $ ASSELINEAU_exp <dbl> 1.2121212, 0.5681818, 1.1004340, 1.0718114... ## $ POUTOU_exp <dbl> 0.8080808, 1.1363636, 1.4104154, 1.0718114... ## $ ARTHAUD_exp <dbl> 0.8080808, 1.1363636, 0.6199628, 0.5359057... ## $ CHEMINADE_exp <dbl> 0.40404040, 0.00000000, 0.07749535, 0.0000... ## $ LIBGEO <chr> "L'Abergement-Clémenciat", "L'Abergement-d... ## $ ZE2010 <chr> "8213", "8201", "8201", "8213", "8216", "8... ## $ LIBZE2010 <chr> "Villefranche-sur-Saône", "Ambérieu-en-Bug... ## $ DEP <chr> "01", "01", "01", "01", "01", "01", "01", ... ## $ REG <chr> "84", "84", "84", "84", "84", "84", "84", ... ``` --- ## Exemple ```r elections %>% group_by(ZE2010) %>% summarise_at(vars(Inscrits, Abstentions, Votants, Blancs, Nuls, Exprimés, `LE PEN`:CHEMINADE), funs(sum(.))) ``` ``` ## # A tibble: 305 x 18 ## ZE2010 Inscrits Abstentions Votants Blancs Nuls Exprimés `LE PEN` ## <chr> <int> <int> <int> <int> <int> <int> <int> ## 1 0050 121799 21231 100568 2051 918 97599 18901 ## 2 0051 86349 15302 71047 1314 438 69295 15926 ## 3 0052 57124 12084 45040 786 436 43818 11943 ## 4 0053 104365 20689 83676 1719 690 81267 18395 ## 5 0054 35635 6336 29299 506 186 28607 7590 ## 6 0055 76458 14717 61741 1313 550 59878 19641 ## 7 0056 1000098 238264 761834 13718 5552 742564 155891 ## 8 0057 146393 26366 120027 2584 1442 116001 20371 ## 9 0059 367063 72659 294404 4947 1857 287600 87968 ## 10 0060 434913 93470 341443 6785 2343 332315 80238 ## # ... with 295 more rows, and 10 more variables: MÉLENCHON <int>, ## # MACRON <int>, FILLON <int>, LASSALLE <int>, `DUPONT-AIGNAN` <int>, ## # HAMON <int>, ASSELINEAU <int>, POUTOU <int>, ARTHAUD <int>, ## # CHEMINADE <int> ``` --- ## Exemple ```r elections %>% group_by(ZE2010) %>% summarise_at(vars(Inscrits, Abstentions, Votants, Blancs, Nuls, Exprimés, `LE PEN`:CHEMINADE), funs(sum(.))) %>% mutate_at(vars(`LE PEN`:CHEMINADE), funs(. / Inscrits * 100)) ``` ``` ## # A tibble: 305 x 18 ## ZE2010 Inscrits Abstentions Votants Blancs Nuls Exprimés `LE PEN` ## <chr> <int> <int> <int> <int> <int> <int> <dbl> ## 1 0050 121799 21231 100568 2051 918 97599 15.51819 ## 2 0051 86349 15302 71047 1314 438 69295 18.44376 ## 3 0052 57124 12084 45040 786 436 43818 20.90715 ## 4 0053 104365 20689 83676 1719 690 81267 17.62564 ## 5 0054 35635 6336 29299 506 186 28607 21.29928 ## 6 0055 76458 14717 61741 1313 550 59878 25.68861 ## 7 0056 1000098 238264 761834 13718 5552 742564 15.58757 ## 8 0057 146393 26366 120027 2584 1442 116001 13.91528 ## 9 0059 367063 72659 294404 4947 1857 287600 23.96537 ## 10 0060 434913 93470 341443 6785 2343 332315 18.44921 ## # ... with 295 more rows, and 10 more variables: MÉLENCHON <dbl>, ## # MACRON <dbl>, FILLON <dbl>, LASSALLE <dbl>, `DUPONT-AIGNAN` <dbl>, ## # HAMON <dbl>, ASSELINEAU <dbl>, POUTOU <dbl>, ARTHAUD <dbl>, ## # CHEMINADE <dbl> ``` --- ## Exemple ```r library(sf) communesTM <- st_read("./data/communesTM.geojson") # https://data.toulouse-metropole.fr/explore/dataset/communes/ ``` ``` ## Reading layer `OGRGeoJSON' from data source `/media/Data/Dropbox/datactivi.st/AU Toulouse/Formation AUTA/data/communesTM.geojson' using driver `GeoJSON' ## Simple feature collection with 37 features and 6 fields ## geometry type: POLYGON ## dimension: XY ## bbox: xmin: 1.20408 ymin: 43.51625 xmax: 1.631831 ymax: 43.76703 ## epsg (SRID): 4326 ## proj4string: +proj=longlat +datum=WGS84 +no_defs ``` ```r elections %>% right_join(communesTM, by = c("CodeInsee" = "code_insee")) ``` ``` ## Warning: Column `CodeInsee`/`code_insee` joining character vector and ## factor, coercing into character vector ``` ``` ## # A tibble: 37 x 62 ## CodeInsee CodeDepartement Département Commune ## <chr> <chr> <chr> <chr> ## 1 31355 31 Haute-Garonne Mons ## 2 31003 31 Haute-Garonne Aigrefeuille ## 3 31032 31 Haute-Garonne Aussonne ## 4 31445 31 Haute-Garonne Quint-Fonsegrives ## 5 31467 31 Haute-Garonne Saint-Alban ## 6 31022 31 Haute-Garonne Aucamville ## 7 31150 31 Haute-Garonne Cornebarrieu ## 8 31506 31 Haute-Garonne Saint-Orens-de-Gameville ## 9 31163 31 Haute-Garonne Drémil-Lafage ## 10 31184 31 Haute-Garonne Flourens ## # ... with 27 more rows, and 58 more variables: Inscrits <int>, ## # Abstentions <int>, Abstentions_ins <dbl>, Votants <int>, ## # Votants_ins <dbl>, Blancs <int>, Blancs_ins <dbl>, Blancs_vot <dbl>, ## # Nuls <int>, Nuls_ins <dbl>, Nuls_vot <dbl>, Exprimés <int>, ## # Exprimés_ins <dbl>, Exprimés_vot <dbl>, `LE PEN` <int>, ## # MÉLENCHON <int>, MACRON <int>, FILLON <int>, LASSALLE <int>, ## # `DUPONT-AIGNAN` <int>, HAMON <int>, ASSELINEAU <int>, POUTOU <int>, ## # ARTHAUD <int>, CHEMINADE <int>, `LE PEN_ins` <dbl>, ## # MÉLENCHON_ins <dbl>, MACRON_ins <dbl>, FILLON_ins <dbl>, ## # LASSALLE_ins <dbl>, `DUPONT-AIGNAN_ins` <dbl>, HAMON_ins <dbl>, ## # ASSELINEAU_ins <dbl>, POUTOU_ins <dbl>, ARTHAUD_ins <dbl>, ## # CHEMINADE_ins <dbl>, `LE PEN_exp` <dbl>, MÉLENCHON_exp <dbl>, ## # MACRON_exp <dbl>, FILLON_exp <dbl>, LASSALLE_exp <dbl>, ## # `DUPONT-AIGNAN_exp` <dbl>, HAMON_exp <dbl>, ASSELINEAU_exp <dbl>, ## # POUTOU_exp <dbl>, ARTHAUD_exp <dbl>, CHEMINADE_exp <dbl>, ## # LIBGEO <chr>, ZE2010 <chr>, LIBZE2010 <chr>, DEP <chr>, REG <chr>, ## # cugt <fctr>, libcom <fctr>, libelle <fctr>, code_fantoir <fctr>, ## # geo_point_2d <list>, geometry <simple_feature> ``` --- ## À ne pas confondre : binding Ici il s'agit de juxtaposer des jeux de données - `bind_rows` - `bind_cols` --- ## Tips & tricks dplyr ```r ZE2010 %>% group_by(LIBZE2010) %>% summarise(n = n()) %>% arrange(desc(n)) ``` ``` ## # A tibble: 321 x 2 ## LIBZE2010 n ## <chr> <int> ## 1 Toulouse 716 ## 2 Amiens 478 ## 3 Rouen 473 ## 4 Tarbes - Lourdes 451 ## 5 Troyes 449 ## 6 Dijon 447 ## 7 Besançon 420 ## 8 Bordeaux 408 ## 9 Nancy 395 ## 10 Roissy - Sud Picardie 393 ## # ... with 311 more rows ``` --- ## Tips & tricks dplyr ```r ZE2010 %>% count(LIBZE2010, sort = TRUE) ``` ``` ## # A tibble: 321 x 2 ## LIBZE2010 n ## <chr> <int> ## 1 Toulouse 716 ## 2 Amiens 478 ## 3 Rouen 473 ## 4 Tarbes - Lourdes 451 ## 5 Troyes 449 ## 6 Dijon 447 ## 7 Besançon 420 ## 8 Bordeaux 408 ## 9 Nancy 395 ## 10 Roissy - Sud Picardie 393 ## # ... with 311 more rows ``` --- ## Tips & tricks dplyr Numéroter les communes par ordre décroissant de vote Le Pen dans le département ```r elections %>% group_by(CodeDepartement) %>% arrange(desc(`LE PEN_exp`)) %>% mutate(numero = 1:n()) %>% ungroup %>% arrange(desc(`LE PEN_exp`)) %>% select(CodeInsee, Commune, Département, numero, `LE PEN_exp`) ``` ``` ## # A tibble: 35,496 x 5 ## CodeInsee Commune Département numero `LE PEN_exp` ## <chr> <chr> <chr> <int> <dbl> ## 1 52066 Brachay Haute-Marne 1 83.72093 ## 2 ZP051 Tatakoto Polynésie française 1 74.78261 ## 3 10044 Bétignicourt Aube 1 74.07407 ## 4 02043 Bagneux Aisne 1 72.22222 ## 5 ZP041 Rapa Polynésie française 2 70.29703 ## 6 52201 Flammerécourt Haute-Marne 2 69.04762 ## 7 88298 Ménarmont Vosges 1 66.66667 ## 8 ZP030 Napuka Polynésie française 3 66.66667 ## 9 08184 Fromy Ardennes 1 66.07143 ## 10 25552 Sourans Doubs 1 65.59140 ## # ... with 35,486 more rows ``` --- class: center, middle, inverse ## Les tidydata géographiques: sf --- ## Simple features - une architecture commune pour les *simple features geometries* - un standard formel : OGC 06-103r4, ISO 19125 - le standard des outils libres de SIG - un ensemble d'encodages : + WKB + WKT --- ## Simple features [](http://www.opengeospatial.org/standards/sfa) --- ## Simple features Représenter des éléments géographiques en plein texte (WKT) : ``` POINT(0 0) LINESTRING(0 0,1 1,1 2) POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1)) MULTIPOINT((0 0),(1 2)) MULTILINESTRING((0 0,1 1,1 2),(2 3,3 2,5 4)) MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0),(1 1,2 1,2 2,1 2,1 1)), ((-1 -1,-1 -2,-2 -2,-2 -1,-1 -1))) GEOMETRYCOLLECTION(POINT(2 3),LINESTRING(2 3,3 4)) ``` Peut exister en 2, 3, 4 dimensions. --- ## Simple features [](http://pebesma.staff.ifgi.de/pebesma_sfr.pdf) --- ## Simple features - un dataframe - une ligne par feature ("liste-colonne") - géométries et attributs ont le même statut - très similaire à la manière dont PostGIS fonctionne ```r dbGetQuery(connection, "SELECT id, ST_AsText(geom) AS geometry from nodes LIMIT 10") ``` ``` ## id geometry ## 1 625219 POINT(1.4710213 43.5495882) ## 2 625226 POINT(1.4781246 43.5523568) ## 3 625235 POINT(1.471321 43.5542919) ## 4 625236 POINT(1.4722469 43.5554962) ## 5 625239 POINT(1.4700917 43.5545298) ## 6 625240 POINT(1.471471 43.5544525) ## 7 625241 POINT(1.4709202 43.5550524) ## 8 625242 POINT(1.4719338 43.5550721) ## 9 625255 POINT(1.4686231 43.5551804) ## 10 625262 POINT(1.4729169 43.5570509) ``` --- ## Importer des données spatiales [Source](https://data.toulouse-metropole.fr/explore/dataset/quartiers-de-democratie-locale0/export/?location=12,43.60074,1.43283&basemap=jawg.streets) ```r library(sf) quartiers <- st_read("./data/quartiers-de-democratie-locale0.shp") ``` ``` ## Reading layer `quartiers-de-democratie-locale0' from data source `/media/Data/Dropbox/datactivi.st/AU Toulouse/Formation AUTA/data/quartiers-de-democratie-locale0.shp' using driver `ESRI Shapefile' ## Simple feature collection with 20 features and 5 fields ## geometry type: POLYGON ## dimension: XY ## bbox: xmin: 1.350331 ymin: 43.5327 xmax: 1.515336 ymax: 43.6687 ## epsg (SRID): 4326 ## proj4string: +proj=longlat +datum=WGS84 +no_defs ``` --- ## Importer des données spatiales ```r glimpse(quartiers) ``` ``` ## Observations: 20 ## Variables: 6 ## $ quartier <fctr> 3.1, 3.3, 5.2, 5.3, 6.4, 4.2, 1.1, 2.3, 3.2, 6.3,... ## $ nom_quartie <fctr> Minimes / Barrière de Paris / Ponts-Jumeaux, Troi... ## $ maire_de_qu <fctr> Maxime Boyer, Françoise Roncato, Florie Lacroix, ... ## $ secteur <dbl> 3, 3, 5, 5, 6, 4, 1, 2, 3, 6, 1, 2, 6, 6, 2, 2, 5,... ## $ nom_secteur <fctr> Toulouse Nord, Toulouse Nord, Toulouse Sud Est, T... ## $ geometry <simple_feature> POLYGON ((1.42381141853539 ..., POLYGON... ``` --- ## Importer des données spatiales ```r library(mapview) mapview(quartiers) ```
--- ## Importer des données spatiales ```r quartiers2 <- st_read("./data/quartiers-de-democratie-locale0.geojson") ``` ``` ## Reading layer `OGRGeoJSON' from data source `/media/Data/Dropbox/datactivi.st/AU Toulouse/Formation AUTA/data/quartiers-de-democratie-locale0.geojson' using driver `GeoJSON' ## Simple feature collection with 20 features and 6 fields ## geometry type: POLYGON ## dimension: XY ## bbox: xmin: 1.350331 ymin: 43.5327 xmax: 1.515336 ymax: 43.6687 ## epsg (SRID): 4326 ## proj4string: +proj=longlat +datum=WGS84 +no_defs ``` --- ## Importer des données spatiales ```r glimpse(quartiers2) ``` ``` ## Observations: 20 ## Variables: 7 ## $ quartier <fctr> 3.1, 3.3, 5.2, 5.3, 6.4, 4.2, 1.1, 2.3, 3.2... ## $ secteur <int> 3, 3, 5, 5, 6, 4, 1, 2, 3, 6, 1, 2, 6, 6, 2,... ## $ maire_de_quartier <fctr> Maxime Boyer, Françoise Roncato, Florie Lac... ## $ nom_quartier <fctr> Minimes / Barrière de Paris / Ponts-Jumeaux... ## $ nom_secteur <fctr> Toulouse Nord, Toulouse Nord, Toulouse Sud ... ## $ geo_point_2d <list> [<43.626866, 1.430922>, <43.640691, 1.45725... ## $ geometry <simple_feature> POLYGON ((1.42381141853539 ..., P... ``` --- ## Importer des données spatiales ```r library(mapview) mapview(quartiers2) ```
--- ## Importer des données spatiales ```r ways <- st_read_db(conn = connection, table = "ways", EWKB = TRUE) glimpse(ways) ``` ``` ## Observations: 321,138 ## Variables: 8 ## $ id <dbl> 1863458, 2304962, 2304963, 2305016, 2305119, 2305... ## $ version <int> 9, 18, 9, 19, 23, 12, 16, 21, 26, 17, 4, 26, 22, ... ## $ user_id <int> 922338, 5744795, 94997, 5744795, 5733375, 5733375... ## $ tstamp <dttm> 2017-08-22 13:09:10, 2017-05-08 19:47:35, 2012-1... ## $ changeset_id <dbl> 51336738, 48508488, 13351965, 48508488, 48144530,... ## $ tags <chr> "\"name\"=>\"Rue Julia\", \"oneway\"=>\"no\", \"h... ## $ nodes <chr> "{8010736,4840560425,8010738,4840560424,484056042... ## $ linestring <simple_feature> LINESTRING (1.4844746 43.59..., LINEST... ``` --- ## Importer des données spatiales ```r ways %>% filter(stringr::str_detect(tags, "pedestrian")) %>% mapview() ```
--- ## Importer des données spatiales ```r library(leaflet) leaflet() %>% addTiles() %>% setView(-93.65, 42.0285, zoom = 4) %>% addWMSTiles( "http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi", layers = "nexrad-n0r-900913", options = WMSTileOptions(format = "image/png", transparent = TRUE), attribution = "Weather data © 2012 IEM Nexrad" ) ```
--- class: center, middle, inverse ## Analyse uni- et bi-variées --- ## Analyses univariées Plusieurs approches possibles. Quels sont vos besoins ? Tidyverse => ```r df %>% group_by(mes_groupes) %>% summarise(mean = mean(ma_variable), median = median(ma_variable)) df %>% group_by(mes_groupes) %>% summarise_at(vars(varA, varB, varC), funs(mean = mean(.), median = median(.), max = max(.), min = min(.)), sd = sd(.)) ``` --- ## Analyses bivariées (correlations) ```r library(corrr) pres2017T1_communes %>% select(contains("_ins")) %>% correlate ``` ``` ## # A tibble: 16 x 17 ## rowname Abstentions_ins Votants_ins Blancs_ins Nuls_ins ## <chr> <dbl> <dbl> <dbl> <dbl> ## 1 Abstentions_ins NA -1.00000000 -0.059804330 0.020592416 ## 2 Votants_ins -1.00000000 NA 0.059804330 -0.020592416 ## 3 Blancs_ins -0.05980433 0.05980433 NA -0.092379854 ## 4 Nuls_ins 0.02059242 -0.02059242 -0.092379854 NA ## 5 Exprimés_ins -0.97615193 0.97615193 -0.111598086 -0.138615827 ## 6 LE PEN_ins -0.16415127 0.16415127 -0.025287327 -0.045097069 ## 7 MÉLENCHON_ins -0.14147164 0.14147164 -0.005254065 -0.004763823 ## 8 MACRON_ins -0.29423578 0.29423578 -0.026513489 -0.030484641 ## 9 FILLON_ins -0.24315424 0.24315424 -0.069984245 -0.063847412 ## 10 LASSALLE_ins -0.01433997 0.01433997 0.006242679 0.035552260 ## 11 DUPONT-AIGNAN_ins -0.24141426 0.24141426 0.026807254 -0.025359341 ## 12 HAMON_ins -0.11277243 0.11277243 -0.000472832 0.009515770 ## 13 ASSELINEAU_ins -0.02968179 0.02968179 -0.005877817 -0.008148521 ## 14 POUTOU_ins -0.03355283 0.03355283 0.035173397 0.025512401 ## 15 ARTHAUD_ins -0.02709057 0.02709057 0.032341708 0.030567649 ## 16 CHEMINADE_ins -0.03116503 0.03116503 0.002807641 0.010563846 ## # ... with 12 more variables: Exprimés_ins <dbl>, `LE PEN_ins` <dbl>, ## # MÉLENCHON_ins <dbl>, MACRON_ins <dbl>, FILLON_ins <dbl>, ## # LASSALLE_ins <dbl>, `DUPONT-AIGNAN_ins` <dbl>, HAMON_ins <dbl>, ## # ASSELINEAU_ins <dbl>, POUTOU_ins <dbl>, ARTHAUD_ins <dbl>, ## # CHEMINADE_ins <dbl> ``` --- ## Analyses bivariées (correlations) ```r pres2017T1_communes %>% select(contains("_ins")) %>% correlate %>% focus(FILLON_ins, `LE PEN_ins`, MACRON_ins, MÉLENCHON_ins, mirror = TRUE) %>% rearrange(method = "HC", absolute = FALSE) %>% # trier par correlation shave() %>% fashion() ``` ``` ## rowname FILLON_ins MACRON_ins LE.PEN_ins MÉLENCHON_ins ## 1 LE PEN_ins -.13 ## 2 MACRON_ins -.08 ## 3 MÉLENCHON_ins -.48 .11 -.34 ## 4 FILLON_ins -.08 -.13 -.48 ``` --- ## Analyses bivariées (corrélations) ```r pres2017T1_communes %>% select(contains("_ins")) %>% correlate %>% rearrange(method = "HC", absolute = FALSE) %>% # trier par correlation shave() %>% rplot() ``` <!-- --> --- ## Analyse multivariée (AGD) Le package à utiliser : [`FactoMineR`](http://factominer.free.fr/) - français, assez bien documenté ```r library(FactoMineR) acp <- pres2017T1_communes %>% select(contains("_ins"), "Département") %>% PCA(quali.sup = 17, graph = FALSE) acp ``` ``` ## **Results for the Principal Component Analysis (PCA)** ## The analysis was performed on 35496 individuals, described by 17 variables ## *The results are available in the following objects: ## ## name ## 1 "$eig" ## 2 "$var" ## 3 "$var$coord" ## 4 "$var$cor" ## 5 "$var$cos2" ## 6 "$var$contrib" ## 7 "$ind" ## 8 "$ind$coord" ## 9 "$ind$cos2" ## 10 "$ind$contrib" ## 11 "$quali.sup" ## 12 "$quali.sup$coord" ## 13 "$quali.sup$v.test" ## 14 "$call" ## 15 "$call$centre" ## 16 "$call$ecart.type" ## 17 "$call$row.w" ## 18 "$call$col.w" ## description ## 1 "eigenvalues" ## 2 "results for the variables" ## 3 "coord. for the variables" ## 4 "correlations variables - dimensions" ## 5 "cos2 for the variables" ## 6 "contributions of the variables" ## 7 "results for the individuals" ## 8 "coord. for the individuals" ## 9 "cos2 for the individuals" ## 10 "contributions of the individuals" ## 11 "results for the supplementary categorical variables" ## 12 "coord. for the supplementary categories" ## 13 "v-test of the supplementary categories" ## 14 "summary statistics" ## 15 "mean of the variables" ## 16 "standard error of the variables" ## 17 "weights for the individuals" ## 18 "weights for the variables" ``` --- ## Analyse multivariée (AGD) ```r library(explor) explor(acp) ``` --- class: inverse, center, middle ## Evaluation Merci de remplir l'évaluation : https://frama.link/auat_eval_2 --- class: center, middle, title background-image: url(./img/FraMauroDetailedMap.jpg) background-size: cover background-position: 50% 50% # Réaliser des cartes statistiques ## R : le couteau suisse des données </BR> </BR> </BR> ### Joël Gombin, avec Endi Pons <img src="./img/Logo_DATACTIVIST_TW.png" height="100px" /> .right[.footnote[<a href='https://commons.wikimedia.org/wiki/File:FraMauroDetailedMap.jpg'>source</a>]] --- ## Objectifs (jour 3) - Solidifier les acquis des deux jours précédents - Panorama de la cartographie et du SIG dans R - Utiliser les packages tmap et cartography pour réaliser des cartes statistiques « print » - Utiliser les packages mapview et leaflet pour réaliser des cartes statistiques « web » - Automatiser un workflow cartographique --- ## Exercices Un moment pour mettre en pratique et tester ce qui a été appris avant-hier et hier (tidyverse, AGD...) --- ## Panorama de la cartographie et du SIG dans R - un workflow intégré - un workflow reproductible - une convergence des paradigmes de carto "statique" (print) et "dynamique" (web) - l'intégration dans des apps : http://shiny.rstudio.com/gallery/superzip-example.html, https://gallery.shinyapps.io/shiny-salesman/ --- ## Panorama de la cartographie et du SIG dans R - des capacités de base grâce à `sf::plot` (mais limitées) - des capacités SIG grâce à `sf` via GEOS ([fonctions `st_*`](https://r-spatial.github.io/sf/articles/sf3.html#geometrical-operations) similaires à PostGIS) - des packages de cartographie de haut niveau : `cartography` et `tmap` - mais aussi `ggplot2` ([version de développement](http://ggplot2.tidyverse.org/news/index.html#ggplot2-2-2-1-9000)) - des packages de cartographie interactive/web : `leaflet`, `mapview` and friends ([`mapedit`](https://github.com/r-spatial/mapedit)...) --- class: inverse, center, middle # Notions de cartographie --- ## Qu'est-ce qu'une carte ? "Une carte est une représentation géométrique plane simplifiée et conventionnelle de tout ou partie de la surface terrestre, et cela dans un rapport de similitude convenable qu'on appelle échelle." (F. Joly, 1976) Référence : [Béguin et Pumain, 2014 (3e éd.)](http://www.persee.fr/web/revues/home/prescript/article/espos_0755-7809_1998_num_16_1_1827_t1_0119_0000_2) --- ## La notion de projection La projection est l'outil mathématique qui permet de passer du géoïde représentant la Terre à une représentation plane. Projections conformes (Mercator, Lambert) ou équivalentes (Eckert IV, Gall). Il y a toujours une déformation ! Les coordonnées géographiques sont exprimées en longitude et latitude. Les unités peuvent être des degrés ou des grades. La projection transforme les coordonnées géographiques en coordonnées x/y. --- ## La notion de projection Exemple de coordonnées géographiques :  --- ## La notion de projection Un truc cool pour jouer avec les différentes projections : http://bl.ocks.org/mbostock/raw/3711652/ --- ## La notion de projection _The West Wing_, la série qui arrive à faire un sketch drôle sur les projections géographiques : <iframe width="560" height="315" src="https://www.youtube.com/embed/vVX-PrBRtTY" frameborder="0" allowfullscreen></iframe> --- ## L'échelle L'échelle d'une carte représente le rapport d'une distance mesurée sur la carte à sa valeur réelle sur le terrain. Échelle | 1 cm représente ---------------|---------------- 1/10000 |100 m 1/25000 |250m 1/50000 |500m 1/100000 |1km 1/1000000 |10km --- ## L'échelle Attention : "petite échelle" = grande superficie représentée "grande échelle" = petite superficie représentée L'échelle est déformée à distance du centre de projection (équateur pour Mercator) Échelle numérique et échelle graphique --- class: center, middle  --- ## La généralisation "L'opération qui par sélection, schématisation et harmonisation reconstitue sur une carte la réalité de la surface représentée dans ses traits essentiels en fonction du but de la carte, de son thème, de son échelle et des particularités de la région cartographiée." --- ## La sélection Quelles couches d'information représenter ? Ni trop (surcharge d'information, à la Google Maps) ni trop peu (rendre la carte intelligible au lecteur). Le [style "toner"](http://maps.stamen.com/toner/#12/37.7706/-122.3782) peut être utile pour trouver cet équilibre, en cartographie thématique : --- class: center, middle  --- ## La schématisation Opération de simplification, qui peut être structurale (tracés) ou conceptuelle (schéma). Attention : on peut simplifier à partir de données détaillées, mais on ne peut pas faire l'inverse ! Donc toujours veiller à conserver les données dans leur forme la plus détaillée. --- ## Le fond de carte Le fond de carte est constitué des éléments repris d'une carte topographique (par exemple de l'IGN) et utilisés pour une carte thématique. "Carte reproduite totalement ou partiellement, en une ou plusieurs couleurs souvent atténuées, servant de repère pour le report en surcharge de phénomènes localisables déterminés" (CFC). Peut concerner les découpages administratifs, le réseau routier, hydrographique, les courbes de niveau, etc. --- ## Les sources de fonds de carte Traditionnellement, en France : l'IGN. De plus en plus : Google Maps, Open Street Map, Stamen... --- class: center, middle http://maps.stamen.com/toner/#12/48.8974/2.2017 http://maps.stamen.com/watercolor/#12/48.8974/2.2017 --- ## Vecteur ou raster Comment stocker et représenter l'information géographique ? - "Mode raster" : il s'agit d'une image, découpée en pixels. Des valeurs sont attribuées aux pixels. Ex : photo satellite. - "Mode vecteur" : on utilise des objets géométriques (lignes, points, polygones...) auxquels sont associés des attributs. Ex : carte d'un réseau de transports. --- class: center, middle <iframe width="800" height="600" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="https://www.openstreetmap.org/export/embed.html?bbox=2.3314136266708374%2C48.866987337550164%2C2.33908474445343%2C48.87019135286425&layer=transportmap" style="border: 1px solid black"></iframe> --- class: center, middle [FrancePixels](http://www.comeetie.fr/galerie/francepixels/) --- ## Cartes choroplèthes Une carte choroplèthe est une carte thématique où les régions sont colorées ou remplies d'un motif qui montre une mesure statistique, tels la densité de population ou le revenu par habitant. Ce type de carte facilite la comparaison d'une mesure statistique d'une région à l'autre ou montre la variabilité de celle-ci pour une région donnée. --- ## Cartes en anamorphose ou cartogramme "La cartographie en anamorphose a pour but d'adapter la forme de la carte non pas à la réalité physique, mais plutôt à la réalité perçue." [(Langlois et Denain, 1996)](http://cybergeo.revues.org/129) On déforme le fond de carte en fonction d'une variable quantitative (voire arbitrairement). --- class: center, middle [](http://www.slate.fr/france/87669/cartes-europeennes-2014) --- ## Le langage cartographique [Bertin, 1965](http://classiques.uqac.ca/collection_methodologie/bertin_jacques/representations_visuelles_info/representations_visuelles_info_texte.html) : travail sur la sémiologie graphique. La carte, comme le graphique, permet de percevoir *en même temps* trois informations (X,Y,Z). Mais pour que cette communication soit efficace, il faut respecter un langage précis et ses règles. Assez comparable à la grammaire des graphiques. --- ## Les composantes du langage cartographique - les signes graphiques élémentaires : point, trait, tâche (aplat). - le figuré cartographique : combinaison de signes graphiques élémentaires. - l'implantation graphique : manière d'appliquer le figuré sur la carte (ponctuelle, linéaire ou zonale). - les variables visuelles : façon de faire varier les signes graphiques. Il y en a sept. --- ## Les variables visuelles - forme - taille - couleur - valeur - orientation - texture-structure (trame) - grain --- ## La forme - Ne transcrit qu'une information qualitative. - Veiller à ne pas utiliser trop de formes différentes, sinon cela devient illisible (< 10) - Utilisée dans les trois types d'implantation graphique. En implantation zonale => texture. --- ## La taille - longueur/hauteur/surface/volume - bonne perception visuelle par l'œil - rapport de proportionnalité entre informations quantitatives représentées et la forme - attention à respecter cette proportionnalité ! - la taille est plus facile à estimer que la surface ou le volume Un exemple d'utilisation incorrecte (non proportionnelle) de la taille : --- ## La taille  --- ## La taille - Le cartogramme (anamorphose) comme cas particulier de l'utilisation de la taille. - [Créer un fonds de carte en anamorphose](http://scapetoad.choros.ch/) - [Réaliser un cartogramme en javascript](http://prag.ma/code/d3-cartogram/) --- ## La couleur * fort pouvoir différentiel * esthétique * trois propriétés : + ton + saturation + intensité --- ## La couleur http://hslpicker.com/ --- ## La couleur - En général, on utilise un seul ton et on joue sur l'intensité. <iframe src='./img/grenobleAbstention.html' width='500px' height='500px' style="border:none;"></iframe> --- ## La couleur - Parfois, par exemple pour représenter une variation, on peut jouer sur deux échelles de tons <iframe src='./img/amiensProgFN.html' width='500px' height='500px' style="border:none;"></iframe> --- ## La couleur - Si on représente une variable qualitative, on utilise autant de tons que de catégories <iframe src='./img/comm.couleur.html' width='600px' height='450px' style="border:none;"></iframe> --- ## La couleur - Penser aux daltoniens ! - Penser au support (web, papier...) - Des palettes de couleur de référence : [colorbrewer2.org](http://colorbrewer2.org/) par exemple - Un autre outil de construction de palette de couleur : [vis4.net/labs/multihue](https://vis4.net/labs/multihue/) - C'est la variable qu'on utilise le plus en cartographie thématique. --- ## La valeur - Valeur : rapport entre quantités totales de noir et de blanc perçues dans une surface donnée (cf. aussi "gris typographique"). - Peut passer par une trame - Peut concerner une couleur (un ton) - En général, on utilise des classes (max 6/7) - Mais parfois, coloration continue --- ## La valeur Un exemple de coloration continue :  --- Des cartes _old school_ de densité, qui utilisent une trame :  --- Une autre coloration continue (pas très lisible parce qu'elle utilise trop de teintes [hues]) :  --- ## Le grain - agrandissement ou réduction d'une texture/structure - pas très utilisé, car mal perçu par l'œil humain --- ## L'orientation - Angle d'un figuré linéaire - Pour variable qualitative, moins utilisée aujourd'hui --- ## L'orientation Un exemple d'utilisation par Todd et Le Bras :  --- ## Distribution et découpage en classes des variables quantitatives - discrétisation : découper une variable continue en classes - ce découpage n'est pas neutre, et ne peut être décidé indépendamment de la distribution de la variable représentée --- ## Distribution et découpage en classes des variables quantitatives Voir [cet article](http://www.persee.fr/web/revues/home/prescript/article/espos_0755-7809_2000_num_18_1_1930) Un [moyen sympa](http://franceo3.geoclip.fr/index.php?profil=FV#z=-349737,6562730,1033057,513716;l=fr;i=euro14.pt_lfn;v=map12) de jouer avec les différentes méthodes de discrétisation. --- ## Et dans R ? - objets spatiaux : `sf`, comme vu hier - ainsi que le package `raster` pour toutes les données... raster --- ## Et dans R ? Explorer des données spatiales : `mapview` ```r library(sf) library(mapview) departements <- st_read("./data/departements/DEPARTEMENT.shp", stringsAsFactors = FALSE) mapview(departements) ``` ``` ## Reading layer `DEPARTEMENT' from data source `/media/Data/Dropbox/datactivi.st/AU Toulouse/Formation AUTA/data/departements/DEPARTEMENT.shp' using driver `ESRI Shapefile' ## Simple feature collection with 96 features and 11 fields ## geometry type: MULTIPOLYGON ## dimension: XY ## bbox: xmin: 99226 ymin: 6049647 xmax: 1242375 ymax: 7110480 ## epsg (SRID): NA ## proj4string: +proj=lcc +lat_1=44 +lat_2=49 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +units=m +no_defs ```
--- ## Et dans R ? Cartographier : `tmap` ```r communes <- read_sf("./data/communes.geojson") elections <- read_csv("./data/Presidentielle_2017_Resultats_Communes_T1_clean.csv") elections <- communes %>% left_join(elections, by = c("INSEE_COM" = "CodeInsee")) departements <- elections %>% # marche avec sf 0.5-5 et dplyr 0.7.4 group_by(NOM_DEP) %>% summarise_at(vars(contains("_ins")), funs(weighted.mean(., w = Inscrits, na.rm = TRUE))) departements <- left_join(departements, elections %>% st_set_geometry(NULL) %>% group_by(NOM_DEP) %>% summarise(Inscrits = sum(Inscrits)), by = "NOM_DEP" ) ``` --- ## Et dans R ? Cartographier : `tmap` ```r library(tmap) departements %>% tm_shape() + tm_polygons(col = "Abstentions_ins", palette = "RdBu", n = 7, style = "jenks", title = "Abstention", textNA = "valeur manquante", legend.format = list(text.separator = "à"), auto.palette.mapping = FALSE) ``` --- ## Et dans R ? Cartographier : `tmap` <!-- --> --- ## Et dans R ? Cartographier : `tmap` ```r departements %>% st_transform(crs = 2154) %>% # back to Lambert93 tm_shape() + tm_polygons(col = "Abstentions_ins", palette = "RdBu", n = 7, style = "jenks", title = "Abstention", textNA = "valeur manquante", legend.format = list(text.separator = "à"), auto.palette.mapping = FALSE) + tm_bubbles(size = "Inscrits") + tm_compass(position = c("right", "center")) + tm_scale_bar(position = c("center", "bottom")) ``` --- ## Et dans R ? Cartographier : `tmap` <!-- --> --- ## Et dans R ? Cartographier : `tmap` ```r departements %>% st_transform(crs = 2154) %>% # back to Lambert93 tm_shape() + tm_polygons(col = "Abstentions_ins", palette = "RdBu", n = 7, style = "jenks", title = "Abstention", textNA = "valeur manquante", legend.format = list(text.separator = "à"), auto.palette.mapping = FALSE) + tm_bubbles(size = "Inscrits", scale = 2) + tm_compass(position = c("right", "center")) + tm_scale_bar(position = c("center", "bottom")) + tm_style_cobalt() ``` --- ## Et dans R ? Cartographier : `tmap` <!-- --> --- ## Et dans R ? Avec `cartography`: ```r library(cartography) departements %>% choroLayer(var = "Abstentions_ins", method = "quantile", nclass = 7) ``` --- ## Et dans R ? Avec `cartography`: <!-- --> --- ## Et dans R ? ```r # ggplot2 (version de dev) library(ggplot2) departements %>% st_transform(crs = 2154) %>% ggplot() + geom_sf(aes(fill = Abstentions_ins)) + theme_bw() ``` --- ## Et dans R ? <!-- --> --- ## Et dans R ? Avec Leaflet ```r library(leaflet) departements %>% leaflet() %>% addTiles() %>% addPolygons(fillColor = ~ colorQuantile("Reds", domain = Inscrits)(Inscrits), weight = 1, color = "grey", fillOpacity = 0.8) %>% addCircles(data = departements %>% st_centroid(), radius = ~ sqrt(Inscrits)*30, weight = 10) %>% addLegend(pal = colorQuantile("Reds", domain = departements$Inscrits), values = ~Inscrits) ``` --- class: inverse, middle, center # Analyse, modélisation, machine learning --- ## Que fait-on une fois qu'on a des données ? - Exploratory Data Analysis (Tukey, 1977) : pas d'hypothèse préalable à tester, plutôt pour générer des hypothèses. Rôle de la datavisualisation - test d'hypothèse --- ## Que fait-on une fois qu'on a des données ? .reduite[.center[]] --- ## Que fait-on une fois qu'on a des données ? - Exploratory Data Analysis (Tukey, 1977) : pas d'hypothèse préalable à tester, plutôt pour générer des hypothèses. Rôle de la datavisualisation - test d'hypothèse - **modèle** --- ## Pourquoi modéliser ? .reduite[.center[]] --- ## Pourquoi modéliser ? - pour analyser et expliquer - pour prédire --- ## Modéliser pour analyser - un modèle réduit de la réalité - isoler le rôle de chaque variable - raisonner "toutes choses égales par ailleurs" (_ceteris paribus_) --- ## Modéliser pour analyser Modéliser, c’est mettre en relation une *variable expliquée* (dépendante / prédite) et une ou plusieurs *variables explicatives* (indépendantes / prédicteurs). $$ Y = f(X_1, X_2, X_3, ..., X_n) $$ L’estimation du modèle consiste à estimer la valeur des paramètres (ou coefficients). Le cas du modèle linéaire : $$ Y = α + β_1X_1 + β_2X_2 + β_3X_3 + · · · + β_nX_n + ε $$ --- ## Modéliser pour analyser Implique de faire des hypothèses sur la spécification du modèle : - variables explicatives - distribution des erreurs --- ## Les distributions - distribution théorique (ex : distribution normale) - distribution empirique http://shiny.stat.calpoly.edu/Prob_View/ --- ## All models are wrong, some are useful > Since all models are wrong the scientist cannot obtain a "correct" one by excessive elaboration. On the contrary following William of Occam he should seek an economical description of natural phenomena. [George Box](https://dx.doi.org/10.1080%2F01621459.1976.10480949) --- ## All models are wrong, some are useful .reduite[.center[]] --- ## Estimation d'un modèle Dans le cas d'un modèle linéaire => méthode des moindres carrés ordinaires (MCO/OLS) http://setosa.io/ev/ordinary-least-squares-regression/ --- ## Attention ! - Les modèles de régression linéaire supposent que les relations sont *linéaires* et *additives*. - Les *résidus* sont supposés être *normalement distribués*. - Les coefficients ne sont *pas standardisés* (on ne peut pas les comparer entre eux). - Les coefficients s’interprètent *relativement à l’unité de la variable dépendante*. --- ## Attention ! - Les coefficients estiment l’effet d’une variable indépendante sur la variable dépendante *toutes choses égales par ailleurs*, c’est-à-dire en neutralisant l’effet des autres variables. - La qualité globale du modèle peut être quantifié au travers du `\(R^2\)`, qui représente la part de variance (de la variable dépendante) expliquée. - Pour les variables indépendantes catégoriques, on estime un coefficient par modalité, à l’exception de la première (baseline). --- ## Modèles statistiques Compromis entre intelligibilité et fidélité aux données --- ## Underfitting et overfitting .reduite[.center[]] --- ## Underfitting et overfitting - différencier données d'apprentissage et données de test - n'utiliser les données de confirmation (test) qu'une fois --- ## Extrapolation [.reduite[.center[]]](http://r4ds.had.co.nz/model-basics.html) --- ## Et le machine learning alors ? - Fondamentalement, modélisation et machine learning ne sont pas différents, du point de vue d'un statisticien : modéliser un `\(Y\)` en fonction d'un vecteur de `\(X_i\)` - une des différences principales toutefois : veut-on prévoir ou comprendre/analyser ? - et donc : peut-on, veut-on interpréter les coefficients ? - en pratique : machine learning porte généralement sur des données plus complexes que la modélisation traditionnelle - souvent beaucoup de valeurs manquantes --- ## Et le machine learning alors ? .reduite[.center[]] --- ## Concepts de machine learning - Apprentissage supervisé vs non supervisé - Apprentissage supervisé : il faut des données déjà classées/étalonnées. Souvent à la main ! => *#digitallabour* --- ## Apprentissage supervisé [.reduite[.center[]]](https://fakecaptcha.com) --- ## Apprentissage supervisé [.reduite[.center[]]](https://cquest.hackpad.com/OpenSolarMap-9oMiYswLksF) --- ## Apprentissage supervisé [.reduite[.center[]]](https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/36955.pdf) --- ## Apprentissage non supervisé - problème majeur : réduction de la dimensionnalité - jeux de données à très haute dimensionnalité : impossible à explorer visuellement. Comment simplifier l'information et la résumer ? .reduite[.center[]] --- ## Apprentissage non supervisé https://gallery.shinyapps.io/LDAelife/ --- class: class: inverse, center, middle # Quelques algorithmes notoires --- ## Apprentissage supervisé - la régression (linéaire, logistique, LOESS...), éventuellement régularisée (Ridge, LASSO...) - les arbres de décision - Naive Bayes (indépendance des attributs) - Réseau bayésien (graphe de corrélation entre variables, inclut des _priors_) - réseau de neurones (perceptron, back-propagation, Hopfield network...) - Deep learning - Random forest, Boosting, Gradient Boosting - Support vector machine - etc. --- ## Apprentissage non supervisé - clustering : k-means, k-medians, CAH... - réduction de la dimensionnalité : ACP, analyse géométrique des données, MDS, LDA topic clustering... - analyses de réseau - word2vec - etc. --- ## Apprentissage non supervisé [Word2vec](https://www.tensorflow.org/tutorials/word2vec) : .reduite[.center[]] --- ## Le cas du deep learning Comment apprendre à un ordinateur à lire ?  --- ## Le cas du deep learning .reduite[.center[]] --- ## Le cas du deep learning Un perceptron .reduite[.center[]] --- ## Le cas du deep learning .reduite[.center[]] --- ## Le cas du deep learning Une sigmoïde .reduite[.center[]] --- ## Le cas du deep learning .reduite[.center[]] --- ## Le cas du deep learning .reduite[.center[]] --- ## Le cas du deep learning .reduite[.center[]] --- ## Le cas du deep learning Le gradient descent .reduite[.center[]] + backpropagation --- ## Le cas du deep learning http://chifeng.scripts.mit.edu/stuff/mcmc-demo/#HamiltonianMC,squiggle --- ## Le cas du deep learning http://playground.tensorflow.org/ --- ## Le cas du deep learning Décompose un problème complexe (reconnaissance faciale, par exemple) en un grand nombre de problèmes simples => beaucoup de couches cachées => **abstraction** --- ## Les points auxquels prêter attention - feature selection - régularisation - qualité du critère d'optimisation - qualité de la distance/métrique retenue - qualité des données d'input (GIGO) - ... --- class: inverse, center, middle ## Evaluation # https://frama.link/auat_eval --- class: inverse, center, middle ## Merci ! # Et à votre disposition [joel@datactivi.st](mailto:joel@datactivi.st) https://github.com/datactivist/helpR (version alpha !)