Analyse OLAP des Ventes de Fruits


1. Nom et spécialité du binôme

Noms :
- ALLALI Chakib Khalil
- BENDJERID Mohammed Abdelaziz

Spécialité : Master 1 - Aide à la Décision et Systèmes Intelligents (ADSI)


2. Description du dataset utilisé

Le dataset est généré artificiellement pour représenter les ventes de fruits dans 5 supermarchés (s1 à s5) répartis sur différentes zones géographiques : Est, Ouest, Sud, Nord.
- Les fruits disponibles sont : orange, citron, banane, kiwi
- Les années analysées sont : 2023, 2024, 2025
- Une quantité aléatoire est associée à chaque vente

Des règles de nettoyage ont été appliquées : - Exclusion des ventes de banane et citron dans le supermarché s2 - Suppression des ventes de kiwi en 2024


3. Chargement et nettoyage des données

library(plotly)
library(reshape2)
library(dplyr)
library(ggplot2)
supermarches <- c("s1", "s2", "s3", "s4", "s5")
fruits <- c("orange", "citron", "banane", "kiwi")
annees <- c(2023, 2024, 2025)
zones <- c("s1" = "Est", "s2" = "Ouest", "s3" = "Sud", "s4" = "Nord", "s5" = "Nord")

set.seed(911)
donnees_brutes <- data.frame(
  Supermarche = sample(supermarches, 60, replace = TRUE),
  Fruit = sample(fruits, 60, replace = TRUE),
  Annee = sample(annees, 60, replace = TRUE),
  Quantite = sample(0:100, 60, replace = TRUE)
)

donnees_brutes$Zone <- zones[donnees_brutes$Supermarche]

Data <- donnees_brutes %>%
  filter(!(Supermarche == "s2" & Fruit %in% c("banane", "citron"))) %>%
  filter(!(Fruit == "kiwi" & Annee == 2024)) %>%
  distinct()

4. Fonction de visualisation OLAP 3D

plot_olap <- function(data, titre = "Cube OLAP 3D") {
  data$Zone_num <- as.numeric(as.factor(data$Zone))
  plot_ly(
    data,
    x = ~Annee,
    y = ~Fruit,
    z = ~Zone_num,
    color = ~Quantite,
    text = ~paste("Quantité:", Quantite),
    type = "scatter3d",
    mode = "markers",
    marker = list(size = 10, opacity = 0.8)
  ) %>% layout(
    title = titre,
    scene = list(
      xaxis = list(title = "Année"),
      yaxis = list(title = "Fruit"),
      zaxis = list(title = "Zone")
    )
  )
}

5. Cube OLAP général (Quantité > 0)

cube_olap <- Data %>% filter(Quantite > 0)
plot_olap(cube_olap, "Cube OLAP - Quantité > 0")

Explication :
Ce cube affiche uniquement les ventes ayant une quantité strictement positive.
Il permet d’analyser l’ensemble des transactions valides en se basant sur trois axes : - l’année de vente (axe X), - le type de fruit (axe Y), - et la zone géographique (axe Z).
Cela permet de repérer les tendances générales de vente sur la période étudiée.

6. Slice (Année = 2025)

slice_2025 <- cube_olap %>% filter(Annee == 2025)
plot_olap(slice_2025, "Slice - Année 2025")

Explication :
Ce slice extrait uniquement les ventes qui ont eu lieu en 2025.
Cela permet de se concentrer sur une année spécifique pour faire une analyse ciblée.

7. Dice (Quantité > 50)

dice_sup_50 <- cube_olap %>% filter(Quantite > 50)
plot_olap(dice_sup_50, "Dice - Quantité > 50")

Explication :
Ce dice sélectionne uniquement les ventes où la quantité dépasse 50 unités.
Cela permet de détecter les cas de forte demande ou de succès commerciaux remarquables.

8. Slice + Dice (2023-2024 et Quantité > 40)

slice_dice <- cube_olap %>% filter(Annee %in% c(2023, 2024) & Quantite > 40)
plot_olap(slice_dice, "Slice + Dice - 2023-2024 & Qte > 40")

Explication :
Cette vue combine deux filtres : les années 2023 et 2024, et une quantité minimale de 40.

9. Roll-up (fruits acides regroupés)

rollup_acide <- cube_olap %>%
  mutate(Fruit = ifelse(Fruit %in% c("citron", "orange"), "acide", Fruit)) %>%
  group_by(Zone, Fruit, Annee) %>%
  summarise(Quantite = sum(Quantite), .groups = "drop")
plot_olap(rollup_acide, "Roll-up - Fruits acides regroupés")

Explication :
Le roll-up regroupe les fruits acides (orange et citron) sous une même catégorie appelée « acide ».

10. Drill-down (zone Nord)

drill_down_nord <- cube_olap %>% filter(Zone == "Nord")
plot_olap(drill_down_nord, "Drill-down - Zone Nord")

Explication :
Le drill-down permet de zoomer uniquement sur la zone Nord (supermarchés s4 et s5).