教程来自扇贝编程
数值分析:
平均数、中位数、分位数、众数、极差、方差、标准差
均值
均值也称为平均值或平均数。它等于数值之和除以数值个数。当数值在列表中时,我们可以用Python内置的sum() 来计算列表内的数值之和,用 len() 来计算列表内的数值个数。
# score 内是学生在某个Python项目上的得分
score = [96,80,85,79,92,42,84,72,93,77]
# ave_score 计算score的均值
sum_score = sum(score)
print(sum_score) # 输出:800
num_score = len(score)
print(num_score) # 输出:10
ave_score = sum_score / num_score
print(ave_score) # 输出: 80.0
上例中,学生的总分 sum_score 为 800,分数 num_score 有10个,均值 ave_score 为 80.0
中位数
中位数是指一组数值中间点的值,当数值个数为奇数时,中位数就正好是中间点的值;如果数值个数为偶数,中位数为中间两个点的均值。
我们来看如何用代码计算一组数值的中位数,首先需要大家知道 Python 内置的 sorted(),它可以将一组数值自小到大排序:
numbers = [2,3,4,2]
sorted_numbers = sorted(numbers)
print(sorted_numbers)
# 输出:[2, 2, 3, 4]
在此基础上,我们写个函数求中位数:
def get_median(numbers):
"""
找到numbers最中间的数
"""
length = len(numbers) #数值个数
sorted_numbers = sorted(numbers) #将数值排序
mid_point = int(length/2) #中位数的位置,需要是int类型
if length % 2 == 1: # 如果数值个数为奇数
median = sorted_numbers[mid_point]
else: # 如果数值个数为偶数
# 中位数为中间两个数 mid_a 和 mid_b 的均值
mid_a = sorted_numbers[mid_point-1]
mid_b = sorted_numbers[mid_point]
median = (mid_a + mid_b)/2
# 函数返回 median
return median
score = [96,80,85,79,92,42,84,72,93,77]
print(get_median(score))
# 输出:82.0
分位数
分位数:它是指一组数值中,大于或等于特定百分比的一个值。比如,75分位指一组数值中,大于或等于75%数值的值。
我们来写一个函数,计算一组数值中的 n分位数是多少:
def find_nperc(numbers,n):
"""
返回numbers中,n分位对应的数值是多少
"""
# 先将数值排序
sorted_numbers = sorted(numbers)
# 找到n分位对应数值的索引位置
n_index = int(n/100 * len(sorted_numbers))
return sorted_numbers[n_index]
score = [96,80,85,79,92,42,84,72,93,77]
print("25分位数为{}".format(find_nperc(score,25)))
# 输出:25分位数为77
print("75分位数为{}".format(find_nperc(score,75)))
# 输出:75分位数为92
众数
一组数值中,出现频次最多的数值为众数,有时一组数值中会有多个众数。
借此机会,我们学习Python中内置的max(),它可以返回一组列表中数值最大的元素。
下方函数求得一个列表 numbers 中的众数,思路如下:
1)用 count() 计算列表 numbers 中每个元素出现的次数;
2)将上述元素和对应的出现次数存入字典 count_num 中;
3)用 max() 找到 count_num 中最大的值,并找到拥有该值的字典键添加到 max_count_num 中;
4)max_count_num 中的元素就是众数,count_num 是众数出现的次数。
def get_mode(numbers):
"""
返回 numbers中出现次数最多的数值(众数)及其出现次数
"""
count_num = {}
max_count_num = []
# 循环numbers,建立字典 count_num:{数值:出现次数}
for num in numbers:
count_num[num] = numbers.count(num)
# 循环count_num
# 用max() 得到数值出现次数的最大值,赋值给 max_count
# 将出现次数最大值的数值(众数)放入 max_count_num
for num,count in count_num.items():
if count == max(count_num.values()):
max_count = count
max_count_num.append(num)
return "众数为{},出现次数{}次".format(max_count_num,max_count)
score = [96,80,85,79,93,42,84,72,93,77]
print(get_mode(score))
# 众数为[93],出现次数2次
极差
有些情况下,当我们面对一组数据时,我们会分析它的“分散”情况。
极差是指一组数据中最大值减去最小值的差。
极差虽然简单易得,但是有其局限性。它只受数据中的最大值和最小值影响。
我们可以用 max() 来获得数据的最大值,用 min() 来获得数据的最小值。
# score 是一群学生在某个Python项目上的得分
score = [96,80,85,79,92,42,84,72,93,77]
# score_range 为 score 的极差
score_range = max(score) - min(score)
print(score_range)
# 输出:54
方差
方差:在一组数据集中,数值与均值之间的距离。
在下方图中,我们红点与蓝点所代表的数据集均值相同(黄线水平),但是用肉眼来看,我们发现红点较集中在均值附近,而蓝点则较远。可以初步判断,红点所代表数据集的方差要小于蓝点。如果一组数据集的方差越大,那么数据集的“波动性”也会越大。
方差的计算方法为:
1)先求得一组数据集的均值 mean;
2)用数据集中的每一个数值减去均值,其差为 de_mean;求每个差值 de_mean 的平方 sqr;
3)将所有 sqr 相加,得到和为 sum_sqr;
4)如果数据集的数据个数为 n,则 sum_sqr / (n-1) 的结果,即是该数据集的方差 variance。
# score 是一群学生在某个Python项目上的得分
score = [96,80,85,79,92,42,84,72,93,77]
# 1)先求得一组数据集的均值 mean;
mean = sum(score) / len(score)
# 2)用数据集中的每一个数值减去 mean,并求得差值的平方 sqr,
# 将所有 sqr 相加,求得 sum_sqr;
sum_sqr = 0
for num in score:
sum_sqr += (num - mean) ** 2
# 3)求 sum_sqr / (n-1),结果就是方差 variance。
variance = sum_sqr / (len(score)-1)
print(variance)
# 输出:236.44444444444446
标准差
上一页讲到的方差是一系列平方的求和,比较难以理解和沟通。因此人们在方差的基础上创造了更便于交流、理解的概念——标准差。标准差为方差的平方根。
# variance 为刚才计算的方差:
variance = 236.44
# 标准差为 variance 的平方根
standard_deviation = variance ** 0.5
print(standard_deviation)
# 输出:15.37660560722034
另外,我们之前学过 Python 中内置的 Math 库,其中有计算平方根的 .sqrt() 方法,我们也可以通过其来根据方差计算标准差:
import math
variance = 236.44
standard_deviation = math.sqrt(variance)
print(standard_deviation)
# 输出:15.37660560722034
网友评论