新加坡地鐵環(huán)線近幾個(gè)月來發(fā)生了一系列不明原因的故障,給上千名乘客造成了困擾和麻煩。和我的大多數(shù)同事一樣,我每天早上都要搭乘環(huán)線去上班。前不久,當(dāng)我們組被任命調(diào)查故障原因時(shí),我毫不猶豫地報(bào)名參與其中。
從地鐵運(yùn)營方SMRT和道路管理局之前的調(diào)查中,我們已經(jīng)知道這些故障是由于會(huì)引發(fā)信號(hào)丟失的信號(hào)干擾所導(dǎo)致的。信號(hào)丟失會(huì)觸發(fā)列車的緊急制動(dòng)安全系統(tǒng)從而致使列車不規(guī)律地停止行駛。但是這些發(fā)生自八月份的故障看起來都是隨機(jī)發(fā)生的,這給調(diào)查組的原因排查帶來了不小的困難。
我們從SMRT獲得的數(shù)據(jù)可以提供如下信息:
·每一起故障的日期和時(shí)間
·每一起故障的發(fā)生地點(diǎn)
·故障列車的編號(hào)
·故障列車的行駛方向
我們從清理原始數(shù)據(jù)入手。我們使用的軟件是Jupyter Notebook,它是一款非常流行的用于編寫和歸檔Python代碼的工具。
—— 最基本的可視化 ——
從如下這些基本的分析處理中,我們無法確定故障的明確原因:
1.故障發(fā)生的時(shí)間遍及全天,并且早晚高峰的故障發(fā)生次數(shù)呈鏡像對(duì)稱。
2.故障發(fā)生在環(huán)線沿線多處地點(diǎn),在西部發(fā)生的次數(shù)略多。
3.信號(hào)干擾影響到多列列車?!癙V**”代表列車編號(hào)。
—— Marey圖:對(duì)時(shí)間、地點(diǎn)、行駛方向的可視化 ——
分析處理的下一步是綜合考慮多個(gè)維度的信息。我們受到Marey圖的啟發(fā),Marey圖是Edward Tufte在1983年經(jīng)典的“量化信息的可視化表達(dá)”一文中提出的。最近,Marey圖被Mike Barry和Brian Card用于波士頓地鐵系統(tǒng)的可視化項(xiàng)目中:
在這幅圖中,縱軸代表時(shí)間——從上到下按照時(shí)間順序——橫軸代表地鐵沿線各個(gè)站點(diǎn)。其中對(duì)角線代表地鐵的行進(jìn)狀態(tài)。
我們先按照我們要研究的問題畫好坐標(biāo)軸:
在正常情況下,一列從港灣站行駛至多美歌站的列車將會(huì)按照下圖的路線運(yùn)行,每一趟單程僅需一小時(shí)。我們研究的目的是在該圖中用點(diǎn)而非直線來描繪故障的發(fā)生狀況。
—— 準(zhǔn)備用于可視化的數(shù)據(jù) ——
首先,我們把由三個(gè)字母代表的站名轉(zhuǎn)化為數(shù)字:
·濱海灣至寶門廊:0至1.5
·多美歌至港灣:2至29
如果故障發(fā)生在兩站之間,我們將用0.5加上兩站中較小的數(shù)字來表示故障地點(diǎn)。舉例來說,如果故障發(fā)生在港灣(29)和直落布蘭雅(28),那么故障發(fā)生地點(diǎn)為“28.5”。這使我們?cè)跈M軸上的標(biāo)注變得簡單明了。
基于處理之后的數(shù)據(jù),我們?cè)趫D中繪制出了所有緊急制動(dòng)故障的散點(diǎn)圖。每一個(gè)點(diǎn)代表一起故障。然而,我們還是無法歸納出明確的故障發(fā)生原因。
接下來,我們加入列車行駛方向這一因素。我們用指左或指右的三角形符號(hào)來代表列車的行駛方向:
然而,它看起來還是相當(dāng)隨機(jī)。但是當(dāng)我們放大至一些局部細(xì)節(jié),一些規(guī)律似乎浮出水面:
如果你仔細(xì)研究這幅圖,你會(huì)發(fā)現(xiàn):列車故障是依序發(fā)生的。當(dāng)某一列車發(fā)生信號(hào)干擾,緊隨其后開往同一方向的列車將會(huì)很快也遭遇相同的干擾。
—— 信號(hào)干擾是如何發(fā)生的? ——
至此,我們?nèi)匀徊磺宄欠衲骋涣熊囀钦厥略獌?。我們能夠確定的是在時(shí)間和地點(diǎn)的分布上一些規(guī)律有跡可循:故障是依次交替在相反方向上發(fā)生。會(huì)不會(huì)是一些無法在數(shù)據(jù)集中體現(xiàn)的原因?qū)е逻@些故障呢?
這些假想的連接各點(diǎn)的虛線看起來與Marey圖中的直線很相似。那些沿相反方向行駛的列車會(huì)不會(huì)是造成信號(hào)干擾的原因呢?我們決定去測試一下“肇事列車”這一假設(shè)。
我們已經(jīng)知道環(huán)線每兩站之間的時(shí)間間隔大約是2-4分鐘。這意味著我們可以把四分鐘之內(nèi)發(fā)生的緊急制動(dòng)故障歸為一組。
然后,我們使用不相交的數(shù)據(jù)結(jié)構(gòu)將所有的故障事件對(duì)組合成較大的集合。這使我們能夠?qū)⒖赡芘c同一列肇事列車掛鉤的故障進(jìn)行分組。
我們把這一算法運(yùn)用在數(shù)據(jù)集上,如下是我們找出的一些歸類的集群及相應(yīng)結(jié)果:
這一結(jié)果表明:在數(shù)據(jù)集中包括的259起故障中,189起——或73%的故障——可以用“肇事列車”這一假設(shè)來解釋。這讓我們覺得我們的分析方向是正確的。
我們根據(jù)聚類結(jié)果對(duì)故障點(diǎn)進(jìn)行著色。同一顏色的三角形來自同一集群。
—— 有多少列肇事列車? ——
從前文可知,環(huán)線每一單程大約耗時(shí)一小時(shí)。我們按照正常運(yùn)行的列車Marey圖中的直線來擬合故障散點(diǎn)圖。從下圖可以清晰地看出只有一列肇事列車。
我們還可以得出:那列未知的肇事列車自身并沒有出現(xiàn)任何信號(hào)故障,因?yàn)樗]有出現(xiàn)在我們的散點(diǎn)圖中。
—— 找出肇事列車 ——
日落之后,我們前往金泉地鐵車輛段試圖找出肇事列車。由于SMRT需要更多時(shí)間來導(dǎo)出當(dāng)日數(shù)據(jù),我們無法查看列車日志的詳細(xì)記錄。所以我們決定用老式的方法,通過審查故障發(fā)生時(shí)到達(dá)和離開各車站的列車的錄像記錄。終于在凌晨三點(diǎn)鐘,團(tuán)隊(duì)發(fā)現(xiàn)了頭號(hào)嫌疑犯:PV46,一列從2015年起投入運(yùn)行的列車。
—— 驗(yàn)證假設(shè) ——
11月6日(周日),道路管理局和SMRT在非高峰期時(shí)段進(jìn)行測試來判定PV46是否是故障的源頭。測試結(jié)果表明我們是正確的——PV46確實(shí)引起了鄰近車輛的信號(hào)丟失從而觸發(fā)了那些車輛的緊急制動(dòng)系統(tǒng)。在PV46運(yùn)行之前,并沒有相關(guān)故障發(fā)生。
11月7日(周一),我們團(tuán)隊(duì)分析處理了PV46的所有關(guān)于地點(diǎn)的記錄數(shù)據(jù),發(fā)現(xiàn)從八月至十一月的95%的故障可以用我們的假設(shè)來解釋。剩下的一些案例可能是由于在正常狀況下偶發(fā)的信號(hào)丟失導(dǎo)致。
這一規(guī)律在某些日子特別明顯,例如9月1日。從下圖可以清晰地看出故障均發(fā)生在PV46運(yùn)行的時(shí)間區(qū)間內(nèi)。
—— 總結(jié) ——
當(dāng)我們剛開始調(diào)查故障原因時(shí),我的同事和我都希望能找到使跨機(jī)構(gòu)調(diào)查組感興趣的原因,這包括道路管理局,SMRT和國防科技局。由SMRT和道路管理局提供的清晰明了的故障日志給我們的調(diào)查鋪平了道路,因?yàn)槲覀儾恍枰诜治鰯?shù)據(jù)之前花費(fèi)時(shí)間和精力來清理原始數(shù)據(jù)。我們也對(duì)道路管理局和國防科技局的后續(xù)調(diào)查表示滿意,他們證實(shí)了故障確實(shí)是來自PV46的硬件問題。
從數(shù)據(jù)科學(xué)的角度來看,我們非常幸運(yùn),因?yàn)楣收习l(fā)生的時(shí)間和地點(diǎn)很接近。這使我們能夠在很短的時(shí)間內(nèi)確定問題和罪魁禍?zhǔn)?。如果這些故障更加孤立,其中的規(guī)律和關(guān)聯(lián)就不那么明顯了,我們將需要更多的時(shí)間和數(shù)據(jù)來解決這個(gè)謎題。
*本文用到的Python源代碼請(qǐng)點(diǎn)擊閱讀原文獲取。全文翻譯自新加坡GovTech發(fā)布在Medium上的官方博客How the Circle Line rogue train was caught with data.