爱彼迎数据分析
簡單的python愛彼迎數據分析
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns導入需要的庫
1.calender數據集分析
導入數據集并查看
首先將價格轉換為為浮點數
可以看到3.4月淡季價格較低,78月暑假10月國慶價格較高.
周五周六價格較高.
分析一下價格占比
排除一些異常值后,可以看出條形圖呈右偏分布.大部分房屋價格都在200-400元左右
2.listings數據集分析
修改金額列的數據類型
選取對價格影響較大的特征進行分析
對數據集的處理:
將價格和小費轉換成浮點數格式,將小費空值填充為0,與最小居住天數聯合計算最低消費
根據設施集計算設施數量.listings[‘amenities’].str[1:-1].str.split(’,’).apply(len)
新增一個列,根據可容納人數給房屋分類.pd.cut
將需要的特征單獨提出來組成一個新的df
共有三種房間的類型
查看房屋類型占比
可以看到公寓形的整租占了60%,私人房屋占了35%,多人同住一屋只占了不到6%
排名第一的是朝陽區,這里房源最多,其次是東城區和海淀區,但是這兩個都只有朝陽區的三分之一左右
查看戶主名下房源數量的分布
擁有一套房子的戶主占了60%,兩套房子的戶主有15%,3-4套占了12%
由上圖可以看出,8成的人只占了不到40%的房源.剩下2成的人占了超過一半的房源,比較符合二八法則
3,reviews數據分析
reviews = pd.read_csv(r'C:\Users\12435\Desktop\shujufenxi\數分清華\aibiying\reviews_detail.csv',parse_dates=['date']) reviews.head() reviews['year'] = reviews['date'].dt.year reviews['month'] = reviews['date'].dt.month n_reviews = reviews.groupby('year').size() sns.barplot(n_reviews.index,n_reviews.values) reviews.date.max() month_reviews = reviews.groupby('month').size() sns.barplot(month_reviews.index,month_reviews.values)
可以看到23月春節,78月暑假,10月國慶評論量都比較多,56月沒有假期,評論量比較少
從上圖可以看出,評論量其實一直都是保持同一增速平穩平穩上升的,每年年初的評論數與上年年末的評論數幾乎持平,一直處在波動上升的階段.只有一小部分時間會發生下降的情況,如2018年的2,3月,2017年的9,10月,需要結合當時的業務進行分析
4.預測房間價格
ml_listings = listings[listings['price']<300][['host_is_superhost','host_identity_verified','neighbourhood_cleansed','latitude','longitude','property_type','room_type','accommodates','bathrooms','bedrooms','cleaning_fee','minimum_minimum_nights','maximum_maximum_nights','availability_90','number_of_reviews',#'review_scores_rating','is_business_travel_ready','n_amenities','price' ]] ml_listings.dropna(axis = 0,inplace=True) ml_listings.isnull().sum() from sklearn.preprocessing import StandardScaler #分割特征值和目標值 features = ml_listings.drop(columns=['price']) target = ml_listings['price'] #對特征值進行處理 #對離散型數據進行one_hot編碼 disperse_columns = ['host_is_superhost','host_identity_verified','neighbourhood_cleansed','property_type','room_type','is_business_travel_ready' ] disperse = features[disperse_columns] disperse = pd.get_dummies(disperse) #對連續性數據進行標準化(因為連續性數值相差不大,所以對預測結果影響可能不大) continuouse_features = features.drop(columns = disperse_columns) scaler = StandardScaler() continuouse_features=scaler.fit_transform(continuouse_features) #處理后的數據進行組合 feature_array = np.hstack([disperse,continuouse_features]) #使用線性回歸模型進行預測 from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_absolute_error,r2_score xtrain,xtest,ytrain,ytest = train_test_split(feature_array,target,test_size = 0.3) line = LinearRegression() line = line.fit(xtrain,ytrain) ypredict = line.predict(xtest) print('平均誤差',mean_absolute_error(ytest,ypredict)) print('R2誤差',r2_score(ytest,ypredict))平均誤差 3009977153.5992937
R2誤差 -5.155611729394443e+18
0.39684796601257405
使用隨機森林進行預測,效果不好
5,評論數的預測
ym_reviews = reviews.groupby(['year','month']).size().reset_index().rename(columns={0:'count'}) feature = ym_reviews[['year','month']] target = ym_reviews['count']cross_val_score(regressor,feature,target,cv=6).mean() xtrain,xtest,ytrain,ytest = train_test_split(feature,target,test_size=0.3) regressor = RandomForestRegressor(n_estimators = 100) regressor.fit(xtrain,ytrain) ypredict = regressor.predict(xtest) print(mean_absolute_error(ytest,ypredict)) print(r2_score(ytest,ypredict))170.16655172413795
0.9863879670160787
預測2019年之后幾個月的評論數
a=list() for i in range(5,13):a.append([2019,i]) regressor.fit(feature,target) y_predict = regressor.predict(a) ypredict = pd.DataFrame([[2019,5+index,x] for index,x in enumerate(y_predict)],columns = ['year','month','count']) final_reviews = pd.concat([ym_reviews,ypredict],axis = 0).reset_index() years = final_reviews['year'].unique() fig,ax = plt.subplots(figsize=(15,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))) plt.show()
這里可以看出來,預測的2019年4月之后的評論數保持略微上漲的趨勢,不太符合之前的推測.
總結
- 上一篇: 本地数据库IndexedDB - 学员管
- 下一篇: 27-JAVA scanner类与某些快