2010-09-20 22 views
6

Sous l'utilisateur généré messages sur mon site, j'ai un système de notation Amazon comme:Comment dois-je commander ces scores "utiles"?

Was this review helpful to you: Yes | No 

S'il y a des votes, j'afficher les résultats ci-dessus de cette ligne comme ceci:

5 of 8 people found this reply helpful. 

I voudrais trier les messages en fonction de ces classements. Si vous étiez classé du plus utile au moins utile, comment commanderiez-vous les messages suivants?

a) 1/1 = 100% helpful 
    b) 2/2 = 100% helpful 
    c) 999/1000 = 99.9% helpful 
    b) 3/4 = 75% helpful 
    e) 299/400 = 74.8% helpful 

De toute évidence, ce ne est pas droit de trier juste sur le pour cent utile, en quelque sorte le total des voix devraient être pris en compte. Est-il un moyen standard de faire cela?

MISE À JOUR:

avec Charles de formules pour calculer la Agresti-Coull gamme inférieure et le tri sur elle, voici comment les exemples ci-dessus triaient:

1) 999/1000 (99.9%) = 95% likely to fall in 'helpfulness' range of 99.2% to 100% 
    2) 299/400 (74.8%) = 95% likely to fall in 'helpfulness' range of 69.6% to 79.3% 
    3) 3/4 (75%) = 95% likely to fall in 'helpfulness' range of 24.7% to 97.5% 
    4) 2/2 (100%) = 95% likely to fall in 'helpfulness' range of 23.7% to 100% 
    5) 1/1 (100%) = 95% likely to fall in 'helpfulness' range of 13.3% to 100% 

Intuitivement, cela se sent le droit .

MISE À JOUR 2:

D'un point de vue de l'application, je ne veux pas être en cours d'exécution de ces calculs à chaque fois que je tire une liste des postes. Je pense que je vais soit mettre à jour et stocker la limite inférieure Agresti-Coull soit sur un calendrier régulier, cron-conduit (mise à jour seulement les postes qui ont reçu un vote depuis la dernière exécution) ou mettre à jour chaque fois qu'un nouveau vote est reçu .

Répondre

5

Pour chaque poste, générer des limites sur la façon utile que vous attendez qu'il soit. Je préfère utiliser l'intervalle Agresti-Coull. Pseudocode:

float AgrestiCoullLower(int n, int k) { 
    //float conf = 0.05; // 95% confidence interval 
    float kappa = 2.24140273; // In general, kappa = ierfc(conf/2)*sqrt(2) 
    float kest=k+kappa^2/2; 
    float nest=n+kappa^2; 
    float pest=kest/nest; 
    float radius=kappa*sqrt(pest*(1-pest)/nest); 
    return max(0,pest-radius); // Lower bound 
    // Upper bound is min(1,pest+radius) 
} 

Prendre ensuite l'extrémité inférieure de l'estimation et de tri sur ce point. Ainsi le 2/2 est (par Agresti-Coull) 95% susceptible de tomber dans la fourchette de «serviabilité» de 23,7% à 100%, donc il trie en dessous du 999/1000 qui varie de 99,2% à 100% (depuis .237 < 992). Edit: Puisque certaines personnes semblent avoir trouvé cela utile (ha ha), permettez-moi de noter que l'algorithme peut être modifié en fonction de la confiance que vous voulez avoir/aversion au risque.Moins vous avez besoin de confiance, plus vous serez prêt à abandonner les évaluations «prouvées» (à vote élevé) pour les examens non testés mais à forte notation. Un intervalle de confiance de 90% donne kappa = 1.95996398, un intervalle de confiance de 85% donne 1.78046434, un intervalle de confiance de 75% donne 1.53412054, et l'intervalle de confiance de 50% all-caution-the-wind donne 1.15034938.

L'intervalle de confiance de 50% donne

1) 999/1000 (99.7%) = 50% likely to fall in 'helpfulness' range of 99.7% to 100% 
2) 299/400 (72.2%) = 50% likely to fall in 'helpfulness' range of 72.2% to 77.2% 
3) 2/2 (54.9%) = 50% likely to fall in 'helpfulness' range of 54.9% to 100% 
4) 3/4 (45.7%) = 50% likely to fall in 'helpfulness' range of 45.7% to 91.9% 
5) 1/1 (37.5%) = 50% likely to fall in 'helpfulness' range of 37.5% to 100% 

qui est pas si différent dans l'ensemble, mais il préfère le 2/2 à la sécurité du 3/4.

+1

Pour les liens (en particulier ceux à 0), je suggère de casser en faveur du plus grand nombre de votes, puis le plus petit nombre de votes négatifs. – Charles

+0

wow, Charles, c'est un noyau dur. très impressionnant. Je vais l'exécuter sur mes exemples et voir comment ils trient (après avoir passé quelques minutes à m'éduquer sur Agresti-Coull sur wikipedia!) – mitchf

+0

Dites-moi comment ça se passe. Je peux donner plus d'informations et/ou de références si nécessaire. – Charles

4

Cette question est probablement mieux posée sur http://stats.stackexchange.com.

Je suppose que vous voulez toujours commander en augmentant de «serviabilité».

Si vous voulez savoir comment précisément un nombre donné est, le plus simple est d'utiliser la racine carrée de la variance de la Binomial distribution avec n égal au nombre total de réponses et p la fraction des réponses qui ont été « utiles '.

+1

+1 pour stats.stackexchange.com – Thilo

1

Une solution très simple serait d'ignorer tout avec moins d'un nombre limite de votes, puis trier par pourcentage.

Par exemple (nécessite au moins cinq voix)

1. 99.9% (1000 votes) 
    2. 74.8% (400 votes) 
    3-5. waiting for five votes 
1

Cela dépend du taux attendu de commentaires positifs et du nombre de personnes qui votent en moyenne. Si, comme dans l'exemple que vous donnez, vous allez avoir parfois 5 et 10 personnes de vote et d'autres fois 1000, alors je suggère le milieu Wilson:

(x+z^2/2)/(n+z^2) The midpoint of the Adjusted Wald Interval/Wilson Score 

where: 
n = Sum(all_votes), 
x = Sum(positive_votes)/n, 
z = 1.96 (fixed value)