W poszukiwaniu sobowtóra

Zazwyczaj wiemy co kupują nasi obecni klienci. Jakie artykuły kupili, kiedy je kupili, jakie kategorie kupują najczęściej, jakiej wartości były to zakupy. Jednak dużo trudniej znaleźć odpowiedź co mogli by jeszcze od nas kupić. Najczęstszą próbą poszukiwania odpowiedzi na to pytanie jest segmentacja/klasyfikacja klientów; klienci o podobnych cechach mają zbliżone potrzeby zakupowe.

Ale może istnieje lepszy sposób na zbudowanie modelu wzorcowego klienta? Czy możemy znaleźć sobowtóra naszego klienta który kupuje to samo i podpowie co jeszcze ponad to? Spróbujmy go odnaleźć.

Jakiś czas temu pisaliśmy o wykorzystaniu grafów w różnych dziedzinach; obliczanie odległości, relacje w mediach społecznościowych, wyszukiwanie anomalii oraz… rekomendowaniu produktów.

Klienci którzy kupili ten produkt…

Rekomendacje z którymi się najczęściej spotykamy w sklepach internetowych rozpoczynają się od „klienci którzy kupili ten produkt kupili również…”. Takie podpowiedzi to najczęściej proste zapytanie „wybierz z koszyków 5 najczęściej kupowanych produktów które były sprzedane z produktem X”. Bardzo często listy z rekomendacjami są statyczne. Są to np. na stałe powiązane produkty z kategorii do których należy produkt lub co jakiś czas uaktualniane listy powstałe w wyniku przeszukania historii zakupów klientów.

Możemy jednak tworzyć rekomendacje produktów w czasie rzeczywistym, dokładniejsze, bazujące na szerszym zbiorze danych. Technologia która umożliwia dostarczanie takich informacji to grafowe bazy danych. Grafowe bazy danych są podstawową platformą technologiczną gigantów internetowych, takich jak Google, Facebook i LinkedIn. Ale podczas gdy ci pionierzy musieli budować własne systemy od podstaw, gotowe rozwiązania - jak Neo4j - są teraz dostępne dla każdego.

Relacje miedzy klientami a produktami

Wyobraź sobie że mamy listę klientów, listę produktów oraz zakupy produktów dokonane przez tych klientów.

Jeśli ze wszystkich tych elementów utworzymy graf, utworzymy strukturę jaka znajduje się na obrazku poniżej. Graf składa się z wierzchołków („nodów”) – tutaj produktów i klientów – oraz krawędzi.

Naszym klientem jest Mati; drugi pomarańczowy węzeł od lewej strony. Nasze zapytanie rysujące całą strukturę na ekranie będzie mieć postać:

MATCH (n)

RETURN n

Co kupił nasz klient?

Wykonajmy kolejne zapytanie i wyświetlmy tylko zakupy których dokonał Mati.

MATCH (n:client {client_name: 'Mati'})-[r:PURCHASED]->(p:product)

RETURN n, r, p

Widzimy że kupił zapałki, dresy oraz wannę.

\

Co jeszcze mógłby kupić nasz klient?

A jakie inne produkty kupili klienci, którzy nabyli te same artykuły co Mati? Sprawdźmy to. Możemy zwizualizować rezultat w postaci węzłów i relacji, ale możemy także wyświetlić rezultat w postaci tabelarycznej. Powyższe zapytanie zwróci nam dane w postaci rekordów.

Szukamy sobowtóra naszego klienta

Chcielibyśmy jednak jeszcze lepiej dostosować rekomendacje. Szukamy klienta który jest sobowtórem Matiego – kupuje to samo co on. Znajdźmy zakupy klientów którzy kupili więcej niż jeden wspólny produkt z Matim. Ponieważ nasz graf jest niewielki, znajdźmy zakupy tych którzy mają dwa wspólne produkty z naszym klientem któremu zarekomendujemy inne produkty (w rzeczywistości tych wspólnych produktów byłoby znacznie więcej).

MATCH (c1:client {client_id: 100})-[:PURCHASED]->(p:product)<-[:PURCHASED]-(c2:client)

WITH c1, c2, collect(p) as commonProducts

WHERE size(commonProducts) >= 2

OPTIONAL MATCH (c2)-[:PURCHASED]->(p2:product)

WHERE NOT (c1)-[:PURCHASED]->(p2)

Return DISTINCT p2.product_id AS product_id, p2.product_name AS product_name

Lista rekomendacji zawiera tylko dwa produkty. Tylko jeden klient miał dwa wspólne zakupy z Matim i to jego zakupy, inne niż te których dokonał Mati, zostały zarekomendowane naszemu klientowi.

By jeszcze bardziej dostosować rekomendacje do preferencji klienta, możemy wziąć pod uwagę polubienia artykułu, częstotliwość zakupów danego produktu (im większe ilości, tym rekomendacja silniejsza).


Powyższe przykłady powstały przy użyciu Neo4j – grafowej bazy danych. Język zapytań to Cypher Query Language (w skrócie Cypher).