Pergunta

Eu estou tentando resolver um monte de produtos por avaliações de cliente, utilizando um sistema de 5 estrelas. O site que estou definindo isso para não ter um monte de avaliações e continuar a adicionar novos produtos para que ele irá normalmente têm alguns produtos com um baixo número de classificações.

Eu tentei usar classificação média estrelas, mas que o algoritmo falhar quando há um pequeno número de classificações.

Exemplo de um produto que tem 3x 5 estrelas classificações iria aparecer melhor do que um produto que tem 100x 5 classificações de estrelas e 2x 2 classificações de estrelas.

não deve o segundo produto aparecer mais porque é estatisticamente mais confiável devido ao maior número de classificações?

Foi útil?

Solução

Antes de 2015, a Internet Movie Database (IMDb) cotada a fórmula utilizada para classificar a sua Top 250 lista filmes. Para citar:

A fórmula para calcular os Mais Votados 250 Títulos dá uma verdadeira estimativa Bayesiana :

weighted rating (WR) = (v ÷ (v+m)) × R + (m ÷ (v+m)) × C

Onde:

  • R = média para o filme (média)
  • v = número de votos para o filme
  • m = úteis mínimo necessário para ser listada no Top 250 (actualmente 25000)
  • C = o voto médio em todo o relatório (atualmente 7.0)

Para o Top 250, vota apenas de eleitores regulares são considerados.

Não é tão difícil de entender. A fórmula é a seguinte:

rating = (v / (v + m)) * R +
         (m / (v + m)) * C;

Que pode ser matematicamente simplificada para:

rating = (R * v + C * m) / (v + m);

As variáveis ??são:

  • R - própria classificação do item. R é a média de votos do item. (Por exemplo, se um item não tem votos, o R é 0. Se alguém dá-lhe 5 estrelas, R torna-se 5. Se alguém lhe dá 1 estrela, R torna-se 3, a média de [1, 5]. E assim por diante.)
  • C - classificação do item de média. Encontre o R de cada item no banco de dados, incluindo o atual, e tomar a média deles; que é C. (Suponhamos que existem 4 itens na base de dados, e as suas classificações são [2, 3, 5, 5]. C é 3,75, a média desses números.)
  • v - O número de votos para um item. (Para dada outro exemplo, se 5 pessoas votam em um item, v é 5).
  • m - O parâmetro sintonizável. A quantidade de "alisamento" aplicado à classificação baseia-se no número de votos (v) em relação ao m. Ajuste m até que os resultados satisfazê-lo. E não interpretar mal descrição do IMDb de m como "mínimas de votos necessários para ser listado." - este sistema é perfeitamente capaz de classificar itens com menos votos do que m

Toda a fórmula faz é: add m imaginários votos, cada um com um valor de C, antes de calcular a média. No início, quando não há dados suficiente (isto é, o número de votos é drasticamente menos do que m), isso faz com que as estruturas sejam preenchidos com os dados médios. No entanto, como votos acumula, eventualmente, os imaginários votos será abafada por reais.

Neste sistema, os votos não causam a classificação para flutuar descontroladamente. Em vez disso, eles apenas perturbá-la um pouco em alguma direção.

Quando há zero votos, apenas imaginárias votos existem, e todos eles são C. Assim, cada item começa com uma classificação de C.

Veja também:

Outras dicas

desta página para uma boa análise de estrela sistemas de classificação baseados, e esta para uma boa análise de sistemas baseados upvote- / downvote-.

Para cima e para baixo votar desejar estimar a probabilidade de que, dadas as classificações que você tem, a pontuação "real" (se você tivesse infinitas ratings) é maior do que alguma quantidade (como, digamos, o número similar para algum outro item que você está classificando contra).

Veja o segundo artigo para a resposta, mas a conclusão é que você quer usar a confiança Wilson. O artigo dá o código Ruby equação e amostra (facilmente traduzida para outro idioma).

Evan Miller uma abordagem bayesiana com o ranking 5- classificações de estrelas: enter descrição da imagem aqui

onde

  • nk é o número de classificações k estrelas,
  • sk é o "valor" (em pontos) de estrelas k,
  • N é o número total de votos
  • K é o número máximo de estrelas (por exemplo, K = 5, em um sistema de classificação de 5 estrelas)
  • z_alpha/2 é o quantil 1 - alpha/2 de uma distribuição normal. Se você quiser% de confiança de 95 (baseado no Bayesian posterior distribuição) que o critério de classificação real é pelo menos tão grande quanto o critério de ordenação computadorizada, escolha z_alpha/2 = 1,65.

Em Python, o critério de classificação pode ser calculado com

def starsort(ns):
    """
    http://www.evanmiller.org/ranking-items-with-star-ratings.html
    """
    N = sum(ns)
    K = len(ns)
    s = list(range(K,0,-1))
    s2 = [sk**2 for sk in s]
    z = 1.65
    def f(s, ns):
        N = sum(ns)
        K = len(ns)
        return sum(sk*(nk+1) for sk, nk in zip(s,ns)) / (N+K)
    fsns = f(s, ns)
    return fsns - z*math.sqrt((f(s2, ns)- fsns**2)/(N+K+1))

