Python數(shù)據(jù)分析與應(yīng)用案例教程 第6章_第1頁
Python數(shù)據(jù)分析與應(yīng)用案例教程 第6章_第2頁
Python數(shù)據(jù)分析與應(yīng)用案例教程 第6章_第3頁
Python數(shù)據(jù)分析與應(yīng)用案例教程 第6章_第4頁
Python數(shù)據(jù)分析與應(yīng)用案例教程 第6章_第5頁
已閱讀5頁,還剩44頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第6章旅游網(wǎng)站精華游記數(shù)據(jù)分析簽到掃碼下載文旌課堂APP掃碼簽到(2022.3.2515:00至2022.3.2515:10)簽到方式教師通過“文旌課堂APP”生成簽到二維碼,并設(shè)置簽到時間,學(xué)生通過“文旌課堂APP”掃描“簽到二維碼”進(jìn)行簽到。。旅游網(wǎng)站精華游記數(shù)據(jù)分析本章導(dǎo)讀隨著“互聯(lián)網(wǎng)+”時代的到來,各種旅游網(wǎng)站層出不窮,它們不僅提供了票務(wù)服務(wù)預(yù)定功能,還提供了自由行和自助游分享,其中包含了海量的旅游景點圖片、游記、路線行程、美食、購物等旅游攻略信息。對這些數(shù)據(jù)進(jìn)行分析,可以為制訂旅行計劃提供參考。

第6章旅游網(wǎng)站精華游記數(shù)據(jù)分析學(xué)習(xí)目標(biāo)

第6章 練習(xí)使用Pandas預(yù)處理重復(fù)值、缺失值、異常值和時間信息等。 練習(xí)使用Pandas導(dǎo)入和保存Excel數(shù)據(jù)。 練習(xí)使用Pandas分析數(shù)據(jù),以及使用Matplotlib可視化展示數(shù)據(jù)。 能對數(shù)據(jù)進(jìn)行預(yù)處理、分析和可視化操作。旅游網(wǎng)站精華游記數(shù)據(jù)分析素質(zhì)目標(biāo)

第6章 了解中國豐富的旅游資源,增強(qiáng)熱愛祖國大好河山的情感。 深入理解生態(tài)文明建設(shè)原則,增強(qiáng)熱愛自然的意識。Content第6章數(shù)據(jù)預(yù)處理需求分析數(shù)據(jù)分析與可視化6.1需求分析第6章旅游網(wǎng)站精華游記數(shù)據(jù)分析旅游是陶冶身心、鍛煉身體、增長見識的最好方式之一,為了保障旅途的順暢,制訂旅行計劃是非常有必要的,而出行時間、方式、人均消費、目的地等是人們關(guān)注的重點。本章的目標(biāo)是根據(jù)某旅游網(wǎng)站中精華游記(見下圖)的信息,包括出發(fā)時間、旅行天數(shù)、人均消費、旅行標(biāo)簽、閱覽數(shù)和途徑地點等,分析旅游的旺季和淡季、最能接受的旅游天數(shù)和人均消費、旅游方式、熱門地區(qū)等。6.1需求分析6.1.1目標(biāo)分析6.1需求分析數(shù)據(jù)源為通過網(wǎng)絡(luò)爬蟲爬取的某旅游網(wǎng)站精華游記的數(shù)據(jù),保存在“旅游網(wǎng)站精華游記數(shù)據(jù).xlsx”文件中,內(nèi)容如下圖所示。6.1需求分析6.1.2數(shù)據(jù)源6.2數(shù)據(jù)預(yù)處理第6章旅游網(wǎng)站精華游記數(shù)據(jù)分析為了方便數(shù)據(jù)分析,須首先對爬取的數(shù)據(jù)進(jìn)行提取有用信息和轉(zhuǎn)換格式等解析處理。例如,提取出發(fā)日期中的日期信息、天數(shù)和人均消費中的數(shù)值、途經(jīng)地點中的地名;統(tǒng)一閱覽數(shù)中的數(shù)值格式;轉(zhuǎn)換天數(shù)和閱覽數(shù)的數(shù)據(jù)類型為整型。數(shù)據(jù)解析可以通過下面7個步驟來實現(xiàn)。6.2數(shù)據(jù)預(yù)處理6.2.1數(shù)據(jù)解析6.2數(shù)據(jù)預(yù)處理(1)導(dǎo)入“旅游網(wǎng)站精華游記數(shù)據(jù).xlsx”文件中的數(shù)據(jù)。(2)定義dealPlace()函數(shù)用于篩選途經(jīng)地點中的中文地名,以及dealView()函數(shù)用于統(tǒng)一閱覽數(shù)中的數(shù)值格式。(3)使用str.split()函數(shù)以默認(rèn)的空格分割出發(fā)日期字符串,并設(shè)置其expand參數(shù)為True返回列表,獲取第一個元素,即日期信息。(4)使用str.slice()函數(shù)切片獲取天數(shù)和人均消費字符串的元素,即天數(shù)和人均消費的數(shù)值,并將天數(shù)的數(shù)據(jù)類型轉(zhuǎn)換為整型。(5)使用lambda表達(dá)式調(diào)用dealPlace()函數(shù),并使用str.replace()函數(shù)將途經(jīng)地點字符串中“途經(jīng):”替換為空字符、將“>”替換為“、”。(6)使用lambda表達(dá)式調(diào)用dealView()函數(shù),并將閱覽數(shù)的數(shù)據(jù)類型轉(zhuǎn)換為整型。(7)輸出解析后的數(shù)據(jù)。實現(xiàn)代碼如下。6.2數(shù)據(jù)預(yù)處理importpandasaspddf=pd.read_excel('旅游網(wǎng)站精華游記數(shù)據(jù).xlsx')defdealPlace(place): #篩選途經(jīng)地點中的中文地名

s=''iftype(place)==str:forcinplace:ifnot(((c>='a')and(c<='z'))or((c>='A')and(c<='Z'))):s=s+celse:s=placereturnsdefdealView(view): #統(tǒng)一閱覽數(shù)中的數(shù)值格式

num=viewiftype(num)==str:if'萬'innum:if'.'innum:num=num.replace('.','').replace('萬','000')else:num=num.replace('萬','0000')returnnum6.2數(shù)據(jù)預(yù)處理df['出發(fā)日期']=df['出發(fā)日期'].str.split(expand=True)[0]df['天數(shù)']=df['天數(shù)'].str.slice(1,-1).astype('int')df['人均消費(元)']=df['人均消費(元)'].str.slice(2,-1)#使用lambda調(diào)用dealPlace()函數(shù)df['途經(jīng)地點']=df['途經(jīng)地點'].apply(lambdax:dealPlace(x))df['途經(jīng)地點']=df['途經(jīng)地點'].str.replace('途經(jīng):','',regex=False).str.replace('>','、',regex=False)#使用lambda調(diào)用dealView()函數(shù)df['閱覽數(shù)']=df['閱覽數(shù)'].apply(lambdax:dealView(x)).astype('int')print(df[['出發(fā)日期','天數(shù)','人均消費(元)','閱覽數(shù)','途經(jīng)地點']])Pandas提供了apply()函數(shù)用于調(diào)用函數(shù)處理數(shù)據(jù)。如果Series對象使用該函數(shù),則調(diào)用的函數(shù)作用于每個元素;如果DataFrame對象使用該函數(shù),則調(diào)用的函數(shù)作用于每行或每列。Pandas還提供了astype(dtype)函數(shù)用于將數(shù)據(jù)轉(zhuǎn)換為指定的數(shù)據(jù)類型。程序運行結(jié)果如下圖所示。6.2數(shù)據(jù)預(yù)處理6.2數(shù)據(jù)預(yù)處理6.2數(shù)據(jù)預(yù)處理6.2.2重復(fù)值處理旅游網(wǎng)站中會存在相同的游記,此時,須對數(shù)據(jù)中的重復(fù)值進(jìn)行處理。此處,根據(jù)標(biāo)題檢查數(shù)據(jù)是否存在重復(fù)值,除包含重復(fù)值的第一行外,其他包含重復(fù)值的行標(biāo)記為True,并輸出標(biāo)記為True的行索引;然后,刪除重復(fù)值,并輸出刪除前、后數(shù)據(jù)的行數(shù)。實現(xiàn)代碼如下。df1=df.duplicated(subset=['標(biāo)題'])print('除包含重復(fù)值的第一行外,其他包含重復(fù)值標(biāo)記為True的行:\n',df1[df1==True])print('刪除重復(fù)值前數(shù)據(jù)的行數(shù):',len(df))df.drop_duplicates(subset=['標(biāo)題'],inplace=True,ignore_index=True)print('刪除重復(fù)值后數(shù)據(jù)的行數(shù):',len(df))程序運行結(jié)果如右圖所示。6.2數(shù)據(jù)預(yù)處理6.2數(shù)據(jù)預(yù)處理6.2.3缺失值處理當(dāng)每條游記信息中缺失的信息大于2時,可以認(rèn)為該游記失去參考價值,需要刪除。此處,將數(shù)據(jù)轉(zhuǎn)置后統(tǒng)計每列的缺失值個數(shù),并輸出缺失值大于2的行索引及其個數(shù);然后,刪除缺失值個數(shù)大于2(即非缺失值個數(shù)小于5)的行,并輸出刪除前、后數(shù)據(jù)的行數(shù)。實現(xiàn)代碼如下。df2=df.T.isnull().sum()print('缺失值個數(shù)大于2的行:\n',df2[df2>2])print('刪除缺失值前數(shù)據(jù)的行數(shù):',len(df))df.dropna(how='all',thresh=5,inplace=True)print('刪除缺失值后數(shù)據(jù)的行數(shù):',len(df))程序運行結(jié)果如下圖所示。6.2數(shù)據(jù)預(yù)處理6.2數(shù)據(jù)預(yù)處理6.2.4異常值處理此次數(shù)據(jù)分析的目的是為上班族制訂旅行計劃提供參考數(shù)據(jù),而上班族往往沒有長假期,因此可以將天數(shù)過長(如大于15)的數(shù)據(jù)看作異常值,需要刪除。此處,使用布爾型索引選取天數(shù)大于15的行,并輸出選取數(shù)據(jù)的行數(shù)及前10行;然后,刪除包含異常值的行,并輸出刪除前、后數(shù)據(jù)的行數(shù)。實現(xiàn)代碼如下。val=df['天數(shù)'][(df['天數(shù)']>15)]print('天數(shù)大于15的異常值個數(shù):',val.count())print('天數(shù)大于15的異常值前10行:\n',val.head(10))print('刪除異常值前數(shù)據(jù)的行數(shù):',len(df))df.drop(val.index,inplace=True)print('刪除異常值后數(shù)據(jù)的行數(shù):',len(df))程序運行結(jié)果如右圖所示。從右圖可以看出,天數(shù)大于15的數(shù)據(jù)有56個,且存在大于300的數(shù)據(jù),顯然與普遍情況不符。6.2數(shù)據(jù)預(yù)處理6.2數(shù)據(jù)預(yù)處理6.2.5時間信息處理由于需要按月分析數(shù)據(jù),因此須提取日期中的月份信息。此處,將出發(fā)日期轉(zhuǎn)換成時間型數(shù)據(jù),通過其屬性提取月份信息,并將其添加到列末;然后,輸出出發(fā)日期和月份的前20行。實現(xiàn)代碼如下。df['月份']=pd.to_datetime(df['出發(fā)日期']).dt.monthprint(df[['出發(fā)日期','月份']].head(20))程序運行結(jié)果如右圖所示。6.2數(shù)據(jù)預(yù)處理6.2數(shù)據(jù)預(yù)處理6.2.6預(yù)處理數(shù)據(jù)保存為方便后續(xù)分析,將預(yù)處理后的數(shù)據(jù)保存到“旅游網(wǎng)站精華游記數(shù)據(jù)_預(yù)處理.xlsx”文件中,實現(xiàn)代碼如下。df.to_excel('旅游網(wǎng)站精華游記數(shù)據(jù)_預(yù)處理.xlsx',index=False)程序運行后,將生成“旅游網(wǎng)站精華游記數(shù)據(jù)_預(yù)處理.xlsx”文件,其內(nèi)容如下圖所示。6.2數(shù)據(jù)預(yù)處理6.3數(shù)據(jù)分析與可視化第6章旅游網(wǎng)站精華游記數(shù)據(jù)分析通過游記中出行時間的月份,可以分析旅游的旺季和淡季。此處,使用折線圖分析每月游客旅游次數(shù)。首先,導(dǎo)入“旅游網(wǎng)站精華游記數(shù)據(jù)_預(yù)處理.xlsx”文件中的數(shù)據(jù),并設(shè)置中文字體;然后,將數(shù)據(jù)按月份分組及獲取統(tǒng)計個數(shù);最后,創(chuàng)建新畫布,設(shè)置大小為(10,5),以統(tǒng)計個數(shù)的行標(biāo)簽為x軸數(shù)據(jù)、數(shù)值為y軸數(shù)據(jù)、線條顏色為(0.894,0,0.498)繪制折線圖,并設(shè)置x軸刻度、x軸和y軸標(biāo)題、圖表標(biāo)題和每個數(shù)據(jù)的文本標(biāo)簽。實現(xiàn)代碼如下。6.3數(shù)據(jù)分析與可視化6.3.1旅游月份分析下面將從旅游月份、天數(shù)和人均消費、旅游方式、熱門地區(qū)等方面,對預(yù)處理后的數(shù)據(jù)進(jìn)行分析與可視化展示。importmatplotlib.pyplotaspltimportpandasaspddf=pd.read_excel('旅游網(wǎng)站精華游記數(shù)據(jù)_預(yù)處理.xlsx')plt.rcParams['font.sans-serif']='SimHei'df_month=df.groupby('月份').size() #按月分組及獲取統(tǒng)計個數(shù)#繪制每月游客旅游次數(shù)折線圖plt.figure(figsize=(10,5))x=df_month.indexplt.plot(x,df_month,color=(0.894,0,0.498))plt.xticks(range(1,13))plt.xlabel('月份')6.3數(shù)據(jù)分析與可視化plt.ylabel('旅游次數(shù)')plt.title('每月游客旅游次數(shù)折線圖')fora,binzip(x,df_month):plt.text(a,b,'%d'%b,ha='center')plt.show()程序運行結(jié)果如下圖所示。從下圖可以看出,本次采集的游記數(shù)據(jù)中,7月、9月和10月是旅游旺季,2月和3月是旅游淡季。6.3數(shù)據(jù)分析與可視化6.3數(shù)據(jù)分析與可視化通過游記中的旅游天數(shù)和人均消費,可以分析游客最能接受的旅游天數(shù)和人均消費。此處,使用直方圖按天數(shù)和人均消費分析旅游次數(shù)。首先,創(chuàng)建新畫布,設(shè)置大小為(10,9);然后,創(chuàng)建第一個子圖,以天數(shù)為x軸數(shù)據(jù)、統(tǒng)計的旅游次數(shù)為y軸數(shù)據(jù)、填充顏色為(0.894,0,0.498)、邊框顏色為黑色繪制直方圖,并設(shè)置x軸、y軸和子圖標(biāo)題;最后,創(chuàng)建第二個子圖,以人均消費為x軸數(shù)據(jù)、統(tǒng)計的旅游次數(shù)為y軸數(shù)據(jù)、填充顏色為(0.894,0,0.498)、邊框顏色為黑色繪制直方圖,并設(shè)置x軸、y軸和子圖標(biāo)題。實現(xiàn)代碼如下。6.3.2旅游天數(shù)和人均消費分析6.3數(shù)據(jù)分析與可視化plt.figure(figsize=(10,9))plt.subplot(2,1,1)plt.hist(df['天數(shù)'],color=(0.894,0,0.498),edgecolor='k')plt.xlabel('天數(shù)')plt.ylabel('旅游次數(shù)')plt.title('按天數(shù)統(tǒng)計旅游次數(shù)直方圖')plt.subplot(2,1,2)plt.hist(df['人均消費(元)'],color=(0.894,0,0.498),edgecolor='k')plt.xlabel('人均消費/元')plt.ylabel('旅游次數(shù)')plt.title('按人均消費統(tǒng)計旅游次數(shù)直方圖')plt.show()程序運行結(jié)果如右圖所示。從右圖可以看出,本次采集的游記數(shù)據(jù)中,大部分游客旅游的天數(shù)在5天以下、人均消費在5000元以下。6.3數(shù)據(jù)分析與可視化通過游記中的旅行標(biāo)簽,可以分析游客的旅游方式。此處,使用餅狀圖分析游客旅游方式。首先,刪除旅行標(biāo)簽列包含缺失值的行,并將該列中的數(shù)據(jù)使用空格分割,保存在label中;接著,定義標(biāo)簽列表label_list,循環(huán)讀取label,將其中的每個元素添加到label_list中;然后,使用label_list創(chuàng)建DataFrame對象df_label,設(shè)置列標(biāo)簽為標(biāo)簽,以及添加值都為1的次數(shù)列,并將df_label按標(biāo)簽分組及求統(tǒng)計個數(shù)聚合后按次數(shù)降序排序,獲取前5行的數(shù)據(jù);最后,創(chuàng)建新畫布,以次數(shù)為扇區(qū)數(shù)據(jù)、以行標(biāo)簽為扇區(qū)標(biāo)簽、兩位小數(shù)百分比為比例格式繪制餅狀圖,并設(shè)置圖表標(biāo)題。實現(xiàn)代碼如下。6.3.3旅游方式分析6.3數(shù)據(jù)分析與可視化data_label=df['旅行標(biāo)簽'].dropna()label=data_label.str.split(expand=False)label_list=[]foriinlabel:label_list.extend(i)#使用label_list創(chuàng)建DataFrame對象,并設(shè)置列標(biāo)簽df_label=pd.DataFrame(label_list,columns=['標(biāo)簽'])df_label['次數(shù)']=1 #添加值為1的次數(shù)列df_label_count=df_label.groupby('標(biāo)簽').agg('count').sort_values(by='次數(shù)',ascending=False).head(5)plt.figure()6.3數(shù)據(jù)分析與可視化plt.pie(df_label_count['次數(shù)'],labels=df_label_count.index,autopct='%.2f%%')plt.title('游客旅游方式餅狀圖')plt.show()程序運行結(jié)果如下圖所示。從下圖可以看出,本次采集的游記標(biāo)簽數(shù)量前5名數(shù)據(jù)中,34.82%的游記與美食相關(guān),25.66%的游記與攝影相關(guān),14.17%的游客選擇了自駕,深度游的數(shù)量大于短途周末的數(shù)量。6.3數(shù)據(jù)分析與可視化6.3數(shù)據(jù)分析與可視化游記中的途經(jīng)地點,可以反映游客已經(jīng)去過的地區(qū),如果該地區(qū)去過的游客多,說明它是該段時間的熱門地區(qū);而游記中的閱覽數(shù)可以反映游客對該地區(qū)感興趣的程度,如果游記的閱覽數(shù)很高,想去相關(guān)地區(qū)的游客可能會很多,因此可以預(yù)測未來的熱門地區(qū)。此處,使用柱狀圖分析當(dāng)前的熱門地區(qū),以及預(yù)測未來的熱門地區(qū)。熱門地區(qū)分析和預(yù)測可以通過下面6個步驟來實現(xiàn)。6.3.4熱門地區(qū)分析和預(yù)測6.3數(shù)據(jù)分析與可視化(1)刪除途經(jīng)地點列包含缺失值的行,并重新設(shè)置連續(xù)行索引后賦給df1。(2)創(chuàng)建空的DataFrame對象df_concat,循環(huán)df1的行索引。在循環(huán)中,首先使用“、”將途經(jīng)地點分割,并保存在列表place_list中;接著使用place_list創(chuàng)建DataFrame對象df_temp,并設(shè)置列標(biāo)簽為地點;然后將該行對應(yīng)的閱覽數(shù)賦值給df_temp的閱覽數(shù)列;最后縱向合并df_concat和df_temp。(3)將值為1的次數(shù)列添加到df_concat中,然后重新設(shè)置連續(xù)的行索引,最后將其按地點分組及求和聚合,并賦給df_group。(4)創(chuàng)建新畫布,設(shè)置大小為(10,8)。(5)創(chuàng)建第一個子圖,將df_group按次數(shù)降序排序,并獲取前10行賦給df_place;然后以df_place的行標(biāo)簽為x軸數(shù)據(jù)、次數(shù)為y軸數(shù)據(jù)、矩形柱寬為0.6、填充顏色為(0.894,0,0.498)繪制柱狀圖,并設(shè)置每個數(shù)據(jù)的文本標(biāo)簽、y軸和圖表標(biāo)題。(6)創(chuàng)建第二個子圖,將df_group按閱覽數(shù)降序排序,并獲取前10行賦給df_view;然后以df_view的行標(biāo)簽為x軸數(shù)據(jù)、閱覽數(shù)為y軸數(shù)據(jù)、矩形柱寬為0.6、填充顏色為(0.894,0,0.498)繪制柱狀圖,并設(shè)置每個數(shù)據(jù)的文本標(biāo)簽、y軸和圖表標(biāo)題。6.3數(shù)據(jù)分析與可視化實現(xiàn)代碼如下。#刪除途經(jīng)地點列包含缺失值的行,并重新設(shè)置連續(xù)行索引df1=df.dropna(subset='途經(jīng)地點').reset_index(drop=True)df_concat=pd.DataFrame() #創(chuàng)建空的DataFrame對象forindexindf1.index:#將途經(jīng)地點列使用“、”分割,并將返回的列表賦給place_listplace_list=df1.iloc[index][6].split('、')#使用place_list創(chuàng)建DataFrame對象df_temp,并設(shè)置列標(biāo)簽為地點

df_temp=pd.DataFrame(place_list,columns=['地點'])#以該行對應(yīng)的閱覽數(shù)為值將閱覽數(shù)列添加到df_temp6.3數(shù)據(jù)分析與可視化df_temp['閱覽數(shù)']=df1.iloc[index][5]#縱向合并df_concat和df_tempdf_concat=pd.concat([df_concat,df_temp])df_concat['次數(shù)']=1 #在df_concat中添加值為1的次數(shù)列#重新設(shè)置df_concat連續(xù)的行索引,并忽略原行索引df_concat=df_concat.reset_index(drop=True)#將df_concat按地點分組

溫馨提示

  • 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

提交評論