Créer un document html en R markdown, contenant les éléments suivants. Vous devez faire un chapitre (avec titre de niveau 2 donc), pour chaque item de la liste suivante. N’hésitez pas à faire des sous-partie pour chaque sous-item. Vous devez utiliser le langage R, et pas de SQL.

Importation

Importer les données dans R, à l’aide de read.table()

Categorie = read.table("Categorie.txt",
                       header = T, sep = ";", quote = '"', encoding = "UTF-8")
Client = read.table("Client.txt",
                       header = T, sep = ";", quote = '"', encoding = "UTF-8")
Commande = read.table("Commande.txt",
                       header = T, sep = ";", quote = '"', encoding = "UTF-8")
DetailCommande = read.table("DetailCommande.txt",
                       header = T, sep = ";", quote = '"', encoding = "UTF-8")
Employe = read.table("Employe.txt",
                       header = T, sep = ";", quote = '"', encoding = "UTF-8")
Fournisseur = read.table("Fournisseur.txt",
                       header = T, sep = ";", quote = '"', encoding = "UTF-8")
Messager = read.table("Messager.txt",
                       header = T, sep = ";", quote = '"', encoding = "UTF-8")
Produit = read.table("Produit.txt",
                       header = T, sep = ";", quote = '"', encoding = "UTF-8")

Employés

Lister les employés (nom et prénom) situés au "Royaume-Uni"

Ici, nous utilisons la fonction subset() qui permet de faire :

  • une restriction aux employés du Royaume-Uni (avec subset =)
  • une projection sur le nom et le prénom (avec select =)
A = subset(Employe, subset = Pays == "Royaume-Uni", select = c(Nom, prenom))
knitr::kable(A, row.names = FALSE, caption = "Employés du Royaume-Uni")
Employés du Royaume-Uni
Nom prenom
Buchanan Steven
Suyama Michael
Emery Patrick
Dodsworth Anne
Suyama Jordan

Lister les différentes fonctions occupées par les employés

La première étape ici est de créer une table avec uniquement la colone Fonction. Ensuite, grâce à la fonction unique(), nous supprimons les doublons.

B1 = subset(Employe, select = Fonction)
B2 = unique(B1)
knitr::kable(B2, row.names = FALSE, caption = "Fonctions existantes")
Fonctions existantes
Fonction
Représentant(e)
Vice-Président
Chef des ventes
Assistante commerciale

Indiquer le nombre d’employés par pays

Après avoir dénombrer les employés par pays avec un calcul d’agrégat, réalisé via la fonction aggregate(), nous renommons les colonnes du résultat pour que le tableau fourni soit correct.

C1 = aggregate(NoEmp ~ Pays, Employe, length)
C2 = setNames(C1, c("Pays", "Effectif"))
knitr::kable(C2, row.names = FALSE, caption = "Répartition des employés par pays")
Répartition des employés par pays
Pays Effectif
Etats-Unis 5
Royaume-Uni 5

Produits

Lister le nombre de produits par pays des fournisseurs

Dans cette demande, nous devons regrouper des informations de Produit (dénombrement) avec des informations de Fournisseur (pays). Nou devons donc faire une jointure (avec merge()), puis faire le calcul d’agrégat et un renommage.

D1 = merge(Produit, Fournisseur)
D2 = aggregate(Refprod ~ Pays, D1, length)
D3 = setNames(D2, c("Pays", "Effectif"))
knitr::kable(D3, row.names = FALSE, caption = "Répartition des produits par pays")
Répartition des produits par pays
Pays Effectif
Allemagne 9
Australie 8
Brésil 1
Canada 4
Danemark 2
Espagne 2
Etats-Unis 12
Finlande 3
France 10
Italie 6
Japon 6
Norvège 3
Pays-Bas 2
Royaume-Uni 7
Singapour 3
Suède 6

On peut aussi vouloir trier le résultat par ordre décroissant de nombre de produits.

D4 = D3[order(D3$Effectif, decreasing = TRUE),]
knitr::kable(D4, row.names = FALSE, caption = "Répartition triée")
Répartition triée
Pays Effectif
Etats-Unis 12
France 10
Allemagne 9
Australie 8
Royaume-Uni 7
Italie 6
Japon 6
Suède 6
Canada 4
Finlande 3
Norvège 3
Singapour 3
Danemark 2
Espagne 2
Pays-Bas 2
Brésil 1

Lister le nombre de produits par catégorie

Cette demande est similaire à la précédente. Par contre, vues les questions qui suivent, nous allons réutiliser le résultat de la jointure de Produit et Categorie.

