爱彼迎的数据分析与建模
Airbnb是AirBed and Breakfast(“Air-b-n-b”)的縮寫,愛彼迎是一家聯(lián)系旅游人士和家有空房出租的房主的服務型網站,它可以為用戶提供多樣的住宿信息。我們現(xiàn)在對數(shù)據(jù)進行分析。
一,對數(shù)據(jù)處理
1.因為price里面的數(shù)據(jù)有’$‘和’,’,我們要替換成空格,便于我們之后的運算
calendar['price'] = calendar['price'].str.replace(r"[$,]","").astype(np.float32) calendar.head()并且轉換浮點類型。
同理,對adjusted_price進行相同操作,再對date進行時間序列轉換,得到結果。
如圖所示,我們發(fā)現(xiàn)類型還是object,再修改一下。
完成了,現(xiàn)在是datetime類型。
2.用時間序列我們可以很輕松地返回商品的相關時間
calendar['weekday']=calendar['date'].dt.weekday calendar['month']=calendar['date'].dt.month calendar['year']=calendar['date'].dt.year calendar['year']會返回商品交易的年份,非常方便。做出柱狀圖我們可以看到商品月份的波動。
可以看出,3到8月份房屋價格遞增,8月份達到峰值。
二,對listing_detail進行分析
listing_detail數(shù)據(jù)比較多。足足有106列
元素比較多,這里有個小技巧
我們可以用
listings_detaile.columns.values.tolist()
對每一列的元素進行查看
1.我們要對這一列的數(shù)據(jù)價格進行同樣的處理,去掉不必要的符號便于運算
2.然后要求出最低消費,便于我們后邊模型的建立
listings_detailed['minimum_cost']=(listings_detailed['cleaning_fee']+listings_detailed['price'])*listings_detailed['minimum_nights']最低消費是費用加消費乘以最低天數(shù)。
3.要添加一個新字段。包含設施的數(shù)量,設施的數(shù)量與價格有直接關系
我們可以看到,設施用一個大括號括起來,我們可以用切片提取里面的數(shù)值,再用split分割逗號。
listings_detailed['accommodates_type']=pd.cut(listings_detailed['accommodates'],bins=[1,2,3,5,100],include_lowest=True,right=False,labels=['Single','Couple','Family','Group'])4.再把剩余需要的數(shù)據(jù)提取,整合到新的df里邊
listings_detailed['neighbourhood_group_cleansed'].head() listings_detailed['review_scores_rating'].head() listings_detailed_df=listings_detailed[['id','host_id','listing_url','room_type','neighbourhood_group_cleansed','price','cleaning_fee','amenities','n_amenities','accommodates','accommodates_type','minimum_nights','minimum_cost']] listings_detailed_df.head()得到一個新df,用來方便之后的運算
.二,對房間類型和社區(qū)類型進行初步分析
用餅圖和柱狀圖對房間類型進行分析
room_type_counts=listings_detailed_df['room_type'].value_counts() fig,axes = plt.subplots(1,2,figsize=(10,5)) axes[0].pie(room_type_counts.values,autopct='%.2f%%',labels=room_type_counts.index) sns.barplot(room_type_counts.index,room_type_counts.values) plt.tight_layout()我們能看出entrie home即是整套房間,占比最高
然后對社區(qū)類型進行分析
neighbourhood_counts = listings_detailed_df['neighbourhood_group_cleansed'].value_counts() sns.barplot(y=neighbourhood_counts.index,x=neighbourhood_counts.values,orient='h')可以看出社區(qū)類型排名,都是一些比較專業(yè)的名,薩拉曼卡什么的。
三,對房東進行相關分析
host_number=listings_detailed_df.groupby('host_id').size().sort_values(ascending=False) sns.distplot(host_number[host_number<10])
可以看出,擁有一套房的房東數(shù)量居多。把擁有的房屋數(shù)量劃分下等級得出下圖,
四,評論數(shù)量與時間分析
讀取reviews文件的時候可以直接把date的類型進行轉換
對時間序列進行相關處理
reviews['year']=reviews['date'].dt.year reviews['month']=reviews['date'].dt.month查看下年份的分布情況:
reviews.groupby('year').size()
可以看的出,評論的數(shù)量在每年遞增,知道2018年到頂峰,2019年有所下降。
說明用戶的活躍度也越來越高。
我們再按照月份來分:
得到
可以看出,4到7月用戶的活躍度最高。
再做一個折線圖,把歷年評論數(shù)量整合在一起。
把歷年評論數(shù)整合在一個表格
然后把2016到2019的代碼整合到一張圖
我們可以很方便地從圖中看出各年評論的數(shù)量趨勢
五,預測房間價格
首先我們可以看下影響房間價格的因素
清理完異常值后,分割特征值和目標值
from sklearn.preprocessing import StandardScaler #分割特征值和目標值 features = ml_listing.drop(columns=['price']) targets=ml_listing['price'] features.head()處理完成后,進行one-hot編碼和標準化
#對特征值進行處理 #針對離散型數(shù)據(jù)進行one-hot編碼 disperse_columns = ['host_is_superhost','host_identity_verified','neighbourhood_group_cleansed','property_type','room_type','is_business_travel_ready' ] disperse_features = features[disperse_columns] disperse_features = pd.get_dummies(disperse_features)# 對連續(xù)性數(shù)據(jù)進行標準化(因為特征值之間相差并不是很大,所以標準化的可能對預測結果影響不是很大) continuouse_features = features.drop(columns=disperse_columns) scaler = StandardScaler() continuouse_features = scaler.fit_transform(continuouse_features) continuouse_features對處理后的特征值進行組合
#對處理后的特征進行組合 feature_array = np.hstack([disperse_features,continuouse_features]) feature_array導入模型,進行預測
from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_absolute_error,r2_scoreX_train,X_test,y_train,y_test = train_test_split(feature_array,targets,test_size=0.25) regressor = RandomForestRegressor() regressor.fit(X_train,y_train) y_predict = regressor.predict(X_test)print("平均誤差:",mean_absolute_error(y_test,y_predict)) print("R2評分:",r2_score(y_test,y_predict))預測結果
R2評分越接近1,結果越準確。
六,評論數(shù)量預測
評論數(shù)量分析用到reviews數(shù)據(jù)集
可以得出平均誤差與R2值
R2值很接近1,證明這個模型很很合適。
代入2019年10到12月的值
得到的就是預測值,分別是array([18252.94, 18020.23, 17785.06])
再把新的值代入可視化
predict_reviews = pd.DataFrame([[2019,10+index,x] for index,x in enumerate(y_predict)],columns=['year','month','count']) final_reviews = pd.concat([ym_reviews,predict_reviews]).reset_index() years = final_reviews['year'].unique()fig,ax = plt.subplots(figsize=(10,5)) for year in years:df = final_reviews[final_reviews['year']==year]sns.lineplot(x="month",y='count',data=df)ax.legend(labels=year_month_reviews.index) ax.grid() _ = ax.set_xticks(list(range(1,13)))得到
至此,愛彼迎的數(shù)據(jù)分析算是完成了
總結
以上是生活随笔為你收集整理的爱彼迎的数据分析与建模的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1019.礼物
- 下一篇: position: sticky