用python做简单的数据统计

304b496d614e63746a50.jpg

枣上好!!!
你本次起床用时为32秒,起床时间为上午6:40,起床得分为2559分。
击败了全国87%的起床用户,
获得了早起的公鸡称号。

在许多评分类的软件,都会给出类似以上数据结果,那么他们都是怎么算出来的呢?
现在用python来简单实现一下。

描述一组数据的常用指标

大家都参加过考试,所以现在用一份哎呦不错中学的考试成绩来做个例子,给大家介绍一下一些常用概念。(语文成绩 / 英语成绩 / 数学成绩 / 综合科成绩 )

  • 平均数
    平均数,统计学术语,是表示一组数据集中趋势的量数,是指在一组数据中所有数据之和再除以这组数据的个数。这个概念很容易理解,一般会用平均分来代表某个班的整体学习成绩水平。

  • 最大值
    最大值,即为已知的数据中的最大的一个值。这个概念也很容理解,比如某个班成绩最高的是多少分,可以用来表述一组数据上限。

  • 最小值
    最小值,即为已知的数据中的最小的一个值。这个概念也很容理解,很多时候都会用最低分来表示班里成绩最差的那一位。

  • 中位数
    中位数(又称中值,英语:Median),统计学中的专有名词,代表一个样本、种群或概率分布中的一个数值,其可将数值集合划分为相等的上下两部分。对于有限的数集,可以通过把所有观察值高低排序后找出正中间的一个作为中位数。如果观察值有偶数个,则中位数不唯一,通常取最中间的两个数值的平均数作为中位数。

  • 百分位数
    百分位数,统计学术语,如果将一组数据从小到大排序,并计算相应的累计百分位,则某一百分位所对应数据的值就称为这一百分位的百分位数,以Pk表示第k百分位数。
    一般会用P25P50P75来描述一份数据,也就是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, '总分')

画几张图

chinese_score.png

语文总体成绩范围: range: 48.0 ~ 137.0
平均数: 90.322 中位数: 90.0 , 25%分位: 81.0 , 75%分位: 101.0 ,
方差: 222.21031599999998 , 标准差: 14.90672049781574

comprehensive_score.png

数学总体成绩范围: range: 14.0 ~ 142.0
平均数: 79.119 中位数: 79.0 , 25%分位: 66.0 , 75%分位: 93.0 ,
方差: 404.26283900000004 , 标准差: 20.106288543637287

english_score.png

英语总体成绩范围: range: 35.0 ~ 139.0
平均数: 85.067 中位数: 85.0 , 25%分位: 74.0 , 75%分位: 96.0 ,
方差: 269.724511 , 标准差: 16.42329172242885

match_score.png

综合科总体成绩范围: range: 88.0 ~ 300.0
平均数: 200.422 中位数: 199.0 , 25%分位: 179.0 , 75%分位: 221.0 ,
方差: 936.955916 , 标准差: 30.609735640805525

total_score.png

总分总体成绩范围: 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, '陈小花的总分成绩:')

再来几张图

tom_chinese_score.png

陈小花的语文成绩: 123 排名: 8 超越了: 98.4% 标准分: 319.2165607773236

tom_math_score.png

陈小花的数学成绩: 98 排名: 32 超越了: 81.22% 标准分: 193.9059437002607

tom_english_score.png

陈小花的英语成绩: 107 排名: 22 超越了: 89.61% 标准分: 233.5481362122229

tmd_comprehensive_score.png

陈小花的综合科成绩: 224 排名: 55 超越了: 78.12% 标准分: 177.02778056197394

tom_total_score.png

陈小花的总分成绩: 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

你可能感兴趣的:(用python做简单的数据统计)