Quels articles vont ensemble ?
Un motif fréquent est un groupe d’articles que des clients achètent souvent ensemble, comme le pain et le beurre. La fouille de données (en anglais data mining) les cherche dans des milliers de paniers pour décider quoi ranger côte à côte.
Ici, vous apprenez à les compter à la main, puis avec un programme.
À la fin de cette leçon
Remarque
Je peux compter le support d’un groupe d’articles pour savoir s’il est fréquent.
Mots clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Panier | les articles d’un seul achat | |
| Groupe d’articles | un ou plusieurs articles pris ensemble | pain + beurre |
| Support | la part des paniers qui contiennent le groupe | |
| Seuil de support | le support minimal pour être gardé | |
| Motif fréquent | un groupe dont le support atteint le seuil | |
| Paire | un groupe de deux articles |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Un panier est une liste d’articles
Une épicerie garde la trace de chaque passage en caisse. Un panier est la liste des articles d’un seul achat. L’ordre ne compte pas : seule compte la présence de l’article.
Un groupe d’articles est un ou plusieurs articles pris ensemble. Le support d’un groupe est la part des paniers qui le contiennent tous. On compte ces paniers, puis on divise par le nombre total de paniers.
Exemple travaillé : huit paniers
| Panier | Articles | Contient pain ? | Contient pain et beurre ? |
|---|---|---|---|
| 1 | pain, beurre, lait | Oui | Oui |
| 2 | pain, beurre, confiture | Oui | Oui |
| 3 | lait, yaourt | Non | Non |
| 4 | pain, beurre, lait, confiture | Oui | Oui |
| 5 | pain, lait | Oui | Non |
| 6 | beurre, confiture | Non | Non |
| 7 | pain, beurre | Oui | Oui |
| 8 | lait, yaourt, sucre | Non | Non |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Le support se lit dans le tableau
Cinq paniers sur huit contiennent du pain : son support est 5 sur 8, soit 0,625. Quatre paniers sur huit contiennent à la fois le pain et le beurre : le support de la paire est 4 sur 8, soit 0,5.
Un groupe ne peut jamais avoir un support plus grand que celui d’un de ses articles. Ajouter un article ne fait que retirer des paniers.
Un seuil garde les groupes fréquents
Avec des milliers d’articles, le nombre de paires possibles est énorme. On fixe donc un seuil de support : un groupe est un motif fréquent s’il l’atteint.
Le seuil aide aussi à chercher moins. Si le lait est rare, aucune paire avec le lait ne peut être fréquente : on ne la compte même pas.
Compter les paires avec un seuil
paniers = [
["pain", "beurre", "lait"],
["pain", "beurre", "confiture"],
["lait", "yaourt"],
["pain", "beurre", "lait", "confiture"],
["pain", "lait"],
["beurre", "confiture"],
["pain", "beurre"],
["lait", "yaourt", "sucre"],
]
seuil = 3
comptes = {}
for panier in paniers:
for i in range(len(panier)):
for j in range(i + 1, len(panier)):
if panier[i] < panier[j]:
paire = panier[i] + "+" + panier[j]
else:
paire = panier[j] + "+" + panier[i]
if paire in comptes:
comptes[paire] = comptes[paire] + 1
else:
comptes[paire] = 1
for paire in comptes:
if comptes[paire] >= seuil:
print(paire, comptes[paire], "sur", len(paniers))
# Changez seuil en 2 et relancez : quelles paires apparaissent ?
Exemple travaillé : les paires comptées
| Paire | Paniers | Fréquente au seuil 3 ? |
|---|---|---|
| beurre + pain | 4 | Oui |
| beurre + confiture | 3 | Oui |
| lait + pain | 3 | Oui |
| beurre + lait | 2 | Non |
| confiture + pain | 2 | Non |
| lait + yaourt | 2 | Non |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une erreur fréquente
Attention
Beaucoup pensent qu’un groupe fréquent prouve que l’un des articles fait acheter l’autre. Ce n’est pas le cas : deux articles très populaires se retrouvent souvent ensemble par simple hasard. Le support dit seulement « souvent ensemble ». La leçon suivante donne l’outil pour aller plus loin.
Dans le labo, un jour est un panier
Le fichier hires.csv a une ligne par jour de 2025. Traitons chaque jour comme un panier de trois faits. Week-end si c’est un samedi ou un dimanche. Pluie si la météo est « rainy ». Plein si le loueur de vélos a fait 300 locations ou plus.
Les commandes suivantes comptent ces paniers. Elles lisent le fichier et n’écrivent rien.
Compter les jours de chaque fait
docker exec jupyter python3 -c "import csv; L = list(csv.DictReader(open('hires.csv'))); print(len(L), sum(1 for r in L if r['weekday'] in ('Sat', 'Sun')), sum(1 for r in L if r['weather'] == 'rainy'), sum(1 for r in L if int(r['hires']) >= 300))"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lire la ligne affichée
La commande affiche quatre nombres : le nombre de jours (365), puis les jours de week-end (104), de pluie (120) et pleins (131). Le support de « plein » est donc 131 sur 365.
Ces nombres ne disent encore rien des paires. La commande suivante compte les jours où deux faits arrivent ensemble.
Compter trois paires de faits
docker exec jupyter python3 -c "import csv; L = list(csv.DictReader(open('hires.csv'))); n = len(L); W = [r for r in L if r['weekday'] in ('Sat', 'Sun')]; R = [r for r in L if r['weather'] == 'rainy']; print([(k, round(k / n, 3)) for k in (sum(1 for r in W if int(r['hires']) >= 300), sum(1 for r in R if int(r['hires']) >= 300), sum(1 for r in W if r['weather'] == 'rainy'))])"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Pour aller plus loin
Dans votre carnet, ajoutez un quatrième fait à chaque jour : « soleil » si la météo est « sunny ». Comptez les paires avec « plein » et classez-les par support.
Dites laquelle est la plus fréquente, puis demandez-vous si elle prouve que le soleil fait louer des vélos.