Une analyse du panier qui tient compte de l'ordre. PrefixSpan cherche les enchaînements qui reviennent dans des milliers de parcours : pages vues avant un achat, produits achetés après un premier achat, étapes d'un dossier. Les étapes n'ont pas besoin d'être consécutives : « produit, puis plus tard panier » compte même avec des pages entre les deux.
On relit 3 000 parcours de visiteurs comme des phrases. On cherche les suites de mots qui reviennent souvent dans le même ordre, même quand d'autres mots s'intercalent.
On garde les pages vues dans au moins x % des sessions : ce sont les motifs de longueur 1.
Pour chaque motif fréquent, on ne garde de chaque session que ce qui suit sa première occurrence. C'est la base projetée : bien plus petite que les données de départ.
Dans la base projetée, les pages fréquentes prolongent le motif : « produit » devient « produit > panier », puis « produit > panier > paiement ». On s'arrête quand plus rien n'atteint le support minimum.
Une ligne par page vue : identifiant de session, rang de l'étape, type de page (accueil, catégorie, produit, panier, paiement, confirmation, sortie).
Sur le jeu d'exemple, 181 motifs dépassent 5 % des sessions. On y lit les habitudes de navigation (37 % des sessions passent d'une catégorie à une fiche produit, 21 % comparent plusieurs produits) et l'entonnoir d'achat : 20 % mettent au panier, 13 % atteignent le paiement, 8 % confirment.
Le support d'un motif est la part des sessions qui le contiennent. En comparant deux motifs successifs, on mesure les abandons : un tiers des sessions qui atteignent le paiement ne vont pas jusqu'à la confirmation. C'est là qu'il faut chercher d'abord.
Noms donnés pour R (arulesSequences, algorithme SPADE) et pour la version Python écrite à la main.
Part minimale de sessions contenant le motif. Il contrôle à la fois le temps de calcul et la quantité de motifs à lire. 5 % est raisonnable sur quelques milliers de sessions.
Nombre maximal d'étapes dans un motif. 3 ou 4 étapes suffisent pour la plupart des analyses de parcours et évitent l'explosion combinatoire.
En R, cspade peut imposer un écart maximal entre deux étapes du motif. Sans cette contrainte, « produit » vu au début et « panier » vu vingt pages plus loin comptent comme un enchaînement.
# Parcours web : motifs séquentiels en R
library(arulesSequences)
parcours <- read.csv("parcours_web.csv")
parcours <- parcours[order(parcours$id_session, parcours$etape), ]
# Une transaction par page vue, rattachée à sa session et à son rang
seqs <- as(as.list(parcours$page), "transactions")
transactionInfo(seqs) <- data.frame(sequenceID = parcours$id_session, eventID = parcours$etape)
# Pas de PrefixSpan de référence sur CRAN : cspade (algorithme SPADE) trouve les mêmes motifs
motifs <- cspade(seqs, parameter = list(support = 0.05, maxlen = 4),
control = list(verbose = FALSE))
res <- as(motifs, "data.frame")
cat(nrow(res), "motifs fréquents\n")
# On écarte accueil et sortie, présents dans toutes les sessions
utiles <- res[grepl("},{", res$sequence, fixed = TRUE) & !grepl("accueil|sortie", res$sequence), ]
print(head(utiles[order(-utiles$support), ], 6))
# L'entonnoir d'achat, retrouvé sans l'avoir décrit à l'algorithme
entonnoir <- c("<{produit},{panier}>", "<{produit},{panier},{paiement}>",
"<{produit},{panier},{paiement},{confirmation}>")
print(res[res$sequence %in% entonnoir, ])
# Parcours web : motifs séquentiels (PrefixSpan) en Python
from collections import Counter
import pandas as pd
parcours = pd.read_csv("parcours_web.csv").sort_values(["id_session", "etape"])
sessions = parcours.groupby("id_session")["page"].apply(list).tolist()
def prefixspan(prefixe, base, support_min, motifs, long_max=4):
# Nombre de sessions où chaque page apparaît après le préfixe
comptes = Counter(page for seq in base for page in set(seq))
for page, n in comptes.items():
if n >= support_min:
motif = prefixe + [page]
motifs.append((" > ".join(motif), len(motif), n, round(n / len(sessions), 3)))
if len(motif) < long_max:
# Base projetée : la suite de chaque session après la première occurrence de la page
projetee = [seq[seq.index(page) + 1:] for seq in base if page in seq]
prefixspan(motif, projetee, support_min, motifs, long_max)
motifs = []
prefixspan([], sessions, 0.05 * len(sessions), motifs) # au moins 5 % des sessions
res = pd.DataFrame(motifs, columns=["motif", "longueur", "sessions", "support"])
print(len(res), "motifs fréquents")
# On écarte accueil et sortie, présents dans toutes les sessions
utiles = res[(res["longueur"] >= 2) & ~res["motif"].str.contains("accueil|sortie")]
print(utiles.sort_values("sessions", ascending=False).head(6).to_string(index=False))
# L'entonnoir d'achat, retrouvé sans l'avoir décrit à l'algorithme
entonnoir = ["produit > panier", "produit > panier > paiement", "produit > panier > paiement > confirmation"]
print(res.set_index("motif").loc[entonnoir, ["sessions", "support"]])
Les règles d'association regardent ce qui est présent ensemble dans un même panier, sans ordre. Les motifs séquentiels regardent l'ordre dans le temps : A puis B n'est pas le même motif que B puis A.
Les deux trouvent les mêmes motifs séquentiels fréquents. PrefixSpan prolonge les motifs en projetant les séquences sur leur suffixe. SPADE stocke, pour chaque motif, la liste des séquences et positions où il apparaît et les croise, à la manière d'Eclat.
Le package prefixspan sur PyPI en propose une implémentation. L'algorithme est aussi assez court pour être écrit à la main, comme dans l'exemple de cette fiche. Sur de très gros volumes, Spark MLlib propose une version distribuée.
Cherche ce qui est acheté ensemble dans un même panier, pas ce qui vient avant ou après.
Voir la fiche → pour prévoir l'étape suivanteDonne la probabilité de passer d'une page à une autre. Moins de motifs à lire, mais un modèle qui prédit.
Voir la fiche → le cousin rapideMême logique de motifs fréquents, sur des paniers sans ordre. Utile quand l'ordre n'apporte rien.
Voir la fiche →Dataistudio forme les équipes au machine learning et à l'IA, sur des cas concrets.
Nous utilisons des cookies de mesure d'audience et de suivi publicitaire pour comprendre la fréquentation du site et l'efficacité de nos annonces. Rien n'est déposé sans votre accord. En savoir plus