Python财经应用-编程基础、数据分析与可视化课件 第9章-综合应用:基于消费数据集的可视化分析_第1页
Python财经应用-编程基础、数据分析与可视化课件 第9章-综合应用:基于消费数据集的可视化分析_第2页
Python财经应用-编程基础、数据分析与可视化课件 第9章-综合应用:基于消费数据集的可视化分析_第3页
Python财经应用-编程基础、数据分析与可视化课件 第9章-综合应用:基于消费数据集的可视化分析_第4页
Python财经应用-编程基础、数据分析与可视化课件 第9章-综合应用:基于消费数据集的可视化分析_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Python财经应用:编程基础、数据分析与可视化第九章综合应用

中国农业大学李辉综合应用--基于消费数据集的可视化分析小费数据集:是一个用于统计分析和数据挖掘的数据集,这个数据集可能包括以下变量:total_bill为消费总金额、tip为小费金额、sex为顾客性别、smoker为顾客是否在吸烟区用餐、day为消费的日期(星期几)、time为用餐的时间段(早、中、晚)、size为与顾客一同就餐的人数。小费数据集可以用于分析影响小费金额的因素。本章分析中,围绕小费数据集提出几个问题:小费金额与消费总金额是否存在相关性?性别、是否吸烟、星期几、中/晚餐、聚餐人数和小费金额是否有一定的关联?小费金额占消费总金额的百分比服从正态分布?综合应用--基于消费数据集的可视化分析数据分析的流程通常情况下分为5步:1)导入数据。在这一步中,需要对收集的数据有一定的认知,对各字段的含义和背景知识都要有着足够的理解。2)定义问题。根据各自的行业和业务知识,对数据定义多个待解决的问题。3)数据清洗与整理。由于各种问题,获取的数据不够“干净”,需通过各种手段对数据进行清洗与整理,以便得到准确的分析结果。4)数据探索。通过可视化等手段,对数据进行分析和探索,得出结论。5)数据展示。这部分用于输出,或撰写数据分析报告,或汇报给上级,或绘制PPT。小费数据描述性统计分析1.导入模块通过结果可以看出,总共有244条,7列数据,通过统计暂时看不出是否有缺失值。

importpandasaspdimportmatplotlib.pyplotasplt#导入小费数据集tip_df=pd.read_excel('./data/raw_tips.xls')2.查看数据集维度信息

print('数据集的维度:',tip_df.shape)运行结果:

数据集的维度:(244,7)小费数据描述性统计分析3.显示数据集前5行

print('查看数据集前5行数据:')print(tip_df.head())运行结果:

查看数据集前5行数据: total_billtipsexsmokerdaytimesize016.991.01FemaleNoSunDinner2.01NaN1.66MaleNoSunDinner3.0221.01NaNMaleNoSunDinner3.03NaN3.31MaleNoSunDinner2.0424.593.61FemaleNoSunDiner4.0小费数据描述性统计分析4.查看数据的行列属性信息

print('查看数据的行列属性:')print(tip_())小费数据描述性统计分析运行结果:

查看数据的行列属性:<class'pandas.core.frame.DataFrame'>RangeIndex:244entries,0to243Datacolumns(total7columns):#ColumnNon-NullCountDtype----------------------------0total_bill235non-nullfloat641tip239non-nullfloat642sex237non-nullobject3smoker239non-nullobject4day243non-nullobject5time237non-nullobject6size240non-nullfloat64dtypes:float64(3),object(4)memoryusage:13.5+KB小费数据描述性统计分析5.查看数据的描述和统计信息

print('数据集的描述和统计信息:')print(tip_df.describe())小费数据描述性统计分析运行结果:

数据集的描述和统计信息:total_billtipsizecount235.000000239.000000240.00000mean19.9333192.9912552.57500std8.9629801.3893950.95648min3.0700001.0000001.0000025%13.4200002.0000002.0000050%17.8200002.8300002.0000075%24.3950003.5300003.00000max50.81000010.0000006.00000数据清洗与预处理——数据异常值与缺失值的处理1.检查并修订time列字段值(1)检查time列的字段值上述运行结果中的“nan”为空值。

print(tip_df['time'].unique())运行结果:

