2021-06-17 ~ 2021-10-30,因為 591 實施漸進式改版,改變資料讀取方式,導致這段時間遺失部份資料。
本文將說明改版影響範圍、資料遺失的補救方式,並附上詳細解釋、原始資料,以及代辦事項。
簡單說明與結論
2021-06 ~ 2021-10 、2021-Q2 ~ 2021-Q4 的資料集,因為部份皆有部份資料遺失,因此:
- 出租屋件的數量統計,並不準確,特別是 2021-10 與 2021-Q4 ,目前尚未找到合理的推估方式,建議避免使用
- 出租屋件的各欄位的分析,除了上述的兩個區間外,皆可使用,因為有機會可以反應母體。
- 若想進一步確認資料的代表性,歡迎認領這張票。
- 2021 全年資料,除了遺失少數僅存在於 2021-06 ~ 2021-09 的物件,導致總數稍微減少外,針對各欄位的分析,皆可進行。
物件缺失的資料集:
月份 | 每月資料總數 | 每月推估總數 | 推估資料遺失率 |
---|---|---|---|
2021-06 | 117,610 | 125,145 | 6.02% |
2021-Q2 | 320,459 | 335,516 | 4.49% |
2021-07 | 105,880 | 162,794 | 34.96% |
2021-08 | 102,071 | 161,559 | 36.82% |
2021-09 | 88,452 | 162,060 | 45.42% |
2021-Q3 | 226,115 | 371,042 | 39.06% |
建議避免使用的資料集:
- 2021-10
- 2021-Q4
可使用的資料集:
2021-11 之後,以及 2021 全年資料
背景資訊
資料格式改版的影響
2021-06-17 ~ 2021-10-30,因為 591 實施漸進式改版,改變資料讀取方式,導致這段時間遺失部份資料。以下將以「新版格式」、「舊版格式」,區分 591 在這次改版中,不同出租屋件資料形式。
- 舊版格式:
- 只的是原本的物件格式,從 06-17 後佔比逐漸降低,並在 09-27 後正式淘汰
- 舊版格式以 HTML
- 新版格式:
- 指的是改版後的物件格式,從 06-17 開始出現,從一開始的佔比 35% ,一直到 09-26 的 40% ,並在 09-27 後,所有出租物件皆改以新版格式呈現
- 新版格式以 JSON 為主
在這次的改版中,雖然租屋物件清單的讀取方式不變,但由於物件詳細資訊的新舊版格式的擷取方式完全不同,造成爬蟲機器人「抓得到租屋清單,以及清單中附帶的少數欄位,但卻找不到詳細資訊」的狀況。
根據當時的程式碼,在租屋清單中,爬蟲機器人會儲存以下欄位如下:
- 交易與物件基本資訊
- 物件編號
- 租屋平台
- 物件網址
- 物件首次發現時間
- 物件最後更新時間
- 縣市
- 鄉鎮市區
- 物件硬體資訊
- 物件類型
- 坪數
- 所在樓層
- 建物樓高
- 價位資訊
- 月租金
對定期資料的影響
時間方面,則可分為「潛伏期」與「重建期」:
- 潛伏期:
- 2021-06 ~ 2021-09 ,由於此時尚未發現 591 開始改版,加上資料匯出的程式,會自動去除資訊不完整的物件,因此這四個月,包含 2021 第三季的資料,都少了大約 35% 的資料。
- 重建期:
- 在九月底發現問題後,新版爬蟲機器人,於 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-04 | 1,829,567 | 6,696,154 | 10,841,110 | 10,836,530 |
2021-05 | 1,531,998 | 6,696,154 | 10,961,914 | 10,961,449 |
2021-06 | 197,629 | 6,696,154 | 11,073,536 | 11,073,359 |
2021-07 | 160,181 | 6,696,154 | 11,218,672 | 11,216,467 |
2021-08 | 435,377 | 6,696,154 | 11,363,468 | 11,361,174 |
2021-09 | 274,518 | 6,782,265 | 11,499,636 | 11,479,023 |
2021-10 | 274,518 | 6,696,154 | 11,642,009 | 11,639,971 |
2021-11 | 3,376,273 | 11,018,452 | 11,784,011 | 11,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;
從上述兩者可以發現:
- 新版編號的最小值不穩定,但舊版則相反
- 已經被標為舊版格式的物件,就會維持舊版
- 已被標為新版格式得物件,就會維持新版
- 新舊版物件的最大值皆逐漸遞增
- 可見新物件並非一定皆為新版或舊版格式
- 但新版的最大值總是比舊版大,但不確定是因為被關掉了,還是因為是新版格式
- 可由每月的「新版數量:舊版數量」,回推當月刊登物件總量
- 因為物件的資料版本確定後,就不會再變化,且已知每日新舊版本的物件數量、每月舊版物件數量後,可回推每月刊登物件總數
以下為逐日累計的每月新版格式佔比(十月資料全部重爬,不適用上述觀察):
月份 | 逐日累計(A) | 逐日舊版累計(B) | 逐日舊版佔比( C) | 每月舊版總數(D) | 每月推估總數(E) | 推估資料遺失率(F) |
---|---|---|---|---|---|---|
2021-04 | 1,844,504 | 1,798,596 | 97.5% | 159,625 | 159,493 | |
2021-05 | 1,791,941 | 1,744,461 | 97.4% | 148,522 | 148,645 | |
2021-06 | 1,428,470 | 1,170,267 | 91.6% | 117,610 | 125,145 | 6.02% |
2021-07 | 1,709,516 | 1,083,291 | 63.4% | 105,880 | 162,794 | 34.96% |
2021-08 | 1,828,386 | 1,125,476 | 61.6% | 102,071 | 161,559 | 36.82% |
2021-09 | 1,745,074 | 927,989 | 53.2% | 88,452 | 162,060 | 45.42% |
2021-11 | 1,795,469 | 1,766,897 | 98.4% | 161,330 | 163,939 | |
2021-Q2 | 5,064,915 | 4,713,324 | 93.1% | 320,459 | 335,516 | 4.49% |
2021-Q3 | 5,282,976 | 3,136,756 | 59.4% | 226,115 | 371,042 | 39.06% |
各欄的關係如下:
- C = B / A
- D 為既有每月匯出程式跑出的結果,因為內建過濾不完整的物件,所以只會留下舊版格式的物件
- E = D * Average(四月 C, 五月 C) / C
- F = (E - D) / E
若想取得逐日的資料,請參見此試算表。
針對此次問題的避免方式
如同在這篇文章提到的,除了 591 改版外,會發生這次歷時 5 個月,而且造成無法修補的問題,是由於多重因素疊加後的結果,並非可以簡單避免的問題。
針對這樣的情況,目前已經進行的處理是:
- 將爬蟲機器人的邏輯取出,成為獨立的模組,方便修改以及增加公車係數
- 更新網站架構,並設計新的爬蟲架構,讓它更容易自動化
- 把爬蟲搬到較有管理彈性的地方
儘管如此,由於 ddio 接下來還是有各種想做的事,無法專職維護這個資料集,因此除了盡力確保爬蟲機器人的健康狀態外,並無法確保所有問題,都能馬上得到解決。
新版的爬蟲,從 2021-11 運作至今,已經將近一年,目前為止尚未發現其他重大問題,但為了使專案能夠持續運作,也歡迎對於資料狀況、爬蟲狀況自動監測有興趣的人,來聯絡 ddio,或是到 Github提議。