2009-09-11 13 views
54

Sto cercando di ordinare un gruppo di prodotti in base alle valutazioni dei clienti utilizzando un sistema a 5 stelle. Il sito su cui sto impostando non ha molti rating e continua ad aggiungere nuovi prodotti, quindi di solito ha pochi prodotti con un basso numero di valutazioni.Qual è un modo migliore di ordinare per una valutazione a 5 stelle?

Ho provato a utilizzare la media delle stelle ma quell'algoritmo non funziona quando c'è un piccolo numero di valutazioni.

Esempio un prodotto che ha 3 stelle a 5 stelle si presenterebbe meglio di un prodotto che ha 100x 5 stelle e 2x 2 stelle.

Non dovrebbe il secondo prodotto mostrare più in alto perché è statisticamente più affidabile a causa del maggior numero di valutazioni?

+0

Il modo giusto per farlo è quello di media, e per gli articoli che non sono ancora stati ordinati, hanno uno stato di "non classificato". Come hai provato? Come ha fallito? – David

risposta

61

Per la lista dei migliori 250 film IMDB utilizza uno . Questo è un buon modo per prendere in considerazione il numero di elettori.

Da here:

La formula per il calcolo delle Top votati 250 titoli dà un vero bayesiano stima:

voto ponderato (WR) = (v ÷ (v + m)) × R + (m ÷ (v + m)) × C

dove:

* R = average for the movie (mean) = (Rating) 
* v = number of votes for the movie = (votes) 
* m = minimum votes required to be listed in the Top 250 (currently 1300) 
* C = the mean vote across the whole report (currently 6.8) 

per la Top 250, solo i voti da sono considerati elettori regolari.

+0

Il wiki risponde all'articolo citato suggerisce che la formula è WR = (v * R + m * C)/(v + m) che sembra più probabile come C viene preso in considerazione e i valori che sto ricevendo sembrano migliori. –

+2

La formula è in realtà la stessa, devi inserire quella originale erroneamente come (v/(v + m)) * R + (m/(v + m)) * C è la stessa di (v * R + m * C)/(v + m).Link: http://goo.gl/IW9s1A – ParoX

7

È possibile ordinare per median anziché media aritmetica. In questo caso, entrambi gli esempi hanno una mediana di 5, quindi entrambi avrebbero lo stesso peso in un algoritmo di ordinamento.

È possibile utilizzare uno mode allo stesso effetto, ma la mediana è probabilmente un'idea migliore.

Se si desidera assegnare un peso aggiuntivo al prodotto con 100 valutazioni a 5 stelle, probabilmente si andrà con una sorta di modalità ponderata, assegnando più peso alle valutazioni con la stessa mediana, ma con più voti complessivi .

+0

Se dovessi usare il metodo mediano come stabiliresti quale dovrebbe essere valutato meglio 5x 5 stelle con 4x 2 stelle o 5x 5 stelle con 4x 1 stelle? Entrambi otterrebbero 5 per la valutazione. – Vizjerai

+0

Che spetterebbe a voi a quel punto. Dipende da quale pensi che sia superiore. Magari ti ordinerai prima per mediana, poi per media. O forse prima per mediana, poi per numero totale di voti. – Welbog

+0

Mediana ponderata: Ordina per prima la mediana, quindi per media. Il numero totale di voti migliora l'affidabilità (livello di confidenza) del punteggio, ma non dice nulla sul punteggio stesso. – richardtallent

0

Ovviamente, il basso numero di valutazioni pone questo problema su un handicap statistico. Mai ...

Un elemento chiave meno per migliorare la qualità di una valutazione aggregata è a "valutare la rater", cioè per mantenere le linguette delle valutazioni ogni particolare "rater" ha fornito (rispetto agli altri). Ciò consente di pesare i loro voti durante il processo di aggregazione.

Un'altra soluzione, più di una soluzione, consiste nel fornire agli utenti finali un conteggio (o un'indicazione di intervallo) dei voti per l'elemento sottostante.