['Dinner''Diner''Dier'nan'Lunch']数据清洗与预处理——数据异常值与缺失值的处理(2)修改time列的字段值并输出

tip_df.loc[tip_df['time']=='Diner','time']='Dinner'tip_df.loc[tip_df['time']=='Dier','time']='Dinner'print(tip_df['time'].unique())运行结果:

['Dinner'nan'Lunch']数据清洗与预处理——数据异常值与缺失值的处理2.查看数据集中各列的缺失值数量(1)利用shape属性查看数据中缺失值数量

miss_df=tip_df.shape[0]-tip_df.count(axis=0)print(miss_df)运行结果:

total_bill9tip5sex7smoker5day1time7size4dtype:int64数据清洗与预处理——数据异常值与缺失值的处理2.查看数据集中各列的缺失值数量(2)利用isna()方法检测数据中的缺失值

df_nan_num=tip_df.isna().sum()print(df_nan_num)运行结果:

total_bill9tip5sex7smoker5day1time7size4dtype:int64数据清洗与预处理——数据异常值与缺失值的处理3.删除数据集中缺失值(1)删除一行有两个缺失值的数据

nan_index_list=[]fori,rowintip_df.iterrows():ifrow.isnull().sum()==2:nan_index_list.append(i)print('出现两个缺失值行索引:',nan_index_list)#tip_df.drop(index=nan_index_list)tip_df.drop(index=nan_index_list,inplace=True)#替换原来的数据print('删除出现两个缺失值行索引后的缺失值信息:\n',tip_df.isnull().sum())数据清洗与预处理——数据异常值与缺失值的处理运行结果:

出现两个缺失值行索引:[12,21,40,53,67,77,198]删除出现两个缺失值行索引后的缺失值信息:total_bill5tip4sex2smoker3day1time6size3dtype:int64数据清洗与预处理——数据异常值与缺失值的处理3.删除数据集中缺失值(2)删除sex或time列为空的行对于空行的删除,也可以借助dropna()方法中how='any'参数实现缺失值的删除操作

total_bill4tip4sex0smoker3day1time0size2dtype:int64数据清洗与预处理——数据异常值与缺失值的处理4.缺失值处理(1)对剩余有空缺的数值型数据用平均值替换(方式一)

tip_df['total_bill']=tip_df['total_bill'].fillna(tip_df['total_bill'].mean())tip_df['tip']=tip_df['tip'].fillna(tip_df['tip'].mean())tip_df['size']=tip_df['size'].fillna(tip_df['size'].mean())(2)对剩余有空缺的数值型数据用平均值替换(方式二)

tip_df.fillna(tip_df.mean(numeric_only=True),inplace=True)print('填充数值型缺失值后,统计缺失值信息:\n',tip_df.isnull().sum())数据清洗与预处理——数据异常值与缺失值的处理运行结果:

填充数值型缺失值后,统计缺失值信息:total_bill0tip0sex0smoker3day1time0size0dtype:int64数据清洗与预处理——数据异常值与缺失值的处理3.删除数据集中缺失值(3)利用ffill()或者bfill()方法填充缺失值

tip_df.ffill(inplace=True)print('填充缺失值后,统计缺失值信息:\n',tip_df.isnull().sum())数据清洗与预处理——数据异常值与缺失值的处理运行结果:

填充缺失值后,统计缺失值信息:total_bill0tip0sex0smoker0day0time0size0dtype:int64数据清洗与预处理——数据预处理1.修改数据集字段名(1)利用rename()修改数据集字段名

tip_df.rename(columns=({'total_bill':'消费总额','tip':'小费','sex':'性别','smoker':'是否吸烟','day':'星期','time':'聚餐时间段','size':'人数'}),inplace=True)print(tip_df.head())运行结果:

消费总额

小费

性别

是否吸烟

星期

聚餐时间段

人数016.9900001.0100FemaleNoSunDinner2.0120.2161331.6600MaleNoSunDinner3.0221.0100003.0268MaleNoSunDinner3.0320.2161333.3100MaleNoSunDinner2.0424.5900003.6100FemaleNoSunDinner4.0数据清洗与预处理——数据预处理1.修改数据集字段名(2)直接修改列名

