--- title: TP noté - *correction* subtitle: Programmation statistique avec `R` - STID 2ème année --- ```{r, include=FALSE} library(knitr) ``` ## Rendu On choisit donc ici d'afficher le code, et faire en sorte que les tableaux soient affichés au format HTML, grâce à la fonction `kable()` de la librairie `knitr`. ## Importation des données ```{r} ca = read.table("../donnees/ca/ca.txt", sep = "%", header = T) groupe = read.table("../donnees/ca/groupe.txt", sep = "%", header = T, quote = NULL) mois = read.table("../donnees/ca/mois.txt", sep = "%", header = T) provenance = read.table("../donnees/ca/provenance.txt", sep = "%", header = T) ``` ## Manipulation ### Informations complètes En décomposant les étapes : ```{r} # Jointure entre ca et provenance etape1 = merge(ca, provenance, by.x = "prov_no", by.y = "no") # Jointure du résultat avec groupe etape2 = merge(etape1, groupe, by.x = "groupe_no", by.y = "no") # Enfin, jointure du résultat précédent avec mois ca_tout_bis = merge(etape2, mois, by.x = "mois_no", by.y = "no") ``` Tout dans la même expression, sans création de variables temporaires : ```{r} # Remplacement de chaque var temporaire par son calcul # Le code est indenté pour plus de clarté ca_tout = merge( merge( merge( ca, provenance, by.x = "prov_no", by.y = "no" ), groupe, by.x = "groupe_no", by.y = "no" ), mois, by.x = "mois_no", by.y = "no" ) ``` On vérifie que nous obtenons bien évidemment les mêmes `data.frame`s : ```{r} identical(ca_tout, ca_tout_bis) ``` ### Comparaison entre année #### Première version Ici, on part du `data.frame` `ca_tout` précédemment créé, pour en créer deux (un pour 2003, et un pour 2004), puis on fait une jointure entre les deux, sur tous les attributs en commun sauf `no` et `mois_no`. Idem, en décomposant chaque étape : ```{r} # Partie 2003 # - restriction à l'année 2003 evol2003a = subset(ca_tout, annee == 2003) # - création d'une nouvelle variable ca2003 pour l'utiliser plus tard evol2003b = transform(evol2003a, ca2003 = ca) # - supression des variables inutiles : ca, annee, no, mois_no evol2003c = subset(evol2003b, select = -c(ca, annee, no, mois_no)) # Partie 2004 # - restriction à l'année 2004 evol2004a = subset(ca_tout, annee == 2004) # - création d'une nouvelle variable ca2004 pour l'utiliser plus tard evol2004b = transform(evol2004a, ca2004 = ca) # - supression des variables inutiles : ca, annee, no, mois_no evol2004c = subset(evol2004b, select = -c(ca, annee, no, mois_no)) # Jointure entre les deux parties, sur tous les attributs en commun, sauf evol = merge( evol2003c, evol2004c, by = c("prov_no", "code_prov", "provenance", "groupe_no", "code_dep", "departement", "code_groupe", "groupe", "code_sgroupe", "sous_groupe", "mois", "mois_numero") ) ca_evol_bis = transform(evol, evolution = ca2004 - ca2003) ``` Et en réalisant tout en une fois : ```{r} ca_evol = transform( merge( subset(transform(subset(ca_tout, annee == 2003), ca2003 = ca), select = -c(ca, annee, no, mois_no)), subset(transform(subset(ca_tout, annee == 2004), ca2004 = ca), select = -c(ca, annee, no, mois_no)), by = c("prov_no", "code_prov", "provenance", "groupe_no", "code_dep", "departement", "code_groupe", "groupe", "code_sgroupe", "sous_groupe", "mois", "mois_numero") ), evolution = ca2004 - ca2003 ) ``` On obtient bien le même résultat : ```{r} identical(ca_evol, ca_evol_bis) ``` #### Deuxième version Dans cette deuxième version, on repart des `data.frame`s de base, pour déjà séparer 2003 et 2004, puis faire les jointures entre les deux. Puis, au final, faire la jointure avec `provenance` et `groupe`. En décomposant : ```{r} autre1 = merge(ca, mois, by.x = "mois_no", by.y = "no") autre2003a = subset(autre1, annee == 2003) autre2003b = transform(autre2003a, ca2003 = ca) autre2003c = subset(autre2003b, select = -c(ca, annee, no, mois_no)) autre2004a = subset(autre1, annee == 2004) autre2004b = transform(autre2004a, ca2004 = ca) autre2004c = subset(autre2004b, select = -c(ca, annee, no, mois_no)) autre2 = merge(autre2003c, autre2004c) autre3 = merge(autre2, provenance, by.x = "prov_no", by.y = "no") autre4 = merge(autre3, groupe, by.x = "groupe_no", by.y = "no") ca_autre_bis = transform(autre4, evolution = ca2004 - ca2003) ``` Et en minimisant les créations de variables temporaires : ```{r} ca_autre = transform( merge( merge( merge( subset( transform( subset( merge(ca, mois, by.x = "mois_no", by.y = "no"), annee == 2003 ), ca2003 = ca ), select = -c(ca, annee, no, mois_no) ), subset( transform( subset( merge(ca, mois, by.x = "mois_no", by.y = "no"), annee == 2004 ), ca2004 = ca ), select = -c(ca, annee, no, mois_no) ) ), provenance, by.x = "prov_no", by.y = "no" ), groupe, by.x = "groupe_no", by.y = "no"), evolution = ca2004 - ca2003 ) ``` On regarde qu'on obtient bien le même résultat ```{r} identical(ca_autre, ca_autre_bis) ``` #### Comparaison entre les 2 versions Ici, on ne peut pas utiliser `identical()` car l'ordre n'est pas le même entre les deux résultat, dû à la différence de création (principalement, l'ordre des jointures). On va donc créer un nouvel attribut dans chaque table, composé de `mois_numero`, `groupe_no` et de `prov_no`. On pourra ainsi ordonner les tables grâce à cet attribut (grâce à `order()`), et ainsi les comparer. On devra aussi renommer les noms des lignes et réordonner les variables du deuxième `data.frame` pour les mettre dans le même ordre que le premier. ```{r} # Création d'un df pour ca_evol # - création de l'attribut ordre comp1 = transform(ca_evol, ordre = paste(mois_numero, groupe_no, prov_no, sep = "-")) # - ordonnencement de la table par cet attribut comp1 = comp1[order(comp1$ordre),] # - modification des noms de lignes rownames(comp1) = 1:nrow(comp1) # Création d'un df pour ca_autre # - création de l'attribut ordre comp2 = transform(ca_autre, ordre = paste(mois_numero, groupe_no, prov_no, sep = "-")) # - ordonnencement de la table par cet attribut # - ordonnencement des colonnes par l'ordre des colonnes de comp1 comp2 = comp2[order(comp2$ordre), names(comp1)] # - modification des noms de lignes rownames(comp2) = 1:nrow(comp2) # Test pour savoir si ce sont les mêmes tables identical(comp1, comp2) ``` ## Quelques informations sur le CA ### Chiffre d'affaires total sur l'ensemble de la période ```{r} kable(aggregate(ca ~ 1, ca_tout, sum)) ``` ### CA total par provenance ```{r} kable(aggregate(ca ~ provenance, ca_tout, sum)) ``` ### CA total par année d'exercice ```{r} kable(aggregate(ca ~ annee, ca_tout, sum)) ``` ### CA total par mois dans l'année, - en faisant attention à la présentation dans l'ordre des mois, cf l'attribut `mois_numero` - il faut donc ici un tableau à 12 lignes, une par mois, et deux colonnes, la deuxième colonne contenant le CA total pour chaque mois sur les deux ans ```{r} kable(subset(aggregate(ca ~ mois + mois_numero, ca_tout, sum), select = -mois_numero)) ``` ### CA total par mois pour 2003 et 2004 - tableau à 4 colonnes : `mois`, `ca2003`, `ca2004`, `evolution` Dans cette première version, on utilise la table `ca_evol` créée précédemment : ```{r} kable(subset(aggregate(cbind(ca2003, ca2004, evolution) ~ mois + mois_numero, ca_evol, sum), select = -mois_numero)) ``` Dans la deuxième version, on utilise la table `ca_tout` créée en premier : ```{r} kable( transform( setNames( subset( merge( aggregate(ca ~ mois + mois_numero, subset(ca_tout, annee == 2003), sum), aggregate(ca ~ mois + mois_numero, subset(ca_tout, annee == 2004), sum), by = c("mois_numero") ), select = -c(mois_numero, mois.y) ), c("mois", "ca2003", "ca2004") ), evolution = ca2004 - ca2003 ) ) ```