はじめに
現代のシステム運用やビジネス分析では、膨大な時系列データの変化をいかに迅速に検知するかが重要です。CPU 使用率やリクエスト数の急増、ログに記録される異常パターン、KPI の傾向変化など、単純な平均値や合計値だけでは捉えきれない「急激な変化」や「分布の変化」を見逃してしまうことがあります。
Elasticsearch では、新しいクエリ言語 ES|QL に搭載された CHANGE_POINT コマンドを使うことで、こうした変化点を統計的に自動検出することが可能です。本記事では、CHANGE_POINT の基本的な使い方から、出力結果の読み取り方、実際のユースケースまでをわかりやすく解説します。これを活用することで、システム運用やデータ分析の効率を大幅に向上させることができます。
ドキュメントはこちらです
https://www.elastic.co/docs/reference/query-languages/esql/commands/change-point
記事を書いている2025/12/10では、Platinumライセンス以上が必要です
CHANGE_POINT機能とは
実はこれまでも同じ機能はAIOpsというカテゴリで存在していました。
https://www.elastic.co/docs/explore-analyze/machine-learning/machine-learning-in-kibana/xpack-ml-aiops#change-point-detection
何らかの数値的な傾向(ログの数とかストレージの利用率とか)が変わった場合に検知する機能のことを言います。
- dip
- 値が一時的に急落したポイントを検出。例:サーバ障害でアクセス数が急減。
- distribution_change
- 値の全体分布が変化したポイントを検出。例:セール期間で購入額の分布が広がる。
- spike
- 値が一時的に急上昇したポイントを検出。例:キャンペーンでアクセス数が急増。
- step_change
- 値の水準が恒久的に変化したポイントを検出。例:システム変更後に平均CPU使用率が上昇。
- trend_change
- 値の長期的な傾向が変化したポイントを検出。例:広告効果でPV数が徐々に増加。
短期的なものはグラフなどでも見つけやすいと思いますが、長期的な変化はなかなか難しかったりします。
本記事ではいくつかの例をダミーデータを作成してCHANGE_POINTを使って見つけてみます。
準備
- Elastic Stack
- Docker / docker compose
手順
まずこちらのリポジトリをクローンします
git clone https://github.com/legacyworld/change_point
.env
.env_sampleを.envにコピーして編集します
ELASTIC_HOST=https://v9-1.es.ap-northeast-1.aws.found.io
ELASTIC_API_KEY=LXpKWDNab0JzMzB2UkFFUWdpQjc6eW5aVXNkRC1FRzAxZGM0ZVp1bHBRQQ==
ELASTIC_INDEX=test-storage-trend
ELASTIC_HOSTとELASTIC_API_KEYはこちらの記事を参考にしてください
https://qiita.com/takeo-furukubo/private/250245360d59c1765408#%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0
ELASTIC_INDEXは何でも良いです
trend change
まずは長期的な傾向の変化を捉えます。例としてストレージの利用率が徐々に上がっていくが、ある時を境にその増加率が大きくなる、というパターンです。
以下のコマンドでダミーデータを作ってElasticsearchに投入します
docker exec -it python python storage.py
こんな感じで表示されます
Elasticsearch接続成功: v9.2.0
既存のインデックス 'test-storage-trend' を削除しています...
削除完了。
インデックス 'test-storage-trend' へデータを送信中...
接続先: https://v9-1.es.ap-northeast-1.aws.found.io
データ期間: 2025-10-21 15:21:05.029923+00:00 〜 2025-12-02 07:21:05.029923+00:00
----------------------------------------
★ トレンド変化時刻: 2025-11-15 15:21:05.029923+00:00
(データ生成開始から 600 時間後)
----------------------------------------
完了: 成功 1000 件
トレンドの変更は2025/11/15 15:21付近で起こしています。このあたりを検知できれば良しとしましょう。
Discoverに行って、右上にあるTry ES|QLをクリックします。

Time Rangeを`40 days"にして、以下を入力するとデータが表示されます
FROM test-storage*
| KEEP @timestamp, system.filesystem.used.pct
途中からストレージ利用が加速しているのがわかります。
では変化点を見つけてみます。
以下を入力します
FROM test-storage*
| CHANGE_POINT system.filesystem.used.pct AS changePointType, pValue
| KEEP @timestamp, system.filesystem.used.pct, changePointType
| WHERE changePointType IS NOT NULL
11/15の22:16付近と出ました。
実際に変わった時間(2025/11/15 15:21付近)とそんなに大きくは変わりません。
このES|QLを使ってAlertを作れば、利用率の傾向が変わったときにAlertを発報することが出来ます。
まとめ
本記事では、Elasticsearch の ES|QL に搭載された CHANGE_POINT コマンドを活用し、時系列データの変化点を自動的に検出する方法を紹介しました。
検証では、ストレージ利用率の増加ペースが途中から変化する「トレンドチェンジ」のシナリオを用いましたが、実際に変化が発生した時刻に近いポイントを ES|QL だけで特定できることが確認できました。
本記事のポイント
- 統計的検知の簡素化
- 従来は複雑な機械学習ジョブの設定が必要だった変化点検知が、クエリを書くだけで手軽に実行可能になりました。
- 多様な変化に対応
- スパイク(急増)やディップ(急落)だけでなく、今回のような長期的なトレンドの変化や分布のズレも検知可能です。
- 運用監視の高度化
- 単純な閾値(例: 90%超えでアラート)では手遅れになりがちな「異常なペースでの増加」などを早期に発見し、Alert 機能と組み合わせることで予兆検知を実現できます。
Platinum ライセンス以上が必要とはなりますが、システム運用における監視の質を向上させるだけでなく、ビジネスKPIの変動検知など幅広い分野で応用できる強力な機能です。ぜひ、皆さんの環境でも試してみてください。