tip_df.columns=['total_bill','tip','sex','smoker','day','time','size']print(tip_df.head())运行结果:

total_billtipsexsmokerdaytimesize016.9900001.0100FemaleNoSunDinner2.0120.2161331.6600MaleNoSunDinner3.0221.0100003.0268MaleNoSunDinner3.0320.2161333.3100MaleNoSunDinner2.0424.5900003.6100FemaleNoSunDinner4.0数据清洗与预处理——数据预处理2.预处理数据集中的数据将time列中的'Dinner'值变为'晚餐','Lunch'变为'午餐'。

tip_df.loc[tip_df['time']=='Dinner','time']='晚餐'tip_df.loc[tip_df['time']=='time']='午餐'print(tip_df['time'].unique())运行结果:

['晚餐''午餐']数据清洗与预处理——数据预处理3.增加数据列在原有数据集的基础上,增加一列“人均消费”,并显示前5行数据。

tip_df['人均消费']=round(tip_df['total_bill']/tip_df['size'],2)print(tip_df.head())运行结果:

total_billtipsexsmokerdaytimesize人均消费016.9900001.0100FemaleNoSun晚餐2.08.49120.2161331.6600MaleNoSun晚餐3.06.74221.0100003.0268MaleNoSun晚餐3.07.00320.2161333.3100MaleNoSun晚餐2.010.11424.5900003.6100FemaleNoSun晚餐4.06.15数据清洗与预处理——数据保存对清洗与预处理后的数据,可以保存为Excel、CSV、JSON、HTML等文件格式或者存储到数据库中。将处理后的数据保存为CSV格式:

tip_df.to_csv('./data/tip.csv',index=False)保存数据为tips.csv数据集后,可以对数据各种分析处理。小费数据集统计分析利用tips.csv数据集,对小费数据集进行统计分析:

tip_df=pd.read_csv('./data/tips.csv')#解决数据输出时列名与数据不对齐的问题pd.set_option('display.unicode.east_asian_width',True)tip_df['人均消费']=round(tip_df['total_bill']/tip_df['size'],2)print(tip_df.head())小费数据集统计分析运行结果:

total_billtipsexsmokerdaytimesize人均消费016.991.01FemaleNoSunDinner28.49110.341.66MaleNoSunDinner33.45221.013.50MaleNoSunDinner37.00323.683.31MaleNoSunDinner211.84424.593.61FemaleNoSunDinner46.15小费数据集统计分析——数据查询查询男性午餐人均消费大于10的数据:

#方法1:df_query_result=tip_df[(tip_df['sex']=='Male')&(tip_df['time']=='Lunch')&(tip_df['人均消费']>10)]#方法2:df_query_result=tip_df.query('sex=="Male"&time=="Lunch"&人均消费>10')print(df_query_result)小费数据集统计分析——数据查询运行结果:

total_billtipsexsmokerdaytimesize人均消费7822.763.00MaleNoThurLunch211.388332.685.00MaleYesThurLunch216.348824.715.85MaleNoThurLunch212.368921.163.00MaleNoThurLunch210.5819228.442.56MaleYesThurLunch214.22print(df_query_result.describe())小费数据集统计分析——数据分组分析1.分析男性顾客和女性顾客谁的人均消费水平更高

df_groupby_result=tip_df.groupby('sex')['人均消费'].mean()print(df_groupby_result)运行结果:

sexFemale7.464368Male8.123057Name:人均消费,dtype:float64小费数据集统计分析——数据分组分析2.分析男性顾客和女性顾客谁更慷慨

df_groupby_sex_tip=tip_df.groupby('sex')['tip'].mean()print(df_groupby_sex_tip)运行结果:

sexFemale2.833448Male3.089618Name:tip,dtype:float64小费数据集统计分析——数据分组分析3.通过“性别+抽烟”的组合因素分析性别和抽烟对慷慨度的影响

generosity_by_gender_smoker=tip_df.groupby(['sex','smoker'])['tip'].mean()print(generosity_by_gender_smoker)运行结果:

sexsmokerFemaleNo2.773519Yes2.931515MaleNo3.113402Yes3.051167Name:tip,dtype:float64小费数据集统计分析——数据分组分析4.分析对比各个时间的客流量和销售额并给出相应管理措施

