3.3 百分位数

标准化考试的成绩一般会以两种形式呈现,一种是原始分数,另一种则是百分等级(percentile rank)。在这里,百分等级就是原始分数不高于你的人在全部考试人数中所占的比例再乘以100。所以,如果你在90百分位数,那就是说你比90%的人成绩好,或者至少不比90%的考试人员差。

下面的代码可以计算出给定值的百分等级,这里给定值是your_score,所有分数是scores:

def PercentileRank(scores, your_score): 
  count = 0 
  for score in scores: 
    if score <= your_score: 
      count += 1 

  percentile_rank = 100.0 * count / len(scores) 
  return percentile_rank

例如,如果这串分数是55、66、77、88和99,而你的分数是88。那么你的百分等级就是100 * 4/5,等于80。

对于给定的值,很容易计算出百分等级,但反过来就要困难些。对于给定的百分等级,要找到对应的值,一种解决方法就是对所有的值排序,然后搜索想要的值:

def Percentile(scores, percentile_rank): 
  scores.sort() 
  for score in scores: 
    if PercentileRank(scores, score) >= percentile_rank: 
      return score

结果就是一个百分位数。例如,50百分位数就是百分等级为50的值。在前面的考试分数分布中,50百分位数就是77。

习题3-3

前面实现的Percentile的效率并不高。一种更好的方法是用百分等级计算相应的百分位数的索引。用这个算法实现一个新版的Percentile。

答案可以从http://thinkstats.com/score_example.py下载。

习题3-4

选做:如果要计算某个百分位数,采用分数排序很低效。更好的解决办法是用选择算法,详见 http://wikipedia.org/wiki/Selection_algorithm

实现选择算法,或者找一个现成的实现,用它编写一个更高效的Percentile函数。