Premiere version - Extraction et fusino des sources de données

This commit is contained in:
François Pelletier 2015-10-10 23:41:57 -04:00
parent 373b21c9ff
commit f53221e6b5
5 changed files with 187 additions and 0 deletions

132
Extraction.Rmd Normal file
View file

@ -0,0 +1,132 @@
---
title: "Extraction et préparation des données"
author: "François Pelletier"
date: "10 octobre 2015"
output: html_document
---
#Extraction et préparation des données du jeu «Tableau de bord de létat de santé des projets en ressources informationnelles de ladministration publique»
##Extraction des métadonnées
```{r}
library(XML)
library(dplyr)
source("FilterList.R")
# Identifiant unique du jeu de données
UUID = "c60b2248-0ca4-4b12-89d3-2f087a319bea"
# URL pour récupérer les métadonnées
urlRDF <- paste0("http://www.donnees.gouv.qc.ca/geonetwork/srv/eng/rdf.metadata.get?uuid=",UUID)
# Document de métadonnées
RDFdoc<- urlRDF %>%
xmlTreeParse %>%
xmlRoot
```
Quel est le contenu du fichier de métadonnées ?
```{r}
# Fréquence de chaque type de noeuds
RDFdoc %>%
names %>%
table %>%
as.data.frame %>%
"colnames<-"(c("Type de noeud","Fréquence"))
# Nombre de champs dans chaque noeud
xmlSApply(RDFdoc, xmlSize)
# Extraction à une profondeur de 1
champs <- xmlSApply(RDFdoc, function(x) xmlSApply(x, xmlValue))
# Je veux seulement les champs de type «Distribution»
champsDistribution <- champs[names(champs) == "Distribution"]
```
Je veux extraire les noms des fichiers de données pour les télécharger
```{r}
datafileNames <- champsDistribution %>%
lapply(function(x) as.character(x[x["format"]=="WWW:DOWNLOAD-1.0-ftp--downloadWWW:DOWNLOAD-1.0-ftp--download"])) %>%
FilterList(function(x) !identical(character(0),x)) %>%
as.data.frame %>% t
datafileNames
```
Les fichiers actuels présentent des erreurs d'encodage qui devront être corrigées manuellement. Voir le courriel joint.
```{r eval=FALSE}
rawdata <- list()
rawdata <- lapply(datafileNames[,1],read.csv2,header=FALSE,sep=";",encoding="utf-8",skip = 1)
```
Je télécharge donc les fichiers manuellement
```{r eval=FALSE}
lapply(datafileNames[,1], function (x) system2("wget", x))
noms_fichiers_telecharges <- list.files(path = ".", pattern = ".csv")
system("bash conversion_csv.sh")
```
Je les importe ensuite
```{r}
rawdata <- list()
rawdata <-lapply(1:7,function(i) rawdata[[i]] <- read.csv2(paste0("tr_tableau_de_bord_",i,".csv"),
header = TRUE,
sep=";",
encoding="utf-8",
stringsAsFactors = FALSE,
dec = ","))
rawdata %>% lapply(names)
```
Je corrige les incohérences manuellement jusqu'à temps que je puisse faire la jointure des données
```{r}
rawdata[[4]]$Pourcentage_avancement[levels(rawdata[[4]]$Pourcentage_avancement) == "-"] <- NA
rawdata[[4]]$Pourcentage_avancement <- as.integer(rawdata[[4]]$Pourcentage_avancement)
rawdata[[1]]$Cote_de_coût <- as.numeric(rawdata[[1]]$Cote_de_coût)
rawdata[[2]]$Cote_de_coût <- as.numeric(rawdata[[2]]$Cote_de_coût)
rawdata[[3]]$Cote_de_coût <- as.numeric(rawdata[[3]]$Cote_de_coût)
rawdata[[1]]$Variation_de_coût <- as.numeric(rawdata[[1]]$Variation_de_coût)
rawdata[[2]]$Variation_de_coût <- as.numeric(rawdata[[2]]$Variation_de_coût)
rawdata[[3]]$Variation_de_coût <- as.numeric(rawdata[[3]]$Variation_de_coût)
rawdata[[1]]$Variation_écheancier <- as.numeric(rawdata[[1]]$Variation_écheancier)
rawdata[[2]]$Variation_écheancier <- as.numeric(rawdata[[2]]$Variation_écheancier)
rawdata[[3]]$Variation_écheancier <- as.numeric(rawdata[[3]]$Variation_écheancier)
rawdata[[5]]$Montant_reel_depense <- gsub(",", ".", rawdata[[5]]$Montant_reel_depense)
rawdata[[5]]$Montant_reel_depense <- gsub(" ", "", rawdata[[5]]$Montant_reel_depense)
rawdata[[5]]$Montant_reel_depense <- as.numeric(rawdata[[5]]$Montant_reel_depense)
rawdata[[5]]$Montant_reel_depense[105:450] <- rawdata[[5]]$Montant_reel_depense[105:450]*1000
rawdata[[5]]$Cout_estime_pour_completer_le_projet <- gsub(",", ".", rawdata[[5]]$Cout_estime_pour_completer_le_projet)
rawdata[[5]]$Cout_estime_pour_completer_le_projet <- gsub(" ", "", rawdata[[5]]$Cout_estime_pour_completer_le_projet)
rawdata[[5]]$Cout_estime_pour_completer_le_projet <- as.numeric(rawdata[[5]]$Cout_estime_pour_completer_le_projet)
rawdata[[5]]$Cout_estime_pour_completer_le_projet[105:450] <- rawdata[[5]]$Cout_estime_pour_completer_le_projet[105:450]*1000
rawdata[[5]]$Budget_autorise_revise <- gsub(",", ".", rawdata[[5]]$Budget_autorise_revise)
rawdata[[5]]$Budget_autorise_revise <- gsub(" ", "", rawdata[[5]]$Budget_autorise_revise)
rawdata[[5]]$Budget_autorise_revise <- as.numeric(rawdata[[5]]$Budget_autorise_revise)
rawdata[[5]]$Budget_autorise_revise[105:450] <- rawdata[[5]]$Budget_autorise_revise[105:450]*1000
rawdata[[5]]$Budget_autorise_initial <- gsub(",", ".", rawdata[[5]]$Budget_autorise_initial)
rawdata[[5]]$Budget_autorise_initial <- gsub(" ", "", rawdata[[5]]$Budget_autorise_initial)
rawdata[[5]]$Budget_autorise_initial <- as.numeric(rawdata[[5]]$Budget_autorise_initial)
rawdata[[5]]$Budget_autorise_initial[105:450] <- rawdata[[5]]$Budget_autorise_initial[105:450]*1000
convertir.noms <- function(noms)
{
noms <- noms %>% iconv(to="ASCII//TRANSLIT") %>% tolower
noms[noms=="date_de_fin_revise"] <- "date_de_fin_revisee"
noms
}
for (i in 1:7)
{
names(rawdata[[i]]) <- convertir.noms(names(rawdata[[i]]))
}
```
Jointure de tous les fichiers de données dans une même table
```{r}
rawdata2 <- dplyr::bind_rows(rawdata)
```

