一、数据分析的步骤

二、提出问题

分析药店商品销售情况

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.研究热销商品的属性,可以考虑重点营销,对滞销商品进行下架退货处理

药店商品销量分析(python)的更多相关文章

  1. 用Python爬取分析【某东618】畅销商品销量数据,带你看看大家都喜欢买什么!

    618购物节,辰哥准备分析一波购物节大家都喜欢买什么?本文以某东为例,Python爬取618活动的畅销商品数据,并进行数据清洗,最后以可视化的方式从不同角度去了解畅销商品中,名列前茅的商品是哪些?销售 ...

  2. Python 爬取淘宝商品数据挖掘分析实战

    Python 爬取淘宝商品数据挖掘分析实战 项目内容 本案例选择>> 商品类目:沙发: 数量:共100页  4400个商品: 筛选条件:天猫.销量从高到低.价格500元以上. 爬取淘宝商品 ...

  3. Kaggle 商品销量预测季军方案出炉,应对时间序列问题有何妙招

    https://www.leiphone.com/news/201803/fPnpTdrkvUHf7uAj.html 雷锋网 AI 研习社消息,Kaggle 上 Corporación Favorit ...

  4. 电商打折套路分析 —— Python数据分析练习

    电商打折套路分析 ——2016天猫双十一美妆数据分析 数据简介 此次分析的数据来自于城市数据团对2016年双11天猫数据的采集和整理,原始数据为.xlsx格式 包括update_time/id/tit ...

  5. B2C电子商务系统研发——商品SKU分析和设计(二)

    转:http://www.cnblogs.com/winstonyan/archive/2012/01/07/2315886.html 上文谈到5种商品SKU设计模式,本文将做些细化说明. 笔者研究过 ...

  6. 让ecshop显示商品销量或者月销量

    首先,ecshop的信息显示模块在. ./includes/lib_goods.php文件 在其末尾添加下面这个函数 月销量:(和总销量二选一) function ec_buysum($goods_i ...

  7. ecshop获取商品销量函数

    以下函数会获取订单状态为已完成的订单中该商品的销量,此函数放在lib_goods.php文件中即可调用 /** * 获取商品销量 * * @access      public * @param    ...

  8. arp协议分析&python编程实现arp欺骗抓图片

    arp协议分析&python编程实现arp欺骗抓图片 序 学校tcp/ip协议分析课程老师布置的任务,要求分析一种网络协议并且研究安全问题并编程实现,于是我选择了研究arp协议,并且利用pyt ...

  9. [深度分析] Python Web 开发框架 Bottle

    [深度分析] Python Web 开发框架 Bottle(这个真的他妈的经典!!!) 作者:lhf2009913 Bottle 是一个非常精致的WSGI框架,它提供了 Python Web开发中需要 ...

随机推荐

  1. 使用vmware workstation安装centos 7操作系统

    安装步骤 1.点击创建虚拟机,进入新建虚拟机向导,选择自定义,典型:相当于去电脑 旗舰店里店员推荐的是一样,推荐的比一定好,自定义:是手动操作的,没有linux基础最好选择自定义.点击下一步. 2.虚 ...

  2. 分治 FFT

    为啥要叫分治\(fft\)啊,又用不到\(fft--\) 给定长度为\(n-1\)的数组\(g[1],g[2],--,g[n-1]\),求\(f[1],f[2],--,f[n]\),其中 \[f[i] ...

  3. 新手入门:python的pip安装(二)

    pip的安装以及使用pip安装包 —–安装python的时候勾选了下载pip,不知道为什么没下载.然后就偷懒想着需要哪个包再单独去下载就好了,然后!!!每个包都会出点小问题,导致我这个初学者有三天不想 ...

  4. 1+x 证书 Web 前端开发中级理论考试(试卷 6 )

    1+x 证书 Web 前端开发中级理论考试(试卷 6 ) 官方QQ群 1+x 证书 web 前端开发初级对应课程分析 http://blog.zh66.club/index.php/archives/ ...

  5. jieba 分词使用入门

    1. 介绍 JIEBA 是目前最好的 Python 中文分词组件,它主要有以下 3 种特性: 支持 3 种分词模式:精确模式.全模式.搜索引擎模式 支持繁体分词 支持自定义词典 import jieb ...

  6. c#中list集合使用Max()方法查找到最大值

    在C#的List集合操作中,有时候需要查找到List集合中的最大值,此时可以使用List集合的扩展方法Max方法,Max方法有2种形式,一种是不带任何参数的形式,适用于一些值类型变量的List集合,另 ...

  7. git clone和git pull的区别

    1.需不需要本地文件夹是仓库 git clone是将整个工程复制下来所以,不需要本地是仓库(没有.git文件夹)   git clone git pull需要先初始化本地文件夹文一个仓库   git ...

  8. crm-2

    1.分页 web必备的功能 1)批量制造测试数据 定义一个空列表用于存储 orm对象 ,models.表名(字段=...)创建orm对象append到列表 ,使用bulk_create(对象列表)一次 ...

  9. Typescript基础(4)——接口

    前言 今天继续typescript的学习,开始ts接口部分的学习. 接口 接口的理解 首先,我们谈论一下现实生活中的接口.比如生活中常用的插座接口,有些插头是三孔插座的,有些是两孔插座的.插座接口规定 ...

  10. 为Dynamics CRM的Office附件注释定制个无需下载即可在线查看的功能

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复164或者20151021可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 上一篇博客:为Dynamics ...