「機械学習(ML)をやりたいが、PythonやTensorFlowの学習コストが高い」
「モデルを作ったはいいが、本番環境へのデプロイやパイプライン構築で挫折した」
そんな方向けに完全実装ガイドをまとめてみました。
多くのWebエンジニアやバックエンドエンジニアが、この「MLの壁」にぶつかります。
しかし、もし「普段書いているSQLだけで、機械学習モデルが作れる」としたらどうでしょうか?
Google Cloudが提供する BigQuery ML (BQML) は、その名の通り、データウェアハウスの中で直接MLモデルを作成・実行できる機能です。 データをPython環境(Notebook)に移動させる必要も、複雑なライブラリをimportする必要もありません。
CxxxPJ(シークス)のあるサービスでは、この技術を使って「来月、サービスの利用をやめそうな顧客」を特定し、自動的に対策を打っています。
本記事では、「解約予測(Churn Prediction)」をテーマに、実際に動くSQLコードを公開しながら、エンジニアが明日から使える実装アプローチを解説します。
第1章:なぜ「BigQuery ML」なのか?
通常のMLプロジェクトでは、データエンジニアリングの工数が8割を占めます。
通常だと、「DBからCSVをエクスポート」→「Pythonで読み込み」→「前処理」→「学習」→「推論結果をDBに戻す」…こんな感じ
だが、このデータの移動(ETL)こそが、バグの温床であり、システムの複雑性を招く原因です。
BigQuery MLのアプローチはシンプルです。
「データがある場所(BigQuery)で、計算もやってしまおう」。
- 移動ゼロ: ペタバイト級のデータでも移動不要。
- SQLのみ:
CREATE MODELと書くだけで学習開始。 - 即デプロイ: 学習が終わった瞬間から、SQLで推論(予測)が可能。
これにより、ML実装のハードルは劇的に下がりました。
第2章:【実装】解約予測モデルを作る
では、実際にコードを書いてみましょう。 シナリオは、サブスクリプション型サービス(またはECサイト)における「来月解約しそうなユーザー(churn)の特定」です。
1. 学習データの準備
まず、過去のユーザー行動ログから特徴量(Features)を作ります。 以下のようなテーブル user_features があると仮定します。
user_id: ユーザーIDrecency: 最終アクセスからの経過日数frequency: 月間アクセス回数monetary: 月間購入額is_churned: 解約したかどうか(正解ラベル:1=解約, 0=継続)
2. モデルの作成(学習)
驚くかもしれませんが、学習に必要なコードはこれだけです。
例えば、SQL
-- ロジスティック回帰モデルを作成
CREATE OR REPLACE MODEL `project_id.dataset.churn_prediction_model`
OPTIONS(
model_type='LOGISTIC_REG', -- ロジスティック回帰(2値分類)
input_label_cols=['is_churned'] -- 正解ラベルのカラムを指定
) AS
SELECT
recency,
frequency,
monetary,
is_churned
FROM
`project_id.dataset.user_features_training`
WHERE
data_date BETWEEN '2025-01-01' AND '2025-06-30';
このクエリを実行するだけで、BigQueryが裏側でトレーニングを行い、モデルが生成されます。 Pythonで scikit-learn を書く必要すらありません。
第3章:【推論】未来を予言する
モデルができたら、次は「来月の予測」です。 これもSQLの標準関数 ML.PREDICT を使うだけです。
例えば、SQL
-- 来月の解約確率を予測
SELECT
user_id,
predicted_is_churned, -- 予測結果 (1 or 0)
prob.label AS prediction_label,
prob.prob AS churn_probability -- 解約確率 (0.0 ~ 1.0)
FROM
ML.PREDICT(
MODEL `project_id.dataset.churn_prediction_model`,
(
SELECT
user_id,
recency,
frequency,
monetary
FROM
`project_id.dataset.user_features_current` -- 最新のユーザーデータ
)
),
UNNEST(predicted_is_churned_probs) as prob
WHERE
prob.label = 1 -- 「解約する(1)」確率だけ抽出
AND prob.prob > 0.7 -- 解約確率70%以上の危険ユーザーを特定
ORDER BY
churn_probability DESC;
このクエリの結果として、「解約危険度が高いユーザーリスト」が返ってきます。 エンジニアの皆さんは、このSQLをバッチ処理(Cloud Schedulerなど)で毎日回すだけでいいのです。
第4章:Pythonで「アクション」に繋ぐ
SQLでリストが出せたら、最後はアクションです。
ここで初めて、軽量なPython(Cloud Functions / Cloud Run)が登場します。
「予測」はSQLでやりましたが、「通知」はPythonの得意分野です。
例えば、Python
from google.cloud import bigquery
import requests
def send_retention_coupon(request):
client = bigquery.Client()
# さっきのSQLを実行して、危険ユーザーリストを取得
query = """
SELECT user_id, email FROM `project_id.dataset.high_risk_users`
"""
query_job = client.query(query)
for row in query_job:
# メール配信APIやLINE APIを叩く
send_email(
to=row.email,
subject="【特別なお知らせ】今月限りの50%OFFクーポン"
)
print(f"Sent coupon to {row.user_id}")
return "Done"
このように、「重い計算はBigQuery(SQL)」、「軽い連携はPython」と役割分担することで、サーバーレスかつ低コストなMLパイプラインが完成します。
まとめ:エンジニアは「モデル」ではなく「価値」を作る
これまで機械学習は、「データサイエンティスト」という専門職の特権でした。
しかし、BigQuery MLの登場により、SQLが書ける全てのエンジニアに機械学習の門戸が開かれました。
- 複雑な環境構築は不要。
- データの移動も不要。
- 標準SQLだけで、解約予測やLTV予測、商品レコメンドが可能。
技術的に難しいことをするのが目的ではありません。
「来月やめそうな顧客」を1人でも多く救い、売上を守ること。 そのための最短ルートが、このアーキテクチャなのです。
👇 【戦略】なぜ「生データ」が必要なのか?
:::info 【基礎】GA4の管理画面を見るのはやめなさい
BigQuery MLを使うには、GA4のデータをBigQueryに「生」で溜めておく必要があります。 なぜ管理画面のデータでは機械学習ができないのか?その理由と連携方法。
👉 記事を読む:GA4の管理画面を見るのは、もうやめた!脱GA4
:::
👇 【応用】予測結果でWebサイトを変える
:::info 【実装】AWSで作る「動的LP」実装ガイド
「このユーザーは解約しそうだ」と予測できたら、Webサイトにアクセスした瞬間に「引き止めオファー」を出しませんか? AWS CloudFrontを使った動的パーソナライズの実装論。
:::
記事を書いた人


AI参謀GAくん | じーえーくん
tech leadかねやん | 金岡潤
+α
「システムも野菜も、鮮度が命。」
元メガ企業のSEとして、大規模サービスのバックエンド開発・アーキテクチャ設計に従事。その後、福岡に移住し起業。「八百屋」を地域No1にするという異色の経歴を持つ。 現在はBig Tech企業のモダンな開発手法(ベクトル検索、GraphRAG、エージェント技術など)を、地方企業や中小ビジネスの現場に落とし込むDX支援を行っている。 技術の複雑さを感じさせない設計、ビジネスの成果(CX)に直結させる「翻訳者」としてテックリードを担っている。


コメント