-------|----------|------| | 职业轨迹 | 就业状态 | 就业、失业、退休 | | 家庭形成 | 居住状态 | 独居、同居、已婚 | | 教育历程 | 学历状态 | 小学、中学、大学 | | 健康轨迹 | 健康状态 | 健康、慢性病、失能 |
距离度量
最优匹配(Optimal Matching)
原理: 通过插入、删除、替换操作将一个序列转换为另一个序列
操作成本:
- 插入(I): 插入一个状态的成本
- 删除(D): 删除一个状态的成本
- 替换(S): 替换一个状态的成本
距离 = 最小操作成本之和
示例:
序列A: E E W W M
序列B: E W W M M
转换: E→E(0), 删除E(1), W→W(0), W→W(0), M→M(0), 插入M(1)
距离 = 2
替换成本矩阵
状态相似性 → 替换成本
示例(职业状态):
E W M R
E 0 1 2 2
W 1 0 1 2
M 2 1 0 2
R 2 2 2 0
解读:
- E↔W成本1: 教育和工作相关性高
- E↔M成本2: 教育和管理差距大
- 对角线为0: 相同状态无成本
其他距离度量
| 方法 | 原理 | 适用场景 |
|---|---|---|
| 汉明距离 | 对应位置差异 | 等长序列 |
| Levenshtein | 编辑距离 | 一般序列 |
| LCS | 最长公共子序列 | 模式匹配 |
| 子序列距离 | 公共子序列比例 | 稀疏序列 |
序列描述统计
状态分布
每个时间点的状态分布:
时间点 │ 状态A 状态B 状态C
1 │ 80% 15% 5%
2 │ 60% 30% 10%
3 │ 40% 40% 20%
...
转换矩阵
状态转换概率:
│ E W M R
─────┼────────────────
E │ .3 .6 .1 .0
W │ .1 .5 .3 .1
M │ .0 .1 .6 .3
R │ .0 .0 .0 1.0
解读:
- P(E→W)=0.6: 教育后60%进入工作
- P(M→M)=0.6: 管理岗位稳定性高
序列指标
| 指标 | 公式 | 含义 |
|---|---|---|
| 持续时间 | 状态占用时间 | 状态稳定性 |
| 转换次数 | 状态变化次数 | 轨迹复杂性 |
| 熵 | -Σp·log(p) | 轨迹多样性 |
| 索引质量 | Σp² | 序列典型性 |
聚类分析
方法
聚类流程:
1. 计算距离矩阵(OM距离)
2. 选择聚类算法
├── 层次聚类: Ward/Complete
├── K-medoids: PAM
└── 混合模型: 潜在类别
3. 确定聚类数
├── 轮廓系数
├── CH指数
└── 解释性
4. 解释聚类结果
典型序列提取
聚类后提取代表性序列:
聚类1: "稳定型" (35%)
典型轨迹: E→W→W→W→R
聚类2: "上升型" (28%)
典型轨迹: E→W→M→M→R
聚类3: "波动型" (22%)
典型轨迹: E→W→U→W→U→W→R
聚类4: "延迟型" (15%)
典型轨迹: E→E→W→W→R
(U=失业)
可视化方法
状态分布图(Index Plot)
个体序列展示:
序列1 ████████████████
EEEEEEEWWWWWWRRR
序列2 ████████████████
EEEEWWWWWMMMRRRR
序列3 ████████████████
EEEWWWUUUWWWRRRR
横轴: 时间
颜色: 状态
转换图
状态转换网络:
┌──→ W ──┐
│ │ ↓
E ──┤ ↓ M
│ │
└────────→ R
箭头宽度 = 转换概率
节点大小 = 状态占比
序列图(Sequence Index Plot)
时间
│
│ ████
│ ████ ████
│ ████ ████ ████
│ ████ ████ ████ ████
└─────────────────────────→ 样本
Python实现
使用TraMineR(R)/seqanalyst(Python)
from sequence_analyzer import SequenceData, OM_distance
# 定义序列
sequences = [
['E', 'E', 'W', 'W', 'M', 'M', 'R'],
['E', 'W', 'W', 'M', 'M', 'M', 'R'],
['E', 'E', 'E', 'W', 'W', 'W', 'R'],
]
# 计算距离矩阵
seq_data = SequenceData(sequences,
states=['E', 'W', 'M', 'R'])
dist_matrix = OM_distance(seq_data,
indel=1,
substitution_matrix=cost_matrix)
# 聚类分析
from scipy.cluster.hierarchy import linkage, fcluster
Z = linkage(dist_matrix, method='ward')
clusters = fcluster(Z, t=4, criterion='maxclust')
应用场景
生命历程研究
研究问题: 教育如何影响职业轨迹?
变量:
- 因变量: 职业序列类型
- 自变量: 教育水平、家庭背景
- 控制变量: 性别、年龄、地区
分析步骤:
1. 构建职业序列
2. 聚类识别轨迹类型
3. 回归分析影响因素
社会流动研究
研究问题: 代际流动模式
序列:
- 父代职业状态序列
- 子代职业状态序列
分析方法:
- 序列相似性分析
- 流动表分析
- 路径依赖检验
家庭形成轨迹
研究问题: 家庭形成多样化模式
状态:
S=单身, C=同居, M=已婚, D=离婚, W=丧偶
典型轨迹:
1. 传统型: S→M→M→M
2. 同居型: S→C→M→M
3. 中断型: S→M→D→S→M
使用示例
用户: 分析大学毕业生的职业发展轨迹
AI: 我将执行完整的序列分析:
## 数据概况
- 样本量: 500人
- 追踪期: 毕业5年(60个月)
- 状态: 就业(E)、失业(U)、深造(S)、创业(B)
## 状态分布
月份 │ E U S B
─────┼──────────────
1 │ 45% 25% 20% 10%
12 │ 65% 15% 10% 10%
24 │ 70% 10% 5% 15%
36 │ 72% 8% 3% 17%
60 │ 75% 5% 2% 18%
## 聚类结果(4类)
聚类1 "稳定就业型" (42%)
典型轨迹: E→E→E→E→E
特征: 快速就业、职业稳定
聚类2 "深造后就业型" (25%)
典型轨迹: S→S→E→E→E
特征: 先深造再就业
聚类3 "创业型" (18%)
典型轨迹: E→B→B→B→B
特征: 先就业后创业
聚类4 "波动型" (15%)
典型轨迹: E→U→E→U→E
特征: 就业不稳定
## 影响因素
| 变量 | 聚类1 | 聚类2 | 聚类3 | 聚类4 |
|------|-------|-------|-------|-------|
| 985高校 | + | + | ns | - |
| 理工科 | + | - | + | ns |
| 实习经历 | + | ns | + | ns |
🚫 绝对禁止原则
使用前必读:以下原则是不可逾越的红线,违反将导致序列分析结论失效。
- 禁止忽视时间结构 — 将序列当作无序集合处理,不考虑状态的时间顺序和转换逻辑
- 禁止替换成本矩阵无理论依据 — 使用最优匹配(OM)时,替换/插入/删除成本无领域依据,导致距离度量失真
- 禁止只看聚类结果不分析序列内容 — 仅报告聚类数量和轮廓系数,而不解读各聚类的实际轨迹含义
- 禁止混淆序列相似性与因果关系 — 序列相似不代表有因果关联,需结合回归分析检验
- 禁止忽视样本选择性偏倚 — 不考虑样本是否代表目标群体,导致轨迹类型分布估计偏差
- 禁止忽视观测间隔不等问题 — 不等间隔观测时使用等间隔假设,导致转换矩阵估计不准确
✅ 质量标准
完整性
- 必做项清单完成度 ≥ 90%
- 序列定义说明完整(状态、时间单位)
- 替换成本矩阵有据可查
方法论
- 理论框架与数据一致性 ≥ 90%
- 分析步骤可复现性高
- 距离度量选择有理论依据
深度
- 核心维度覆盖 ≥ 80%
- 典型序列解读完整
- 影响因素分析深入
🖥️ Python 工具
工具链
| # | 工具名称 | 功能描述 |
|---|---|---|
| 1 | sequence_builder.py | 序列构建,支持状态定义、时间单位设置、不等间隔处理 |
| 2 | om_distance_calculator.py | 最优匹配距离计算,支持自定义替换成本矩阵和插入/删除成本 |
| 3 | trajectory_cluster.py | 轨迹聚类分析,支持Ward/PAM/K-medoids多方法聚类 |
| 4 | transition_analyzer.py | 转换矩阵分析,支持时依协变量Cox模型和事件史分析 |
CLI用法
python tools/sequence_builder.py --input events.csv --output sequences.json
python tools/om_distance_calculator.py --input sequences.json --substitution-matrix costs.csv --output dist_matrix.json
python tools/trajectory_cluster.py --input dist_matrix.json --method ward --n-clusters 4 --output clusters.json
CLI用法
# 社会序列分析推荐使用TraMineR(R)或Python的sequence_analyzer
python -c "print('Social Sequence Analysis: 序列分析与聚类')"
参考文献
- Abbott, A. (1995). Sequence analysis: New methods for old ideas. Annual Review of Sociology, 21, 93-113.
- Cornwell, B. (2015). Social sequence analysis. In Emerging Trends in the Social and Behavioral Sciences.
- Studer, M., & Ritschard, G. (2016). What matters in differences between life trajectories. Sociological Methods & Research, 45(1), 5-48.
- Gabadinho, A., et al. (2011). Analyzing and visualizing state sequences in R. Journal of Statistical Software, 40(4), 1-37.
技能版本: 5.0.0
方法论标准: Abbott (1995), Cornwell (2015)
创建时间: 2026-03-15