问题描述
问答类网站,用户可以支持或反对某个回答,那么可以根据支持率对所有回答进行排序:
p = 支持数 支持数 + 反对数 p=\frac{\text{支持数}}{\text{支持数}+\text{反对数}} p=支持数+反对数支持数
回答A有8个支持2个反对,回答B有70个支持30个反对。虽然回答B的支持率较低,但回答A的支持率的可信度较低,因为参与投票的数量只有10个。
比如亚马逊灯泡热销TOP100,两者评分都是4.5,但显然后者的4.5更可信。
PS:这里只是举个例子,亚马逊排行榜考量了诸多因素,并不单纯靠评分排序。
解决方案
p越大代表这个回答越好,应该排在前面。但是,p的可信度也应该取决于有多少人投票。
如果样本太小,p就不可信。即需要计算出p的置信区间下限。
支持率相同的情况下,置信区间下限越大,排名应越靠前。
代码
假设掷骰子需要掷出6,掷了235次。如果是公平的,数学期望应该为
235
×
1
6
=
39.1667
235\times \frac{1}{6}=39.1667
235×61=39.1667
但是在实验中掷出6共51次,计算置信度。
from scipy.stats import binom_test
print(binom_test(x=51, n=235, p=1/6, alternative='less')) # 单侧检验(下限)
print(binom_test(x=51, n=235, p=1/6, alternative='greater')) # 单侧检验(上限)
print(binom_test(x=51, n=235, p=1/6, alternative='two-sided')) # 双侧检验
# 0.982022657605857
# 0.02654424571169947
# 0.043747970182413345
假设显著性水平为5%,那么0.02654<5%说明这次实验不公平。
其他
from scipy.stats import binom_test
print(binom_test(x=[8, 2], n=110, alternative='less'))
print(binom_test(x=[70, 30], n=110, alternative='less'))
# 0.9892578125
# 0.9999839199923521
回答A有8个支持2个反对,回答B有70个支持30个反对。但回答B比回答A更可信