Walmart M5 Data Platform Step 10 report · Product dashboard analysis
Step 10 · Dashboard 3

Product dashboard: DAX, visualization, validation & findings

Analysis of the Power BI Product page against data/gold_export/ (agg_product_performance, agg_price_analysis, dim_product).

KPIs match Gold Scatter at item grain 3,049 SKUs Top 15 = all FOODS_3

Live Power BI dashboard

Published report walmart_visualization — Executive, Store, Product, and Demand pages on Gold aggregates. Open in Power BI ↗

Analysis pages: 08 Executive · 09 Store · 10 Product · 11 Demand · Overview

Part A — DAX measures used on Product (Page 3)

Full catalogue: 08 Executive · Part A. Product page measures:

Product Units =
SUM ( 'agg_product_performance'[units_sold] )

Product Sales Value =
SUM ( 'agg_product_performance'[sales_value] )

Product Demand Volatility =
AVERAGE ( 'agg_product_performance'[demand_volatility] )

Product Avg Daily Units =
AVERAGE ( 'agg_product_performance'[avg_daily_units] )

Product Units Rank =
RANKX (
    ALLSELECTED ( 'agg_product_performance'[item_id] ),
    [Product Units],
    ,
    DESC,
    DENSE
)
Measure / fieldVisualFormat / note
[Product Units]Card, Top 15 barWhole number
[Product Sales Value]Card, category columnCurrency $ (2 dp)
[Product Demand Volatility]CardDecimal · dashboard ≈ 1.75
item_id + units_rank ≤ 15Top 15 bar filterOr Top N by Product Units
avg_daily_units, demand_volatility, sales_value, item_id, cat_idScatterAverage for X/Y; Sum size; Values = item_id
agg_price_analysis columnsPrice tableNo measure required

Part B — Dashboard 3 screenshot

Power BI Product dashboard: KPI cards, cat/dept slicers, top 15 items bar, volatility scatter by item, sales by category, price analysis table
Figure 1. Product dashboard (Page 3) — 67M units · $191.58M sales · volatility 1.75 · Top 15 FOODS_3 SKUs · scatter by item_id · price by dept
Product Units
66.9M
Same network total as store facts
Product Sales
$191.58M
Exact match gold_export
Avg volatility
1.75
Mean of demand_volatility
#1 SKU
FOODS_3_090
1.02M units · ~1.5% of all units

1. Scope & method

Dashboard visualGold sourceValidation
KPI cards agg_product_performance 66,927,173 units · $191,577,546.04 · vol ≈ 1.746
Top 15 bar item_id + units_rank / units All 15 are FOODS_3; #1 FOODS_3_090
Scatter avg_daily_units × demand_volatility · size sales · legend cat Item grain (not 3 category bubbles)
Sales by category [Product Sales Value] by cat_id FOODS $111.1M · HOUSEHOLD $57.1M · HOBBIES $23.3M
Price table agg_price_analysis FOODS_3 highest sales; HOUSEHOLD_2 max price 107.32

2. Visualization & interaction

2.1 Layout

┌──────────────────────────────────────────────────────────────┐
│ [ Product Units ] [ Product Sales $ ] [ Demand Volatility ]  │
│ [ cat_id slicer ]                                            │
│ [ dept_id slicer ]  [ Top 15 bar ]      [ Volatility scatter ]│
│                 [ Sales by cat ]        [ Price analysis tbl ]│
└──────────────────────────────────────────────────────────────┘

2.2 Visual-to-field map

VisualTypeFields
Category Slicer dim_product[cat_id] or agg_product_performance[cat_id]
Department Slicer dept_id (FOODS_1…HOUSEHOLD_2)
KPIs Cards [Product Units], [Product Sales Value], [Product Demand Volatility]
Top 15 Clustered bar Y item_id · X [Product Units] · filter units_rank ≤ 15
Volatility vs volume Scatter Values item_id · X avg_daily_units (Avg) · Y demand_volatility (Avg) · Size sales_value · Legend cat_id
Sales by category Clustered column X cat_id · Y [Product Sales Value]
Price analysis Table cat_id, dept_id, avg/median/min/max sell price, sales_value

2.3 Interaction design

