欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

解析医院药店销售数据,看看Python数据分析结果有什么惊人的发现

程序员文章站 2022-04-05 23:01:53
前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。 一般来说,数据分析的基本过程包括以下几个步骤: 1.提出问题——即我们所想要知道的指标(平均消费额、客户的年龄分布、营业额变化趋势等等) 2.导入数据——把原始数据源导入Ju ......

前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

一般来说,数据分析的基本过程包括以下几个步骤:

解析医院药店销售数据,看看Python数据分析结果有什么惊人的发现

 

1.提出问题——即我们所想要知道的指标(平均消费额、客户的年龄分布、营业额变化趋势等等)

2.导入数据——把原始数据源导入jupyter notebook中(网络爬虫、数据读取等)

3.数据清洗——数据清洗是指发现并纠正数据文件中可识别的错误(检查数据一致性,处理无效值和缺失值等)

4.构建模型(高级的模型构建会使用机器学习的算法)

5.数据可视化——matplotib库等

 

具体的numpy库等基础知识之前的文章已经介绍了:

numy基础知识分享

pandas入门基本知识

 

我们现在来看一个实例——医院药店销售数据分析

 

解析医院药店销售数据,看看Python数据分析结果有什么惊人的发现

 

提出问题:

我们想知道的信息有——月均消费额、月均消费次数、客单价、消费趋势

 

理解数据:

1.读取excel数据(路径中最好不要有中文,或者特殊符号啥的,不然路径会提示错误找不到。

最好将文件放到一个简单的英文路径下)

import pandas as pd
filenamestr='d:\朝阳医院2018年销售数据.xlsx'          #读取ecxcel数据
xls = pd.excelfile(filenamestr, dtype='object')
salesdf = xls.parse('sheet1',dtype='object')

 

我们可以先查看下数据的基本信息:

salesdf.head()          #打印出前5行,以确保数据运行正常

 

解析医院药店销售数据,看看Python数据分析结果有什么惊人的发现

 

 

salesdf.shape           #有多少行,多少列

 

解析医院药店销售数据,看看Python数据分析结果有什么惊人的发现

 

salesdf.dtypes          #查看每列的数据类型

 

解析医院药店销售数据,看看Python数据分析结果有什么惊人的发现

 

 

数据清洗:

 

解析医院药店销售数据,看看Python数据分析结果有什么惊人的发现

 

1.选择子集(本案例不用):

使用loc方法选择子集

#subsalesdf=salesdf.loc[0:4,'购药时间':'销售数量']

 

2.列名重命名:

colnamedict = {'购药时间':'销售时间'}                  #将‘购药时间’改为‘销售时间’
salesdf.rename(columns = colnamedict,inplace=true)
salesdf.head()                                       #查看前五行

 

 

解析医院药店销售数据,看看Python数据分析结果有什么惊人的发现

 

inplace=false,数据框本身不会变,而会创建一个改动后新的数据框,默认的inplace是false,inplace=true,数据框本身会改动

3.缺失数据处理:

python缺失值有3种:none,na,nan

1)python内置的none值

2)在pandas中,将缺失值表示为na,表示不可用not available。

3)对于数值数据,pandas使用浮点值nan(not a number)表示缺失数据。

后面出来数据,如果遇到错误:......foloat错误,那就是有缺失值,需要处理掉

print('删除缺失值前大小',salesdf.shape)
salesdf=salesdf.dropna(subset=['销售时间','社保卡号'],how='any') #删除列(销售时间,社保卡号)中为空的行
print('删除缺失后大小',salesdf.shape)

 

解析医院药店销售数据,看看Python数据分析结果有什么惊人的发现

 

how='any'意为在给定的任何一列中有缺失值就删除

如果缺失数据太多,我们可以建立模型,使用插入值的方法来补充数据(以后机器学习的文章中介绍)

4.数据类型转换

