数据分析基本过程——案例医院销售数据分析

数据分析的基本过程包括:1、提问;2、理解数据;3、数据清洗;4、构建模型;5、数据可视化。

数据分析过程主要与医院销售数据相结合

1、提出问题

找出要分析的问题是什么?例如,要获得医院销售数据,我们需要确定分析目标

每月平均消费次数的总消费次数等于总消费次数除以月份。消费者可以通过每月平均消费次数获得在医院购买的频率,评估医院的消费情况,获得消费者的消费习惯。月平均消费金额为总消费金额除以月份。消费者在医院的月消费金额可以通过月平均消费金额获得,消费者的消费习惯可以获得。客户单价的总消费金额除以总购买次数。客户单位间接反映了医院药品销售趋势、客户消费心理和消费行为模式的变化趋势,如月销售总额、客流、两者关系等。2.了解数据

主要步骤如下

收集数据,根据第一步提出的问题收集相关数据(已获得医院销售数据)导入数据。数据源是Excel或者数据库查看数据集的信息,对数据统计信息的描述有一个整体的了解

例子:

1)导入数据(读取Excel数据),代码如下

#导入数据包import numpy as npimport pandas as pd#文件路径 fileNameStr='D:Python/2018年朝阳医院销售数据.xlsx' #读取文件 xls=pd.ExcelFile(fileNameStr,dtype='object') #统一按照object类型读取数据,确保数据的正确性 salesDf=xls.parse('Sheet1',dtype='object')

2)查看数据描述统计信息,代码如下

#1 查看数据几行几列salesDf.shape#1 结果(6578,7)#2 数据类型salesDf.dtypes#2结果购药时间 object社保 ** object 商品编码object 商品名称object object object 实收金额objectdtype: object#3 查看整个描述数据信息salesDf.describe#3 ** 商品编码 商品名称 销售数量 实收金额0 2018-01-01 周五 VC片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片片82.8 691 2018-01-02 周六 236701 清热解毒口服液 28 24. ** 2 2018-01-06 16.8 153 2018-01-11 周一 36701 39感冒灵 28 284 2842018-01-15 周五 39感冒灵 224 2085 20852018-01-20 周三 3333895288 336701 39感冒灵 28 286 2862018-01-31 ** 928 236701 三九感冒灵 2 56 567 2018-02-17 周三 39感冒灵 149 131.12... ... ... ... ... ... ... ...6575 2018-04-27 高特灵 2 11.2 9.866576 2018-04-27 5.6 56577 565772018-04-28 星期四 0011926928 2367011 高特灵 2 11.2 rows x 7 columns]>3、数据清洗预处理数据,整理数据,将数据转换为我们需要的数据

清理数据的主要步骤包括:1。选择子集;2.列重命名;3.数据处理缺失;4.数据类型转换;数据排序;6异常数据处理。

1)选择子集

在获取数据的过程中,如果源数据量相对较大,数据中包含许多列和不必要的信息,我们需要在整个数据中选择子集进行分析,如下代码示例(但本分析不需要选择子集)

#获取子集subSalesDf=salesDf.loc[0:4,'购药时间':'销售数量']#结果subSalesDf时间**」2018-01-0116VC银翘片 61 2018-01-026.2018-01-06 2018-01-113002018-01-155.8

2)列重名

当我们理解或分析师不利于导入数据列的名称时,需要重命名。代码如下

#将购药时间(旧列名)与销售时间(新列名)对应colNameDict={'购药时间':'销售时间'}#通过rename重命名函数salesDf.rename(columns = colNameDict,inplace=True)salesDf.head()# ** 2018-01-0116VC银翘片 6 82.8 691 2018-01-026.24. ** 2 2018-01-06 星期三 0012602828 236701 感康 2 16.8 153 2018-01-113002018-01-155.208

3)缺乏数据处理

原始数据可能存在记录错误,导致部分数据丢失。处理缺失值的方法有两种。1、如果有更多的数据丢失,我们可以使用插入值来补充缺失值;2、如果数据相对较小,则使用删除和删除缺失值的方法。具体代码示例如下

#1 统计原始数据的大小print('删除缺失前数据大小',salesDf.shape)#1 删除缺失前数据大小 (6578,7)#2 销售时间,社保 ** 这两列不能缺失值salesDf=salesDf.dropna(subset=['销售时间','社保 ** '],how='any')#2 大小 (6575,7)

