10 创建与使用 stata-data-cleaner Skill
本章详细介绍 stata-data-cleaner Skill 的创建过程、工作原理和使用方法。
10.1 为什么要创建数据处理 Skill
对于经常使用 Stata 进行实证研究的经管类研究者而言,创建一个专门的数据处理 Skill 可以:
- 向 AI 说明数据处理的具体要求(例如剔除哪些样本)
- 给 AI 制定工作规范(例如变量标签怎么写、最后输出什么文件)
- 避免每次都重复说明”剔除 ST 股、剔除金融业、指标要缩尾”等常规操作
10.2 创建 Skill
10.2.1 prompt
在 plan mode 下输入以下 prompt,让 AI 根据已有的数据处理经验创建 Skill:
现在 @data/raw/ 里面的数据清洗完了。请你把清洗数据的流程打包成一个skill,放在当前项目文件夹。
参考 @file/plan.md, @file/data_processing_summary.md 的清洗流程和 @code/data_cleaning.do 的清洗代码,让skill实现以下功能:
1. 这个 skill 要自己探索数据结构(尽可能快速,不要扫描整个大型数据集,可以通过stata代码或者阅读数据里面的.txt说明文件来探索)
2. 然后要全面检查各种具体的数据预处理操作(包括但不限于:保留合并报表、保留年度数据、统一变量名、字符型转为数值型变量、剔除金融行业样本、剔除 ST 样本、剔除总资产为负等异常值、剔除上市不到一年样本、去重、缩尾等等)是否需要进行;
3. 尤其关注缺失值的情况。例如:合并数据集后,会不会某一个数据大量缺失导致合并数据集大量缺失;计算某个指标时,会不会某个变量存在大量缺失值,导致这个指标存在大量缺失;
4. 如果不确定某个操作是否需要进行、怎么进行,要向我提问。
5. 根据我的需求,判断是只要处理单个数据集,还是要合并多个数据集
6. 根据我的需求,保留和计算我需要的变量
7. 清洗完成后,对重要的变量进行描述性统计
最终输出包括:数据处理的 .do 文档;处理后的 .dta 文件;数据处理工作小结 .md 文档(包含进行了哪些操作,以及最后的描述性统计)
用 stata 完成上述任务。用 stata mcp 调用 stata,不要用命令行调用。
因为每次用这个skill处理的数据结构可能不一样,这个skill考虑到的情况要尽可能全面,确保泛用性。
如果有什么我没提到但在其他数据清洗任务中常见的操作,请你补充。
另外,不知道上述功能全部放进一个skill比较好,还是分别放进几个不同的skill比较好。请你给出建议。
10.2.2 创建过程
AI 会分析之前的清洗代码和工作小结,提炼出通用的数据处理流程,然后生成:
SKILL.md:核心定义文件,包含元数据和 5 阶段工作流references/operations-guide.md:详细操作参考手册
创建过程约 7 分钟。
10.3 生成的 Skill 结构
.claude/skills/stata-data-cleaner/
├── SKILL.md # 核心文件
└── references/
└── operations-guide.md # 操作参考手册
10.4 5 阶段工作流内容
这部分是 AI 生成的总结。关于 skill 规定的 5 阶段工作流具体内容,可查看
.claude\skills\stata-data-cleaner
10.4.1 Phase 1:Explore — 探索数据结构
目标:快速了解数据,不导入整个大数据集(有些文件超过 300 MB)。
步骤:
- 扫描数据目录 — 列出所有文件和子目录,识别文件格式和目录结构
- 读取说明文件(最快途径) — CSMAR 数据有
[DES][csv].txt文件,包含完整的变量定义 - 用 Stata 确认 — 导入少量样本行确认文档描述
import delimited "C:/path/file.csv", clear rowfirst(2) ///
encoding("utf8") bindquote(strict)
describe
list in 1/3关键确认事项:
- 变量名在 Stata 中会被
import delimited全部小写化 - 金额是否以字符串存储
- 日期格式和标识符格式
10.4.2 Phase 2:Diagnose — 诊断数据质量问题
对每个数据集进行针对性检查:
| 检查项 | 方法 | 关注点 |
|---|---|---|
| 重复记录 | duplicates report |
是否有多种报表类型或重述报告 |
| 缺失值 | misstable summarize |
缺失率 >10% 的变量需报告给用户 |
| 类型问题 | describe |
数值是否被存储为字符串 |
| 报表类型分布 | tab typrep |
合并 vs 母公司报表比例 |
| 行业分布 | tab substr(industrycode,1,1) |
金融业占比 |
| 特殊情况 | count if strpos(shortname,"ST") |
ST 股、负资产、极端值 |
缺失值的关键分析:
- 合并风险:数据集 A 的变量 X 有 5% 缺失,数据集 B 的变量 Y 有 8% 缺失,合并后至少有一个缺失的比例可能达到 13%
- 计算风险:ROA = 净利润 / 总资产,如果净利润有高缺失率,计算出的 ROA 缺失率会更高
10.4.3 Phase 3:Consult — 向用户确认
只询问真正不确定的事情。如果数据中没有 ST 股票,就不需要问是否要剔除。
必问项:
- 需要计算哪些变量?—— 用户的研究问题决定一切
- 需要合并哪些数据集?—— 确认合并键
条件性询问(仅当数据中存在该问题时才问):
- 是否剔除金融行业?(默认:是)
- 是否剔除 ST 股票?(默认:是)
- 缩尾比例?(默认:1%/99%)
- 时间范围?
- 年度还是季度?
Tip合并前必须告知
在执行合并前,Skill 会向用户报告每个数据集的观测数和预计匹配率,以及可能丢失的观测数量。例如:“资产负债表有 43,292 条年报,利润表有 43,292 条。合并后预计匹配约 43,000 条。”
10.4.4 Phase 4:Execute — 生成并执行代码
Skill 会生成一个结构化的 .do 文件:
* ============================================================
* [描述处理目的]
* ============================================================
clear all
set more off
* --- 1. 导入数据 ---
* --- 2. 变量准备 --- (rename, destring, 日期提取)
* --- 3. 筛选 --- (报表类型、时间范围、行业)
* --- 4. 去重 ---
* --- 5. 合并 --- (含 _merge 诊断)
* --- 6. 样本筛选 --- (金融、ST、负资产等)
* --- 7. 变量计算 ---
* --- 8. 缺失值处理 ---
* --- 9. 缩尾 ---
* --- 10. 变量标签 ---
* --- 11. 描述性统计 ---
* --- 12. 保存 ---如果执行出错,Skill 会读取错误信息、修复代码并重新执行,不会盲目重试。
10.4.5 Phase 5:Document — 输出与文档
| 输出 | 位置 | 说明 |
|---|---|---|
.do 文件 |
code/ |
完整的、带注释的 Stata 代码 |
.dta 文件 |
data/processed/ |
清洗后的数据集 |
.md 文件 |
file/ |
处理报告(操作记录 + 描述性统计) |
10.5 关键 Stata 代码模式
Skill 中内置了以下常用模式:
导入 CSV(处理 CSMAR 编码和引号):
import delimited "C:/path/file.csv", clear encoding("utf8") bindquote(strict)从日期字符串提取年份:
gen year = real(substr(datevar, 1, 4))筛选年度 + 合并报表(CSMAR 惯例):
keep if substr(accper, 6, 2) == "12" & typrep == "A"不依赖外部包的缩尾:
foreach var of varlist var1 var2 var3 {
_pctile `var', percentiles(1 99)
local p1 = r(r1)
local p99 = r(r2)
replace `var' = `p1' if `var' < `p1' & !missing(`var')
replace `var' = `p99' if `var' > `p99' & !missing(`var')
}计算增长率(安全版本):
sort stkcd year
by stkcd: gen growth = (revenue - revenue[_n-1]) ///
/ abs(revenue[_n-1]) if _n > 1 & revenue[_n-1] != 0注意使用 abs() 和 != 0 检查来处理基期为负值或零的情况。
带诊断的合并:
merge 1:1 stkcd year using `other'
tab _merge
drop if _merge != 3
drop _merge10.6 常见陷阱与排错
| 陷阱 | 原因 | 解决方法 |
|---|---|---|
| 变量名找不到 | import delimited 会将所有变量名小写化 |
代码中统一使用小写变量名 |
| CSV 导入引号错误 | CSMAR 的值被双引号包裹 | 使用 bindquote(strict) |
| 空字符串 ≠ 缺失值 | CSMAR 用空 "" 表示缺失,导入后是空字符串不是 Stata 缺失值 |
对数值列执行 destring, replace force |
| 路径错误 | Stata MCP 运行在 Windows 端 | 始终使用 C:/Users/...,不用 /mnt/c/... |
| 内存不足 | 资产负债表可达 300+ MB | 先筛选(保留年度+合并报表)再处理 |
| 增长率分母为零 | 上期营收为零或负值 | 使用 abs() 并添加 != 0 检查 |
| 合并键类型不匹配 | 一边是字符串,一边是数值 | 合并前确保两边类型一致 |
10.7 使用 Skill 清洗数据
创建完成后,使用这个 Skill 清洗数据的流程非常简单:
- 将原始数据放入
data/raw/ - 在 Claude Code 中描述你的需求(例如”清洗这些数据并计算 Size、ROA”)
- Skill 自动触发,执行 5 阶段工作流
- 在 Phase 3 确认 Skill 提出的问题
- 等待执行完成,查看输出文件