Python数据分析实战:自动售货机销售数据可视化与分析
Python数据分析实战:自动售货机销售数据可视化与分析
3.2 分析商品销售情况
# 查看数据类型
new_goods_data.dtypes
# 将'购买数量'转换为整型
new_goods_data['购买数量'] = new_goods_data['购买数量'].astype(int)
# 按'产品名称'分组并求和,按'购买数量'排序
num = new_goods_data.groupby('产品名称').agg(sum).sort_values('购买数量', ascending=False)
# 使用ggplot风格绘制水平条形图
plt.style.use('ggplot')
plt.barh(range(20), num['购买数量'][:20])
plt.yticks(range(20), num.index[:20])
plt.ylabel('产品名称')
plt.xlabel('销售量')
plt.title('销售量排行榜(前二十)')
plt.show()
3.3 分析某一台设备不同时间的销售情况
# 对设备编号为112866的设备进行销售情况分析
# 筛选出设备编号为112866的数据
ind = data2['设备编号'] == 112866
data_112 = data2.loc[ind, :]
# 查看数据形状和列名
data_112.shape
data_112.columns
# 按日期分组并求和
data_112['date'] = data_112['下单时间'].dt.date
data_112['income'] = data_112['总金额(元)'] - data_112['退款金额(元)']
num = data_112[['date', 'income']].groupby('date').sum().sort_index()
# 绘制日期和销售额折线图
plt.plot(num.index, num)
plt.xticks(num.index[::8], num.index[::8], rotation=90)
plt.show()
# 按星期几分组并求和
data_112['weekday'] = data_112['下单时间'].dt.weekday
num = data_112[['weekday', 'income']].groupby('weekday').sum().sort_index()
# 绘制星期几和销售额折线图
plt.plot(num.index, num)
plt.xticks(num.index, num.index, rotation=90)
plt.show()
# 按月份和星期几分组并求和
data_112['month'] = data_112['下单时间'].dt.month
num = data_112[['weekday', 'income', 'month']].groupby(['month', 'weekday']).sum()
num = num.unstack() #最内层的行索引还原成了列索引
week = [0, 1, 2, 3, 4, 5, 6]
num2 = num.loc[:, [('income', i) for i in week]]
# 绘制不同月份不同星期的销售额折线图
for i in range(5, 10):
plt.plot(week, num2.loc[i, :])
plt.legend([f'{i}月' for i in range(5, 10)])
plt.show()
# 按小时分组并求和
data_112['hour'] = data_112['下单时间'].dt.hour
num = data_112[['hour','income']].groupby('hour').sum().sort_index()
# 绘制不同小时的销售额折线图
plt.plot(num.index,num)
plt.xticks(num.index,num.index,rotation=90) #rotation旋转角度下标
plt.show()
# 按月份和小时分组并求和
num = data_112[['hour','income','month']].groupby(['month','hour']).sum()
num = num.unstack().fillna(0) #fillna 缺失值填为0
# 绘制不同月份不同小时的销售额折线图
for i in range(5, 10):
plt.plot(range(24), num.loc[i, :])
plt.legend([f'{i}月' for i in range(5, 10)])
plt.show()
# 按星期几和小时分组并求和
num = data_112[['hour', 'income', 'weekday']].groupby(['weekday', 'hour', ]).sum()
num = num.unstack().fillna(0)
# 绘制不同星期几不同小时的销售额折线图
for i in num.index:
plt.plot(range(24), num.loc[i, :])
plt.legend(num.index)
plt.show()
3.4 分析城市销售情况
# 不同日期的销售情况
data2['date'] = data2['下单时间'].dt.date
data2['income'] = data2['总金额(元)'] - data2['退款金额(元)']
num = data2[['date', 'income']].groupby('date').sum().sort_index()
plt.plot(num.index, num)
plt.xticks(num.index[::8], num.index[::8], rotation=90)
plt.show()
# 不同星期的销售情况
data2['weekday'] = data2['下单时间'].dt.weekday
num = data2[['weekday', 'income']].groupby('weekday').sum().sort_index()
num = num.loc[[0,1,2,3,4,5,6],:]
plt.plot(num.index, num)
plt.xticks(num.index, num.index, rotation=90)
plt.show()
# 3.4 分析城市销售情况
num = data2[['city', 'income']].groupby('city').sum().sort_values('income')
plt.barh(num.index,num['income'])
plt.show()
# 绘制地理图表展示城市之间的空间关系
from pyecharts.charts import Geo, Map
import pyecharts.options as opts
from pyecharts.globals import ChartType
(
Geo()
.add_schema(maptype='广东')
.add('', [(i, int(j)) for i,j in zip(num.index, num['income'])],
type_=ChartType.EFFECT_SCATTER)
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(
title_opts=opts.TitleOpts(title='各个城市销售量情况', subtitle='2018/4-2018/9'),
visualmap_opts=opts.VisualMapOpts(max_=max(num.max()), is_piecewise=True)
)
).render('./各个城市销售量情况.html')
# 绘制地理图表展示不同月份不同城市之间的空间关系
from pyecharts.charts import Geo, Timeline
import pyecharts.options as opts
from pyecharts.globals import ChartType
data2['month'] = data2['下单时间'].dt.month
num = data2[['month', 'income', 'city']].groupby(['month', 'city']).sum()
num2 = num.unstack()
num2 = num2.fillna(0)
tmp = {}
for i in range(4, 10):
num = num2.loc[i, :]
tmp[i] = (
Geo()
.add_schema(maptype='广东')
.add('', [(i[1], int(j)) for i, j in zip(num.index, list(num.values))],
type_=ChartType.EFFECT_SCATTER)
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(
title_opts=opts.TitleOpts(title='各个城市销售量情况', subtitle='2018/4-2018/9'),
visualmap_opts=opts.VisualMapOpts(max_=max(num2.max()), is_piecewise=True)
)
)
tl = Timeline()
for i in range(4, 10):
tl.add(tmp[i], str(i)+'月')
tl.render('./各个城市销售量情况(含时间轴).html')
3.5 分析销售额环比
# 计算周的销售额环比
data2['week'] = data2['下单时间'].dt.week
# 1 计算每一周的销售额
tmp = data2[['week','income']].groupby('week').sum()
# 2 计算销售额环比: (本期销售额-上期销售额)/上期销售额
t2 = tmp.diff().iloc[1:, :] #第一个数据是空,因为没得比
t2.index = tmp.index[:-1 ]
num = t2/tmp #销售额的周环比
# 可视化:双Y轴图像
fig = plt.figure(figsize=(6, 4))
ax1 = fig.add_subplot(111) # 添加子图
ax1.bar(tmp.index, tmp['income'])
ax1.set_ylabel('收入')
ax1.set_xlabel('周数')
ax1.set_title('自动售货机收入趋势图')
ax2 = ax1.twinx()
ax2.plot(tmp.index[1:], num.iloc[:-1, 0], 'b')
ax2.set_ylabel('环比增长率')
plt.show()
# 计算月的销售额环比
# 1、计算每月的销售额
tmp = data2[['month', 'income']].groupby('month').sum()
# 2、计算销售额环比:(本期销售额-上期销售额)/上期销售额
t2 = tmp.diff().iloc[1:, :]
t2.index = tmp.index[:-1]
num = t2/tmp # 销售额的月环比
# 可视化:双Y轴图像
fig = plt.figure(figsize=(6, 4))
ax1 = fig.add_subplot(111) # 添加子图
ax1.bar(tmp.index, tmp['income'])
ax1.set_ylabel('收入')
ax1.set_xlabel('月份')
ax1.set_title('自动售货机收入趋势图')
ax2 = ax1.twinx()
ax2.plot(tmp.index[1:], num.iloc[:-1, 0], 'b')
ax2.set_ylabel('环比增长率')
plt.show()
# 计算周的销售额环比
data_gz = data2.loc[data2['city'] == '广州市', :]
data_gz['week'] = data_gz['下单时间'].dt.week
# 1、计算每一周的销售额
tmp = data_gz[['week', 'income']].groupby('week').sum()
# 2、计算销售额环比:(本期销售额-上期销售额)/上期销售额
t2 = tmp.diff().iloc[1:, :]
t2.index = tmp.index[:-1]
num = t2/tmp # 销售额的周环比
num
# 可视化:双Y轴图像
fig = plt.figure(figsize=(6, 4))
ax1 = fig.add_subplot(111) # 添加子图
ax1.bar(tmp.index, tmp['income'])
ax1.set_ylabel('收入')
ax1.set_xlabel('周数')
ax1.set_title('自动售货机收入趋势图--广州地区')
ax2 = ax1.twinx()
ax2.plot(tmp.index[1:], num.iloc[:-1, 0], 'b')
ax2.set_ylabel('环比增长率')
plt.show()
3.6 分析不同价格区间的销售情况
ind = data2['购买数量(个)'] == 1
data2['goods'] = data2['商品详情'].apply(lambda x: re.sub('[Xx]1[;,]?', '', x))
price_data = data2.loc[ind, ['goods', '总金额(元)']].drop_duplicates('goods')
new_data = pd.merge(new_goods_data, price_data, how='left', left_on='产品名称', right_on='goods')
ind = new_data['goods'].isnull()
tmp_sets = new_data.loc[ind, '产品名称'].unique()
ind = data2['商品详情'].apply(lambda x: sum([i in x for i in tmp_sets])!=0)
tmp = data2.loc[ind, :].apply(lambda x: ([i for i in tmp_sets if i in x['商品详情']], x['购买数量(个)'], x['总金额(元)']), axis=1)
tmp = pd.DataFrame({'name':[i[0][0] for i in tmp], 'num':[i[1] for i in tmp], 'total_price': [i[2] for i in tmp]})
tmp['price'] = tmp['total_price']/tmp['num']
tmp2 = tmp.drop_duplicates('name')[['name', 'price']]
new_data = pd.merge(new_data, tmp2, how='left', left_on='产品名称', right_on='name')
ind = new_data['总金额(元)'].isnull()
new_data['单价'] = 0
new_data.loc[ind, '单价'] = new_data.loc[ind, 'price'].copy()
new_data.loc[~ind, '单价'] = new_data.loc[~ind, '总金额(元)'].copy()
ind = new_data['单价'].notnull()
new_data = new_data.loc[ind, ['产品名称', '购买数量', '单价']]
plt.hist(np.repeat(new_data['单价'], new_data['购买数量']), bins=50)
plt.show()
# 指定单价区间
bins = pd.IntervalIndex.from_tuples([(0, 2), (2, 5), (5, 10), (10, 20), (20, 52)])
new_data['bins'] = pd.cut(new_data['单价'], bins)
num = new_data[['bins', '购买数量']].groupby('bins').sum()
plt.bar(range(5), num['购买数量'])
plt.title('不同价格区间的销售情况')
plt.xlabel('价格区间')
plt.ylabel('购买数量')
plt.xticks(range(5), num.index)
plt.show()
plt.pie(num['购买数量'], labels=num.index, autopct='%.2f %%')
plt.title('不同价格区间的销售数量占比情况')
plt.show()
原文地址: http://www.cveoy.top/t/topic/jjSR 著作权归作者所有。请勿转载和采集!