用python分析处理药店销售数据:得到以下三个指标:月消费次数,即总消费次数除以月份数,往往是销售部门重要的指标值之一。月均消费金额,总的消费金额除以月份数,主要作为部门收益的一个指标。(3

本文主要是介绍用python分析处理药店销售数据:得到以下三个指标:月消费次数,即总消费次数除以月份数,往往是销售部门重要的指标值之一。月均消费金额,总的消费金额除以月份数,主要作为部门收益的一个指标。(3,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

项目背景与目标

    1.  零售药店行业现状分析

药品零售作为一个传统行业,正受到新零售方式崛起、医改不断深化、行业监管逐步提升等挑战,零售药店位居医药产业链下游,是医药零售的重要终端。在中国,药店是指面向消费者销售医药产品和各类健康产品的零售门店,近年来也发展出网上药店这类线上终端。而中国药店渠道仅占药品总销售约2成,如将我国药品销售分为医院、药店和基层医疗机构三大终端,药品在药店渠道销售占比约为22.5%,远不及医院终端68.4%的销售占比。

但与医院相比,零售药店无论是购药的经济性还是便利性上都更具优势,但在医药未分家的现状下,目前药店专业性方面仍不如医院终端。在这样的新竞争、新规则环境下,零售药店行业有必要从扩容时代1.0系列的跑马圈地、医保管控时代2.0系列的精耕细作,进入精准定位、精准服务的3.0新纪元。

1.2 主要面向群体及优势

药店以便利性为核心,具备一定的经济性。零售药店是当前三大医药消费终端之一,上游连接医药制造商或批发商,下游为消费者提供药品、医疗器械、保健品等医药健康产品。和医院相比,零售药店规模相对较小,可灵活布局,具有明显的便利性优势;零售药店竞争激烈,规模化的龙头可借助较强的供应链整合能力为消费者提供更具性价比的产品,因此也具备一定的经济性。

连锁药店药品的概念和特点决定了药品的购买者为成年人。成年人有一定的疾病判断能力,能较为准确的判断病的类别和病情严重程度,有一定的药品使用经验;且在经济上有一定的来源,可以自主支配药品费用;文化程度高的人和医疗保健意识更强的人;工作节奏快的人;如白领阶层在选购药品时,更倾向于知名品牌和声誉好的公司的产品,注重药品质量更愿意去大型的连锁药店买药,药品质量有保证。而消费者到连锁药店购买OTC药品的主要原因为无需去医院就诊的小病痛,方便快捷无需繁琐流程等。

1.3 项目实现目标

本项目获取到了某家药店年销售数据,通过对相关药品销售数据进行分析,了解该药店在一年里的销售情况,得到以下三个指标:

  1. 月消费次数,即总消费次数除以月份数,往往是销售部门重要的指标值之一。
  2. 月均消费金额,总的消费金额除以月份数,主要作为部门收益的一个指标。

(3)客单价,即月均消费金额/月消费次数。来判断是否需要提高客单价来提高收益。

同时分析消费趋势、需求量前几位的药品等来增加药店销售收益。

2 主要方法介绍

2.1 数据探索

2.1.1 总体流程

图 1 数据探索具体流程图

  1. 抽取数据:在获取到数据集后根据需求筛选出部分所需数据。
  2. 数据预处理:数据预处理是指对数据进行数据合并、数据清洗、数据标准化和数据变换,并直接用于分析建模的这一过程的总称。本案例应用到了数据清洗和数据转换。数据清洗可以去掉重复、缺失、异常、不一致的数据;数据变换可以通过离散化、哑变量处理等技术满足后期分析与建模的数据要求。在数据分析的过程中,数据预处理的各个过程互相交叉,并没有明确的先后顺序。
  3. 建模:通过对比分析、分组分析、交叉分析、回归分析等分析方法,以及聚类模型、分类模型、关联规则、智能推荐等模型与算法,发现数据中的有价值信息构建模型,并得出结论的过程。
  4. 评价与优化:模型评价是指对于已经建立的一个或多个模型,根据其模型的类别,使用不同的指标评价其性能优劣的过程。模型优化则是指模型性

能在经过模型评价后已经达到了要求,但在实际生产环境应用过程中,发现模型的性能并不理想,继而对模型进行重构与优化的过程。

  1. 部署:部署是指将数据分析结果与结论应用至实际生产系统的过程。根据需求的不同,部署阶段可以是一份包含了现状具体整改措施的数据分析报告,也可以是将模型部署在整个生产系统的解决方案。

2.1.2 数据展示

项目研究数据为6578条药店年销售数据,共7个属性参数。接下来需要对原数据进行清洗、分布等操作来更抽取有效数据。

表 2-1 原始数据展示

由上表可知,原数据集七个特征名称分别:(1)购药时间;(2)社保卡号;(3)商品编号;(4)商品名称;(5)销售数量;(6)应收金额;(7)实收金额。接下来将对其展开分析。

2.2 数据预处理

2.2.1 导入数据

import numpy as np

from pandas import Series,DataFrame

import pandas as pd

#导入数据

file_name = r'C:\某药店年销售数据.xlsx'

# 使用ExcelFile()时需要传入目标excel文件所在路径及文件名称

xls = pd.ExcelFile(file_name)

# 使用parse()可以根据传入的sheet名称来提取对应的表格信息

dataDF = xls.parse('Sheet1',dtype='object')

# 输出前五行数据

dataDF.head()

#查看数据几行几列

print(dataDF.shape)

#查看索引

print(dataDF.index)

#查看每一列的列表头内容

print(dataDF.columns)

#查看每一列数据统计数目

print(dataDF.count())

2.2.2 数据清洗

本案例中数据清洗主要针对的是缺失值处理,查找出原始数据集中的缺失值并对其所在行执行删除操作,通过info()可明显看出操作后行数减少3行,说明操作成功。

代码如下:

dataDF.rename(columns={'购药时间':'销售时间'},inplace=True)

print('删除缺失值前:', dataDF.shape)

# 使用info查看数据信息,

print(dataDF.info())

#删除缺失值

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

print('\n删除缺失值后',dataDF.shape)

print(dataDF.info())

从数据中可以看出,共有6578行,但是没有哪一列是有6578行的,表明存在缺失值。

2.2.3 数据类型转换

(1)字符串转换为浮点型

因为初始导入的数据,销售数量、应收金额、实收金额都为字符串格式,无法进行计算,因此需要将格式转换成数值格式,这里取float类型。

代码如下:

dataDF['销售数量'] = dataDF['销售数量'].astype('float')

dataDF['应收金额'] = dataDF['应收金额'].astype('float')

dataDF['实收金额'] = dataDF['实收金额'].astype('float')

print(dataDF.dtypes)

(2)日期列字符串转换为日期数据类型

当前数据日期字段为字符串(object)格式,并且含有星期几,这会给时间统计造成麻烦,因此销售时间的格式需要由object调整为datetime格式,并删除后面的星期几。

代码如下:

def splitSaletime(timeColSer):

    timeList = []

    for value in timeColSer:

        dateStr = value.split(' ')[0]

        timeList.append(dateStr)

  timeSer = pd.Series(timeList)

    return timeSer

timeSer = dataDF.loc[:,'销售时间']

dateSer = splitSaletime(timeSer)

dateSer[0:3]

dataDF.loc[:,'销售时间'] = pd.to_datetime(dataDF.loc[:,'销售时间'],\                                      format='%Y-%m-%d',errors='coerce')

dataDF.info()

因转换日期过程中不符合日期格式的数值会被转换为空值None,所以转换完成后需要检验是否有空值存在。

True表明确实有控制存在,此时使用dropna()函数删除空值所在行,如下所示:

可看出行数减少,说明空值所在行删除成功

2.2.4 数据排序

按照购买时间,对数据进行排序

代码如下:

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

datasDF = dataDF.reset_index(drop = True)

dataDF.head()

2.2.5 异常值处理

使用describe()函数查看数据大致情况

发现最小值存在负数,但是对于销售数量与金额来说,负数是不可能存在的,因此需要对数据进行异常值处理。

pop = dataDF.loc[:,'销售数量'] > 0

dataDF = dataDF.loc[pop,:]

dataDF.describe()

删除异常值前: (6549, 7) 删除异常值后: (6506, 7)。至此,数据已完成全部预处理工作。

3 结果分析

3.1 构建模型

3.1.1 月消费次数

月均消费次数=总消费次数/总月份数。总消费次数定义为同一天内同一个人发生的所有消费算作一次消费,需要判断销售时间和社保卡号这两列里面有哪些数据是重复的。删除重复值之后的行数即为总消费次数。

代码如下

#删除重复数据

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

totalI = kpil_Df.shape[0]

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

#计算月份数

#按销售时间升序排序

kpil_Df = kpil_Df.sort_values(by='销售时间', ascending=True)

#重命名行名

kpil_Df = kpil_Df.reset_index(drop=True)

#获取时间范围

startTime = kpil_Df.loc[0,'销售时间']

endTime = kpil_Df.loc[totalI-1,'销售时间']

#计算月份

#天数

daysI = (endTime-startTime).days

mounthI = daysI//30

print('月份数=',mounthI)

#月平均消费次数

kpil_I = totalI//mounthI

print('业务指标1:月均消费次数=', kpil_I)

3.1.2 月均消费金额

因为销售的过程会打折,这也就是会有应收金额和实收金额两个数据。对于计算销售的收益,以实收金额为准,也就是计算实际收费金额的总和(sum函数)再除以总的月数。

代码如下

#消费总金额

totalMoneyF = dataDF.loc[:,'实收金额'].sum()

mounthMoney = totalMoneyF // mounthI

print('业务指标2:月均消费金额=', mounthMoney)

3.1.3 客单价

客单价即为指标1/指标2

pct = totalMoneyF / totalI

print('业务指标3:客单价=', pct)

3.2 数据可视化

3.2.1 每日消费金额

代码如下

import matplotlib.pyplot as plt

import matplotlib

from pylab import mpl

mpl.rcParams['font.sans-serif']=['SimHei']

groupDF = dataDF

groupDF.index = groupDF['销售时间']

print(groupDF.head())

gb = groupDF.groupby(groupDF.index)

print(gb)

dayDF = gb.sum()

print(dayDF)

plt.plot(dayDF['实收金额'])

plt.title('按天消费金额')

plt.xlabel('时间')

plt.ylabel('实收金额')

plt.show()

运行结果

图 2 按天消费金额可视化图表

从图中可以看出,每日消费总额差异较大,除了个别天出现比较大笔的消费,大部分人消费情况维持在1000-2000元以内。

3.2.2 每月消费金额

代码如下

gb = groupDF.groupby(groupDF.index.month)

print(gb)

monthDF = gb.sum()

print(monthDF)

plt.plot(monthDF['实收金额'])

plt.title('按月消费金额')

plt.xlabel('时间')

plt.ylabel('实收金额')

plt.show()

运行结果:

图 3 按月消费金额可视化图表

图中显示,7月消费金额最少,这是因为7月份的数据不完整,所以不具参考价值。1月、4月、5月和6月的月消费金额差异不大。2月和3月的消费金额迅速降低,这可能是由于春节期间人员普遍外出较少的原因。

3.2.3 药品的销售情况

代码如下

#聚合统计各种药品数量

medicine = groupDF[['商品名称','销售数量']]

bk = medicine.groupby('商品名称')[['销售数量']]

re_medicine = bk.sum()

#对销售药品数量按降序排序

re_medicine = re_medicine.sort_values(by='销售数量', ascending=False)

top_medicine = re_medicine.iloc[:10,:]

top_medicine

# 数据可视化,用条形图展示前十的药品

top_medicine.plot(kind = 'bar')

plt.title('销售前十的药品')

plt.xlabel('药品')

plt.ylabel('数量')

plt.show()

运行结果:

图中可以看出销售前十的药品,第一和第十相差较大,这与药品的种类及适应性相关。该图标可为药店进货及库存量提供参考建议。

3.2.4 每日消费金额分布情况

代码如下

temp1=list(dataDF['销售时间'])

temp2=list(dataDF['实收金额'])

plt.scatter(temp1,temp2)

plt.title('每天销售金额')

plt.xlabel('时间')

plt.ylabel('实收金额')

plt.show()

运行结果

从图中可以看出,每天消费金额在500以下的占绝大多数,存在极个别个离群点,有消费金额很大的情况。

3.3 案例总结

(1)该药店1-7月的月均消费次数为89次,月均消费金额为50668元,客单价为56.91元。

(2)单名顾客的消费数量主要是个位数为主,顾客购买最多的产品是对苯磺酸氨氯地平片(安内真),其次是开博通。可以适当增加这两种药品的进货量。

(3)销售趋势整体呈下降趋势,4月达到峰值后,下降趋势明显,7月达到最低值。经营者应当着重观察4月份以后周边经营环境是否发生变化, 药店内部是否出现经营纰漏,找出销量下跌原因,改善销售情况。

4 小结

通过这次对药店销售数据的分析让我将python数据分析的知识点得到了一个综合运用,对于知识点有了更深刻的理解。对于python数据分析的流程,不外乎就是获取数据、处理数据、分析数据、数据可视化,能运用python数据分析解决具体的问题,再根据分析结果得到一些趋势的判断,这就是数据分析的意义。

参 考 文 献

  1. 刘斯敏,卢倩.连锁药店关联销售现状研究——以广西大参林药店为例[J].商展经济,2021(09):30-32.
  2. 谭东明,龚贺.零售药店销售现状分析与思考[J].甘肃科技,2020,36(24):4-6.
  3. 张玉,舒后,孙昊白.数据可视化及应用研究[J].北京印刷学院学报,2020,28(04):135-140.
  4. 高雨菲,毛红霞.基于Python的豆瓣影视短评的数据采集与分析[J].现代信息科技,2020,4(24):10-12+16.
  5. 段亚西,徐成振,魏凌华,高艳玲.Python语言程序设计课程教学方法探究[J].科技风,2021(17):40-42.
  6. 区苏.浅析Python数据分析的应用技术[J].山西青年,2021(10):67-68.
  7. 叶惠仙,游金水.Python语言在大数据处理中的应用[J].网络安全技术与应用,2021(05):51-54.

项目背景与目标

    1.  零售药店行业现状分析

药品零售作为一个传统行业,正受到新零售方式崛起、医改不断深化、行业监管逐步提升等挑战,零售药店位居医药产业链下游,是医药零售的重要终端。在中国,药店是指面向消费者销售医药产品和各类健康产品的零售门店,近年来也发展出网上药店这类线上终端。而中国药店渠道仅占药品总销售约2成,如将我国药品销售分为医院、药店和基层医疗机构三大终端,药品在药店渠道销售占比约为22.5%,远不及医院终端68.4%的销售占比。

但与医院相比,零售药店无论是购药的经济性还是便利性上都更具优势,但在医药未分家的现状下,目前药店专业性方面仍不如医院终端。在这样的新竞争、新规则环境下,零售药店行业有必要从扩容时代1.0系列的跑马圈地、医保管控时代2.0系列的精耕细作,进入精准定位、精准服务的3.0新纪元。

1.2 主要面向群体及优势

药店以便利性为核心,具备一定的经济性。零售药店是当前三大医药消费终端之一,上游连接医药制造商或批发商,下游为消费者提供药品、医疗器械、保健品等医药健康产品。和医院相比,零售药店规模相对较小,可灵活布局,具有明显的便利性优势;零售药店竞争激烈,规模化的龙头可借助较强的供应链整合能力为消费者提供更具性价比的产品,因此也具备一定的经济性。

连锁药店药品的概念和特点决定了药品的购买者为成年人。成年人有一定的疾病判断能力,能较为准确的判断病的类别和病情严重程度,有一定的药品使用经验;且在经济上有一定的来源,可以自主支配药品费用;文化程度高的人和医疗保健意识更强的人;工作节奏快的人;如白领阶层在选购药品时,更倾向于知名品牌和声誉好的公司的产品,注重药品质量更愿意去大型的连锁药店买药,药品质量有保证。而消费者到连锁药店购买OTC药品的主要原因为无需去医院就诊的小病痛,方便快捷无需繁琐流程等。

1.3 项目实现目标

本项目获取到了某家药店年销售数据,通过对相关药品销售数据进行分析,了解该药店在一年里的销售情况,得到以下三个指标:

  1. 月消费次数,即总消费次数除以月份数,往往是销售部门重要的指标值之一。
  2. 月均消费金额,总的消费金额除以月份数,主要作为部门收益的一个指标。

(3)客单价,即月均消费金额/月消费次数。来判断是否需要提高客单价来提高收益。

同时分析消费趋势、需求量前几位的药品等来增加药店销售收益。

2 主要方法介绍

2.1 数据探索

2.1.1 总体流程

图 1 数据探索具体流程图

  1. 抽取数据:在获取到数据集后根据需求筛选出部分所需数据。
  2. 数据预处理:数据预处理是指对数据进行数据合并、数据清洗、数据标准化和数据变换,并直接用于分析建模的这一过程的总称。本案例应用到了数据清洗和数据转换。数据清洗可以去掉重复、缺失、异常、不一致的数据;数据变换可以通过离散化、哑变量处理等技术满足后期分析与建模的数据要求。在数据分析的过程中,数据预处理的各个过程互相交叉,并没有明确的先后顺序。
  3. 建模:通过对比分析、分组分析、交叉分析、回归分析等分析方法,以及聚类模型、分类模型、关联规则、智能推荐等模型与算法,发现数据中的有价值信息构建模型,并得出结论的过程。
  4. 评价与优化:模型评价是指对于已经建立的一个或多个模型,根据其模型的类别,使用不同的指标评价其性能优劣的过程。模型优化则是指模型性

能在经过模型评价后已经达到了要求,但在实际生产环境应用过程中,发现模型的性能并不理想,继而对模型进行重构与优化的过程。

  1. 部署:部署是指将数据分析结果与结论应用至实际生产系统的过程。根据需求的不同,部署阶段可以是一份包含了现状具体整改措施的数据分析报告,也可以是将模型部署在整个生产系统的解决方案。

2.1.2 数据展示

项目研究数据为6578条药店年销售数据,共7个属性参数。接下来需要对原数据进行清洗、分布等操作来更抽取有效数据。

表 2-1 原始数据展示

由上表可知,原数据集七个特征名称分别:(1)购药时间;(2)社保卡号;(3)商品编号;(4)商品名称;(5)销售数量;(6)应收金额;(7)实收金额。接下来将对其展开分析。

2.2 数据预处理

2.2.1 导入数据

import numpy as np

from pandas import Series,DataFrame

import pandas as pd

#导入数据

file_name = r'C:\某药店年销售数据.xlsx'

# 使用ExcelFile()时需要传入目标excel文件所在路径及文件名称

xls = pd.ExcelFile(file_name)

# 使用parse()可以根据传入的sheet名称来提取对应的表格信息

dataDF = xls.parse('Sheet1',dtype='object')

# 输出前五行数据

dataDF.head()

#查看数据几行几列

print(dataDF.shape)

#查看索引

print(dataDF.index)

#查看每一列的列表头内容

print(dataDF.columns)

#查看每一列数据统计数目

print(dataDF.count())

2.2.2 数据清洗

本案例中数据清洗主要针对的是缺失值处理,查找出原始数据集中的缺失值并对其所在行执行删除操作,通过info()可明显看出操作后行数减少3行,说明操作成功。

代码如下:

dataDF.rename(columns={'购药时间':'销售时间'},inplace=True)

print('删除缺失值前:', dataDF.shape)

# 使用info查看数据信息,

print(dataDF.info())

#删除缺失值

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

print('\n删除缺失值后',dataDF.shape)

print(dataDF.info())

从数据中可以看出,共有6578行,但是没有哪一列是有6578行的,表明存在缺失值。

2.2.3 数据类型转换

(1)字符串转换为浮点型

因为初始导入的数据,销售数量、应收金额、实收金额都为字符串格式,无法进行计算,因此需要将格式转换成数值格式,这里取float类型。

代码如下:

dataDF['销售数量'] = dataDF['销售数量'].astype('float')

dataDF['应收金额'] = dataDF['应收金额'].astype('float')

dataDF['实收金额'] = dataDF['实收金额'].astype('float')

print(dataDF.dtypes)

(2)日期列字符串转换为日期数据类型

当前数据日期字段为字符串(object)格式,并且含有星期几,这会给时间统计造成麻烦,因此销售时间的格式需要由object调整为datetime格式,并删除后面的星期几。

代码如下:

def splitSaletime(timeColSer):

    timeList = []

    for value in timeColSer:

        dateStr = value.split(' ')[0]

        timeList.append(dateStr)

  timeSer = pd.Series(timeList)

    return timeSer

timeSer = dataDF.loc[:,'销售时间']

dateSer = splitSaletime(timeSer)

dateSer[0:3]

dataDF.loc[:,'销售时间'] = pd.to_datetime(dataDF.loc[:,'销售时间'],\                                      format='%Y-%m-%d',errors='coerce')

dataDF.info()

因转换日期过程中不符合日期格式的数值会被转换为空值None,所以转换完成后需要检验是否有空值存在。

True表明确实有控制存在,此时使用dropna()函数删除空值所在行,如下所示:

可看出行数减少,说明空值所在行删除成功

2.2.4 数据排序

按照购买时间,对数据进行排序

代码如下:

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

datasDF = dataDF.reset_index(drop = True)

dataDF.head()

2.2.5 异常值处理

使用describe()函数查看数据大致情况

发现最小值存在负数,但是对于销售数量与金额来说,负数是不可能存在的,因此需要对数据进行异常值处理。

pop = dataDF.loc[:,'销售数量'] > 0

dataDF = dataDF.loc[pop,:]

dataDF.describe()

删除异常值前: (6549, 7) 删除异常值后: (6506, 7)。至此,数据已完成全部预处理工作。

3 结果分析

3.1 构建模型

3.1.1 月消费次数

月均消费次数=总消费次数/总月份数。总消费次数定义为同一天内同一个人发生的所有消费算作一次消费,需要判断销售时间和社保卡号这两列里面有哪些数据是重复的。删除重复值之后的行数即为总消费次数。

代码如下

#删除重复数据

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

totalI = kpil_Df.shape[0]

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

#计算月份数

#按销售时间升序排序

kpil_Df = kpil_Df.sort_values(by='销售时间', ascending=True)

#重命名行名

kpil_Df = kpil_Df.reset_index(drop=True)

#获取时间范围

startTime = kpil_Df.loc[0,'销售时间']

endTime = kpil_Df.loc[totalI-1,'销售时间']

#计算月份

#天数

daysI = (endTime-startTime).days

mounthI = daysI//30

print('月份数=',mounthI)

#月平均消费次数

kpil_I = totalI//mounthI

print('业务指标1:月均消费次数=', kpil_I)

3.1.2 月均消费金额

因为销售的过程会打折,这也就是会有应收金额和实收金额两个数据。对于计算销售的收益,以实收金额为准,也就是计算实际收费金额的总和(sum函数)再除以总的月数。

代码如下

#消费总金额

totalMoneyF = dataDF.loc[:,'实收金额'].sum()

mounthMoney = totalMoneyF // mounthI

print('业务指标2:月均消费金额=', mounthMoney)

3.1.3 客单价

客单价即为指标1/指标2

pct = totalMoneyF / totalI

print('业务指标3:客单价=', pct)

3.2 数据可视化

3.2.1 每日消费金额

代码如下

import matplotlib.pyplot as plt

import matplotlib

from pylab import mpl

mpl.rcParams['font.sans-serif']=['SimHei']

groupDF = dataDF

groupDF.index = groupDF['销售时间']

print(groupDF.head())

gb = groupDF.groupby(groupDF.index)

print(gb)

dayDF = gb.sum()

print(dayDF)

plt.plot(dayDF['实收金额'])

plt.title('按天消费金额')

plt.xlabel('时间')

plt.ylabel('实收金额')

plt.show()

运行结果

图 2 按天消费金额可视化图表

从图中可以看出,每日消费总额差异较大,除了个别天出现比较大笔的消费,大部分人消费情况维持在1000-2000元以内。

3.2.2 每月消费金额

代码如下

gb = groupDF.groupby(groupDF.index.month)

print(gb)

monthDF = gb.sum()

print(monthDF)

plt.plot(monthDF['实收金额'])

plt.title('按月消费金额')

plt.xlabel('时间')

plt.ylabel('实收金额')

plt.show()

运行结果:

图 3 按月消费金额可视化图表

图中显示,7月消费金额最少,这是因为7月份的数据不完整,所以不具参考价值。1月、4月、5月和6月的月消费金额差异不大。2月和3月的消费金额迅速降低,这可能是由于春节期间人员普遍外出较少的原因。

3.2.3 药品的销售情况

代码如下

#聚合统计各种药品数量

medicine = groupDF[['商品名称','销售数量']]

bk = medicine.groupby('商品名称')[['销售数量']]

re_medicine = bk.sum()

#对销售药品数量按降序排序

re_medicine = re_medicine.sort_values(by='销售数量', ascending=False)

top_medicine = re_medicine.iloc[:10,:]

top_medicine

# 数据可视化,用条形图展示前十的药品

top_medicine.plot(kind = 'bar')

plt.title('销售前十的药品')

plt.xlabel('药品')

plt.ylabel('数量')

plt.show()

运行结果:

图中可以看出销售前十的药品,第一和第十相差较大,这与药品的种类及适应性相关。该图标可为药店进货及库存量提供参考建议。

3.2.4 每日消费金额分布情况

代码如下

temp1=list(dataDF['销售时间'])

temp2=list(dataDF['实收金额'])

plt.scatter(temp1,temp2)

plt.title('每天销售金额')

plt.xlabel('时间')

plt.ylabel('实收金额')

plt.show()

运行结果

从图中可以看出,每天消费金额在500以下的占绝大多数,存在极个别个离群点,有消费金额很大的情况。

3.3 案例总结

(1)该药店1-7月的月均消费次数为89次,月均消费金额为50668元,客单价为56.91元。

(2)单名顾客的消费数量主要是个位数为主,顾客购买最多的产品是对苯磺酸氨氯地平片(安内真),其次是开博通。可以适当增加这两种药品的进货量。

(3)销售趋势整体呈下降趋势,4月达到峰值后,下降趋势明显,7月达到最低值。经营者应当着重观察4月份以后周边经营环境是否发生变化, 药店内部是否出现经营纰漏,找出销量下跌原因,改善销售情况。

4 小结

通过这次对药店销售数据的分析让我将python数据分析的知识点得到了一个综合运用,对于知识点有了更深刻的理解。对于python数据分析的流程,不外乎就是获取数据、处理数据、分析数据、数据可视化,能运用python数据分析解决具体的问题,再根据分析结果得到一些趋势的判断,这就是数据分析的意义。

参 考 文 献

  1. 刘斯敏,卢倩.连锁药店关联销售现状研究——以广西大参林药店为例[J].商展经济,2021(09):30-32.
  2. 谭东明,龚贺.零售药店销售现状分析与思考[J].甘肃科技,2020,36(24):4-6.
  3. 张玉,舒后,孙昊白.数据可视化及应用研究[J].北京印刷学院学报,2020,28(04):135-140.
  4. 高雨菲,毛红霞.基于Python的豆瓣影视短评的数据采集与分析[J].现代信息科技,2020,4(24):10-12+16.
  5. 段亚西,徐成振,魏凌华,高艳玲.Python语言程序设计课程教学方法探究[J].科技风,2021(17):40-42.
  6. 区苏.浅析Python数据分析的应用技术[J].山西青年,2021(10):67-68.
  7. 叶惠仙,游金水.Python语言在大数据处理中的应用[J].网络安全技术与应用,2021(05):51-54.

这篇关于用python分析处理药店销售数据:得到以下三个指标:月消费次数,即总消费次数除以月份数,往往是销售部门重要的指标值之一。月均消费金额,总的消费金额除以月份数,主要作为部门收益的一个指标。(3的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/852903

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi