Python数据分析实战项目-共享单车骑行数据分析
背景介紹
隨著我國的經(jīng)濟迅速發(fā)展,城市人口急劇增加,隨之帶來的是一系列的問題,交通擁堵,環(huán)境受到破壞,發(fā)展公共交通可以完美的解決現(xiàn)在我們面臨的這些問題,自行車具有機動靈活、低碳環(huán)保的優(yōu)點,如果自行車可以取代現(xiàn)在的機動車,那么道路就不會那么擁擠,人們的出行效率就會大大提升,汽車廢氣的排放量也將大大的減少,環(huán)境的質(zhì)量也會提升。同時,為了完美的解決從地鐵站到公司、從公交站到家的“最后一公里”路程,共享單車應(yīng)運而生.
共享單車有效的解決了“走路累,公交擠,開車堵,打車貴”的苦惱。一夜之間,北上廣深、甚至部分二線城市,共享單車大街小巷隨處可見。繼2016年9月26日ofo單車宣布獲得滴滴快車數(shù)千萬美元的戰(zhàn)略投資,雙方將在共享單車領(lǐng)域展開深度合作之后,摩拜單車也于2017年1月完成D輪2.15億美元(約合人民幣15億元)的融資,國內(nèi)共享單車更加火爆,最近一張手機截屏躥紅網(wǎng)絡(luò)。在這張截圖上,24個共享單車應(yīng)用的圖標(biāo)霸滿了整個手機屏幕,真的是“一圖說明共享單車的激烈競爭”。而在街頭,仿佛一夜之間,共享單車已經(jīng)到了“泛濫”的地步,各大城市路邊排滿各種顏色的共享單車。共享經(jīng)濟的不斷發(fā)展逐漸的改變著人們的日常生活,共享精神也逐漸深入人心。
數(shù)據(jù)來源(已更新)
CSDN下載
https://download.csdn.net/download/qq_40507857/13191475
python源代碼
# 1.導(dǎo)包操作:科學(xué)計算包numpy,pandas,可視化matplotlib,seaborn import numpy as np # 導(dǎo)入numpy并重命名為np import pandas as pd # 導(dǎo)入pandas并重命名為pdfrom pylab import mplmpl.rcParams['font.sans-serif'] = ['SimHei'] # 設(shè)置中文字體from datetime import datetime import calendarimport matplotlib.pyplot as plt import seaborn as sn# weekday方法:日期--》星期值(整數(shù),下標(biāo)從0開始) # strptime方法:字符串--》日期 # day_name方法:星期值--》星期(字符串) # month_name方法:月份值--》月份(字符串) # month方法:日期--》月份值(整數(shù))(1-12) # map方法:根據(jù)對應(yīng)字典產(chǎn)生映射# 2. 數(shù)據(jù)采集/查看和處理 def collect_and_process_data():# 2.1 數(shù)據(jù)讀取bikedata = pd.read_csv('train.csv')# 2.2 數(shù)據(jù)查看print(bikedata.shape) # 查看數(shù)據(jù)print(bikedata.head(5)) # 查看數(shù)據(jù)的前5行print(bikedata.dtypes) # 查看數(shù)據(jù)類型# 2.3數(shù)據(jù)提取# 2.3.1提取年月日# 對datetime這一列應(yīng)用匿名函數(shù):# x表示datetime這一列數(shù)據(jù)# x.split()以空格符分割,返回字符串列表# x.split()[0]取出列表的第一個元素bikedata['date'] = bikedata.datetime.apply(lambda x: x.split()[0]) # 添加一列:date# 2.3.2提取小時bikedata['hour'] = bikedata.datetime.apply(lambda x: x.split()[1].split(':')[0])# 2.3.3 在年月日的基礎(chǔ)上提取星期幾(格式化字符串)bikedata['weekday'] = bikedata.date.apply(lambda dateString: calendar.day_name[datetime.strptime(dateString, '%Y/%m/%d').weekday()])# 2.3.4 在年月日的基礎(chǔ)上提取月份值bikedata['month'] = bikedata.date.apply(lambda dateString: calendar.month_name[datetime.strptime(dateString, "%Y/%m/%d").month])# 2.4 數(shù)據(jù)轉(zhuǎn)換# 2.4.1 將season轉(zhuǎn)換為英文季節(jié)值bikedata['season'] = bikedata.season.map({1: 'spring', 2: 'summer', 3: 'fall', 4: 'winter'})# 2.4.2 將以下變量轉(zhuǎn)化成分類變量print(bikedata)varlist = ['hour', 'weekday', 'month', 'season', 'holiday', 'workingday']for x in varlist:bikedata[x] = bikedata[x].astype('category') # astype 改變數(shù)據(jù)類型print(bikedata.dtypes)# 2.4.3刪除無意義的列bikedata.drop('datetime', axis=1, inplace=True)# 2.5數(shù)據(jù)清洗# 2.5.1查看數(shù)據(jù)缺失print(bikedata.describe())# 2.5.2查看是否有異常值fig, axes = plt.subplots(nrows=2, ncols=2)fig.set_size_inches(12, 12) # 重設(shè)大小,單位:英寸# v垂直 h水平# 繪制箱型圖sn.boxplot(data=bikedata, y='count', orient='v', ax=axes[0][0])sn.boxplot(data=bikedata, x='season', y="count", orient='v', ax=axes[0][1])sn.boxplot(data=bikedata, x='hour', y="count", orient='v', ax=axes[1][0])sn.boxplot(data=bikedata, x='workingday', y="count", orient='v', ax=axes[1][1])# 設(shè)置橫坐標(biāo)、縱坐標(biāo)、標(biāo)題axes[0][0].set(ylabel="騎行人數(shù)", title="騎行人數(shù)")axes[0][1].set(ylabel="騎行人數(shù)", xlabel="季節(jié)", title="各季節(jié)騎行人數(shù)")axes[1][0].set(ylabel="騎行人數(shù)", xlabel="時間段", title="各時間段騎行人數(shù)")axes[1][1].set(ylabel="騎行人數(shù)", xlabel="是否工作日", title="工作日和非工作日騎行人數(shù)")plt.savefig('collect_and_process_data.png') # 保存圖片plt.show() # 顯示圖片# 2.5.3剔除異常數(shù)據(jù)print(np.abs(bikedata["count"] - bikedata["count"].mean()))print(3 * bikedata["count"].std())print(np.abs(bikedata["count"] - bikedata["count"].mean()) <= (3 * bikedata["count"].std()))processed_data = bikedata[np.abs(bikedata["count"] - bikedata["count"].mean()) <= (3 * bikedata["count"].std())]print(processed_data)processed_data.to_csv('processed_data.csv')return processed_data# 3. 數(shù)據(jù)分析與可視化(不同月份的騎行月份分析) def Data_Analysis_and_Visualization_month(bikedata):fig, axes = plt.subplots()fig.set_size_inches(12, 20)sortOrder = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October","November", "December"]# 判斷每個月份有幾條記錄,并按由大到小順序排序monthAggregated = pd.DataFrame(bikedata.groupby("month")["count"].mean()).reset_index()# print(monthAggregated)monthSorted = monthAggregated.sort_values(by="count", ascending=False) # 按月份從小到大排序# print(monthSorted)# 繪制柱狀圖sn.barplot(data=monthSorted, x="month", y="count", order=sortOrder)axes.set(xlabel="月份", ylabel="平均騎行人數(shù)", title="不同月份的騎行人數(shù)")plt.savefig('result_month.png')# plt.show()# 4. 數(shù)據(jù)分析與可視化(不同時間的騎行時間) def Data_Analysis_and_Visualization_hour(bikedata):fig, ax = plt.subplots()fig.set_size_inches(12, 20)hueOrder = ['Sunday', 'Monday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']# 一周內(nèi)不同時間的騎行人數(shù)hourAggregated = pd.DataFrame(bikedata.groupby(['hour', 'weekday'])['count'].mean()).reset_index()print(hourAggregated)# 繪制折線圖sn.pointplot(x=hourAggregated['hour'], y=hourAggregated['count'], hue=hourAggregated['weekday'], hue_order=hueOrder,data=hourAggregated)ax.set(xlabel='時間', ylabel='騎行人數(shù)', title='一周內(nèi)不同時間的騎行人數(shù)')plt.savefig('result_hour.png')plt.show()# 主函數(shù) def main():# 數(shù)據(jù)采集/查看和處理processed_data = collect_and_process_data()# 數(shù)據(jù)分析與可視化:月份Data_Analysis_and_Visualization_month(processed_data)# 數(shù)據(jù)分析與可視化:小時Data_Analysis_and_Visualization_hour(processed_data)# 主程序 if __name__ == '__main__':main()分析結(jié)果
數(shù)據(jù)查看
數(shù)據(jù)分析與可視化(騎行月份分析)
數(shù)據(jù)分析與可視化(騎行時間分析)
總結(jié)
以上是生活随笔為你收集整理的Python数据分析实战项目-共享单车骑行数据分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 牛客网 栈的压入、弹出序列
- 下一篇: Python基础知识-优雅的with a