制定最佳的零售產品價格

1. 簡介

上次更新時間:2021 年 9 月 15 日

由於價格洞察和最佳化所需的資料本質上就不同 (系統不同、當地實況不同等),因此務必開發結構良好、標準化且乾淨的 CDM 表格。包括交易、產品、價格和顧客等價格最佳化重要屬性。本文將逐步說明下列步驟,協助您快速開始進行價格數據分析,並根據自身需求擴充及自訂分析。下圖概述本文涵蓋的步驟。

dd8545e0c9156b13.png

  1. 評估資料來源:首先,您必須取得用於建立 CDM 的資料來源清單。在這個步驟中,您也會使用 Dataprep 探索輸入資料並找出問題。例如遺漏值和不相符的值、命名慣例不一致、重複資料、資料完整性問題、離群值等。
  2. 標準化資料:接著修正先前發現的問題,確保資料準確、完整、一致且完整。這個程序可能涉及 Dataprep 中的各種轉換,例如日期格式設定、值標準化、單位轉換、篩除不必要的欄位和值,以及分割、彙整或重複資料刪除來源資料。
  3. 統一為單一結構:管道的下一個階段會將每個資料來源彙整到 BigQuery 的單一寬資料表中,其中包含所有最精細的屬性。這種非正規化結構可有效率地執行分析查詢,不需要聯結。
  4. 提供數據分析和機器學習/AI:資料經過清理並格式化以供數據分析後,分析師就能探索歷來資料,瞭解先前的價格變動造成的影響。此外,BigQuery ML 可用於建立預測模型,估算未來的銷售量。這些模型的輸出內容可併入 Looker 的資訊主頁,建立「假設情境」,讓企業使用者分析特定價格變動可能帶來的銷售量。

下圖顯示用於建構價格最佳化數據分析管道的 Google Cloud 元件。

e5d74e43074eedf4.png

建構項目

本文將說明如何設計價格最佳化資料倉儲、自動化資料準備、運用機器學習技術預測產品價格變動的影響,以及開發報表,為團隊提供可做為行動依據的洞察資料。

課程內容

  • 如何將 Dataprep 連線至價格分析資料來源,這些資料來源可儲存在關聯式資料庫、一般檔案、Google 試算表和其他支援的應用程式中。
  • 如何建構 Dataprep 流程,在 BigQuery 資料倉儲中建立 CDM 資料表。
  • 如何使用 BigQuery ML 預測未來收益。
  • 瞭解如何在 Looker 中建立報表,分析歷來價格和銷售趨勢,以及瞭解未來價格變動的影響。

軟硬體需求

2. 在 BigQuery 中建立 CDM

在本節中,您將建立通用資料模型 (CDM),集中查看所需資訊,以利分析及建議價格變更。

  1. 開啟 BigQuery 控制台
  2. 選取要用來測試這個參照模式的專案。
  3. 使用現有資料集或建立 BigQuery 資料集。為資料集命名 Pricing_CDM
  4. 建立資料表
create table `CDM_Pricing`
(
  Fiscal_Date DATETIME,
  Product_ID STRING,
  Client_ID INT64,
  Customer_Hierarchy STRING,
  Division STRING,
  Market STRING,
  Channel STRING,
  Customer_code INT64,
  Customer_Long_Description STRING,
  Key_Account_Manager INT64,
  Key_Account_Manager_Description STRING,
  Structure STRING,
  Invoiced_quantity_in_Pieces FLOAT64,
  Gross_Sales FLOAT64,
  Trade_Budget_Costs FLOAT64,
  Cash_Discounts_and_other_Sales_Deductions INT64,
  Net_Sales FLOAT64,
  Variable_Production_Costs_STD FLOAT64,
  Fixed_Production_Costs_STD FLOAT64,
  Other_Cost_of_Sales INT64,
  Standard_Gross_Margin FLOAT64,
  Transportation_STD FLOAT64,
  Warehouse_STD FLOAT64,
  Gross_Margin_After_Logistics FLOAT64,
  List_Price_Converged FLOAT64
);

3. 評估資料來源

