【数据分析实战】基于python对Airbnb房源进行数据分析
文章目錄
- 📚引言
- 📖數據加載以及基本觀察
- 📃缺失值觀察及處理
- 🔖缺失值觀察以及可視化
- 🔖缺失值處理
- 📃異常值觀察及處理
- 📖數據探索
- 💡哪個區域的房源最受歡迎?
- 💡哪種房型最受歡迎?它們的價格怎么樣?
- 💡最受歡迎的房源和最不受歡迎的房源有什么特征?
- 📍總結與展望
📚引言
🙋?♂?作者簡介:生魚同學,大數據科學與技術專業碩士在讀👨?🎓,曾獲得華為杯數學建模國家二等獎🏆,MathorCup 數學建模競賽國家二等獎🏅,亞太數學建模國家二等獎🏅。
??研究方向:復雜網絡科學
🏆興趣方向:利用python進行數據分析與機器學習,數學建模競賽經驗交流,網絡爬蟲等。
自2008年以來,客人和房東利用Airbnb擴大了旅行的可能性,并提出了一種更獨特、個性化的體驗世界的方式。
通過Airbnb提供的數百萬個房源的數據分析是該公司的一個關鍵因素。這些數以百萬計的房源產生了大量的數據其可以被分析并用于安全、商業決策、了解客戶和供應商(房東)在平臺上的行為和表現、指導營銷舉措、實施創新的附加服務等等。
基于上述背景和數據,我們本次主要解決下面幾個問題:
- 哪個區域的房源最受歡迎?
- 哪種房型最受歡迎?它們的價格怎么樣?
- 最受歡迎的房源和最不受歡迎的房源有什么特征?
本項目中的數據來源于Kaggle開放數據New York City Airbnb Open Data鏈接如下:
Kaggle-New York City Airbnb Open Data
需要的小伙伴可以自行下載獲取。
📖數據加載以及基本觀察
在進行數據加載之前,我們首先對數據的各個列進行解釋,具體情況如下表所示:
| id | 掛牌編號 |
| name | 掛牌名字 |
| host_id | 主人編號 |
| host_name | 主人名字 |
| neighbourhood_group | 房屋所在區域 |
| neighbourhood | 房屋具體地區 |
| latitude | 經緯度 |
| longitude | 經緯度 |
| room_type | 房間類型 |
| price | 價格 |
| minimum_nights | 最少的預定夜數 |
| number_of_reviews | 評論數 |
| last_review | 最新評論 |
| reviews_per_month | 每月評論數 |
| calculated_host_listings_count | 主人擁有房屋的數量 |
| availability_365 | 可供預訂的天數 |
在開始編碼之前,請先確保你已經安裝了對應的包,本文所用的包如下:
import pandas as pd import missingno as msno import seaborn as sns在這一步中,我們將加載數據并且調用pandas中的基本函數對數據進行初步的觀察。加載數據代碼如下:
data = pd.read_csv('AB_NYC_2019.csv') data.head()結果如下:
在加載數據過后,我們需要對數據進行初步的認識與觀察,這里我們調用**info()和describe()**函數來對數據進行初步的觀察。代碼和結果如下:
結果如下:
注意:在這一步中,我們觀察到圖中紅圈標記的數據存在一定的缺失情況,這在后續的操作中需要進行處理。
接著,我們調用**describe()**進行數據的進一步觀察,代碼如下:
data.describe()結果如下:
注意:在這里,我們已經發現了一個異常,這里的minimum_nights表示的是最短租賃時長。然而,它的最大值已經超過了365,我們后續需要留意。
📃缺失值觀察及處理
🔖缺失值觀察以及可視化
在發現缺失值后,我們需要對缺失值進行有針對性的觀察和處理,我們首先對其進行提取以及可視化的操作。首先提取所有缺失的列以及它們缺失的個數情況,代碼如下:
missing_data = data.isnull().sum() missing_data = missing_data[missing_data > 0] missing_data結果如下:
可以看到,在名字以及主人名字方面存在一定的缺失,關于評論的缺失情況比較明顯且多,我們后面會進行有針對性地處理。
接下來我們對其進行可視化,在這里我們會使用缺失值可視化庫以及柱狀圖來進行可視化,代碼如下:
# 對數據進行采樣 sample_data = data.sample(1000) # 可視化 msno.bar(sample_data)結果如下:
另外,我們也可以用柱狀圖來進行可視化,代碼如下:
結果如下:
🔖缺失值處理
在處理缺失值之前,我們首先要進行分析。
主要缺失的值有上述四列,我們對其的分析以及處理方案如下:
- name :房屋名稱,無關緊要的列,準備刪除。
- host_name :主人姓名,無關緊要的列,準備刪除。
- last_review :最新的評論,如果該房屋不存在評論,那么這列一定為0,所以準備將其刪除,保留下面的每月評論。
- reviews_per_month:保留,對缺失值填充0。
上述操作的代碼如下:
# 刪除了['id','host_name','last_review']三列 data.drop(['id','host_name','last_review'], axis=1, inplace=True) # 用0填充'reviews_per_month'為Nan的數據 data.fillna({'reviews_per_month':0}, inplace=True)📃異常值觀察及處理
在上面的分析中,我們觀察到了minimum_nights的異常情況,在這里我們使用箱線圖對其進行可視化觀察,代碼如下:
data['minimum_nights'].plot.box()結果如下:
我們可以觀察到,紅色標記的部分即是可能的異常值,我們對其進行處理。代碼如下:
# 將該列大于365的數據改為365 data.loc[data['minimum_nights'] > 365, 'minimum_nights'] = 365📖數據探索
在本節中,我們將從數據出發進行合理的探索,得出一些結論。
💡哪個區域的房源最受歡迎?
在這個問題的探索中,我們將從兩個角度考慮問題,即評論越多證明房屋的歡迎程度越高,與此同時可用天數越少證明房屋越火爆。我們首先來看看數據中有幾個不同的地區,代碼如下:
# 探究有幾個不同的地區 data.neighbourhood_group.unique()結果如下;
然后我們分別對針對評論數以及年度可用天數進行分組組成新的數據,代碼如下:
兩個數據所組成的新表如下:
我們可以看到,不論是從年度可用天數還是評論數目來說,Brooklyn的房屋都是最受歡迎的,接下來我們利用可視化來進行更直觀的觀察,代碼如下:
結果如下:
這樣來看,結果就比較容易觀察到了。基于上述分析,我們得出以下結論:
- Brooklyn不論是從年度可用天數還是評論數目來說,都能證明其是最受歡迎的地區。
- Brooklyn的平均年度可用天數為100左右,而其房屋評論數目的總和達到了486574的最高評論數。
- Manhattan緊隨其后,受歡迎程度與Brooklyn相近,但是其不如Brooklyn受歡迎。
💡哪種房型最受歡迎?它們的價格怎么樣?
在本節中,我們將要探索那種房子的類型最受歡迎,以及他們的價格特點。
首先,我們從全部地區的角度來觀察不同房型的受歡迎程度以及其平均的價格如何。我們將要建立房型與價格、評論數目、可用天數的表格并進行可視化,代碼如下:
# 建立房型與價格的表 price_room_type = data['price'].groupby(data['room_type']) price_room_type_data = pd.DataFrame(price_room_type.mean()) # 建立房型與評論數的表 reviews_room_type = data['number_of_reviews'].groupby(data['room_type']) reviews_room_type_data = pd.DataFrame(reviews_room_type.sum()) # 建立房型與可用天數的表 availability_365_room_type = data['availability_365'].groupby(data['room_type']) availability_365_room_type_data = pd.DataFrame(availability_365_room_type.mean()) # 將上述表合并 popular_type_value = pd.concat([availability_365_room_type_data,reviews_room_type_data,price_room_type_data], axis=1) popular_type_value['room_type'] = popular_type_value.index popular_type_value.reset_index(inplace=True,drop=True) popular_type_value結果如下:
為了更直觀的進行分析,我們對其進行可視化。代碼如下:
結果如下:
可以看出,Entire home/apt在所有的房屋類型中,所有的方面來說都是最火爆的。
接下來,我們將從不同的地區分別建立透視表進行進一步的分析與探索。
我們分別構建評論數目,地區,房間類型的透視表、年度可用天數與房間類型,地區的聯系表、價格與房間類型,地區的聯系表。
具體代碼如下:
# 構建評論數目,地區,房間類型的透視表 sum_reviews_pivot = data.pivot_table('number_of_reviews', index='neighbourhood_group', columns='room_type', aggfunc='sum')結果如下:
然后我們對其進行可視化,代碼如下:
結果如下:
我們同樣將其與年度可用天數,和價格構建透視表,然后進行可視化,代碼和結果如下:
結果如下:
根據上述分析,我們可以得出以下結論:
- 在所有的地區總體來看,Entire home/apt都是最受歡迎的房型,但是其平均價格也是最貴的,在211左右。
- 在Brooklyn和Manhattan這兩個地區,Entire home/apt都是最受歡迎的房型,但是在其他地區情況略有不同。
- 從價格來看,Manhattan的Entire home/apt是最貴的,均價在249左右。而Brooklyn相對便宜,在178左右。
💡最受歡迎的房源和最不受歡迎的房源有什么特征?
為了解決本節的問題,我們首先要把最受歡迎的房子和最不受歡迎的房子提取出來并且利用**describe()**查看我們所關心的信息,代碼如下:
top_10 = data.sort_values(by='number_of_reviews', ascending=False).head(10)結果如下:
通過**describe()**進行初步觀察的結果如下:
我們發現,價格數據以及最短居住時間的數據仿佛和平均值有一定的差異,我們從完整的數據取出其值并進一步對照觀察。
我們先來看全局的價格平均值與最歡迎的平均值的對比,代碼和結果如下:
# 全局數據各房型價格的平均值 data['price'].groupby(data['room_type']).mean() # 最受歡迎的數據各房型價格的平均值 top_10['price'].groupby(top_10['room_type']).mean()全局數據各房型價格平均值如下,結果如下:
最受歡迎的10個房型價格平均值如下:
我們發現最受歡迎的10個房型價格比平均值偏低。
進一步的,我們對照其最小居住時長。代碼和結果如下:
data['minimum_nights'].groupby(data['room_type']).mean() top_10['minimum_nights'].groupby(top_10['room_type']).mean()全局數據各房型價格平均值如下,結果如下:
最受歡迎的10個房型價格平均值如下:
我們發現最受歡迎的10個房型最小居住時長比平均值偏低。
類似的,我們在最不受歡迎的十個房間中也發現了相反的情況,由于篇幅限制本文不再展示過程,感興趣的朋友可以自己試試看。
基于上述數據,我們得出結論:
- 最受歡迎的房間,通常價格比平均價格低并且其最短居住時間會很小。
- 上述情況存在一定的可解釋性,即大部分的游客或者居住者都是旅行者,其更容易接受價格實惠允許短時間居住的房間。
- 最不受歡迎的房子,通常價格比平均價格高很多,并且其最短居住時間過長。
- 基于上述內容,房子持有者可以通過下調房間價格至平均值下或者進一步減小居住時長來提高房子的居住率。
📍總結與展望
在本文中,我們基于Airbnb房源進行了數據分析,并從多種角度對其展開了探索性的工作。這對于養成數據分析習慣有很大的幫助,在實際工作或者學習中還需要不斷練習。
感興趣的朋友們可以自己按照上述步驟進行操作,或在評論區與我討論。
需要源碼的朋友可以私信我進行索取,我們下次再見。
總結
以上是生活随笔為你收集整理的【数据分析实战】基于python对Airbnb房源进行数据分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 单源最短路径问题——分支限界法(Java
- 下一篇: websocket python爬虫_p