mcpField
P
profiling-tables

profiling-tables

github.com/astronomerデータ・データベース4571.0k 回インストール3 週間前に更新
リポジトリ

profiling-tables について

アナリストやデータチーム向けに、SQLでテーブルの構造、統計、品質を調べるデータプロファイリングスキルです。結果を理解しやすい概要にまとめます。

主な機能

  1. 01列メタデータとテーブル規模
  2. 02型に応じた列統計
  3. 03カテゴリ列のカーディナリティ分析
  4. 04サンプル行とデータ品質の確認
  5. 05構造化プロファイルとクエリ案

活用シーン

  1. 01新しいチームメンバー向けのテーブル説明
  2. 02NULL、重複、値の範囲の確認
  3. 03カテゴリの頻度と分布の把握

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/astronomer/agents --skill profiling-tables

インストール後、Claude Code で/profiling-tablesを入力して読み込まれたか確認します。

詳細

データプロファイル

新しいチームメンバーがデータを理解するために活用できる、テーブルの包括的なプロファイルを生成します。

ステップ 1:基本メタデータ

列のメタデータをクエリします。

SELECT COLUMN_NAME, DATA_TYPE, COMMENT
FROM <database>.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = '<schema>' AND TABLE_NAME = '<table>'
ORDER BY ORDINAL_POSITION

テーブル名が完全修飾名でない場合は、まず INFORMATION_SCHEMA.TABLES を検索して場所を特定します。

ステップ 2:サイズと構造

run_sql を使って実行します。

SELECT
    COUNT(*) as total_rows,
    COUNT(*) / 1000000.0 as millions_of_rows
FROM <table>

ステップ 3:列レベルの統計

各列について、データ型に応じた適切な統計を収集します。

数値列
SELECT
    MIN(column_name) as min_val,
    MAX(column_name) as max_val,
    AVG(column_name) as avg_val,
    STDDEV(column_name) as std_dev,
    PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY column_name) as median,
    SUM(CASE WHEN column_name IS NULL THEN 1 ELSE 0 END) as null_count,
    COUNT(DISTINCT column_name) as distinct_count
FROM <table>
文字列列
SELECT
    MIN(LEN(column_name)) as min_length,
    MAX(LEN(column_name)) as max_length,
    AVG(LEN(column_name)) as avg_length,
    SUM(CASE WHEN column_name IS NULL OR column_name = '' THEN 1 ELSE 0 END) as empty_count,
    COUNT(DISTINCT column_name) as distinct_count
FROM <table>
日付/タイムスタンプ列
SELECT
    MIN(column_name) as earliest,
    MAX(column_name) as latest,
    DATEDIFF('day', MIN(column_name), MAX(column_name)) as date_range_days,
    SUM(CASE WHEN column_name IS NULL THEN 1 ELSE 0 END) as null_count
FROM <table>

ステップ 4:カーディナリティ分析

カテゴリ/ディメンションキーと考えられる列について、次の情報を取得します。

SELECT
    column_name,
    COUNT(*) as frequency,
    ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER(), 2) as percentage
FROM <table>
GROUP BY column_name
ORDER BY frequency DESC
LIMIT 20

これにより、次のことがわかります。

  • カーディナリティが高い列(ID や一意の値である可能性が高い)
  • カーディナリティが低い列(カテゴリやステータスフィールドである可能性が高い)
  • 偏った分布(1 つの値が大半を占める)

ステップ 5:サンプルデータ

代表的な行を取得します。

SELECT *
FROM <table>
LIMIT 10

テーブルが大きく、さまざまなデータを確認したい場合は、異なる期間やカテゴリからサンプリングします。

ステップ 6:データ品質の評価

次の観点で品質をまとめます。

完全性
  • NULL を含む列はどれですか?その割合はどのくらいですか?
  • NULL は想定内ですか、それとも問題ですか?
一意性
  • 主キーと見られる列に重複はありますか?
  • 想定外の重複行はありますか?
鮮度
  • データが最後に更新されたのはいつですか?(タイムスタンプ列の MAX)
  • 更新頻度は想定どおりですか?
妥当性
  • 想定範囲外の値はありますか?
  • 無効な形式(日時、メールアドレスなど)はありますか?
  • 孤立した外部キーはありますか?
整合性
  • 関連する列の値に矛盾はありませんか?
  • 論理的に矛盾するデータはありますか?

ステップ 7:概要の出力

構造化されたプロファイルを提示します。

概要

このテーブルに含まれるデータ、利用者、データの鮮度について、2~3 文で説明します。

スキーマ
列型NULL の割合%異なる値の数説明
...............
主要な統計
  • 行数:X
  • 日付範囲:Y ~ Z
  • 最終更新:タイムスタンプ
データ品質スコア
  • 完全性:X/10
  • 一意性:X/10
  • 鮮度:X/10
  • 総合:X/10
潜在的な問題

見つかったデータ品質上の懸念を列挙します。

推奨クエリ

このデータについてよくある質問に役立つクエリを 3~5 件示します。

コメント