Job Market Intelligence Corpus
收藏资源简介:
这是一个关于德国技术劳动力市场的技能需求映射的研究级语料库和分析管道。它包含3200个经过清理、去重和技能标记的德国技术职位发布,这些数据通过NLP提取技能实体和无监督聚类标签进行丰富,适用于下游研究、简历优化或招聘智能。数据来源包括StepStone、Indeed DE和LinkedIn,涵盖12个德国城市,提取了156个独特技能,并具有K-Means聚类分析(k=4,轮廓系数0.61)。
This is a research-grade corpus and analytical pipeline for skill demand mapping on the German technical labor market. It contains 3,200 cleaned, deduplicated, and skill-tagged German technical job postings, enriched with skill entities extracted via NLP and unsupervised clustering labels, suitable for downstream research, resume optimization, or recruitment intelligence. The data is sourced from StepStone, Indeed DE, and LinkedIn, covering 12 German cities, from which 156 unique skills are extracted, featuring K-Means clustering analysis (k=4, silhouette coefficient of 0.61).
🧠 Job Market Intelligence Corpus — 德国科技劳动力市场需求映射数据集
📌 数据集概述
这是一个研究级语料库与分析管道,针对德国科技就业市场,从三个平台抓取原始职位信息,经过清洗、去重、技能标注,最终生成 3,200 条职位发布 的结构化数据集。数据集包含 NLP 提取的技能实体和无监督聚类标签,适用于下游研究、简历优化或招聘情报分析。
研究问题:
- 哪些技术技能主导德国数据就业市场?如何按资历分层?
- 自然的角色原型是什么?无监督聚类能否仅从技能共现中恢复它们?
- 不同合同类型(学生工、实习、全职、自由职业)之间的技能需求如何差异?
📊 数据集规模
| 指标 | 数值 |
|---|---|
| 总职位数 | 3,200 |
| 时间范围 | 2024年1月 – 2025年3月 |
| 数据来源 | StepStone (38.8%) · Indeed DE (33.8%) · LinkedIn (27.5%) |
| 覆盖城市 | 12 个德国城市 |
| 角色类型 | 28 种标准化职位名称 |
| 提取技能数 | 156 种 |
| 技能提取覆盖率 | 96.7% 的职位包含 ≥ 3 项技能 |
| NER 精确率 / 召回率 | 88.4% / 82.1% |
| K-Means 聚类 | k = 4 · 轮廓系数 = 0.61 |
📂 仓库结构
corpus/ ├── README.md ├── data/ │ ├── job_postings_raw.csv ← 3,200 条已验证职位(14 字段) │ ├── extracted_skills.csv ← 每条职位的技能提取(NER + TF-IDF) │ ├── kmeans_clusters.csv ← 聚类分配(k=4, silhouette=0.61) │ └── skill_cooccurrence_matrix.csv ← 前30项技能成对共现计数 ├── figures/ │ ├── fig01_geographic_contract_distribution.png │ ├── fig02_top20_skills.png │ ├── fig03_skill_demand_by_contract.png │ ├── fig04_cluster_profiles.png │ └── fig05_cooccurrence_heatmap.png ├── scripts/ │ ├── 01_collect_job_postings.py ← 多源爬虫(StepStone + Indeed + LinkedIn) │ ├── 02_deduplicate_clean.py ← Levenshtein 去重(85% 阈值) │ ├── 03_nlp_skill_extraction.py ← TF-IDF + spaCy EntityRuler NER 管道 │ └── 04_kmeans_clustering.py ← K-Means + PCA(20 组件)+ 肘部/轮廓 └── docs/ └── analysis_notebook.ipynb ← 完整可复现分析(11 节)
📐 数据模式
job_postings_raw.csv — 主数据集
| 字段 | 类型 | 描述 |
|---|---|---|
posting_id |
字符串 | 唯一 ID: {SRC}-{CITY}-{DATE}-{SEQ} |
title_clean |
字符串 | 标准化职位名称(28 类) |
employer |
字符串 | 雇主名称 |
city |
分类 | 12 个德国城市之一 |
contract_type |
分类 | Full-time / Werkstudent / Praktikum / Freelance |
posted_date |
日期 (ISO) | YYYY-MM-DD |
source |
分类 | StepStone / Indeed Germany / LinkedIn |
seniority |
分类 | Junior / Mid / Senior |
description_raw |
自由文本 | 完整职位文本(HTML 来源) |
description_clean |
自由文本 | 去 HTML、标准化空白 |
skills_extracted |
列表(; 分隔) |
来自 NER + TF-IDF 的技能实体 |
cluster_id |
整数 | K-Means 聚类标签(1–4) |
cluster_name |
字符串 | 可读聚类名称 |
num_skills |
整数 | 提取的技能实体数 |
extracted_skills.csv — 每条职位技能记录
| 字段 | 描述 |
|---|---|
posting_id |
外键关联到 job_postings_raw |
skill |
标准化技能名称 |
category |
技能类别(Programming / Database / Cloud / BI / ML) |
confidence_score |
提取置信度 [0–1] |
extraction_method |
NER 或 TF-IDF |
contract_type |
继承自职位 |
city |
继承自职位 |
cluster_id |
继承自职位 |
📈 关键发现
发现 1 — 主导技能:Python + SQL 构成通用基础
| 排名 | 技能 | 占职位百分比 | 类别 |
|---|---|---|---|
| 1 | Python | 84.0% | 编程 |
| 2 | SQL | 78.0% | 数据库 |
| 3 | Excel | 59.0% | 生产力 |
| 4 | Power BI | 50.0% | BI / 可视化 |
| 5 | Git | 45.0% | DevOps |
| 6 | Azure | 40.0% | 云 |
| 7 | Jupyter | 37.1% | 编程 |
| 8 | Tableau | 35.0% | BI / 可视化 |
| 9 | NumPy | 32.2% | 编程 |
| 10 | 机器学习 | 32.0% | ML |
BI 工具发现: Power BI (50%) 在德国市场超过 Tableau (35%) — 反映微软生态系统在德国企业的统治地位。AWS (30%) 落后于 Azure (40%),与全球模式相反。
发现 2 — 资历梯度:按合同类型明显的技能升级
高级工程工具从学生岗位到全职岗位的频率跃升 5–11 倍:
| 技能 | 学生工 | 实习 | 全职 | 自由职业 |
|---|---|---|---|---|
| Python | 79% | 82% | 87% | 88% |
| SQL | 81% | 78% | 77% | 80% |
| Excel | 68% | 71% | 52% | 45% |
| Power BI | 55% | 51% | 49% | 41% |
| Azure | 22% | 19% | 47% | 50% |
| Spark | 11% | 8% | 33% | 38% |
| dbt | 8% | 6% | 29% | 32% |
| Airflow | 6% | 5% | 25% | 28% |
数据确认了两层技能格局:基础层(Python, SQL, Excel)几乎通用,专业层(Azure, Spark, dbt, Airflow, Databricks)仅对全职和自由职业开放。
发现 3 — 聚类分析:四种不同的角色原型
K-Means(k=4, 轮廓系数=0.61)基于二元技能存在矩阵,PCA(20 组件,保留 72% 方差)恢复了四种可解释的角色原型:
| 聚类 | 标签 | n | % | 主导技能 | 学生占比 |
|---|---|---|---|---|---|
| 1 | 核心分析与学生入门 | 1,248 | 39% | Python, SQL, Excel, Power BI, Git | 71% |
| 2 | 云数据工程 | 864 | 27% | Azure, dbt, Spark, Airflow, Databricks | 83% 全职 |
| 3 | 机器学习与研究 | 608 | 19% | Scikit-learn, TensorFlow, Pandas, R | 62% 全职 |
| 4 | 企业 BI 与报告 | 480 | 15% | SAP, SSRS, MicroStrategy, Excel(高级) | 78% 全职 |
87% 的学生工和实习职位属于聚类 1,验证了核心假设:学生角色围绕一组通用可及技能集,之后再分支到专业工程或机器学习轨道。
发现 4 — 地理分布:柏林主导,慕尼黑对学生最多
| 城市 | 职位占比 | 学生职位 |
|---|---|---|
| 柏林 | 24.4% | 最高(学生工 + 实习) |
| 慕尼黑 | 19.4% | 第二高 |
| 汉堡 | 12.8% | — |
| 法兰克福 | 9.7% | 金融导向(企业 BI) |
| 科隆 | 5.5% | — |
柏林和慕尼黑合计占 43.8% 的职位,并集中了大部分入门级机会,是早期职业数据候选人的主要目标城市。
发现 5 — 技能共现:Azure–Spark–dbt 形成紧密工程栈
共现热力图显示三个不同的技能星座:
| 星座 | 核心技能 | 解释 |
|---|---|---|
| 分析基础 | Python ↔ SQL (2,087) · SQL ↔ Excel (1,565) | 几乎通用配对;基线要求 |
| 云工程栈 | Azure ↔ AWS (833) · Azure ↔ Spark (828) · dbt ↔ Azure (760) | 现代数据平台集群 |
| 研究/ML栈 | NumPy ↔ 机器学习 (604) · R ↔ Matplotlib (262) | 学术/研究来源工具 |
Python–SQL 是唯一最强共现对(2,087 条职位),出现在整个语料库的 65% 中 — 使其成为进入德国数据就业市场的经验证实的最低可行技能对。
⚙️ 管道架构
┌─────────────────────────────────────────────────────────┐ │ 数据收集 │ │ StepStone · Indeed DE · LinkedIn │ │ 01_collect_job_postings.py │ │ 随机延迟 (2–8秒) · 用户代理轮换 │ │ 4,183 条原始记录 │ └────────────────────────┬──────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────┐ │ 去重与清洗 │ │ 02_deduplicate_clean.py │ │ Levenshtein 相似度 @ 85% 基于复合键 │ │ (标题 · 雇主 · 城市) │ │ + 质量过滤:描述 ≥ 100 字符 │ │ 3,200 条保留(23.5% 作为重复删除) │ └────────────────────────┬──────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────┐ │ NLP 技能提取 │ │ 03_nlp_skill_extraction.py │ │ TF-IDF (n-grams 1–3 · min_df=20 · max_df=0.85) │ │ + spaCy EntityRuler (de_core_news_sm · 156技能词汇) │ │ NER 精确率 88.4% · 召回率 82.1% │ │ 30,325 个技能-职位对 │ └────────────────────────┬──────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────┐ │ 聚类分析 │ │ 04_kmeans_clustering.py │ │ 二元技能存在矩阵 (3,200 × 32) │ │ → L2 归一化 │ │ → PCA: 20 组件 (72% 方差保留) │ │ → 肘部 + 轮廓 → 最优 k = 4 │ │ → K-Means (n_init=50 · random_state=42) │ │ 最终轮廓系数 = 0.61 │ └─────────────────────────────────────────────────────────┘
📁 输出文件参考
| 文件 | 行数 | 描述 |
|---|---|---|
job_postings_raw.csv |
3,200 | 主语料库 — 所有职位带聚类分配 |
extracted_skills.csv |
30,324 | 每行一个技能-职位对,带置信度分数 |
kmeans_clusters.csv |
3,200 | 每职位聚类标签和轮廓分数 |
skill_cooccurrence_matrix.csv |
30 × 30 | 前30项技能成对共现计数 |
🧪 质量评估
| 指标 | 数值 |
|---|---|
| 包含 ≥ 3 项技能的记录 | 96.7% |
| 平均每职位技能数 | ~9.5 |
| NER 精确率(验证样本) | 88.4% |
| NER 召回率(验证样本) | 82.1% |
| K-Means 轮廓系数 (k=4) | 0.61 |
| 跨平台重复率 | 23.5% |
| 总体质量分数 | 96.7% |
⚠️ 局限性
- 无薪资数据 — 合同类型和资历是代理变量;实际薪酬不可用
- 时间快照 — 反映 2024年1月至2025年3月;技能需求可能随市场条件变化
- 仅限德国市场 — 发现适用于 DACH 地区,可能不具全球普适性
- 爬虫脆弱性 — StepStone 和 Indeed 定期更新 HTML 结构;管道需要维护
- 技能词汇 — 156项封闭词汇意味着未纳入列表的新兴工具被系统性低估
📜 引用
bibtex @misc{kandula2026jobmarket, author = {Kandula, Nikhilvarma}, title = {Job Market Intelligence Corpus: Mapping Skill Demand in the German Technology Labour Market}, year = {2026}, howpublished = {url{https://kandula.studio}}, note = {TF-IDF + spaCy NER + K-Means Clustering, n=3200 postings} }





