I have a site in which users rate things in a 1-5 star system. Once an item reaches the top of the charts, some users tend to start rating it 1 star even though it got a majority of 4-5 stars to get where it's at. It's not rampant, I would say 10-20% of the new votes are 1's. Clearly they are trying to manipulate the rating system, and I want to prevent that.
The current way I am doing that is by having a "reasonable window" of what I consider to be a legitimate vote.
For items with less than 10 votes; I currently do nothing and take the mean as it's rating.
Once an item starts getting more than 10 votes I tie them to a window of their mean. This window is defined as
Window = 4.5 - Log(TotalVotes, 10);
So a reasonable vote range is then (Mean - Window) thru (Mean + Window)
Once the reasonable vote range is found, the "Rating" is just the mean of all the reasonable votes (those who fall in the reasonable range).
This means an item with a real mean of 4.2 with 100 votes would have a window of 4.5-Log(100,10) = 2.5
, so if that item gets a 1 star vote, it will be ignored in the rating. However, the 1 star will still effect the underlying mean.
This has worked good in general but the issue is when an item's Mean - Window
is just at the brink of 1.0, as soon as it dips below 1.0 every 1 star vote now is included in the rating and the rating drops significantly even the difference before and after may have just been one more 1 star rating.
I need a better system/way of accomplishing to filter out these 1 star ratings, and not just them but handle the situation in where someone may get their friends to upvote an item 10 votes and all 5 stars, where its true rating may be more 3 star.
Looking for any recommendations of how to handle user-driven rating systems and normalizing outlier votes.