この記事で分かること
- ClearScape の分析関数を、Python に出さず SQL で呼ぶ進め方
- 最初に触るとよい探索・前処理の関数(要約、分布、欠損、外れ値、標準化)
- Fit → Transform の2段が何か
- 小さな表で通してから本番に近づける判断
結論(先に要点)
機械学習の学習関数(k-means や GLM)の前に、現場で詰まりやすいのはデータの中身です。
ClearScape Analytics では、その確認と前処理を データベース内の関数 でやれます。
呼び方はだいたい次です。
SELECT * FROM TD_関数名(
ON 入力表 AS InputTable
USING
引数
) AS dt;
最初に通すなら、学習より 探索と前処理 です。
| やりたいこと | 関数 |
|---|---|
| 平均・中央値などの要約 | TD_UnivariateStatistics |
| 分布(ビン) | TD_Histogram |
| 欠損のない行だけ残す | TD_GetRowsWithoutMissingValues |
| 欠損を統計値で埋める | TD_SimpleImputeFit → TD_SimpleImputeTransform |
| 外れ値を外す | TD_OutlierFilterFit → TD_OutlierFilterTransform |
| 標準化 | TD_ScaleFit → TD_ScaleTransform |
Fit は「埋め方・閾値の表」を作る段、Transform はその表を DIMENSION で当てはめる段です。
※ 本稿のデータベース名・テーブル名・列名は説明用の仮名です。関数が自分の環境に入っていることが前提です。
前提
- ClearScape Analytics の in-database 関数が使える(Experience 環境、または自環境にインストール済み)
- 呼び出しは Teradata Studio / BTEQ など、いつもの SQL クライアントでよい
- いきなり巨大明細ではなく、数十行の確認用表で通す
関数が見つからないときは、カタログやインストール先(よくあるのは SYSLIB など)を先に確認します。入っていなければ、この記事の SQL は動きません。
確認用の小さな表
欠損と、極端に大きい金額を少し混ぜます。
CREATE TABLE example_db.shop_orders (
order_id INTEGER,
store_id INTEGER,
amount DECIMAL(12,2),
qty INTEGER
);
INSERT INTO example_db.shop_orders VALUES (1, 101, 1200.00, 2);
INSERT INTO example_db.shop_orders VALUES (2, 101, NULL, 1);
INSERT INTO example_db.shop_orders VALUES (3, 102, 980.00, NULL);
INSERT INTO example_db.shop_orders VALUES (4, 102, 1100.00, 3);
INSERT INTO example_db.shop_orders VALUES (5, 103, 99999.00, 1); -- 外れ値のイメージ
手順1:要約を見る
SELECT *
FROM TD_UnivariateStatistics (
ON example_db.shop_orders AS InputTable
USING
TargetColumns('amount', 'qty')
Stats('MEAN', 'MEDIAN', 'MODE')
) AS dt;
列ごとの平均・中央値が出ます。NULL がある列でも、まず「だいたいの位置」が分かります。
手順2:分布を見る
SELECT *
FROM TD_Histogram (
ON example_db.shop_orders AS InputTable
USING
TargetColumn('amount')
MethodType('STURGES')
) AS dt
ORDER BY 1, 2;
ビンの切れ方は STURGES で足ることが多いです。本数が欲しければ Equal-Width と NBins を使います。
手順3:欠損行を落とすか、埋めるか
落とす(完全な行だけ残す):
SELECT *
FROM TD_GetRowsWithoutMissingValues (
ON example_db.shop_orders AS InputTable
USING
TargetColumns('amount', 'qty')
) AS dt;
埋める(Fit で埋め方を決め、Transform で適用):
CREATE TABLE example_db.shop_orders_impute_fit AS (
SELECT *
FROM TD_SimpleImputeFit (
ON example_db.shop_orders AS InputTable
USING
ColsForStats('amount', 'qty')
Stats('MEDIAN', 'MEDIAN')
) AS dt
) WITH DATA;
CREATE TABLE example_db.shop_orders_imputed AS (
SELECT *
FROM TD_SimpleImputeTransform (
ON example_db.shop_orders AS InputTable
ON example_db.shop_orders_impute_fit AS FitTable DIMENSION
) AS dt
) WITH DATA;
Stats は ColsForStats と同じ順です。数値なら MEAN / MEDIAN などが使えます。
手順4:外れ値を外す
CREATE TABLE example_db.shop_orders_outlier_fit AS (
SELECT *
FROM TD_OutlierFilterFit (
ON example_db.shop_orders_imputed AS InputTable
USING
TargetColumns('amount')
) AS dt
) WITH DATA;
CREATE TABLE example_db.shop_orders_filtered AS (
SELECT *
FROM TD_OutlierFilterTransform (
ON example_db.shop_orders_imputed AS InputTable
ON example_db.shop_orders_outlier_fit AS FitTable DIMENSION
) AS dt
) WITH DATA;
Fit 側に分位点などの閾値が入り、Transform で行が落ちます(または置換。引数で変わります)。
99999 のような極端な金額が、ここで外れるイメージです。
手順5:標準化する(学習の前段)
GLM などは、公式でも 先に標準化 と書かれています。探索の延長で、ここまで通しておくと次が楽です。
CREATE TABLE example_db.shop_orders_scale_fit AS (
SELECT *
FROM TD_ScaleFit (
ON example_db.shop_orders_filtered AS InputTable
USING
TargetColumns('amount', 'qty')
ScaleMethod('STD')
) AS dt
) WITH DATA;
CREATE TABLE example_db.shop_orders_scaled AS (
SELECT *
FROM TD_ScaleTransform (
ON example_db.shop_orders_filtered AS InputTable
ON example_db.shop_orders_scale_fit AS FitTable DIMENSION
) AS dt
) WITH DATA;
STD は平均0・分散1の定番です。結果テーブルに残す考え方は BigQuery 側の結果テーブル化 と同じで、確認用は名前を付けて残します。
Fit と Transform の切り分け
| 段 | 役割 |
|---|---|
| Fit | 中央値、分位点、平均と標準偏差など、「当てはめ方」を表にする |
| Transform | その表を DIMENSION で渡し、本体データに適用する |
学習用と適用用で表が分かれるときも、Fit を使い回せます。
Fit なしで Transform だけ呼ぶと動きません。
失敗例と回避策
- 失敗: 本番の巨大明細でいきなり関数を回す
回避: まず数十行の確認用表で、出力列と件数を見る - 失敗: Fit テーブルを作らず Transform する
回避: 先に Fit、DIMENSIONで渡す - 失敗: 関数名が解決せずエラーになる
回避: ClearScape / 分析関数が入っているか、インストール先データベースを確認する - 失敗: 要約を見て穴埋めしたつもりで、元表を直接学習に渡す
回避: Transform 後の表を学習・次工程の入力にする
まとめ
- ClearScape の探索・前処理は、
SELECT * FROM TD_...()で SQL から呼べる - 最初は要約・分布・欠損・外れ値・標準化
- 穴埋め・外れ値・標準化は Fit → Transform
- 小さな表で通してから、対象を広げる
学習(k-means など)は、この前処理の次の話です。