在本教學課程中,您會使用儲存在 Google 試算表BigQuery 的範例資料來源。

  • 交易 Google 試算表,每筆交易都會自成一列。包括每項產品的銷售數量、銷售總額和相關成本等詳細資料。
  • 產品價格 Google 試算表,其中包含特定客戶每個月的各項產品價格。
  • 包含個別顧客資訊的 company_descriptions BigQuery 資料表。

您可以使用下列陳述式建立這個 company_descriptions BigQuery 資料表:

create table `Company_Descriptions`
(
 Customer_ID INT64,
 Customer_Long_Description STRING
);
insert into `Company_Descriptions` values (15458, 'ENELTEN');
insert into `Company_Descriptions` values (16080, 'NEW DEVICES CORP.');
insert into `Company_Descriptions` values (19913, 'ENELTENGAS');
insert into `Company_Descriptions` values (30108, 'CARTOON NT');
insert into `Company_Descriptions` values (32492, 'Thomas Ed Automobiles');

4. 建立流程

在這個步驟中,您會匯入範例 Dataprep 流程,用於轉換及整合上一節列出 的範例資料集。流程代表管道,或結合資料集和方案的物件,用於轉換及合併資料集和方案。

  1. 從 GitHub 下載「價格最佳化模式」流程套件,但請勿解壓縮。這個檔案包含用來轉換範例資料的「定價最佳化設計模式」流程。
  2. 在 Dataprep 中,按一下左側導覽列中的「流程」圖示。接著在「Flows」檢視畫面中,選取內容選單中的「Import」。匯入流程後,即可選取並查看及編輯流程。

dd5213e4cf1e313f.png

  1. 在流程左側,產品價格和三份交易 Google 試算表都必須連結為資料集。如要執行這項操作,請在 Google 試算表資料集物件上按一下滑鼠右鍵,然後選取「取代」。然後點選「Import Datasets」連結。按一下「編輯路徑」鉛筆圖示,如下圖所示。

7e4af3e82955343f.png

將目前的值替換為指向交易產品價格 Google 試算表的連結

如果 Google 試算表包含多個分頁,您可以在選單中選取要使用的分頁。按一下「編輯」,選取要用做資料來源的分頁,然後按一下「儲存」和「匯入並新增至流程」。返回模式後,按一下「取代」。在這個流程中,每個工作表都會以自己的資料集表示,以便在後續的食譜中示範如何合併不同來源。

799bce35e0a60e87.png

  1. 定義 BigQuery 輸出資料表:

在這個步驟中,您要將 BigQuery CDM_Pricing 輸出資料表的位置與 Dataoprep 工作建立關聯,以便每次執行工作時載入資料表。

在「流程檢視」頁面中,按一下「結構定義對應輸出」圖示,然後在「詳細資料面板」中,按一下「目的地」分頁標籤。然後編輯用於測試的手動目的地輸出內容,以及用於自動執行整個流程的排定目的地輸出內容。如要這麼做,請按照下列指示操作:

  1. 編輯「手動目的地」:在「詳細資料」面板中,按一下「手動目的地」部分下方的「編輯」按鈕。在「發布設定」頁面的「發布動作」下方,如果已有發布動作,請編輯該動作;否則請按一下「新增動作」按鈕。然後瀏覽 BigQuery 資料集,找到您在先前步驟中建立的 Pricing_CDM 資料集,並選取 CDM_Pricing 資料表。確認已勾選「Append to this table every run」(每次執行時附加至這個表格),然後按一下「Add」(新增)。按一下「Save Settings」(儲存設定)
  2. 編輯「預定目的地」

在「詳細資料」面板的「排定的目的地」部分下方,按一下「編輯」

系統會沿用手動目的地設定,因此您不需要進行任何變更。按一下「儲存設定」。

5. 標準化資料

提供的流程會合併、格式化及清理交易資料,然後將結果與公司說明和匯總價格資料彙整,以供報表使用。您將逐步瞭解流程的各個元件,如下圖所示。

a033de41c68acc8b.png

6. 探索交易資料食譜

