herbertmoroni/cdr-bridge-analyzer
GitHub: herbertmoroni/cdr-bridge-analyzer
利用图论和统计检验从通话记录中自动发现独立通话网络并识别连接它们的隐藏桥梁号码的取证分析工具。
Stars: 0 | Forks: 0
# 概述
这是一款取证链路分析工具,利用图论和统计检验,寻找连接不同通话网络的隐藏号码。
链路分析是调查人员使用的真实技术。它分析谁与谁通话,并寻找人与人之间的隐藏联系。
我的工具可以接收任何通话记录文件——任何数据集,而不仅仅是某一个特定文件——并自动执行三项操作。
- 首先,它构建一个图。每个电话号码是一个节点。每次通话是一个连接。
- 其次,它自动在该图中查找独立的网络。无需人工干预。
- 第三,它寻找连接两个或多个网络的号码。我将这些称为“桥梁”号码。它们是乍看之下互不相干的群体之间的隐藏链接。
对于每个桥梁号码,该工具还会进行额外检查:该号码在切换到新联系人后,是否会更快地拨打电话?这种模式可能是在不同群体间传递信息的迹象。

## 工作原理
1. 根据 CDR 构建通话图(号码 = 节点,通话 = 边,以每对号码间的通话次数作为权重)。
2. 运行社区发现算法(Louvain)自动发现独立的通话网络——无需事先手动识别“核心”号码。
3. 标记**桥梁**:即作为图割点(移除后会使网络分裂)的号码,*并且*其联系人大部分位于其所属社区之外。核心节点也是割点,但它们的联系人大部分留在自己的社区内,因此这种同社区百分比是区分两者的关键。分界点不是固定的——而是根据每个数据集中连续同社区百分比之间的最大差距来设定的。如果该差距低于 20 个百分点,报告中会出现警告,这意味着该数据集中的分裂特征较弱。结果按中介中心性排序。
4. 对每个桥梁,运行 Wilcoxon 秩和检验,比较拨打*同一*联系人之前的通话时间间隔与*切换*到不同联系人之前的时间间隔。相对于同联系人时间间隔而言较短切换间隔,是转发行为(接收后立即转发)的典型特征。
5. 将交互式网络可视化结果写入 `network.html` —— 桥梁显示为红色三角形,其他元素保持统一样式,鼠标悬停可查看社区详情。可在任何浏览器中打开;支持拖动、缩放,以及点击节点查看其详细信息。
6. 写入 `report.html` —— 一个汇总页面,包含社区/桥梁数量、排序后的桥梁表格(包含链式测试结果和解释),以及如果分裂特征较弱时显示的校准警告。
# 开发环境
我使用了 [Positron](https://positron.posit.co/),这是一款基于与 VS Code 相同的核心构建的 IDE,支持 R 语言,运行环境为 Windows 上的 R 4.6.1。
使用的库:
- **igraph** — 图构建、Louvain 社区发现、割点检测以及中介中心性计算
- **visNetwork** — 交互式 HTML 网络可视化(拖拽、缩放、悬停、点击高亮)
- **dplyr** — 数据处理以及使用 `case_when` 将结果划分到易读的类别中
- **htmltools** — 构建 HTML 汇总报告
## 输入格式
CSV 文件必须包含以下列(任何多余的列将被忽略):
| 列 | 含义 | 格式 |
|-------------|---------------------------------------|------------------------|
| `from` | 主叫号码 | 数值 |
| `to` | 被叫号码 | 数值 |
| `timestamp` | 通话发生时间 | `YYYY-MM-DD HH:MM:SS` |
| `duration` | 通话时长(秒) | 数值 |
示例:
```
from,to,timestamp,duration
1195646235,1187037061,2012-05-01 08:11:00,22
1195646235,1187037061,2012-05-01 09:03:00,190
```
如果您的运营商导出数据使用了不同的列名、不同的日期格式或不同的编码,请在运行工具前将其重命名或重新格式化以使其匹配——这样可以使加载程序保持简单且可预测,而无需去猜测运营商的各种特异性问题。
## 运行说明
- 克隆代码仓库。
- 安装依赖项(见下文)。
- 将您的 CDR 导出文件放在项目文件夹中,或者编辑 `main.R` 顶部的 `csv_path` 变量指向它。
- 运行:
Rscript main.R
- 在运行过程中,摘要信息(社区规模、桥梁列表、链式测试结果以及任何校准警告)也会打印到控制台——这对于无需打开 HTML 文件即可快速浏览非常有用。
- 打开 `report.html` 查看分析结果,打开 `network.html` 查看交互式图表。
### 依赖项
```
install.packages(c("igraph", "visNetwork", "dplyr", "htmltools"))
```
## 输出
- `report.html`:找到的号码/社区/桥梁汇总,排序后的桥梁表格(社区内部通话百分比、中介中心性、拨打同一联系人与切换联系人时的中间间隔时间,以及测试的 p 值——低 p 值意味着差异不太可能是偶然产生的),以及如果该数据集中的桥梁/非桥梁划分较弱时显示的警告。
- `network.html`(连同它所依赖的同级 `network_files/` 文件夹——请将它们放在一起):交互式通话网络可视化,可从 `report.html` 中链接访问。
# 实用网站
- [The R Project for Statistical Computing](https://www.r-project.org/)
- [igraph R 参考手册](https://r.igraph.org/)
- [visNetwork 文档](https://datastorm-open.github.io/visNetwork/)
# 未来工作
- 将每个桥梁的单独 p 值合并为一个综合检验(例如 Fisher 方法),而不是孤立地查看每一个测试——将几个独立的测试按表面价值解读是一个真正的统计漏洞,值得填补。
- 支持可选的实体/标签文件,以便调查人员可以将已知姓名附加到号码上,而不是在可视化和报告中永远只看到原始电话号码。
- 针对更大、更密集的 CDR 数据集,验证自适应阈值的桥梁分类。目前使用的数据集小且稀疏(接近树状结构),这可能是核心/桥梁分离如此清晰的原因——现实世界中规模庞大且连接紧密的网络可能不会分离得如此整洁,这一点尚未经过测试。
- 构建一个小型的 schema 映射步骤,以便可以将原始运营商导出文件自动转换为工具的标准 `from`/`to`/`timestamp`/`duration` 格式,而不是要求首先手动进行这种重新格式化。
# AI 声明
在本项目中,AI 被用作编码助手,整个过程在我的指导和审查下进行:
- 报告布局和样式(`report.R`)。
- R 分析逻辑(图构建、桥梁检测、链式分析)。
标签:图论, 数字取证, 社区发现, 自动化脚本, 通话记录分析, 链接分析