Search code examples
rating

How to count rating?


My question is more mathematical. there is a post in the site. User can like and dislike it. And below the post is written for example -5 dislikes and +23 likes. On the base of these values I want to make a rating with range 0-10 or (-10-0 and 0-10). How to make it correctly?


Solution

  • This may not answer your question as you need a rating between [-10,10] but this blog post describes the best way to give scores to items where there are positive and negative ratings (in your case, likes and dislikes).

    A simple method like

    • (Positive ratings) - (Negative ratings), or
    • (Positive ratings) / (Total ratings)

    will not give optimal results.

    Instead he uses a method called Binomial proportion confidence interval.

    The relevant part of the blog post is copied below:

    CORRECT SOLUTION: Score = Lower bound of Wilson score confidence interval for a Bernoulli parameter

    Say what: We need to balance the proportion of positive ratings with the uncertainty of a small number of observations. Fortunately, the math for this was worked out in 1927 by Edwin B. Wilson. What we want to ask is: Given the ratings I have, there is a 95% chance that the "real" fraction of positive ratings is at least what? Wilson gives the answer. Considering only positive and negative ratings (i.e. not a 5-star scale), the lower bound on the proportion of positive ratings is given by:

    formula
    (source: evanmiller.org)

    (Use minus where it says plus/minus to calculate the lower bound.) Here p is the observed fraction of positive ratings, zα/2 is the (1-α/2) quantile of the standard normal distribution, and n is the total number of ratings.

    Here it is, implemented in Ruby, again from the blog post.

    require 'statistics2'
    
    def ci_lower_bound(pos, n, confidence)
        if n == 0
            return 0
        end
        z = Statistics2.pnormaldist(1-(1-confidence)/2)
        phat = 1.0*pos/n
        (phat + z*z/(2*n) - z * Math.sqrt((phat*(1-phat)+z*z/(4*n))/n))/(1+z*z/n)
    end