26个数据分析案例——第三站:基于python的药店销售数据分析

目录

  • 26个数据分析案例——第三站:基于python的药店销售数据分析
  • 实验环境
  • 数据说明
  • 资料包
  • 实验步骤
  • 第一步:加载数据并查看数据详情
  • 1、导入数据:需要用到Python中的xlrd包,代码如下所示。
  • 2、查看数据类型,代码如下所示。
  • 第二步:数据清洗
  • 1、选择子集:目的是选择需要分析的列,方法为切片法(loc),代码如下所示。
  • 2、列名重命名:把'购药时间'改为'销售时间’,代码如下所示。
  • 3、缺失数据处理,用dropna 法处理缺失值,处理前数据大小,代码如下所示。
  • 4、处理后的数据大小,代码如下所示。
  • 5、数据类型转换:本文数据都是以字符串类型导入的,我们需要将字符串转换为我们需要的数据类型,字符串转换为数值(浮点型),代码如下所示。
  • 6、字符串转换为日期数据类型,定义一个用来分割日期数据的函数splitSaletime(),代码如下所示。
  • 7、调用splitSaletime()来处理销售时间,代码如下所示。
  • 8、修改销售时间,代码如下所示。
  • 9、将销售时间列数据字符串型转换为日期型,代码如下所示。
  • 10、通过转换,销售时间已经由字符串转换为日期,转换过程中不符合日期格式的数值会被转换为空值,需要将其删除,代码如下所示。
  • 11、排序按销售时间的先后顺序进行排序,排序前的数据,代码如下所示。
  • 12、对销售时间按序排序,代码如下所示。
  • 13、将索引值修改为从0到N按顺序,代码如下所示。
  • 14、异常值处理,查看数据看是否存在异常值,代码如下所示。
  • 15、处理异常值,代码如下所示。
  • 16、对异常值进行处理之后,再使用描述指标查询一次,无异常值,代码如下所示。
  • 第三步:构建模型
  • 业务指标1:月均消费次数=总消费次数/月份数。获取总消费次数,代码如下所示。
  • 2、获取时间范围,代码如下所示。
  • 3、获取最小时间值,代码如下所示。
  • 4、获取最大时间值,代码如下所示。
  • 5、计算总天数,代码如下所示。
  • 6、计算月份数,代码如下所示。
  • 7、获取月均消费次数,代码如下所示。
  • 8、获取总消费金额,代码如下所示。
  • 9、业务指标2:月均消费金额=总消费金额/月份数,获取月均消费金额,代码如下所示。
  • 12、分组,代码如下所示。
  • 13、应用函数,计算每个月的消费总额,代码如下所示。
  • 后续案例持续更新
  • 26个数据分析案例——第三站:基于python的药店销售数据分析

    实验环境

  • Python: Python 3.x;

  • jupyter

  • 数据说明

    当前数据为某医院销售记录,用于记录用户购买药品的相关信息。该数据集包含7个字段,分别是:
    • 购药时间。
    • 社保卡号。
    • 商品编码。
    • 商品名称。
    • 销售数量。
    • 应收金额。
    • 实收金额。

    资料包

    链接:https://pan.baidu.com/s/1KdikbuBaTBGDwgZyPgVv4g
    提取码:e46q

    实验步骤

    第一步:加载数据并查看数据详情

    1、导入数据:需要用到Python中的xlrd包,代码如下所示。

    #导入数据分析包
    import pandas as pd
    '''
    路径中最好不要有中文,或者特殊符号啥的,不然路径会提示错误找不到。
    最后将文件放到一个简单的英文路径下
    '''
    #读取CSV数据,统一先按照字符串读入,之后转换
    salesDf=pd.read_csv('data.csv',dtype={'社保卡号':str,'商品编码':str})
    '''
    查看数据基本信息
    '''
    #打印出前5行,以确保数据运行正常
    salesDf.head()
    

    结果如图所示。

    2、查看数据类型,代码如下所示。

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

    第二步:数据清洗

    1、选择子集:目的是选择需要分析的列,方法为切片法(loc),代码如下所示。

    subset=salesDf.loc[0:3,'购药时间':'商品名称']
    subset
    

    结果如图所示。

    2、列名重命名:把’购药时间’改为’销售时间’,代码如下所示。

    #列名和新列名对应关系
    colNameDict={'购药时间':'销售时间'}
    '''
    inplace=False,数据框本身不会变,而会创建一个改动后新的数据框,默认的inplace是False
    inplace=True,数据框本身会改动
    '''
    salesDf.rename(columns =colNameDict,inplace=True)
    salesDf.head()
    

    结果如图所示。

    3、缺失数据处理,用dropna 法处理缺失值,处理前数据大小,代码如下所示。

    print('删除缺失值前大小',salesDf.shape)
    

    结果如图所示。

    4、处理后的数据大小,代码如下所示。

    #删除列(销售时间,社保卡号)中为空的行
    #how='any'在给定的任何一列中有缺失值就删除
    salesDf=salesDf.dropna(subset=['销售时间','社保卡号'],how='any')
    print('删除缺失后大小',salesDf.shape)
    

    结果如图所示。

    5、数据类型转换:本文数据都是以字符串类型导入的,我们需要将字符串转换为我们需要的数据类型,字符串转换为数值(浮点型),代码如下所示。

    '''
    运行后,会报警告SettingWithCopyWarning一般信息有两列,一类是Warning警告信息,一类是Error错误信息。
    警告的信息不用管,我们只关注错误类型的信息
    '''
    #字符串转换为数值(浮点型)
    salesDf['销售数量']=salesDf['销售数量'].astype(float)
    salesDf['应收金额']=salesDf['应收金额'].astype(float)
    salesDf['实收金额']=salesDf['实收金额'].astype(float)
    print('转换后的数据类型:\n',salesDf.dtypes)
    

    结果如图所示。

    6、字符串转换为日期数据类型,定义一个用来分割日期数据的函数splitSaletime(),代码如下所示。

    '''
    定义函数:分割销售日期,获取销售日期
    输入:timeColSer 销售时间这一列,是个Series数据类型
    输出:分割后的时间,返回也是个Series数据类型
    '''
    def splitSaletime(timeColSer):
        timeList=[]
        for value in timeColSer:
            #例如2018-01-01星期五,分割后为:2018-01-01
            dateStr=value.split(' ')[0]
            timeList.append(dateStr)
        #将列表转行为一维数据Series类型
        timeSer=pd.Series(timeList)
        return timeSer
    

    7、调用splitSaletime()来处理销售时间,代码如下所示。

    '''
    注意:
    如果运行后报错:AttributeError:float object has no attribute'split'
    是因为Excel中的空的cell读入pandas中是空值(NaN),这个NaN是个浮点类型,一般当作空值处理。
    所以要先去除NaN在进行分隔字符串
    '''
    #获取"销售时间"这一列
    timeSer=salesDf.loc[:,'销售时间']
    #对字符串进行分割,获取销售日期
    dateSer=splitSaletime(timeSer)
    dateSer.head()
    
    

    运行结果为:

    8、修改销售时间,代码如下所示。

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

    结果如图所示。

    9、将销售时间列数据字符串型转换为日期型,代码如下所示。

    '''
    数据类型转换:字符串转换为日期
    '''
    #errors='coerce'如果原始数据不符合日期的格式,转换后的值为空值NaT
    #format 是你原始数据中日期的格式
    salesDf.loc[:,'销售时间']=pd.to_datetime(salesDf.loc[:,'销售时间'],format='%Y-%m-%d',errors='coerce')
    salesDf.dtypes
    

    运行结果为:

    10、通过转换,销售时间已经由字符串转换为日期,转换过程中不符合日期格式的数值会被转换为空值,需要将其删除,代码如下所示。

    #将空值进行删除
    salesDf=salesDf.dropna(subset=['销售时间','社保卡号'],how='any')
    

    11、排序按销售时间的先后顺序进行排序,排序前的数据,代码如下所示。

    print('排序前的数据集')
    salesDf.head()
    

    结果如图所示。

    12、对销售时间按序排序,代码如下所示。

    '''
    by:按哪几列排序
    ascending=True 表示升序排列,ascending=False表示降序排列
    '''
    #按销售日期进行升序排列
    salesDf=salesDf.sort_values(by='销售时间',ascending=True)
    print('排序前的数据集')
    salesDf.head()
    

    运行结果为:

    13、将索引值修改为从0到N按顺序,代码如下所示。

    #重命名行名(index)
    #排序后的列索引值是之前的行号
    #需要修改成从O到N按顺序的索引值
    salesDf=salesDf.reset_index(drop=True)
    salesDf.head()
    

    结果如图所示。

    14、异常值处理,查看数据看是否存在异常值,代码如下所示。

    #查看数据
    salesDf.describe()
    

    结果如图所示。

    15、处理异常值,代码如下所示。

    #删除异常值:通过条件判断筛选出数据
    #查询条件
    querySer=salesDf.loc[:,'销售数量']>0
    #应用查询条件
    print('删除异常值前:',salesDf.shape)
    salesDf=salesDf.loc[querySer,:]
    print('删除异常值后:',salesDf.shape)
    

    结果如图所示。

    16、对异常值进行处理之后,再使用描述指标查询一次,无异常值,代码如下所示。

    #查看数据
    salesDf.describe()
    

    结果如图所示。

    第三步:构建模型

    业务指标1:月均消费次数=总消费次数/月份数。获取总消费次数,代码如下所示。

    '''
    总消费次数:同一天内,同一个人发生的所有消费算作一次消费
    根据列名(销售时间,社区卡号),如果这两个列值同时相同,只保留1条,将重复的数据删除
    '''
    kpi1_Df=salesDf.drop_duplicates(
        subset=['销售时间','社保卡号']
    )
    #总消费次数:有多少行
    totall=kpi1_Df.shape[0]
    print('总消费次数=',totall)
    

    结果如图所示。

    2、获取时间范围,代码如下所示。

    '''
    计算月份数:时间范围
    '''
    #按销售时间升序排序
    kpil_Df=kpi1_Df.sort_values(by='销售时间',ascending=True)
    #重命名行名(index)
    kpi1_Df=kpil_Df.reset_index(drop=True)
    kpi1_Df.head()
    

    结果如图所示。

    3、获取最小时间值,代码如下所示。

    #最小时间值
    startTime=kpil_Df.loc[0,'销售时间']
    startTime
    
    

    结果如图所示。

    4、获取最大时间值,代码如下所示。

    #最大时间值
    endTime=kpi1_Df.loc[totall-1,'销售时间']
    endTime
    
    

    结果如图所示。

    5、计算总天数,代码如下所示。

    #天数
    daysl=(endTime-startTime).days
    daysl
    
    

    结果如图所示。

    6、计算月份数,代码如下所示。

    #月份数:运算符“//”表示取整除
    #返回商的整数部分,例如9//2输出结果是4
    monthsl=daysl//30
    print('月份数:',monthsl)
    

    结果如图所示。

    7、获取月均消费次数,代码如下所示。

    #业务指标1:月均消费次数=总消费次数/月份数
    kpil_l=totall//monthsl 
    print('业务指标1:月均消费次数=',kpil_l)
    

    结果如图所示。

    8、获取总消费金额,代码如下所示。

    #总消费金额
    totalMoneyF=salesDf.loc[:,'实收金额'].sum()
    totalMoneyF
    

    结果如图所示。

    9、业务指标2:月均消费金额=总消费金额/月份数,获取月均消费金额,代码如下所示。

    #月均消费金额
    monthMoneyF=totalMoneyF/monthsl 
    print('业务指标2:月均消费金额=',monthMoneyF)
    
    

    结果如图所示。

    10、业务指标3:客单价=总消费金额 / 总消费次数,客单价(per customer transaction)是指商场(超市)每一个顾客平均购买商品的金额,客单价也即是平均交易金额,代码如下所示。

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

    结果如图所示。

    11、重命名行名(index)为销售时间所在列的值,代码如下所示。

    #在进行操作之前,先把数相复制到另外一个教帮框中
    #助止对之前清洗后的教指福造成形响
    groupDf=salesDf
    #重命名行名(index)为销售时间所在列的值
    groupDf.index=groupDf['销售时间']
    groupDf.head()
    

    结果如图所示。

    12、分组,代码如下所示。

    #分组
    gb=groupDf.groupby(groupDf.index.month)
    gb.groups
    

    结果如图所示。

    13、应用函数,计算每个月的消费总额,代码如下所示。

    #应用函数,计算每个月的消费总额
    mounthDf=gb.sum()
    mounthDf
    

    结果如图所示。

    后续案例持续更新

    01 基于Python的HBase冠字号查询系统
    02基于Hive的民航客户价值分析
    03 基于python的药店销售数据分析
    04基于Flume与Kafka的web服务器日志数据采集
    05 基于Scrapy的架构的数据采集
    06 Linux操作系统实时日志采集并处理
    07 医疗行业案例-中医病症辩证关联规则分析
    08教育行业案例-高校学生生活数据分析
    10 娱乐行业案例-广告收益回归预测模型
    11网络行业案例-网站访问行为分析
    12零售行业案例-店铺热门商品实时统计
    13 营业额数据可视化
    14金融行业案例-基于上市公司股票信息及其衍生变量的金融数据分析
    15银行信用卡风险数据可视化
    16 滴滴出行城市运营分析
    17 幸福指数可视化
    18 员工主动离职预警模型
    19 歌手推荐模型
    20 2020新冠肺炎疫情数据分析
    21 淘宝购物狂欢节数据分析
    22 共享单车数据分析
    23人脸检测系统
    24服装分拣系统
    25口罩佩戴识别系统
    26 imdb电影数据分析
    20 2020新冠肺炎疫情数据分析
    21 淘宝购物狂欢节数据分析
    22 共享单车数据分析
    23人脸检测系统
    24服装分拣系统
    25口罩佩戴识别系统
    26 imdb电影数据分析

    物联沃分享整理
    物联沃-IOTWORD物联网 » 26个数据分析案例——第三站:基于python的药店销售数据分析

    发表评论