2022年 11月 5日

python数据分析5个案例-Python数据分析-案例分析

两个学习道具:

1)这个网页可以调用全球最大的搜索引擎(长按此处可以复制):

QVN77z.jpg

288739

事先准备:

在notebook中想要导入Excel文件,要先安装一个读取Excel文件的包:xlrd

安装步骤:

1>现在conda中进入当前文件所在的Python环境,例如

activate py3

2>然后使用命令安装

conda install xlrd

1.提出问题:

umE3mu.jpg

288739

2.理解数据:

RrUJre.jpg

RrUJre.jpg

2.1读取文件:

#读取Ecxcel数据,统一先按照字符串读入,之后转换

fileNameStr=’./朝阳医院2018年销售数据.xlsx’

xls = pd.ExcelFile(fileNameStr, dtype=’object’)

salesDf = xls.parse(‘Sheet1′,dtype=’object’)

#打印出前5行,以确保数据运行正常

salesDf.head()

aAjYJz.jpg

aAjYJz.jpg

#有多少行,多少列

salesDf.shape

#查看每一列的数据类型

salesDf.dtypes

3.数据清洗

7rYnAj.jpg

288739 数据清洗的步骤

3.1选择子集(loc)

选出我们需要的列;

ymQnui.jpg

ymQnui.jpg

3.2列重命名(rename())

nQNNJj.jpg

nQNNJj.jpg

# 先定义一个新旧列名的对应关系

colNameDict = {‘购药时间’:’销售时间’}

# 然后使用rename功能修改列名

salesDf.rename(columns = colNameDict,inplace=True)

3.3缺失值处理(dropna)

3.缺失数据处理

python缺失值有3种:

1)Python内置的None值

2)在pandas中,将缺失值表示为NA,表示不可用not available。

3)对于数值数据,pandas使用浮点值NaN(Not a Number)表示缺失数据。

后面出来数据,如果遇到错误:说什么foloat错误,那就是有缺失值,需要处理掉

所以,缺失值有3种:None,NA,NaN

Y7nqMj.jpg

Y7nqMj.jpg 直接删除缺失值

3.4基本数据类型的转化(astype)

yeq2Ej.jpg

yeq2Ej.jpg

#字符串转换为数值(浮点型)

salesDf[‘销售数量’] = salesDf[‘销售数量’].astype(‘float’)

salesDf[‘应收金额’] = salesDf[‘应收金额’].astype(‘float’)

salesDf[‘实收金额’] = salesDf[‘实收金额’].astype(‘float’)

print(‘转换后的数据类型: ‘,salesDf.dtypes)

”’运行后,会报警告SettingWithCopyWarning一般信息有两列,一类是Warning警告信息,一类是Error错误信息。警告的信息不用管,我们只关注错误类型的信息”’

3.4.1 字符串分割(split())

YzQvqu.jpg

YzQvqu.jpg

3.4.2分割一列数据

先定义一个函数

”’定义函数:分割销售日期,获取销售日期输入:timeColSer 销售时间这一列,是个Series数据类型输出:分割后的时间,返回也是个Series数据类型”’

def splitSaletime(timeColSer):

timeList=[]

for value in timeColSer:

#例如2018-01-01 星期五,分割后为:2018-01-01

dateStr=value.split(‘ ‘)[0]

timeList.append(dateStr)

#将列表转行为一维数据Series类型

timeSer=pd.Series(timeList)

return timeSer

#获取”销售时间”这一列

timeSer=salesDf.loc[:,’销售时间’]

#对字符串进行分割,获取销售日期

dateSer=splitSaletime(timeSer)

#查看拆分的情况

dateSer[0:3]

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

salesDf.loc[:,’销售时间’]=dateSer

#查看结果

salesDf.head()

3.4.3字符串转换成日期格式(to_datetime())

2M3Mva.jpg

2M3Mva.jpg

”’数据类型转换:字符串转换为日期”’

#errors=’coerce’ 如果原始数据不符合日期的格式,转换后的值为空值NaT

#format 是你原始数据中日期的格式

salesDf.loc[:,’销售时间’]=pd.to_datetime(salesDf.loc[:,’销售时间’],

format=’%Y-%m-%d’,

errors=’coerce’)

”’转换日期过程中不符合日期格式的数值会被转换为空值,这里删除列(销售时间,社保卡号)中为空的行”’

salesDf=salesDf.dropna(subset=[‘销售时间’,’社保卡号’],how=’any’)

3.5排序(sortvalues,reset_index)

bANB3q.jpg

bANB3q.jpg

UvIVJf.jpg

UvIVJf.jpg 排序后,使用index对索引重命名

”’

by:按哪几列排序

ascending=True 表示升序排列,

ascending=True表示降序排列

na_position=True表示排序的时候,把空值放到前列,这样可以比较清晰的看到哪些地方有空值

官网文档: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)

IFjQVj.jpg

IFjQVj.jpg

#重命名行名(index):排序后的列索引值是之前的行号,需要修改成从0到N按顺序的索引值

salesDf=salesDf.reset_index(drop=True)

salesDf.head()

ZzEFN3.jpg

ZzEFN3.jpg

3.6异常值处理

先使用describe()方法看看描述统计分析

nM3Qre.jpg

nM3Qre.jpg

#描述指标:查看出”销售数量”值不能小于0

salesDf.describe()

#删除异常值:通过条件判断筛选出数据

#查询条件

querySer = salesDf.loc[:,’销售数量’] > 0

#应用查询条件

print(‘删除异常值之前:’,salesDf.shape)

salesDf = salesDf.loc[querySer,:]

print(‘删除异常值之后:’,salesDf.shape)

OUT :

删除异常值之前: (6549, 7)

删除异常值之后: (6506, 7)

4.构建模型

IRjqYv.jpg

288739 回到最初的四个问题

4.1月均消费次数

为了减少干扰,同一天内同一顾客多次消费,只取一次;

所以需要使用去重的方法(drop_duplicates())

”’

总消费次数:同一天内,同一个人发生的所有消费算作一次消费

#根据列名(销售时间,社区卡号),如果这两个列值同时相同,只保留1条,将重复的数据删除

”’

kpi1_Df=salesDf.drop_duplicates(

subset=[‘销售时间’, ‘社保卡号’]

)

#总消费次数:有多少行

totalI=kpi1_Df.shape[0]

print(‘总消费次数=’,totalI)

FnMvEr.jpg

288739

”’

计算月份数:时间范围

”’

#第1步:按销售时间升序排序

kpil_Df = kpil_Df.sort_values(by = ‘销售时间’,ascending = True)

#重命名行名(index)

kpil_Df = kpil_Df.reset_index(drop = True)

2uqueq.jpg

2uqueq.jpg

#第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)

RbMNna.jpg

288739

#业务指标1:月均消费次数=总消费次数 / 月份数

kpi1_I=totalI // monthsI

print(‘业务指标1:月均消费次数=’,kpi1_I)

muy6Bb.jpg

288739

4.2月均消费金额

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

#总消费金额

totalMoneyF=salesDf.loc[:,’实收金额’].sum()

#月均消费金额

monthMoneyF=totalMoneyF / monthsI

print(‘业务指标2:月均消费金额=’,monthMoneyF)

BRzUrm.jpg

288739

4.3客单价

客单价(per customer transaction)是指商场(超市)每一个顾客平均购买商品的金额,客单价也即是平均交易金额。

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

”’

totalMoneyF:总消费金额

totalI:总消费次数

”’

pct=totalMoneyF / totalI

print(‘客单价:’,pct)

uEzUvy.jpg

288739

4.4消费趋势(可视化)

未完待续…….