⚡ Swarm Architecture

Customer segmentation framework + product recommendation seeds — FR + GB, 180-day window

# Customer segmentation framework + product recommendation seeds — FR + GB, 180-day window

Headline finding

The HDBSCAN segmentation surface is already in place (35 segments, 47,523 accounts) and 78% of accounts sit in the top 5 segments, but the existing segment_product_affinity z-score currently surfaces popularity rather than distinctiveness — family 021001 (welfare/pantry/coffee/snacks SKUs) ranks #1 for almost every premium and dormant segment, which means it cannot be used as-is for differentiated recs.

Supporting metrics

| Metric | FR | GB | Source | |---|---:|---:|---| | Segments with usable affinity rows | 33 | 30 | segment_product_affinity | | Accounts in top-5 segments / total | 17,823 / 24,760 (72%) | 19,168 / 22,763 (84%) | emergent_communities.dominant_features.country_breakdown | | Country × segment cells "rec-ready" (≥20 SKUs at z≥2) | 21 / 33 | 16 / 30 | rolled-up from segment_product_affinity | | Co-purchase pairs at lift ≥10 (decisive cross-sell) | 28,453 / 1,164,264 (2.4%) | 40,957 / 563,058 (7.3%) | product_co_occurrence | | Pairs with n_co_purchases ≥ 5 | 1,164,264 | 563,058 | product_co_occurrence (n≥5 floor) | | CH coverage | — | — | zero rows in either table |

Top distinctive families per anchor segment (z-score, freight/catalogue/flyer SKUs stripped):

| Segment (size) | FR top family (avg z) | GB top family (avg z) | |---|---|---| | Stable Multi-Stage Customers (24,123) | 021002 (10.31), 021001 (7.91), 008001-paper (5.79) | 021001 (12.73), 021002 (4.80), 008001-paper (4.74) | | High-RFM Quiet Buyers (3,713) | 021001 (8.07), 021002 (4.59), 005004 (2.88) | 021001 (8.49), 003003 (4.63), 003004 (3.10) | | Email-Engaged Premium (1,257) | 021001 (14.14), 003007 (4.32), 005004 (3.12) | 021001 (8.62), 001001 (4.95), 003004 (4.59) | | Cold Dormant Accounts (2,580) | 021001 (4.30), 003006 (1.16), 005005 (1.06) | 021001 (2.83), 001004 (2.54), 006001 (1.33) |

`chart {"type":"bar","data":{"labels":["Rec-ready (≥20 SKUs at z≥2)","Partial (5–19)","Thin (<5)"],"datasets":[{"label":"FR","data":[21,5,7],"backgroundColor":"#88a0c0"},{"label":"GB","data":[16,8,6],"backgroundColor":"#4a8aaa"}]},"options":{"plugins":{"legend":{"labels":{"color":"#e0e0e6"}},"title":{"display":true,"text":"Recommendation-readiness of segment × country cells","color":"#e0e0e6"}},"scales":{"y":{"ticks":{"color":"#888"}},"x":{"ticks":{"color":"#888"}}}}} `

Anomalies / risks / opportunities

  • Universal-popularity bleed: family 021001 (welfare/coffee/snacks SKUs — Haribo Starmix, Bosch coffee machine, ice-cream maker, thermal mug) ranks top-3 for both Email-Engaged Premium (z=14.1) and Cold Dormant Accounts (z=4.3) in FR. The z-score is computed against a population baseline that itself includes these everyone-buys items — recommending them won't differentiate. Operationally: layer a "distinctiveness" filter (e.g. require z_score_segment − max(z_score_other_segs) > 1) before serving.
  • Pseudo-product noise in the affinity table: the raw top-3 list per segment is dominated by FLYERS HAPPY NEW YEAR 26, SPECIAL PACKAGING AND SHIPPING CATA 2026, FREIGHT CHARGE — these are not products. They inflate n_accounts per segment and they account for the highest absolute z-scores (FR Stable seg PK25 CATALOGUE DIARIES STOCK z=82.5). Need a product_type_code / SKU-deny-list filter at the recommendation-serving layer.
  • CH gap: no rows in segment_product_affinity, product_co_occurrence, or emergent_communities.country_breakdown for CH. Briefing-tier surfaces don't cover it yet — compute_segment_affinity and compute_co_occurrence need a CH backfill run before the recommender can ship to CH.
1. Distinctiveness re-rank: If we re-rank segment_product_affinity to penalize items where ≥3 segments also rank them top-10, we predict the top-3 served SKUs for Email-Engaged Premium will shift away from family 021001 toward 001001 / 003004 (GB) and 005004 / 003007 (FR) — and segment-level click-through on the recommendation slot will rise by 10–20 pts (low confidence — no historical CTR baseline yet, only the FR-vs-GB lift-decisiveness gap of 7.3% vs 2.4% suggests GB has the headroom). 2. Co-occurrence anchor swap: If we replace the current "frequently bought together" widget on PDP for Stable Multi-Stage Customers with the top-3 product_co_occurrence pairs filtered to lift ≥10, basket-add rate from PDP should rise by 5–8% in GB (40,957 strong pairs available) and 2–4% in FR (28,453 strong pairs — thinner, lift bar may need to drop to ≥5). 3. Cold-Dormant reactivation: If we trigger an outbound email to the 2,580 Cold Dormant Accounts offering the segment-distinctive families (FR: 021001 small-format welfare; GB: 001004/006001), we predict reactivation conversion will land in the 0.8–2.0% range — bracketed by the Email-Engaged Premium segment's existing avg_score of 72.9 vs Cold Dormant's 39.9 (linear extrapolation against engagement score, low confidence: only two cohort anchors).