首先,您將瞭解交易資料食譜的運作方式,這個食譜用於準備交易資料。在「流程檢視畫面」中按一下「交易資料」物件,然後在「詳細資料面板」中按一下「編輯配方」按鈕。

轉換器頁面隨即開啟,詳細資料面板中會顯示方案。方案包含套用至資料的所有轉換步驟。您可以在每個步驟之間點選,查看方案中這個特定位置的資料狀態,藉此在方案中瀏覽。

您也可以點選每個 Recipe 步驟的「更多」選單,然後選取「前往所選項目」或「編輯」,瞭解轉換作業的運作方式。

  1. 聯集交易:交易資料方案的第一個步驟是聯集儲存在不同工作表中的交易,代表每個月的交易。
  2. 標準化顧客描述:食譜的下一個步驟是標準化顧客描述。也就是說,顧客名稱可能相似,但略有不同,我們希望將這些名稱統一為一個。食譜會示範兩種可能的方法。首先,這項功能會運用標準化演算法,並可透過不同的標準化選項進行設定,例如「類似字串」(將含有相同字元的數值歸類在一起),或「發音」(將發音相似的數值歸類在一起)。或者,您也可以使用公司 ID,在上述 BigQuery 資料表中查詢公司說明。

您可以進一步瀏覽食譜,瞭解用於清理及格式化資料的各種其他技巧:刪除資料列、根據模式設定格式、透過查閱擴充資料、處理遺漏值,或取代不需要的字元。

7. 探索產品價格資料食譜

接著,您可以探索「產品定價資料方案」中發生的情況,該方案會將準備好的交易資料彙整到匯總的定價資料中。

按一下頁面頂端的「PRICING OPTIMIZATION DESIGN PATTERN」,關閉「Transformer Page」並返回「Flow View」。然後按一下「產品價格資料」物件,並編輯配方。

  1. 取消透視每月價格資料欄:按一下步驟 2 和 3 之間的配方,查看取消透視步驟前的資料。您會發現資料包含每個月份 (1 月、2 月、3 月) 的交易價值,且各月份的交易價值分別位於不同資料欄。這種格式不適合在 SQL 中套用匯總 (即總和、平均交易) 計算。資料必須取消樞紐分析,這樣每個資料欄都會成為 BigQuery 資料表中的資料列。食譜會運用 unpivot 函式,將 3 個資料欄轉換為每個月一個資料列,方便進一步套用群組計算。
  2. 計算各個用戶端、產品和日期的平均交易價值:我們想計算各個用戶端、產品和日期的平均交易價值。我們可以運用匯總函式,產生新資料表 (「分組依據做為新資料表」選項)。在這種情況下,資料會匯總至群組層級,我們也會遺失每筆交易的詳細資料。或者,我們也可以決定將詳細資料和匯總值保留在同一個資料集中 (「依新資料欄分組依據」選項),這樣就能輕鬆套用比率 (即產品類別對整體收益的貢獻百分比)。如要試試這個行為,請編輯方案步驟 7,然後選取「Group by as a new table」(以新表格分組) 或「Group by as a new column(s)」(以新資料欄分組) 選項,即可查看差異。
  3. 彙整價格日期:最後,使用 join 將多個資料集合併成一個較大的資料集,並在初始資料集中加入資料欄。在這個步驟中,價格資料會根據「價格資料.產品代碼」=「交易資料.SKU」和「價格資料.價格日期」=「交易資料.會計年度日期」,與交易資料配方輸出內容合併。

如要進一步瞭解可透過 Dataprep 套用的轉換,請參閱 Trifacta 資料整理快速參考指南

8. 探索結構定義對應食譜

最後一個 recipe「結構定義對應」可確保產生的 CDM 資料表符合現有 BigQuery 輸出資料表的結構定義。這裡使用「快速目標」 功能,透過模糊比對比較兩個結構定義並套用自動變更,重新格式化資料結構以符合 BigQuery 資料表。

9. 整合至單一結構