Por exemplo, se um item tem 60 cinco-estrelas, 80 quatro estrelas, 75 de três estrelas, 20 duas-estrelas e 25 one-estrelas, em seguida, a sua classificação geral estrela seria de cerca de 3.4:

x = (60, 80, 75, 20, 25)
starsort(x)
# 3.3686975120774694

e você pode classificar uma lista de classificações de 5 estrelas, com

sorted([(60, 80, 75, 20, 25), (10,0,0,0,0), (5,0,0,0,0)], key=starsort, reverse=True)
# [(10, 0, 0, 0, 0), (60, 80, 75, 20, 25), (5, 0, 0, 0, 0)]

Esta mostra o efeito que mais classificações podem ter sobre o valor global da estrela.


Você verá que esta fórmula tende a dar uma classificação geral que é um pouco mais baixa do que a classificação global relatado por locais tais como Amazon, Ebay ou Wal-Mart especialmente quando há poucos votos (digamos, menos de 300). Isso reflete a maior uncertainy que vem com menos votos. À medida que o número de votos aumenta (Em milhares) todos os totais destas fórmulas de classificação deve tender à (Ponderada) classificação média.


Uma vez que a fórmula só depende da distribuição de 5 estrelas classificações frequência para o próprio item, é fácil combinar comentários de várias fontes (ou, Atualização a classificação geral à luz dos novos votos) simplesmente adicionando a frequência distribuições juntos.


Ao contrário da fórmula IMDb, esta fórmula não dependem da pontuação média em todos os itens, nem um número mínimo artificial de votos de corte de valor.

Além disso, esta fórmula faz uso da distribuição de freqüência completo - não apenas o número médio de estrelas e o número de votos. E faz sentido que deve desde um item com dez 5-estrelas e dez 1-estrelas deve ser tratado como Tendo mais do que incerteza (e, portanto, não classificado como altamente como) com um item vinte classificações de 3 estrelas:

In [78]: starsort((10,0,0,0,10))
Out[78]: 2.386028063783418

In [79]: starsort((0,0,20,0,0))
Out[79]: 2.795342687927806

A fórmula IMDb não levar isso em conta.

Você pode classificar por mediana em vez de média aritmética. Neste caso, ambos os exemplos têm uma média de 5, para que ambos teriam o mesmo peso em um algoritmo de ordenação.

Você pode usar um modo para o mesmo efeito, mas média é provavelmente uma idéia melhor.

Se você deseja atribuir peso adicional para o produto com 100 classificações de 5 estrelas, você provavelmente vai querer ir com algum tipo de modo ponderado, atribuindo mais peso para avaliações com a mesma média, mas com mais votos totais.

Bem, dependendo de quão complexo você quiser fazer isso, você poderia ter classificações, adicionalmente, ser ponderadas com base em quantos classificações a pessoa fez, e quais são essas classificações. Se a pessoa só tem feito um rating, que poderia ser uma classificação de figurante, e pode contar menos. Ou se a pessoa tem avaliado muitas coisas na categoria um, mas poucos na categoria b, e tem uma classificação média de 1.3 de 5 estrelas, parece que a categoria A pode ser pesado artificialmente baixo pela pontuação média baixa deste usuário, e deve ser ajustado.

Mas chega de torná-lo complexo. Vamos torná-lo simples.

Assumindo que estamos trabalhando com apenas dois valores, reviewCount e AverageRating, para um determinado item, não faria sentido para mim a olhar reviewCount como sendo essencialmente o valor “confiabilidade”. Mas nós não queremos apenas trazer pontuação para baixo para itens de baixo reviewCount: uma única avaliação de uma estrela é provavelmente tão confiável como uma única classificação de 5 estrelas. Então, o que nós queremos fazer é provavelmente média para o meio: 3.

Então, basicamente, eu estou pensando em uma coisa equação como X * AverageRating + Y * 3 = the-classificação-nós-falta. A fim de tornar este valor sai direito precisamos de X + Y para igualar 1. Também precisamos de X a aumentar em valor como reviewCount aumenta ... com uma contagem de avaliação de 0, x deve ser 0 (dando-nos uma equação “ 3” ), e com uma avaliação infinito contagem X deve ser um (o que faz com que a equação = AverageRating).

equações