4)转换数据类型

根据实际数据类型,需要转换数据类型,如数字数据float浮点数据需要转换为时间数据。代码如下

#1 转换数据(销售、应收、实收)salesDf['销售数量']=salesDf['销售数量'].astype('float')salesDf['应收金额']=salesDf['应收金额'].astype('float')salesDf['实收金额']=salesDf['实收金额'].astype('float')print('转换后的数据类型: ',salesDf.dtypes)#1 结果转换后的数据类型: 销售时间 object社保 ** object 商品编码object 商品名称object float ** float ** 实收金额float ** dtype: object#2 日期数据转换(2018-01-01 星期五——2018-01-01)##预处理1(字符串切割函数)def splitSaletime(timeColser): timeList= for value in timeColser: dateStr=value.split(' ')[0] timeList.append(dateStr) timeSer=pd.Series(timeList) return timeSer##预处理2(切割日期)timeSer=salesDf.loc[:,'销售时间']dateSer=splitSaletime(timeSer)##预处理3(修改日期值)salesDf.loc[:,'销售时间']=dateSer#3类型转化salesDf.loc[:,'销售时间']=pd.to_datetime(salesDf.loc[:,'销售时间'], for ** t='%Y-%m-%d', errors='coerce')salesDf=salesDf.dropna(subset=['销售时间','社保 ** '],how='any')salesDf.dtypes#4结果销售时间 datetime ** [ns]社保 ** object商品编码 object object销售额 float ** float ** float ** dtype: object

5)排序

代码按一定顺序排序如下

#1 按销售时间排序salesDf=salesDf.sort_values(by='销售时间',ascending=True)#1 2018-01-01 2178 2018-01-011903 2018-01-01#2 重命名行号salesDf=salesDf.reset_index(drop=True)salesDf.head(3)#2 2018-01-01 1 2018-01-012 2018-01-01

4)异常值处理

发现数据中的异常值,处理异常值,代码如下

salesDf.describe()

结果如下:销售额异常(min行中负值)

利用条件判断异常值

querySer=salesDf.loc[:,'销售数量']>0print('删除前数据:',salesDf.shape)salesDf=salesDf.loc[querySer,:]print('删除后数据:',salesDf.shape)#结果删除前数据: (6549, 7)删除后数据: (6506, 7)

处理后结果

salesDf.describe()4、构建模型

根据第一步提出问题建立的目标,进行构建模型:业务指标1,月均消费次数 ;业务指标2 月均消费金额;业务指标3 客单价

1)月均消费次数

月均消费次数 =总消费次数/月份数 (怎样记录消费次数:同一天,同一个人,发生的所有消费算作一次消费)。代码如下

#1 总消费次数#step1:删除重复数据kpi1_Df=salesDf.drop_duplicates(subset=['销售时间','社保 ** '])#step2: 有多少行totalI=kpi1_Df.shape[0]print('总的消费次数',totalI)#结果总的消费次数 5342#2 月份数#step1:排序kpi1_Df=kpi1_Df.sort_values(by='销售时间',ascending=True)kpi1_Df=kpi1_Df.reset_index(drop=True)#step2:获得时间的范围startTime=kpi1_Df.loc[0,'销售时间']endTime=kpi1_Df.loc[totalI-1,'销售时间']#计算月份数daysI=(endTime-startTime).daysmonthsI=daysI//30print('月份数',monthsI)# 结果月份数 6#月均消费次数kpi1_I=totalI//monthsIprint('业务指标1,月均消费次数:',kpi1_I)#结果业务指标1,月均消费次数: 890

2)月均消费金额

月均消费金额=总消费金额/月份数,代码如下

#总的消费金额totalMoneyF=salesDf.loc[:,'实收金额'].sum()#月均消费金额monthMoneyF=totalMoneyF/、monthsIprint('业务指标2,月均消费金额:',monthMoneyF)#结果业务指标2,月均消费金额: 50668.0

3)客单价

客单价=-总消费金额/总消费次数(人均消费金额),代码如下

pct=totalMoneyF/totalIprint('客单价:',pct)#门店的销售额是由客单价和顾客数(客流量)所决定的#结果客单价: 56.9094178215、数据可视化

还未学习后续再补充

扫码免费用

源码支持二开

申请免费使用

在线咨询