設定來源和目的地,並探索流程步驟後,您就可以執行流程,將 CDM 資料表轉換並載入 BigQuery。

  1. 執行結構定義對應輸出內容:在流程檢視畫面中,選取「結構定義對應」輸出物件,然後按一下「詳細資料」面板中的「執行」按鈕。選取「Trifacta Photon」執行環境,並取消勾選「Ignore Recipe Errors」。然後按一下「執行」按鈕。如果指定的 BigQuery 資料表存在,Dataprep 會附加新資料列,否則會建立新資料表。
  2. 查看工作狀態:Dataprep 會自動開啟「執行工作」頁面,方便您監控工作執行情況。系統應會在幾分鐘內完成程序並載入 BigQuery 資料表。工作完成後,定價 CDM 輸出內容會以乾淨、結構化和標準化的格式載入 BigQuery,方便您進行分析。

10. 提供數據分析與機器學習/AI 技術

Analytics 先決條件

為了執行一些分析和預測模型,並獲得有趣的結果,我們建立了一個較大的相關資料集,以發掘特定洞察資訊。請先將這項資料上傳至 BigQuery 資料集,再繼續閱讀本指南。

按一下「+ Create Table」(+ 建立資料表) 按鈕,然後定義下列參數:

  • 從上傳的檔案建立資料表,然後選取 CDM_Pricing_Large_Table.csv 檔案
  • 結構定義自動偵測,勾選「結構定義和輸入參數」
  • 進階選項、寫入偏好設定、覆寫資料表

ff9ec8b9f580b139.png

  • 按一下「建立資料表」

建立資料表並上傳資料後,您應該會在 BigQuery 的 Google 控制台中看到新資料表的詳細資料,如下所示。有了 BigQuery 中的價格資料,我們就能輕鬆提出更全面的問題,深入分析價格資料。

93e4c05972af1999.png

11. 查看價格異動的影響

舉例來說,如果您先前變更了商品價格,可能想分析訂單行為的變化。

  1. 首先,您會建立暫時資料表,其中包含產品價格每次變更時的資料列,以及特定產品價格的相關資訊,例如以各個價格訂購的商品數量,以及與該價格相關的總淨銷售額。
create temp table price_changes as (
select
       product_id,
       list_price_converged,
       total_ordered_pieces,
       total_net_sales,
       first_price_date,
       lag(list_price_converged) over(partition by product_id order by first_price_date asc) as previous_list,
       lag(total_ordered_pieces) over(partition by product_id order by first_price_date asc) as previous_total_ordered_pieces,
       lag(total_net_sales) over(partition by product_id order by first_price_date asc) as previous_total_net_sales,
       lag(first_price_date) over(partition by product_id order by first_price_date asc) as previous_first_price_date
       from (
           select
               product_id,list_price_converged,sum(invoiced_quantity_in_pieces) as total_ordered_pieces, sum(net_sales) as total_net_sales, min(fiscal_date) as first_price_date
           from `{{my_project}}.{{my_dataset}}.CDM_Pricing` AS cdm_pricing
           group by 1,2
           order by 1, 2 asc
       )
);
select * from price_changes where previous_list is not null order by product_id, first_price_date desc

b320ba40f0692826.png

  1. 接著,有了臨時表格後,您就可以計算 SKU 的平均價格變動:
select avg((previous_list-list_price_converged)/nullif(previous_list,0))*100 as average_price_change from price_changes;
  1. 最後,您可以分析價格變更後的情況,方法是查看每次價格變更與訂購商品總數之間的關係:
select
(total_ordered_pieces-previous_total_ordered_pieces)/nullif(previous_total_ordered_pieces,0) 

CANNOT TRANSLATE

price_changes_percent_ordered_change,
(list_price_converged-previous_list)/nullif(previous_list,0)  

CANNOT TRANSLATE

price_changes_percent_price_change
from price_changes

12. 建立時間序列預測模型

接著,您可以使用 BigQuery 內建的機器學習功能,建構 ARIMA 時間序列預測模型,預測每項商品的銷售量。

  1. 首先,請建立 ARIMA_PLUS 模型