一开始导入时我们将所有数据都按字符串类型导入的,现在需要将销售数量、应收金额、实收金额的数据类型改为数值类型。

salesdf['销售数量'] = salesdf['销售数量'].astype('float')
salesdf['应收金额'] = salesdf['应收金额'].astype('float')
salesdf['实收金额'] = salesdf['实收金额'].astype('float')
print('转换后的数据类型:\n',salesdf.dtypes)

 

使用astype()方法进行类型转换

解析医院药店销售数据,看看Python数据分析结果有什么惊人的发现

 

我们再来修改日期的格式

 

解析医院药店销售数据,看看Python数据分析结果有什么惊人的发现

 

用split()方法,用‘ ’分割字符串。返回列表的第一个元素,统一改成年-月-日格式,去掉星期几。

接下来我们分割销售时间,先定义一个分割字符串的函数:

def splitsaletime(timecolser):
    timelist=[]
    for value in timecolser:           #例如2018-01-01 星期五,分割后为:2018-01-01
        datestr=value.split(' ')[0]
        timelist.append(datestr)
 
    timeser=pd.series(timelist)        #将列表转行为一维数据series类型
    return timeser

 

输入:timecolser——销售时间这一列,是个series数据类型

输出:分割后的时间,返回也是个series数据类型

timeser=salesdf.loc[:,'销售时间']    #获取“销售时间”这一列
dateser=splitsaletime(timeser)      #对字符串进行分割,获取销售日期

salesdf.loc[:,'销售时间']=dateser    #修改销售时间这一列的值
salesdf.head()

 

解析医院药店销售数据,看看Python数据分析结果有什么惊人的发现

 

 

解析医院药店销售数据,看看Python数据分析结果有什么惊人的发现

 

(注意:如果运行后报错:attributeerror: 'float' object has no attribute 'split'是因为excel中的空的cell读入pandas中是空值(nan),这个nan是个浮点类型,一般当作空值处理。所以要先去除nan在进行分隔字符串)

 

解析医院药店销售数据,看看Python数据分析结果有什么惊人的发现

 

5.字符串转换日期

我们使用pd.to_datetime方法来将字符串转换为日期格式。传入的格式是原始数据的日期格式——format='%y-%m-%d'固定写法:y表示年、m表示月、d表示日。

salesdf.loc[:,'销售时间']=pd.to_datetime(salesdf.loc[:,'销售时间'],
                                    format='%y-%m-%d',
                                    errors='coerce')
salesdf.dtypes

 

 

解析医院药店销售数据,看看Python数据分析结果有什么惊人的发现

 

errors='coerce':如果原始数据不符合日期的格式,转换后的值为空值nat

所以转换之后我们还要运行一次删除空值的代码,因为不符合格式的日期被转变为了空值需要删除。

salesdf=salesdf.dropna(subset=['销售时间','社保卡号'],how='any')

 

6.数据排序

使用pd.sort_values方法对数据进行排序,by表示按那几列进行排序,ascending=true 表示升序排列,ascending=false表示降序排列

print('排序前的数据集')
salesdf.head()
salesdf=salesdf.sort_values(by='销售时间',     #按销售日期进行升序排列
                    ascending=true)
print('排序后的数据集')
salesdf.head(3)

 

 

解析医院药店销售数据,看看Python数据分析结果有什么惊人的发现

 

 

解析医院药店销售数据,看看Python数据分析结果有什么惊人的发现

 

接下来我们重命名行号:reset_index方法生成从0到n按顺序的索引值

salesdf=salesdf.reset_index(drop=true)
salesdf.head()

 

 

解析医院药店销售数据,看看Python数据分析结果有什么惊人的发现

 

7.异常值处理

首先我们用describe()方法查看数据框中所有数据每列的描述统计信息:

salesdf.describe()

 

 

解析医院药店销售数据,看看Python数据分析结果有什么惊人的发现

 

