Python財經(jīng)應(yīng)用-編程基礎(chǔ)、數(shù)據(jù)分析與可視化課件 第9章-綜合應(yīng)用:基于消費數(shù)據(jù)集的可視化分析_第1頁
Python財經(jīng)應(yīng)用-編程基礎(chǔ)、數(shù)據(jù)分析與可視化課件 第9章-綜合應(yīng)用:基于消費數(shù)據(jù)集的可視化分析_第2頁
Python財經(jīng)應(yīng)用-編程基礎(chǔ)、數(shù)據(jù)分析與可視化課件 第9章-綜合應(yīng)用:基于消費數(shù)據(jù)集的可視化分析_第3頁
Python財經(jīng)應(yīng)用-編程基礎(chǔ)、數(shù)據(jù)分析與可視化課件 第9章-綜合應(yīng)用:基于消費數(shù)據(jù)集的可視化分析_第4頁
Python財經(jīng)應(yīng)用-編程基礎(chǔ)、數(shù)據(jù)分析與可視化課件 第9章-綜合應(yīng)用:基于消費數(shù)據(jù)集的可視化分析_第5頁
已閱讀5頁,還剩44頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

Python財經(jīng)應(yīng)用:編程基礎(chǔ)、數(shù)據(jù)分析與可視化第九章綜合應(yīng)用

中國農(nóng)業(yè)大學(xué)李輝綜合應(yīng)用--基于消費數(shù)據(jù)集的可視化分析小費數(shù)據(jù)集:是一個用于統(tǒng)計分析和數(shù)據(jù)挖掘的數(shù)據(jù)集,這個數(shù)據(jù)集可能包括以下變量:total_bill為消費總金額、tip為小費金額、sex為顧客性別、smoker為顧客是否在吸煙區(qū)用餐、day為消費的日期(星期幾)、time為用餐的時間段(早、中、晚)、size為與顧客一同就餐的人數(shù)。小費數(shù)據(jù)集可以用于分析影響小費金額的因素。本章分析中,圍繞小費數(shù)據(jù)集提出幾個問題:小費金額與消費總金額是否存在相關(guān)性?性別、是否吸煙、星期幾、中/晚餐、聚餐人數(shù)和小費金額是否有一定的關(guān)聯(lián)?小費金額占消費總金額的百分比服從正態(tài)分布?綜合應(yīng)用--基于消費數(shù)據(jù)集的可視化分析數(shù)據(jù)分析的流程通常情況下分為5步:1)導(dǎo)入數(shù)據(jù)。在這一步中,需要對收集的數(shù)據(jù)有一定的認(rèn)知,對各字段的含義和背景知識都要有著足夠的理解。2)定義問題。根據(jù)各自的行業(yè)和業(yè)務(wù)知識,對數(shù)據(jù)定義多個待解決的問題。3)數(shù)據(jù)清洗與整理。由于各種問題,獲取的數(shù)據(jù)不夠“干凈”,需通過各種手段對數(shù)據(jù)進(jìn)行清洗與整理,以便得到準(zhǔn)確的分析結(jié)果。4)數(shù)據(jù)探索。通過可視化等手段,對數(shù)據(jù)進(jìn)行分析和探索,得出結(jié)論。5)數(shù)據(jù)展示。這部分用于輸出,或撰寫數(shù)據(jù)分析報告,或匯報給上級,或繪制PPT。小費數(shù)據(jù)描述性統(tǒng)計分析1.導(dǎo)入模塊通過結(jié)果可以看出,總共有244條,7列數(shù)據(jù),通過統(tǒng)計暫時看不出是否有缺失值。

importpandasaspdimportmatplotlib.pyplotasplt#導(dǎo)入小費數(shù)據(jù)集tip_df=pd.read_excel('./data/raw_tips.xls')2.查看數(shù)據(jù)集維度信息

print('數(shù)據(jù)集的維度:',tip_df.shape)運(yùn)行結(jié)果:

數(shù)據(jù)集的維度:(244,7)小費數(shù)據(jù)描述性統(tǒng)計分析3.顯示數(shù)據(jù)集前5行

print('查看數(shù)據(jù)集前5行數(shù)據(jù):')print(tip_df.head())運(yùn)行結(jié)果:

查看數(shù)據(jù)集前5行數(shù)據(jù): total_billtipsexsmokerdaytimesize016.991.01FemaleNoSunDinner2.01NaN1.66MaleNoSunDinner3.0221.01NaNMaleNoSunDinner3.03NaN3.31MaleNoSunDinner2.0424.593.61FemaleNoSunDiner4.0小費數(shù)據(jù)描述性統(tǒng)計分析4.查看數(shù)據(jù)的行列屬性信息

print('查看數(shù)據(jù)的行列屬性:')print(tip_())小費數(shù)據(jù)描述性統(tǒng)計分析運(yùn)行結(jié)果:

查看數(shù)據(jù)的行列屬性:<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小費數(shù)據(jù)描述性統(tǒng)計分析5.查看數(shù)據(jù)的描述和統(tǒng)計信息

print('數(shù)據(jù)集的描述和統(tǒng)計信息:')print(tip_df.describe())小費數(shù)據(jù)描述性統(tǒng)計分析運(yùn)行結(jié)果:

數(shù)據(jù)集的描述和統(tǒng)計信息: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數(shù)據(jù)清洗與預(yù)處理——數(shù)據(jù)異常值與缺失值的處理1.檢查并修訂time列字段值(1)檢查time列的字段值上述運(yùn)行結(jié)果中的“nan”為空值。

print(tip_df['time'].unique())運(yùn)行結(jié)果:

['Dinner''Diner''Dier'nan'Lunch']數(shù)據(jù)清洗與預(yù)處理——數(shù)據(jù)異常值與缺失值的處理(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())運(yùn)行結(jié)果:

['Dinner'nan'Lunch']數(shù)據(jù)清洗與預(yù)處理——數(shù)據(jù)異常值與缺失值的處理2.查看數(shù)據(jù)集中各列的缺失值數(shù)量(1)利用shape屬性查看數(shù)據(jù)中缺失值數(shù)量

miss_df=tip_df.shape[0]-tip_df.count(axis=0)print(miss_df)運(yùn)行結(jié)果:

total_bill9tip5sex7smoker5day1time7size4dtype:int64數(shù)據(jù)清洗與預(yù)處理——數(shù)據(jù)異常值與缺失值的處理2.查看數(shù)據(jù)集中各列的缺失值數(shù)量(2)利用isna()方法檢測數(shù)據(jù)中的缺失值

df_nan_num=tip_df.isna().sum()print(df_nan_num)運(yùn)行結(jié)果:

total_bill9tip5sex7smoker5day1time7size4dtype:int64數(shù)據(jù)清洗與預(yù)處理——數(shù)據(jù)異常值與缺失值的處理3.刪除數(shù)據(jù)集中缺失值(1)刪除一行有兩個缺失值的數(shù)據(jù)

nan_index_list=[]fori,rowintip_df.iterrows():ifrow.isnull().sum()==2:nan_index_list.append(i)print('出現(xiàn)兩個缺失值行索引:',nan_index_list)#tip_df.drop(index=nan_index_list)tip_df.drop(index=nan_index_list,inplace=True)#替換原來的數(shù)據(jù)print('刪除出現(xiàn)兩個缺失值行索引后的缺失值信息:\n',tip_df.isnull().sum())數(shù)據(jù)清洗與預(yù)處理——數(shù)據(jù)異常值與缺失值的處理運(yùn)行結(jié)果:

出現(xiàn)兩個缺失值行索引:[12,21,40,53,67,77,198]刪除出現(xiàn)兩個缺失值行索引后的缺失值信息:total_bill5tip4sex2smoker3day1time6size3dtype:int64數(shù)據(jù)清洗與預(yù)處理——數(shù)據(jù)異常值與缺失值的處理3.刪除數(shù)據(jù)集中缺失值(2)刪除sex或time列為空的行對于空行的刪除,也可以借助dropna()方法中how='any'參數(shù)實現(xiàn)缺失值的刪除操作

total_bill4tip4sex0smoker3day1time0size2dtype:int64數(shù)據(jù)清洗與預(yù)處理——數(shù)據(jù)異常值與缺失值的處理4.缺失值處理(1)對剩余有空缺的數(shù)值型數(shù)據(jù)用平均值替換(方式一)

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)對剩余有空缺的數(shù)值型數(shù)據(jù)用平均值替換(方式二)

tip_df.fillna(tip_df.mean(numeric_only=True),inplace=True)print('填充數(shù)值型缺失值后,統(tǒng)計缺失值信息:\n',tip_df.isnull().sum())數(shù)據(jù)清洗與預(yù)處理——數(shù)據(jù)異常值與缺失值的處理運(yùn)行結(jié)果:

填充數(shù)值型缺失值后,統(tǒng)計缺失值信息:total_bill0tip0sex0smoker3day1time0size0dtype:int64數(shù)據(jù)清洗與預(yù)處理——數(shù)據(jù)異常值與缺失值的處理3.刪除數(shù)據(jù)集中缺失值(3)利用ffill()或者bfill()方法填充缺失值

tip_df.ffill(inplace=True)print('填充缺失值后,統(tǒng)計缺失值信息:\n',tip_df.isnull().sum())數(shù)據(jù)清洗與預(yù)處理——數(shù)據(jù)異常值與缺失值的處理運(yùn)行結(jié)果:

填充缺失值后,統(tǒng)計缺失值信息:total_bill0tip0sex0smoker0day0time0size0dtype:int64數(shù)據(jù)清洗與預(yù)處理——數(shù)據(jù)預(yù)處理1.修改數(shù)據(jù)集字段名(1)利用rename()修改數(shù)據(jù)集字段名

tip_df.rename(columns=({'total_bill':'消費總額','tip':'小費','sex':'性別','smoker':'是否吸煙','day':'星期','time':'聚餐時間段','size':'人數(shù)'}),inplace=True)print(tip_df.head())運(yùn)行結(jié)果:

消費總額

小費

性別

是否吸煙

星期

聚餐時間段

人數(shù)016.9900001.0100FemaleNoSunDinner2.0120.2161331.6600MaleNoSunDinner3.0221.0100003.0268MaleNoSunDinner3.0320.2161333.3100MaleNoSunDinner2.0424.5900003.6100FemaleNoSunDinner4.0數(shù)據(jù)清洗與預(yù)處理——數(shù)據(jù)預(yù)處理1.修改數(shù)據(jù)集字段名(2)直接修改列名

tip_df.columns=['total_bill','tip','sex','smoker','day','time','size']print(tip_df.head())運(yùn)行結(jié)果:

total_billtipsexsmokerdaytimesize016.9900001.0100FemaleNoSunDinner2.0120.2161331.6600MaleNoSunDinner3.0221.0100003.0268MaleNoSunDinner3.0320.2161333.3100MaleNoSunDinner2.0424.5900003.6100FemaleNoSunDinner4.0數(shù)據(jù)清洗與預(yù)處理——數(shù)據(jù)預(yù)處理2.預(yù)處理數(shù)據(jù)集中的數(shù)據(jù)將time列中的'Dinner'值變?yōu)?晚餐','Lunch'變?yōu)?午餐'。

tip_df.loc[tip_df['time']=='Dinner','time']='晚餐'tip_df.loc[tip_df['time']=='time']='午餐'print(tip_df['time'].unique())運(yùn)行結(jié)果:

['晚餐''午餐']數(shù)據(jù)清洗與預(yù)處理——數(shù)據(jù)預(yù)處理3.增加數(shù)據(jù)列在原有數(shù)據(jù)集的基礎(chǔ)上,增加一列“人均消費”,并顯示前5行數(shù)據(jù)。

tip_df['人均消費']=round(tip_df['total_bill']/tip_df['size'],2)print(tip_df.head())運(yùn)行結(jié)果:

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數(shù)據(jù)清洗與預(yù)處理——數(shù)據(jù)保存對清洗與預(yù)處理后的數(shù)據(jù),可以保存為Excel、CSV、JSON、HTML等文件格式或者存儲到數(shù)據(jù)庫中。將處理后的數(shù)據(jù)保存為CSV格式:

tip_df.to_csv('./data/tip.csv',index=False)保存數(shù)據(jù)為tips.csv數(shù)據(jù)集后,可以對數(shù)據(jù)各種分析處理。小費數(shù)據(jù)集統(tǒng)計分析利用tips.csv數(shù)據(jù)集,對小費數(shù)據(jù)集進(jìn)行統(tǒng)計分析:

tip_df=pd.read_csv('./data/tips.csv')#解決數(shù)據(jù)輸出時列名與數(shù)據(jù)不對齊的問題pd.set_option('display.unicode.east_asian_width',True)tip_df['人均消費']=round(tip_df['total_bill']/tip_df['size'],2)print(tip_df.head())小費數(shù)據(jù)集統(tǒng)計分析運(yùn)行結(jié)果:

total_billtipsexsmokerdaytimesize人均消費016.991.01FemaleNoSunDinner28.49110.341.66MaleNoSunDinner33.45221.013.50MaleNoSunDinner37.00323.683.31MaleNoSunDinner211.84424.593.61FemaleNoSunDinner46.15小費數(shù)據(jù)集統(tǒng)計分析——數(shù)據(jù)查詢查詢男性午餐人均消費大于10的數(shù)據(jù):

#方法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)小費數(shù)據(jù)集統(tǒng)計分析——數(shù)據(jù)查詢運(yùn)行結(jié)果:

total_billtipsexsmokerdaytimesize人均消費7822.763.00MaleNoThurLunch211.388332.685.00MaleYesThurLunch216.348824.715.85MaleNoThurLunch212.368921.163.00MaleNoThurLunch210.5819228.442.56MaleYesThurLunch214.22print(df_query_result.describe())小費數(shù)據(jù)集統(tǒng)計分析——數(shù)據(jù)分組分析1.分析男性顧客和女性顧客誰的人均消費水平更高

df_groupby_result=tip_df.groupby('sex')['人均消費'].mean()print(df_groupby_result)運(yùn)行結(jié)果:

sexFemale7.464368Male8.123057Name:人均消費,dtype:float64小費數(shù)據(jù)集統(tǒng)計分析——數(shù)據(jù)分組分析2.分析男性顧客和女性顧客誰更慷慨

df_groupby_sex_tip=tip_df.groupby('sex')['tip'].mean()print(df_groupby_sex_tip)運(yùn)行結(jié)果:

sexFemale2.833448Male3.089618Name:tip,dtype:float64小費數(shù)據(jù)集統(tǒng)計分析——數(shù)據(jù)分組分析3.通過“性別+抽煙”的組合因素分析性別和抽煙對慷慨度的影響

generosity_by_gender_smoker=tip_df.groupby(['sex','smoker'])['tip'].mean()print(generosity_by_gender_smoker)運(yùn)行結(jié)果:

sexsmokerFemaleNo2.773519Yes2.931515MaleNo3.113402Yes3.051167Name:tip,dtype:float64小費數(shù)據(jù)集統(tǒng)計分析——數(shù)據(jù)分組分析4.分析對比各個時間的客流量和銷售額并給出相應(yīng)管理措施

