rating systems posted in internet, webdev, jun 3, 2009

i recently started looking at my rating system used in some places on track7 with the intent of making it more of a module that i could use from whatever section i wanted to allow ratings on.  i currently allow visitors and registered users to vote on how they like some parts of the site.  choices are from -3 (really bad) to +3 (really good), including a 0 option for people with no opinion who for some reason want to vote anyway.  currently the process is rather bulky — you have to click a link saying that you want to rate something, then you get the form that lets you set your rating.  if you’ve already rated it then your previous rating is replaced with the new one, but the only indication that you’ve voted already is the default rating when the rating form comes up.  if your vote was zero you get no indication.

the main issue i’d like to improve with my rating system is that hardly anyone uses it.  so i thought of how to make it easier and possibly more fun to use.  i will probably still have the problem that most hits to track7 come from bots and not actual people (and i don’t actually want the bots to vote!), but for the people who come around it would be nice if more of them would vote.  i came up with the following points which i think are likely to turn people away from voting:

  • each vote requires multiple clicks and two full page loads
  • no immediate indication whether you’ve already rated that item
  • ratings are shown as numbers (as in “rating:  2.5”), and most people don’t like seeing numbers
  • the descriptions for what the rating numbers should mean are boring

another issue that keeps people from voting is that i’ve been individually coding support for voting into each section that supports voting, so some areas where i want to allow votes don’t allow it at all.  i suspect people can’t tell the difference between me not wanting to allow votes and me not having added support for it yet, but it’s still a factor i would like to improve.

i’ve started on a new rating module that uses the exact same data structures (a votes table and a ratings table) as the current system.  the interface looks like 3 thumbs-down hands, a square, and 3 thumbs-up hands, in that order horizontally.  the graphics are outlines, which will be partially filled to indicate overall rating, and have darker outlines to show your rating if you’ve already rated it.  clicking on the outermost thumbs would add / change your vote of either plus or minus 3 (depending on if it was thumbs-up or thumbs-down), while the innermost thumbs are plus or minus 1.  clicking on the square registers a zero vote.  votes will be registered using javascript (ajax) if available, so there are no page loads involved.  hovering over one of the thumbs will highlight the number of thumbs you would vote for if clicking there, while hovering over the square highlights just the square.  each thumb and the square also have tooltips to describe what that particular rating should mean, such as “3 thumbs down — impossibly horrible” — i may attempt to come up with better descriptions, but that may wait until i have this working.  this system should address all the points i brought up earlier.

more recently i was comparing rating systems which allow users to choose various values (like mine with -3 through +3, or youtube / netflix with 1 through 5 stars) and average the results versus systems that allow people to say they like it (or sometimes dislike as well) and count up the number of likes minus the number of dislikes.  i call these the average system and the total system.  i realized that the total system favors older items since they’ve normally been seen by more people and have had more opportunity to be rated.  the limit to the rating is set by the number of people who happen to see it, which increases with time.  the average system ends up favoring newer items for a time since an older item is likely to have had at least one less than perfect rating, so a new item with one perfect rating immediately shoots to the top until someone else comes along and rates it less than perfect.  the highest a rating can ever be is the maximum single rating value, and once it’s been rated less than the max it will never actually reach the max (though with a significantly high number of max ratings it can look that way after rounding).

looking at how to give old and new items a more “fair” way to calculate overall rating, the average system can count a zero vote (equivalent to a 3-star vote in the 1 through 5 stars system) in with the averages.  this actually cuts the minimum and maximum in half, since the average of 3 and 0 is 1.5.  i am considering this for my rating system.  there could also be a threshold after an item has a certain number of votes it stops counting the extra zero vote.  the trick is figuring out where to set that threshold.  also if the threshold ever changes then all of the overall ratings need to be recalculated.

the total system needs to assign less value to older ratings than it does to newer ratings.  this actually means the overall rating needs to be almost constantly recalculated.  for example, if each day a vote counts 10% less than it did the previous day, overall rating would need to be recalculated daily.  also there is the question of how to determine the parameters for a old rating and how exactly it should be worth less than a new rating.  maybe losing 10% every day doesn’t make sense for a certain setup and it’s better to just delete votes that are over 30 days old.  then you have the question of whether people whose votes have expired are allowed to vote again.  it made me glad i went with the average system, which i think also has the benefit of being more useful when only one or two people are going to vote anyway.

comments / complaints / compliments

users online

1 guest

user list

statistics

hits today416
registered users184
forum posts408
comments153

powered by

  • dreamhost
  • linux
  • apache
  • php
  • mysql