Programming

Warenkorbanalyse / market basket analysis in PHP / MySQL

• Bookmarks: 57


[av_heading tag=’h3′ padding=’10‘ heading=’Warenkorbanalyse / market basket analysis in PHP / MySQL‘ color=“ style=“ custom_font=“ size=“ subheading_active=“ subheading_size=’15‘ custom_class=“][/av_heading]

[av_textblock size=“ font_color=“ color=“]
See this Code in Action: http://ai.terragon-network.com/warenkorbanalyse.php

Facebook Group: Künstliche Intelligenz (KI) als Hobby
[/av_textblock]

[av_textblock size=“ font_color=“ color=“]
Schritt 1

Ausgabe des kompletten Datensatzes aus der Datenbank, mit den Bestellnummern und den zugehörigen Artikeln. Diese Tabelle könnte z.b. aus dem Warenwirtschaftssystem bzw dem Bestellwesen exportiert und in dieser komprimierten Form in einem MySQL-Datenbank eingelesen werden .

Indem Beispiel heißt die Tabelle einfach warenkorbanalyse und die Sortierung soll nach der Bestellnummer aufsteigend erfolgen.

In der Ausgabe wird dann pro Zeile einfach die Bestellnummer und eine Artikelnummer gegenübergestellt, so dass die Bestellnummer zwar öfters auftauchen kann, aber in Verbindung mit dem Artikel immer nur einmal.
[/av_textblock]

[av_codeblock wrapper_element=“ wrapper_element_attributes=“ escape_html=’aviaTBescape_html‘]
//Step1: Show complete Result Set from Database
echo “

Step1: Show complete Result Set from Database

„;
$result = mysql_query(„SELECT * FROM warenkorbanalyse ORDER BY orderid ASC“);
echo “

„; echo „“;
while ($row = mysql_fetch_assoc($result)) {
echo “
„;
};
echo “

ID Order ID Article ID
„.$row[„id“].“ „.$row[„orderid“].“ „.$row[„articleid“].“

„;
[/av_codeblock]