(count:总数,mean:平均数,std:标准差,min:最小值,25%:下四分位数,50%:中位数,75%:上四分位数,max:最大值)

我们发现最小值出现了小于0的情况,分析应该是记录过程中出现错误所致。

我们接下来删除异常值:通过条件判断筛选出销售数量大于0的数据

#设置查询条件
queryser=salesdf.loc[:,'销售数量']>0
#应用查询条件
print('删除异常值前:',salesdf.shape)
salesdf=salesdf.loc[queryser,:]
print('删除异常值后:',salesdf.shape)

 

解析医院药店销售数据,看看Python数据分析结果有什么惊人的发现

 

这样,我们就算基本完成数据清洗的步骤了。

 

构建模型:

第一个指标:月均消费次数=总消费次数/月数

注意:同一天内,同一个人发生的所有消费算作一次消费,根据列名(销售时间,社区卡号),如果这两个列值同时相同,只保留1条,使用drop_duplicates将重复的数据删除

kpi1_df=salesdf.drop_duplicates(
    subset=['销售时间', '社保卡号']
)

totali=kpi1_df.shape[0]             #总消费次数————有多少行

print('总消费次数=',totali)

 

解析医院药店销售数据,看看Python数据分析结果有什么惊人的发现

 

计算月份数我们要知道最早一笔消费的时间和最晚一笔消费的时间:

#第1步:按销售时间升序排序
kpi1_df=kpi1_df.sort_values(by='销售时间',
                    ascending=true)
kpi1_df=kpi1_df.reset_index(drop=true)     #重命名行名(index)

#第2步:获取时间范围
starttime=kpi1_df.loc[0,'销售时间']         #最小时间值
endtime=kpi1_df.loc[totali-1,'销售时间']    #最大时间值

#第3步:计算月份数
daysi=(endtime-starttime).days             #天数
monthsi=daysi//30                          #月份数: 运算符“//”表示取整除,返回商的整数部分,例如9//2 输出结果是4
print('月份数:',monthsi)

 

解析医院药店销售数据,看看Python数据分析结果有什么惊人的发现

 

用天数/30计算月份数(舍弃余数)

最终计算月均消费次数=总消费次数 / 月份数

kpi1_i=totali // monthsi
print('业务指标1:月均消费次数=',kpi1_i)

 

解析医院药店销售数据,看看Python数据分析结果有什么惊人的发现

 

 

第二个指标:月均消费金额=总消费金额/月份数

总消费金额等于实收金额取和,用sum函数很快就能得出

totalmoneyf=salesdf.loc[:,'实收金额'].sum()   #总消费金额
monthmoneyf=totalmoneyf / monthsi            #月均消费金额
print('业务指标2:月均消费金额=',monthmoneyf)

 

解析医院药店销售数据,看看Python数据分析结果有什么惊人的发现

 

 

第三个指标:客单价=平均交易金额=总消费金额/总消费次数

'''
totalmoneyf:总消费金额
totali:总消费次数
'''
pct=totalmoneyf / totali
print('客单价:',pct)

 

解析医院药店销售数据,看看Python数据分析结果有什么惊人的发现

 

第四个指标:消费趋势

#在进行操作之前,先把数据复制到另一个数据框中,防止对之前清洗后的数据框造成影响
groupdf=salesdf

#第1步:重命名行名(index)为销售时间所在列的值
groupdf.index=groupdf['销售时间']

#第2步:分组
gb=groupdf.groupby(groupdf.index.month)

#第3步:应用函数,计算每个月的消费总额
mounthdf=gb.sum()

mounthdf

 

 

解析医院药店销售数据,看看Python数据分析结果有什么惊人的发现

 

如果你处于想学python或者正在学习python,python的教程不少了吧,但是是最新的吗?说不定你学了可能是两年前人家就学过的内容,在这小编分享一波2020最新的python教程。获取方式,私信小编 “ 资料 ”,即可免费获取哦!