diff --git a/Extraction.Rmd b/Extraction.Rmd new file mode 100644 index 0000000..1cd8ee8 --- /dev/null +++ b/Extraction.Rmd @@ -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 l’administration 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) +``` + + + + diff --git a/FilterList.R b/FilterList.R new file mode 100644 index 0000000..70a8ef4 --- /dev/null +++ b/FilterList.R @@ -0,0 +1 @@ +FilterList <- function(l,f) Filter(f, l) diff --git a/conversion_csv.sh b/conversion_csv.sh new file mode 100755 index 0000000..6d51d20 --- /dev/null +++ b/conversion_csv.sh @@ -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 diff --git a/courriel_donnees_ouvertes b/courriel_donnees_ouvertes new file mode 100644 index 0000000..fc48d08 --- /dev/null +++ b/courriel_donnees_ouvertes @@ -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 l’administration 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 diff --git a/depensesTI.Rproj b/depensesTI.Rproj new file mode 100644 index 0000000..e83436a --- /dev/null +++ b/depensesTI.Rproj @@ -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