在广告和推荐系统当中,一个重要的衡量指标就是点击率,也即是CTR(Click Through Rate)。
计算公式: CTR = 点击数 / 曝光数
也有一种衡量指标是 uvCTR。 uvCTR = 点击uv数 / 曝光uv数。
考虑 CTR = 点击数 / 曝光数 这个公式的指标,只考虑了比例的关系,但没考虑样本数大小。因为样本数少的情况下,这个比例其实是不准确的;而样本数越大,这个比例越准确,越能反映真实情况。
举个例子,有三个广告:
A:点击数 2 曝光数 10
B:点击数 20 曝光数 100
C:点击数 200 曝光数 1000
它们的 CTR 都是 0.2 。但是很明显,从置信度来讲,是 C > B > A。因为C的样本数更多,C 的 0.2 CTR更加反映真实,更加可信。
为了衡量样本数对于 CTR 置信区间的影响,我们引入"威尔逊(Wilson)区间"的概念。公式如下:

p —— 概率,在这里指点击的概率,也就是 CTR
n —— 样本总数。在这里指 曝光数
z —— 在正态分布里,均值 + z * 标准差 会有一定的置信度。例如 z 取 1.96,就有 95% 的置信度。
Wilson区间的含义就是,就是指 在一定置信度下, 真实的 CTR 范围是多少。举一个例子,如下面代码所示。计算刚刚如上所述的 A、B、C 三个广告的 Wilson 区间( z取 1.96,也就是说该区间的置信度为 95% )。
from math import sqrt def confidence(clicks, impressions): n = impressions if n == 0: return 0 z = 1.96 #1.96 -> 95% confidence phat = float(clicks) / n denorm = 1. + (z*z/n) enum1 = phat + z*z/(2*n) enum2 = z * sqrt(phat*(1-phat)/n + z*z/(4*n*n)) return (enum1-enum2)/denorm, (enum1+enum2)/denorm def wilson(clicks, impressions): if impressions == 0: return 0 else: return confidence(clicks, impressions) if __name__ == '__main__': print wilson(2,10) print wilson(20,100) print wilson(200,1000) """ -------------------- results: (0.07048879557839793, 0.4518041980521754) (0.14384999046998084, 0.27112660859398174) (0.1805388068716823, 0.22099327100894336) """
从结果可以看到
A:点击数 2 曝光数 10 点击率 95% 置信度的置信区间为 (0.07, 0.45)
B:点击数 20 曝光数 100 点击率 95% 置信度的置信区间为 (0.14, 0.27)
C:点击数 200 曝光数 1000 点击率 95% 置信度的置信区间为 (0.18, 0.22)
在实际的应用上面,就会取最低值,作为修正后的 Wilson CTR。也就是 A 的 Wilson CTR 为 0.07,B 的 Wilson CTR 为 0.14,C 的 Wilson CTR 为 0.18。这相当于是给样本数不足的CTR进行一定的衰减降权。

随时随地看视频