INSIGHTS Das könnte dir auch gefallen! Recommendations als Shoppingberater

ABOUT YOU TECH

ABOUT YOU TECH

5 min read

Autor: Martin Schulz

Die Herausforderungen aus der realen Welt online meistern

Bei AboutYou haben wir das Ziel, Online Shopping zu einem echten Einkaufserlebnis zu machen. Was dabei in der digitalen Welt fehlt, ist die fachkundige Beratung, um neue Produkte oder Styles zu zeigen, die einem Kunden ebenfalls gefallen könnten.
Eine typische Beratung im Fachgeschäft schlägt dabei entweder Produkte vor, die man kombinieren kann, oder aber Alternativen zu einem bestimmten Kleidungsstück. Kunden haben dabei natürlich eine Vorliebe für den Stil ihrer Lieblingsmarke. Sollte von dieser Marke kein entsprechendes Exemplar mehr verfügbar sein, ist der Shoppingberater gefragt. Welche ähnlichen Marken könnten dem Kunden gefallen? Welche Marken haben einen ähnlichen Stil? Was kaufen Kunden noch, die diese Marke mögen? Gibt es Marken, die oft zusammen gekauft werden?
Der Online Shop muss ohne die Erfahrung eines richtigen Verkäufers auskommen. Dafür hat er in der Regel einen anderen Vorteil. Eine große Menge an Daten, die Fähigkeit sich an alle Ereignisse zu erinnern und Rückschlüsse daraus zu ziehen. Diese Fähigkeit möchte ich euch heute vorstellen.

Erfahrung des Verkäufers simulieren

Um die Erfahrung eines fachkundigen Verkäufers zu simulieren, benötigen wir dessen Erfahrung — z.B. die tatsächlichen Käufe unserer Kunden. Um die Datenmenge robuster zu gestalten, greifen wir hier auf ein korrelierendes Ereignis zurück, dem AddToBasket Event. (Damit wird angezeigt, ob ein Nutzer ein Produkt einer bestimmten Marke seinem Warenkorb hinzugefügt hat — unabhängig davon, ob er dieses später auch tatsächlich gekauft hat.)

Das Wissen über das Verhalten der Kunden soll dann dazu genutzt werden, um dem Kunden entsprechend ähnliche Marken zu empfehlen. Das Verfahren hierbei nennt man „kollaboratives Filtern“.

Dabei besteht die Annahme, dass zwei Nutzer, welche die gleiche Marke kaufen, einen ähnlichen Geschmack haben. Bevorzugt also ein Nutzer N die Marke A, wird das Verhalten aller anderen Nutzer, welche ebenfalls die Marke A in den Warenkorb gelegt haben, ausgewertet.

Die Marken die diese am meisten ausgewählt haben, sind potenziell für Nutzer N Interessant.

Berechnung der Verhaltensmuster

Unsere Event-Daten (Interaktionen unserer Kunden mit unserem Online Shop) der letzten vier Monate werden mittels Scala von der Google Big Query Datenbank geladen und transformiert. Dabei erhalten wir die anonymisierten AddToBasket Events aller Kunden. Dieses Ereignis wird jedesmal ausgelöst, wenn ein Kunde einen Artikel in seinen Warenkorb legt — eindeutig ein Zeichen, dass der Kunde den Artikel mag.
Für jede Marke entsteht so ein Vektor mit Einträgen, welcher Kunde diese Marke bereits in den Warenkorb gelegt hat (1) oder nicht (0). Hierbei greifen wir auf alle Kundendaten zu, da wir die Berechnung derzeit via Spark sehr schnell durchführen können und ein vorheriges zusätzliches Ermitteln der n ähnlichsten Kunden nicht notwendig ist (wie sonst üblich). Außerdem erhalten wir so ein zuverlässigeres Ergebnis für eine globale Markenähnlichkeit in unserem Shop, anstatt eine Ähnlichkeit für bestimmte Kundencluster.

Wir können also zwei Listen von Kunden A und B, welche die Marke b1 in der Liste A und b2 in der Liste B in den Warenkorb getan haben, als Vektoren aus Nullen und Einsen ausdrücken. Diese haben dann die Länge, die der Gesamtanzahl an Kunden entspricht die schon einmal ein Produkt in den Warenkorb gelegt haben.
Nennt man diese beiden Vektoren bx und by, so wird die Kosinus-Ähnlichkeit zwischen ihnen berechnet als:

Haben z.B. Marke A die Kunden k1, k3 und k5 in den Warenkorb getan und Marke B die Kunden k2 und k3, so ergeben sich die Listen und Vektoren zu:

Die Kosinus-Ähnlichkeit berechnet sich nun daraus wie folgt:

Für insgesamt n Marken b1 bis bn ergibt sich die Ähnlichkeitsmatrix aller Marken D1 dann als:

Der erhaltene Wert zwischen 0 und 1 spiegelt die Ähnlichkeit der entsprechenden Marken wider. Nun haben wir aber nicht nur 2 Marken, sondern ca. 1000. Dementsprechend entsteht eine 1000 x 1000 Matrix, wobei die Hälfte der Felder abzüglich der Diagonale berechnet werden muss — sprich 499500 Einträge.

Mit Spark ist es möglich, die entsprechenden Berechnungen auf mehreren Rechner verteilt durchzuführen.

Alle Ähnlichkeiten, die einen bestimmten Threshold t nicht überschreiten werden auf Null gesetzt.

Damit wird verhindert, dass kleine Marken, die von wenigen Kunden in den Warenkorb gelegt wurden, eine überproportional große Ähnlichkeit mit großen Marken haben, welche von vielen Kunden in den Warenkorb gelegt wurden.

So ergibt sich die Matrix D.

Der größte Wert d1n mit n != 1 in D bestimmt für die Marke b1 die ähnlichste Marke bn.

Werden m verschiedene Marken angefragt, so wird die simultane Ähnlichkeit S von jeder anderen Marke bj zu allen m Marken wie folgt berechnet:

Dabei ist Idij > 0 die Indikatorfunktion für Dij > 0, das bedeuted, sie nimmt den Wert 1 an, falls dij > 0, andernfalls 0.

Dadurch wird sichergestellt, dass eine Marke, die mit vielen der angefragten ähnlich ist vor einer Marke, die mit weniger Marken ähnlich ist, aber in der Summe der Ähnlichkeiten einen höheren Wert hätte.
Ein ausführliches Beispiel dazu:

Für 10 Kunden und 5 Marken könnten sich diese Markenvektoren ergeben:

Daraus ergibt sich die folgende Ähnlichkeitsmatrix:

Mit einem Threshold von t = 0.25 ergibt sich daraus:

Werden nun die beiden Marken b1 und b2 angefragt, so ergeben sich die simultanen Ähnlichkeiten der anderen 3 Marken zu diesen beiden als:

Hier sieht man, dass die einfache Ähnlichkeit von b3 zu b1 höher ist, als beide Ähnlichkeiten von b4 zu b1 und b4 zu b2 in der Summe, die Korrektur über den Faktor 2 aber dazu führt, dass die Marke b4, da sie sowohl zu b1 als auch zu b2 ähnlich ist, vor der Marke b3 angezeigt wird.

Prozessübersicht
Um das oben beschriebene Konzept umzusetzen, greifen wir auf die Technologien Scala und Spark zurück, mit welchen wir unsere Google Analytics Daten via der Google BigQuery API auslesen und die oben genannten Transformationen vornehmen.

Die berechneten Ähnlichkeiten werden anschließend in einem ElasticSearch Index abgelegt. Dieser Vorgang wird derzeit einmal täglich durchgeführt.

Auf diesen Index greift ein PHP Service zu, der bei einer entsprechenden Shop Anfrage die Ähnlichkeiten der einzelnen angefragten Marken aus dem ElasticSearch Index ausliest, sowie die Anpassung der einzelnen Ähnlichkeiten abhängig vom Threshold vornimmt und diese Marken nach ihrer nun berechneten Gesamtähnlichkeit zu der/den angefragten Marke/n sortiert. Das Ergebnis wird dann dem Shop übergeben, sowie in einen Cache geschrieben. Bei sich wiederholenden Anfragen in einem bestimmten Zeitraum, werden diese Ähnlichkeiten dann nicht neu berechnet sondern aus diesem Cache ausgelesen.

Der Shop gibt anschließend diese Marken an den Kunden weiter und schlägt entsprechende Produkte vor.

Wie ihr seht, ist es gar nicht so schwer, einen Recommender zu schreiben, um Ähnlichkeiten bestimmter Produkte oder Marken zu berechnen. Was man mit den Ergebnissen danach anstellt, ist eine andere Frage…. :-)