Então, quais são X e Y? Para a equação X quer a variável dependente para se aproximar assintoticamente 1 como a variável independente se aproxima do infinito. Um bom conjunto de equações é algo como: Y = 1 / (fator ^ ratingcount) e (utilizando o facto de que X deve ser igual a 1-Y) X = 1 - (1 / (fator ^ ratingcount)

Então, podemos ajustar "fator" para ajustar o intervalo que estamos procurando.

Eu usei esse programa simples C # para tentar alguns fatores:

        // We can adjust this factor to adjust our curve.
        double factor = 1.5;  

        // Here's some sample data
        double RatingAverage1 = 5;
        double RatingCount1 = 1;

        double RatingAverage2 = 4.5;
        double RatingCount2 = 5;

        double RatingAverage3 = 3.5;
        double RatingCount3 = 50000; // 50000 is not infinite, but it's probably plenty to closely simulate it.

        // Do the calculations
        double modfactor = Math.Pow(factor, RatingCount1);
        double modRating1 = (3 / modfactor)
            + (RatingAverage1 * (1 - 1 / modfactor));

        double modfactor2 = Math.Pow(factor, RatingCount2);
        double modRating2 = (3 / modfactor2)
            + (RatingAverage2 * (1 - 1 / modfactor2));

        double modfactor3 = Math.Pow(factor, RatingCount3);
        double modRating3 = (3 / modfactor3)
            + (RatingAverage3 * (1 - 1 / modfactor3));

        Console.WriteLine(String.Format("RatingAverage: {0}, RatingCount: {1}, Adjusted Rating: {2:0.00}", 
            RatingAverage1, RatingCount1, modRating1));
        Console.WriteLine(String.Format("RatingAverage: {0}, RatingCount: {1}, Adjusted Rating: {2:0.00}",
            RatingAverage2, RatingCount2, modRating2));
        Console.WriteLine(String.Format("RatingAverage: {0}, RatingCount: {1}, Adjusted Rating: {2:0.00}",
            RatingAverage3, RatingCount3, modRating3));

        // Hold up for the user to read the data.
        Console.ReadLine();

Então você não se incomoda copiá-lo em, dá essa saída:

RatingAverage: 5, RatingCount: 1, Adjusted Rating: 3.67
RatingAverage: 4.5, RatingCount: 5, Adjusted Rating: 4.30
RatingAverage: 3.5, RatingCount: 50000, Adjusted Rating: 3.50

Algo assim? Você poderia, obviamente, ajustar o valor do "fator" conforme necessário para obter o tipo de ponderação que quiser.

Se você só precisa de um rápido e solução barata que vai trabalhar principalmente sem usar um monte de computação aqui está uma opção (assumindo uma escala 1-5 classificação)

SELECT Products.id, Products.title, avg(Ratings.score), etc
FROM
Products INNER JOIN Ratings ON Products.id=Ratings.product_id
GROUP BY 
Products.id, Products.title
ORDER BY (SUM(Ratings.score)+25.0)/(COUNT(Ratings.id)+20.0) DESC, COUNT(Ratings.id) DESC

Ao adicionar em 25 e dividindo com as classificações totais + 20 que você está adicionando basicamente 10 piores pontuações e 10 melhores pontuações para as classificações totais e, em seguida, a classificação em conformidade.

Este tem problemas conhecidos. Por exemplo, injustamente premia produtos de baixa pontuação, com poucas classificações (como este gráfico demonstra, produtos com uma pontuação média de 1 e apenas pontuação uma classificação um 1,2, enquanto os produtos com uma pontuação média de 1 e 1k + classificações de pontuação mais perto de 1,05). Você também poderia argumentar que injustamente pune produtos de alta qualidade com poucas avaliações.

Este gráfico mostra o que acontece em todos os 5 avaliações mais 1-1000 avaliações: http://www.wolframalpha.com/input/?i=Plot3D%5B%2825%2Bxy%29/%2820%2Bx%29%2C%7Bx % 2C1% 2C1000% 7D% 2C% 7BY% 2C0% 2C6% 7D% 5D

Você pode ver o mergulho para cima para as classificações muito inferiores, mas no geral é uma feira de classificação, eu acho. Você também pode olhar para ele desta forma:

http://www.wolframalpha.com/input/?i=Plot3D%5B6-%28%2825%2Bxy%29 /% 2820% 2BX% 29% 29%% 2C 7BX% 2C1% 2C1000% 7D% 2C% 7BY% 2C0% 2C6% 7D% 5D

Se você deixar cair uma bola de gude na maioria dos lugares neste gráfico, ele será automaticamente rolar para produtos com ambos os escores mais altos e classificações mais elevadas.

Obviamente, o baixo número de classificações coloca esse problema em uma desvantagem estatística. Nunca a menos ...

Um elemento-chave para a melhoria da qualidade de uma classificação global é a "taxa do avaliador", isto é, para manter as abas das classificações de cada "avaliador" particular, tem fornecidos (em relação aos outros). Isso permite pesando seus votos durante o processo de agregação.

Outra solução, mais de uma face para fora, é a de fornecer aos utilizadores finais com uma contagem (ou uma indicação gama dos mesmos) de úteis para o produto subjacente.

Uma opção é algo como sistema TrueSkill da Microsoft, onde a pontuação é dada por mean - 3*stddev, onde as constantes podem ser alterados.

Depois de olhar por um tempo, eu escolho o sistema Bayesian. Se alguém está usando Ruby, aqui um gem para isso:

https://github.com/wbotelhos/rating

Eu recomendo o livro Programação Collective Intelligence por Toby Segaran (OReilly) ISBN 978-0-596-52932-1 que discute como extrair dados significativos de comportamento de multidão. Os exemplos estão em Python, mas é fácil o suficiente para converter.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top