ControlBehaviourAnalyst use
cat_id slicer Filters all product visuals and KPIs Isolate FOODS vs HOBBIES vs HOUSEHOLD
dept_id slicer Narrows to one department (e.g. FOODS_3) Explain why Top 15 is dominated by FOODS_3
Multi-select Format → Selection → Multi-select with CTRL = Off Toggle several depts without clearing
Scatter click Highlights one SKU; cross-filters peers if Edit interactions = Filter Inspect high-volume / high-volatility outliers
Top 15 click Filters scatter/table to that item when interactions allow Link rank list to bubble position

2.4 Suggested click-path

  1. Read KPIs (network volume, sales, average volatility).
  2. Scan Top 15 — note all are FOODS_3.
  3. On scatter, find large FOODS bubbles at high avg_daily_units (right side).
  4. Filter cat_id = HOUSEHOLD → see lower volume, different price profile in table.
  5. Clear → select FOODS_3 in dept slicer → confirm Top 15 / scatter focus.
  6. Use price table for dept-level pricing bands (esp. HOUSEHOLD_2 max).

3. Key pattern findings

3.1 Top movers are exclusively FOODS_3

All Top 15 SKUs by units are in department FOODS_3. Leader FOODS_3_090: 1,017,916 units (~1.5% of all units), avg daily units 52.4, demand volatility 60.9 (also #1 volatility).

Rankitem_idUnitsSalesAvg dailyVolatility
1FOODS_3_0901,017,916$1.38M52.460.9
2FOODS_3_586932,236$1.48M48.032.8
3FOODS_3_252573,723$0.87M29.622.2
4FOODS_3_555497,881$0.79M25.718.6
5FOODS_3_587402,159$0.99M20.718.6

High-velocity FOODS items also tend to be high-volatility — volume and instability travel together for the head of the assortment (corr(avg_daily_units, demand_volatility) ≈ 0.94 across SKUs).

3.2 Category economics

CategorySKUsUnitsSalesMean volatility
FOODS1,43745.9M$111.1M2.39
HOUSEHOLD1,04714.8M$57.1M1.19
HOBBIES5656.2M$23.3M1.13

FOODS is both the largest and the most volatile category on average. HOBBIES is smallest and calmest — fewer SKUs, lower unit velocity.

3.3 Price structure by department

dept_idAvg priceMedianMinMaxSales value
FOODS_3$2.84$2.50$0.01$19.48$72.35M
HOUSEHOLD_1$5.06$3.97$0.01$29.97$42.13M
FOODS_2$4.08$2.98$0.20$13.98$25.59M
HOBBIES_1$6.22$4.88$0.01$30.98$22.12M
HOUSEHOLD_2$5.86$5.64$0.05$107.32$14.98M
FOODS_1$3.37$2.54$0.07$12.98$13.20M
HOBBIES_2$2.69$2.47$0.05$9.97$1.20M

FOODS_3 drives the most sales at a low average price — classic high-velocity grocery. HOUSEHOLD_2 has the extreme max price ($107.32) but far less total sales than FOODS_3.

3.4 Scatter interpretation

Most SKUs cluster near the origin (low avg daily units, low volatility). A small FOODS tail extends to the upper-right: high run-rate and high volatility. Those SKUs need tighter forecast / safety-stock attention than the long tail of quiet items.

4. Dashboard quality notes

5. Recommendations

  1. Prioritise demand planning on FOODS_3 head SKUs (especially FOODS_3_090, _586).
  2. Treat high avg-daily + high volatility items as forecast-critical; long-tail SKUs can use simpler baselines.
  3. Use dept price table for assortment pricing reviews — watch HOUSEHOLD_2 outliers.
  4. Format sales card; enable easy multi-select on category/dept slicers.
  5. Sync category slicer with Executive/Store if stakeholders drill from FOODS columns.

6. Reproduce

python - <<'PY'
import pandas as pd
from pathlib import Path
P = Path('data/gold_export')
pp = pd.read_parquet(P/'agg_product_performance.parquet')
print(pp['units_sold'].sum(), pp['sales_value'].sum(), pp['demand_volatility'].mean())
print(pp.nsmallest(15, 'units_rank')[['item_id','units_sold','demand_volatility']])
print(pd.read_parquet(P/'agg_price_analysis.parquet').sort_values('sales_value', ascending=False))
PY

Screenshot: assets/product-dashboard-page3.png. Related: 08 Executive · 09 Store.