一、数据分析的目的

数据分析是指用适当的统计分析方法对收集来的大量数据进行分析,提取有用信息和形成结论而对数据加以详细研究和概括总结的过程。

本篇文章中,假设以朝阳医院2018年销售数据为例,目的是了解朝阳医院在2018年里的销售情况,这就需要知道几个业务指标,例如:月均消费次数,月均消费金额、客单价以及消费趋势

二、数据分析基本过程

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

python先导入包,然后读取文件,读取的时候用object读取,防止有些数据读不了:

import numpy as np

from pandas import Series,DataFrame

import pandas as pd

#导入数据

file_name = '朝阳医院2018年销售数据.xlsx'

xls = pd.ExcelFile(file_name)

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

print(dataDF.head())

image.png

查看数据基本信息:

#查看基本信息

#查看数据几行几列

print(dataDF.shape)

#查看索引

print(dataDF.index)

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

print(dataDF.columns)

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

print(dataDF.count())

image.png

总共有6578行7列数据,但是“购药时间”和“社保卡号”这两列只有6576个数据,而“商品编码”一直到“实收金额”这些列都是只有6577个数据,这就意味着数据中存在缺失值,可以推断出数据中存在一行缺失值,此外“购药时间”和“社保卡号”这两列都各自存在一个缺失数据,这些缺失数据在后面步骤中需要进一步处理。

2.数据清洗

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

(1)选择子集

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

(2)列重命名

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

#列重命名

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

print(dataDF.head())

image.png

(3)缺失值处理

获取的数据中很有可能存在缺失值,通过查看基本信息可以推测“购药时间”和“社保卡号”这两列存在缺失值,如果不处理这些缺失值会干扰后面的数据分析结果。缺失数据常用的处理方式为删除含有缺失数据的记录或者利用算法去补全缺失数据。在本次案例中为求方便,直接使用dropna函数删除缺失数据,具体如下:

#缺失值处理

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

print(dataDF.info())

#删除缺失值

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

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

print(dataDF.info())

image.png

(4)数据类型转换

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

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

#数据类型转换

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

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

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

print(dataDF.dtypes)

image.png

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

#定义函数将星期除去

def splitSaletime(timeColser):

timelist =[]

for val in timeColser:

data = val.split(' ')[0]

timelist.append(data)

#将列表转为Series类型

timeSer = Series(timelist)

return timeSer

#获取"销售时间"这一列数据

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

#调用函数去除星期,获得日期

data = splitSaletime(time)

#修改"销售时间"这一列的值

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

print(dataDF.head())

image.png

接着把切割后的日期转为时间格式,方便后面的数据统计:

#字符串转日期

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

print(dataDF.dtypes)

#在日期转换过程中不符合日期格式的会转换为空值,这里需要删除

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

image.png

(5)数据排序

此时时间是没有按顺序排列的,所以还是需要排序一下,排序之后索引会被打乱,所以也需要重置一下索引。其中by:表示按哪一列进行排序,ascending=True表示升序排列,ascending=False表示降序排列

#数据排序

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

dataDF = dataDF.reset_index(drop=True)

print(dataDF.head())

image.png

(6)异常值处理

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

#查看描述统计信息

print(dataDF.describe())

image.png

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

#将'销售数量'这一列小于0的数据排除掉

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

dataDF = dataDF.loc[pop,:]

print(dataDF.describe())

image.png

三、构建模型及数据可视化

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

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

image.png

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

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

#消费总金额

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

mounthMoney = totalMoneyF // mounthI

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

image.png

(3)客单价

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

#客单价

pct = totalMoneyF / totalI

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

image.png

(4)消费趋势

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

import matplotlib.pyplot as plt

import matplotlib

#画图时用于显示中文字符

from pylab import mpl

mpl.rcParams['font.sans-serif'] = ['SimHei'] # SimHei是黑体的意思

#在操作之前先复制一份

b. 分析每天的消费金额

#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('按天消费金额',fontproperties=font)

plt.xlabel('时间',fontproperties=font)

plt.ylabel('实收金额',fontproperties=font)

plt.show()

image.png

image.png

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

c. 分析每月的消费金额

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

#将销售时间聚合按月分组

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

print(gb)

monthDF = gb.sum()

print(monthDF)

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

plt.title('按月消费金额',fontproperties=font)

plt.xlabel('时间',fontproperties=font)

plt.ylabel('实收金额',fontproperties=font)

plt.show()

image.png

image.png

结果显示,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)

print(re_medicine.head())

image.png

截取销售数量最多的前十种药品,并用条形图展示结果:

top_medicine = re_medicine.iloc[:10,:]

print(top_medicine)

image.png

image.png

得到销售数量最多的前十种药品信息,这些信息将会有助于加强医院对药房的管理。

