開放台灣民間租屋資料打包回家玩關於資料集部落格
2021 591 改版影響評估(2021-01 號爬蟲錯誤)

2021 591 改版影響評估(2021-01 號爬蟲錯誤)

2021-06-17 ~ 2021-10-30,因為 591 實施漸進式改版,改變資料讀取方式,導致這段時間遺失部份資料。

本文將說明改版影響範圍、資料遺失的補救方式,並附上詳細解釋、原始資料,以及代辦事項。

簡單說明與結論

2021-06 ~ 2021-10 、2021-Q2 ~ 2021-Q4 的資料集,因為部份皆有部份資料遺失,因此:

  1. 出租屋件的數量統計,並不準確,特別是 2021-10 與 2021-Q4 ,目前尚未找到合理的推估方式,建議避免使用
  2. 出租屋件的各欄位的分析,除了上述的兩個區間外,皆可使用,因為有機會可以反應母體。
  3. 2021 全年資料,除了遺失少數僅存在於 2021-06 ~ 2021-09 的物件,導致總數稍微減少外,針對各欄位的分析,皆可進行。

物件缺失的資料集:

月份每月資料總數每月推估總數推估資料遺失率
2021-06117,610125,1456.02%
2021-Q2320,459335,5164.49%
2021-07105,880162,79434.96%
2021-08102,071161,55936.82%
2021-0988,452162,06045.42%
2021-Q3226,115371,04239.06%

建議避免使用的資料集:

  • 2021-10
  • 2021-Q4

可使用的資料集:

2021-11 之後,以及 2021 全年資料

背景資訊

資料格式改版的影響

2021-06-17 ~ 2021-10-30,因為 591 實施漸進式改版,改變資料讀取方式,導致這段時間遺失部份資料。以下將以「新版格式」、「舊版格式」,區分 591 在這次改版中,不同出租屋件資料形式。

  1. 舊版格式:
    • 只的是原本的物件格式,從 06-17 後佔比逐漸降低,並在 09-27 後正式淘汰
    • 舊版格式以 HTML
  2. 新版格式:
    • 指的是改版後的物件格式,從 06-17 開始出現,從一開始的佔比 35% ,一直到 09-26 的 40% ,並在 09-27 後,所有出租物件皆改以新版格式呈現
    • 新版格式以 JSON 為主

在這次的改版中,雖然租屋物件清單的讀取方式不變,但由於物件詳細資訊的新舊版格式的擷取方式完全不同,造成爬蟲機器人「抓得到租屋清單,以及清單中附帶的少數欄位,但卻找不到詳細資訊」的狀況。

根據當時的程式碼,在租屋清單中,爬蟲機器人會儲存以下欄位如下:

  1. 交易與物件基本資訊
    1. 物件編號
    2. 租屋平台
    3. 物件網址
    4. 物件首次發現時間
    5. 物件最後更新時間
    6. 縣市
    7. 鄉鎮市區
  2. 物件硬體資訊
    1. 物件類型
    2. 坪數
    3. 所在樓層
    4. 建物樓高
  3. 價位資訊
    1. 月租金

對定期資料的影響

時間方面,則可分為「潛伏期」與「重建期」:

  1. 潛伏期:
    • 2021-06 ~ 2021-09 ,由於此時尚未發現 591 開始改版,加上資料匯出的程式,會自動去除資訊不完整的物件,因此這四個月,包含 2021 第三季的資料,都少了大約 35% 的資料。
  2. 重建期:
    • 在九月底發現問題後,新版爬蟲機器人,於 2021-10-28 上線,並在 10-30 & 31 兩天,全面更新所有缺乏詳細資料的刊登物件
    • 2021-10 與 2021 第四季的資料,皆包含了過去四個月的所有刊登物件,僅供此次問題分析,不建議用在租屋市場統計
    • 2021-11 開始,爬蟲恢復正常

遺失物件的輪廓推測

從物件編號分析,可發現每日找到的「新版格式」物件,散佈於所有編號中,推測 591 是將新版格式,隨機套用在不分新舊、不分是否已經刊登的物件中,因此可以假設 6-9 月的資料集中,雖然數量較小,但各類物件的分佈,有可能還是可以反應母體的。

若想進一步確認資料的代表性,歡迎認領這張票

在分析資料時,為保持邏輯一致,皆以以下 SQL 條件,作為「新版格式」的條件: where additional_fee is null and floor is not null

其中 additional_fee 是只有舊版格式才有的資料,而 floor 則是物件清單就有的資料,加上後者,是為了確定該物件為房屋物件。這樣過濾規,雖然可以確定找到新版格式的物件,但也有可能找到「最近新開啟,但又被刊登者關掉」的物件。但由於目前留下的紀錄中,無法更細第區分這兩者,因此分析時,須額外留意。

以下為 4 ~ 11 月的逐日資料中,新版、舊版物件的編號範圍(新版亦包含被關閉的物件):

月份新版-編號最小值舊版-編號最小值新版-編號最大值舊版-編號最大值
2021-041,829,5676,696,15410,841,11010,836,530
2021-051,531,9986,696,15410,961,91410,961,449
2021-06197,6296,696,15411,073,53611,073,359
2021-07160,1816,696,15411,218,67211,216,467
2021-08435,3776,696,15411,363,46811,361,174
2021-09274,5186,782,26511,499,63611,479,023
2021-10274,5186,696,15411,642,00911,639,971
2021-113,376,27311,018,45211,784,01111,782,698

另外,也使用以下 SQL ,確認被標為新版格式後,該物件是否有機會改為舊版格式,結果 count 皆為 0 :

select year, month, day, count(*) from house_ts where
  year = 2021 and month >= 7 and month <= 11 and 
  additional_fee is not null and floor is not null 
  and vendor_house_id in (
    select vendor_house_id from house_ts where year = 2021 and month = 7 and day = 10 
    and additional_fee is null and floor is not null order by vendor_house_id desc limit 10
  ) 
  group by year, month, day order by month, day;

從上述兩者可以發現:

  1. 新版編號的最小值不穩定,但舊版則相反
    1. 已經被標為舊版格式的物件,就會維持舊版
    2. 已被標為新版格式得物件,就會維持新版
  2. 新舊版物件的最大值皆逐漸遞增
    1. 可見新物件並非一定皆為新版或舊版格式
    2. 但新版的最大值總是比舊版大,但不確定是因為被關掉了,還是因為是新版格式
  3. 可由每月的「新版數量:舊版數量」,回推當月刊登物件總量
    1. 因為物件的資料版本確定後,就不會再變化,且已知每日新舊版本的物件數量、每月舊版物件數量後,可回推每月刊登物件總數

以下為逐日累計的每月新版格式佔比(十月資料全部重爬,不適用上述觀察):

月份逐日累計(A)逐日舊版累計(B)逐日舊版佔比( C)每月舊版總數(D)每月推估總數(E)推估資料遺失率(F)
2021-041,844,5041,798,59697.5%159,625159,493
2021-051,791,9411,744,46197.4%148,522148,645
2021-061,428,4701,170,26791.6%117,610125,1456.02%
2021-071,709,5161,083,29163.4%105,880162,79434.96%
2021-081,828,3861,125,47661.6%102,071161,55936.82%
2021-091,745,074927,98953.2%88,452162,06045.42%
2021-111,795,4691,766,89798.4%161,330163,939
2021-Q25,064,9154,713,32493.1%320,459335,5164.49%
2021-Q35,282,9763,136,75659.4%226,115371,04239.06%

各欄的關係如下:

  1. C = B / A
  2. D 為既有每月匯出程式跑出的結果,因為內建過濾不完整的物件,所以只會留下舊版格式的物件
  3. E = D * Average(四月 C, 五月 C) / C
  4. F = (E - D) / E

若想取得逐日的資料,請參見此試算表

針對此次問題的避免方式

如同在這篇文章提到的,除了 591 改版外,會發生這次歷時 5 個月,而且造成無法修補的問題,是由於多重因素疊加後的結果,並非可以簡單避免的問題。

針對這樣的情況,目前已經進行的處理是:

  1. 將爬蟲機器人的邏輯取出,成為獨立的模組,方便修改以及增加公車係數
  2. 更新網站架構,並設計新的爬蟲架構,讓它更容易自動化
  3. 把爬蟲搬到較有管理彈性的地方

儘管如此,由於 ddio 接下來還是有各種想做的事,無法專職維護這個資料集,因此除了盡力確保爬蟲機器人的健康狀態外,並無法確保所有問題,都能馬上得到解決。

新版的爬蟲,從 2021-11 運作至今,已經將近一年,目前為止尚未發現其他重大問題,但為了使專案能夠持續運作,也歡迎對於資料狀況、爬蟲狀況自動監測有興趣的人,來聯絡 ddio,或是到 Github提議。