Besoin

Le but de cette analyse est de voir quels sont les produits les plus achetés ensemble. Cela peut être utile pour prévoir des bundles, où récupérer des données pour créer un module de recommandation.

Il n’est pas possible de le faire actuellement dans la Viz de Biron car cela demande de pouvoir associer à un produit d’une commande tout les autres produits fait dans cette commande.

Nous pouvons contourner cette limite grâce au NexusQL.

Plan

Pour réaliser l’analyse, nous aurons besoin de plusieurs requêtes pour:

  1. Récupérer pour chaque commandes tous les produits de la commande
  2. Créer une table avec toutes les combinaisons de deux produits existant par commandes
  3. Récupérer le nombre de commande par produit
  4. Lier les deux précédentes requêtes pour avoir pour chaque produit les produits les plus acheté avec

Requêtes

Récupérer les produits des commandes

Dans cette première requête on cherche à avoir une ligne par commande et par produit. On va donc aller chercher :

SELECT
  DIMENSION( 'order_id' )                              AS `order_id`,
  DIMENSION( 'product_name' )                          AS `Produit - Nom`,
  metric( 'transactions_order_date.billing_n_orders' ) AS `Nb Commandes`
FROM
  datamodel
WHERE
    refDate BETWEEN '2022-01-01' AND '2022-12-31'
  AND DIMENSION( 'product_name' ) != 'na'
GROUP BY
  `order_id`,
  `Produit - Nom`

Créer la table des combinaison de produits

Ici je cherche à créer une table qui va me renvoyer une ligne par combinaison de produits dans la commande

Commande

ID Commande Produit
1 A
1 B
1 C

Table de combinaison

ID Commande Produit Produit Accompagnant
1 A B
1 A C
1 B A
1 B C
1 C A
1 C B
SELECT
	t1.`Produit principal`,
	t1.`Produit Accompagnant`,
	t1.`Nb Commandes` AS `Nb Commandes communes`,
	t2.`Nb Commandes` AS `Nb Commandes Produit Principal`,
	100 * round(`Nb Commandes communes` / `Nb Commandes Produit Principal`, 4) AS `% Commande Communes`
FROM
(SELECT
	t1.`Produit - Nom` AS `Produit principal`,
	t2.`Produit - Nom` AS `Produit Accompagnant`,
	sum(t1.`Nb Commandes`) AS `Nb Commandes`
FROM
	( SELECT
		  DIMENSION( 'order_id' )                              AS `order_id`,
		  DIMENSION( 'product_name' )                          AS `Produit - Nom`,
		  metric( 'transactions_order_date.billing_n_orders' ) AS `Nb Commandes`
	  FROM
		  datamodel
	  WHERE
		    refDate BETWEEN '2022-01-01' AND '2022-12-31'
	    AND DIMENSION( 'product_name' ) != 'na'
	  GROUP BY
		  `order_id`,
		  `Produit - Nom` ) AS t1
	INNER JOIN ( SELECT
		             DIMENSION( 'order_id' )                              AS `order_id`,
		             DIMENSION( 'product_name' )                          AS `Produit - Nom`,
		             metric( 'transactions_order_date.billing_n_orders' ) AS `Nb Commandes`
	             FROM
		             datamodel
	             WHERE
		               refDate BETWEEN '2022-01-01' AND '2022-12-31'
	               AND DIMENSION( 'product_name' ) != 'na'
	             GROUP BY
		             `order_id`,
		             `Produit - Nom` ) AS t2
	          ON t1.order_id = t2.order_id
WHERE
	t1.`Produit - Nom` != t2.`Produit - Nom`
GROUP BY
	t1.`Produit - Nom`, t2.`Produit - Nom`
ORDER BY
	`Nb Commandes` DESC) AS t1
	LEFT JOIN
	( SELECT
		             DIMENSION( 'product_name' )                          AS `Produit - Nom`,
		             metric( 'transactions_order_date.billing_n_orders' ) AS `Nb Commandes`
	             FROM
		             datamodel
	             WHERE
		               refDate BETWEEN '2022-01-01' AND '2022-12-31'
	               AND DIMENSION( 'product_name' ) != 'na'
	             GROUP BY
		             `Produit - Nom` ) AS t2
		ON t1.`Produit principal` = t2.`Produit - Nom`
WHERE
	`Nb Commandes Produit Principal` > 100
ORDER BY
	`% Commande Communes` DESC