重点客户销售数据分析python_药品销售数据分析--python相关推荐

  1. python销售数据分析方法_Python数据分析之药品销售案例分析(上)

    一.一维数组 1.1 一维数据可以由numpy中的Array函数或者Pandas包中的Series函数创建,series函数是建立在array函数基础上,功能更加强大一些. 1.2Array 函数 利 ...

  2. python医药数据分析_药品销售数据分析--python

    一.数据分析的目的 数据分析是指用适当的统计分析方法对收集来的大量数据进行分析,提取有用信息和形成结论而对数据加以详细研究和概括总结的过程. 本篇文章中,假设以朝阳医院2018年销售数据为例,目的是了 ...

  3. 重点客户销售数据分析python_项目实战 | 使用python分析销售数据

    数据分析的步骤为(5步): 提出问题->理解数据->数据清洗->构建模型->数据可视化 一.提出问题 1.问题概览 从销售数据中分析以下业务指标: 1)月均消费次数 2)月均消 ...

  4. 客户流失预测模型python_教你用Python快速上手构建客户流失模型分析

    为什么做客户流失模型分析? 1.企业再发展新用户成本很高 2.客户的流失会给企业造成很大的损失,一个老客户的价值相当于三个新客户的价值 3.客户的流失不仅给企业带来经济上的损失,同时也给企业的名誉和口 ...

  5. 基于C++实现的药品销售管理系统

    点击获取源码资源 一.课程设计的原始资料及依据 查阅有关资料,进一步理解面向对象程序设计的思想,并利用MFC框架编写一个简单的windows系统.通过本设计可以加深理解使用面向对象程序设计思想开发一个 ...

  6. 北京市朝阳医院药品销售数据分析

    目录 第1章绪论 1.1研究背景 1.2 研究目的与意义 1.3研究内容 2.1数据采集 2.1.1源数据下载 2.2.2源数据存储 2.2数据预处理 2.2.1数据预处理工具介绍及操作 2.2.2读 ...

  7. 月均数据_药品销售数据分析案例

    今天用python去做一个简单的药品销售数据分析案例 一.数据分析的目的 数据分析是指用适当的统计分析方法对收集来的大量数据进行分析,提取有用信息和形成结论而对数据加以详细研究和概括总结的过程. 本篇 ...

  8. 根据医院药品销售数据分析本年度销售情况

    一.数据分析的目的 本篇文章中以某医院2018年药品销售数据为例,目的是了解该医院在2018年里的销售情况,这就需要知道几个业务指标,例如:月均消费次数,月均消费金额.客单价以及消费趋势. 二.数据分 ...

  9. 十张图,看数据分析如何赋能销售

    "数据助力业务"大号口喊了很多年,可一提到数据分析,人们习惯性的依然讲的是:excel,python,sql,依然是数据清洗.数据计算.可视化.到底业务部门需要啥样的数据分析,很少 ...

最新文章

  1. 你真的会vue-router吗?
  2. 您不是专业测试人员的10个理由!
  3. 分治法的关键特征_你真的读懂《OKR工作法》了吗?
  4. python基础题-Python基础30道测试题(字符串相关)
  5. Java仿百度网盘,拿来学习/搞外快,都是极好的选择
  6. OAuth 2.1 带来了哪些变化
  7. html5 crosshair,嘿,纯正ROG血统 CROSSHAIR VIII IMPACT (开箱篇)最终版
  8. Android 11首个预览版发布:打开飞行模式蓝牙耳机不断连
  9. 统计自然语言处理基础_聚类
  10. 鸿蒙系统首发仪式,鸿蒙系统首发终端荣耀智慧屏正式亮相
  11. 说说 PWA 和微信小程序--Progressive Web App
  12. win10怎么更新显卡驱动_win10系统AMD显卡驱动安装失败的解决方法
  13. 计算机常见的运算符,常见运算符
  14. 56.com flash http://www.56.com/deux4_97177389.swf
  15. WPS表格 下拉列表 两级下拉列表联动 多级下拉列表联动
  16. 程序员的鄙视链-------哈哈哈,真逗
  17. java复习思维导图
  18. k2698场效应管参数电流_常用场效应管参数大全,电压,参数表图文等,涨知识必读!...
  19. Ngnix 之父突然离职,程序员巅峰一代落幕
  20. php7.4.15加zip扩展

热门文章

  1. 微软技术专家为您解读深度学习
  2. ASP.NET Core远程调试
  3. 开源库 Natasha2016 ,让IL编程跑起来
  4. TypeScript 2.1发布
  5. 编程语言的发展趋势及未来方向(1):历史回顾及趋势概述
  6. WEB API系列(一):WEB API的适用场景、第一个实例
  7. Session的原理,大型网站中Session方面应注意什么?
  8. java产生的数字发送到页面_JAVA中数字证书的维护及生成方法
  9. 【Microstation】第二章:Microstation三维建模基础知识
  10. ArcGIS 10.6连接Access 2007(.accdb)及以上版本数据库