Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
convert/input/
convert/output/
convert/.venv/
*.xlsx

# Python
__pycache__/
*.py[cod]
*.egg-info/
dist/
build/
22 changes: 16 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# データサイエンティスト スキルチェックリスト ver.5 (CSV版)
# データサイエンティスト スキルチェックリスト ver.6 (CSV版)

「データサイエンティスト スキルチェックリスト」は、データサイエンティストに必要とされるスキルをチェックリスト化したものです。チェックリスト内の各項目のスキルレベルは、★の数によって示し、見習いレベル(Assistant Data Scientist)~ 棟梁レベル(Full Data Scientist)までを判定します。

[チェックリストver.5の詳細はこちら](https://www.datascientist.or.jp/common/docs/10thsymp_skill.pdf)
[チェックリストver.6の詳細はこちら](https://speakerdeck.com/datascientistsociety/12thsymp_skill)

このリポジトリではマシンリーダブルな形式としてCSV版チェックリストを公開しています。

Expand All @@ -16,11 +16,21 @@ Web上で簡単にチェックリストを参照したい場合は、以下の

チェックリストのダウンロードは以下リンクをご利用ください

* [Excel版](https://www.datascientist.or.jp/common/docs/skillcheck_ver5.00_simple.xlsx)
* [Excel版](https://www.datascientist.or.jp/common/docs/skillcheck_ver6.00.xlsx)
* CSV版
* [ビジネス力](https://raw.githubusercontent.com/The-Japan-DataScientist-Society/skills-checklist/main/biz.csv)
* [データサイエンス力](https://raw.githubusercontent.com/The-Japan-DataScientist-Society/skills-checklist/main/sci.csv)
* [データエンジニアリング力](https://raw.githubusercontent.com/The-Japan-DataScientist-Society/skills-checklist/main/eng.csv)
* [基盤](https://raw.githubusercontent.com/The-Japan-DataScientist-Society/skills-checklist/main/foundation.csv)
* [価値創造力](https://raw.githubusercontent.com/The-Japan-DataScientist-Society/skills-checklist/main/value_creation.csv)
* [データサイエンス力](https://raw.githubusercontent.com/The-Japan-DataScientist-Society/skills-checklist/main/data_science.csv)
* [データエンジニアリング力](https://raw.githubusercontent.com/The-Japan-DataScientist-Society/skills-checklist/main/data_engineering.csv)
* [融合](https://raw.githubusercontent.com/The-Japan-DataScientist-Society/skills-checklist/main/fusion.csv)

## CSV版についての補足

### 融合スキルと価値創造サイクルについて

融合スキルは、データサイエンス・データエンジニアリング・価値創造の3領域を横断する混成スキル群です。
構成カテゴリのひとつとして「価値創造サイクル」がありますが、その内容は価値創造力(`value_creation.csv`)の「構築・運用」カテゴリ(データ整備、開発・評価、継続運用・改善、定着と横展開)と重複するため、`fusion.csv` には含めていません。
融合スキルとして「価値創造サイクル」が位置づけられていることはExcel版をご参照ください。

## 引用・改変時の注意事項

Expand Down
160 changes: 0 additions & 160 deletions biz.csv

This file was deleted.

71 changes: 71 additions & 0 deletions convert/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# convert/ — 開発者メモ

## CSV版の目的

Excel版(.xlsx)は人が読むためのフォーマット。CSV版はプログラムから扱うためのフォーマット(マシンリーダブル)。
pandas / polars / R などで直接ロードし、フィルタリング・集計・可視化・スキルチェッカー構築などに使えることがゴール。

型の一貫性・文字コード・改行の扱いがポイント。Excelの装飾的な記述(セル結合、注記行など)はCSV変換時に除去する。

## ファイル構成

```
convert/
├── pyproject.toml # 依存パッケージ(uv管理)
├── convert.py # Excel → CSV 変換スクリプト
├── validate.py # 生成CSVの品質チェックスクリプト
├── input/ # 変換元xlsxを手動配置(Git管理外)
└── output/ # 変換出力先(タイムスタンプフォルダ、Git管理外)
```

## 変換手順

```bash
# 1. input/ に xlsx を配置
# 2. 変換実行
uv run -q python convert.py

# 3. output/<timestamp>/ に CSV が生成される
# 4. 内容確認
uv run -q python validate.py output/<timestamp>/

# 5. 問題なければルートへコピー
```

## 変換仕様

- 各シートの1〜2行目(タイトル行・空行)をスキップし、3行目をヘッダーとして使用
- セル内改行(`\n`)はスペースに置換
- ヘッダー名の前後スペース・改行も除去
- Excelの注記行(`No` 列が `–` の行)は削除(`[DROP]` としてログ出力)
- エンコーディング: UTF-8 BOM付き(Excel で文字化けなく開ける)
- 文字ゆれの正規化: `〇`(U+3007) → `◯`(U+25EF)(`[CONVERT]` としてログ出力)
- 列名ゆれの正規化(`[RENAME col]` としてログ出力):
- `Sub No` → `SubNo`(改行2つ由来のスペース)
- `必須 スキル` / `必須 スキル` / `必須` → `必須スキル`

## 品質チェック仕様(validate.py)

validate.py は pandera を使って以下を検証する。

| チェック項目 | 内容 |
|---|---|
| カラム存在 | スキーマ定義の全カラムが存在すること |
| 型チェック | `No` / `SubNo` が整数(float混入・小数値を検出)、その他は文字列 |
| null チェック | 必須カラムに欠損がないこと |
| セル内改行 | 文字列カラムにセル内改行が残っていないこと |
| マーカー値 | クロスリファレンス列(BZ/DS/DE/VC)は `*` or null のみ |
| 必須フラグ値 | 必須スキル・★必須系列は `◯` or null のみ |
| スキルレベル値 | スキルレベル列は `★` / `★★` / `★★★` のみ |
| EN dash 残留 | 注記行(`No` 列 `–`)が取り残されていないこと |
| polars 互換 | polars でも問題なくロードできること |

## 出力ファイル

| ファイル | シート | 内容 |
|---|---|---|
| `foundation.csv` | 基盤 | 全DSの共通土台スキル |
| `value_creation.csv` | 価値創造力 | 旧ビジネス力を再定義。課題再定義・意思設計・ガバナンス |
| `data_science.csv` | データサイエンス力 | 情報科学・統計・ML |
| `data_engineering.csv` | データエンジニアリング力 | 実装・運用 |
| `fusion.csv` | 融合 | DS×DE×BZの混成スキル。価値創造サイクルは value_creation.csv を参照 |
88 changes: 88 additions & 0 deletions convert/convert.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
import sys
import pandas as pd
from datetime import datetime
from pathlib import Path

INPUT_FILE = Path(__file__).parent / "input" / "skillcheck_ver6.00.xlsx"
BASE_OUTPUT_DIR = Path(__file__).parent / "output"

SHEETS = {
"基盤": "foundation.csv",
"価値創造力": "value_creation.csv",
"データサイエンス力": "data_science.csv",
"データエンジニアリング力": "data_engineering.csv",
"融合": "fusion.csv",
}

# Excel 由来の列名ゆれを正規化するマップ
COLUMN_RENAMES: dict[str, str] = {
"Sub No": "SubNo", # 基盤: 改行2つ由来のスペース
"必須 スキル": "必須スキル", # データサイエンス力: 改行由来のスペース
"必須 スキル": "必須スキル", # 基盤: 改行2つ由来のスペース
"必須": "必須スキル", # 融合: 略称
}


def clean_cell(v):
if not isinstance(v, str):
return v
return v.replace("\n", " ").strip().replace("\u3007", "\u25ef")


def is_blank(v) -> bool:
return pd.isna(v) or (isinstance(v, str) and v.strip() == "")


def main():
sys.stdout.reconfigure(encoding="utf-8")
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
output_dir = BASE_OUTPUT_DIR / timestamp
output_dir.mkdir(parents=True, exist_ok=True)
print(f"Reading: {INPUT_FILE}")
print(f"Output: {output_dir}")
for sheet_name, csv_name in SHEETS.items():
df = pd.read_excel(INPUT_FILE, sheet_name=sheet_name, skiprows=2, header=0)
df.columns = [str(c).replace("\n", " ").strip() for c in df.columns]

# 列名ゆれを正規化
renamed = {old: new for old, new in COLUMN_RENAMES.items() if old in df.columns}
if renamed:
df = df.rename(columns=renamed)
for old, new in renamed.items():
print(f" [RENAME col] {sheet_name}: '{old}' → '{new}'")

# 変換前に 〇(U+3007) の件数を数えておく
maru_count = sum(
str(v).count("\u3007")
for col in df.columns
for v in df[col]
if isinstance(v, str)
)
df = df.apply(lambda col: col.map(clean_cell))
if maru_count > 0:
print(f" [CONVERT] {sheet_name}: 〇(U+3007) → ◯(U+25EF) {maru_count} 箇所")

# Drop unnamed (no header) + all-null/whitespace-only columns
unnamed_null_cols = [
c for c in df.columns
if str(c).startswith("Unnamed:") and df[c].apply(is_blank).all()
]
if unnamed_null_cols:
print(f" [DROP cols] {sheet_name}: {unnamed_null_cols}")
df = df.drop(columns=unnamed_null_cols)

# No列がEN dash(U+2013)の行は注記行 → 削除
drop_mask = df["No"].astype(str).str.strip() == "\u2013"
if drop_mask.any():
for _, row in df[drop_mask].iterrows():
print(f" [DROP] {sheet_name}: No={ascii(row['No'])}, 分類={ascii(str(row.iloc[2])[:30])}")
df = df[~drop_mask]

out_path = output_dir / csv_name
df.to_csv(out_path, index=False, encoding="utf-8-sig")
print(f" {sheet_name} -> {csv_name} ({len(df)} rows)")
print("Done.")


if __name__ == "__main__":
main()
11 changes: 11 additions & 0 deletions convert/pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
[project]
name = "skills-checklist-convert"
version = "0.1.0"
description = "Convert Excel skills checklist to CSV"
requires-python = ">=3.11"
dependencies = [
"openpyxl>=3.0",
"pandas>=2.0",
"pandera>=0.20",
"polars>=1.0",
]
Loading