python药店销售数据分析_药房销售情况分析(python篇)运⽤python中的numpy、pandas等包,可以帮助我们很⽅便的进⾏数据统计、数据分析。今天,通过朝阳医院2018的销售数据这个案例来简单做⼀下展⽰。
数据分析的基本过程⼀般分为以下⼏个部分:
提出问题、理解数据、数据清洗、构建模型、数据可视化。
现在从第⼀步开始着⼿。
1.提出问题
在数据分析之前,我们先要明确分析⽬标是什么,这样可以避免我们像⽆头苍蝇⼀样拿着数据⽆从下⼿,也可以帮助我们更⾼效的选取数据,进⾏分析研究。
本次的分析⽬标是从销售数据中分析出以下业务指标:
1)⽉均消费次数
2)⽉均消费⾦额
3)客单价
4)消费趋势
有了分析⽬标,我们再来关注⼀下数据情况。
2.理解数据
1)导⼊数据包,提取数据⽂件
在提取数据中,为了保证数据⽂件中的数据读取正常,通常会将函数的dtype参数设置成'object'。 object的意思是统⼀按照字符串的格式来读取数据。
#导⼊numpy、pandas包
import numpy as np
import pandas as pd
#导⼊数据
xls = pd.ExcelFile(r'D:\dataFile\朝阳医院2018年销售数据.xlsx', dtype='object')
salesDf = xls.parse('数据1',dtype='object')
#当excel中只有⼀个数据⼯作表时,⽤下⾯的函数直接读取数据也可以。
#salesDf = pd.read_excel(r'D:\dataFile\朝阳医院2018年销售数据.xlsx', dtype='object')
2)查看导⼊数据的基本状况
#查看导⼊数据的类型
type(salesDf)
#查看导⼊数据的每个项⽬的类型
salesDf.dtypes
购药时间 object
社保卡号 object
商品编码 object
商品名称 object
销售数量 object
应收⾦额 object
实收⾦额 object
dtype: object
#查看数据的基本⼤⼩
salesDf.shape
(6578, 7)
#查看开头⼏⾏数据,看看数据是否读取正确
salesDf.head()
#⽤描述函数describ来查看⼀下整个数据的基本状况
salesDf.describe()
从这些函数中,我们可以基本了解到数据由购药时间、社保卡号、商品编码、商品名称、销售数量、应收⾦额、实收⾦额这七个基本项⽬组成,数据条数为6578条。
3.数据清洗
取得了数据,并不能马上就开始进⾏数据分析。我们得到的数据通常并不是完全符合我们分析要求的,⽽且可能存在缺失值、异常值,这些数据都会使我们的分析结果产⽣偏差。所以在分析之前,需要进⾏⼦集选择、缺失数据补充、异常值处理、数据类型转换等多个步骤。这些都属于数据清理的范畴。
在数据分析中,通常有多达60%的时间是花在数据清洗中的。通常的清洗步骤有以下⼏步:
· 选择⼦集
· 列名重命名
· 缺失数据处理
· 数据类型转换
· 数据排序
· 异常值处理
这些步骤有些不是⼀步就能完成的,可能需要重复操作。
现在开始对药店销售数据进⾏数据清洗。
1)选择⼦集
药店销售数据中,项⽬较少,选择⼦集可以忽略,我们从列名重命名开始。
2)列名重命名
销售数据集,购药时间显⽰为销售时间更为合理,我们先把这个项⽬名称做⼀下变更。
#购药时间->销售时间
nameChangeDict = {'购药时间':'销售时间'}
#参数inplace=True表⽰覆盖元数据集
现在再来显⽰⼀下数据,可以发现购药时间已经变成了销售时间。
salesDf.head()
3)缺失数据处理
对于缺失数据,我们可以有⼏种处理⽅法:
▪ 删除
当缺失数据占总数据量的⽐例很⼩的时候,我们通常采⽤删除的处理⽅法。
▪ 合理值填充
在某些不适合删除的场合,我们有时候也会对缺失数据进⾏合理值填充,如平均值,中位数,相邻数据等等。
#⾸先查看⼀下哪些项⽬存在缺失值
salesDf.isnull().any()
销售时间 True
社保卡号 True
商品编码 True
商品名称 True
销售数量 True
应收⾦额 True
实收⾦额 True
dtype: bool
好吧,每个项⽬都存在缺失值。在这个销售数据中,销售时间和社保卡号是必须项⽬,不可或缺。所以我们在这⾥只把销售时间和社保卡号有缺失的数据做删除处理。我们来查看⼀下销售时间和社保卡缺失的数据⼤⼩,然后做删除处理。
#查看⼀下缺失值的数量
#通常可以⽤isnull函数来查缺失值
salesDf[salesDf[['销售时间','社保卡号']].isnull().values == True]
#序号6574因为销售时间和社保卡号都缺失,所以会出现两次。所以我们要去掉⼀下重复数据。
naDf = salesDf[salesDf[['销售时间','社保卡号']].isnull().values == True].drop_duplicates()
naDf
从上⾯可以清楚看出销售时间和社保卡号缺失的数据⼀共有三条,当数据量⼤的时候我们可以只显⽰条数,不显⽰数据内容
#缺失数据⾏数
naDf.shape[0]
3
现在把这些缺失数据进⾏删除
#删除前数据集规模显⽰
salesDf.shape
(6578, 7)
#含有销售时间和社保卡号的缺失数据删除
salesDf = salesDf.dropna(subset=['销售时间','社保卡号'],how = 'any')
#删除后数据集规模显⽰
salesDf.shape
(6575, 7)
在数据删除后要及时更新⼀下最新的序号,不然可能会产⽣问题。我开始做的时候,在这⾥没有更新数据序号,导致后续销售时间数据类型⽤函数转换后与元数据合并时发⽣了错位,数据发⽣了新的缺失,后来发现导致问题产⽣的原因在这⾥。
#重命名⾏名(index):排序后的列索引值是之前的⾏号,需要修改成从0到N按顺序的索引值
set_index(drop=True)
4)数据类型转换
▪ 数量、⾦额项⽬:从字符串类型转换为数值(浮点型)类型
salesDf['销售数量'] = salesDf['销售数量'].astype('float')
salesDf['应收⾦额'] = salesDf['应收⾦额'].astype('float')
salesDf['实收⾦额'] = salesDf['实收⾦额'].astype('float')
print('转换后的数据类型:\n',salesDf.dtypes)
转换后的数据类型:
销售时间 object
社保卡号 object
商品编码 object
商品名称 object
销售数量 float64
应收⾦额 float64
实收⾦额 float64
dtype: object
▪ ⽇期项⽬:从字符串类型转换为⽇期类型
销售⽇期中包含了⽇期和星期,我们只要保留⽇期内容即可。这⾥⽤⼀个⾃定义的函数dateChange来实现这个功能。
#⽇期转换
def dateChange(dateSer):
dateList = []
for i in dateSer:
#例如2018-01-01 星期五,分割后为:2018-01-01
str = i.split(' ')[0]
dateList.append(str)
dateChangeSer = pd.Series(dateList)
return dateChangeSer
dateChangeSer = dateChange(salesDf['销售时间']) dateChangeSer
0 2018-01-01
1 2018-01-02
2 2018-01-06
3 2018-01-11
4 2018-01-15
5 2018-01-20python怎么读取excel的数据
6 2018-01-31
7 2018-02-17
8 2018-02-22
9 2018-02-24
10 2018-03-05
11 2018-03-05
12 2018-03-05
13 2018-03-07
14 2018-03-09
15 2018-03-15
16 2018-03-15
17 2018-03-15
18 2018-03-20
19 2018-03-22
20 2018-03-23
21 2018-03-24
22 2018-03-24
23 2018-03-28
24 2018-03-29
25 2018-04-05
26 2018-04-07
27 2018-04-13
28 2018-04-22
29 2018-05-01

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。