日本語

ウィンドウ関数で時系列データの力を解き放ちます。このガイドでは、基本的な概念、実践的な例、およびデータ分析の高度なテクニックをカバーします。

時系列分析:データインサイトのためのウィンドウ関数をマスターする

時系列データは、その連続的で時間依存的な性質によって特徴付けられ、業界全体に遍在しています。株価の追跡やウェブサイトのトラフィックの監視から、センサーの読み取り値の分析や販売傾向の予測まで、時系列データから意味のある洞察を抽出する能力は、情報に基づいた意思決定にとって非常に重要です。ウィンドウ関数は、テーブルまたはデータフレーム内の現在の行に関連する行のセット全体で計算を実行するための強力で柔軟なツールセットを提供し、時系列分析に不可欠なものとなっています。

時系列データの理解

時系列データは、時間順にインデックスが付けられたデータポイントのシーケンスです。データポイントは、次のようなさまざまなメトリックを表すことができます。

時系列データを分析するには、パターン、傾向、季節性を特定することが含まれます。これは、将来の値を予測したり、異常を検出したり、ビジネスプロセスを最適化するために使用できます。

ウィンドウ関数の紹介

ウィンドウ関数は、ウィンドウ化された集計関数または分析関数とも呼ばれ、行を従来の集計関数(SUM、AVG、COUNTなど)のように単一の結果セットにグループ化せずに、現在の行に関連する行のセットに対して計算を実行できます。この機能は、移動平均、累積和、その他の時間ベースのメトリックを計算する必要がある場合が多い時系列分析に特に役立ちます。

ウィンドウ関数は通常、次のコンポーネントで構成されます。

  1. 関数:実行する計算(AVG、SUM、RANK、LAGなど)。
  2. OVER句:計算に使用される行のウィンドウを定義します。
  3. PARTITION BY句(オプション):データをパーティションに分割し、ウィンドウ関数が各パーティションに個別に適用されます。
  4. ORDER BY句(オプション):各パーティション内の行の順序を指定します。
  5. ROWS/RANGE句(オプション):ウィンドウフレームを定義します。これは、計算に使用される現在の行を基準とした行のセットです。

主要な概念と構文

1. OVER()句

OVER()句は、ウィンドウ関数の中心です。関数が操作する行のウィンドウを定義します。引数のない単純なOVER()句は、結果セット全体をウィンドウと見なします。例:

SQLの例:

SELECT
  date,
  sales,
  AVG(sales) OVER()
FROM
  sales_data;

このクエリは、sales_dataテーブルのすべての日付にわたる平均売上高を計算します。

2. PARTITION BY

PARTITION BY句は、データをパーティションに分割し、ウィンドウ関数は各パーティションに個別に適用されます。これは、データ内の異なるグループのメトリックを計算する場合に役立ちます。

SQLの例:

SELECT
  date,
  product_id,
  sales,
  AVG(sales) OVER (PARTITION BY product_id)
FROM
  sales_data;

このクエリは、製品ごとに平均売上高を個別に計算します。

3. ORDER BY

ORDER BY句は、各パーティション内の行の順序を指定します。これは、実行合計、移動平均、およびその他の時間ベースのメトリックを計算するために不可欠です。

SQLの例:

SELECT
  date,
  sales,
  SUM(sales) OVER (ORDER BY date)
FROM
  sales_data;

このクエリは、時間の経過に伴う売上高の累積和を計算します。

4. ROWS/RANGE

ROWS句とRANGE句は、ウィンドウフレームを定義します。これは、計算に使用される現在の行を基準とした行のセットです。ROWS句は物理的な行番号に基づいてウィンドウフレームを指定し、RANGE句はORDER BY列の値に基づいてウィンドウフレームを指定します。

ROWSの例:

SELECT
  date,
  sales,
  AVG(sales) OVER (ORDER BY date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)
FROM
  sales_data;

このクエリは、過去3日間(当日を含む)の売上高の移動平均を計算します。

RANGEの例:

SELECT
  date,
  sales,
  AVG(sales) OVER (ORDER BY date RANGE BETWEEN INTERVAL '2' DAY PRECEDING AND CURRENT ROW)
FROM
  sales_data;

このクエリは、過去2日間(当日を含む)の売上高の移動平均を計算します。`RANGE`は、数値または日付/時刻データ型の順序付けられた列が必要です。

時系列分析のための一般的なウィンドウ関数

1. ローリング/移動平均

ローリング平均(移動平均とも呼ばれます)は、時系列データの短期的な変動を平滑化し、長期的な傾向を強調するために広く使用されている手法です。これは、指定された期間にわたる値を平均することによって計算されます。

SQLの例:

SELECT
  date,
  sales,
  AVG(sales) OVER (ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS moving_average_7_days
FROM
  sales_data;

このクエリは、7日間の売上高の移動平均を計算します。

Pythonの例(Pandasを使用):

import pandas as pd

# 'date'列と'sales'列を持つPandas DataFrame 'sales_df'があると仮定します

sales_df['moving_average_7_days'] = sales_df['sales'].rolling(window=7).mean()

グローバルなアプリケーションの例:多国籍小売業者は、30日間の移動平均を使用して、日々の売上高の変動を平滑化し、さまざまな地域にわたる根本的な売上高の傾向を特定できます。

2. 累積和

累積和(実行合計とも呼ばれます)は、現在の行までの値の合計を計算します。これは、時間の経過に伴う合計累積値を追跡するのに役立ちます。

SQLの例:

SELECT
  date,
  sales,
  SUM(sales) OVER (ORDER BY date) AS cumulative_sales
FROM
  sales_data;

このクエリは、時間の経過に伴う売上高の累積和を計算します。

Pythonの例(Pandasを使用):

import pandas as pd

# 'date'列と'sales'列を持つPandas DataFrame 'sales_df'があると仮定します

sales_df['cumulative_sales'] = sales_df['sales'].cumsum()

グローバルなアプリケーションの例:国際的なeコマース企業は、累積売上高を使用して、さまざまな市場での新製品の発売から得られた総収益を追跡できます。

3. リードとラグ

LEAD関数とLAG関数を使用すると、それぞれ後続または先行する行からデータにアクセスできます。これらは、期間ごとの変更を計算したり、傾向を特定したり、異なる期間にわたる値を比較したりするのに役立ちます。

SQLの例:

SELECT
  date,
  sales,
  LAG(sales, 1, 0) OVER (ORDER BY date) AS previous_day_sales,
  sales - LAG(sales, 1, 0) OVER (ORDER BY date) AS sales_difference
FROM
  sales_data;

このクエリは、前日と比較した売上高の差を計算します。`LAG(sales, 1, 0)`関数は、前の行(オフセット1)から売上高の値を取得し、前の行がない場合(たとえば、最初の行)、0(デフォルト値)を返します。

Pythonの例(Pandasを使用):

import pandas as pd

# 'date'列と'sales'列を持つPandas DataFrame 'sales_df'があると仮定します

sales_df['previous_day_sales'] = sales_df['sales'].shift(1)
sales_df['sales_difference'] = sales_df['sales'] - sales_df['previous_day_sales'].fillna(0)

グローバルなアプリケーションの例:グローバル航空会社は、リード関数とラグ関数を使用して、異なる週にわたる同じルートの航空券販売数を比較し、潜在的な需要の変動を特定できます。

4. ランクとデンスランク

RANK()関数とDENSE_RANK()関数は、指定された順序に基づいて、パーティション内の各行にランクを割り当てます。RANK()はギャップのあるランクを割り当て(例:1、2、2、4)、DENSE_RANK()はギャップのないランクを割り当てます(例:1、2、2、3)。

SQLの例:

SELECT
  date,
  sales,
  RANK() OVER (ORDER BY sales DESC) AS sales_rank,
  DENSE_RANK() OVER (ORDER BY sales DESC) AS sales_dense_rank
FROM
  sales_data;

このクエリは、売上高の値を降順にランク付けします。

グローバルなアプリケーションの例:グローバルなオンラインマーケットプレイスは、ランキング関数を使用して、国または地域ごとの売れ筋商品を特定できます。

高度なテクニックとアプリケーション

1. ウィンドウ関数の組み合わせ

ウィンドウ関数を組み合わせることで、より複雑な計算を実行できます。たとえば、累積和の移動平均を計算できます。

SQLの例:

SELECT
  date,
  sales,
  AVG(cumulative_sales) OVER (ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS moving_average_cumulative_sales
FROM
  (
    SELECT
      date,
      sales,
      SUM(sales) OVER (ORDER BY date) AS cumulative_sales
    FROM
      sales_data
  ) AS subquery;

2. 条件付き集計でのウィンドウ関数の使用

ウィンドウ関数を条件付き集計(たとえば、CASEステートメントを使用)と組み合わせて使用​​して、特定の条件に基づいて計算を実行できます。

SQLの例:

SELECT
  date,
  sales,
  AVG(CASE WHEN sales > 100 THEN sales ELSE NULL END) OVER (ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS moving_average_high_sales
FROM
  sales_data;

このクエリは、売上高が100を超える日の売上高のみの移動平均を計算します。

3. 時系列分解

ウィンドウ関数を使用して、時系列を傾向、季節、および残差コンポーネントに分解できます。これには、移動平均を計算して傾向を推定し、季節的なパターンを特定し、次に傾向コンポーネントと季節コンポーネントを減算して残差を取得することが含まれます。

4. 異常検知

ウィンドウ関数を使用して、移動平均と標準偏差を計算することにより、時系列データの異常を検出できます。特定の範囲外(たとえば、移動平均からの+/- 3標準偏差)にあるデータポイントは、異常としてフラグが立てられる場合があります。

業界全体の実際的な例

1. ファイナンス

2. 小売

3. 製造業

4. ヘルスケア

適切なツールの選択

ウィンドウ関数は、次のようなさまざまなデータ処理ツールおよびプログラミング言語で使用できます。

ツールの選択は、特定のニーズと技術的な専門知識によって異なります。 SQLはリレーショナルデータベースに保存されたデータに適しており、PythonとSparkは大規模なデータセットの処理や複雑な分析の実行により柔軟性があります。

ベストプラクティス

結論

ウィンドウ関数は、時系列分析のための強力なツールであり、移動平均、累積和、リード/ラグ値、およびその他の時間ベースのメトリックを計算できます。ウィンドウ関数をマスターすることで、時系列データから貴重な洞察を引き出し、より多くの情報に基づいた意思決定を行うことができます。財務データ、販売データ、センサーデータ、またはウェブトラフィックデータを分析している場合でも、ウィンドウ関数は、従来のアグリゲーション手法を使用して検出することが困難なパターン、傾向、および異常を特定するのに役立ちます。ウィンドウ関数の主要な概念と構文を理解し、ベストプラクティスに従うことで、それらを効果的に活用して、さまざまな業界にわたる幅広い現実世界の問題を解決できます。