-1

mi raccomando il libro Programming Collective Intelligence da Toby Segaran (OReilly) ISBN 978-0-596-52932-1 che discute come estrarre dati significativi dal comportamento della folla. Gli esempi sono in Python, ma è abbastanza facile da convertire.

+1

Anche se posso consigliare questo libro a tutti coloro che sono interessati a quel campo, la tua risposta non fornisce una soluzione alla domanda posta. –

6

Bene, a seconda di quanto sia complesso farlo, è possibile attribuire un punteggio alle valutazioni in base a quante valutazioni la persona ha effettuato e a quali valutazioni si riferiscono.Se la persona ha fatto solo una valutazione, potrebbe essere un punteggio di valutazione, e potrebbe contare di meno. O se la persona ha valutato molte cose in categoria A, ma pochi nella categoria B, ed ha una valutazione media di 1,3 stelle su 5, suona come categoria A può essere pesato artificialmente verso il basso dal basso punteggio medio di questo utente, e dovrebbe essere regolato

Ma abbastanza da renderlo complesso. Facciamolo semplice

Supponendo che stiamo lavorando con solo due valori, ReviewCount e AverageRating, per un particolare elemento, avrebbe senso per me vedere ReviewCount come essenzialmente il valore di "affidabilità". Ma noi non vogliamo solo per portare i punteggi verso il basso per gli oggetti a basso reviewCount: un solo voto ad una stella è probabilmente inaffidabile come un unico rating 5 stelle. Quindi, quello che vogliamo fare è probabilmente la media verso il centro: 3.

Quindi, in sostanza, sto pensando ad un'equazione come X * AverageRating + Y * 3 = the-rating-we-want. Al fine di rendere questo valore uscire a destra abbiamo bisogno X + Y per uguale 1. Inoltre abbiamo bisogno X ad aumentare di valore come aumenta reviewCount ... con un conteggio di revisione 0, x dovrebbe essere 0 (dandoci un'equazione di “ 3 "), e con un numero infinito di conteggi X dovrebbe essere 1 (il che rende l'equazione = Average Average).

