枣上好!!!
你本次起床用时为32秒,起床时间为上午6:40,起床得分为2559分。
击败了全国87%的起床用户,
获得了早起的公鸡称号。
在许多评分类的软件,都会给出类似以上数据结果,那么他们都是怎么算出来的呢?
现在用python
来简单实现一下。
描述一组数据的常用指标
大家都参加过考试,所以现在用一份哎呦不错中学的考试成绩来做个例子,给大家介绍一下一些常用概念。(语文成绩 / 英语成绩 / 数学成绩 / 综合科成绩 )
平均数
平均数,统计学术语,是表示一组数据集中趋势的量数,是指在一组数据中所有数据之和再除以这组数据的个数。这个概念很容易理解,一般会用平均分来代表某个班的整体学习成绩水平。最大值
最大值,即为已知的数据中的最大的一个值。这个概念也很容理解,比如某个班成绩最高的是多少分,可以用来表述一组数据上限。最小值
最小值,即为已知的数据中的最小的一个值。这个概念也很容理解,很多时候都会用最低分来表示班里成绩最差的那一位。中位数
中位数(又称中值,英语:Median),统计学中的专有名词,代表一个样本、种群或概率分布中的一个数值,其可将数值集合划分为相等的上下两部分。对于有限的数集,可以通过把所有观察值高低排序后找出正中间的一个作为中位数。如果观察值有偶数个,则中位数不唯一,通常取最中间的两个数值的平均数作为中位数。百分位数
百分位数,统计学术语,如果将一组数据从小到大排序,并计算相应的累计百分位,则某一百分位所对应数据的值就称为这一百分位的百分位数,以Pk表示第k百分位数。
一般会用P25
、P50
、P75
来描述一份数据,也就是25%分位
、50%分位
、75%分位
。50%分位
也就是我们的中位数。方差
方差(英语:Variance),应用数学里的专有名词。在概率论和统计学中,一个随机变量的方差描述的是它的离散程度,也就是该变量离其期望值的距离。一个实随机变量的方差也称为它的二阶矩或二阶中心动差,恰巧也是它的二阶累积量。这里把复杂说白了,就是将各个误差之平方(而非取绝对值,使之肯定为正数),相加之后再除以总数,透过这样的方式来算出各个数据分布、零散(相对中心点)的程度。继续延伸的话,方差的正平方根称为该随机变量的标准差(此为相对各个数据点间)。
- 标准差
标准差(又称标准偏差、均方差,英语:Standard Deviation,缩写SD),数学符号σ(sigma),在概率统计中最常使用作为测量一组数值的离散程度之用。
很多时候都是用标准差来描述一组数组的离散程度,标准差跟原始数据是同一数量级的。
写几行python代码
import numpy as np
import matplotlib.pyplot as plt
def show_basic_value(score_list):
mean = np.mean(score_list)
total_score_median = np.median(score_list)
percentile_25 = np.percentile(score_list, 25)
percentile_75 = np.percentile(score_list, 75)
variance = np.var(score_list)
standard_deviation = np.std(score_list)
print('平均数:', mean, '中位数: ', total_score_median, ', 25%分位:', percentile_25, ', 75%分位:', percentile_75,
', 方差:', variance, ', 标准差:', standard_deviation, '\n')
return percentile_25, total_score_median, percentile_75
def draw_graph(score_list, name):
ranking_list = np.unique(score_list)
ranking_list_length = len(ranking_list)
count, bins, ignored = plt.hist(score_list, bins=ranking_list_length, density=True)
x_label = 'range: ' + str(ranking_list[0]) + ' ~ ' + str(ranking_list[-1])
print(name + '总体成绩范围:', x_label)
plt.xlabel(x_label)
plt.ylabel("proportion")
std = np.std(score_list)
mean = np.mean(score_list)
# 25% 50% 75% percentile value
percentile_25, total_score_median, percentile_75 = show_basic_value(score_list)
plt.vlines(percentile_25, 0, np.exp(-(percentile_25 - mean) ** 2 / (2 * std ** 2)) / (np.sqrt(2 * np.pi) * std),
colors="r", )
plt.vlines(total_score_median, 0,
np.exp(-(total_score_median - mean) ** 2 / (2 * std ** 2)) / (np.sqrt(2 * np.pi) * std), colors="r", )
plt.vlines(percentile_75, 0, np.exp(-(percentile_75 - mean) ** 2 / (2 * std ** 2)) / (np.sqrt(2 * np.pi) * std),
colors="r", )
plt.plot(bins, 1 / (std * np.sqrt(2 * np.pi)) * np.exp(- (bins - mean) ** 2 / (2 * std ** 2)), linewidth=2,
color='r')
plt.show()
chinese_score = np.loadtxt('./chinese_score.csv', delimiter=',')
chinese_score = np.around(chinese_score, decimals=1)
draw_graph(chinese_score, '语文')
math_score = np.loadtxt('./math_score.csv', delimiter=',')
math_score = np.around(math_score, decimals=1)
draw_graph(math_score, '数学')
english_score = np.loadtxt('./english_score.csv', delimiter=',')
english_score = np.around(english_score, decimals=1)
draw_graph(english_score, '英语')
comprehensive_score = np.loadtxt('./comprehensive_score.csv', delimiter=',')
comprehensive_score = np.around(comprehensive_score, decimals=1)
draw_graph(comprehensive_score, '综合科')
total_score = chinese_score + math_score + english_score + comprehensive_score
draw_graph(total_score, '总分')
画几张图
语文总体成绩范围: range: 48.0 ~ 137.0
平均数: 90.322 中位数: 90.0 , 25%分位: 81.0 , 75%分位: 101.0 ,
方差: 222.21031599999998 , 标准差: 14.90672049781574
数学总体成绩范围: range: 14.0 ~ 142.0
平均数: 79.119 中位数: 79.0 , 25%分位: 66.0 , 75%分位: 93.0 ,
方差: 404.26283900000004 , 标准差: 20.106288543637287
英语总体成绩范围: range: 35.0 ~ 139.0
平均数: 85.067 中位数: 85.0 , 25%分位: 74.0 , 75%分位: 96.0 ,
方差: 269.724511 , 标准差: 16.42329172242885
综合科总体成绩范围: range: 88.0 ~ 300.0
平均数: 200.422 中位数: 199.0 , 25%分位: 179.0 , 75%分位: 221.0 ,
方差: 936.955916 , 标准差: 30.609735640805525
总分总体成绩范围: range: 308.0 ~ 602.0
平均数: 454.93 中位数: 454.0 , 25%分位: 427.75 , 75%分位: 483.0 ,
方差: 1847.2231 , 标准差: 42.979333405719544
那谁谁很牛批吗?
有了总体成绩之后,就可以计算出某一位学生,他的学习成绩,在在总体里面的排名,检查一下他的优势与劣势。文章一开始那样,算出她的排名。
def show_person_score(score, score_list, name):
fig_size = plt.gcf().get_size_inches()
plt.gcf().set_size_inches(5 * fig_size)
ranking_list = np.unique(np.append(score_list, score))
position = np.where(ranking_list == score)[0][0]
length = len(ranking_list)
color = ['black' for _ in range(length)]
color[position] = 'red'
plt.barh(range(length), ranking_list, color=color)
ticks = [x + 1 for x in np.flip(range(length))]
ticks[position] = '-->' + str(length - position)
plt.yticks(range(length), ticks)
plt.show()
_score_list = np.sort(np.append(score_list, score))
percentile_position = np.where(_score_list >= score)[0][0]
percentile = str(np.around(percentile_position / len(_score_list) * 100, 2))
# Z = (X - X_bar) / S
# 式中,X为原始分数,X_bar为原始分的平均数,S为原始分的标准差。
mean = np.mean(score_list)
standard_deviation = np.std(score_list)
standard_score = (score - mean) / standard_deviation * 100 + 100
print(name, score, '排名:', str(length - position), '百分位: ', percentile + '%', '标准分:', standard_score)
tom_chinese_score = 123
tom_math_score = 98
tom_english_score = 107
tom_comprehensive_score = 224
tom_total_score = tom_chinese_score + tom_math_score + tom_english_score + tom_comprehensive_score
show_person_score(tom_chinese_score, chinese_score, '陈小花的语文成绩:')
show_person_score(tom_math_score, math_score, '陈小花的数学成绩:')
show_person_score(tom_english_score, english_score, '陈小花的英语成绩:')
show_person_score(tom_comprehensive_score, comprehensive_score, '陈小花的综合科成绩:')
show_person_score(tom_total_score, total_score, '陈小花的总分成绩:')
再来几张图
陈小花的语文成绩: 123 排名: 8 超越了: 98.4% 标准分: 319.2165607773236
陈小花的数学成绩: 98 排名: 32 超越了: 81.22% 标准分: 193.9059437002607
陈小花的英语成绩: 107 排名: 22 超越了: 89.61% 标准分: 233.5481362122229
陈小花的综合科成绩: 224 排名: 55 超越了: 78.12% 标准分: 177.02778056197394
陈小花的总分成绩: 552 排名: 13 超越了: 98.3% 标准分: 325.8527350428433
一些结论
陈小花的总体成绩很好,名列前茅,但是他的综合科成绩还有提升的空间。
补充一个概念
- 标准分
标准分数(Standard Score,又称z-score,中文称为Z-分数或标准化值)在统计学中是一种无因次值,就是一种纯数字标记,是借由从单一(原始)分数中减去母体的平均值,再依照母体(母集合)的标准差分割成不同的差距,按照z值公式,各个样本在经过转换后,通常在正、负五到六之间不等。
原始分反映了考生答对题目的个数,或作答正确的程度。但是,原始分一般不能直接反映出考生间差异 状况,不能刻划出考生相互比较后所处的地位,也不能说明考生在其他等值测试上应获得什么样的分值。
⬇️⬇️⬇️所有代码⬇️⬇️⬇️
https://github.com/kk412027247/python_for_data_analysis/blob/master/basic_concept.py