接上一篇 excel画boxplot的q1和q3值和excel公式QUARTILE.INC(array,quart)拉出来的不一样,晚饭后来交作业了,还是以那10个语文成绩为例,计算boxplot的min,q1,q2(median),q3,max,python code如下:
import numpy as np
import math
score_list=[85,88,70,75,80,84,53,79,86,90]#没排序的语文成绩
#定义boxplot的q1, q2=median, q3
def q_index(list,order):
list_new = sorted(list)#input list由小到大排序:[53, 70, 75, 79, 80, 84, 85, 86, 88, 90]
if (order*(len(list_new)+1))%4==0:
index=int(((order*(len(list_new)+1))/4)-1)
return list_new[index]
else:
index=((order*(len(list_new)+1))/4)-1
index1=math.floor(index)#8
index2=index1+1#9
ratio1=index-index1#0.25
ratio2=index2-index#0.75
return(list_new[index1]*ratio2+list_new[index2]*ratio1)
print(q_index(score_list,1))#q1=73.75
print(q_index(score_list,2))#q2=median=82.0
print(q_index(score_list,3))#q3=86.5
#定义boxplot的上下界,不包含outlier在内的max and min
def boxplot_fill(col):
# 计算iqr:数据四分之三分位值与四分之一分位值的差
iqr = q_index(col,3)-q_index(col,1)
# 根据iqr计算异常值判断阈值
u_th = q_index(col,3)+ 1.5*iqr # 上界 max
l_th = q_index(col,1) - 1.5*iqr # 下界 min
#print(u_th,l_th) #ok
#如果数字大于上界则舍去,用剩余的最大值作为max,小于下界则舍去,用剩余最小值作为min。
def box_trans(x):
if x > u_th:
return np.nan#大于上界max的outlier赋值为nan
elif x < l_th:
return np.nan#小于下界min的outlier赋值为nan
else:
return x
#print(list(map(box_trans,col)))
return list(map(box_trans,col))
print(np.nanmin(boxplot_fill(score_list)))#min=70.0
print(np.nanmax(boxplot_fill(score_list)))#max=90.0
#最后把上面两个函数包装进来,用这一个函数就可以得到我们要的boxolot的5个值了
def box_5_canshu(col,number):
if number == 4:
return str(np.nanmax(boxplot_fill(col)))
if number == 3:
return str(q_index(col,3))
if number == 2:
return str(q_index(col,2))
if number == 1:
return str(q_index(col,1))
if number == 0:
return str(np.nanmin(boxplot_fill(col)))
print(box_5_canshu(score_list,0))#min=70.0
print(box_5_canshu(score_list,1))#q1=73.75
print(box_5_canshu(score_list,2))#q2=median=82.0
print(box_5_canshu(score_list,3))#q3=86.5
print(box_5_canshu(score_list,4))#max=90.0
下面是对答案环节:
看上去和excel自动生成的boxplot*(这是上一篇的图,有兴趣的小伙伴可以翻上一篇文章看笔记哦)那5个数字一样,ok!
下篇计划: 我刚刚突然想到,python写出这些值以后就可以直接把生成的txt导入excel手动生成带趋势线的boxplot,5个数字不变,只是换成另一种画法,生命不息,笔记不停,我应该不是刚刚吃太饱了觉得写笔记好像很好玩。。。