data-profiling について
data-profiling は、未知のデータセットを調査するためのスキルです。構造、品質、鮮度、パターンの評価に向けて、テーブルや列の確認、関係の発見、異常検出、調査結果の記録を支援します。
主な機能
- 01テーブルと列の棚卸し
- 02列の役割分類
- 03品質と鮮度の確認
- 04データ関係の発見
- 05分布と時系列パターンの分析
- 06データセット文書化の指針
活用シーン
- 01未知のデータウェアハウステーブルの調査
- 02欠損・不整合・異常値の検出
- 03データの鮮度と時系列の欠落確認
- 04スキーマとデータリネージの記録
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ okou-ai/ okou-skills --skill data-profilingインストール後、Claude Code で/data-profilingを入力して読み込まれたか確認します。
詳細
構造の把握
テーブル単位のインベントリ
新しいデータセットを扱う際は、まず次の質問に答えてください。
- 行数と列数の合計はいくつですか?
- 各行は何を表していますか(粒度)?
- 行を一意に識別する列はどれですか?
- データが最後に読み込まれたのはいつですか?
- データセット内の最も古い日付はいつですか?
役割による列の分類
すべての列を次のいずれかのカテゴリに分類してください。
- キー:主キー、外部キー、エンティティ識別子
- 属性:グループ化やフィルタリングに使うカテゴリフィールド(region、status、plan_type)
- メジャー:集計を目的とした数値フィールド(revenue、duration、score)
- タイムスタンプ:日付または日時フィールド(created_at、processed_on、event_date)
- 自由記述テキスト:構造化されていない文字列(説明、コメント、名前)
- フラグ:二値の真偽値インジケーター
- ネスト:JSON の塊、配列、または埋め込み構造
列単位の検査
共通チェック(すべての列タイプ)
- NULL の数と割合
- 個別値の数とカーディナリティ比(個別値の数 / 総行数)
- 出現回数とともに、最も頻度の高い値を上位 5〜10 件
- 頻度が最も低い値を下位 5 件(異常の発見に役立ちます)
数値メジャー
Minimum, maximum, mean, median
Standard deviation
Percentile ladder: p1, p5, p25, p75, p95, p99
Count of zeros
Count of negatives (flag if unexpected)
テキストおよびカテゴリフィールド
Shortest length, longest length, average length
Count of empty strings
Format regularity (do values follow a consistent pattern?)
Case consistency (uniform upper, uniform lower, or mixed?)
Count of values with leading or trailing whitespace
日付およびタイムスタンプフィールド
Earliest date, latest date
Count of nulls
Count of future dates (flag if the domain forbids them)
Distribution across months or weeks
Gaps in expected daily/weekly cadence
ブールフィールド
True count, false count, null count
True proportion
関係の発見
各列を個別に調べた後、次のつながりを探します。
- 外部キー候補:値が別のテーブルを参照している可能性のある ID 列
- 階層ディメンション:自然な入れ子構造を持つ列(国 > 地域 > 都市)
- 相関するメジャー:連動して推移する数値列
- 計算列:同じテーブル内の別の列から導出されたと思われるフィールド
- 重複情報:同一またはほぼ同一の内容を持つ列
データ品質の評価
完全性の評価
各列を次の段階に分類してください。
- 完全(99% 超に値あり):対応は不要です
- ほぼ完全(95〜99%):欠損値を調査してください
- 欠損あり(80〜95%):欠損が体系的に発生しているか、列を引き続き利用できるかを判断してください
- 疎(80% 未満):補完または追加データなしでは、おそらく利用できません
一貫性チェック
次の点を確認してください。
- 値の正規化の失敗:同じ概念が複数の表記になっている(「USA」、「US」、「United States」、「us」)
- 型の不一致:数値がテキストとして格納されている、日付の形式に一貫性がない
- 参照切れ:一致する親レコードが存在しない外部キー値
- ルール違反:負の数量、終了日が開始日より前、0〜100 の範囲外の割合
- 列間の矛盾:ship_date が NULL なのに status = 'shipped'
正確性に関する警告サイン
データの信頼性に問題がある可能性を示すパターン:
- センチネル値:0、-1、999999、「N/A」、「TBD」、「test」、「xxx」
- 疑わしいデフォルト値への偏り:想定よりもはるかに多く出現する値がある
- 古いレコード:稼働中のシステムなのに、updated_at 列に最近の更新がない
- 物理的にあり得ない値:150 を超える年齢、数十年先の日付、負の期間
- 丸めの痕跡:5 または 10 の倍数に不自然に集中している(推定値であることを示唆します)
最新性の評価
- 最も新しい行のタイムスタンプはいつですか?
- このテーブルはどのくらいの頻度で更新するべきですか?
- イベント発生からデータウェアハウスへの到着までに、測定可能な遅延はありますか?
- 時系列に欠けている日または時間はありますか?
パターンの認識
分布形状
数値列をプロファイリングする際は、形状を分類します。
- ベル型:平均値と中央値がほぼ等しく、裾が対称です
- 右に歪んだ分布:少数の非常に大きな値による長い右裾があります(収益、セッション時間によく見られます)
- 左に歪んだ分布:少数の非常に小さな値による長い左裾があります(あまり一般的ではありません)
- 二峰性:明確なピークが2つあります(2つの母集団が統合されている可能性を示します)
- べき乗則分布:ごく少数の非常に大きな値が全体を支配し、多くの値がゼロに近い状態です(ユーザーエンゲージメント指標)
- 一様分布:範囲全体でおおむね平坦です(多くの場合、合成データまたはランダムに生成されたデータです)
時系列パターン
時間データについては、次の点を調査します。
- トレンド:継続的な上昇または下降
- 季節性:毎週、毎月、四半期ごと、毎年などの繰り返しサイクル
- 曜日による影響:平日と週末の体系的な差異
- 祝日の影響:既知の祝日前後に見られる急増または低下
- 水準の変化:基準値の急激かつ持続的な変化
- 単発の異常値:一般的なパターンから外れる単一のデータポイント
セグメントの発見
次の方法で、自然なグループ分けを明らかにします。
- 異なる値が3〜20個あるカテゴリ列を特定する
- 各セグメント値について、指標の分布を比較する
- 全体と大きく異なる挙動を示すセグメントを強調する
- 見かけ上のセグメントに、意味のあるサブセグメントが含まれていないか確認する
相関のスキャン
数値列全体を対象に、次の処理を行います。
- ペアごとの相関行列を作成する
- 強い関連(|r| > 0.7)を強調する
- 相関は因果関係を証明しないことを忘れず、この点を明記する
- ピアソンの r では見逃される非線形関係(二次関数、対数関数)を調べる
調査結果の記録
データセットの概要テンプレート
## Table: [schema.table_name]
**Purpose**: [What this table captures]
**Grain**: [One row per...]
**Primary Key**: [column(s)]
**Approximate Rows**: [count, as of date]
**Refresh Cadence**: [real-time / hourly / daily / weekly]
**Responsible Team**: [owner]
### Important Columns
| Column | Type | Meaning | Sample Values | Notes |
|--------|------|---------|---------------|-------|
| user_id | STRING | Unique user handle | "usr_abc123" | References users.id |
| event_type | STRING | Action category | "click", "view", "purchase" | 15 distinct values |
| revenue | DECIMAL | USD transaction amount | 29.99, 149.00 | Null for non-purchases |
| created_at | TIMESTAMP | Event occurrence time | 2024-01-15 14:23:01 | Partition column |
### Join Paths
- Links to `users` via `user_id`
- Links to `products` via `product_id`
- Parent of `event_details` (one-to-many on event_id)
### Known Caveats
- [Document any quality issues]
- [Note analytical gotchas]
### Typical Query Use Cases
- [List common analytical patterns against this table]
スキーマを調べるクエリ
データウェアハウスに直接接続して作業する際は、次のパターンを使用します。
-- Enumerate tables in a schema (PostgreSQL)
SELECT table_name, table_type
FROM information_schema.tables
WHERE table_schema = 'public'
ORDER BY table_name;
-- Inspect column metadata (PostgreSQL)
SELECT column_name, data_type, is_nullable, column_default
FROM information_schema.columns
WHERE table_name = 'target_table'
ORDER BY ordinal_position;
-- Rank tables by storage footprint (PostgreSQL)
SELECT relname, pg_size_pretty(pg_total_relation_size(relid))
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC;
-- Row count per table (general approach)
-- Execute individually: SELECT COUNT(*) FROM table_name
データリネージの追跡
不慣れなデータウェアハウスを調査する際は、次の手順で進めます。
- 利用レイヤーから始め、レポートやダッシュボードを支えるテーブルを特定します
- 依存関係を上流へたどり、それらのテーブルに何がデータを供給しているか確認します
- raw/staging/mart のアーキテクチャをマッピングします
- データを拡充、フィルタリング、集約する変換処理の場所を追跡します
- データが外部ソースと結合される箇所を記録します
コメント
Markdown 対応