資料科學入門:以 CRISP-DM 探討 Airbnb 房源價格

Chenyu Tsai
UXAI
Published in
8 min readSep 28, 2020
https://www.langan.com/locations/boston-massachusetts

本篇文章會以 CRISP-DM 的方法來分析 Boston Airbnb 資料集,從最基本的商業問題出發,一步步從資料中挖掘出能夠解決對應問題的解答,假如你剛好有機會要去 Boston 玩,甚至是在 Boston 擁有一個自己的 Airbnb 出租房源,都能夠從文章中介紹的方法來得到一些 insight。

程式碼實作:GitHub

CRISP-DM

CRISP4-DM 是 Cross Industry Standard Process for Data Mining 的簡寫,名字看起來很潮,但就是利用資料來處理商業問題。

CRISP-DM 有六個步驟:

  1. Business Understanding
  2. Data Understanding
  3. Data Preparation
  4. Modeling
  5. Evaluation
  6. Deployment

接下來我們就會依這六個步驟來處理 Boston Airbnb 這份 dataset:

1. Business Understanding

首先我們先對這份房源資料集提出三個問題:

在哪個期間,房源的價格會比較高?

在這個資料集中,有一份名為 calendar.csv 的資料,這份資料記錄了在 2016-2017 年,所有房源的營運狀況及價格,我們應該可以在這份資料回答這個問題。

  • 決定房源價格的因素為何?

在 listings.csv 中,總共有 95 列跟房源相關的資訊,像是 summary, overview, neighbourhood, review_rating 等等,都有可能是影響房價的因素,我們可以透過模型來找出這些因素。

  • 該如依自身狀況發展策略?

看我們是要去 Boston 旅遊或是在 Boston 擁有自己的一個 Airbnb,從上述兩個分析的結果,都可以得出一個應對的策略。

2. Data Understanding

首先我們先來看 calendar.csv 這份表格內的內容,從表格內容可以看到紀錄了房源的供應狀況及價格。這個表格中的資料筆數為 1308890,其中有紀錄價格(有售出)的筆數為 665853,透過這樣的資料我們就可以分析出在一一整年當中,整體房源售出的狀況為何,價格和銷售的相關性如何。

在 listings.csv 中紀錄了各式各樣的房源細節,以下我們簡單分類一下並說明我們會怎麼挑取 feature,我挑選的 feature 不一定就是能夠決定房間價格的關鍵,我只是提供了一個角度來切入預測房源價格:

  • 房源身份:像是一些 id、 連結、爬取時間和圖片等東西的連結,這部分資訊我們之後不會用到。
  • 房源地點:房源在哪個國家、哪個州、哪個社區還有經度緯度等資訊,這部份我們主要是使用社區這個 feature,因為房源都是來自 Boston,能夠作為變因的只有他所在社區。
  • 文字資訊:像是房源摘要、概觀、描述、社區概觀、注意事項、規定等等,都是透過整段文字的方式來描述,我們也會用簡單的方法來處理這部分資料然後餵進去模型中。
  • 房源主資訊:像是房源主是不是 super host,是不是有放照片、擁有幾個房源等等,這邊比較有用的資訊應該是房源主是否為 super host。
  • 房況:如有哪些房間、能夠容納幾人、床型等,這邊可能都會對價錢有一些影響。
  • 評價:住客針對各個不同細節的評價,我們在這裡挑比較能提供整體評價資訊的分數,其他像是對整潔度或是 checkin 手續之類的評價就不納入。

3. Data Preparation

在 data preparation 的部分,我們主要的準備程序有:

  • 挑選出我們要觀察的 feature
  • 確認是否有 missing data, outlier 等等,並進行處理
  • 資料清洗以便餵入模型
  • 文字部分處理

我們先處理第一個問題「在哪個期間,房源的價格會比較高?」,用以下方法來處理資料:

  1. 將 ‘price’ 中的 NaN 以 0 代替
  2. 價格是以 '$1,175.00' 這種形式的字串紀錄,我們將其中的正確金額取出
  3. 剃除 outlier,有個簡單方法是以 Tukey’s Rule 來剃除,這邊我們設一個閥值 300 (約莫是平均價格的 2 倍)來過濾掉金額太高的房源
  4. 將 'availability' 的 t, f 轉為 1, 0
  5. 萃取出時間並以月份做分群,我們將兩個資料以月做分群,一是 availability,二是 price,因為我們只關心房源在賣出時的價格,在以 price 分群之前我們會先剃除價錢為 0 的房源,以免影響到平均價格。

