
EDA en public (partie 2) : analyse approfondie des produits et analyses de séries chronologiques chez Pandas
! Bienvenue dans la série « EDA en public » ! Il s’agit de la deuxième partie de la série ; si vous n’avez pas encore vu la première partie, lisez-la ici. Voici un récapitulatif de ce que nous avons conquis.
Dans la première partie, nous avons pris un fichier de ventes désordonné d’un demi-million de lignes et l’avons mis en forme. Plus précisément, nous :
- Échantillonné les données pour un traitement plus rapide.
- Correction des valeurs manquantes et des entrées de texte standardisées (comme « EIRE » à « Irlande »).
- Filtré tout le bruit – retours, annulations et transactions à prix nul.
- Conception de notre fonctionnalité la plus critique : le
Revenuecolonne. - Nous avons obtenu notre premier aperçu commercial : le Top 10 des pays générateurs de revenus.
Nous disposons désormais d’un Pandas DataFrame propre et prêt à générer des revenus, prêt à être exploité pour obtenir des informations ! À la fin de cette série, je souhaite maîtriser l’analyse exploratoire des données à l’aide de Pandas. N’hésitez pas à suivre si vous êtes un passionné de données.
Nous nous concentrons désormais sur la fourniture d’une business intelligence véritablement percutante pour NovaShop. Notre objectif global pour la partie 2 est de répondre aux questions fondamentales : Quoi les produits sont les plus performants, et quand c’est le meilleur moment pour les vendre?
Cette partie concerne l’analyse à l’aide de puissantes techniques d’agrégation Pandas (.groupby()) et l’ingénierie des fonctionnalités à l’aide de la colonne datetime (.dt accesseur). Nous diviserons notre analyse en deux domaines clés :
- Présentation approfondie du produit : Identifier les produits qui déplacent le plus d’unités par rapport à ceux qui rapportent le plus de liquidités.
- Calendrier des ventes (séries chronologiques) : Découvrir la saisonnalité des ventes (pics mensuels) et les tendances opérationnelles (heure la plus chargée de la journée).
Sans plus tarder, allons-y.
Chargement des données propres
Pour améliorer les performances, exportons notre ensemble de données nettoyé et importons-le à nouveau pour analyse
df.to_csv('online_retail_clean.csv', index=False)
Maintenant, je peux créer un nouveau projet et recommencer.
Lors du chargement de fichiers CSV contenant des colonnes de date, j’essaie d’utiliser le parse_dates argument dans pd.read_csv(). Cela m’évite d’avoir à convertir manuellement le type de colonne ultérieurement, garantissant ainsi que les caractéristiques de date sont correctes dès le début.
import pandas as pd
df = pd.read_csv('online_retail_clean.csv', parse_dates=['InvoiceDate'])
print(f"Successfully loaded clean data. Total rows: {len(df)}")
Sortir:
Successfully loaded clean data. Total rows: 52933
Analyse approfondie des produits : qui sont les véritables créateurs d’argent ?
Une fois les données propres chargées, passons directement aux performances du produit. Les produits peuvent être considérés comme des « best-sellers » de deux manières différentes : en volume (unités vendues) ou en valeur (revenus générés).
Insight 2 : Top 10 des meilleures ventes (par quantité)
La liste des quantités nous indique quels produits sont populaires et très demandés, même si leur prix est bas. Ceci est important pour le stockage en entrepôt et la gestion des stocks.
Nous regrouperons par produit Descriptionadditionner le Quantityet triez-le par ordre décroissant.
# Top 10 Bestsellers (by Quantity)
df.groupby(‘Description’)[‘Quantity’].sum().sort_values(ascending=False).head(10)
Sortir:
Description
MEDIUM CERAMIC TOP STORAGE JAR 74698
WORLD WAR 2 GLIDERS ASSTD DESIGNS 9419
GIN + TONIC DIET METAL SIGN 5016
ASSORTED COLOURS SILK FAN 4684
JUMBO BAG RED RETROSPOT 4671
PACK OF 72 RETROSPOT CAKE CASES 3561
MINI PAINT SET VINTAGE 3285
ASSORTED COLOUR BIRD ORNAMENT 2783
BROCADE RING PURSE 2525
POPCORN HOLDER 2508
Name: Quantity, dtype: int64
Insight 3 : Les 10 principaux moteurs de revenus (les véritables générateurs d’argent)
C’est ce que NovaShop veut vraiment savoir. Ces produits génèrent de la rentabilité. Ils ne vendent peut-être pas autant d’unités que les articles de la liste précédente, mais leur prix plus élevé ou leurs commandes groupées plus importantes les rendent beaucoup plus précieux.
Nous suivons le même processus, mais cette fois nous regroupons sur le Revenue colonne que nous avons conçue dans la partie 1.
# Top 10 Revenue Drivers (The True Money-Makers)
df.groupby(‘Description’)[‘Revenue’].sum().sort_values(ascending=False).head(10)
Sortir:
Description
MEDIUM CERAMIC TOP STORAGE JAR 77785.74
DOTCOM POSTAGE 18456.13
REGENCY CAKESTAND 3 TIER 15093.38
AMAZON FEE 13541.33
PARTY BUNTING 9491.60
GIN + TONIC DIET METAL SIGN 9480.51
JUMBO BAG RED RETROSPOT 8996.65
Manual 8966.96
CHILLI LIGHTS 8395.20
POSTAGE 7194.51
Name: Revenue, dtype: float64
Discussion : ce que disent ces listes à NovaShop
C’est là que la puissance de l’EDA brille vraiment, car ces deux listes racontent une histoire très différente :
- Le produit All-Star : Le « POT DE STOCKAGE MOYEN EN CÉRAMIQUE » est clairement le vainqueur, dominant largement les deux listes. C’est un volume et une valeur élevés. Cet article devrait être l’objectif principal de NovaShop en matière d’inventaire, de marketing et d’expansion.
- Une source de revenus surprenante : En explorant les données, j’ai remarqué des éléments comme « AFFRANCHISSEMENT DOTCOM », « FRAIS AMAZON », « Manuel », et « AFFRANCHISSEMENT. » Ce ne sont pas de vrais produits, ce sont des frais de service et des ajustements manuels. Pourtant, ensemble, ils rapportent presque 48 000 £ en revenus. NovaShop devrait vérifier si ces frais sont pris en compte dans leur bénéfice brut. C’est une chose facile à manquer, mais cela pourrait être une source de revenus discrète et significative cachée à la vue de tous.
- Les biens physiques de grande valeur : Des articles comme le « REGENCY CAKESTAND 3 NIVEAUX » et « LUMIÈRES AU PIMENT » faites la liste des revenus mais pas la liste des quantités. Cela nous indique qu’il s’agit d’articles à prix élevé qui contribuent de manière significative au flux de trésorerie total et qui méritent des efforts de marketing ciblés.
Nous avons maintenant une image complète de ce que NovaShop vend le mieux. Il est temps de savoir quand !
Préparation à l’analyse de séries chronologiques : ingénierie des fonctionnalités
Nous savons ce qui s’est bien vendu. Voyons maintenant quand les ventes culminent. Notre objectif est de décomposer InvoiceDate colonne en composants qui nous permettent de regrouper et d’analyser les ventes par année, mois, jour et même heure.
Il s’agit d’une démarche classique d’ingénierie des fonctionnalités. Puisque nous nous sommes déjà assurés InvoiceDate est un vrai Pandas datetime objet (grâce à parse_dates dans notre étape de chargement !), nous pouvons utiliser le extrêmement utile .dt accesseur.
Extraction des composants temporels
Pour comprendre la saisonnalité (mensuelle) et l’efficacité opérationnelle (horaire), nous allons créer quatre nouvelles colonnes.
- Année — Pour des comparaisons à long terme
- Mois — Pour identifier les pics saisonniers (par exemple, pointe du quatrième trimestre).
- DayName — Pour trouver le jour le plus chargé de la semaine.
- Heure — Pour déterminer les heures de pointe de fonctionnement.
Générons ces colonnes :
print(“\n — — Time Series Feature Extraction — -”)
# Extract Year, Month, DayName, and Hour from the InvoiceDate column
df[‘Year’] = df[‘InvoiceDate’].dt.year
df[‘Month’] = df[‘InvoiceDate’].dt.month
df[‘DayName’] = df[‘InvoiceDate’].dt.day_name()
df[‘Hour’] = df[‘InvoiceDate’].dt.hour
print(“New time features added: Year, Month, DayName, Hour.”)
print(df[[‘InvoiceDate’, ‘Year’, ‘Month’, ‘DayName’, ‘Hour’]].head())
Sortir:
--- Time Series Feature Extraction ---
New time features added: Year, Month, DayName, Hour.
InvoiceDate Year Month DayName Hour
0 2011-06-01 12:05:00 2011 6 Wednesday 12
1 2011-05-27 17:14:00 2011 5 Friday 17
2 2011-04-21 17:05:00 2011 4 Thursday 17
3 2011-11-16 10:39:00 2011 11 Wednesday 10
4 2011-03-10 08:40:00 2011 3 Thursday 8
Parfait! Nous pouvons passer directement à la cartographie des modèles de vente dans la section suivante.
Cartographie des modèles de vente (Time-Series Insights)
Avec nos fonctionnalités temporelles prêtes, nous pouvons désormais poser et répondre à nos questions sur le moment où les ventes ont lieu. Nous commencerons par grand (tendances mensuelles) et approfondirons petit (tendances horaires).
Insight 4 : Tendances des ventes par mois (saisonnalité)
L’agrégation mensuelle est cruciale pour le repérage saisonnalité— le schéma prévisible des ventes qui se répètent chaque année. Ces données sont utilisées pour les prévisions financières et la planification des niveaux de stocks pour la haute saison.
Nous allons regrouper par le Month colonne et calculez le revenu total pour chacun.
print(“\n — — Insight 4: Sales Trends by Month (Seasonality) — -”)
# Group by month and sum the revenue
monthly_revenue = df.groupby(‘Month’)[‘Revenue’].sum().sort_values(ascending=False)
# Print the results, which should show the seasonal peaks
print(monthly_revenue)
Sortir:
--- Insight 4: Sales Trends by Month (Seasonality) ---
Month
11 143576.360
1 142013.420
12 133178.980
10 119533.540
9 103929.420
3 72968.270
8 71302.890
5 70424.510
6 68722.520
7 68713.831
4 51882.010
2 50178.730
Name: Revenue, dtype: float64
Interprétation : la surprise massive du quatrième trimestre et de janvier
Les données montrent clairement que les ventes de NovaShop sont fortement asymétriques vers la fin de l’année, confirmant la tendance typique du commerce de détail. Rush du quatrième trimestre (octobre, novembre, décembre) .
- Pleine saison: Novembre est le mois le plus fréquenté, suivi de près par décembre. C’est le moment de faire le plein de Pots de rangement moyens en céramique et diffusez des publicités ciblées.
- La vague de janvier : Le deuxième mois le plus élevé est janvier ! C’est un excellent aperçu pour NovaShop. Cela suggère que les clients utilisent peut-être l’argent des cadeaux de Noël ou profitent des soldes d’après-fêtes. Cette période ne doit pas être considérée comme une crise mais comme une opportunité secondaire de ventes à gros volume.
- Basse saison :Février et avril sont les moins performants, ce qui aide NovaShop à planifier des budgets de personnel et de marketing inférieurs pendant ces périodes.
Insight 5 : Tendances des ventes par jour de la semaine et par heure (planification opérationnelle)
Alors que la saisonnalité concerne les finances et les stocks, les tendances quotidiennes et horaires concernent opérations. NovaShop peut l’utiliser pour planifier le personnel de l’entrepôt, optimiser les dépenses publicitaires et planifier les campagnes par e-mail.
Nous allons exécuter ici deux agrégations distinctes : une pour le jour de la semaine et une pour l’heure de la journée.
Revenus par jour de la semaine
# 1. Sales by Day of Week
daily_revenue = df.groupby(‘DayName’)[‘Revenue’].sum()
print(“\n — — Revenue by Day of Week — -”)
print(daily_revenue)
Sortir:
--- Revenue by Day of Week ---
DayName
Friday 163861.320
Monday 171026.230
Sunday 83125.890
Thursday 219342.980
Tuesday 282796.741
Wednesday 176271.320
Name: Revenue, dtype: float64
Interprétation : mardi est le jour du pouvoir
Les données révèlent un modèle clair et exploitable pour la semaine de travail :
- Ventes de pointe : Mardi domine absolument la semaine, générant près de 30 % de revenus en plus que le jour le plus chargé suivant, jeudi. C’est un jour privilégié pour lancer de nouveaux produits ou organiser des ventes flash à fort impact.
- Jours de crise : Sans surprise, les ventes chutent considérablement Dimanche. NovaShop pourrait considérer cela comme un jour peu prioritaire pour le marketing par e-mail ou le personnel du service client.
- Jour manquant : L’ensemble de données ne contient aucune transaction pour Samedi dans notre échantillon (ou peut-être l’ensemble complet, ce qui est courant dans les ensembles de données B2B).
Revenu par heure de la journée
# 2. Sales by Hour of Day
hourly_revenue = df.groupby(‘Hour’)[‘Revenue’].sum().sort_index()
print(“\n — — Revenue by Hour of Day — -”)
print(hourly_revenue)
Sortir:
--- Revenue by Hour of Day ---
Hour
7 2830.910
8 26597.800
9 76768.750
10 209809.971
11 115233.600
12 142474.460
13 130348.290
14 119241.520
15 145178.980
16 70620.550
17 36148.030
18 14022.790
19 4397.130
20 2751.700
Interprétation : Le boom de fin de matinée
Les données horaires pointent directement vers les besoins opérationnels :
- Pic massif : Les ventes explosent à 10 heures (heure 10), générant presque le double des revenus des heures suivantes. C’est le moment optimal pour NovaShop de lancer des campagnes de marketing par e-mail et sur les réseaux sociaux.
- Activité soutenue : Les ventes restent élevées de 11h00 à 15h00, ce qui suggère une bonne période de shopping à midi et après le déjeuner.
- Fin de journée :L’activité diminue fortement après 16 heures, avec très peu de revenus générés le soir (à partir de 19 heures). Cela indique que la clientèle de NovaShop est principalement basée au bureau et fait ses achats pendant les heures de travail traditionnelles.
Conclusion : préparer le terrain pour la segmentation de la clientèle
Nous avons officiellement terminé l’EDA robuste ! Nous savons ce qui se vend le mieux (le pot en céramique et les frais), où les ventes sont les plus fortes (au Royaume-Uni) et quand les ventes culminent (T4, mardi et 10 heures du matin).
Cependant, il nous manque encore la pièce la plus précieuse du puzzle : L’OMS. Les meilleures entreprises ne savent pas seulement ce qui se vend ; ils savent qui sont leurs clients les plus précieux et comment les fidéliser.
Dans la troisième partie, nous plongerons dans la technique d’analyse la plus avancée de cette série : la segmentation client RFM (Récence, Fréquence, Monétaire). Cela nous permettra de classer les clients en niveaux tels que « Champions », « Clients fidèles » et « À risque », donnant à NovaShop une véritable feuille de route pour un marketing personnalisé.
J’espère que vous avez trouvé cet article utile. N’hésitez pas à me dire bonjour sur l’une de ces plateformes. J’apprécie vraiment vos commentaires.