E = merge(Produit, Categorie)
E1a = aggregate(Refprod ~ NomCateg, E, length)
E1b = setNames(E1a, c("Catégorie", "Effectif"))
knitr::kable(E1a, row.names = FALSE, caption = "Répartition des produits par catégorie")
Répartition des produits par catégorie
NomCateg Refprod
Boissons 15
Condiments 12
Desserts 14
Pâtes et céréales 7
Poissons et fruits de mer 13
Produits laitiers 12
Produits secs 5
Viandes 6

Ajouter le prix moyen, le prix minimum (min) et le prix maximum (max)

Il faut ici créer les trois autres table, pour chaque agrégat à calculer, puis faire la jointure entre les 4 tables ainsi obtenues (avec la précédente).

E2a = aggregate(PrixUnit ~ NomCateg, E, mean)
E2b = setNames(E2a, c("Catégorie", "Prix moyen"))
E3a = aggregate(PrixUnit ~ NomCateg, E, min)
E3b = setNames(E3a, c("Catégorie", "Prix minimum"))
E4a = aggregate(PrixUnit ~ NomCateg, E, max)
E4b = setNames(E4a, c("Catégorie", "Prix maximum"))
Efinal = merge(merge(merge(E1b, E2b), E3b), E4b)
knitr::kable(Efinal, row.names = FALSE, caption = "Résumé des produits par catégorie", digits = 2)
Résumé des produits par catégorie
Catégorie Effectif Prix moyen Prix minimum Prix maximum
Boissons 15 191.58 22.50 1317.50
Condiments 12 115.31 50.00 219.50
Desserts 14 140.06 46.00 405.00
Pâtes et céréales 7 101.25 35.00 190.00
Poissons et fruits de mer 13 98.53 30.00 312.50
Produits laitiers 12 148.04 12.50 275.00
Produits secs 5 161.85 50.00 265.00
Viandes 6 270.03 37.25 618.95

Créer une table MontantCommande qui contient, pour chaque commande, les informations suivantes

  • Numéro de commande
  • Montant total de la commande
  • Frais de port
  • Montant total des produits
  • Nombre de produits différents dans la commande

Pour cette demande, il faut en premier lieu calculer le faire coût de chaque produit, stocké dans une nouvelle variable. Puis, on réalise les calculs d’agrégats (nombre et somme) à partir de la table DetailCommade. Ensuite, on joint Commande et les deux tables créées (avec un renommage des variables de celles-ci précédemment). Enfin, on ne garde que quelques informations et on calcule le montant final.

F1 = transform(DetailCommande, coutProduit = PrixUnit * Qte * (1 - Remise.))
F2a = aggregate(Refprod ~ Nocom, F1, length) 
F2b = setNames(F2a, c("NoCom", "NbProduits"))
F3a = aggregate(coutProduit ~ Nocom, F1, sum)
F3b = setNames(F3a, c("NoCom", "MtProduits"))
F4 = merge(merge(Commande, F2b), F3b)
F5 = subset(F4, select = c(NoCom, Port, MtProduits, NbProduits))
MontantCommande = transform(F5, MtCommande = Port + MtProduits)
knitr::kable(head(MontantCommande), row.names = FALSE, caption = "Premières lignes de la table `MontantCommande`", digits = 2)
Premières lignes de la table MontantCommande
NoCom Port MtProduits NbProduits MtCommande
10248 162 2200.0 3 2362.0
10249 58 9317.0 2 9375.0
10250 329 7758.0 3 8087.0
10251 207 3270.3 3 3477.3
10252 256 17989.5 3 18245.5
10253 291 7224.0 3 7515.0

Calculer le montant total des commandes de chaque client

Après avoir fait la jointure entre Commande et la nouvelle table MontantCommande, on fait la somme des montants des commandes pour chaque client. Ensuite, on regroupe avec Clinet pour récupérer le nom de la société. Enfin, puisqu’on affiche un chiffre d’affaires par client, on fait un tri décroissant sur le montant total des commandes.

