字段
购药时间:格式为“2018-01-01 星期五”
社保卡号:一个卡号代表一个人
商品编码:一个编码未必只对应一个商品 还存在一个商品有两个编码的情况
商品名称:购买商品的名称
销售数量:售出的该商品数量
应收金额:应收取的金额
实收金额:实际收取的金额 有的与应收金额不同 可能是打折
但同样的应收金额也存在与实收金额相等的情况 所以也可能是价格波动或医保优惠导致
目标
参考:https://blog.csdn.net/huangxiaoyun1900/article/details/82357194
https://blog.csdn.net/zgcr654321/article/details/88018806
https://zhuanlan.zhihu.com/p/37457901?from_voters_page=true
1、客户月均消费次数
2、客户月均消费金额
3、客单价=销售总数/顾客总数 每位客户平均购买商品的金额
4、客户消费金额与消费件数的关系如何
5、医院月均销售金额
6、医院月均销售次数
7、医院每月销售金额趋势
8、医院每月销售次数趋势
9、医院每月平均每单销售金额
10、最大和最小日销售金额及对应日期
11、各个月单独的每日销售金额
12、周几销售金额趋势图
13、药品销售趋势&销量前十的药品
14、销量前三药品的天数销售分布
15、销量前三药品的星期销售分布
读取数据
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style='darkgrid',font_scale=1.5)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
data = pd.read_csv('朝阳医院2018年销售数据.csv',dtype={'社保卡号':str,'购药时间':str,'商品编码':str},encoding = 'gbk')
data.head()
data.info()
数据清洗
1、缺失值统计
data.isnull().sum()
2、缺失值处理
因为在6000+行中只有一两行有空值,而且购药时间、社保卡号、商品编码、商品名称没法补,所以干脆删掉
#删除缺失值
data.dropna(axis=0,inplace=True)
3、数据类型归一
其他需要归一类型的数据类型已经在读取数据时规定好了
#处理时间
data['date'] = [x.split(' ')[0] for x in data['购药时间']]
data['week'] = [x.split(' ')[1] for x in data['购药时间']]
data['year'] = [x.split('-')[0] for x in data['date']]
data['month'] = [x.split('-')[1] for x in data['date']]
data['day'] = [x.split('-')[2] for x in data['date']]
4、数值统计找到异常值
data.describe()
5、删除重复行
没有数据说明,无法确定带负数的是否为退货订单,先删掉
data.drop(data[data.销售数量 <= 0].index,inplace=True)
暂不删除重复值,因为可能是一人一天买了多次
整理删除后的数据
#按日期排序
data=data.sort_values(by='购药时间',ascending=True)
data.reset_index()
data.columns
数据分析
1、客户月均消费次数
客户月均消费次数=客户总消费次数/月份数7
user_times = data.groupby(['社保卡号']).count()['date']
user_times_by_month = user_times/7
user_times_by_month
通过describe()查看最大值、中位数、平均值,来确定直方图的取值
bins = np.arange(0,1,0.1)#直方图的分布区间
plt.hist(user_times_by_month,bins)
#range只能整数
x = np.arange(0.1,1,0.1)
plt.xticks(x)
plt.locator_params('x',nbins=10)
plt.show()
ra