Python数据分析案例-药店销售数据分析

最近学习了Python数据分析的一些基础知识,就找了一个药品数据分析的小项目来练一下手。

数据分析的目的:

本篇文章中,假设以朝阳医院2018年销售数据为例,目的是了解朝阳医院在2018年里的销售情况,通过对朝阳区医院的药品销售数据的分析,了解朝阳医院的患者的月均消费次数,月均消费金额、客单价以及消费趋势、需求量前几位的药品等。

数据分析基本过程包括:获取数据、数据清洗、构建模型、数据可视化以及消费趋势分析。

数据准备

数据是存在Excel中的,可以使用pandas的Excel文件读取函数将数据读取到内存中,这里需要注意的是文件名和Excel中的sheet页的名字。读取完数据后可以对数据进行预览和查看一些基本信息。

获取数据:朝阳医院2018年销售数据.xlsx(非真实数据) 提取码: 6xm2

导入原始数据

import numpy as np
from pandas import Series,DataFrame
import pandas as pd
#导入数据
file_name = '朝阳医院2018年销售数据.xlsx'
# 使用ExcelFile()时需要传入目标excel文件所在路径及文件名称
xls = pd.ExcelFile(file_name)
# 使用parse()可以根据传入的sheet名称来提取对应的表格信息
dataDF = xls.parse('Sheet1',dtype='object')
# 输出前五行数据
dataDF.head()
# 使用sheet_names来查看当前表格中包含的所有sheet名称(按顺序)
print(xls.sheet_names[0])

在这里插入图片描述

查看数据基本信息:

#查看基本信息
#查看数据几行几列
print(dataDF.shape)
#查看索引
print(dataDF.index)
#查看每一列的列表头内容
print(dataDF.columns)
#查看每一列数据统计数目
print(dataDF.count())

在这里插入图片描述

数据清洗


数据清洗过程包括:选择子集、列名重命名、缺失数据处理、数据类型转换、数据排序及异常值处理

(1)选择子集


在我们获取到的数据中,可能数据量非常庞大,并不是每一列都有价值都需要分析,这时候就需要从整个数据中选取合适的子集进行分析,这样能从数据中获取最大价值。在本次案例中不需要选取子集,暂时可以忽略这一步。

(2)列重命名

在数据分析过程中,有些列名和数据容易混淆或产生歧义,不利于数据分析,这时候需要把列名换成容易理解的名称,可以采用rename函数实现:

#列重命名
dataDF.rename(columns={'购药时间':'销售时间'},inplace=True)
dataDF.head()

在这里插入图片描述

(3)缺失值处理

获取的数据中很有可能存在缺失值,通过查看基本信息可以推测“购药时间”和“社保卡号”这两列存在缺失值,如果不处理这些缺失值会干扰后面的数据分析结果。

缺失数据常用的处理方式为删除含有缺失数据的记录或者利用算法去补全缺失数据。

在本次案例中为求方便,直接使用dropna函数删除缺失数据,具体如下:

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

# 使用info查看数据信息,
print(dataDF.info())
#删除缺失值
dataDF = dataDF.dropna(subset=['销售时间','社保卡号'], how='any')
print('\n删除缺失值后',dataDF.shape)
print(dataDF.info())

在这里插入图片描述

(4)数据类型转换

在导入数据时为了防止导入不进来,会强制所有数据都是object类型,但实际数据分析过程中“销售数量”,“应收金额”,“实收金额”,这些列需要浮点型(float)数据,“销售时间”需要改成时间格式,因此需要对数据类型进行转换。

可以使用astype()函数转为浮点型数据:

#数据类型转换
dataDF['销售数量'] = dataDF['销售数量'].astype('float')
dataDF['应收金额'] = dataDF['应收金额'].astype('float')
dataDF['实收金额'] = dataDF['实收金额'].astype('float')
print(dataDF.dtypes)

在这里插入图片描述
在“销售时间”这一列数据中存在星期这样的数据,但在数据分析过程中不需要用到,因此要把销售时间列中日期和星期使用split函数进行分割,分割后的时间,返回的是Series数据类型:

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

#获取“销售时间”这一列
timeSer = dataDF.loc[:,'销售时间']#对字符串进行分割,提取销售日期
dateSer = splitSaletime(timeSer)#修改销售时间这一列的值
dataDF.loc[:,'销售时间'] = dateSer
​dataDF.head()

