What XYZ analysis is
XYZ analysis splits an assortment into three groups by demand stability. Unlike ABC analysis, which answers how much a product brings in, XYZ answers how evenly it sells and whether it can be trusted in a forecast.
The practical value of the method lies in the decisions that follow from it:
- X products can be held with a minimal safety stock and ordered by formula;
- for Z products the formula does not work — either a larger buffer, or order-on-demand, or removal from the assortment;
- in promo planning X products give a predictable response, Z products are a lottery.
The formula: coefficient of variation
The measure of stability is the coefficient of variation (CV): the standard deviation of sales normalised by the average level of sales. Normalisation is essential, otherwise high-volume products would automatically look “less stable” than small ones.
sigma
CV = ----------- x 100%
mean
mean — average sales across the periods
sigma — standard deviation of sales across the periods
sigma = sqrt( sum(xi - mean)^2 / n )
| Group | Coefficient of variation | Nature of demand | What it means in practice |
|---|---|---|---|
| X | up to ~10% | Stable, flat | Historical forecasting is dependable, safety stock minimal |
| Y | ~10–25% | Variable, with a trend or a season | Forecasting works, but needs a buffer and regular recalculation |
| Z | above ~25% | Irregular, episodic | Historical forecasting barely works, decisions are manual |
The 10% and 25% thresholds are a textbook guideline, not a constant. In volatile categories — fashion, accessories, impulse goods — those thresholds leave group X almost empty and the analysis loses its meaning. It is better to look at the distribution of CV across your own catalogue and cut the groups by percentile, so that every group ends up a workable size.
A worked example
Sales of four SKUs across 6 months (units):
| SKU | M1 | M2 | M3 | M4 | M5 | M6 | Mean | Sigma | CV | Group |
|---|---|---|---|---|---|---|---|---|---|---|
| Product A | 100 | 105 | 98 | 102 | 100 | 95 | 100.0 | 3.1 | 3.1% | X |
| Product B | 200 | 190 | 215 | 205 | 195 | 210 | 202.5 | 8.5 | 4.2% | X |
| Product C | 80 | 120 | 95 | 140 | 110 | 75 | 103.3 | 22.7 | 21.9% | Y |
| Product D | 10 | 60 | 5 | 90 | 15 | 4 | 30.7 | 32.7 | 106.7% | Z |
Note products A and B: the absolute spread of B is larger (8.5 against 3.1), but relative to its own volume it sells just as evenly. That is exactly why the classification is built on CV rather than on the raw deviation.
Data requirements for a valid calculation:
| Requirement | Why it matters |
|---|---|
| 12 periods or more | On 3–4 data points the deviation estimate is statistically unstable |
| Exclude out-of-stock periods | A zero caused by missing stock is a gap in the data, not a fall in demand |
| A homogeneous series | A change of packaging or unit of measure, or merged SKUs, breaks comparability |
| Account for seasonality | Otherwise a predictably seasonal product lands in Z for no useful reason |
| Separate new products | CV is meaningless for an item with two months of history — that is a cold start, not instability |
The ABC/XYZ matrix
The axes are independent, so they are combined into a 3×3 matrix. Each cell is a separate policy for stock, promotion and catalogue presence.
| X (stable demand) | Y (variable demand) | Z (irregular demand) | |
|---|---|---|---|
| A (high contribution) | AX — the foundation of the business. Always in stock, auto-replenished, priority on the shelf and the home page | AY — important and temperamental. Higher safety stock, manual control before peaks | AZ — the risk zone. Large revenue on unpredictable demand: a supply failure or frozen stock hurts most here |
| B (medium contribution) | BX — the workhorse. Automatic ordering, minimal manager attention | BY — the main object of a category manager’s manual work | BZ — candidates for order-on-demand or reduced depth |
| C (low contribution) | CX — a cheap assortment tail to maintain, often accessories | CY — keep on a residual basis, no stocking up | CZ — first candidate for delisting: little contribution and impossible to plan |
The practical conclusion from the matrix: management attention belongs to cells AZ and AY, not to row A as a whole. Cell AX already works — it is stable and mostly needs not to be broken. Cell CZ absorbs buying time and warehouse space and returns nothing, which is where cleaning up the product matrix starts.
How XYZ changes personalization work
Demand stability directly affects which signals work in recommendations.
X products are a dependable statistical base. They have accumulated enough even data for co-occurrence statistics to be stable: frequently-bought-together blocks and co-occurrence recommendations deliver predictable quality on the X assortment. Those products are also safe to use as an anchor in popularity blocks — they will not suddenly become irrelevant.
Z products break popularity-driven algorithms. Their sales are sparse and jagged, so any metric of the form “bought N times in the period” is statistically noisy: a spike of three orders can look like a trend to the algorithm. For the Z assortment the weight shifts towards features that do not depend on sales history:
- content attributes of the product — category, brand, attributes, price (the content-based approach);
- session signals — what the person is looking at right now;
- membership of the long tail as a separate slot in the output, so the tail is not washed out by the popular core.
A practical consequence for configuring recommendation strategies: the XYZ group is convenient to export into the product feed as a separate attribute. It can then be used in rules — capping the share of Z products in a block on the product page, for example, or deliberately pushing the Z tail in similar-product blocks, where popularity is not the point anyway.
Implementation checklist
- Assemble the series — sales by SKU for at least 12 periods, in units rather than money, because a price change distorts the variation.
- Clean the data — drop out-of-stock periods, exclude products younger than 6 periods, collapse duplicate SKUs.
- Remove seasonality — either deseasonalise the series or calculate XYZ within the season.
- Calculate CV and look at its distribution across the catalogue before choosing thresholds.
- Set the thresholds — start from the textbook 10%/25%, then adjust for the real spread in your category.
- Overlay ABC and work through the nine cells, starting with AZ and CZ.
- Recalculate regularly — quarterly for stable categories, monthly for fashion and short-life-cycle goods.
Common mistakes:
| Mistake | What it leads to |
|---|---|
| Calculating CV in money rather than units | Inflation and promo prices inflate the variation and push products falsely into Z |
| Not separating new products | Half of group Z turns out to be products with no history rather than unstable demand |
| One set of thresholds for every category | One category ends up with an empty X, another with an empty Z |
| A one-off calculation “just to look” | The classification is stale within a quarter and stops influencing decisions |
| Delisting everything that lands in Z | Group Z also holds accessories and image products needed for a complete catalogue |