1
FilterList.R Normal file
View file

@ -0,0 +1 @@
FilterList <- function(l,f) Filter(f, l)

6
conversion_csv.sh Executable file
View file

@ -0,0 +1,6 @@
#!/bin/bash
for i in tableau_de_bord*.csv
do
echo "conversion du fichier ${i}"
iconv -f "iso-8859-1" -t "utf8" ${i} -o tr_${i}
done

32
courriel_donnees_ouvertes Normal file
View file

@ -0,0 +1,32 @@
Bonjour,
Je vous écris par rapport à certains éléments problématiques dans les fichiers de données avec identifiant c60b2248-0ca4-4b12-89d3-2f087a319bea (Tableau de bord de létat de santé des projets en ressources informationnelles de ladministration publique):
1. Erreur d'encodage dans les données.
Les données sont encodées dans le format ISO-8859-1 et non UTF-8. Il serait approprié de modifier le descriptif à cet effet. La commande linux suivante permet de faire la conversion du fichier si vous souhaitez utiliser le UTF-8, pour un fichier fichier.csv :
iconv -f "iso-8859-1" -t "utf8" fichier.csv -o fichier_corrige.csv
2. Caractères non-standards dans les entêtes de fichiers.
De façon générale, il est recommandé de mettre uniquement des lettres, des chiffres et le caractère _ dans les entêtes de fichiers CSV. De fait, la majorité des logiciels statistiques et de bases de données ne supportent pas les caractères spéciaux et les caractères accentués. Dans le logiciel R, ceci génère le message d'erreur suivant: «chaîne de charactères multioctets incorrecte 7»
3. Valeur incorrecte dans un champ numérique
Dans le fichier "tableau_de_bord_4.csv", pour la variable "Pourcentage_avancement" on retrouve le caractère "-" pour les données manquantes. Dans un fichier CSV, la norme est de laisser le champ à vide lorsque la donnée est manquante. Ceci évite aux logiciels de considérer uen colonne numérique comme une colonne texte
4. Incohérence dans le format numérique de variables comptables.
Dans le fichier "tableau_de_bord_5.csv", les premières lignes de données des variables "Budget_autorise_initial","Budget_autorise_revise", "Montant_reel_depense" et "Cout_estime_pour_completer_le_projet" contiennent des nombres avec des espaces (un nombre ne devrait jamais contenir d'espaces dans un fichier de données). Ces nombres représentent des montants en $. Puis, à partir de la 105e ligne, les montants deviennent soudaienement en milliers$ et sans espaces, maintenant. Ces incohérences des données rendent difficile le traitement automatisé de fichiers de données, car une intervention manuelle est nécessaire.
5. Incohérences dans les noms de variables entre les fichiers
Les noms de colonnes changent entre les fichiers: il y a des minuscules et des majuscules, certains ont des accents, d'autres non. Les noms de colonnes devraient être soit en minuscules, soit en majuscules et ne pas comporter d'accents. Ils doivent de plus être uniformes entre les fichiers afin de permettre de les concaténer facilement.
exemples:
date_de_fin_revise -> date_de_fin_revisee,
Nom_organisme -> Nom_Organisme,
Date_de_début_prévue -> Date_de_debut_prevue
Merci !
François Pelletier

16
depensesTI.Rproj Normal file
View file

@ -0,0 +1,16 @@
Version: 1.0
RestoreWorkspace: Default
SaveWorkspace: Default
AlwaysSaveHistory: Default
EnableCodeIndexing: Yes
UseSpacesForTab: Yes
NumSpacesForTab: 2
Encoding: UTF-8
RnwWeave: Sweave
LaTeX: pdfLaTeX
AutoAppendNewline: Yes
StripTrailingWhitespace: Yes