2010-07-21 13 views
8

Estoy creando un sitio de comercio electrónico y tengo problemas para desarrollar un buen algoritmo para clasificar los productos que se extraen de la base de datos en grupos intermedios. Intenté simplemente dividir el precio más alto en 4 y basarlo en cada grupo. También probé desviaciones estándar basadas en la media. Ambos podrían resultar en rangos de precios en los que no caería ningún producto, lo que no es una opción de filtrado útil.Algoritmo de agrupamiento del filtro de precios

También intenté tomar cuartiles de los productos, pero mi problema es que el precio oscila entre $ 1 artículos y $ 4,000. Los $ 4,000 casi nunca se venden, y son mucho menos importantes, pero siguen sesgando mis resultados.

¿Alguna idea? Debería haber prestado más atención en clase estadísticas ...

Actualización:

Terminé la combinación de métodos un poco. Utilicé el método de cuartil/cubo, pero lo pirateé un poco al codificar ciertos intervalos dentro de los cuales aparecería un mayor número de grupos de precios.

//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

Parece que si enriquece la información del producto (que contiene solo los precios) con la información de ventas real, entonces podrá realizar una mejor división (aunque aún no sé cómo) –

Respuesta

2

He aquí una idea: básicamente, que lo solucionaría el precio en cubos de 10, cada precio como la clave de la matriz, el valor es un conteo de la cantidad de productos se encuentran en el punto de precio dado:

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)); 

Del resultado, puede usar el reinicio y el final para obtener el min/max de cada segmento

Un poco de fuerza bruta, pero podría ser útil ...

+0

Esto es similar a mi enfoque donde tomé los cuartiles, excepto que eligió 10 grupos en lugar de 4. Creo que este es uno de los enfoques más prometedores, mi único problema es que resulta en rangos de precios impares, incluso si son una buena representación de los datos. En otras palabras, podría terminar con rangos de precios como $ 15.47 a $ 152.87. Cada cubo puede tener una distribución uniforme, pero los límites de precio son arbitrarios y confusos. –

0

¿Qué es exactamente lo que está buscando como resultado final (podría darnos un ejemplo de agrupación)? Si su único objetivo es que todos los grupos cuenten con un número significativo de productos lo suficientemente importantes, incluso si se logra el algoritmo perfecto que funcione para su conjunto de datos actual, eso no significa que funcionará con el conjunto de datos de mañana. Dependiendo de la cantidad de grupos de grupos que necesite, simplemente crearé grupos arbitrarios que se ajusten a sus necesidades en lugar de utilizar un algoritmo. Ex. ($ 1 - $ 25, $ 25-100, $ 100 +). Desde la perspectiva del consumidor, mi mente distribuye naturalmente los productos en 3 categorías de precios diferenciados (económicos, medios y costosos).

0

Creo que estás pensando demasiado.

Si conoce sus productos y le gustan los resultados de grano fino, simplemente codificaría esos rangos de precios. Si cree que $ 1 a $ 10 tiene sentido para lo que está vendiendo, colóquelo, no necesita un algoritmo. Simplemente haga un control para que solo muestre los rangos que tienen resultados.

Si no conoce sus productos, simplemente ordenaría todos los productos por precio y los dividiría en 4 grupos de igual cantidad de productos.

3

Aquí es una idea, siguiendo la línea de pensamiento de mi comentario:

que se supone que tiene un conjunto de productos, cada uno de ellos marcados por un precio y una estimación del volumen de ventas (como porcentaje del total ventas). Primero, clasifique todos los productos por su precio. A continuación, comience a dividir: recorra la lista ordenada y acumule el volumen de ventas. Cada vez que alcances aproximadamente el 25%, corta allí. Si lo hace 3 veces, resultará en 4 subconjuntos que tienen rangos de precios disjuntos y un volumen de ventas similar.

Cuestiones relacionadas