今天要完成一个数据大屏,我们想做一个板块:订单金额分布
怎么做呢?订单金额是连续型数据,订单金额随时在发生变化
其实是一个直方图制作,涉及到分箱技术
那如何实现自动分箱,自动将金额相近的订单金额分到同一组,尽可能体现组间差异性,组内相似性呢?
我们研究了excel制作直方图的原理
其实只要能确定箱子宽度,其他的自然就确定了
1、箱宽度:(3.5 * sigma)/n^(1/3)
sigma : 数据源的标准差
n:数据量大小
python 代码
import pandas as pd
import numpy as np
#虚拟一组数据
data = [0.1,0.1,0.1,0.1,0.1,0.1,45,46,48,49,102,104,105,105,106,200]
n = len(data) #计算样本量
sigma = np.std(data) #计算标准差
d = (3.5*sigma)/pow(n,1/3) #计算箱宽
d
out:78.82326487903292
#计算每个箱子的临界值
b = min(data)
bi = [b]
while b < max(data):
b = b + d
bi.append(round(b))
bi
out:[0.1, 79.0, 158.0, 237.0]
#判段源数据每个值属于哪个箱子
box = []
for i in data:
for j in range(len(bi)):
if bi[j]<=i and i
box.append(j)
box
out:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2]
#计算每个箱子的数值频数(纵坐标)
from collections import Counter
Counter(box).values()
out:dict_values([10, 5, 1]) #纵坐标
#制作横坐标
ci=[]
for i in bi:
a = i
b = a + d
c = '{}~{}'.format(round(a),round(b))
ci.append(c)
ci
out:['0~79.0', '79.0~158.0', '158.0~237.0', '237.0~316.0']
#画图
from matplotlib import pyplot as plt
plt.bar(ci[:3],list(Counter(box).values()))