Availability

在上圖我們可以看到一整年的房況變化,變化最明顯的地方在每年 9 月,房源迅速的降低,也就是來到 Boston 租房的人變多了!於是好奇查了一下為和 9 月是 Boston 的旅遊旺季,原來當地在 9 月的氣候最舒適,還有龍蝦在這時候最好吃

Price

在價格的趨勢圖我們可以看到,在房源需求大的 9 月,價格也隨著水漲船高,我們也簡單的計算了一下房源供應狀況和房源價格的相關度,兩者的相關度為負值,及代表房源供給下降時,房源價格提升。

接下來我們來進行第二個問題「決定房源價格的因素為何?」的準備,因為這個表格中一共有 95 個欄位,我們不會一一列出我們對哪些欄位進行哪種處理。我們以以下程序來處理送入模型前的資料:

  1. 移除我們不需要的欄位,大部分是沒辦法幫助價格建模的資料像是房源 id,資料的連結,重複的或多於的資料等
  2. 處理文字型資料,這邊我們僅用簡單的 NLP 處理方式,在每個欄位上,我們把所有的文字做剃除 stopwords, tokenize, stem 和 lemmatize 後計算所有文字出現的頻率,在從中取出最常出現的 20 個,和每個列中的文字做兩者交集聯集計算
  3. 將以 t, f 做紀錄的欄位改為 1, 0
  4. 因紀錄金額方式和前面相同,我們也需要萃取出金額
  5. 以平均值補足一些數值欄位的 NaN 值
  6. 為 categorical 欄位做 dummy variables
  7. 將 ‘amenities’ 中的設施及設備取出並製作 dummy variables
  8. 剃除潛在的 outlier,取和前面相同的閥值 $300

前面的部分比較工程一點,同時也是在做相關工作最花時間的地方(想從事這行的要想清楚!),所以把整個過程放上來的話會佔相當多的篇幅,若是對怎麼處理這些資料有興趣的話請至 GitHub 配此文觀看,這邊我們直接看建模後的結果。

4. Modeling, Evaluation, Deployment

這邊我們利用最基本的線性回歸(Linear Regression)來進行建模,直接來看建模結果,其中 R2 Score 約莫為 70,我們挑出幾個比較有趣的 feature 來看看。

Neighbourhood

在圖中我們可以看到,在不同的 neighbourhood 確實對價格有所影響,且差距還不小,簡單 google 一下,可以發現排行在前面的多位於市中心,而後面的區域多在近郊。

Text Data

上圖我們可以看到文字相關資料和價格之間的關係,雖然還是有高低之分,但是相較於社區,文字和價格之間的相關度較低,社區最高為 94,文字資料最高為 14,不過我們可以看到最高是 house_rules,意味著價錢比較高的房源,他的規定也比較多。 當然我們處理文字 feature 的方法很 naive ,所以沒辦法蓋棺論定價格和文字資料沒有太大關係,不過誰又會在文字敘述上說自己的物件很差呢?

Amenities

接著我們來看一下房源的設施,從圖中可以看和價錢相關度最高的還是一些比較剛性的需求,像是停車相關、冷暖氣和電視等。

最後我們來看一下和價格最有相關的前 20 名,我們可以看到主要決定價格的還是房源所在的區域,其次是房型,有一個比較特別的是第三位,cancellation_policy_super_strict,這在其中的取消政策是最嚴格的,價錢比較高的房源,他的取消訂單難度比較高、限制比較多也是非常合理的。

結論

這次文章所使用的資料集是一個相對較小的資料集,在整理和清洗上不是太複雜,是一個初入資料科學的人很好使用的資料集,同時歸納出的現象也是離真實情境較近的現象。接著該來回答最後一個問題啦「該如依自身狀況發展策略?」,假如是要去 Boston 玩的人,8 月可能是個好選擇,氣候跟龍蝦應該不會和 9 月差太遠,房價也比較低。那若是想要在 Boston 擁有自己的 Airbnb,最主要還是挑對地方拉,位置選對了剩下的都好處理!

--

--