Kibanaのビジュアライゼーションでデータをパーセントで表示する
データ分析において、パーセンテージ(百分率)を使って効果的に数値を比較するアプローチは不可欠です。特に、対象のサンプルサイズや総数が大きく異なるデータのデモンストレーションでは重要な手法です。パーセンテージを使えば、データの総和が時間範囲や地理的地域、製品ラインなどの次元的カテゴリを横断してどの程度変化するかをすばやく、正確に理解することができます。
本ブログ記事では、円グラフや単一の数値メトリック、表、TSVB(時系列データビジュアライザー)を使った時系列など、Kibanaでよく使われる可視化でパーセンテージを計算する方法をご紹介します。
本記事では、Kibanaで提供されている航空機フライトとeコマースのサンプルデータセットを使用し、次のような問いに回答する手法を学びます。
- 定刻に離着陸したフライトのパーセンテージは?
- 遅延の各種類の割合を時間経過で示すと?
- 総売り上げの変化を週別に比較すると?
作業に入る前に、航空機フライトとeコマースのサンプルデータをインストールしていただく必要があります。サンプルデータは、自前のクラスター(6.5以降)にインストールしていただくことも、Elasticsearch Serviceの14日間無料トライアルを立ち上げてインストールしていただくこともできます。
定刻に離着陸したフライトのパーセンテージは?
定刻のフライト目標に対して、航空会社がどのような成績を収めているか、大量のデータを用いてダッシュボードに表示することを顧客が希望しているとします。kibana_sample_data_flightsというサンプルインデックスの各ドキュメントは、単一のフライトを表しています。したがってパーセンテージを計算するには、“定刻フライト”を示すドキュメントの数を全フライト数で割る必要があります。
この割り算を行うため、フィルターレート計算機能を持つTSVBメトリックビジュアライゼーションを使う必要があります。フィルターレートは2セットのドキュメントの同じメトリックで割り算を行い、数値を返します。TSVBを使用する唯一の要件はインデックスの時間フィールドです。これは、kibana_sample_data_flightsインデックスで提供されています。
Kibana 7.4以降のTSVBでこのように設定するには、はじめに可視化のタイプとデータセットを選択します。次に、使用するアグリゲーションを設定し、上の図のようにパーセンテージを表示します。
可視化のタイプとデータセットを選択するには、次の手順を実行します。
- TSVBを開き、[Metric](メトリック)タブを選択します。
- [Panel options](パネルオプション)タブを選択します。
- [Data timerange mode](データ期間モード)を最新の時間間隔のみではなく、[Entire time range](時間範囲全体)に設定します。補足:この設定はKibanaバージョン7.4以降でのみ使用できます。これより古いバージョンでは、日付間隔の値を大きく設定することができます。
- インデックスパターンのフィールドにkibana_sample_data_flightsを入力します。[Time field](時間フィールド)を[timestamp]に設定します。
インデックスと時間範囲を選択する手順は以上です。これで表示データを設定することができます。
- [Data](データ)タブに戻り、[Filter Ratio](フィルターレート)を使って特定の値のパーセンテージを計算します。たとえば、FlightDelayType:"No Delay"の値などです。
- [Filter Ratio](フィルターレート)はクエリ文字列の構文を使用して2セットのドキュメントを選択します。
- [Options](オプション)タブでパーセントのフォーマッターを選択します。
- デフォルトの4桁の設定が大きすぎる場合は、カスタムフォーマットの文字列を使用して桁数を小さくします。
単一の値ではなく、複数の値を比較する場合、Kibanaにある別の2つのビジュアライゼーションを使うことができます。[bucket aggregation](バケットアグリゲーション)を使用して比較する値を指定すると、円グラフ、または表を使って各値をパーセンテージに転換できます。
これらのビジュアライゼーションは、FlightDelayTypeフィールドでTermsバケットアグリゲーションを使い、バケットあたりの数を全体に占めるパーセンテージに変換して表示します。フライトのサンプルデータでは、FlightDelayTypeの値は6つしかありません。したがって、Termsのサイズが6以上に設定されているとき、正確なパーセンテージを表示します。作業するデータがユニークな値を含む場合は、"Other"バケットを有効化して、データの100%をカバーする必要があります。
遅延の各種類の割合を時間経過で示すと?
同じ航空会社で、今度はダッシュボードに2つの可視化を並べて表示することになったとします。上の可視化のサマリーを、時系列での可視化と並べて比較します。特定の時間範囲の詳細を取得し、サマリーと詳細を同時に表示することになります。
フライトドキュメントには時間フィールドがあるため、この可視化を構築するにあたってTSVBが最もパワフルな選択肢となります。先ほどと同じ設定を使い、Filter Ratio(フィルターレート)を活用して、時間間隔ごとに"No Delay"のフライト数をフライト総数で割ることができます。
1つ以上の系の比較は、複数のフィルターレートを構築するやり方でも、選択したグループに対してアグリゲーションを使用するやり方でも実施することができます。TSVBには、複数の系を100%に縮小拡大して表示するモードがあります。
TSVBにパーセンテージの可視化を積み重ねる設定を行うには、まず適切なデータを指定し、次にアグリゲーションを設定します。適切なデータを指定する手順は次の通りです。
- TSVBを開き、[Panel options](パネルのオプション)を選択します。次に、インデックスパターンのフィールドにkibana_sample_data_flightsを入力します。
- [Time field](時間フィールド)でtimestampを指定します。
アグリゲーションを設定する手順は次の通りです。
- [Data](データ)タブに戻ります。
- [Group by]以下で、FlightDelayTypeを[Terms]に指定します。
- [Options](オプション)タブへ移動します。
- [Data Formatter]で[Percent]を選択します。
- [Stacked]で[Percent]を選択します。
- [Split color theme]で[Rainbow]を選択します。
売り上げの変化を週別に比較すると?
運営するeコマースで、顧客が各トランザクションをkibana_sample_data_ecommerceインデックスに格納しているとしましょう。顧客は売り上げの変化を週別に表示する機能を要望しています。売り上げはビジネスにとって非常に重要な数字です。この設問には時間という要素が含まれるので、ビジュアライゼーションの構築にTSVBを使用します。Timelionで週比較のチャートを構築することも可能ですが、本記事では省略しています。
さきほど説明したように、TSVBは、同じアグリゲーションを使用してメトリックのビジュアライゼーションと時系列のビジュアライゼーションの両方を構築することができます。上の例では[Data timerange mode](データ期間モード)を[Entire time range](時間範囲全体)に設定しましたが、今回の設定は異なります。このビジュアライゼーションでは、1週間前の同じ日と比較した最も新しい日付のデータのみを表示します。図のように、これらの2つのビジュアライゼーションは、データの最も新しい日付で5.2%の減少があったことを示しています。
このビジュアライゼーションを構築するには、各日の総売り上げを合計し、7日前の総売り上げと比較する必要があります。この比較を実行する最も簡単な方法はSerial Difference(連続差異)アグリゲーションです。これは、各値から特定の間隔をさかのぼった値を減算するアグリゲーションです。
上の例と同様にTSVBを設定します。kibana_sample_data_ecommerceインデックスを指定し、時間フィールドをorder_dateに設定します。さらに、間隔をきっかり1d(1日)にします。TSVBのデフォルトの間隔は全体の時間範囲によって変わりますが、今回の計算では常に同じ時間範囲とする必要があります。
[Data](データ)タブに戻り、taxful_total_priceフィールドにSum(合計)アグリゲーションを指定します。
さらにSum of taxful_total_priceにSerial Difference(連続差異)アグリゲーションを追加し、ラグを7バケットに指定します。これは、すでに時間間隔を1日に設定しているためです。これでSerial Difference(連続差異)アグリゲーションが各日の値から7バケット前の値を減算し、前の週に対する総売り上げの差額を出力します。連続差異メトリックはこのように算出されるので、最初の7日間は空白になります。したがって時間範囲は長期を選択する必要があります。
最後に、算数を活用して前週に対する差額をパーセンテージに変換します。現在の売り上げと差額を合計し、現在の値で除算します。
ここで使うPainless scriptは次の通りです:((params.total + params.diff) / params.total) - 1
これで上の図のようなビジュアライゼーションが出力されます。分かりやすくするために付け加えておくと、静的な値である0を使って新しい系を作成し、0差異のベースラインをハイライトすることもできます。
[Time Series](時系列)タブと[Metric](メトリック)タブを切り替えて、どちらがよりユースケースに適したプレゼンテーションになるか判断することができます。
まとめ
本記事でご紹介しているのは、Kibanaで効果的に計算したり、パーセンテージを使ったりする方法のいくつかの例です。記事を読んで、パーセンテージを扱うにあたってさらに多くの計算オプションを探索してみたいと感じた方はぜひ、KibanaのCanvasや、クエリとデータ表示の制御機能も試してみていただければと思います。
参考資料
- Kibana best practices for visualizing time series data | Elasticビデオ(Kibanaを使った時系列データ可視化のベストプラクティス)
- A guide to scripting with the Painless Scripting Language(Painlessスクリプト言語を使ったスクリプティングのためのガイド)
- Canvas function reference(Canvas機能の参考情報)