zoukankan      html  css  js  c++  java
  • 药店商品销量分析(python)

    一、数据分析的步骤

     二、提出问题

    分析药店商品销售情况

    1)月均消费次数

    2)月均消费金额

    3)客单价

    4)消费趋势

    5)热销商品、滞销商品

    三、理解数据

    销售数据源为excel文件

    字段的含义:

    共有6579条销售数据

    共有7个字段分别为:购买时间、社保卡号、商品编码、商品名称、销售数量、应收金额、实收金额

    四、清洗数据

     本次分析采用Jupyter Notebook分析,数据集为本地excel文件

    (1)选择子集

    本次分析的excel工作簿里面只有一个工作表

    #导入数据分析包
    import pandas as pd
    salesDf = pd.read_excel('./朝阳医院2018年销售数据.xlsx')
    # head()打印前5行
    #
    df = pd.read_excel(path,sheet_name=4,header=6)# 指定序号为4的工作簿,用第6行做为行索引
    """sheet_name,工作簿的序号从0开始 """
    #header从0开始计数
    print(salesDf.head())

    (2)列表重命名

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

    (3)删除重复值

    print('删除重复值前大小',salesDf.shape)
    
    # 删除重复销售记录
    salesDf = salesDf.drop_duplicates()
    
    print('删除重复值后大小',salesDf.shape)

     删除前后数据进行对比,发现本数据集没有重复值

    (4)缺失值处理  info也可以查看字段的数据类型

    """整体观察"""
    df.info()
    """如果缺失的数据很少,可以直接进行删除"""
    """如果缺失的数据量较大,超过了10%,要根据业务情况,进行删除或填充"""
    """填充数据时,可以采用均值,中位数进行填充"""
    """如果数据记录之间有明显的顺序关系,可以采用附近相邻的数据进行填充"""


    总共有6578行数据只有2个缺失值,可以直接删除
    """删除缺失值"""
    df.dropna()# 删除出现缺失值得行
    # df.dropna(axis=1)
    
    df.dropna(how='all') # 当整行数据都为nan 时才删除
    df.dropna(how='any') # 只要出现缺失值就删除
    df.dropna(subset=['房价'])# 指定列出现缺失值才删除
    print('删除缺失后大小',salesDf.shape)
    # 查询是否有空值
    print(salesDf.isnull().any())

     处理后,结果显示没有缺失值

    (5)一致化处理

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

     只需要将销售时间改为:字符串转换为日期数据类型

    #获取“销售时间”这一列
    timeSer=salesDf.loc[:,'销售时间']
    #对字符串进行分割,获取销售日期
    timeList=[]
    for value in timeSer:
    #例如2018-01-01 星期五,分割后为:2018-01-01
        dateStr=value.split(' ')[0]
        timeList.append(dateStr)
        
    #将列表转行为一维数据Series类型
    timeSer=pd.Series(timeList)
    print(timeSer.head())
    #修改销售时间这一列的值
    salesDf.loc[:,'销售时间']=dateSer
    salesDf.head()
    '''
    数据类型转换:字符串转换为日期
    '''
    #errors='coerce' 如果原始数据不符合日期的格式,转换后的值为空值NaT
    #format 是你原始数据中日期的格式
    salesDf.loc[:,'销售时间']=pd.to_datetime(salesDf.loc[:,'销售时间'],
                                        format='%Y-%m-%d', 
                                        errors='coerce')

    # 查询是否有空值
    print(salesDf.isnull().any())

    '''
    转换日期过程中不符合日期格式的数值会被转换为空值,
    这里删除列(销售时间)中为空的行
    '''
    salesDf=salesDf.dropna(subset=['销售时间'],how='any')
    
    # 查询是否有空值
    print(salesDf.isnull().any())

    (6)数据排序

    按照销售时间进行排序

    '''
    by:按哪几列排序
    ascending=True 表示升序排列,
    ascending=True表示降序排列
    na_position=first表示排序的时候,把空值放到前列,这样可以比较清晰的看到哪些地方有空值
    官网文档:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.sort_values.html
    '''
    #按销售日期进行升序排列
    salesDf=salesDf.sort_values(by='销售时间',
                        ascending=True,
                        na_position='first')

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

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

    (7)异常值处理

    #描述指标:查看出“销售数量”值不能小于0
    salesDf.describe()
    #删除异常值:通过条件判断筛选出数据
    #查询条件
    querySer=salesDf.loc[:,'销售数量']>0
    #应用查询条件
    print('删除异常值前:',salesDf.shape)
    
    # 筛选数据
    
    salesDf=salesDf.loc[querySer,:]
    
    print('删除异常值后:',salesDf.shape)
    print(salesDf.head())

    五、构建模型

     (1)业务指标1:月均消费次数=总消费次数 / 月份数

    '''
    总消费次数:同一天内,同一个人发生的所有消费算作一次消费
    #根据列名(销售时间,社区卡号),如果这两个列值同时相同,只保留1条,将重复的数据删除
    '''
    
    kpi1_Df=salesDf.drop_duplicates(
        subset=['销售时间', '社保卡号']
    )
    
    #总消费次数:有多少行
    # shape几行几列
    totalI=kpi1_Df.shape[0]
    
    print('总消费次数=',totalI)
    '''
    计算月份数:时间范围
    '''
    #第1步:按销售时间升序排序
    kpi1_Df=kpi1_Df.sort_values(by='销售时间',
                        ascending=True)
    #重命名行名(index)
    kpi1_Df=kpi1_Df.reset_index(drop=True)

    #第2步:获取时间范围
    #最小时间值
    startTime=kpi1_Df.loc[0,'销售时间']
    #最大时间值 totallI总行数
    endTime=kpi1_Df.loc[totalI-1,'销售时间']
    
    #第3步:计算月份数
    #天数
    daysI=(endTime-startTime).days
    #月份数: 运算符“//”表示取整除 
    #返回商的整数部分,例如9//2 输出结果是4
    monthsI=daysI//30
    print('月份数:',monthsI)
    #业务指标1:月均消费次数=总消费次数 / 月份数
    kpi1_I=totalI // monthsI
    print('业务指标1:月均消费次数=',kpi1_I)
    业务指标1:月均消费次数= 890

    (2)指标2:月均消费金额 = 总消费金额 / 月份数

    #总消费金额
    totalMoneyF=salesDf.loc[:,'实收金额'].sum()
    #月均消费金额
    monthMoneyF=totalMoneyF / monthsI
    print('业务指标2:月均消费金额=',monthMoneyF)
    业务指标2:月均消费金额= 50668.35166666666

    (3)指标3:客单价=总消费金额 / 总消费次数

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

     (4)指标4:消费趋势,画图:折线图

    #在进行操作之前,先把数据复制到另一个数据框中,防止对之前清洗后的数据框造成影响
    groupDf=salesDf
    #第1步:重命名行名(index)为销售时间所在列的值
    groupDf.index=groupDf['销售时间']
    groupDf.head()
    #第2步:分组
    
    print(groupDf.index.month)
    gb=groupDf.groupby(groupDf.index.month)
    # Pandas 无法显示中文问题 解决方案##
    plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
    plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
    import matplotlib.pyplot as plt
    ax = data_mounth.plot( secondary_y=['销售数量'], x_compat=True, grid=True,figsize=(10,4)) ax.right_ax.set_ylabel('销售数量') ax.set_ylabel(['应收金额','实收金额']) #ax.set_ylabel() plt.show()

    (5)热销商品、滞销商品

    product = salesDf.groupby('商品名称').count()
    #print(product)
    # print(type(product))
    sum_product = product.loc[:,'销售数量']
    # print(sum_product)
    # 可以看出商品整体的销量情况
    print(sum_product.sort_values(ascending=True)) 
    

    六、总结和建议

    总结:
    (1)总消费次数= 5342,6个月,月均消费次数= 890,平均每天消费30人次。
    (2)月均消费金额:月均消费金额= 50668元
    (3)客单价:57元
    (4)消费趋势:2-4月销量上升,4月销售数量出现峰值,4-7月销量下降
    (5)定义销量过百的属于热销商品:共16种商品,滞销商品(非热销)78-16=62种
    建议:
    1.月均消费次数890,平均每天消费次数30次,月均50668元,客单价57元,数据可观。
    2.重点分析4月销量高的原因,以及4月后销量下降的影响因素
    3.研究热销商品的属性,可以考虑重点营销,对滞销商品进行下架退货处理

     

  • 相关阅读:
    frida
    ES中filter 和map的使用
    阿里巴巴15 款开发者工具
    小程序的开发记录
    微信3.1小程序商城源码C# ASP.NET 多用户微商城 saas模式
    js中for,for in,forEach,for of的使用
    Vuejs学习笔记
    vue.js/element-ui/webpack 开发记录
    ESXi开启虚拟化
    shell把字符串中的字母去掉,只保留数字
  • 原文地址:https://www.cnblogs.com/foremostxl/p/11914359.html
Copyright © 2011-2022 走看看