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

ca = read.table("../donnees/ca/ca.csv", sep = ";", header = T)
groupe = read.table("../donnees/ca/groupe.csv", sep = ";", header = T, quote = NULL)
mois = read.table("../donnees/ca/mois.csv", sep = ";", header = T)
provenance = read.table("../donnees/ca/provenance.csv", sep = ";", header = T)

Manipulation

Informations complètes

En décomposant les étapes :

# 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 :

# 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.frames :

identical(ca_tout, ca_tout_bis)
## [1] TRUE

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 :

# 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 :

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 :

identical(ca_evol, ca_evol_bis)
## [1] TRUE

Deuxième version

Dans cette deuxième version, on repart des data.frames 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 :

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 :

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

identical(ca_autre, ca_autre_bis)
## [1] TRUE

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.

# 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)
## [1] TRUE

Quelques informations sur le CA

Chiffre d’affaires total sur l’ensemble de la période

kable(aggregate(ca ~ 1, ca_tout, sum))

ca

140999800

CA total par provenance

kable(aggregate(ca ~ provenance, ca_tout, sum))
provenance ca
Boutique 14301803
Commandes téléphoniques 14412893
Expo 14193269
Magasin 14171411
Par correspondance 13794410
Revetement de sol professionnel 13973790
Studio Photo 14110981
Studio Radio TV 13906983
Vente aux employés 13982962
Zürich 14151298

CA total par année d’exercice

kable(aggregate(ca ~ annee, ca_tout, sum))
annee ca
2003 70247370
2004 70752430

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
kable(subset(aggregate(ca ~ mois + mois_numero, ca_tout, sum), select = -mois_numero))
mois ca
Janvier 11750665
Février 11514327
Mars 11885814
Avril 11738956
Mai 11651719
Juin 11861857
Juillet 11771167
Août 11779044
Septembre 11793003
Octobre 11653374
Novembre 11740504
Décembre 11859371

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 :

kable(subset(aggregate(cbind(ca2003, ca2004, evolution) ~ mois + mois_numero, 
                       ca_evol, sum), 
             select = -mois_numero))
mois ca2003 ca2004 evolution
Janvier 5799948 5950717 150768.80
Février 5707996 5806331 98334.70
Mars 5976362 5909451 -66911.20
Avril 5896256 5842700 -53555.71
Mai 5794095 5857624 63528.60
Juin 5900512 5961345 60832.30
Juillet 5853953 5917214 63260.61
Août 5908039 5871005 -37034.49
Septembre 5825065 5967938 142872.50
Octobre 5748651 5904723 156071.60
Novembre 5896407 5844097 -52309.72
Décembre 5940084 5919286 -20797.80

Dans la deuxième version, on utilise la table ca_tout créée en premier :

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
    )
)
mois ca2003 ca2004 evolution
Janvier 5799948 5950717 150768.80
Février 5707996 5806331 98334.70
Mars 5976362 5909451 -66911.20
Avril 5896256 5842700 -53555.71
Mai 5794095 5857624 63528.60
Juin 5900512 5961345 60832.30
Juillet 5853953 5917214 63260.61
Août 5908039 5871005 -37034.49
Septembre 5825065 5967938 142872.50
Octobre 5748651 5904723 156071.60
Novembre 5896407 5844097 -52309.72
Décembre 5940084 5919286 -20797.80