Catalog:数据分析思维框架(5步)
1.提出问题 (定义问题,明确需求/计算公式)
2.理解数据1.采集数据(根据问题采集相关数据)
2.导入数据 excel/api接口/web链接
3.查看数据集信息(描述统计信息)从整体上理解数据
3.数据清洗( 6步数据预处理)1)选择子集(暂未用到)
2)列名重命名
3)缺失数据处理
4)数据类型转换***重点***
5)排序
6)异常值处理
4.构建模型,对清洗后的数据进行分析(kpi指标)1.简单分析--得到业务指标
2.复杂分析--机器学习算法训练模型(后文详述)
5.数据可视化(后文详述)
操作案例:
1.提出问题:已知医院药品销售数据,求月均消费次数#月均消费次数=总消费次数 / 月份数
月均消费金额#月均消费金额 = 总消费金额 / 月份数
客单价#客单价=总消费金额 / 总消费次数
消费趋势#可视化作图(后文详述)
2.理解数据
#导入数据分析包
import pandas as pd
#读取Excel数据,统一先按照字符串读入,之后转换
fileNameStr='A:/BaiduNetdiskDownload/第4关数据分析的基本过程(1)/朝阳医院2018年销售数据.xlsx'
xls = pd.ExcelFile(fileNameStr, dtype='object')#(赋值名,类型)
salesDf = xls.parse('Sheet1',dtype='object')
'''查看数据基本信息'''
#默认打印前5行,确保数据运行正常
salesDf.head()
#有多少行,多少列
salesDf.shape
#查看每一列的数据类型
salesDf.dtypes #这里的类型统一是对象
3.数据清洗(6个清洗方向)
1)选择子集
本案例不需要选择子集,如果需要选择前5列数据,使用如下代码
#subSalesDf=salesDf.loc[0:4,'购药时间':'销售数量']
2)列名重命名
#定义字典:旧列名和新列名对应
colNameDict = {'购药时间':'销售时间'}
#inplace=False,原数据框不变,创建新数据框,默认inplace是False
#inplace=True,改变原数据框
salesDf.rename(columns = colNameDict,inplace=True)
salesDf.head()#重新查看列名变化
3)缺失数据处理
print('删除缺失值前大小',salesDf.shape) #观察
#删除列(销售时间,社保卡号)中为空的行
#how='any' 在给定的任一列中有缺失值就删除
salesDf=salesDf.dropna(subset=['销售时间','社保卡号'],how='any')
print('删除缺失后大小',salesDf.shape) #观察
4)数据类型转换
#字符串转换为数值(浮点型) astype函数
salesDf['销售数量'] = salesDf['销售数量'].astype('float')
salesDf['应收金额'] = salesDf['应收金额'].astype('float')
salesDf['实收金额'] = salesDf['实收金额'].astype('float')
print('转换后的数据类型:\n',salesDf.dtypes)
'''运行后,会报警告SettingWithCopyWarning一般信息有两类,一类是Warning警告信息,一类是Error错误信息。警告信息不用管,只关注错误类型信息'''
字符串转换为日期数据类型(百度关键词:python 分割字符串 string)
5步
***第1步***定义函数:分割函数
#split函数(对单个字符串分割):遇到空格把数据分开,返回两个列对象,然后按序号提取列数据
#需要重新定义分割整列字符串的函数
'''分割销售日期,获取其中一部分输入:timeColSer 销售时间这一列,是Series数据类型输出:分割后的时间,返回也是Series数据类型'''
def splitSaletime(timeColSer):
timeList=[]
for value in timeColSer: #for 循环遍历 分割
#例如2018-01-01 星期五,分割后为:2018-01-01
dateStr=value.split(' ')[0]
timeList.append(dateStr)
#将列表转行为一维数据Series类型
timeSer=pd.Series(timeList) #重新赋值
return timeSer #返回值series类型 列表
***第2步***使用函数
#获取“销售时间”这一列
timeSer=salesDf.loc[:,'销售时间']
#对字符串进行分割,获取销售日期
dateSer=splitSaletime(timeSer) #使用函数处理 所选中的列
'''
注意:
如果运行后报错:AttributeError: 'float' object has no attribute 'split'
是因为Excel中的空的cell读入pandas中是空值(NaN),这个NaN是个浮点类型,一般当作空值处理。
所以要先去除NaN 再进行分隔字符串
'''
***第3步***重新赋值
#修改销售时间这一列的值
salesDf.loc[:,'销售时间']=dateSer #新数据列对原始数据列赋值
salesDf.head() #check
***第4步***数据类型转换:字符串转换为日期
#errors='coerce' 如果原始数据不符合日期的格式,转换后的值为空值NaT
#format 是你原始数据中日期的格式
salesDf.loc[:,'销售时间']=pd.to_datetime(salesDf.loc[:,'销售时间'],
format='%Y-%m-%d',
errors='coerce')
salesDf.dtypes #check
***第5步***删除空值
#转换日期时,不符合日期格式的数值被转换为空值,这里删除列(销售时间,社保卡号)中为空的行
#如果数据比较珍贵/或缺失值较多,不能直接删除,就需要把缺失数据分离、赋值,进行二次清洗
salesDf=salesDf.dropna(subset=['销售时间','社保卡号'],how='any')
salesDf.head() #check
5)排序
print('排序前的数据集')
salesDf.head() #check
'''
by='参照该列排序'
ascending=True 表示降序排列,
ascending=False表示升序排列
'''
#按销售日期升序排列
salesDf=salesDf.sort_values(by='销售时间',
ascending=True)
print('排序后的数据集')
salesDf.head(3)
6)异常值处理
#描述指标:查看出“销售数量”值不能小于0
salesDf.describe()
#删除异常值:通过条件判断筛选出数据
#查询条件
querySer=salesDf.loc[:,'销售数量']>0
#应用查询条件
print('删除异常值前:',salesDf.shape)
salesDf=salesDf.loc[querySer,:]
print('删除异常值后:',salesDf.shape)
4.构建模型(简单数据分析)业务指标1: 月均消费次数=总消费次数 / 月份数
业务指标2: 月均消费金额 = 总消费金额 / 月份数
业务指标3: 客单价=总消费金额 / 总消费次数
'''
当日去重
总消费次数:一天内同一人发生所有消费算作一次消费
根据列名(销售时间,社区卡号),如果这两列值相同,只保留1条,将重复的数据删除
'''
kpi1_Df=salesDf.drop_duplicates(
subset=['销售时间', '社保卡号']
)
#去重后,总消费次数:有多少行
totalI=kpi1_Df.shape[0]
print('总消费次数=',totalI)
总消费次数= 5342
# 3步 计算月份数:时间范围
#第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,'销售时间']
#最大时间值
endTime=kpi1_Df.loc[totalI-1,'销售时间']
#第3步:计算月份数
#天数
daysI=(endTime-startTime).days
#月份数: 运算符“//”表示取整除
#返回商的整数部分,例如9//2 输出结果是4
monthsI=daysI//30
print('月份数:',monthsI)
月份数: 6
#业务指标1:月均消费次数=总消费次数 / 月份数
kpi1_I=totalI // monthsI
print('业务指标1:月均消费次数=',kpi1_I)
业务指标1:月均消费次数= 890
#业务指标2: 月均消费金额 = 总消费金额 / 月份数
#总消费金额
totalMoneyF=salesDf.loc[:,'实收金额'].sum()
#月均消费金额
monthMoneyF=totalMoneyF / monthsI
print('业务指标2:月均消费金额=',monthMoneyF)
业务指标2:月均消费金额= 50771.710000000145
#业务指标3:客单价=总消费金额 / 总消费次数
#客单价(per customer transaction):商场每个顾客平均购买商品金额。注意,客单价是平均交易金额。
#totalMoneyF:总消费金额(不用去重)
#totalI:总消费次数(要当日去重)
pct=totalMoneyF / totalI
print('业务指标3:客单价=',pct)
业务指标3:客单价= 56.909417821
Sum up:
1.数据清洗占用60%时间,[数据类型转换]是重点,需要多次操作;
2.对于[时间类型转换]理解不够透彻,需要反复研究;
3.选择子集,复杂数据分析,数据可视化 后文继续学习;
4.文章的功能:便于回顾,结构要精简清晰。