gcpug / nouhau

Google Cloud Platformのノウハウを共有するRepository
https://gcpug.jp
MIT License
654 stars 23 forks source link

DataStudioで複数の項目に対してある項目が占める割合を円グラフ以外でも表現する #134

Open Kesin11 opened 4 years ago

Kesin11 commented 4 years ago

例えば、以下のような「CIのビルド履歴情報データ」に対してSUCCESSの割合を表示したいケース。

date status
2020/05/20 SUCCESS
2020/05/20 SUCCESS
2020/05/20 ABORTED
2020/05/20 SUCCESS
2020/05/21 FAILED
2020/05/21 FAILED
2020/05/21 SUCCESS
2020/05/22 FAILED
2020/05/22 SUCCESS
2020/05/22 SUCCESS

これは当然円グラフを使えば一発で作ることができます。

circle_graph

しかし、例えば日毎のSUCCESSの割合推移を折れ線グラフで表現したい場合、DataStudioではグラフの種類や設定だけではそれを実現することはできません。 単純にグラフを描こうとすると、ステータス毎の推移を出すことしかできません。

time_series

解決策

割合を表現するためには、SUCCESSのレコード数 / 総レコード数の数値を算出する必要があります。手元のデータではstatusカラムはSUCCESS | FAILED | ABORTED いずれかの文字列なので、これをどうにかSUMで数えるための数値に変換する必要があります。

そのような場合は、DataStudioで既存のカラムを加工して新しいカラムを作成する機能を使います。 ここでは式を書くことができるので、このようにCASE WHENとCONTAINS_TEXT()を使って"SUCCESS"であれば1、それ以外は0とする新しいカラムを作成します。

new_field

この新しいカラムをsuccess_countと仮に呼びましょう。"SUCCESS"のレコードだけが1, それ以外のレコードには0となるので、SUM(success_count) = SUCCESSのレコード数となります。 最終的にはSUCCESSのレコード数 / 総レコード数を表現したいわけですが、これはAVG(success_count)と一致します。

というわけで、折れ線グラフの指標にstatus_countをセットしてデフォルトのSUMからAVGに変更します。すると、このように所望のグラフを手に入れることができます。

avg_time_series (下の表は検算用。グラフ上のSUCCESSの割合が正しいことがわかります)

たまにこういうグラフを描きたいのですが、自分でもやり方をよく忘れるので今回備忘として書かせていただきました。 ちなみに、この方法は元々海外のスレで見つけたものなので参考として貼っておきます。 conditional count - Data Studio Community

試したがダメだった方法

最初はSUCCESSのものだけをカウントすればよいだろうと考えて、表に以下のようなフィルターを設定しました。 filter

しかし、これでは上手くいきません。その理由は、フィルターをかけるということはグラフの描画対象となるレコードそのものを絞ることになるためです。 つまり、SUCCESSのレコード数 / 総レコード数の"総レコード数"そのものが"SUCCESSのレコード数"になってしまうのです。

それでは平均を計算したところで当然常に1の値になってしまいます。そのような理由でこの方法は上手くいかないです。

さらにtips

"success_count"をDataStudio側で新しいカラムとして作成してもいいのですが、もしも同じデータを複数のDataStudioレポートで使う可能性があるのであれば元データの方でこれと同じカラムを作ってしまった方が良いでしょう。

DataStudioのレポートをコピーするときにデータリソースを別物として新しく作成する場合は、DataStudio側で作成した新しいカラムなどは引き継がれません。 コピー時の手作業が増えることになるので、それなりの数をコピーする予定があるのであれば元データ側で対応してしまう方が楽です。