Methodologie

Comment nous collectons et analysons les donnees

Une note de transparence. Ce que le systeme fait bien, ses limites actuelles, et pourquoi ces choix.

La collecte : 20 retailers, chaque jour

L'infrastructure de collecte couvre vingt retailers cosmetique actifs sur le marche francais : Yves Rocher, Sephora, Marionnaud, Nocibe, Douglas, L'Occitane, Clarins, Caudalie, La Roche-Posay, Vichy, Avene, Atida, EasyPara, Pharmashopi, Lookfantastic, Feelunique, et plusieurs marques en vente directe.

La collecte s'appuie sur Playwright pour les sites a rendu JavaScript obligatoire, et sur des requetes HTTP directes pour les autres. Les sites proteges par Cloudflare ou des heuristiques anti-bot sont traverses via ZenRows, un proxy rotatif avec contournement de CAPTCHA. Nous supposons que la protection anti-bot est presente par defaut — jamais de requetes naives sur les cibles sensibles.

Chaque session de collecte produit un snapshot : prix, note, nombre d'avis, disponibilite. Le resultat est une base de 47 412 snapshots sur la periode mars-avril 2026, couvrant 14 793 produits distincts issus de 794 marques.

Frequence et stabilite

La frequence de collecte varie selon le retailer et son niveau de volatilite prix. Yves Rocher est collecte quotidiennement. Les autres retailers sont mis a jour deux a trois fois par semaine en regime courant, avec une collecte quotidienne pendant les periodes de soldes ou de lancement detecte. La detection des nouveaux produits fonctionne en continu : un SKU absent de la base la veille et present aujourd'hui est flagge comme nouveau lancement et ajoute au flux prisme_new_products.

La consolidation : 229 CSVs vers un master propre

Les donnees brutes arrivent sous forme de CSVs par retailer et par jour. Un pipeline de normalisation les fusionne en un master de 14 793 produits et 47 412 lignes de snapshots. Ce pipeline applique plusieurs filtres de qualite automatiques.

Le premier filtre elimine les anomalies de prix evidentes. Un produit cosmetique dont le prix passe de 15 EUR a 0,15 EUR du jour au lendemain a ete collecte en centimes et non en euros — ce bug de parsing est detecte par un ratio de variation anormal et le snapshot est rejete. De meme, les prix superieurs a 2 000 EUR sont considers comme des erreurs de scraping et exclus.

Les noms de produits sont normalises : suppression des mentions de taille ou de variante dans le titre, harmonisation des accents et de la casse, deduplication par EAN quand il est disponible. Les categories sont normalisees dans un referentiel interne de 42 categories (creme_hydratante, serum, contour_yeux, etc.) via une combinaison de regles et de correspondances sur les categories retailer d'origine.

Le matching : 6 dimensions de proximite

Chaque produit Yves Rocher est confronte a l'ensemble du catalogue concurrent. Le score de proximite entre deux produits est calcule sur six dimensions :

Categorie normalisee

La dimension la plus discriminante. Un serum ne peut pas matcher une creme corps, meme si les prix sont proches. La categorie normalisee doit correspondre exactement, ou appartenir a un sous-ensemble adjacent defini manuellement.

Volume (ml)

L'ecart de volume tolere est de plus ou moins 30 % par defaut. Un produit de 30 ml ne match pas un produit de 200 ml — l'utilisation est differente, la comparaison de prix sans volume serait trompeuse.

Prix

Un facteur de ponderation sur l'ecart de prix. Les produits tres eloignes en prix (facteur >3x) sont deprioritises dans le matching, meme si les autres dimensions correspondent.

Ingredients actifs

Les ingredients sont extraits et normalises (acide hyaluronique, retinol, niacinamide, vitamine C, etc.). Le score augmente quand les formules partagent les memes actifs principaux.

Promesses produit (targets)

Anti-age, hydratant, eclat, purifiant, sensible — ces promesses sont extraites du titre, de la description et des tags retailer. Un matching sur les promesses garantit que les produits compares s'adressent au meme besoin consommateur.

Positionnement

Bio/naturel, prestige, masstige, pharmacie. Un produit Yves Rocher positionne 'bio naturel' ne devrait pas etre compare a un produit pharmaceutique sans nuance.

Le score final est une somme ponderee de ces six dimensions, normalise entre 0 et 100. Seuls les 40 concurrents au score le plus eleve sont conserves par produit YR pour l'affichage — les autres sont comptabilises dans les aggregats mais non stockes en detail.

Limitations actuelles

La transparence sur les limites du systeme fait partie de la proposition de valeur. Ce que vous voyez ici, c'est ce que le systeme peut prouver — pas ce qu'il suppose.

ZenRows — abonnement a renouveler

Le contrat ZenRows expire sous peu. Sur les trois derniers jours de collecte, les sites fortement proteges (Sephora, Nocibe, Douglas) ont un taux de collecte degrade. Les prix affiches pour ces retailers a partir du 10 avril sont les derniers prix confirmes, pas necessairement les prix actuels.

Atida — couverture partielle

Atida.fr a restructure son arborescence de categories en mars. Le crawler n'a pas encore ete mis a jour pour suivre la nouvelle structure — environ 30 % du catalogue Atida est manquant dans cette version.

Notes Sephora — stale sur certains segments

La note moyenne Sephora est calculee a partir du dernier snapshot disponible. Pour les produits Sephora non mis a jour depuis plus de 14 jours, la note affichee peut ne pas refleter les avis recents. Cette information est visible dans le champ last_update_date non expose dans cette demo.

Ingredients — extraction imparfaite

L'extraction des ingredients actifs depuis les descriptions produit n'est pas exhaustive. Les noms INCI longs, les variantes orthographiques et les langues melangees (FR/EN) reduisent la precision du matching ingredientspar produit. Environ 15 % des produits ont une liste d'ingredients incomplete.

NaN dans les donnees brutes

Certains champs numeriques (note, nb_reviews) sont absents pour des produits qui n'ont pas encore accumule d'avis ou dont le retailer ne publie pas cette information. Ces valeurs sont representees comme null dans le systeme — pas comme zero. Les moyennes sont calculees uniquement sur les valeurs disponibles.