df_groupby=tip_df.groupby(['time','sex','day'])[["total_bill","tip","size"]].mean()print('分析对比各个时间的客流量和销售额:\n',df_groupby)小费数据集统计分析——数据分组分析运行结果:

分析对比各个时间的客流量和销售额:total_billtipsizetimesexdayDinnerFemaleFri14.3100002.8100002.000000Sat19.6803572.8017862.250000Sun19.8722223.3672222.944444Thur18.7800003.0000002.000000MaleFri23.4871433.0328572.285714Sat20.8025423.0838982.644068Sun21.8872413.2203452.810345LunchFemaleFri13.9400002.7450002.250000Thur16.6487102.5619352.483871MaleFri11.3866671.9000001.666667Thur18.7146672.9803332.433333小费数据集统计分析——数据分组分析从以上数据分析,可以看出:晚餐时间段的消费总金额、小费和聚餐人数的水平均比午餐时间段高。男性顾客的消费总金额、小费的水平比女性顾客高。午餐聚会时间都在周五和周四,晚餐聚会时间在周四、周五、周六、周天。周末两天(周六和周天)的晚餐时间段是客流量最大的时间段,应加大人员配备和食材配备,以保证服务质量。每周的前三天(周一、周二和周三)是客流量最小的时间,应给出最大的优惠力度,吸引客源进店消费。每周的周四周五两天,聚餐的人气也比较旺,应适当加大优惠力度和宣传引流,最大化增大客流量。小费数据集统计分析——创建数据的透视表和交叉表1.创建透视表

df_pivot=tip_df.pivot_table(index=["day"],columns=["time"],values=["tip"],aggfunc='sum',margins=True)print(df_pivot)运行结果:

tiptimeDinnerLunchAlldayFri35.2816.6851.96Sat260.40NaN260.40Sun247.39NaN247.39Thur3.00168.83171.83All546.07185.51731.58小费数据集统计分析——创建数据的透视表和交叉表2.创建交叉表

df_cross=pd.crosstab(index=tip_df["day"],columns=tip_df["time"],values=tip_df["tip"],aggfunc='sum',margins=True)print(df_cross)运行结果:

timeDinnerLunchAlldayFri35.2816.6851.96Sat260.40NaN260.40Sun247.39NaN247.39Thur3.00168.83171.83All546.07185.51731.58基于小费数据集可视化导入所需的模块:包括Pandas和Matplotlib,利用Matplotlib绘制各种类型的图表,包括散点图、直方图、箱线图等等,从中发现顾客的一些特征与小费数额之间的关系。对绘制的图表进行美化和定制,包括添加标签、标题、轴标签、图例等等。

importpandasaspdimportmatplotlib.pyplotasplttip_df=pd.read_csv('./data/tips.csv')plt.rcParams['font.sans-serif']=['SimHei']#显示中文标签plt.rcParams['axes.unicode_minus']=False#显示负号基于小费数据集可视化绘制柱状图:绘制柱状图,分析性别与消费金额之间的关系。

#女性平均消费金额female_tipfemale_tip=tip_df[tip_df['sex']=='Female']['tip'].mean()#男性平均消费金额male_tipmale_tip=tip_df[tip_df['sex']=='Male']['tip'].mean()s_data=pd.Series([male_tip,female_tip],index=['male','female'])s_data.plot(kind='bar') #男女平均小费柱状图plt.show()基于小费数据集可视化运行结果:从柱状图中可以看出,女性小费金额少于男性小费金额。基于小费数据集可视化绘制直方图:绘制直方图,分析小费所占消费总额的百分比。消费总金额为小费金额和聚餐所花费的金额(total_bill),可以通过DataFrame算术运算,新建一列(percent_tip),用于存储小费百分比。

tip_df['percent_tip']=tip_df['tip']/(tip_df['total_bill']+tip_df['tip'])print(tip_df.head(10))#小费所占百分比tip_df['percent_tip'].hist(bins=50)#小费百分比直方图plt.show()基于小费数据集可视化运行结果:小费金额占小费总金额的百分比基本服从正态分布,但也有几个异常点。基于小费数据集可视化绘制箱线图:绘制箱线图分析性别和抽烟的组合对慷慨度的影响。

fig,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论