create or replace `{{my_project}}.{{my_dataset}}.bqml_arima`
options
 (model_type = 'ARIMA_PLUS',
  time_series_timestamp_col = 'fiscal_date',
  time_series_data_col = 'total_quantity',
  time_series_id_col = 'product_id',
  auto_arima = TRUE,
  data_frequency = 'AUTO_FREQUENCY',
  decompose_time_series = TRUE
 ) as
select
 fiscal_date,
 product_id,
 sum(invoiced_quantity_in_pieces) as total_quantity
from
 `{{my_project}}.{{my_dataset}}.CDM_Pricing` 
group by 1,2;
  1. 接著,使用 ML.FORECAST 函式預測各項產品的未來銷售量:
select
*
from
ML.FORECAST(model testing.bqml_arima,
            struct(30 as horizon, 0.8 as confidence_level));
  1. 有了這些預測結果,您就能瞭解漲價可能帶來的影響。舉例來說,如果將每項產品的價格調高 15%,您可以使用下列查詢計算下個月的預估總收益:
select
sum(forecast_value * list_price) as total_revenue
from ml.forecast(mode testing.bqml_arima,
            struct(30 as horizon, 0.8 as confidence_level)) forecasts
left join (select product_id,
                array_agg(list_price_converged
                       order by fiscal_date desc limit 1)[offset(0)] as list_price
                from `leigha-bq-dev.retail.cdm_pricing` group by 1)  recent_prices
using (product_id);

13. 建立報表

現在,您已將非正規化的價格資料集中儲存在 BigQuery 中,也瞭解如何對這類資料執行有意義的查詢,接下來要建構報表,讓業務使用者探索這類資訊並據此採取行動。

如果您已有 Looker 執行個體,可以使用 這個 GitHub 存放區中的 LookML,開始分析這個模式的價格資料。只要建立新的 Looker 專案、新增 LookML,然後在每個檢視檔案中,將連線資料表名稱替換成符合 BigQuery 設定的名稱即可。

在這個模型中,您會找到衍生資料表 ( 位於這個檢視表檔案中),我們稍早顯示的價格變更檢查結果:

view: price_changes {
    derived_table: {
      sql: select
        product_id,
        list_price_converged,
        total_ordered_pieces,
        total_net_sales,
        first_price_date,
        lag(list_price_converged) over(partition by product_id order by first_price_date asc) as previous_list,
        lag(total_ordered_pieces) over(partition by product_id order by first_price_date asc) as previous_total_ordered_pieces,
        lag(total_net_sales) over(partition by product_id order by first_price_date asc) as previous_total_net_sales,
        lag(first_price_date) over(partition by product_id order by first_price_date asc) as previous_first_price_date
        from (
      select
         product_id,list_price_converged,sum(invoiced_quantity_in_pieces) as total_ordered_pieces, sum(net_sales) as total_net_sales, min(fiscal_date) as first_price_date
      from ${cdm_pricing.SQL_TABLE_NAME}  AS cdm_pricing
      group by 1,2
      order by 1, 2 asc
      )
       ;;
    }
...
}

除了先前顯示的 BigQuery ML ARIMA 模型,您也可以預測未來的銷售量 ( 在這個檢視表檔案中)

view: arima_model {
  derived_table: {
    persist_for: "24 hours"
    sql_create:
      create or replace model ${sql_table_name}
            options
              (model_type = 'arima_plus',
               time_series_timestamp_col = 'fiscal_date',
               time_series_data_col = 'total_quantity',
               time_series_id_col = 'product_id',
               auto_arima = true,
               data_frequency = 'auto_frequency',
               decompose_time_series = true
              ) as
            select
              fiscal_date,
              product_id,
              sum(invoiced_quantity_in_pieces) as total_quantity
            from
              ${cdm_pricing.sql_table_name}
            group by 1,2 ;;
          }
   }
...
}

LookML 也包含範例資訊主頁如要查看資訊主頁的試用版,請按這裡。資訊主頁的第一部分會提供銷售額、成本、價格和利潤變動的高階資訊。身為商家使用者,您可能想建立快訊,瞭解銷售量是否低於 X%,因為這可能表示您應該調降價格。

