3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

先月のアノ顧客、今月はどうなってる? OACで「副問合せ」相当の分析

Posted at

概要

OAC (Oracle Analtyics Cloud) のワークブック(Data Visualization, DV)は任意のサブクエリを直接書けませんが、セマンティックモデル側で「フィルタ付きメジャー」を定義し、DVのパラメータで閾値を動的に変えれば、サブクエリ相当の要件をスマートに実現できます。本記事ではOracleデータベースのSHサンプルスキーマ(SALES・TIMES・CUSTOMERS)を用いて、以下を段階的に構築します。

  • 2000年1月に閾値以上購入した顧客を抽出
  • 抽出した顧客の2000年2月の購入額を並列表示して分析
  • 閾値はDVのパラメータでユーザーが変更可能

2000年1月にたくさん買ってくれた顧客の、2000年2月における購入行動を分析します。

データセットを「手書きSQL」で作成すれば副問合せも可能ですが、それは別の機会に紹介します。

想定読者

  • OACのDVとセマンティックモデル(Semantic Modeler)を活用した設計に関心のある方
  • 既存SQLをDVに持ち込むのではなく、モデル側で再利用可能なロジックを組みたい方

前提

  • データ: OracleデータベースのSHスキーマ(SALES: ファクト, TIMES: 時間, CUSTOMERS: 顧客)
  • OACからSHに接続済み(Oracle DB/ADWなど)
  • OACのセマンティックモデルを新規作成できる権限
  • OACは、2025年9月版を使用しました

ゴールの全体像

  • モデル側に以下を用意
    • 販売金額(基本メジャー)
    • 販売金額 (2000年1月) = 2000年1月で固定集計
    • 販売金額 (2000年2月) = 2000年2月で固定集計
  • DV側
    • 数値パラメータ Min Amount(既定値100)
    • フィルタ条件:販売金額 (2000年1月) >= Min Amount
    • テーブル/棒グラフで顧客別に 1月/2月 購入額を表示

セマンティックモデルの作成

物理レイヤーの作成

手順1:セマンティックモデルの作成と関係定義

  • OACで「作成 > セマンティックモデル」から新規モデルを作成
  • データベースから SALES, TIMES, CUSTOMERS を追加
  • リレーションを設定
    • SALES.TIME_ID → TIMES.TIME_ID(多対一)
    • SALES.CUST_ID → CUSTOMERS.CUST_ID(多対一)

image.png

論理レイヤーの作成

ビジネスモデルを作成します。(作成例)

image.png

手順2:次元の設定

  • TIMESを時間次元に指定(Dimension Type: 時間)
    • レベル例:Year → Month → Day
    • 主キー/レベルキー例:
      • Year: CALENDAR_YEAR
      • Month: CALENDAR_MONTH_DESC
      • Day: TIME_ID
  • CUSTOMERSを通常次元に指定
    • キー: CUST_ID
    • 表示用属性: 氏名(必要に応じてフルネーム派生列を作成)

作成例

image.png

手順3:基本メジャーの作成(Fact)

  • SALESをFactとして指定
  • 販売金額 = SUM(SALES.AMOUNT_SOLD) を作成
  • 必要に応じて数量など他メジャーも定義

作成例

image.png

ここまでで、基本的な論理層(ビジネスモデル)が作成できました。

手順4:月固定の「フィルタ付きメジャー」を作成

「販売金額 (2000年1月)」列の作成

ビジネスモデルの論理ファクト表に、新規列を追加します。

image.png

名前を「販売金額 (2000年1月)」とし、ソースを「論理式」に変更します。
「fx」をクリックして式エディタを表示し、次の式を入力します。

image.png

式の例
FILTER(販売金額 USING 年月='2000-01')

image.png

「販売金額 (2000年2月)」列の作成

「販売数量 (2000年1月)」列と同じ要領で作成します。

式の例
FILTER(販売金額 USING 年月='2000-02')

image.png

ポイント

  • メジャー内部で月を固定しているため、DVで別の期間フィルタをかけても各メジャーは指定月だけを集計

プレゼンテーションレイヤーの作成とデプロイ

手順5:プレゼンテーションの整理と公開

今回はテストのため、公開する項目を絞っています。

image.png

保存して検証します。
問題なければデプロイします。

ワークブックでの操作

手順6:DVワークブックでパラメータを作成

image.png

新規ワークブックを作成し、上記サブジェクト領域を追加

image.png

パラメータの新規作成

image.png

  • 名称: Min Amount
  • データ型: 整数
  • 初期値: 100(任意)

image.png

手順7:可視化の作成と条件設定

ビジュアライゼーションを作成します。

  • タイプ:表
  • 列配置
    • 顧客ID
    • 販売金額 (2000年1月)
    • 販売金額 (2000年2月)

image.png

image.png

フィルタ設定

作成したビジュアライゼーションに式フィルタを設定します。

image.png

式の例
販売金額 (2000年1月) >= @parameter("Min Amount")(100)

image.png

これで「2000年1月に閾値以上購入した顧客」のみを行として表示し、同じ行でその顧客の「2000年2月の購入額」を並べて比較できます。

動作確認の観点

  • ダッシュボードフィルタでパラメータの値を変更すると、表示顧客の絞り込みが即時に変わる
  • 2000年1月 の降順で並べると上位顧客が把握しやすい
  • 副問合せと違い、2000年2月に売上のない顧客も表示される

image.png

応用の可能性

  • 比率メジャー(2月/1月)を追加
  • 期間の固定を相対化
    • セッション変数を用い、FILTERの条件を変数参照にすれば「当月/前月」分析に展開可能
  • パフォーマンス
    • SALES.TIME_ID, SALES.CUST_ID、TIMES.TIME_IDに適切なインデックス
    • カーディナリティが高い属性を過度に軸に入れない(顧客×日付×製品の細分化は高コスト)
    • そもそも、FILTER USINGは高コストになりがちなので、事前にテストは必須

まとめ

セマンティックモデルで「フィルタ付きメジャー」を作ることで、DVではサブクエリを直接書かずとも、「ある月で条件を満たす顧客集合に対し、別月のKPIを評価する」という実務的な要件を実現できます。
さらにDVのパラメータを組み合わせれば、ユーザーは閾値を自由に調整しながら、顧客セグメントの反応(翌月購買など)を直感的に分析できます。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?