← Career advice
Advice Columnist

天文台的理想與現實

天文台的理想與現實

香港天文台的預測經常令你失望?是你的心理作用,還是這台的預測真的有偏差?

我們會在有誤差的時候埋怨,但天文台也可以為自己辯解,聲稱其他日子其實也很準確,到最後雙方都好像不夠說服力。這一回,我決定利用 Web Scraping,配合 d3.js ,透過 Visualisation 和數據,讓大家都把誰是誰非一眼看通透!!!(如對程式沒有興趣,可直接拉到最後看結果)

十年不更新的格式

很多朋友初學 Web Scraping,多半都是到天文台抓取資料。而筆者則在十多年前已經開始嘗試抓取天文台的資料,為自己的桌面作一個小型「我的天文台」。

不過,每一位曾經抓取天文台資料的朋友,必然會發現,香港天文台的資料並不方便電腦處理。天文台在自己的網站 (https://rss.weather.gov.hk/rss_uc.html) 和政府的「資料一線通」網站 (https://data.gov.hk/) 都公開了讓程式讀取的資料位置,但你能夠拿到的東西,卻與「純文字版」沒太大分別。例子如下:

 

<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="flwc.xsl" type="text/xsl" ?><rss version="2.0">
<channel>
<title>本港地區天氣預報</title>
<link>http://www.weather.gov.hk/wxinfo/currwx/flwc.htm</link>
<description>本港地區天氣預報</description>
<language>zh-tw</language>
<webMaster>[email protected]</webMaster>
<copyright>本檔案的內容,包括但不限於所有文本、平面圖像、圖畫、圖片、照片以及數據或其他資料的匯編,均受版權保障。香港特別行政區政府是本檔案內所有版權作品的擁有人。</copyright>
<image>
<url>http://rss.weather.gov.hk/img/logo_dblue.gif</url>
<title>本港地區天氣預報</title>
<link>http://www.weather.gov.hk/</link>
</image>
<item>
<guid isPermaLink="false">
      http://rss.weather.gov.hk/rss/LocalWeatherForecast/20190503000000</guid>
                        <pubDate>Thu, 02 May 2019 16:00:00 GMT</pubDate>
<title>香港天文台於2019年05月03日00時00分發出之天氣報告</title>
<category>F</category>
<author>香港天文台</author>
<link>http://www.weather.gov.hk/wxinfo/currwx/flwc.htm</link>
<description><![CDATA[
一股清勁至強風程度的偏東氣流昨日影響廣東沿岸。本港昨日多雲,早晚有幾陣驟雨,新界多處地區錄得超過5毫米雨量。預料該偏東氣流會在今明兩日繼續影響廣東沿岸。<br/><br/>
本港地區(五月三日,星期五)天氣預測:<br/>大致多雲,有幾陣驟雨。日間驟雨逐漸減少,短暫時間有陽光。氣溫介乎21至25度。吹和緩至清勁偏東風,離岸間中吹強風。<br/><br/>
展望: 星期六部分時間天色明朗,亦有一兩陣驟雨。隨後數天驟雨增多及有狂風雷暴。 ]]></description>
</item>
</channel>
</rss>

 

這個模樣的報告,根本和電台的講稿一模一樣!我們用程式沒辦法輕易找得出會下雨或是不會下雨,還要用 XML 格式,對於某些初學者來說,可能比在純文字版本找東西更多了一重處理 XML 的障礙,尤其近年來,XML 在一般大眾中的應用越來越少。

幸好,天文台使用的字眼十年如一天,我發現每逢天文台預測下雨的時候,總會以「有…雨」來形容,或者提及最挑動大家情緒的「狂風雷暴」。例如「稍後時間有幾陣雨」、「早晚有一兩陣驟雨」或「有狂風雷暴」。於是,我們便可以利用 Regular Expression,把這些字眼,以一兩行程式碼便抽取出來:

 

let match = result.forecast.match(/本港地區今日天氣預測:<br\/>(.*?)<br\/>/);
let heavyRain = match[1].match(/狂風雷暴/)
let rain = match[1].match(/有[^有雨]*?雨/)

 

我們把這四個月的資料整合,發現天文台只有四種形容方法:「有微雨」,「有驟雨」,「有雨」和「狂風雷暴」。

玩更多 Regular Expression: https://regexr.com/

歷史預測

既然有了方法拆解預測,那麼過往的預測又能怎樣拿到呢?

一般來說,如果沒有在過去的時間把資料儲存下來,那麼過去的資料就找不回來了。也是說,若然沒有其他來源之下,你希望找回過去每一天的天文台早上預報,是沒有可能的,你唯有從今天開始每一日妥善儲存到自己的電腦或雲端上。

那麼我們要不要等數個月才有結果?!不用怕,原來政府自 2017 年開始在 data.gov.hk 提供歷史數據,其實就是政府幫我們一直儲存著這些資訊,可以按每小時抓取過往四個月的天文台的天氣預報。

話說回來,政府的開放數據一直都是為人詬病,這次也不會令大家「失望」!在我們查找的過程中,發現兩個問題

  1. 縱然看起來數據是每小時記錄一次,但這個「每小時」的間距並不保證準確!正常時候是整點 (07:00, 08:00, 09:00…),偶然會失常早一分鐘遲一分鐘甚至誤差十數分鐘!(07:01, 07:47, 08:30…)
  2. 在找天文台數據時,2018-12-07 09:00 至 2019-01-01 08:00 的歷史記錄不見了,難道是那數十天負責的同事放假去了旅行⋯⋯?

 

所以,我們這次的調查只能覆蓋一至四月了。

實際的降雨量: 降雨量竟然有 API

來到這裡,我們手頭上已經拿到足夠的「天氣預報資料」,而實際降雨量方面,原本打算在「每小時降雨量」配合傳統的 HTML 拆解方法 (利用 cheerio 或 BeautifulSoup) 把每小時不同地區的降雨量抓下來。

不過,偶然發現原來天文台有一個「每日數據摘錄」,完整收集了自 1884 年起計的每一日的總雨量記錄。而且,這個頁面更是以 Client-side Rendering 的方式顯示,換句話說,即是資料來源是有 API 可攝取,大大方便了我們作分析工作。

只可惜預報方面缺少了部份歷史數據,更沒有以往年代的預報,否則我們更可以比較古今天文台的準繩度!(照道理應該是越來越準確吧!)

調查結果

萬事俱備,這次我們用 d3.js 把降雨和預測資料,用月曆的方式顯示出來。

從上表中可以看到,一月二月未踏入香港的雨季,實際上有雨的日子並不多。不過,苦口婆心的天文台,幾乎不間斷地提醒大家有微雨或驟雨,二月份更加只有七日沒有預報有雨。在「狂風雷暴」的警示下,只有 4 月 19 日達 75 毫米,其他日子的降雨量並不多,最極端的「狂風雷暴日」 4 月 26 日只有 0.9 毫米降雨量。似乎這結果和我們的想法都符合————天文台預測下雨但其實都不大機會下雨!

反過來看,雖然天文台經常令我們白白帶了傘外出,但在天文台預測沒雨時日子,幾乎全部都真的是沒雨和極微雨(只有 0.2 毫米)!即是說,如果你當天發現天文台的預測沒有提及任何「雨」的字眼,你可以十分放心把雨傘放在家中。

然而,只是數日子好像不夠科學。其實我們更可運用 Confusion Matrix 和統計數據,更清晰看得出以上的結論。

 

 

單單是看 Accuracy,我們能指出天文台的準繩度是 70%,但這樣的說法並不夠仔細。因為

Precision 的計算的方法是 (True Positive) / (True Positive + False Positive),即計算天文台預測有雨的日子中,有多少天是真的有下雨,而得出的數字是 0.57,換句話說即是 當天文台話有雨,只有 57% 機會真的下雨!

而 Recall 則是 (True Positive) / (True Positive + False Negative),即計算實際有雨的日子中,有多少天是天文台有成功預測到的,這次運算達到 94%,代表實際很少情況下,會在天文台沒有預測的時候下雨起來, 當天文台說沒雨,很少機會是真的下雨 。要留意的是,如果每天都說會下雨,其實 Recall 可以達到 100% 的。所以縱然有 94% Recall,配合 57% Precision 來分析,其實就是代表天文台總是偏向預測會下雨,讓大家「有備無患」。

後記:還有更多改良空間

今次為了簡化起見,把降雨量的資料依賴了「每日數據摘錄」,不過,假若降雨記錄只是發生在淩晨 00:00 至早上 08:00 這個時段,其餘時段沒有雨,而天文台又預計當天會下雨的話,其實也算是錯誤的預計!既然我們這次的調查,看得出天文台總是常常預測有雨(Precision 的比率十分低),假若剛才的情況(清晨有雨,日間沒雨)經常發生的話,這個統計是錯誤地推高了天文台的準確率呢!

還有,我們把 0.1 毫米或以上的雨量也當作是有下雨(幾乎是幾滴雨!),我相信帶了雨傘的大家一定不會認為天文台是預測準確。

所以,其實這次對天文台是手鬆了很多呢。

✦✦✦
不論是什麼年紀,追求自己所喜愛的事情而決定重頭開始並沒有錯。假如您希望投身於科技行業,讓GetLinks陪伴您走過路上的每一步吧!

Keep reading

Related career advice

【職場心理學】上司話你唔夠狠,下屬話你唔撐佢哋——做中層,你係人肉避雷針
Advice Columnist

【職場心理學】上司話你唔夠狠,下屬話你唔撐佢哋——做中層,你係人肉避雷針

Head count凍結,上司call你入房話:「你自己諗辦法。」 下屬問你年加幾多,你知道答案,但唔敢講。高層宣布新政策,問有冇問題,你笑住話「冇」,但你心裡清楚返去個部門一定炸鍋。績效review,你要寫低屬下嘅不足,但寫嗰陣你係唔舒服嘅,因為佢哋真係有盡力。開完會,上司叫你「帶領好個team嘅方向」,但連你自己都唔知方向係邊。 你夾喺中間,上唔到、落唔得。 高層嫌你執行力唔夠;下屬覺得你唔夠幫佢哋發聲;HR話你要做好榜樣;另一半問你點解又係咁夜返屋企。某一日,你喺東鐵線車廂裡,有個陌生人跟你對眼笑咗一下——你差啲想喊。 有時喺輔導工作中,我遇到嘅中層 manager,坐低嘅第一句往往係:「我唔知自己係咪做錯咗啲乜。」 你以為係你管理技巧唔好?唔係嘅。喺心理學入面,呢個叫「情緒勞動」(Emotional Labor)——即係持續壓抑或管理自己嘅真實情緒,去配合組織對你嘅形象要求(Hochschild, 1983)。做中層嘅人,每日都要演一場無劇本嘅戲:對上管理期望、對下管理情緒、對外管理形象——而你自己嘅感受,係冇位置擺嘅。 長期嘅情緒勞動,係職場 burnout 最常見、又最容易被忽視嘅根源之一。 就好似一架升降機嘅緩衝彈簧——佢嘅功能係吸收衝擊、保護兩邊。但如果長期超重、冇保養,彈簧遲早會斷。 緩衝係你份工嘅一部分,但唔代表你要用自己嘅身心做消耗品。 有一個有用嘅覺察練習:每個星期,寫低三件「唔係我份工、但我一直係咁做緊」嘅事。唔係叫你即刻唔做,而係讓自己知道——你嘅邊界喺邊,你係幾時開始一點一點失去自己嘅。 覺察,係改變嘅第一步。 做中層嘅你,好少被讚,好少有人問你「你點呀」。 今日,我想問你:你點呀? 唔使答得好好聽。只係停一停,不加批判地承認:「係,我最近好攰。」 呢份誠實,係你對自己最大嘅善意。你唔係一個齒輪,你係一個人。 參考資料Hochschild, A. R. (1983). The managed heart: Commercialization of human feeling. University of California Press.Kahn, R. L., et al. (1964). Organizational stress: Studies in role conflict and ambiguity. Wiley.

升職加薪後,為何很多人反而更焦慮?
Advice Columnist

升職加薪後,為何很多人反而更焦慮?

上月專欄談到,在裁員、縮編及經濟不確定性下,職場人士需要建立「財務韌性」,讓自己即使面對收入中斷,仍然保有生活與選擇的空間。 但有趣的是,最近接觸不少客戶時,我發現另一個現象:有些人明明升了職、加了薪,甚至晉升管理層,焦慮感卻沒有減少,反而愈來愈重。 按常理推算,收入增加應該帶來更多安全感,為何現實往往相反?問題很多時不在收入,而在生活模式。 收入增加了,壓力卻沒有減少 曾有一位四十多歲的管理層客戶,十年間薪酬幾乎翻倍,由月入四萬元增至接近八萬元。表面看來事業發展理想,但當我們一起檢視財務狀況時,卻發現他的壓力比十年前更大。 原因很簡單。收入增加後,他換了更大的住宅,供款增加;子女升讀國際學校,教育開支上升;家庭旅遊、保險及生活消費亦同步提高。結果雖然收入增加了一倍,但每月可自由運用的現金流卻沒有明顯改善。 更重要的是,他開始不敢轉工。因為一旦收入出現空檔,整個家庭開支結構都可能受到影響。這種情況在中產及管理層人士之間其實相當普遍。 高收入,不等於高安全感 近年有一個財務規劃概念稱為「生活膨脹」(Lifestyle Inflation),意思是當收入增加時,支出亦同步上升,結果財務自由度未有真正改善。 從職涯管理角度來看,這亦是一種風險。不少人以為職場安全感來自更高薪酬或更高職位,但真正的安全感,很多時來自保留選擇權。 當你有能力拒絕不適合的工作、可以接受短暫轉型期、甚至有空間進修或探索新的職涯方向時,你才真正掌握主動權。相反,如果每月開支已完全依賴當前收入水平,即使職位再高,也可能陷入「不能停、不能轉、不能錯」的壓力循環。 那麼,升職加薪後應如何避免陷入這種情況?我認為有三個值得思考的方向。 第一,讓收入增長快於生活成本增長。 每次加薪後,未必要即時提升所有生活開支。把部分新增收入轉化為儲蓄、投資或退休規劃資產,長遠往往比單純增加消費更有價值。 第二,建立與收入無關的資產。 無論是投資組合、強積金、自願性供款,甚至其他長期資產,本質上都是將今天的工作收入轉化成未來的選擇權。 第三,定期檢視自己的「財務自由度」。 問自己一個簡單問題:如果今天失去工作,現有資源足夠支撐多久?答案未必需要非常充裕,但至少應讓自己擁有重新規劃下一步的時間。 職場發展當然重要,但我認為衡量成功不應只看職位高低或薪酬數字。真正值得追求的,或許不是賺得更多,而是在收入增加的同時,仍然保留選擇人生的能力。因為高薪不一定等於自由,而能夠掌握選擇權的人,往往才擁有真正的安全感。

【IT事務所】駕馭未知的浪潮:企業在持續進化的 AI 時代下的道德標準與管治之道
Advice Columnist

【IT事務所】駕馭未知的浪潮:企業在持續進化的 AI 時代下的道德標準與管治之道

在數位經濟與人工智能技術高速發展的今天,企業正面臨一場前所未有的技術變革。隨著大型語言模型與自主智能體(Agentic AI)的持續進化,企業在享受自動化與生產力提升的同時,也無可避免地遭遇了複雜的道德與管治(Governance)難題。若缺乏完善的監管框架,AI 的失控不僅可能引發公關危機與合規風險,更可能損害企業的長期競爭力。因此,深入理解並建立具備韌性的 AI 管治機制,已成為現代企業不可迴避的戰略核心。 企業在引入 AI 時首當其衝的挑戰便是算法偏見與歧視。AI 模型的輸出品質高度依賴於其訓練數據,若歷史數據本身潛藏社會偏見,AI 系統便會不加思索地放大並延續這些不公。以人力資本管理為例,曾有跨國企業開發 AI 簡歷篩選系統以加速招聘流程,卻發現系統因過去十年的技術職位多由男性擔任,進而「學會」對包含女性特徵詞彙的簡歷給予較低評分。這種情況若發生在銀行或保險業的信貸審批上,將對特定族群造成系統性歧視,進而引發嚴重的合規風險與潛在的金融爭議。 另一個不容忽視的難題是深度學習模型的「黑箱」特質與透明度不足。即使是系統開發者,往往也難以確切解釋 AI 是如何推導出特定結論的。在醫療健康診斷、保險理賠評估或金融爭議處理等需要高度問責與精確性的領域中,這項缺陷尤為致命。若 AI 系統拒絕了客戶的理賠申請或作出了不利的決策,企業卻無法向大眾與監管機構提供清晰的邏輯解釋,這將嚴重摧毀消費者信任。因此,「可解釋性 AI」(Explainable AI)的發展與應用,對於推動技術落地至關重要。此外,在日常營運中,員工若在未經授權的情況下使用面向公眾的生成式 AI 工具,極易在不知不覺中輸入企業機密或客戶的敏感數據,這凸顯了防範數據隱私與商業機密外洩的迫切性。 面對上述挑戰,企業必須摒棄僵化的政策,轉而建立一套動態且跨部門的 AI 管治框架。AI 的應用早已超越單一資訊科技部門的範疇,企業應籌組涵蓋技術、法務、合規、人力資源及業務代表的專責委員會,共同制定符合企業核心價值觀的 AI 使用政策。同時,企業必須實施分級風險評估機制,針對不同應用場景採取差異化管理。例如,用於撰寫一般行銷文案的低風險系統可採常規監管;但涉及客戶信用評分、自動化醫療決策等高風險領域,則必須強制進行嚴格的「偏見審計」,並確保人類在決策流程中保留最終決定權。 在技術部署與企業文化層面,企業應積極引入私有化與企業級的 AI 解決方案,透過安全的隔離環境處理敏感數據,從根本上阻絕資料外洩的風險。然而,技術的防護仍需配合持續的內部審查與教育訓練。由於 AI 模型會隨著時間推移產生「數據漂移」(Data Drift)導致預測失準,企業必須定期對系統進行回溯測試。更重要的是,管治不僅是限制,更是賦能。企業應致力培養全體員工的數位素養,教導他們識別輸入敏感資訊的風險,並學會批判性地評估 AI 生成的結果,而非盲目信賴。 總結而言,在數位轉型的浪潮中,AI 的管治與道德標準絕非阻礙創新的絆腳石,而是企業實現永續發展(Sustainability)的堅實護城河。一間能夠負責任地運用 AI、嚴格保障數據隱私並確保算法公平性的企業,將能在未來競爭激烈的市場中贏得深厚的社會信任與品牌價值。唯有將「道德設計(Ethics by Design)」的理念深深植根於 AI 應用的每一個環節,企業方能在這場持續進化的技術革命中穩健前行。

天文台的理想與現實 | CPJobs Career Advice