在这里插入图片描述

'''
数据类型转换:字符串转换为日期
​
把切割后的日期转为时间格式,方便后面的数据统计:
'''
#errors='coerce' 如果原始数据不符合日期的格式,转换后的值为空值NaT
dataDF.loc[:,'销售时间']=pd.to_datetime(dataDF.loc[:,'销售时间'],format='%Y-%m-%d', errors='coerce')print(dataDF.dtypes)

在这里插入图片描述

dataDF.isnull().sum()

在这里插入图片描述

'''
转换日期过程中不符合日期格式的数值会被转换为空值
删除含有NaT的空行
'''
dataDF = dataDF.dropna(subset=['销售时间','社保卡号'],how='any')
datasDF = dataDF.reset_index(drop = True)
dataDF.info()

在这里插入图片描述

(5)数据排序

此时时间是没有按顺序排列的,所以还是需要排序一下,排序之后索引会被打乱,所以也需要重置一下索引。

其中by:表示按哪一列进行排序,ascending=True表示升序排列,ascending=False表示降序排列

#数据排序
dataDF = dataDF.sort_values(by='销售时间', ascending=True)
dataDF = dataDF.reset_index(drop=True)
dataDF.head()

在这里插入图片描述

(6)异常值处理

先查看数据的描述统计信息

#查看描述统计信息
dataDF.describe()

在这里插入图片描述
通过描述统计信息可以看到,“销售数量”、“应收金额”、“实收金额”这三列数据的最小值出现了负数,这明显不符合常理,数据中存在异常值的干扰,因此要对数据进一步处理,以排除异常值的影响:

#将'销售数量'这一列小于0的数据排除掉
pop = dataDF.loc[:,'销售数量'] > 0
dataDF = dataDF.loc[pop,:]
dataDF.describe()

在这里插入图片描述

构建模型及数据可视化

数据清洗完成后,需要利用数据构建模型(就是计算相应的业务指标),并用可视化的方式呈现结果。

(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)

在这里插入图片描述

(2)业务指标2:月均消费金额

月均消费金额 = 总消费金额 / 月份数

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

在这里插入图片描述

(3)客单价

客单价 = 总消费金额 / 总消费次数

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

在这里插入图片描述

(4)消费趋势

a. 导入python可视化相关的包

b. 分析每天的消费金额

import matplotlib.pyplot as plt
import matplotlib
#画图时用于显示中文字符
from pylab import mpl
​
mpl.rcParams['font.sans-serif'] = ['SimHei'] # SimHei是黑体的意思
#在操作之前先复制一份
#mpl.rcParams['font.sans-serif'] = ['Songti'] # SimHei是黑体的意思
#font = FontProperties(fname='/Library/Fonts/Songti.ttc') #设置字体
#在操作之前先复制一份数据,防止影响清洗后的数据
groupDF = dataDF
​
#将'销售时间'设置为index
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()

在这里插入图片描述
从结果可以看出,每天消费总额差异较大,除了个别天出现比较大笔的消费,大部分人消费情况维持在1000-2000元以内。

c. 分析每月的消费金额


接下来,我销售时间先聚合再按月分组进行分析:

#将销售时间聚合按月分组
gb = groupDF.groupby(groupDF.index.month)
print(gb)
monthDF = gb.sum()
print(monthDF)
​
plt.plot(monthDF['实收金额'])
plt.title('按月消费金额')
plt.xlabel('时间')
plt.ylabel('实收金额')
plt.show()

在这里插入图片描述
结果显示,7月消费金额最少,这是因为7月份的数据不完整,所以不具参考价值。

1月、4月、5月和6月的月消费金额差异不大.

2月和3月的消费金额迅速降低,这可能是2月和3月处于春节期间,大部分人都回家过年的原因。

d. 分析药品销售情况


对“商品名称”和“销售数量”这两列数据进行聚合为Series形式,方便后面统计,并按降序排序:

#聚合统计各种药品数量
medicine = groupDF[['商品名称','销售数量']]
bk = medicine.groupby('商品名称')[['销售数量']]
re_medicine = bk.sum()#对销售药品数量按将序排序
re_medicine = re_medicine.sort_values(by='销售数量', ascending=False)
re_medicine.head()

在这里插入图片描述
截取销售数量最多的前十种药品,并用条形图展示结果:

