2010-07-21 2 views
8

Ich erstelle eine E-Commerce-Site, und ich habe Probleme, einen guten Algorithmus zu entwickeln, um Produkte, die aus der Datenbank gezogen werden, in halbwegs passende Gruppen zu sortieren. Ich habe versucht, einfach den höchsten Preis in 4 zu teilen und jede Gruppe davon abzugrenzen. Ich habe auch Standardabweichungen basierend auf dem Mittelwert versucht. Beides könnte zu Preisspannen führen, in die kein Produkt fallen würde, was keine nützliche Filteroption darstellt.Preisfilter Gruppierungsalgorithmus

Ich versuchte auch Quartile der Produkte zu nehmen, aber mein Problem ist, dass der Preis von $ 1 bis $ 4000 reicht. Die $ 4.000 werden fast nie verkauft und sind weit weniger wichtig, aber sie verfälschen meine Ergebnisse.

Irgendwelche Gedanken? Ich sollte mehr Aufmerksamkeit in Statistiken Klasse bezahlt ...

Update:

Ich landete Methoden ein wenig zu kombinieren. Ich habe die quartile/bucket-Methode verwendet, aber ich habe sie ein wenig gehackt, indem ich bestimmte Bereiche fest geschrieben habe, in denen eine größere Anzahl von Preisgruppen erscheinen würde.

//Price range algorithm 

sort($prices); 

//Divide the number of prices into four groups 
$quartilelength = count($prices)/4; 

//Round to the nearest ... 
$simplifier = 10; 

//Get the total range of the prices 
$range = max($prices)-min($prices); 

//Assuming we actually are working with multiple prices 
if ($range>0) 
{ 
    // If there is a decent spread in price, and there are a decent number of prices, give more price groups 
    if ($range>20 && count($prices) > 10) 
    { 
     $priceranges[0] = floor($prices[floor($quartilelength)]/$simplifier)*$simplifier; 
    } 

    // Always grab the median price 
    $priceranges[1] = floor($prices[floor($quartilelength*2)]/$simplifier)*$simplifier; 

    // If there is a decent spread in price, and there are a decent number of prices, give more price groups 
    if ($range>20 && count($this->data->prices) > 10) 
    { 
     $priceranges[2] = floor($prices[floor($quartilelength*3)]/$simplifier)*$simplifier; 
    } 
} 
+0

Es klingt wie wenn Sie die Produktinformationen (die nur Preise enthält) mit den tatsächlichen Verkaufsinformationen anreichern, dann werden Sie in der Lage sein, eine bessere Aufteilung durchzuführen (obwohl ich noch nicht weiß) –

Antwort

2

Hier ist eine Idee: im Grunde würden Sie den Preis in Eimer 10 sortieren, jeder Preis als Schlüssel im Array ist der Wert eine Zahl, wie viele Produkte in der gegebenen Preisklasse ist:

public function priceBuckets($prices) 
{  
    sort($prices); 

    $buckets = array(array()); 
    $a = 0; 

    $c = count($prices); 
    for($i = 0; $i !== $c; ++$i) { 
     if(count($buckets[$a]) === 10) { 
      ++$a; 
      $buckets[$a] = array(); 
     } 

     if(isset($buckets[$a][$prices[$i]])) { 
      ++$buckets[$a][$prices[$i]]; 
     } else if(isset($buckets[$a - 1][$prices[$i]])) { 
      ++$buckets[$a - 1][$prices[$i]]; 
     } else { 
      $buckets[$a][$prices[$i]] = 1; 
     } 
    } 

    return $buckets; 
} 

//TEST CODE 
$prices = array(); 

for($i = 0; $i !== 50; ++$i) { 
    $prices[] = rand(1, 100); 
} 
var_dump(priceBuckets($prices)); 

Aus dem Ergebnis können Sie Reset und Ende verwenden, um die Min/Max jedes Buckets zu erhalten

Ein bisschen rohe Gewalt, aber könnte nützlich sein ...

+0

Dies ist ähnlich wie meine Ansatz, wo ich die Quartile nahm, außer dass Sie 10 Gruppen statt 4 auswählten. Ich denke, dies ist einer der vielversprechendsten Ansätze, mein einziges Problem ist, dass es in ungeraden Preisklassen resultiert, auch wenn sie eine gute Darstellung der Daten sind. Mit anderen Worten, ich könnte mit Preisspannen zwischen 15,47 und 152,87 enden. Jeder Bucket kann eine gleichmäßige Verteilung haben, aber die Preisgrenzen sind willkürlich und verwirrend. –

0

Was genau suchen Sie als Ihr Endergebnis (könnten Sie uns eine Beispielgruppierung geben)? Wenn Ihr einziges Ziel darin besteht, dass alle Gruppen eine signifikante Anzahl an Produkten haben, die wichtig genug sind, dann können Sie selbst dann, wenn Sie den perfekten Algorithmus für Ihren aktuellen Datensatz finden, nicht mit dem Datensatz von morgen arbeiten. Abhängig von der Anzahl der Gruppen von Gruppen, die Sie benötigen, würde ich einfach beliebige Gruppen erstellen, die Ihren Bedürfnissen entsprechen, anstatt einen Algorithmus zu verwenden. Ex. ($ 1 - $ 25, $ 25-100, $ 100 +). Aus der Perspektive des Verbrauchers verteilt mein Verstand natürlich Produkte in 3 verschiedene Preiskategorien (billig, Mittelklasse und teuer).

0

Ich denke, du denkst zu viel.

Wenn Sie Ihre Produkte kennen, und Sie feinkörnige Ergebnisse mögen, würde ich einfach diese Preisbereiche hart codieren. Wenn Sie denken, dass $ 1 bis $ 10 sinnvoll sind für das, was Sie verkaufen, dann geben Sie es ein, Sie brauchen keinen Algorithmus. Führen Sie einfach einen Check durch, so dass Sie nur Bereiche mit Ergebnissen anzeigen.

Wenn Sie Ihre Produkte nicht kennen, würde ich nur alle Produkte nach Preis sortieren, und teilen Sie es in 4 Gruppen von gleicher Anzahl von Produkten. Hier

3

ist eine Idee, nach der Linie der Gedanke an meinen Kommentar:

Ich nehme an, Sie haben eine Reihe von Produkten, von denen jeder durch einen Preis markiert und ein Umsatzvolumen Schätzwert (als Prozentsatz vom Gesamt Der Umsatz). Sortiere zuerst alle Produkte nach ihrem Preis. Als nächstes starten Sie das Teilen: Durchqueren Sie die geordnete Liste und akkumulieren Sie das Verkaufsvolumen. Jedes Mal, wenn Sie etwa 25% erreichen, schneiden Sie dort. Wenn Sie dies dreimal tun, führt dies zu 4 Teilmengen mit disjunkten Preisspannen und einem ähnlichen Umsatzvolumen.