Алгоритм группировки ценового фильтра

Я создаю сайт электронной коммерции, и у меня возникают проблемы с разработкой хорошего алгоритма для сортировки продуктов, извлеченных из базы данных, в соответствующие группы. Я попытался просто разделить самую высокую цену на 4 и основывать каждую группу на этом. Я также попробовал стандартные отклонения, основанные на среднем значении. Оба могут привести к ценовым диапазонам, в которые не попадет ни один продукт, что не является полезным параметром фильтрации.

Я также пытался взять квартили продуктов, но моя проблема в том, что цена колеблется от 1 до 4000 долларов. 4000 долларов почти никогда не продаются, и они гораздо менее важны, но они продолжают искажать мои результаты.

Какие-нибудь мысли? Я должен был уделять больше внимания статистике...

Обновление:

В итоге я немного комбинировал методы. Я использовал метод квартилей/сегментов, но немного усложнил его, жестко задав определенные диапазоны, в которых будет появляться большее количество ценовых групп.

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

person Dave W.    schedule 21.07.2010    source источник
comment
Похоже, что если вы обогатите информацию о продукте (которая содержит только цены) фактической информацией о продажах, тогда вы сможете лучше выполнить разделение (хотя я пока не знаю, как это сделать).   -  person Eyal Schneider    schedule 22.07.2010


Ответы (4)


Вот идея: в основном вы должны сортировать цену в сегментах по 10, каждая цена является ключом в массиве, значение представляет собой количество продуктов в данной ценовой категории:

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

Из результата вы можете использовать reset и end, чтобы получить минимальное/максимальное значение каждого сегмента.

Какая-то грубая сила, но может быть полезна...

person tsgrasser    schedule 21.07.2010
comment
Это похоже на мой подход, когда я брал квартили, за исключением того, что вы выбрали 10 групп, а не 4. Я думаю, что это один из самых многообещающих подходов, моя единственная проблема заключается в том, что он приводит к странным ценовым диапазонам, даже если они хорошие. представление данных. Другими словами, я могу получить диапазон цен от 15,47 до 152,87 долларов. Каждое ведро может иметь равномерное распределение, но ценовые границы произвольны и сбивают с толку. - person Dave W.; 22.07.2010

Вот идея, следующая мысли моего комментария:

Я предполагаю, что у вас есть набор продуктов, каждый из которых помечен ценой и оценкой объема продаж (в процентах от общего объема продаж). Сначала отсортируйте все товары по цене. Затем начните разбивать: просматривайте упорядоченный список и накапливайте объем продаж. Каждый раз, когда вы достигаете примерно 25%, режьте там. Если вы сделаете это 3 раза, это приведет к 4 подмножествам с непересекающимися ценовыми диапазонами и одинаковым объемом продаж.

person Eyal Schneider    schedule 21.07.2010

Что именно вы ищете в качестве конечного результата (не могли бы вы привести пример группировки)? Если ваша единственная цель состоит в том, чтобы все группы имели значительное количество достаточно важных продуктов, то даже если вы придумаете идеальный алгоритм, который работает для вашего текущего набора данных, это не означает, что он будет работать с завтрашним набором данных. В зависимости от количества наборов групп, которые вам нужны, я бы просто создал произвольные группы, соответствующие вашим потребностям, вместо использования алгоритма. Бывший. (от 1 до 25 долларов, от 25 до 100 долларов, от 100 долларов). С точки зрения потребителя мой разум естественным образом распределяет продукты по трем разным ценовым категориям (дешевые, средние и дорогие).

person Justin Lucas    schedule 21.07.2010

Я думаю, ты слишком много думаешь.

Если вы знаете свои продукты и вам нравятся детализированные результаты, я бы просто жестко закодировал эти ценовые диапазоны. Если вы считаете, что от 1 до 10 долларов имеет смысл для того, что вы продаете, вставьте это, вам не нужен алгоритм. Просто сделайте проверку, чтобы показывать только те диапазоны, в которых есть результаты.

Если вы не знаете своих товаров, я бы просто отсортировал все товары по цене и разделил их на 4 группы по равному количеству товаров.

person Nathan H    schedule 21.07.2010