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