一、数据分析的目的
数据分析是指用适当的统计分析方法对收集来的大量数据进行分析,提取有用信息和形成结论而对数据加以详细研究和概括总结的过程。
本篇文章中,假设以朝阳医院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个数据,这就意味着数据中存在缺失值药品销售数据分析,可以推断出数据中存在一行缺失值,此外“购药时间”和“社保卡号”这两列都各自存在一个缺失数据,这些缺失数据在后面步骤中需要进一步处理。
(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:月均消费次数
月均消费次数 = 总消费次数 / 月份数(同一天内,同一个人所有消费算作一次消费)
#查看基本信息
#查看数据几行几列
print(dataDF.shape)
#查看索引
print(dataDF.index)
#查看每一列的列表头内容
print(dataDF.columns)
#查看每一列数据统计数目
print(dataDF.count())
0
image.png
(2)业务指标2:月均消费金额
月均消费金额 = 总消费金额 / 月份数
#查看基本信息
#查看数据几行几列
print(dataDF.shape)
#查看索引
print(dataDF.index)
#查看每一列的列表头内容
print(dataDF.columns)
#查看每一列数据统计数目
print(dataDF.count())
1
image.png
(3)客单价
客单价 = 总消费金额 / 总消费次数
#查看基本信息
#查看数据几行几列
print(dataDF.shape)
#查看索引
print(dataDF.index)
#查看每一列的列表头内容
print(dataDF.columns)
#查看每一列数据统计数目
print(dataDF.count())
2
image.png
(4)消费趋势
#查看基本信息
#查看数据几行几列
print(dataDF.shape)
来源【首席数据官】,更多内容/合作请关注「辉声辉语」公众号,送10G营销资料!
版权声明:本文内容来源互联网整理,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 jkhui22@126.com举报,一经查实,本站将立刻删除。