top_medicine = re_medicine.iloc[:10,:]
top_medicine

# 数据可视化,用条形图展示前十的药品
top_medicine.plot(kind = 'bar')
plt.title('销售前十的药品')
plt.xlabel('药品')
plt.ylabel('数量')
plt.show()

在这里插入图片描述
结论:对于销售量排在前几位的药品,医院应该时刻关注,保证药品不会短缺而影响患者。得到销售数量最多的前十种药品的信息,这些信息也会有助于加强医院对药房的管理。

e. 每天的消费金额分布情况

每天的消费金额分布情况:一横轴为时间,纵轴为实收金额画散点图。

# 每天消售金额 -- 散点图
plt.scatter(dataDF['销售时间'],dataDF['实收金额'])
plt.title('每天销售金额')
plt.xlabel('时间')
plt.ylabel('实收金额')
plt.show()

在这里插入图片描述
结论:从散点图可以看出,每天消费金额在500以下的占绝大多数,个别天存在消费金额很大的情况。

参考文章:https://www.jianshu.com/p/1becc1e5dbea

<p style="font-size:16px;"> <span style="font-size:18px;"><span style="background-color:#FFFFFF;">Python 数据分析+pyecharts 可视化 + Flask Web端服务 + 2大真实项目 手把手实战教程.</span></span> </p> <p style="font-size:16px;"> Python数据分析课程以Python为核心工具,结合其工具包pyecharts+开发IDEA pycharm + web 框架Flask。课程以案例为中心,结合案例讲解让同学们更清晰的掌握每一个知识点的应用与工作流程。 </p> <p style="font-size:16px;"> <strong>2大项目案例: 重点讲解 开发架构 + 部署上线流程,手把手实战教学。 </strong> </p> <p style="font-size:16px;"> 1. 开发架构 </p> <p style="font-size:16px;"> (1)基于PyCharm + Flask + Echarts + Python+Pandas 组合进行数据分析全栈开发 </p> <p style="font-size:16px;"> (2)PyCharm: 项目开发的IDEA; </p> <p style="font-size:16px;"> (3)Flask:作为WEB框架,主要连接后端服务数据。主要演示: 前后端分离架构 + 模板直接渲染架构; </p> <p style="font-size:16px;"> (4)Echarts: 这里使用pyecharts 作为可视化数据展示; </p> <p style="font-size:16px;"> (5)Python: 作为后端数据生成的语言; </p> <p style="font-size:16px;"> (6)Pandas: 主要作为数据分析库; </p> <p style="font-size:16px;"> 2 部署线上服务案例 </p> <p style="font-size:16px;"> (1)资讯类项目-基于Flask 模板渲染 词云; </p> <p style="font-size:16px;"> (2)人口统计项目-基于Flask 前后端分离 Line 和 Bar 组合 数据统计; </p> <p style="font-size:16px;"> <strong>课程特色</strong> </p> <p style="font-size:16px;"> 课程风格通俗易懂 </p> <p style="font-size:16px;"> 案例内容持续更新 </p> <p style="font-size:16px;"> 简单易懂,接地气的案例 </p> <p style="font-size:16px;"> 有效,提供所有数据和代码 </p> <p style="font-size:16px;"> <img src="https://img-bss.csdn.net/201908291440447128.png" alt="" /> </p> <p style="font-size:16px;"> <br /> </p> <p style="font-size:16px;"> <br /> </p> <p style="font-size:16px;"> <br /> </p> <p style="font-size:16px;"> <img src="https://img-bss.csdn.net/201908291440543352.png" alt="" /> </p> <p style="font-size:16px;"> <br /> </p> <p style="font-size:16px;"> <br /> </p> <p style="font-size:16px;"> <img src="https://img-bss.csdn.net/201908291441085943.png" alt="" /> </p> <p style="font-size:16px;"> <br /> </p> <p style="font-size:16px;"> <br /> </p> <p style="font-size:16px;"> <img src="https://img-bss.csdn.net/201908291441198368.png" alt="" /> </p>
相关推荐
<p> <span> </span> </p> <p class="ql-long-32569780" style="font-size:11pt;color:#494949;"> <span style="color:#E53333;">92讲视频课+16大项目实战+课件源</span><span style="color:#E53333;">码+讲师社群闭门分享会</span> </p> <p style="font-size:11pt;color:#494949;">   </p> <p class="ql-long-32569780" style="font-size:11pt;color:#494949;"> <strong class="ql-size-14 ql-author-32569780"><span style="color:#337FE5;font-size:14px;">为什么学习数据分析?</span></strong> </p> <p class="ql-long-32569780" style="font-size:11pt;color:#494949;"> <strong class="ql-size-14 ql-author-32569780"><span style="color:#337FE5;"><br /> </span></strong> </p> <p class="ql-long-32569780" style="font-size:11pt;color:#494949;">       人工智能、大数据时代有什么技能是可以运用在各种行业的?数据分析就是。 </p> <p class="ql-long-32569780" style="font-size:11pt;color:#494949;"> <br /> </p> <p class="ql-long-32569780" style="font-size:11pt;color:#494949;">       从海量数据中获得别人看不见的信息,创业者可以通过数据分析来优化产品,营销人员可以通过数据分析改进营销策略,产品经理可以通过数据分析洞察用户习惯,金融从业者可以通过数据分析规避投资风险,程序员可以通过数据分析进一步挖掘出数据价值,它和编程一样,本质上也是一个工具,通过数据来对现实事物进行分析和识别的能力。不管你从事什么行业,掌握了数据分析能力,往往在其岗位上更有竞争力。 </p> <p style="font-size:11pt;color:#494949;">  <span style="font-size:11pt;"> </span> </p> <p class="ql-long-32569780" style="font-size:11pt;color:#494949;"> <span style="color:#337FE5;"><strong>本课程共包含五大模块:</strong></span> </p> <p class="ql-long-32569780" style="font-size:11pt;color:#494949;"> <strong class="ql-size-14 ql-author-32569780"><span style="color:#337FE5;"><br /> </span></strong> </p> <p class="ql-long-32569780" style="font-size:11pt;color:#494949;"> <strong class="ql-size-12 ql-author-32569780">一、先导篇:</strong> </p> <p class="ql-long-32569780" style="font-size:11pt;color:#494949;"> <span class="ql-author-32569780">通过分析数据分析师的一天,让学员了解全面了解成为一个数据分析师的所有必修功法,对数据分析师不在迷惑。</span> </p> <p style="font-size:11pt;color:#494949;">   </p> <p class="ql-long-32569780" style="font-size:11pt;color:#494949;"> <strong class="ql-size-12 ql-author-32569780">二、基础篇:</strong> </p> <p class="ql-long-32569780" style="font-size:11pt;color:#494949;"> 围绕Python基础语法介绍、数据预处理、数据可视化以及数据分析与挖掘......这些核心技能模块展开,帮助你快速而全面的掌握和了解成为一个数据分析师的所有必修功法。 </p> <p style="font-size:11pt;color:#494949;">   </p> <p class="ql-long-32569780" style="font-size:11pt;color:#494949;"> <strong class="ql-size-12 ql-author-32569780">三、数据采集篇:</strong> </p> <p class="ql-long-32569780" style="font-size:11pt;color:#494949;"> <span class="ql-author-32569780">通过网络爬虫实战解决数据分析的必经之路:数据从何来的问题,讲解常见的爬虫套路并利用三大实战帮助学员扎实数据采集能力,避免没有数据可分析的尴尬。</span> </p> <p style="font-size:11pt;color:#494949;">   </p> <p class="ql-long-32569780" style="font-size:11pt;color:#494949;"> <strong class="ql-size-12 ql-author-32569780">四、分析工具篇:</strong> </p> <p class="ql-long-32569780" style="font-size:11pt;color:#494949;"> <span class="ql-author-32569780">讲解数据分析避不开的科学计算库Numpy、数据分析工具Pandas及常见可视化工具Matplotlib。</span> </p> <p style="font-size:11pt;color:#494949;">   </p> <p class="ql-long-32569780" style="font-size:11pt;color:#494949;"> <strong class="ql-size-12 ql-author-32569780">五、算法篇:</strong> </p> <p class="ql-long-32569780" style="font-size:11pt;color:#494949;"> <span class="ql-author-32569780">算法是数据分析的精华,课程精选10大算法,包括分类、聚类、预测3大类型,每个算法都从原理和案例两个角度学习,让你不仅能用起来,了解原理,还能知道为什么这么做。</span> </p> <p> <img alt="" src="https://img-bss.csdnimg.cn/202006110958102443.jpg" /> </p>
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页