戰(zhàn):從數(shù)據(jù)清洗到關(guān)聯(lián)分析全流程)
簡(jiǎn)介IBM i2 Analysts Notebook 8.91 是一款面向情報(bào)分析、犯罪調(diào)查、金融反欺詐與網(wǎng)絡(luò)安全領(lǐng)域從業(yè)者的數(shù)據(jù)挖掘與可視化工具幫助用戶從海量復(fù)雜數(shù)據(jù)中識(shí)別模式、趨勢(shì)與隱藏關(guān)聯(lián)。資源包共 42 個(gè)文件以 exe 安裝程序、htm 安裝向?qū)ы?yè)面、pdf 用戶指南與發(fā)布說(shuō)明、msu 系統(tǒng)補(bǔ)丁及 dll 組件為主另含 doc 培訓(xùn)教材與 xml、ini 等配置文件壓縮包約 443.77MB結(jié)構(gòu)完整便于按安裝、配置、學(xué)習(xí)三條線索取用。其中 i2forfree 版本無(wú)需加密狗簡(jiǎn)化了部署流程。已有 4658 人學(xué)習(xí)下載適合希望快速上手關(guān)聯(lián)分析與網(wǎng)絡(luò)圖繪制、構(gòu)建自定義分析模板與工作流的分析師也可作為團(tuán)隊(duì)協(xié)作與案例共享的實(shí)踐參考。1. 情報(bào)分析師的“作戰(zhàn)臺(tái)”i2 Analysts Notebook 8.91 到底解決什么問(wèn)題如果你手頭正堆著幾十萬(wàn)條通話記錄、轉(zhuǎn)賬流水、聊天日志和涉案人員名單Excel 已經(jīng)卡到轉(zhuǎn)不動(dòng)關(guān)系圖靠 PPT 手畫到崩潰那你大概率已經(jīng)在找 i2 Analysts Notebook 這類工具了。IBM i2 Analysts Notebook 8.91 是 i2 系列里做關(guān)聯(lián)分析、時(shí)間線重建、社交網(wǎng)絡(luò)圖譜的核心桌面端常被叫做“情報(bào)分析系統(tǒng)軟件”里的重武器。它不負(fù)責(zé)采集數(shù)據(jù)也不負(fù)責(zé)爬取它干的事是把已經(jīng)到手的結(jié)構(gòu)化表格、CSV、數(shù)據(jù)庫(kù)導(dǎo)出文件變成一張能交互、能下鉆、能出報(bào)告的關(guān)系網(wǎng)絡(luò)圖。適合誰(shuí)適合做反欺詐、內(nèi)部審計(jì)、案件研判、供應(yīng)鏈溯源、威脅情報(bào)整編的從業(yè)者。你不需要會(huì)寫代碼但必須理解“實(shí)體—關(guān)系—屬性”這套建模邏輯否則導(dǎo)入進(jìn)去的只是一團(tuán)彩色毛線。2. 把數(shù)據(jù)喂進(jìn) i2從 CSV 到實(shí)體關(guān)系圖的完整鏈路2.1 先想清楚“實(shí)體”和“鏈接”再動(dòng)手i2 Analysts Notebook 的核心數(shù)據(jù)模型只有兩個(gè)東西Entity實(shí)體和Link鏈接。實(shí)體可以是人、電話、賬號(hào)、車牌、公司鏈接就是它們之間發(fā)生的關(guān)系比如“通話”“轉(zhuǎn)賬”“任職”“同住”。很多新手翻車就翻在第一步把一張寬表直接拖進(jìn)去結(jié)果每個(gè)字段都變成一個(gè)獨(dú)立實(shí)體圖面炸成煙花。正確做法是先做數(shù)據(jù)整形把原始表拆成“實(shí)體表”和“關(guān)系表”兩張。常見(jiàn)做法是實(shí)體表至少包含EntityID、EntityType、Label三列關(guān)系表包含F(xiàn)romID、ToID、LinkType、StartTime、EndTime、Weight。這樣導(dǎo)入后 i2 才能自動(dòng)識(shí)別節(jié)點(diǎn)和連線而不是把“張三”和“13800000000”當(dāng)成兩個(gè)互不相干的點(diǎn)。2.2 用 Python 做導(dǎo)入前的標(biāo)準(zhǔn)化清洗i2 8.91 對(duì) CSV 的編碼和日期格式比較敏感我一般會(huì)先用 pandas 把數(shù)據(jù)洗一遍輸出 UTF-8 帶 BOM 的 CSV避免中文亂碼和日期解析失敗。下面這段腳本處理的是最常見(jiàn)的通話記錄場(chǎng)景一列主叫、一列被叫、一列通話時(shí)間、一列時(shí)長(zhǎng)。import pandas as pd # 讀取原始通話記錄假設(shè)是 GBK 編碼的 CSV raw pd.read_csv(cdr_raw.csv, encodinggbk, dtypestr) # 實(shí)體表去重后的電話號(hào)碼 entities pd.DataFrame({ EntityID: pd.unique(raw[[caller, callee]].values.ravel()), }) entities[EntityType] Phone entities[Label] entities[EntityID] entities.to_csv(entities_phone.csv, indexFalse, encodingutf-8-sig) # 關(guān)系表每一通電話就是一條 Link links raw.rename(columns{ caller: FromID, callee: ToID, call_time: StartTime, duration: Weight }) links[LinkType] Call links[EndTime] pd.to_datetime(links[StartTime]) pd.to_timedelta(links[Weight].astype(int), units) links links[[FromID, ToID, LinkType, StartTime, EndTime, Weight]] links.to_csv(links_call.csv, indexFalse, encodingutf-8-sig)邏輯說(shuō)明pd.unique把主叫和被叫合并去重保證每個(gè)號(hào)碼在實(shí)體表里只出現(xiàn)一次這是 i2 識(shí)別節(jié)點(diǎn)的前提。Weight直接映射通話時(shí)長(zhǎng)導(dǎo)入后可以用線寬表示強(qiáng)度。EndTime由開(kāi)始時(shí)間加秒數(shù)算出i2 的時(shí)間線視圖依賴這個(gè)字段做區(qū)間展示。參數(shù)上唯一要改的是列名映射你的原始表叫什么就改rename里的鍵。注意dtypestr是為了防止電話號(hào)碼被 pandas 自動(dòng)轉(zhuǎn)成科學(xué)計(jì)數(shù)法這個(gè)坑我見(jiàn)過(guò)太多次。2.3 在 i2 里配置導(dǎo)入映射并生成第一張圖打開(kāi) Analysts Notebook 8.91新建一個(gè) Chart然后走Data Import CSV。關(guān)鍵在映射界面把EntityID拖到Entity IDEntityType拖到Entity TypeLabel拖到Label關(guān)系表那邊把FromID映射到From EntityToID映射到To EntityLinkType映射到Link Type。時(shí)間字段要手動(dòng)指定格式常見(jiàn)的是yyyy-MM-dd HH:mm:ss如果你原始數(shù)據(jù)是2024/5/1 8:30這種先在清洗階段統(tǒng)一成標(biāo)準(zhǔn)格式別指望 i2 自動(dòng)猜。導(dǎo)入完成后按CtrlG自動(dòng)布局一般先用Circular看整體密度再用Hierarchical看層級(jí)關(guān)系。如果節(jié)點(diǎn)超過(guò)五千建議先按時(shí)間或類型過(guò)濾否則布局會(huì)跑到你懷疑人生。3. 讓圖譜說(shuō)話時(shí)間線、社交網(wǎng)絡(luò)與中心度分析3.1 時(shí)間線視圖把“什么時(shí)候發(fā)生”釘死i2 8.91 的時(shí)間線不是簡(jiǎn)單排序它能把實(shí)體和鏈接按時(shí)間軸展開(kāi)特別適合做案件時(shí)序重建。操作路徑是View Timeline然后把關(guān)系表里的StartTime和EndTime拖到時(shí)間軸字段上。這里有個(gè)細(xì)節(jié)如果一條 Link 沒(méi)有 EndTime它會(huì)顯示成一個(gè)點(diǎn)事件有 EndTime 才會(huì)顯示成條帶。我一般會(huì)把轉(zhuǎn)賬、通話、登錄都做成條帶這樣能一眼看出某個(gè)號(hào)碼在凌晨三點(diǎn)密集通話同時(shí)段又有大額轉(zhuǎn)賬這種“時(shí)間重疊”往往是突破口。時(shí)間線支持縮放和過(guò)濾你可以框選一個(gè)時(shí)間段讓主圖只顯示該時(shí)段活躍的實(shí)體這個(gè)聯(lián)動(dòng)比手動(dòng)篩選快得多。3.2 用中心度指標(biāo)找出“關(guān)鍵節(jié)點(diǎn)”圖好看沒(méi)用得算出誰(shuí)最重要。i2 內(nèi)置了多種中心度算法在Analyze Centrality里可以選Degree、Betweenness、Closeness。Degree 就是連接數(shù)適合找“話務(wù)量最大”的號(hào)碼Betweenness 是介數(shù)中心度適合找“橋梁”角色——那種自己通話不多但兩個(gè)團(tuán)伙都跟他有聯(lián)系的人。操作上先選中整個(gè)圖或一個(gè)子集運(yùn)行算法后 i2 會(huì)把得分寫進(jìn)實(shí)體屬性你可以用Size by Attribute讓節(jié)點(diǎn)大小隨得分變化。參數(shù)建議如果圖很密先跑 Degree 做粗篩把低于閾值的節(jié)點(diǎn)隱藏再跑 Betweenness否則計(jì)算量會(huì)很大。常見(jiàn)誤區(qū)是只看 Degree 就下結(jié)論結(jié)果漏掉了真正起串聯(lián)作用的中介節(jié)點(diǎn)。3.3 條件格式與圖標(biāo)集讓異常自己跳出來(lái)i2 的Conditional Formatting是很多人忽略的功能。你可以給實(shí)體設(shè)置規(guī)則比如Weight 3600的鏈接標(biāo)紅加粗EntityType BankAccount的節(jié)點(diǎn)用方形圖標(biāo)StartTime在凌晨 0 點(diǎn)到 5 點(diǎn)的鏈接用虛線。這些規(guī)則在Format Conditional Formatting里配置支持多條件疊加。我通常會(huì)把“高頻通話 深夜時(shí)段 大額轉(zhuǎn)賬”三條規(guī)則同時(shí)打開(kāi)圖面上剩下的基本就是需要重點(diǎn)看的對(duì)象。注意規(guī)則優(yōu)先級(jí)是從上到下匹配別把寬泛條件放在前面否則后面的精細(xì)規(guī)則永遠(yuǎn)不生效。4. 避坑與排查i2 8.91 實(shí)操中最容易翻車的五件事4.1 導(dǎo)入后中文全是問(wèn)號(hào)現(xiàn)象CSV 導(dǎo)入后實(shí)體標(biāo)簽顯示為???或亂碼。原因i2 8.91 默認(rèn)按系統(tǒng)區(qū)域編碼解析中文 Windows 下常按 GBK 讀而你的文件是 UTF-8。解決清洗階段統(tǒng)一輸出utf-8-sig或者在導(dǎo)入向?qū)У?Encoding 下拉里手動(dòng)選 UTF-8。如果已經(jīng)導(dǎo)入亂了刪掉 Chart 重新導(dǎo)別試圖在 i2 里改編碼改不回來(lái)。4.2 日期字段識(shí)別失敗導(dǎo)致時(shí)間線空白現(xiàn)象時(shí)間線視圖里所有事件堆在同一天或者干脆不顯示。原因日期格式和 i2 預(yù)期的不一致比如2024.05.01這種點(diǎn)分隔或者05/01/2024這種月日順序歧義。解決在 pandas 里用pd.to_datetime統(tǒng)一轉(zhuǎn)成yyyy-MM-dd HH:mm:ss字符串再導(dǎo)出。如果原始數(shù)據(jù)有“上午/下午”這種中文先替換成 24 小時(shí)制。i2 的日期解析是黑匣子別跟它較勁提前洗好最省事。4.3 節(jié)點(diǎn)太多導(dǎo)致布局卡死現(xiàn)象導(dǎo)入一萬(wàn)個(gè)實(shí)體后點(diǎn)自動(dòng)布局進(jìn)度條卡住內(nèi)存飆升。原因i2 的布局算法對(duì)節(jié)點(diǎn)數(shù)敏感尤其是 Betweenness 這種全局算法復(fù)雜度接近 O(n3)。解決先按時(shí)間窗口或?qū)嶓w類型過(guò)濾把單次分析的節(jié)點(diǎn)控制在兩千以內(nèi)。如果必須看全量先用 Degree 做一次粗布局再對(duì)子集跑精細(xì)算法。我一般會(huì)拆成多個(gè) Chart用Merge Chart按需合并而不是一個(gè)圖塞到底。4.4 關(guān)系表里出現(xiàn)重復(fù)鏈接導(dǎo)致權(quán)重翻倍現(xiàn)象兩個(gè)號(hào)碼之間明明只通了 10 次話圖上顯示權(quán)重 20。原因?qū)嶓w表去重了但關(guān)系表沒(méi)去重同一對(duì) FromID/ToID 出現(xiàn)多條記錄i2 默認(rèn)會(huì)累加或并列顯示。解決在清洗階段用groupby聚合把同一對(duì)實(shí)體的多條關(guān)系合并成一條權(quán)重求和或取平均。如果業(yè)務(wù)上需要保留每次通話那就把 LinkType 設(shè)成不同值讓 i2 顯示為多條平行線而不是重復(fù)計(jì)數(shù)。4.5 導(dǎo)出報(bào)告時(shí)圖面元素丟失現(xiàn)象在 i2 里看一切正常導(dǎo)出 PDF 或圖片后圖標(biāo)、顏色、標(biāo)簽全變了。原因條件格式和圖標(biāo)集依賴本地字體和主題導(dǎo)出時(shí)如果目標(biāo)環(huán)境沒(méi)有對(duì)應(yīng)字體就會(huì)回退成默認(rèn)樣式。解決導(dǎo)出前在File Export里勾選“Embed fonts”或“Flatten image”把圖面柵格化。如果是要給別人編輯的.anb文件把自定義圖標(biāo)打包進(jìn)模板一起發(fā)。這個(gè)坑血淚經(jīng)驗(yàn)給領(lǐng)導(dǎo)匯報(bào)前一定先導(dǎo)出一份預(yù)覽別到了會(huì)議室才發(fā)現(xiàn)圖花了。5. 進(jìn)階技巧用屬性驅(qū)動(dòng)布局和批量生成子圖5.1 按屬性分組布局而不是全局一鍋粥當(dāng)實(shí)體類型超過(guò)三種全局布局基本沒(méi)法看。我習(xí)慣用Group by Attribute先把實(shí)體按EntityType或Community分組然后對(duì)每個(gè)組單獨(dú)布局再用Layout Arrange Groups把組框排開(kāi)。這樣出來(lái)的圖既有整體結(jié)構(gòu)又能看清每個(gè)團(tuán)伙內(nèi)部的連接。具體操作在Analyze Grouping里選一個(gè)屬性字段i2 會(huì)自動(dòng)生成分組框你可以拖動(dòng)框的位置框內(nèi)節(jié)點(diǎn)會(huì)跟著走。如果某個(gè)組太大右鍵Ungroup再單獨(dú)處理。這個(gè)技巧在分析多團(tuán)伙案件時(shí)特別管用比手動(dòng)框選快十倍。5.2 用“查找路徑”功能驗(yàn)證假設(shè)i2 的Find Path能回答“A 和 B 之間最短的關(guān)系鏈?zhǔn)鞘裁础薄2僮魇沁x中兩個(gè)實(shí)體右鍵Find Path可以限定最大跳數(shù)和鏈接類型。比如你懷疑兩個(gè)看似無(wú)關(guān)的賬戶之間有資金中轉(zhuǎn)就限定LinkType Transfer最大跳數(shù)設(shè) 3跑出來(lái)的路徑如果經(jīng)過(guò)一個(gè)中間賬戶那這個(gè)賬戶就是重點(diǎn)排查對(duì)象。參數(shù)上跳數(shù)別設(shè)太大超過(guò) 4 跳的結(jié)果基本沒(méi)有業(yè)務(wù)解釋力。跑完后可以把路徑高亮保存成一個(gè)子圖單獨(dú)導(dǎo)出給辦案人員。5.3 批量生成子圖并自動(dòng)命名如果你有一批重點(diǎn)號(hào)碼想每個(gè)號(hào)碼生成一張以它為中心的二度關(guān)系圖手動(dòng)做會(huì)瘋。常見(jiàn)做法是用 i2 的Scripting功能支持 VBScript寫個(gè)循環(huán)讀取一個(gè)號(hào)碼列表對(duì)每個(gè)號(hào)碼執(zhí)行Select Neighbors深度 2然后Create Sub Chart最后用號(hào)碼命名保存。下面是一個(gè)簡(jiǎn)化的腳本骨架實(shí)際路徑和對(duì)象名需要根據(jù)你的 Chart 結(jié)構(gòu)調(diào)整。 假設(shè)當(dāng)前 Chart 已打開(kāi)號(hào)碼列表在外部文件里 Dim fso, file, ts, phone Set fso CreateObject(Scripting.FileSystemObject) Set file fso.OpenTextFile(C:\targets.txt, 1) Do Until file.AtEndOfStream phone file.ReadLine 按 Label 查找實(shí)體 Dim ent Set ent ActiveDocument.CurrentChart.FindEntityByLabel(phone) If Not ent Is Nothing Then ActiveDocument.CurrentChart.ClearSelection ent.Selected True 選中二度鄰居 ActiveDocument.CurrentChart.SelectNeighbors 2 生成子圖 ActiveDocument.CurrentChart.CreateSubChart 保存子圖文件名用號(hào)碼 ActiveDocument.SaveAs C:\output\ phone .anb End If Loop file.Close邏輯說(shuō)明FindEntityByLabel按標(biāo)簽找實(shí)體SelectNeighbors 2選中兩度以內(nèi)的所有節(jié)點(diǎn)和鏈接CreateSubChart把選中部分抽成新圖。參數(shù)上2可以改成1或3取決于你想要多寬的關(guān)系范圍。注意腳本運(yùn)行前先備份原圖因?yàn)镃reateSubChart會(huì)改變當(dāng)前文檔狀態(tài)。這個(gè)腳本我一般用來(lái)做初篩跑完后再人工看哪些子圖值得深挖。5.4 驗(yàn)證分析結(jié)果是否靠譜的一個(gè)習(xí)慣i2 的圖再漂亮也只是數(shù)據(jù)的投影。我每次做完一張圖都會(huì)強(qiáng)制走一遍反向驗(yàn)證隨機(jī)挑三個(gè)實(shí)體手動(dòng)回原始數(shù)據(jù)里查它們的連接關(guān)系看是否和圖面一致。如果對(duì)不上大概率是導(dǎo)入時(shí)字段映射錯(cuò)了或者關(guān)系表有重復(fù)。這個(gè)習(xí)慣救過(guò)我很多次尤其是趕報(bào)告的時(shí)候圖面越“完美”越要懷疑是不是漏了臟數(shù)據(jù)。從那以后我每次導(dǎo)入完都先跑一遍小樣本核對(duì)確認(rèn)無(wú)誤再上全量。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取