[av_image src=’http://blog.terragon.de/wp-content/uploads/2017/09/warenkorbanalyse1.jpg‘ attachment=’5069′ attachment_size=’full‘ align=’center‘ animation=’no-animation‘ link=“ target=“ styling=“ caption=“ font_size=“ appearance=“]
Warenkorbanalyse / market basket analysis in PHP / MySQL
[/av_image]

[av_textblock size=“ font_color=“ color=“]
Schritt 2

Aus dieser komplette Liste lassen wir uns jetzt nur die Bestellnummern ausgeben, ohne doppelte Einträge, so dass jede Bestellnummer nur einmal in der Liste auftaucht.

Dies lässt sich mit dem Befehl distinct gut lösen .
[/av_textblock]

[av_codeblock wrapper_element=“ wrapper_element_attributes=“ escape_html=’aviaTBescape_html‘]
//Step 2: Show only the DISTINCT OrderIDs
echo “

Step 2: Show only the DISTINCT OrderIDs

„;
$resultOrderIDs = mysql_query(„SELECT DISTINCT orderid FROM warenkorbanalyse ORDER BY orderid ASC“);
echo “

„; echo „“;
while ($row = mysql_fetch_assoc($resultOrderIDs)) {
echo “
„;
};
echo “

Order ID
„.$row[„orderid“].“

„;
[/av_codeblock]

[av_textblock size=“ font_color=“ color=“]
Schritt 3

Auf Basis der Liste der eindeutigen Bestellnummern, wird jetzt in einer ersten Schleife jeweils eine Bestellnummer gegriffen, und mit einer zweiten Schleife mit entsprechender Datenbankabfrage werden alle Artikel zu dieser Bestellnummer eingelesen.
[/av_textblock]

[av_codeblock wrapper_element=“ wrapper_element_attributes=“ escape_html=’aviaTBescape_html‘]
//Step 3: Show all ArticleIDs in one OrderID
echo “

Step 3: Show all ArticleIDs in one OrderID

„;
$resultOrderIDs = mysql_query(„SELECT DISTINCT orderid FROM warenkorbanalyse ORDER BY orderid ASC“);
echo “

„; echo „“;
while ($row = mysql_fetch_assoc($resultOrderIDs)) {
$orderid = $row[„orderid“];
echo “
„;
};
echo “

Order ID Article IDs
„.$orderid.“ „;
$resultArticlesInOrder = mysql_query(„SELECT * FROM warenkorbanalyse WHERE orderid = ‚$orderid‘ ORDER BY articleid ASC“);
while ($row2 = mysql_fetch_assoc($resultArticlesInOrder)) {
echo $row2[„articleid“].“ „;
};
echo „

„;
[/av_codeblock]

[av_textblock size=“ font_color=“ color=“]
Schritt 4

Jetzt wird die eigentlich relevante neue Tabelle erstellt, bzw jetzt werden die Daten ausgelesen und entsprechend für die Ausgabe vorbereitet.

Zuerst wird wieder mit distinct die Liste der eindeutigen Bestellnummern geladen, die dann in der ersten Schleife durchlaufen werden .

Danach für aus der Datenbank gelesen und schrittweise durchlaufen, wobei in jedem Schritt einen Artikel als Artikel 1 separat gespeichert wird .

Denn in der dritten Schleife werden wieder alle Artikel dieser Bestellnummer durchlaufen und der Artikel 2 aus der dritten Schleife wird dem Artikel 1 aus der zweiten Schleife gegenübergestellt , da sie beide in derselben Bestellnummer bestellt wurden .

Damit keine doppelten Pärchen kommen, wird vorher geprüft ob Artikel 1 und Artikel 2 identisch sind, ein neues Pärchen wird nur angelegt wenn es unterschiedliche Artikel aus derselben Bestellung sind .

In der dritten Schleife wird ein neues Ray gefüllt Komma bei dem der erste Schlüssel die Artikelnummer 1 ist, der zweite Schlüssel die Artikelnummer 2, und der Wert entsprechend die Anzahl der gemeinsamen Käufe.
[/av_textblock]

[av_codeblock wrapper_element=“ wrapper_element_attributes=“ escape_html=’aviaTBescape_html‘]
//Step 4: Create new Array with ArticleID combinations per OrderID
echo “

Step 4: Create new Array with ArticleID combinations per OrderID

„;
$resultOrderIDs = mysql_query(„SELECT DISTINCT orderid FROM warenkorbanalyse ORDER BY orderid ASC“);
$ArticleCorrelations = array();
$PreviousOrderid = „“;
while ($row = mysql_fetch_assoc($resultOrderIDs)) { // Pro Schritt 1 OrderID
$orderid = $row[„orderid“];

$resultArticlesInOrder = mysql_query(„SELECT * FROM warenkorbanalyse WHERE orderid = ‚$orderid‘ ORDER BY articleid ASC“);
while ($row2 = mysql_fetch_assoc($resultArticlesInOrder)) { // Pro Schritt 1 Article ID
$Article1 = $row2[„articleid“];

while ($row3 = mysql_fetch_assoc($resultArticlesInOrder)) { // Pro Schritt eine weitere ArticleID aus der Order
$Article2 = $row3[„articleid“];
if ($Article1 != $Article2) {$ArticleCorrelations[$Article1][$Article2] = $ArticleCorrelations[$Article1][$Article2]+1;};

};
};
};

echo “

";
print_r($ArticleCorrelations);
echo "

„;
[/av_codeblock]

[av_textblock size=“ font_color=“ color=“]
Schritt 5

Jetzt können wir das eben erstellte neue Array als Tabelle ausgeben , bei der die Artikelnummer 1, die Artikelnummer 2 und die Anzahl der gemeinsamen Käufe aufgelistet werden.

Je größer die Datenbasis ist, also je mehr einzelne Bestellungen vorliegen, wird es immer größere Summen an gemeinsamen Käufen geben.
[/av_textblock]

[av_codeblock wrapper_element=“ wrapper_element_attributes=“ escape_html=’aviaTBescape_html‘]
//Step 5: Show 2 dimensional Array
echo “

Step 5: Show the Array from Step 4 more beautiful

„;
echo “

„; echo „“;
foreach($ArticleCorrelations as $key => $value){
foreach($value as $key2 => $value2){
echo “
„;
};
};
echo “

Article with Article bought together
„.$key.“ „.$key2.“ „.$value2.“ x

„;
[/av_codeblock]

[av_textblock size=“ font_color=“ color=“]
Schritt 6

Jetzt wird das eben erstellte Array in eine Datenbank geschrieben, die dann von dem entsprechenden Onlineshop genutzt werden kann Punkt

Die Datenbank ist entsprechend einfach aufgebaut und besteht nur aus Artikel 1, Artikel 2, und der entsprechend der Anzahl der gemeinsamen Käufe.
[/av_textblock]

[av_codeblock wrapper_element=“ wrapper_element_attributes=“ escape_html=’aviaTBescape_html‘]
//Step 6: Insert all Combinations in a second Database
echo “

Step 6: Insert the Table (from Step 5) in a second Database

„;
mysql_query(„TRUNCATE TABLE `warenkorbanalyse2` „);
foreach($ArticleCorrelations as $key => $value){
foreach($value as $key2 => $value2){
mysql_query(„INSERT INTO warenkorbanalyse2 (article1, article2, combinations) VALUES (‚$key‘, ‚$key2‘, ‚$value2′)“);
};
};
[/av_codeblock]

[av_image src=’http://blog.terragon.de/wp-content/uploads/2017/09/warenkorbanalyse2.jpg‘ attachment=’5070′ attachment_size=’full‘ align=’center‘ animation=’no-animation‘ link=“ target=“ styling=“ caption=“ font_size=“ appearance=“]
Warenkorbanalyse / market basket analysis in PHP / MySQL
[/av_image]

[av_textblock size=“ font_color=“ color=“]
Schritt 7

Im letzten Schritt muss von dem Onlineshop nur noch in der neu angelegten Datenbank nach der gerade aufgerufenen Artikelnummer gesucht werden, und es werden alle mit dieser Artikelnummer verbundenen Artikel als Empfehlung zurückgegeben.

Damit die Zahl der empfohlenen Artikel nicht zu groß wird, bietet es sich an ein Limit einzubauen, z.b. auf maximal fünf oder zehn Empfehlungen.

Auch wird bei der Abfrage nach der Anzahl der gemeinsamen Bestellung sortiert, absteigend, sodass die Artikel die besonders häufig gemeinsam gekauft wurden zuerst empfohlen werden, und die Artikel die nur gelegentlich gemeinsam gekauft wurden erst später bzw nachrangig aufgeführt werden.
[/av_textblock]

[av_codeblock wrapper_element=“ wrapper_element_attributes=“ escape_html=’aviaTBescape_html‘]
//Step 7: Recommend 1 Article, that had the most combinations
echo “

Step 7: Show recommended Articles ordered by Relevance, selected from second Database (limited to 10)

„;
$ArticleBought = „2“;
echo “

„; echo „“;
$resultRecommendations = mysql_query(„SELECT * FROM warenkorbanalyse2 WHERE article1 = ‚$ArticleBought‘ OR article2 = ‚$ArticleBought‘ ORDER BY combinations DESC LIMIT 10 „);
while ($row = mysql_fetch_assoc($resultRecommendations)) {
if ($row[„article1″] == $ArticleBought) {echo “
„;};
if ($row[„article2″] == $ArticleBought) {echo “
„;};
};
echo “

If you buy Article recommended Articles ordered by Relevance:
„.$row[„article1″].“ „.$row[„article2″].“ „.$row[„article2″].“ „.$row[„article1″].“

„;
[/av_codeblock]

[av_textblock size=“ font_color=“ color=“]
See this Code in Action: http://ai.terragon-network.com/warenkorbanalyse.php

Facebook Group: Künstliche Intelligenz (KI) als Hobby
[/av_textblock]

57 recommended
comments icon0 comments
0 notes
638 views
bookmark icon

Write a comment...

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.