数学分析综合实战(三)

47 阅读2分钟

堆叠柱形图可视化数据分析图表的实现

堆叠柱状图可以直观、贴切地反映出不同产品、不同人群的体验效果,一目了然。例如,明日科技男女会员分布情况。效果如图展示。

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
import matplotlib as mpl
mpl.use('TkAgg')

sns.set_style('darkgrid')
file ='mrtb_data.xlsx'
df = pd.DataFrame(pd.read_excel(file))
plt.rc('font', family='SimHei', size=13)
# 通过reset_index()函数将groupby()的分组结果重新设置索引
df1 = df.groupby(['类别'])['买家实际支付金额'].sum()
df2 = df.groupby(['类别','性别'])['买家会员名'].count().reset_index()

men_df=df2[df2['性别']=='男']
women_df=df2[df2['性别']=='女']
men_list=list(men_df['买家会员名'])  #读取数据,转成list
women_list=list(women_df['买家会员名'])
num=np.array(list(df1))  #消费金额

#计算男性用户比例
ratio=np.array(men_list)/(np.array(men_list)+np.array(women_list)) #np.array将列表/元组转换为Numpy数组,便于计算
np.set_printoptions(precision=2) #使用set_printoptions设置输出的精度
#设置男生女生消费金额
men = num * ratio
women = num * (1-ratio)
df3=df2.drop_duplicates(['类别'])   #去除类别重复的记录
name=(list(df3['类别']))
#生成图表
x = name
width = 0.5
idx = np.arange(len(x))
plt.bar(idx, men, width,color='slateblue', label='男性用户')
plt.bar(idx, women, width, bottom=men, color='orange', label='女性用户')
plt.xlabel('消费类别')
plt.ylabel('男女分布')
plt.xticks(idx+width/2, x, rotation=20)
#在图表上显示数字
for a,b in zip(idx,men):
    plt.text(a, b, '%.0f' % b, ha='center', va='top',fontsize=12)  #对齐方式'top', 'bottom', 'center', 'baseline', 'center_baseline'
for a,b,c in zip(idx,women,men):
    plt.text(a, b+c+0.5, '%.0f' % b, ha='center', va= 'bottom',fontsize=12)
plt.legend()
plt.show()

image.png

统计双色球中奖号码热力图

下面使用Seaborn热力图统计双色球中奖数据,每一位中奖号码出现的次数的分布情况:

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
import matplotlib as mpl
mpl.use('TkAgg')

sns.set()       # 使用默认设置
plt.figure(figsize=(6,6))
plt.rcParams['font.sans-serif'] = ['SimHei']   # 显示中文
df=pd.read_csv('cp.csv',encoding='utf-8')    #导入Excel文件
series=df['中奖号码'].str.split('  ',expand=True) #提取每一位中奖号码
#对每一位中奖号码统计出现次数
df1=df.groupby(series[0]).size()
df2=df.groupby(series[1]).size()
df3=df.groupby(series[2]).size()
df4=df.groupby(series[3]).size()
df5=df.groupby(series[4]).size()
df6=df.groupby(series[5]).size()
df7=df.groupby(series[6]).size()
#横向表合并(行对齐)
data = pd.concat([df1,df2,df3,df4,df5,df6,df7], axis=1,sort=True)
data=data.fillna(0)   #空值NaN替换为0
data=data.round(0).astype(int)#浮点数转换为整数
plt.title('统计2014~2019年双色球中奖号码热力图')
sns.heatmap(data,annot=True, cmap='coolwarm', fmt='d', lw=0.5)#绘制热力图,linewidths: 热图中每个矩形之间的间隔线宽度,annot: 是否显示每个单元格的数值,fmt: 数值格式,用于控制annot参数输出数值的格式
plt.xlabel('中奖号码位数')
plt.ylabel('双色球数字')
x=['第1位','第2位','第3位','第4位','第5位','第6位','第7位']
plt.xticks(range(0,7,1),x,ha='left')
plt.show()

image.png