Aux TechDays, il y a bientôt 6 mois, nous avions abordé avec Romuald Coutaud le scénario de
Forecasting depuis un cube OLAP, avec insertion des prévisions dans le cube. J'ai eu l'idée d'un scénario alternatif de démonstration de la complémentarité du DataMining et de l'OLAP: l'utilisation d'algorithmes de Cross-Selling en compléments d'un outil d'analyse multidimensionnelle.
L'idée générale est d'ajouter via une action la potentialité pour l'opérateur de voir à la demande, depuis son frontal,
pour chaque client une liste d'items à recommander,
en passant par le mécanisme de Rowset actions et du DMX.Pour l'exemple j'ai construit un tout petit cube: c'est un sous-set de celui d'AdventureWorks2008DW: seulement 3 dimensions: Customer, Product et Time (RPD 3 fois) sur la FactInternetSales dont seules les mesures OrderQuantity et SalesAmount on été créées.

Sur ce cube, j'ai construit un MiningModel d'Association Rules, basé sur Customer en
Case et Product en
Nested - le bridge N-N se faisant implicitement via le groupe de mesures lorsque l'on crée des modèles en source OLAP.

Les deux étapes à suivre sont donc:
- Création d'une action sur les membres de la dimension Customer
- Exécution d'une requête DMX contextuelle sur cette action, et renvoi en rowset des prédictions.
La requête DMX se décompose elle même en deux parties:
- Appel de la fonction PredictAssociation qui prend en paramètre la table imbriquée à prédire (ici les futurs produits à acheter)
- Jointure du modèle avec deux requêtes MDX: une pour récupérer le client (SHAPE) et une autre pour récupérer les produits achetés par celui-ci (APPEND), ces deux requêtes reliées logiquement par l'ID client (RELATE..ON).
Pour chaque client on obtient donc prédictions de produits intéressants (5 étant la valeur donnée à PredictAssociation).
SELECT FLATTENED PredictAssociation([Products],5) FROM [CrossSellingByCustomer_MAR] PREDICTION JOIN SHAPE { SELECT {[Measures].[Order Quantity]} ON 0, {[Customer].[Customer].&[28187]} ON 1 FROM [OLAPCrossSellingCube] } APPEND ( { SELECT {[Measures].[Order Quantity]} ON 0, NON EMPTY {[Customer].[Customer].&[28187]*[Product].[Product].[All].Children} ON ROWS FROM [OLAPCrossSellingCube] } RELATE [[Customer]].[Customer]].[Customer]].[MEMBER_CAPTION]]] TO [[Customer]].[Customer]].[Customer]].[MEMBER_CAPTION]]] ) AS n AS t ON [CrossSellingByCustomer_MAR].[Products].[Product] = t.n.[[Product]].[Product]].[Product]].[MEMBER_CAPTION]]]
|
Il ne reste plus qu'à créer une action de cube, de type
Rowset (renvoi de lignes) qui prend en instruction une chaîne de caractères à envoyer au serveur Analysis Services.
Cette action est paramétrée en déclenchement sur les
membres de la hiérarchie utilisateur de la dimension Client. Cela signifie que dans un client compatible (Excel, OWC...) tout clic droit sur un membre à ce niveau donnera un menu contextuel permettant de déclencher cette action, et donc d'afficher une
boîte modale contenant les prédictions effectuées pour ce membre. Le statement déclenché pour ce faire sera notre instruction DMX, en remplaçant simplement les IDs du client - en dur ci dessus - par celui du membre courant dans la hiérarchie utilisateur, via l'appel à "
CurrentMember.UniqueName" (MDX).
Une fois le cube déployé on peut voir que l'action est disponible lorsque l'on browse par la bonne hiérarchie...

Ce qui permet d'afficher les prédictions pour ce membre...

Cela marche évidemment aussi pour Excel:

Quelles sont les applications de ce genre de fonctionnalités? Cela permet de voir le cube non seulement comme outil d'analyse, mais aussi et surtout comme outil non plus passif mais actif pour des interlocuteurs fonctionnels.
Le cube permet d'analyser quelles ont été les ventes (OLAP simple) quelles seront les ventes (OLAP avec données forecastées, tel que montré aux TechDays) mais aussi d'optimiser le processus de vente, en proposant les bonnes offres aux bons prospects, via une méthode éprouvée, le tout de manière intégrée et facile à mettre en oeuvre.
Voilà, en espérant vous donner des idées.
A bientôt!