Upgrade to Pro — share decks privately, control downloads, hide ads and more …

網頁爬蟲技術於人力資源管理的應用

 網頁爬蟲技術於人力資源管理的應用

時間: 2024-6-16 0900-1200 & 1300-1600
講師: 游騰林(tlyu0419)
Mail: [email protected]
學校: 大葉大學
課程: 管院跨領域課程
教材: https://github.com/tlyu0419/dyu_python_workshop
摘要:
網路爬蟲是一項自動化收集資料的技術,能自動從目標網站上收集資料,對於企業的人力資源管理上具有重要的幫助,可以協助HR的專業人員快速收集市場上的職缺資訊,提供企業制定/調整具有競爭力的薪酬策略
在這次的活動中我將以 CakeResume 人力銀行網站為例,說明如何開發網路爬蟲程式,從網站上自動收集大量的職缺資料。並透過這些職缺資料建立職缺的薪資預測模型,以及後續的應用方式
希望透過這次的分享讓大家了解如何開發網路爬蟲程式以及建置模型的流程與細節,並實際應用在人力資源管理領域中

tlyu0419

June 17, 2024
Tweet

More Decks by tlyu0419

Other Decks in Programming

Transcript

  1. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 •

    網路爬蟲是一項自動化收集資料的技術,能自動從目標網站 上收集資料,對於企業的人力資源管理上具有重要的幫助, 可以協助HR的專業人員快速收集市場上的職缺資訊,提供企 業制定/調整具有競爭力的薪酬策略 • 在這次的活動中我將以 CakeResume 人力銀行網站為例, 說明如何開發網路爬蟲程式,從網站上自動收集大量的職缺 資料。並透過這些職缺資料建立職缺的薪資預測模型,以及 後續的應用方式 • 希望透過這次的分享讓大家了解如何開發網路爬蟲程式以及 建置模型的流程與細節,並實際應用在人力資源管理領域中 大葉大學 管院跨領域課程 June 16, 2024 網頁爬蟲技術於人力資源管理的應用 #Python #網路爬蟲 #職缺薪資預測 游騰林(tlyu0419) 騰林是來自國泰金控的資料科學家,先後在電信業和 金融業服務,有超過 8 年的數據分析、機器/深度學 習模型的實務經驗 喜歡透過資料科學技術動手解決現實世界中的問題多 過於理論研究。閒暇之餘也會在各大技術年會分享實 踐後的踩坑經驗 心中理想的工作形態是擔任顧問,透過分享資料科學 的專案經驗與技術,協助企業提升經營成效
  2. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 Outline

    • 介紹 HR 業務場景 • 網路爬蟲技術應用 • 職缺薪資預測 • 介紹網路爬蟲進階技術 • QA 2
  3. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 HR

    在組織的功能 3 Ref: 台灣就業通 - 找人才 -- HR的工作是什麼?人資必備的6大職能 - 人資專欄 規劃企業的組織架構和人力配置 協助用人單位招募 甄選人才加入公司 規劃企業內、外部訓練課程 提升專業能力、工作品質與效率 協助建立良好正向的員工關係, 增加員工對公司的歸屬感與信任感 根據人力資源預算制定薪酬制度 激勵員工提升業績,保留優秀人才 協助各部門制定職務KPI與考核辦法 識別並拔擢優秀人才職位升遷
  4. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 HR

    在組織的功能 4 Ref: 台灣就業通 - 找人才 -- HR的工作是什麼?人資必備的6大職能 - 人資專欄 有機會透過數據技術協助 HR 業務的地方 規劃企業的組織架構和人力配置 協助用人單位招募 甄選人才加入公司 規劃企業內、外部訓練課程 提升專業能力、工作品質與效率 協助建立良好正向的員工關係, 增加員工對公司的歸屬感與信任感 根據人力資源預算制定薪酬制度 激勵員工提升業績,保留優秀人才 協助各部門制定職務KPI與考核辦法 識別並拔擢優秀人才職位升遷
  5. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 企業教育訓練

    5 文本轉語音(text-to-speech) 將文本轉換為語音,減少人工錄製教材的製作成本 根據文本自動生成提問 • 國泰金控的英文名稱是什麼? • 國泰金控於西元幾年成立? • ….
  6. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 招募優秀人才

    6 比對文本相似度 比對 履歷 與 職缺描述 的符合程度, 幫助用人單位快速找出符合條件的求職者
  7. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 員工關係建立

    7 Ref: aptien.com/en/kb/articles/what-is-employee-lifecycle 員工離職原因 • 薪資 • 年資 • 發展機會 • 職務異動 • … 離職預測模型 建立機器學習模型 預測員工於是否會於一定時間內離職
  8. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 薪資福利規劃

    8 影響薪資的內部因素 • 職位對公司的價值 • 職位需要的技能與證照 • 工作表現和績效 • 公司的獲利狀況 • 人才稀缺度和招聘難度 影響薪資的外部因素 • 市場薪資水平 • 通貨膨脹率 • 勞動法規 • 人才供應狀況 薪資預測模型 根據公司、勞動市場的內外部因素 幫不同職位設定符合行情的薪資標準
  9. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 HR

    真實的業務痛點 • 面對公司的 人才招募 與 慰留 需求,HR 缺乏可靠、有依據的參考資料 9 身為資料科學家,可以怎麼幫 HR 解題?
  10. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 期望產出

    10 假設有個神秘的薪資公式存在, 這個公式能根據職務狀況和求職者的條件估算的薪資水準 透過實際建立模型來檢視這個公式的準確度與價值 薪資 = 學歷 + 技能 + 產業 + 職務 + 職階 + 年資 + … • 國中 • 高中 • 大學 • 研究所 • … • 專案管理 • 程式語言 • 簡報製作 • 使用者體驗 • … • 科技業 • 金融業 • 遊戲業 • 餐飲業 • … • IT • HR • 業務 • 客服 • … • 實習 • 初階 • 中階 • 高階 • 經營層 • … • 工作年數(公司) • 總工作年數 • …
  11. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 Outline

    • 介紹 HR 業務場景 • 網路爬蟲技術應用 • 職缺薪資預測 • 介紹網路爬蟲進階技術 • QA 12
  12. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 資料源評估

    – 104人力銀行 • 104 人力銀行上的職缺薪資大多寫面議,沒有具體的薪資範圍 13 Ref: 產業、應用與待遇 - Python 在勞動市場中的職缺分析 產業、程式語言的待遇在 4萬 以上的職缺比例 待遇面議 待遇面議
  13. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 資料源評估2

    – CakeResume 14 Ref: Amazon、LINE都在這徵才——CakeResume用什麼贏得新世代求職者的心? 具體的薪資範圍 豐富的職缺數量 跨各產業與職階 Cakeresume 是新興的求職平台, 一方面協助求職者製作精美的履歷, 另方面也幫助企業搜尋人才 目前網站已有上萬份職缺資料, 其中又以 IT, 金融的職缺較多
  14. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 人力銀行職缺說明

    15 • CakeResume 求職網站的資料樣貌 • 職缺名稱, 公司名稱, 職缺內容, 產業大小類, 工作年資, 薪資, 地區, … • 活動目標 • (上午) 開發網路爬蟲程式抓取 CakeResume 的職缺資料 • (下午) 透過職缺資料建立薪資預測模型
  15. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 •

    網路爬蟲是透過程式取代瀏覽器自動收集資料的技術 • 藉由爬蟲程式能將收集/剖析/整理資料的流程自動化,讓工作變得省時省力 什麼是網路爬蟲 16 request response 電腦/手機 瀏覽器 網站伺服器 Chrome, Edge, FireFox, … Python, R, ….
  16. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 觀察網站架構

    • 打開 CakeResume 的網站並搜尋「管理」關鍵詞的職缺 • https://www.cakeresume.com/ • 嘗試進行以下的觀察 1. 每個分頁顯示多少個職缺? 2. 這類職務共有多少個分頁的資料? • 點擊下一頁的時候網址發生了什麼變化? • 會有頁數上限嗎? 3. 如果有上限,有辦法看到完整資料嗎? 4. 怎麼判斷是否還有更多資料? 17
  17. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 每個分頁顯示多少個職缺?

    18 在搜尋框中查詢 “管理”關鍵詞的職缺 計算後每個分頁有10筆資料
  18. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 這類職務共有多少個分頁的資料?

    19 隨著頁數的切換, 網址列中的 page 參數也會隨著變動 反覆點擊下一頁後(或直接將網址列的page 參數改為100) 當頁數到100後就無法加載更多資料(即使還有更多職缺)
  19. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 如果有上限,有辦法看到完整資料嗎?

    20 由於查詢結果的上線是 100個分頁 我們可以細分查詢的條件,分批查詢後再事後整併資料 管理 >> 軟體管理 / 行銷管理 / 經營管理 / … 當我們設定查詢結果時 網址列中的查詢參數也會隨之變動
  20. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 怎麼判斷是否還有更多資料?

    21 如果切換分頁後的職缺少於10筆,表示沒有更多資料了, 這時候就可以切換至另一個職務類別繼續爬蟲
  21. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 觀察網站架構

    • 打開 CakeResume 的網站並搜尋「資訊人員」關鍵詞的職缺 • https://www.cakeresume.com/ • 嘗試進行以下的觀察 1. 每個分頁顯示多少個職缺? 2. 這類職務共有多少個分頁的資料? • 點擊下一頁的時候網址發生了什麼變化? • 會有頁數上限嗎? 3. 如果有上限,有辦法看到完整資料嗎? 4. 怎麼判斷是否還有更多資料? 22 Code
  22. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 觀察網站架構

    • 打開 CakeResume 的網站並搜尋「資訊人員」關鍵詞的職缺 • https://www.cakeresume.com/ • 嘗試進行以下的觀察 1. 每個分頁顯示多少個職缺? >> 10 2. 這類職務共有多少個分頁的資料? >> 27 • 點擊下一頁的時候網址發生了什麼變化? >> 網址會隨著切換頁數一起變動 • 會有頁數上限嗎? >> 上線為100頁,但這類職缺未達上線 3. 如果有上限,有辦法看到完整資料嗎? >> 透過職類、地區、產業等條件進行細分 4. 怎麼判斷是否還有更多資料? >> 頁面中未達10筆資料表示無更多資料 23 Code
  23. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 CakeResume

    網站的爬蟲策略 24 • (非必要) 輸入職缺的關鍵詞 • 當資料量超過 100 個分頁時需要細分查詢條件再事後整併資料 • 當資料筆數小於10表示沒有更多資料,可以切換至下一個職務類別接續爬蟲 • 開發資料剖析程式,將每次查詢的結果轉為結構化的資料
  24. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 爬蟲眼中的世界

    25 漂亮畫面的背後是半結構化的 xml 資料 而要開發的剖析程式就是要從中抽取我們需要的資料
  25. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 開發資料剖析程式

    • 打開 CakeResume 的網站 • 搜尋「管理」關鍵詞的職缺 • 設定職務類別為 軟體 – 全選 • https://www.cakeresume.com/ • 嘗試進行以下的練習 1. 使用 Python 發送資料請求 2. 透過 開發者工具 定位 職缺資訊區塊 3. 開發資料剖析程式 4. 功能測試 5. 加載更多頁數的資料 6. 怎麼收集不同的職務代號? 7. 剖析職務條件的資訊 8. 保存資料 26
  26. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 使用

    Python 發送資料請求 27 將網址列複製進 Python 中, 透過 requests 模組來請求資料
  27. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 透過

    開發者工具 定位 職缺資訊區塊 28 職缺資料放在 div class="JobSearchHits_list__3UtHp" 下 而該元素下有 10 個 div 的子元素,就是各個職缺的資料
  28. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 開發資料剖析程式

    • 練習定位以下 5 項資訊 • 職缺名稱&職缺連結 >> • 公司名稱&公司連結 >> • 職務說明 >> • HashTags >> • 職務條件 >> 29
  29. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 開發資料剖析程式

    • 練習定位以下 5 項資訊 • 職缺名稱&職缺連結 >> job.find('a', {'data-algolia-event-name':'click_job'}) • 公司名稱&公司連結 >> job.find('a', {'data-algolia-event-name':'click_page'}) • 職務說明 >> job.find('div', {'class':'JobSearchItem_description__si5zg'}) • HashTags >> [t.text for t in job.select('div.Tags_wrapper__UQ34T > div')] • 職務條件 >> job.select('div.JobSearchItem_features__hR3pk > div') 30 Code
  30. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 開發資料剖析程式

    • 封裝程式 • 輸入: 單筆 job 資料 • 輸出: 列表,分別包含以下資訊 [職缺名稱, 職缺連結, 公司名稱, 公司連結, 職務說明, HashTags, 職務條件] 31 練習將上面定位到的程式放入函數中 Code
  31. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 開發資料剖析程式

    32 完成剖析程式後就能將 jobs 中的職務依序放入函數中取得 需要的資訊囉
  32. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 功能測試

    33 只要切換開頭的網址就能取得職缺資訊 練習將 page 改為不同的數值 看看能不能拿到不同的資料 Code
  33. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 加載更多頁數的資料

    34 將網址參數化 每次請求間隔 1 秒鐘的時間 透過調整 range 的數量,就可以控制要爬多少職缺的數量
  34. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 加載更多頁數的資料

    35 前面的程式執行成功後會看到 90 筆資料 如果沒有看到90筆資料的話要回頭檢查哪裡寫錯了 Code
  35. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 怎麼收集不同的職務代號?

    36 搜尋關鍵詞: profession 要翻一下裡面的內容, 接著就能找到不同職類的 代號與職缺數量
  36. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 怎麼收集不同的職務代號?

    37 將職類代號做替換即可抓取不同職類 的職缺資訊 Code 練習將 it 替換為hr 並抓取20個分頁的職缺資訊
  37. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 剖析職務條件的資訊

    38 剖析職務條件的兩個難處 1. 數量不固定 2. 元素標籤名稱相同
  38. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 剖析職務條件的資訊

    39 雖然不太明顯,不過仔細看還是會發現 不同的職務條件的元素名稱會有些微差異!
  39. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 剖析職務條件的資訊

    40 職務條件是以list存於 欄位中 有幾項條件就會有多少個內容
  40. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 剖析職務條件的資訊

    41 Explode 函數會將 list 做行轉列的展開, 原先第0筆職缺有5個職務條件, 展開後會變成 5 個 row,每列一項職務條件 Pivot函數則反過來將列轉行 藉此抽取出不同職務的屬性
  41. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 剖析職務條件的資訊

    42 Fa-user 中分別包含了3項資訊, 依序為招募人數、職類以及職務等級 透過 split 抽取和剖析資料 Code
  42. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 剖析職務條件的資訊

    43 透過 index 整併兩張資料表 1. 原始的職務名稱&描述 2. 職務條件 Code
  43. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 保存資料

    44 Excel 容易編輯但容易遇到非 法字元導致儲存錯誤。 當資料量超過 104 萬 筆後的資料會被丟棄 Parquet 保存資料的同時也同步 做資料壓縮,增加讀寫 資料的速度 另外也同步留存資料的 格式,避免資料讀寫後 欄位格式變動 Csv 需設定切割欄位的字元, 否則讀取資料時會誤將 文本中的逗號當成切分 欄位的符號
  44. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 綜合練習

    • 找到職業類別為 業務 的英文代號 • 將業務的工作都抓下來 45 Code
  45. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 綜合練習

    • 找到職業類別為 業務 的英文代號 >> sales • 將業務的工作都抓下來 >> 大約 992 筆資料 46 Code
  46. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 Outline

    • 介紹 HR 業務場景 • 網路爬蟲技術應用 • 職缺薪資預測 • 介紹網路爬蟲進階技術 • QA 48
  47. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 49

    職缺薪資預測目標 特徵工程 時間與品質 效度與解釋性 特徵工程在做什麼? 又應該要怎麼做? 清理資料需要投時間 但該怎麼權衡時間與品質? 模型是越準越好嗎? 什麼情況下反而不想模型這麼準?
  48. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 模型建置流程

    50 搜集資料 資料預處理 模型建置 效度評估 解析 特徵工程 • 數值變數 • 類別變數 • 文本資料 資料清理 探索性分析 依據任務目標選擇 分類/回歸模型 檢視模型效度 是否達到業務需求 檢視模型的重要變數 並與業務端對接應用 從資料庫/網路爬蟲 的方式搜集資料 錯誤分析: 根據模型犯錯的地方回頭調整資料/模型內容
  49. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 CakeResume

    的職缺資料 • CakeResume 職缺資料集 • https://github.com/tlyu0419/dyu_python_workshop/cakeresume_20240609.parquet • CakeResume 上的職缺資訊(23317 rows * 14 columns) • job_name • comp_name • job_desc • job_tags • profession • fa_business_time • fa_dollar_sign • … 52
  50. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 資料清理邏輯

    • 排除條件 • 職務類型: 排除兼職、實習類型的職缺 • 薪資: • 排除 日薪、時薪、論件計酬 • 排除 沒有寫薪資 的職缺 (空值/只寫4萬以上) • 排除 非台幣計價 的職缺 • 職務描述: 排除 沒有寫職務描述 的職缺 • 地區: 排除不在台灣的職缺 • 排除後還剩 15,949 筆職缺資料 • 以 職務類別 做分層隨機抽樣 • 並以 80% / 20% 的比例切分訓練/測試資料 53
  51. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 目標變數的處理邏輯

    • 目標變數 • fa-dollar-sign >> mean_salary • 處理方式 • 取薪資範圍的中間數作為模型的目標變數 • 處理目標變數時會遇到的問題 • 有些職缺的單位是千,有些是萬 • 有些職缺是寫年薪,有些是月薪 • 這裡統一將年薪除上14轉為月薪 • 有些職缺把年薪寫成月薪(或反過來) • 有些職缺只有寫在多少萬元以上 54 整理前 整理後 直接將年薪除 14 轉為月薪的方式其實有些暴力 不過這次的分享主題是 特徵工程 和 調整模型 就先請大家先略過這個問題!
  52. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 特徵工程

    55 工作年資 抽取中間的數字的資料值 不限年資則補0 管理責任 填補缺失值為 “不需負擔管理責任” 產業大類 將產業大類轉為中文 避免特殊符號 工作地點 重新分類為6都,新竹與其他縣市 有多個地區時則留第一筆資料 職階 剖析資料後取最後一項資料 Code
  53. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 探索性分析(EDA)技巧

    • 資料視覺化 • Box-plot • Scatter • Tips • x, y 軸的界限 • 透明度 56
  54. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 探索性分析(EDA)

    • 解釋變數列表 • 職缺名稱 • 公司名稱 • 職缺描述 • 職缺標籤 • 職務大類 • 職務小類 • 工作年資 • 工作地點 • 管理責任 • 職務階級 57 Code
  55. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 模型選擇

    59 • 期望 • 模型告訴我們哪些因子會影響待遇, 而各自的影響程度又有多少? • 模型 • 多元線性回歸(Linear Regression) • 用一條線來描述 X 跟 y 之間的關係 • 選線性回歸的原因 • 簡單 • 容易解釋 • 綁住大家的雙手 多元線性回歸
  56. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 初版模型效度

    • 建線性回歸模型 • formula = 'mean_salary ~ profession + work_years + location + fa_sitemap + job_lev’ • reg = sm.OLS.from_formula(formula, training_set).fit() • 模型效度 • Training • R^2: 0.073 / MAE: 33,441 • Testing • R^2: -0.500 / MAE: 38,078 • 模型內容 • 效度太差,先不著急檢視模型內容 60
  57. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 •

    R^2 在評估模型效度時,對於殘差大的樣本點會嚴重扣分! • 物理意義就是有離群的偏差,但又是什麼原因導致這麼偏差呢? 模型效度分析 61 模型高估薪資 模型嚴重低估薪資 模型低估薪資 Training Set R^2: 0.073 MAE: 33,441 Testing Set R^2: -0.500 MAE: 38,078 模型高估薪資
  58. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 •

    計算模型預測值的殘差(res),檢視模型低估的樣本(依殘差由小到大排序) • 測試性質的職缺 >> 應該排除資料 • ”不小心”把年薪寫成月薪 >> 不太容易人工識別&修正,後續可以做離群值偵測 錯誤分析 62
  59. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 •

    計算模型預測值的殘差(res),檢視模型高估的樣本(依殘差由大到小排序) • 猜測: 職缺等級清一色都是 中高階,模型可能看到這個特徵就會往上猜 >> 應該對職缺和產業做特徵交互,讓模型學習交互關係 錯誤分析 63 Code
  60. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 離群值處理

    • 到底該不該清掉離群值? • 離群值的進行方式 • 截尾 • Log2, 10, e,… • 1.5 * IQR • 9 * MAE • 3 * std • 混合: Domain + 1.5*IQR • 樣本數 • Training: 8,067 > 7,225 • Testing: 2,017 > 1,826 65 IQR*1.5 是常用的數值,可以再依需求調大/小
  61. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 去除離群值後重新建模

    • formula = 'mean_salary ~ profession + work_years + location + fa_sitemap + job_lev’ • reg = sm.OLS.from_formula(formula, training_set).fit() 66 Training Set R^2: 0.485 MAE: 10852 Testing Set R^2: 0.447 MAE: 11126
  62. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 特徵交互

    • 交互兩個或多個特徵,檢視特定變數在另一個變數不同類別上的影響力 • 假設地區變數為 4 個類別,類型變數有 2 個類別 • 會生成 “地區:類型”的新變數,包含下面 4 個資料值 • 分為 全職-北部、全職-中部、全職-南部,以及 其他(Ref) • 通過這個方式可以捕捉全職在不同地區的影響力 67 地區\類型 全職 兼職(Ref) 北部 1 0 中部 2 0 南部 3 0 東部(Ref) 0 0
  63. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 特徵交互

    formula = 'mean_salary ~ profession + work_years + location + fa_sitemap + job_lev + profession:fa_user’ reg = sm.OLS.from_formula(formula, training_set).fit() 68 特徵交互增加了許多模型的複雜度 但模型效度沒有明顯提升 Training Set R^2: 0.495 MAE: 10691 Testing Set R^2: 0.454 MAE: 10992
  64. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 為什麼特徵交互後容易出現過擬合?

    • 特徵交互後產生太多特徵,讓模型變得非常複雜,增加了應用和解釋的困難度 • 在這邊對 Profession 和 fa_user 交互後,模型增加了 76 個變數(19*4) • 這樣的處理在測試資料集的效度僅增加 0.002,因此評估不做特徵交互 69 Profession\fa_user 助理 初階 中高階 經理 經營層 生物醫療 1 2 3 4 0 建設 5 6 7 8 0 … … … … … 0 政府機關 73 74 75 76 0 業務 0 0 0 0 0 20-1(對照組)=19 5 – 1(對照組) = 4
  65. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 錯誤分析

    • 計算模型預測值的殘差,檢視模型高估的樣本 • 原因1: 工作內容超過給出的薪資導致模型高估 >> 模型不一定是錯的 • 原因2: 需要進一步抽取 職缺描述 中的資訊來加入模型 70
  66. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 錯誤分析

    • 計算模型預測值的殘差,檢視模型低估的樣本 • 發現一些業務性質的工作,會將額外的獎金納入薪資範圍中,導致薪資級距超大 >> 處理方式: 在算模型效度時忽略這些職缺,或排掉這些職缺後重新建模 71 也許模型預測出的薪資反而是更貼近真實的數字(?) Code
  67. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 業務類型的職缺

    • 針對 業務性質 的職缺,是否需要排除&重新建模? • 方法1: 僅在算效度時排除業務類的職缺 • 方法2: 排除業務類的職缺&重新建模 73 Training Set R^2: 0.500 MAE: 10574 Testing Set R^2: 0.474 MAE: 10813
  68. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 剖析職缺描述

    -職缺強調的技能 formula = 'mean_salary ~ profession + work_years + location + fa_sitemap + job_lev + pthon + javascript + linux + sql + word + excel + powerpoint’ reg = sm.OLS.from_formula(formula, training_set).fit() 74 Training Set R^2: 0.503 MAE: 10548 Testing Set R^2: 0.476 MAE: 10827
  69. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 技能清單從哪裡來?

    • 檢視 職務描述 中是否出現特定的關鍵詞 • 方法1: by Domain 新增關鍵詞 • 方法2: 通過各職缺的 Tag 來建立關鍵詞詞典 • 方法3: 對職缺描述做斷詞後轉詞頻,TFIDF • 注意事項 • 要做斷詞,不能直接下正則抓關鍵字 ex: r, c 是程式語言,容易誤抓無關的單詞 • 特定程式語言要做轉換 ex: c++, c# 的特殊符號會跟建模公式衝突 75
  70. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 抽

    Tags formula = 'mean_salary ~ profession + work_years + location + fa_sitemap + job_lev + excel + word + powerpoint + … + python + javascript + java’ 76 Training Set R^2: 0.530 MAE: 10237 Testing Set R^2: 0.505 MAE: 10507 Code
  71. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 其實還可以繼續對優化模型效度,

    但流程有些重複,今天先不在這停留 繼續優化模型效度的方式 1. 繼續做錯誤分析 2. 特徵面 • Target encoding • 葉編碼 • stacking 3. 模型面 • Tree-based model • NN 78 Target encoding 葉編碼 Stacking
  72. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 截距

    Intercept*43237 + 工作年資 work_years*3116 + 專業領域 Ref: 人資 其他*140 + 客服*-2503 + 工程研發*10759 + 建設*3389 + 政府機關*-1661 + 教育*-585 + 文字編輯*-4587 + 業務*453 + 法律*6724 + 物流貿易*-1488 + 生物醫療*3035 + 經營管理*1178 + 行銷*-1633 + 製造*3726 + 設計*1243 + 軟體*14881 + 遊戲製作*7432 + 金融*1960 + 餐飲*-6329 + 地區 Ref: 其他 台中*2114 + 台北*7796 + 台南*-1225 + 新北*4376 + 新竹*6463 + 桃園*3694 + 高雄*1452 + 管理人數 Ref: 無責任 管10-15人*3896 + 管15人以上*4445 + 管1-5人*487 + 管5-10人*2745 + 管理人數未定*2619 職階 Ref: 中高階 初階*-9670 + 助理*-10670 + 經營層*-696 + 經理*5042 + 技能 Excel*-1308 + word*-3254 + powerpoint*-1125 + photoshop*-2800 + illustrator*-2200+ Python*4592 + google_drive*-5144 + javascript*743 + java*-313 + linux*-680 + c#*-3276 + Git*2724 + mysql*722 + php*-4945 + aws*3778 + c++*7608 + android*145 + Figma*4109 + css*-1574 + c*-1658 + react*785 + node_js*1545 + vue.js*-1804 + sql*-522 + Golang*11009 + react.js*4053 + outlook*-2912 + ios*2473 + html*-2813 + asp.net*-2956 + Autocad*-1998 + backend*10503 + premiere*-1008 + mssql*-1436 + jquery*-3224 + Docker*159 + Kotlin*1141 + typescript*590 模型解析 80 雖然模型考量很多面向,但實務上好像不太容易使用qq
  73. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 當你提交程式給

    HR 後… • 精準度不是選模型的唯一標準, 還需要考量解釋性、維運…等面向 • 投入太多特徵的優缺點 • 優點 • 增加模型在訓練集的擬合程度 • 缺點 • 可能導致過擬合的問題 • 降低模型的可解釋性 81 這是個很精準的模型, 足足考量了 70 個面向 資料科學家 人資
  74. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 特徵選擇方法

    • 特徵選擇方法 • 向前 • 向後 • 向前向後 82 Ref: 【机器学习】特征选择(Feature Selection)方法汇总 透過多輪迭代,逐步增加/移除變數, 直到達成停止條件(如顯著性都小於0.05) 優先移除 x2 變數,接著用剩餘的變數重新建模和 排除不顯著的變數,直到所有剩餘變數都顯著為止 Code
  75. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 模型解析

    83 經過特徵選擇後,模型不只沒有降低在測試集的 解釋效度,反而還提升了 0.001 同時也減少了過擬合的狀況並大幅增加模型的可解釋性 截距 Intercept*33984 + 工作年資 work_years*3153 + 專業領域 Ref: 其他 客服*-3400 + 工程研發*9518 + 文字編輯*-5712 + 法律*5275 + 行銷*-2719 + 軟體*13747 + 遊戲製作*6519 + 餐飲*-6788 + 地區 Ref: 其他 台中*1719 + 台北*7306 + 新北*3917 + 新竹*6088 + 桃園*3329 + 管理人數 Ref: 無責任 管理人數未定*2297 + 職階 Ref: 助理 中高階*10814 + 初階*1027 + 經營層*11199 + 經理*16621 + 技能 Excel*-1767 + word*-3739 + photoshop*-2939 + illustrator*-2115 + python*4595 + Google drive*-5124 + c#*-3338 + git*2571 + php*-4704 + aws*3771 + C++*6662 + figma*4151 + golang*11135 + react.js*4549 + ios*2538 + Html*-3485 + asp.net*-3079 + backend*10696 + jquery*-3260 Training Set R^2: 0.530 >> 0.528 MAE: 10237 >> 10246 Testing Set R^2: 0.505 >> 0.506 MAE: 10507 >> 10499
  76. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 不足的地方

    • 技能也會有熟悉度的差異 • 但目前的資料缺少技能的年資 • 缺乏求職者自身的資訊 • 例如求職者的學歷,年齡 • 存在共線性的問題 • 如 Python 跟 R 都可以建模型,有可能會互搶回歸係數 • Ridge regression 也會有同樣的問題! 84
  77. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 Outline

    • 介紹 HR 業務場景 • 網路爬蟲技術應用 • 職缺薪資預測 • 介紹網路爬蟲進階技術 • QA 86
  78. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 進度條

    87 Ref: tqdm/tqdm: :zap: A Fast, Extensible Progress Bar for Python and CLI (github.com) • 當迴圈中的任務較多時可以使用 tqdm 的套件協助追中專案的執行進度 • 特別是爬蟲任務,動不動就需要爬上千/萬個網頁的資料
  79. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 代理伺服器

    88 Ref: US Proxy List - Free Proxy List 有些網站會透過 IP 來限制裝置的請求數量 這時候就能嘗試使用 代理伺服器 來向伺服器請求資料
  80. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 多線程加速

    • 假設你回家後有許多事情等著你處理,請問你需要多少時間才能完成這些工作? • 洗衣服1.5小時、洗米煮飯 1 小時、唸書 1小時 89 Ref: Python 多執行緒 threading 模組平行化程式設計教學 – G. T. Wang (gtwang.org) 單線程作業 多線程作業 洗衣服 洗米煮飯 唸書 3.5小時 洗衣服 洗米煮飯 唸書 1.5小時 洗衣服,以及洗米煮飯其實不花心力 處理好前置作業就可以去做別的事情 不用等前面的任務完成後才接著做下一個任務 >> 網路爬蟲的任務也是這樣, 大多數時間都在等對方伺服器回應資料, 可以開多線程同時發送多個請求來加速爬蟲的速度
  81. 游騰林 TENG-LIN YU | Mail: [email protected] NCCU - 資料視覺化工作坊 總結

    92 特徵工程 不是一次性的整理類別/數值變數, 而是要根據模型的犯錯狀況幫助模型學習 效率與品質 不是一次把資料都清理乾淨才建模型, 工作上會先做一個基本版,再接著做優化 效度與解釋性 模型效度不是選模型的唯一標準, 實務上更傾向好解釋而效果又不差的模型 了解網站架構 不同的網站有不同的互動機制與反爬蟲機制 了解網站架構藉以設定爬蟲策略 發送請求 透過開發者工具檢查發送請求的參數, 並使用 Python 向對方伺服器請求資料 剖析資料 伺服器回傳的資料通常相當繁雜, 需要花時間定位需要的資料的位置 網路爬蟲 模型建置