Technical Blog テクニカルブログ
  1. HOME
  2. テクニカルブログ
  3. Looker:LookML開発機能アップデート!~PoP分析~

Looker:LookML開発機能アップデート!~PoP分析~

投稿者:杉山

目次

  1. はじめに
  2. period over periodとは
  3. 手順・結果
  4. さいごに

1.はじめに

こんにちは、杉山です。
気づけば今年も半年が過ぎ、暑い日が続いてますね…

“あつい”といえば、『Gemini in Looker』や『Looker Agent』など生成AIに関連するLookerアップデートが注目される中、Lookerの開発機能も続々とアップデートがありLookML開発者にとっては”あつい”ニュースも多いのではないでしょうか?!

特に今回はPreview段階である『measure:period_over_period』の機能について実際のユースケースを交えながらご紹介いたします!

2.period over periodとは

そもそもperiod over periodとは日本語に翻訳すると、『前期比』を表します。いわゆる現在と過去の同等の期間の同じ測定値と比較することを頭文字をとってPoP分析と呼びます。

これまでLookerでPoP分析を行う場合は、昨年こちらのブログでもご紹介したように「DWHで前年実績をデータとして持つ」または「LookMLで少し複雑な定義を行う」必要がありました。しかし、今回アップデートされた『measure:period_over_period』を利用すると、上記2つを行わずとも簡単に前年比較等の分析を行うことが可能になります!

3.手順・結果

※ブログ投稿時点で『measure:period_over_period』が利用可能なデータベースはAmazon Redshift、Google BigQuery、Snowflakeの3種類です。最新のサポート状況は公式ドキュメントをご参照ください。


前年比較

まずは比較対象のmeasureと期間を定義するdimensionを決めます。
今回使用するデータはECサイトの売上データで、比較対象のmeasureをsales(売上金額)、期間のdimensionをsalesdate(売上日)とします。

いずれもt_sales.view内に定義されており、前年比較用のmeasureも同じview内に作成します。

  measure: sale_last_year {
    type: period_over_period
    label: "前年売上金額"
    description: "前年の売上金額"
    ## 比較対象のmeasure
    based_on: t_sales.sales
    ## 期間のdimension
    based_on_time: t_sales.salesdate_year
    ## 比較したい期間
    period: year
    ## 過去の比較の場合はprevious
    kind: previous
  }

この定義を実行した結果をExploreでみてみると、2025年の前年売上金額が2024年の売上と同等になっていることがわかります!


前月比較

前年比較と同様に比較対象のmeasureをsales(売上金額)、期間のdimensionをsalesdate(売上日)とし、前月比較用のmeasureも同じview内に作成します。

  measure: sale_last_month {
    type: period_over_period
    label: "前月売上金額"
    description: "前月の売上金額"
    based_on: t_sales.sales
    ## based_on_timeはyearでもmonthでもperiod(比較で遡る期間)の定義に依存する
    based_on_time: t_sales.salesdate_year
    ## 比較したい期間
    period: month
    kind: previous
  }

前年比較との変更点はperiodの定義のみで、今回は前月比較なので『month』と定義します。
実行結果は以下の通り、2025年6月の前年売上金額が2025年5月の売上金額と同等になっています◎


前月差

これまでの定義と同様に比較対象のmeasureをsales(売上金額)、期間のdimensionをsalesdate(売上日)とし、前月差用のmeasureも同じview内に作成します。

  measure: sale_month_difference {
    type: period_over_period
    label: "売上金額_前月差"
    description: "今月から前月の値を差し引いた売上金額"
    based_on: t_sales.sales
    based_on_time: t_sales.salesdate_year
    period: month
    ## 過去との差分を算出したい場合はdifference
    kind: difference
  }

前年比較との変更点はkindの定義のみで、今回は差分を算出したいので『difference』と定義します。
実行結果は以下の通り、2025年7月の前月差には(7月の売上金額) – (6月の売上金額)が表示されています◎


変化率

これまでの定義と同様に比較対象のmeasureをsales(売上金額)、期間のdimensionをsalesdate(売上日)とし、変化率用のmeasureも同じview内に作成します。

  measure: sale_month_relative_change {
    type: period_over_period
    label: "売上金額_変化率"
    description: "(今月-前月)/前月の売上金額"
    based_on: t_sales.sales
    based_on_time: t_sales.salesdate_year
    period: month
    ## 変化率を算出したい場合はrelative_change
    kind: relative_change
    value_format_name: decimal_2
  }

変化率を算出したい場合は『relative_change』と定義します。また変化率で小数点以下が多くなるので、value_format_nameを追加して小数点以下2桁までを表示させています。
実行結果は以下の通り、2025年7月の変化率は(7月の売上金額 – 6月の売上金額)/ 6月の売上金額が『変化率』として表示されています◎


(番外編)実行時点での結果比較

popのmeasureには『value_to_date』というサブパラメーターが存在します。『value_to_date: yes』と定義すると、クエリが実行された断面のデータを比較対象として表示するため、「今日と昨日の同時間での結果を比較する」といった分析が可能になります!(デフォルトではnoと定義されるため、定義がなければ適用されません)

わかりやすく比較するためにこれまでとは異なり、Webログのデータで結果をみてみます。

「前日セッション数」にはvalue_to_dateが定義されていないので、終日のセッション数合計値が表示されているのに対し、「前日セッション数(分析時の時間までのデータ)」には『value_to_date: yes』の定義が追加されているため、分析時(2025年7月7日17:31:40)にあわせて17:31:40までの前日セッション数が日ごとに表示されています。

以上、今回ご紹介した年・月・日以外にも、会計年度や会計四半期、四半期、週単位でも比較が可能で比較したい期間をperiodに定義することで変更が可能ですので是非お試しください!

4.さいごに

今回は『measure:period_over_period』というテーマについてご紹介しましたがいかがでしたでしょうか?これまでPoP分析をLookerで実装するとなると、SQLで定義していた方が多いと思いますが、シンプルな定義になったことでメンテナンス性も各段と上がったかと思います!◎

ちなみにこれってSQLどうなってるの?と気になる方もいらっしゃるかと思うので、例として前年売上比較をした際のSQLはこちらで、(動的にWITH句で一時テーブルが作成される挙動のようです!

WITH t_sales__lkr_pop_951 AS (
SELECT
    (TIMESTAMP(DATE_TRUNC(t_sales.salesdate , YEAR))) AS t_sales_salesdate_year,
    COALESCE(SUM(IFNULL( t_sales.amount  * m_product.price  , 0) ), 0) AS t_sales_sales,
    COALESCE(SUM(IFNULL( t_sales.amount  * m_product.price  , 0) ), 0) AS t_sales_sale_last_year
FROM `xxx.t_sales`
     AS t_sales
LEFT JOIN `xxx.m_product`
     AS m_product ON t_sales.productid = m_product.productid
GROUP BY
    1
)
SELECT
    (EXTRACT(YEAR FROM t_sales_salesdate_year)) AS t_sales_salesdate_year,
    t_sales_sales,
        (((SELECT
                    t_sales_sale_last_year
                FROM t_sales__lkr_pop_951
                WHERE t_sales_salesdate_year = (TIMESTAMP(DATETIME_ADD(DATETIME( t0.t_sales_salesdate_year ), INTERVAL -1 YEAR)))))) AS t_sales_sale_last_year
FROM
    t_sales__lkr_pop_951 AS t0
ORDER BY
    1 DESC
LIMIT 500
ページのトップへ