df_groupby=tip_df.groupby(['time','sex','day'])[["total_bill","tip","size"]].mean()print('分析對比各個時間的客流量和銷售額:\n',df_groupby)小費數(shù)據(jù)集統(tǒng)計分析——數(shù)據(jù)分組分析運(yùn)行結(jié)果:

分析對比各個時間的客流量和銷售額: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小費數(shù)據(jù)集統(tǒng)計分析——數(shù)據(jù)分組分析從以上數(shù)據(jù)分析,可以看出:晚餐時間段的消費總金額、小費和聚餐人數(shù)的水平均比午餐時間段高。男性顧客的消費總金額、小費的水平比女性顧客高。午餐聚會時間都在周五和周四,晚餐聚會時間在周四、周五、周六、周天。周末兩天(周六和周天)的晚餐時間段是客流量最大的時間段,應(yīng)加大人員配備和食材配備,以保證服務(wù)質(zhì)量。每周的前三天(周一、周二和周三)是客流量最小的時間,應(yīng)給出最大的優(yōu)惠力度,吸引客源進(jìn)店消費。每周的周四周五兩天,聚餐的人氣也比較旺,應(yīng)適當(dāng)加大優(yōu)惠力度和宣傳引流,最大化增大客流量。小費數(shù)據(jù)集統(tǒng)計分析——創(chuàng)建數(shù)據(jù)的透視表和交叉表1.創(chuàng)建透視表

df_pivot=tip_df.pivot_table(index=["day"],columns=["time"],values=["tip"],aggfunc='sum',margins=True)print(df_pivot)運(yùn)行結(jié)果:

tiptimeDinnerLunchAlldayFri35.2816.6851.96Sat260.40NaN260.40Sun247.39NaN247.39Thur3.00168.83171.83All546.07185.51731.58小費數(shù)據(jù)集統(tǒng)計分析——創(chuàng)建數(shù)據(jù)的透視表和交叉表2.創(chuàng)建交叉表

df_cross=pd.crosstab(index=tip_df["day"],columns=tip_df["time"],values=tip_df["tip"],aggfunc='sum',margins=True)print(df_cross)運(yùn)行結(jié)果:

timeDinnerLunchAlldayFri35.2816.6851.96Sat260.40NaN260.40Sun247.39NaN247.39Thur3.00168.83171.83All546.07185.51731.58基于小費數(shù)據(jù)集可視化導(dǎo)入所需的模塊:包括Pandas和Matplotlib,利用Matplotlib繪制各種類型的圖表,包括散點圖、直方圖、箱線圖等等,從中發(fā)現(xiàn)顧客的一些特征與小費數(shù)額之間的關(guān)系。對繪制的圖表進(jìn)行美化和定制,包括添加標(biāo)簽、標(biāo)題、軸標(biāo)簽、圖例等等。

importpandasaspdimportmatplotlib.pyplotasplttip_df=pd.read_csv('./data/tips.csv')plt.rcParams['font.sans-serif']=['SimHei']#顯示中文標(biāo)簽plt.rcParams['axes.unicode_minus']=False#顯示負(fù)號基于小費數(shù)據(jù)集可視化繪制柱狀圖:繪制柱狀圖,分析性別與消費金額之間的關(guān)系。

#女性平均消費金額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()基于小費數(shù)據(jù)集可視化運(yùn)行結(jié)果:從柱狀圖中可以看出,女性小費金額少于男性小費金額?;谛≠M數(shù)據(jù)集可視化繪制直方圖:繪制直方圖,分析小費所占消費總額的百分比。消費總金額為小費金額和聚餐所花費的金額(total_bill),可以通過DataFrame算術(shù)運(yùn)算,新建一列(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()基于小費數(shù)據(jù)集可視化運(yùn)行結(jié)果:小費金額占小費總金額的百分比基本服從正態(tài)分布,但也有幾個異常點?;谛≠M數(shù)據(jù)集可視化繪制箱線圖:繪制箱線圖分析性別和抽煙的組合對慷慨度的影響。

fig,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論