b531e169b192c111.png

下一個部分 (如下所示) 可讓使用者深入瞭解價格變動趨勢。你可以在這裡下鑽到特定產品,查看確切定價以及價格變更後的結果,有助於找出特定產品並進行深入研究。

6a98666697aa7a1.gif

最後,報表底部會顯示 BigQueryML 模型的結果。您可以使用 Looker 資訊主頁頂端的篩選器,輕鬆輸入參數來模擬不同情境,如上所述。舉例來說,如果訂單量降至預測值的 75%,且所有產品的價格都調高 25%,會發生什麼情況?如下所示

d3a9d37c89c39b99.gif

這項功能採用 LookML 中的參數,然後直接併入這裡的測量指標計算。這類報表可協助你找出所有產品的最佳價格,或深入瞭解特定產品,判斷應調高或調降價格,以及對毛利和淨利造成的影響。

14. 配合您的定價系統

本教學課程會轉換範例資料來源,但您在各種平台上使用的價格資產,也會面臨非常類似的資料挑戰。價格資產的摘要和詳細結果有不同的匯出格式 (通常是 xls、試算表、csv、txt、關聯式資料庫、商務應用程式),每種格式都可以連結至 Dataprep。建議您先描述轉換需求,做法與上述範例類似。釐清規格並找出所需轉換類型後,您就可以使用 Dataprep 設計轉換。

  1. 複製要自訂的 Dataprep 流程 (按一下流程右側的「更多」按鈕 **...**,然後選取「複製」選項),或使用新的 Dataprep 流程從頭開始。
  2. 連結至您自己的價格資料集。Dataprep 原生支援 Excel、CSV、Google 試算表、JSON 等檔案格式。您也可以使用 Dataprep 連接器連線至其他系統。
  3. 將資料資產分配到您識別的各個轉換類別。為每個類別建立一個食譜。您可以參考這個設計模式提供的流程,從中汲取靈感來轉換資料,並編寫自己的方案。如果遇到困難,請別擔心,只要在 Dataprep 畫面左下方的對話方塊中尋求協助即可。
  4. 將 recipe 連結至 BigQuery 執行個體。您不必在 BigQuery 中手動建立資料表,Dataprep 會自動為您處理。建議您在流程中新增輸出內容時,選取「手動目的地」,並在每次執行時捨棄資料表。請逐一測試每個套件,直到獲得預期結果為止。測試完成後,您會在每次執行時將輸出內容轉換為「附加至表格」,避免刪除先前的資料。
  5. 您也可以選擇將流程與排程建立關聯,讓流程依排程執行。如果程序需要持續執行,這項功能就相當實用。您可以根據所需的新鮮度定義排程,每天或每小時載入回應。如果您決定排定流程執行時間,則必須在流程中為每個方案新增「排定目的地輸出」。

修改 BigQuery 機器學習模型

本教學課程提供 ARIMA 模型範例。不過,開發模型時,您可以控管其他參數,確保模型最符合您的資料。如需更多詳細資料,請參閱 說明文件中的範例。此外,您也可以使用 BigQuery ML.ARIMA_EVALUATEML.ARIMA_COEFFICIENTSML.EXPLAIN_FORECAST 函式,進一步瞭解模型並做出最佳化決策。

編輯 Looker 報表

將 LookML 匯入自己的專案後 (如上述說明),即可直接編輯,新增其他欄位、修改計算或使用者輸入的參數,以及變更資訊主頁上的資料視覺化,以符合業務需求。如要瞭解如何使用 LookML 開發,請參閱這篇文章;如要瞭解如何在 Looker 中將資料視覺化,請參閱這篇文章

15. 恭喜

你現在已瞭解零售產品定價的最佳化關鍵步驟!

後續步驟

探索其他智慧型數據分析參考模式

其他資訊

  • 按這裡閱讀網誌
  • 如要進一步瞭解 Dataprep,請參閱這篇文章
  • 如要進一步瞭解 BigQuery Machine Learning,請參閱這篇文章
  • 如要進一步瞭解 Looker,請按這裡