G1 = merge(Commande, MontantCommande)
G2 = aggregate(MtCommande ~ CodeCli, G1, sum)
G3 = setNames(G2, c("CodeCli", "MontantCommandes"))
G4 = merge(Client, G3)
G5 = subset(G4, select = c(Societe, MontantCommandes))
G6 = G5[order(G5$MontantCommandes, decreasing = TRUE),]
knitr::kable(G6, row.names = FALSE, caption = "Chiffre d'affaires de chaque client")
Chiffre d’affaires de chaque client
Societe MontantCommandes
QUICK-Stop 579397.65
Ernst Handel 555283.90
Save-a-lot Markets 555230.80
Rattlesnake Canyon Grocery 266146.94
Hungry Owl All-Night Grocers 263601.05
Hanari Carnes 167771.10
Königlich Essen 158563.15
Folk och fä HB 156255.10
Mère Paillarde 151313.15
White Clover Markets 143566.35
Frankenversand 140280.65
Queen Cozinha 138451.95
Berglunds snabbköp 132446.85
Suprêmes délices 124537.40
Piccolo und mehr 121536.40
HILARIÓN-Abastos 120125.00
Bon app’ 116624.05
Bottom-Dollar Markets 107924.25
Richter Supermarkt 101718.40
Lehmanns Marktstand 101356.25
Great Lakes Food Market 97980.85
Blondel père et fils 95757.15
Simons bistro 86306.85
LINO-Delicateses 85731.70
Seven Seas Imports 85658.30
LILA-Supermercado 84046.65
Vaffeljernet 83946.00
Wartian Herkku 82342.35
Old World Delicatessen 80779.75
Eastern Connection 77969.00
Around the Horn 73507.50
Ottilies Käseladen 66748.75
Ricardo Adocicados 65381.55
Chop-suey Chinese 63591.80
Folies gourmandes 61484.00
Godos Cocina Típica 60050.75
Split Rail Beer & Ale 60021.40
Tortuga Restaurante 56396.00
Maison Dewey 50988.70
Die Wandernde Kuh 50088.65
La maison d’Asie 49827.50
Victuailles en stock 48343.30
Gourmet Lanchonetes 43686.00
Magazzini Alimentari Riuniti 38213.20
Reggiani Caseifici 36815.00
B’s Beverages 36556.00
Antonio Moreno Taquería 36452.60
Tradição Hipermercados 35595.40
Que Delícia 34957.65
Furia Bacalhau e Frutos do Mar 33524.65
Island Trading 32533.00
Wellington Importadora 31319.20
Santé Gourmet 30037.00
Princesa Isabel Vinhos 27049.20
Morgenstern Gesundkost 26811.00
Toms Spezialitäten 24504.80
Pericles Comidas clásicas 22612.00
Bólido Comidas preparadas 22121.00
Familia Arquibaldo 21679.50
Lonesome Pine Restaurant 21679.00
Drachenblut Delikatessen 20342.00
Comércio Mineiro 19987.00
Océano Atlántico Ltda. 18839.00
Wolski Zajazd 18515.00
The Big Cheese 18127.00
Blauer See Delikatessen 17038.00
France restauration 16708.00
Let’s Stop N Shop 16378.75
Hungry Coyote Import Store 16356.00
Wilman Kala 16234.00
Rancho grande 15328.00
Spécialités du monde 12661.00
Alfreds Futterkiste 11809.00
La corne d’abondance 10400.00
The Cracker Box 10384.00
Cactus Comidas para llevar 9433.00
Ana Trujillo Emparedados y helados 9272.00
Consolidated Holdings 8871.00
Du monde entier 8394.00
Trail’s Head Gourmet Provisioners 8196.00
Franchi S.p.A. 8103.00
GROSELLA-Restaurante 7785.00
Vins et alcools Chevalier 7689.00
Romero y tomillo 7677.00
Galería del gastrónomo 4376.00
North/South 3433.00
Laughing Bacchus Wine Cellars 2650.00
Lazy K Kountry Store 1887.00
Centro comercial Moctezuma 520.00

Calculer le montant total des commandes pour chaque pays des clients

On réutilise ici la table créée précédemment, résultante de la jointure entre Client et celle où l’on a calculer pour chaque client la somme des montants des commandes. On fait donc ensuite un aggrégat par pays, que l’on trie pour affichage.

H1 = aggregate(MontantCommandes ~ Pays, G4, sum)
H2 = H1[order(H1$MontantCommandes, decreasing = TRUE),]
knitr::kable(H2, row.names = FALSE, caption = "Chiffre d'affaires par pays")
Chiffre d’affaires par pays
Pays MontantCommandes
États-Unis 1296733.84
Allemagne 1196939.90
Autriche 676820.30
Brésil 558829.35
France 427888.00
Royaume-Uni 318527.80
Venezuela 297688.35
Suède 288701.95
Irlande 263601.05
Canada 261887.40
Belgique 175526.10
Danemark 170252.85
Suisse 165310.20
Mexique 125252.60
Finlande 98576.35
Espagne 94224.75
Italie 83131.20
Portugal 60573.85
Argentine 43600.00
Norvège 30037.00
Pologne 18515.00