Quindi quali sono le equazioni X e Y? Per l'equazione X, si vuole che la variabile dipendente si avvicini asintoticamente a 1 mentre la variabile indipendente si avvicina all'infinito. Un buon insieme di equazioni è qualcosa come: Y = 1/(fattore^RatingCount) e (utilizzando il fatto che X deve essere uguale a 1-Y) X = 1 - (1/(fattore^RatingCount)

.

Poi possiamo regolare "fattore" per adattare la gamma che stiamo cercando

ho usato questo semplice programma C# per provare un paio di fattori:

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

Quindi non si preoccupano di copia in, dà questa uscita:

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 

Qualcosa del genere? Ovviamente potresti regolare il valore del "fattore" necessario per ottenere il tipo di ponderazione desiderato.

16

Potete guardare questa pagina per avere una buona analisi di stelle:

http://www.evanmiller.org/ranking-items-with-star-ratings.html

E si può guardare a questa pagina per ottenere una buona analisi di su e giù per la votazione:

http://www.evanmiller.org/how-not-to-sort-by-average-rating.html

per su e giù per il voto si vuole stimare la probabilità che, dato i feedback che avete, il punteggio "reale" (se si ha feedback infinito) è maggiore di una certa quantità (come, ad esempio, il simil numero ar per qualche altro elemento che si sta smistamento contro.)

Vedere il secondo articolo per la risposta, ma la conclusione è che si desidera utilizzare la fiducia Wilson. L'articolo fornisce l'equazione e di codice vermiglio (facilmente tradotta in un'altra lingua).

+4

Gli intervalli di confidenza di Wilson funzionano solo per le distribuzioni binomiali (es. + 1/-1 voti di stile); non è chiaro quale approccio adottare per qualcosa come uno schema di valutazione a 5 stelle. – Alec

+0

Ecco il suo articolo per i sistemi di classificazione a stelle: http://www.evanmiller.org/ranking-items-with-star-ratings.html –

3

Se avete solo bisogno di una soluzione rapida ed economica che per lo più lavorare senza usare un sacco di calcolo qui è un'opzione (assumendo una scala 1-5 valutazione)

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 

Aggiungendo a 25 e dividendo per il punteggio totale + 20, in pratica stai aggiungendo 10 punteggi peggiori e 10 punteggi migliori ai punteggi totali, quindi ordina di conseguenza.

Questo ha problemi noti. Ad esempio, premia ingiustamente i prodotti a basso punteggio con pochi voti (come dimostra this graph, i prodotti con un punteggio medio di 1 e un punteggio di rating un 1,2 mentre i prodotti con un punteggio medio di 1 e 1k + punteggi si avvicinano a 1,05). Si potrebbe anche obiettare che punisce ingiustamente prodotti di alta qualità con poche valutazioni.

Questo grafico mostra cosa succede per tutti i 5 valutazioni su 1-1000 feedback: 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

si può vedere il tuffo verso l'alto i feedback molto basso, ma nel complesso è una classifica giusto, credo. Si può anche guardare in questo modo:

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 si lascia cadere un marmo sulla maggior parte dei posti in questo grafico, che verrà automaticamente rotolare verso prodotti con entrambi i punteggi più alti e rating più elevati.

0

Un'opzione è simile al sistema TrueSkill di Microsoft, in cui il punteggio è dato da mean - 3*stddev, in cui le costanti possono essere ottimizzate.

7

Evan Miller shows un approccio bayesiano classifica 5-stella: enter image description here

dove

  • nk è il numero di k valutazioni, foto, prezzi,
  • sk è il "valore" (in punti) di k stelle,
  • N è il numero totale di voti
  • K è il numero massimo di stelle (ad es. K = 5, in un sistema di classificazione a 5 stelle)
  • z_alpha/2 è il quantile 1 - alpha/2 di una distribuzione normale. Se si desidera una confidenza del 95% (basata sulla distribuzione posteriore bayesiana) che il criterio di ordinamento effettivo sia grande almeno quanto il criterio di ordinamento calcolato, scegliere z_alpha/2 = 1,65.

In Python, il criterio di ordinamento può essere calcolato con

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

Ad esempio, se un elemento 60 cinque stelle, 80 quattro stelle, 75 tre stelle, 20 due stelle e 25 stelle, quindi la sua valutazione complessiva sarebbe di circa 3.4:

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

e si può ordinare una lista delle valutazioni a 5 stelle con

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

Questo mostra l'effetto che altre valutazioni possono avere sul valore complessivo stella.


Troverete che questa formula tende a dare una valutazione complessiva, che è un po ' inferiore al punteggio complessivo riportato da siti come Amazon, Ebay o Wal-mart in particolare quando ci sono pochi voti (diciamo meno di 300). Ciò riflette la maggiore incertezza dello che viene fornita con meno voti. Poiché il numero di voti aumenta di (in migliaia), tutte queste formule di valutazione dovrebbero tendere alla valutazione media (ponderata).


Dal momento che la formula dipende solo dalla distribuzione di frequenza delle valutazioni 5 stelle per l'oggetto in sé, è facile coniugare recensioni da fonti multiple (o, aggiornamento il punteggio complessivo alla luce di nuovi voti) aggiungendo semplicemente le distribuzioni di frequenza insieme.


A differenza della formula di IMDb, questa formula non dipende il punteggio medio in tutti gli elementi, né un numero minimo artificiale del valore di cut-off voti.

Inoltre, questa formula utilizza la distribuzione di frequenza completa - non solo il numero medio di stelle e il numero di voti. E ha senso che sia in quanto un articolo con dieci 5 stelle e dieci 1 stelle deve essere trattato come con maggiore incertezza (e quindi non valutato come) di un articolo con venti valutazioni a 3 stelle:

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

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

La formula IMDb non tiene conto di questo.

Problemi correlati