Home / Forecasting and Analytics / XYZ Analysis Calculator
Forecasting and Analytics
XYZ Analysis Calculator (Demand Variability Classification and ABC-XYZ Matrix)
Sort your SKUs by how forecastable their demand is before you pick a forecasting method. Paste one SKU per line, an optional name followed by its demand series, and the tool works out the mean, the standard deviation, and the coefficient of variation for each item, then classifies it as X (stable), Y (variable), or Z (erratic) against thresholds you control. It returns the X, Y, and Z counts at the top, a per-SKU table with the mean, the CV, the class, the recommended method, and an intermittency pattern, and a bar chart of the CV per SKU with the X and Y threshold lines drawn. Add an annual value per SKU and it also builds the 3×3 ABC-XYZ matrix that crosses value with variability. Every value stays in your browser.
This is the front door of the forecasting set. It does not make a forecast; it decides which forecasting method each item deserves. A steady item with a low CV can go to a simple method like a moving average, a variable item with trend or seasonality needs regression or a seasonal index, and an erratic or on-and-off item is hard to forecast at all, so it leans on safety stock or make-to-order instead. The coefficient of variation turns each demand history into one number that says how noisy it is, the thresholds turn that number into a class, and the class routes the item to the right tool. One note on the letters: XYZ here means demand variability, not operational criticality, so X is the calm, predictable item and Z is the erratic one. It is free, needs no sign-up, and runs entirely in your browser.
In short: for each SKU over n periods, the mean is sum(D) / n, the population standard deviation is sqrt(sum((D – mean)^2) / n), and the coefficient of variation is CV = sigma / mean. The default thresholds classify CV <= 0.5 as X (stable), 0.5 < CV <= 1.0 as Y (variable), and CV > 1.0 as Z (erratic), but sources disagree, so the cutoffs are editable with presets. On the default four SKUs over six periods, A has CV 0.013 (X), B has CV 0.258 (X), C has CV 23.80 / 40 = 0.595 (Y), and D has CV 1.826 (Z), giving X 2, Y 1, Z 1. Route A and B to a moving average or exponential smoothing, C to regression or a seasonal index, and D to make-to-order with more safety stock, since D is intermittent (average demand interval 6 / 2 = 3.0). Add annual values and the tool ranks the items by value with an 80 / 95 Pareto split and crosses ABC with XYZ into a 3×3 grid.
SKUs classified (X / Y / Z)
X 2 / Y 1 / Z 1SKUs classified (X / Y / Z)
Per-SKU classification
- SKU
- mean / CV / class / method / pattern
- A
- 100.0 / 0.013 / X / Moving average / Exp smoothing / smooth
- B
- 50.0 / 0.258 / X / Moving average / Exp smoothing / smooth
- C
- 40.0 / 0.595 / Y / Regression / Seasonal index / smooth
- D
- 10.0 / 1.826 / Z / Make-to-order / more stock / intermittent
ABC-XYZ matrix (SKU counts)
Classified 4 SKUs with thresholds X CV <= 0.50, Y CV <= 1.00, Z above, using the population standard deviation. X items are stable (forecast with a moving average or exponential smoothing), Y items are variable (use regression or a seasonal index), and Z items are erratic (hard to forecast, so hold more safety stock or make to order).
How the calculator works
The tool does the arithmetic you would do by hand to sort a catalog by forecastability, only faster and with the CV chart drawn for you. You give it one SKU per line, an optional name and then its demand series, and for each item it computes the mean, the standard deviation, and the coefficient of variation. It compares the CV against the two thresholds, labels the item X, Y, or Z, names the forecasting method that class points to, and flags the intermittency pattern. You read the X, Y, and Z counts at the top, the per-SKU table under them, the optional ABC-XYZ matrix when you supply values, a plain note, and the CV bar chart with the two threshold lines drawn last. Every SKU sits on its own line, so a name followed by six numbers is one item and the next line is the next item.
The mean is the base. For a SKU with demand D over n periods the mean is sum(D) / n, the ordinary average of the series. It sets the scale of the item, and every later number is read against it, because a swing of 20 units means one thing on an item that averages 40 and something very different on an item that averages 4000. The mean is also the first guardrail: an item whose demand averages zero cannot be classified at all, since the coefficient of variation divides by the mean, and a zero there is the signature of extreme intermittence rather than a number you can rank.
The standard deviation measures the spread of the series around that mean, and the tool lets you pick which of the two standard forms to use. The population sigma is sqrt(sum((D – mean)^2) / n), which divides by n and treats the history you pasted as the whole population. This is the default and the textbook XYZ choice. The sample s is sqrt(sum((D – mean)^2) / (n – 1)), which divides by n – 1 and is what a spreadsheet STDEV function returns; on a short series it reads a little higher than the population form. The two rarely disagree on an item sitting well inside a class, but on a borderline item near a threshold the choice can move it one class up, which is why the tool exposes it rather than deciding for you.
The coefficient of variation is the number that does the classifying. CV = sigma / mean, the standard deviation divided by the mean, so it is the spread expressed as a fraction of the average rather than in raw units. A CV near 0 is a very steady item, and a CV of 1.0 means the standard deviation is as large as the mean itself. Because the CV is scale-free, it lets you compare a slow-moving spare part against a fast-moving staple on one axis: both are judged by how noisy they are relative to their own average, not by how many units they move. That scale-free property is the whole reason XYZ uses the CV rather than the raw standard deviation.
The class comes from the thresholds on the CV. The default set is X for CV <= 0.5, Y for 0.5 < CV <= 1.0, and Z for CV > 1.0, but this is where XYZ has no single universal standard. Some sources use 0.25 and 0.5, others use percentage cutoffs like 10 percent and 25 percent, and the right split depends on your catalog. The tool ships with the common 0.5 / 1.0 and gives you preset buttons for 0.25 / 0.5 and 0.10 / 0.25, plus two editable fields, so you can tighten or loosen the cutoffs and re-run. Treat the thresholds as a policy dial you tune until the X group is genuinely the set of items you are willing to forecast automatically, not as a fixed law.
Each class then points to a method. X items are stable and easy to forecast, so a moving average or a simple exponential smoothing is enough, and you can run lean safety stock. Y items are variable, usually with a trend or a seasonal pattern under the noise, so a linear regression or a seasonal index fits them better, with moderate safety stock. Z items are erratic or intermittent, and a statistical forecast on them is unreliable, so you hold more safety stock or make to order and treat any model with suspicion. Whatever method you pick, validate it afterward with the forecast error metrics, because the class tells you where to start, not whether the forecast you built is actually any good.
The intermittency column adds one more read for items that go on and off. The average demand interval, ADI, is n divided by the number of non-zero periods, and the squared coefficient of variation of the non-zero demand sizes says how variable the sizes are when demand does occur. The Syntetos-Boylan split uses ADI = 1.32 and CV squared = 0.49 to separate demand into smooth, erratic, intermittent, and lumpy. Lumpy demand, which is both rare and highly variable in size, is the hardest case and points to Croston-style methods rather than smoothing. A high CV alone does not tell you whether an item is steady-but-noisy or rare-and-lumpy, so the ADI pattern is what distinguishes them.
The ABC-XYZ matrix is the optional last step. If you paste an annual value per SKU, the tool ranks the items by value in a Pareto sort, calls the items up to 80 percent of cumulative value A, up to 95 percent B, and the rest C, then crosses that ABC rank with the XYZ class into a 3×3 grid of counts. The two axes answer different questions: ABC says how much the item is worth, XYZ says how predictable it is. An AX item is high value and predictable, so you automate it and hold lean stock, while a CZ item is low value and erratic, so you cap it with a min-max rule or consider delisting it. Use at least a full year of history, about 12 periods, for CVs that hold still, and read the whole table rather than any single cell.
What XYZ classification is and what demand variability means
XYZ classification sorts items by how variable their demand is over time, so you can decide how to forecast each one before you forecast at all. It is the natural partner of an ABC analysis, which sorts items by value. ABC tells you which items are worth the most attention, and XYZ tells you which items are predictable enough to forecast with a light method and which are so erratic that no method will do much. Put the two together and you know both how much an item matters and how hard it is to plan, which is more useful than either axis alone.
Demand variability is just how much the period-to-period demand for an item bounces around its own average. An item that sells almost the same amount every week has low variability and is easy to predict; an item that sells nothing for weeks and then a large batch has high variability and is hard to predict. The point of XYZ is to measure that bounce with one number, the coefficient of variation, so you can rank the whole catalog on it. Items that land in X are the calm ones you can forecast on autopilot, items in Y carry a pattern worth modeling, and items in Z are the noisy ones you manage with stock rather than with a model.
It is worth being clear about the letters, because there are two different classifications that both use X, Y, and Z. This tool uses the demand-variability convention, standard in demand planning and the ABC-XYZ matrix, where X is stable demand and Z is erratic demand, measured quantitatively through the coefficient of variation. There is also an older operational-criticality classification, used in some inventory and procurement settings, where the letters rank how critical an item is to operations rather than how variable its demand is. That criticality version is qualitative and is not what this calculator computes. Everything here is about the shape of the demand history, not the importance of the item to your process.
The coefficient of variation
The coefficient of variation is the engine of XYZ, so it is worth understanding on its own. It is CV = sigma / mean, the standard deviation divided by the mean. The standard deviation on its own is in the units of the item, so a standard deviation of 24 units is large for an item that averages 40 and tiny for an item that averages 4000. Dividing by the mean strips out the scale and leaves a pure ratio, so a CV of 0.6 means the same thing on both items: the typical swing is about 60 percent of the average. That is what makes the CV comparable across a catalog of items with wildly different volumes.
Reading the number is straightforward once you anchor a few points. A CV near 0 is an almost flat series, the same demand every period. A CV around 0.25 is a mild wobble, still very forecastable. A CV of 1.0 is the point where the standard deviation equals the mean, which is a genuinely noisy item. Above 1.0 the swings are larger than the average itself, which usually means the demand is erratic or comes in on-and-off bursts. The default thresholds put the X / Y boundary at 0.5 and the Y / Z boundary at 1.0 precisely because those points map to mild noise and to the standard-deviation-equals-mean mark.
Two cautions come with the CV. First, it needs a real mean to divide by, so an item whose demand averages zero, or nearly zero, cannot be classified; that is a sign of extreme intermittence, and you handle it as a stock item rather than a forecast item. Second, the CV compresses the whole shape of the demand history into one number, which is exactly what you want for ranking but hides how the variability arises. Two items can share a CV of 1.8 while one is noisy every period and the other is silent most periods and then spikes. The classes will agree, but the right treatment differs, and that is why the tool also reports the intermittency pattern next to the CV.
Population versus sample standard deviation, and why it matters
There are two standard formulas for the standard deviation, and the tool lets you choose because the choice occasionally changes a class. The population form divides the sum of squared deviations by n: sigma = sqrt(sum((D – mean)^2) / n). It treats the demand history you have as the entire population of interest, which is the usual assumption in textbook XYZ, and it is the default here. The sample form divides by n – 1 instead: s = sqrt(sum((D – mean)^2) / (n – 1)). It treats the history as a sample drawn from a larger process and corrects for the fact that a sample tends to underestimate the spread. This is the form a spreadsheet STDEV function uses, so if you have cross-checked numbers in a spreadsheet, you were probably using the sample form.
The practical difference is that the sample form is always a little larger than the population form, and the gap is widest on short series. Dividing by n – 1 instead of n inflates the result, and when n is small, say six periods, the inflation is noticeable. On SKU C, the population sigma is sqrt(3400 / 6) = 23.80, which gives CV 23.80 / 40 = 0.595, while the sample s is sqrt(3400 / 5) = 26.08, which gives CV 26.08 / 40 = 0.652. Both keep C in class Y under the default thresholds, so here the choice does not change the answer, but on a shorter series with an item sitting right on a boundary, the sample form can push the CV over a threshold and bump the item up a class.
The guidance is simple. Use the population form for textbook XYZ, which is the default, and be aware that a spreadsheet STDEV reads a bit higher because it uses the sample form. Whichever you pick, use it consistently across the whole catalog so the CVs are comparable, and pay closer attention to the choice when a series is short and an item is near a threshold, because that is the only situation where it moves a class. On items well inside a class, the two forms agree for all practical purposes.
Choosing the thresholds
The thresholds are the part of XYZ people expect to be standardized and are surprised to find are not. Published X, Y, Z cutoffs range from tight sets like 0.1 and 0.25 up to loose sets like 0.5 and 1.0, and some sources state them as percentages rather than plain ratios. There is no single authority to defer to, so the cutoffs are a decision you make about your own catalog, and the tool makes that decision editable with two fields and three preset buttons: 0.5 / 1.0, 0.25 / 0.5, and 0.10 / 0.25.
The way to set them is to start from the common 0.5 / 1.0, run the whole catalog, and look at how the items split. If almost everything lands in X, your catalog is calm and you may want to tighten the cutoffs so that X holds only the very steadiest items, the ones you are truly willing to forecast automatically. If almost everything lands in Y or Z, your catalog is noisy and the loose default may be fine, or you may want to loosen further so that X is not empty. The right split is the one where the X group matches the set of items you are comfortable leaving to a simple automated method.
The reclassification is real, not cosmetic, so it is worth seeing what a change does before you commit. Switching the default four SKUs from 0.5 / 1.0 to the tighter 0.25 / 0.5 moves B from X to Y, because its CV of 0.258 now exceeds the 0.25 X cutoff, and moves C from Y to Z, because its CV of 0.595 now exceeds the 0.5 Y cutoff. The same items, the same demand, a different policy: two of the four change class. Re-run the classification whenever your demand history grows or the catalog shifts, because a CV computed on more periods is steadier and can settle an item that was flickering between classes on a short series.
From XYZ class to forecasting method and inventory policy
The reason to classify at all is to route each item to the treatment it can actually use. An X item is stable, so its future looks like its past and a light method captures it. A moving average over a sensible window, or a simple exponential smoothing, forecasts an X item well, and because the demand is predictable you can run lean safety stock. There is little to gain from a heavier model on an item this calm, and the time is better spent elsewhere. Point X items at the Moving Average Calculator or the Exponential Smoothing Calculator.
A Y item is variable, and the variability usually has structure: a trend that climbs or falls over time, or a season that repeats on the calendar. A flat method will keep missing a Y item in a patterned way, so it needs a method that models the structure. A linear regression fits a trend line and projects it, and a seasonal index removes a repeating pattern, fits the trend underneath, and adds the season back. Y items carry moderate safety stock, more than X because the misses are larger, but still driven by a model you can trust once it captures the pattern.
A Z item is erratic or intermittent, and this is where statistical forecasting reaches its limit. When demand is noise larger than the average, or comes in on-and-off bursts, no smoothing model predicts the next period reliably, so leaning on a forecast is a mistake. The better policy is to hold more safety stock to absorb the swings, or to make the item to order so you do not forecast it at all, and to treat any model output as a rough guide rather than a plan. Whatever method you choose for X, Y, or Z, validate it against actual demand with the Forecast Accuracy Calculator, which scores the forecast with MAD, WMAPE, the bias, and the tracking signal, so the class picks the starting method and the error metrics confirm whether it worked.
The ABC-XYZ matrix
The ABC-XYZ matrix crosses two rankings that answer different questions, so together they tell you where to spend attention. ABC ranks items by annual value in a Pareto sort: the tool adds up the value, ranks the items from largest to smallest, and calls the items up to 80 percent of cumulative value A, up to 95 percent B, and the rest C. XYZ ranks the same items by demand variability, X, Y, or Z, as above. Crossing them fills a 3×3 grid where each cell is a combination like AX or CZ, and the count in each cell tells you how many items share that profile.
The corners of the grid are the ones with a clear policy. An AX item is high value and predictable, the best case: automate its forecast, run lean stock, and let it manage itself. A CZ item is low value and erratic, the case that eats time for little return: cap it with a simple min-max rule, or consider delisting it, rather than building a careful forecast for a cheap and unpredictable item. The middle cells sit between those extremes, and the value of the matrix is that it stops you from spending the same forecasting effort on every item regardless of whether the effort pays off.
To see it concretely, add annual values A 100000, B 5000, C 3000, and D 1000 to the default four SKUs. By cumulative value A alone is about 92 percent of the total, so with the 80 / 95 cutoffs the value ranking spreads the items across A, B, and C rather than piling them all into A. Crossing that value rank with the X, Y, Z classes places each item in its cell of the 3×3 grid. The reading is that value and variability together, not either one alone, tell you where the payoff is: the high-value predictable item is worth automating, and the low-value erratic item is worth capping.
Intermittent and lumpy demand
Some items do not have noisy demand so much as absent demand: they sell nothing for several periods, then a batch, then nothing again. Spare parts, slow-moving SKUs, and made-to-order items often look like this. A high coefficient of variation flags them as Z, but the CV alone cannot tell an on-and-off item apart from an item that sells every period with big swings, and those two need different handling. That is what the intermittency read is for.
The average demand interval measures the on-and-off part. ADI is n divided by the number of periods with non-zero demand, so an item that sold in 2 of 6 periods has an ADI of 6 / 2 = 3.0. A larger ADI means longer gaps between sales. The Syntetos-Boylan classification pairs the ADI with the squared coefficient of variation of the non-zero demand sizes and splits demand into four patterns at ADI = 1.32 and CV squared = 0.49: smooth demand occurs often and in steady sizes, erratic demand occurs often but in variable sizes, intermittent demand occurs rarely in steady sizes, and lumpy demand occurs rarely and in variable sizes.
Lumpy demand is the hardest of the four, because it combines long gaps with unpredictable sizes when demand does arrive, and a smoothing model that averages across the gaps forecasts a small steady number that is wrong in every period. Croston-style methods, which forecast the demand size and the interval separately, handle this case better than smoothing, and a larger safety buffer covers what the model cannot. The practical rule is to read the ADI pattern before you trust the CV on any Z item: if the item is intermittent or lumpy, route it to a method built for intermittence and stock it accordingly rather than forcing a smoothing forecast onto it.
Preparing clean multi-SKU data
The classification is only as good as the series behind it, so a little care with the input pays off. Put one SKU per line, an optional name and then its demand series separated by spaces, and keep the periods in time order and evenly spaced, one period per value. Use the same number of periods for every item where you can, because the CV settles as the history grows and a much shorter series gives a shakier CV that can flicker between classes. As a rule, use at least a full year, about 12 periods, before you read much into the class of an item.
Decide what a zero means before you paste it. A genuine zero-demand period on an intermittent item is real data and belongs in the series, because it is what makes the item intermittent and drives both the CV and the ADI. A missing period, where you simply have no record, is different and should not be entered as a zero, since a false zero lowers the mean and inflates the variability and can misclassify the item. If an item averages zero across the whole series, it cannot be classified at all, and that is the tool telling you the item is extremely intermittent and needs a stock policy rather than a forecast.
Use actual demand rather than shipped or sold quantity where the two differ. A period that stocked out records lower sales than the demand that was really there, so a censored series understates both the mean and the variability and can make an item look calmer and more forecastable than it is. If you know a period was constrained, use an estimate of true demand for it. For the ABC-XYZ matrix, give the annual value per SKU on its own lines, matching the SKU names, so the value ranking lines up with the variability classes; without the values the tool still classifies XYZ and simply leaves the matrix out.
Five worked examples
Example 1: the default four SKUs, the full walk-through
This one shows the whole classification on one small catalog so the numbers are transparent. Four SKUs run over six periods, with the default thresholds X CV <= 0.5 and Y CV <= 1.0 and the population standard deviation. SKU A is 100, 102, 98, 101, 99, 100, a nearly flat series with mean 100 and CV 0.013, which is deep in X. SKU B is 40, 60, 50, 70, 30, 50, with mean 50 and CV 0.258, a mild wobble that is still X. SKU C is 20, 80, 40, 10, 60, 30, with mean 40; its population sigma is 23.80, so the CV is sigma / mean = 23.80 / 40 = 0.595, which lands in Y. SKU D is 0, 0, 50, 0, 10, 0, with mean 10 and CV 1.826, which is Z. The counts are X 2, Y 1, Z 1. The lesson is that the coefficient of variation turns each demand history into one number that says how forecastable it is, and the class routes each SKU to a method: A and B to a moving average or exponential smoothing, C to regression or a seasonal index, D to make-to-order with more safety stock.
Example 2: population versus sample standard deviation on SKU C
This case takes SKU C, 20, 80, 40, 10, 60, 30 with mean 40, and shows the two standard-deviation forms side by side. The sum of squared deviations from the mean is 3400. The population sigma divides by n: sqrt(3400 / 6) = 23.80, giving CV 23.80 / 40 = 0.595. The sample s divides by n – 1: sqrt(3400 / 5) = 26.08, giving CV 26.08 / 40 = 0.652. Both readings keep C in class Y under the default 0.5 / 1.0 thresholds, so the choice does not change the answer here. The lesson is that the sample form always reads a little higher than the population form, and the gap is widest on a short series, so on a borderline item near a threshold the choice can bump the item up a class. Default to the population sigma for textbook XYZ, and remember that a spreadsheet STDEV uses the sample form.
Example 3: moving the thresholds
This case keeps the same four SKUs and their CVs and only changes the cutoffs, from the default 0.5 / 1.0 to the tighter 0.25 / 0.5. Under the tighter set, SKU B, with CV 0.258, now exceeds the 0.25 X cutoff and moves from X to Y, and SKU C, with CV 0.595, now exceeds the 0.5 Y cutoff and moves from Y to Z. Nothing about the demand changed; only the policy did, and two of the four items changed class. The lesson is that the X, Y, Z cutoffs are a choice, not a law. Tighten them for a catalog where you want only the very steadiest items to count as X, loosen them for a catalog that is noisy everywhere, and re-run the classification after each change to see how the split moves.
Example 4: intermittent demand and the ADI pattern
This case looks past the CV to the intermittency read on SKU D, 0, 0, 50, 0, 10, 0. D has demand in only 2 of the 6 periods, so the average demand interval is ADI = 6 / 2 = 3.0, well above the 1.32 cutoff, and the item flags as intermittent rather than smooth. Its CV of 1.826 already put it in Z, but the ADI tells you why: this is not a busy item with big swings, it is a quiet item that goes on and off. The lesson is that a high CV can come from lumpy, on-and-off demand as much as from steady but noisy demand, and the ADI pattern separates the two. Read it before you decide what to do with a Z item, because an intermittent item like D belongs with a method built for intermittence, a spare-parts style treatment, rather than any smoothing forecast.
Example 5: the ABC-XYZ matrix
This case adds value to the four SKUs to build the matrix: annual values A 100000, B 5000, C 3000, and D 1000, for a total of 109000. By cumulative value, A alone is about 92 percent of the total, so with the 80 / 95 Pareto cutoffs the value ranking spreads the items across the A, B, and C classes rather than putting them all in A. Crossing that value rank with the XYZ classes, A 2, Y 1, Z 1 from before, fills the 3×3 grid, placing the high-value predictable item and the low-value erratic item in different corners. The lesson is that value and variability together tell you where to spend attention. An AX item is high value and predictable, so you automate it and hold lean stock, while a CZ item is low value and erratic, so you cap it with a min-max rule or consider delisting it.
Three expert tips
Treat the thresholds as a dial, not a constant
Published X, Y, Z cutoffs range from 0.1 / 0.25 at the tight end to 0.5 / 1.0 at the loose end, and there is no single standard to defer to. Start from the common 0.5 / 1.0, run the whole catalog, and look at how your items split before you settle on a set. If the X group is too crowded to be the set you would actually forecast automatically, tighten the cutoffs until it is; if X is nearly empty, loosen them. The presets, 0.5 / 1.0, 0.25 / 0.5, and 0.10 / 0.25, give you three quick tries, and the two editable fields let you land anywhere in between. Re-run whenever your demand history grows, because a CV computed on more periods is steadier and can settle an item that was flickering between classes on a short series.
Classify by variability first, then let the class pick the method
XYZ is the front door of forecasting, so use it before you choose a model rather than after. X items are steady, so a moving average or exponential smoothing is enough and you can run lean stock. Y items carry a trend or a season, so a linear regression or a seasonal index fits them and you hold moderate stock. Z items are erratic, so a smoothing forecast is unreliable and you lean on safety stock or make-to-order instead. Choosing the method from the class saves you from putting a heavy model on a calm item or a light model on a patterned one, and it stops you from trusting any model on an item too erratic to forecast. Then check the method you picked against actual demand with the forecast error metrics, because the class picks the starting point and the metrics confirm the fit.
Read the ADI pattern before you trust the CV on lumpy items
A high coefficient of variation has two very different causes. It can mean steady demand with big swings every period, or it can mean rare, on-and-off demand that is silent for stretches and then spikes. Those need different treatment, and the CV alone cannot tell them apart. The average demand interval and the squared CV of the non-zero sizes separate demand into smooth, erratic, intermittent, and lumpy, and the lumpy case, rare and highly variable, is the hardest of all. A smoothing model averages a lumpy item down to a small steady number that is wrong every period, so a lumpy item is better served by a Croston-style method and a bigger buffer. Read the intermittency column next to the CV on every Z item, and route the intermittent and lumpy ones to a method that expects the gaps.
Common mistakes to avoid
The first mistake is treating the thresholds as fixed. XYZ has no universal cutoffs, so a set copied from one source may sort your catalog badly; start from 0.5 / 1.0, look at the split, and tune. The second is reading the letters as criticality. Here X is stable demand and Z is erratic demand, measured by the coefficient of variation, not a ranking of how important the item is to operations, so do not mix the demand-variability class with an item’s operational priority. The third is trusting a class from too short a series. A CV on four or five periods is shaky and can flicker between classes, so use about a year of history before you act on the label.
A fourth mistake is entering a missing period as a zero. A real zero-demand period is data and belongs in the series, but a period you simply have no record for is not a zero, and pasting it as one lowers the mean and inflates the variability, which can misclassify the item. A fifth is trusting a smoothing forecast on a lumpy Z item: a high CV that comes from on-and-off demand needs the ADI read and a method built for intermittence, not a moving average. A sixth is scoring against censored sales, where a stocked-out period records less than the true demand and makes the item look calmer than it is. Tune the thresholds, read the letters as variability, use enough history, keep zeros honest, check the ADI on Z items, and use real demand, and the classification will hold up.
Where this calculator fits
It suits anyone who has to forecast a catalog and wants to spend the effort where it pays. A demand planner can classify every SKU by variability, forecast the X items on autopilot, model the Y items with a trend or a seasonal method, and manage the Z items with stock rather than a model, instead of applying the same method to everything. An inventory or supply-chain analyst can add the annual values, read the ABC-XYZ matrix, and set stock policy by cell: automate and run lean on AX, cap or delist on CZ. A student or an analyst learning demand planning can see the coefficient of variation, the population and sample standard deviations, the thresholds, and the intermittency pattern computed on one small catalog and understand how each piece feeds the class.
This is the front door of the forecasting set, the tool that decides which method each item deserves before you build a single forecast. Classify an item here, then send it to the method its class points to. Route an X item to the Moving Average Calculator or the Exponential Smoothing Calculator. Route a Y item to the Linear Regression Forecast Calculator or the Seasonal Index Calculator. Manage a Z item with stock, and if you do build a model for it, treat the output with caution. Whatever you build, score it against actual demand with the Forecast Accuracy Calculator, so the class chooses the starting method and the error metrics tell you whether it worked. The Forecasting and Analytics hub gathers the whole set.
Frequently asked questions
What does this XYZ analysis calculator do?
It sorts your SKUs by how variable their demand is, so you can pick a forecasting method for each one. You paste one SKU per line, an optional name and then its demand series, and for each item it computes the mean, the standard deviation, and the coefficient of variation, then classifies it as X (stable), Y (variable), or Z (erratic) against thresholds you set. It returns the X, Y, and Z counts, a per-SKU table with the mean, the CV, the class, the recommended method, and the intermittency pattern, and a bar chart of the CV per SKU with the two threshold lines drawn. Add an annual value per SKU and it also builds the 3×3 ABC-XYZ matrix that crosses value with variability. On the default four SKUs, A has CV 0.013 (X), B has CV 0.258 (X), C has CV 0.595 (Y), and D has CV 1.826 (Z), giving X 2, Y 1, Z 1. Every value stays in your browser.
How is the coefficient of variation calculated?
For each SKU the mean is sum(D) / n, the ordinary average of the demand series over n periods. The standard deviation measures the spread around that mean, and the coefficient of variation is CV = sigma / mean, the standard deviation divided by the mean. Dividing by the mean makes the number scale-free, so a CV of 0.6 means the typical swing is about 60 percent of the average, whether the item averages 40 units or 4000. A CV near 0 is a very steady item, and a CV of 1.0 means the standard deviation is as large as the mean. On SKU C, 20, 80, 40, 10, 60, 30, the mean is 40 and the population sigma is 23.80, so the CV is 23.80 / 40 = 0.595. The scale-free property is the reason XYZ ranks items on the CV rather than on the raw standard deviation.
What do the X, Y, and Z classes mean?
They rank items by demand variability. X is stable demand, a low coefficient of variation, an item that sells about the same amount each period and is easy to forecast. Y is variable demand, a moderate CV, an item that usually carries a trend or a season under the noise and needs a method that models the pattern. Z is erratic or intermittent demand, a high CV, an item whose swings are as large as or larger than its average, which is hard to forecast at all. Under the default thresholds, X is CV <= 0.5, Y is 0.5 < CV <= 1.0, and Z is CV > 1.0. The class points to a treatment: forecast X with a light method and lean stock, model Y with regression or a seasonal index and moderate stock, and manage Z with more safety stock or make-to-order rather than a model.
Is XYZ here about demand variability or item criticality?
This calculator uses the demand-variability convention, which is standard in demand planning and the ABC-XYZ matrix. X is stable demand and Z is erratic demand, measured quantitatively through the coefficient of variation of the demand history. There is also an older operational-criticality classification, used in some inventory and procurement settings, where X, Y, Z rank how critical an item is to operations rather than how variable its demand is. That criticality version is qualitative and subjective and is not what this tool computes. Everything here is about the shape of the demand history, so a low-CV item is X because its demand is predictable, not because it is unimportant, and a high-CV item is Z because its demand is erratic, not because it is critical.
Which standard deviation should I use, population or sample?
Use the population form for textbook XYZ, which is the default here. The population sigma divides the sum of squared deviations by n, sqrt(sum((D – mean)^2) / n), and treats the history you pasted as the whole population. The sample form divides by n – 1, sqrt(sum((D – mean)^2) / (n – 1)), and is what a spreadsheet STDEV function returns; it reads a little higher, and the gap is widest on short series. On SKU C the population sigma is sqrt(3400 / 6) = 23.80 for a CV of 0.595, while the sample s is sqrt(3400 / 5) = 26.08 for a CV of 0.652; both keep C in class Y. The choice only matters on a short series with an item near a threshold, where the higher sample reading can bump the item up a class. Pick one form and use it consistently across the catalog.
What thresholds should I use for X, Y, and Z?
There is no single standard, which is why the tool makes them editable. Published cutoffs range from tight sets like 0.1 and 0.25 to loose sets like 0.5 and 1.0, and some sources state them as percentages. Start from the common 0.5 / 1.0, run the whole catalog, and look at how the items split. If almost everything lands in X, tighten the cutoffs so X holds only the steadiest items; if X is nearly empty, loosen them. The right split is the one where the X group matches the items you are willing to forecast automatically. The preset buttons give you 0.5 / 1.0, 0.25 / 0.5, and 0.10 / 0.25, and the two fields let you land anywhere between. Re-run whenever your history grows, because a CV on more periods is steadier and settles items that flicker between classes on a short series.
What forecasting method does each class point to?
X items are stable, so a moving average or a simple exponential smoothing forecasts them well, and you can run lean safety stock. Y items are variable, usually with a trend or a season, so a linear regression or a seasonal index fits them, with moderate safety stock. Z items are erratic or intermittent, so a statistical forecast is unreliable and you hold more safety stock or make to order instead of trusting a model. The class picks the starting method: send X to the Moving Average or Exponential Smoothing calculator, Y to the Linear Regression Forecast or Seasonal Index calculator, and manage Z with stock. Whatever you build, validate it against actual demand with the Forecast Accuracy Calculator, which scores the forecast with MAD, WMAPE, the bias, and the tracking signal, because the class tells you where to start and the error metrics tell you whether the forecast is any good.
What is the ABC-XYZ matrix?
It crosses two rankings that answer different questions. ABC ranks items by annual value in a Pareto sort: items up to 80 percent of cumulative value are A, up to 95 percent are B, and the rest are C. XYZ ranks the same items by demand variability, X, Y, or Z. Crossing them fills a 3×3 grid where each cell is a combination like AX or CZ and the count says how many items share that profile. The corners have clear policies: an AX item is high value and predictable, so you automate it and run lean stock, while a CZ item is low value and erratic, so you cap it with a min-max rule or consider delisting. To build the matrix, add an annual value per SKU to the tool; without values it still classifies XYZ and simply leaves the matrix out. Value and variability together tell you where the forecasting effort pays off.
What is the ADI and how does it flag intermittent demand?
The average demand interval, ADI, is n divided by the number of periods with non-zero demand, so an item that sold in 2 of 6 periods has an ADI of 6 / 2 = 3.0. A larger ADI means longer gaps between sales. The Syntetos-Boylan classification pairs the ADI with the squared coefficient of variation of the non-zero demand sizes and splits demand into four patterns at ADI = 1.32 and CV squared = 0.49: smooth (frequent, steady sizes), erratic (frequent, variable sizes), intermittent (rare, steady sizes), and lumpy (rare, variable sizes). This matters because a high CV can come from steady-but-noisy demand or from rare on-and-off demand, and those need different treatment. Lumpy demand is the hardest, and it points to Croston-style methods rather than smoothing. Read the ADI pattern next to the CV on any Z item to see which kind of variability you have.
Why is SKU D classified as Z and intermittent?
SKU D is 0, 0, 50, 0, 10, 0, so it has demand in only 2 of the 6 periods. Its mean is 10 and its coefficient of variation is 1.826, well above the 1.0 Z cutoff, so it classifies as Z on variability alone. The intermittency read then explains the kind of variability: the average demand interval is ADI = 6 / 2 = 3.0, above the 1.32 cutoff, so the item flags as intermittent rather than smooth. In plain terms, D is not a busy item with big swings, it is a quiet item that goes on and off. That is why it routes to make-to-order with more safety stock rather than to a smoothing forecast, and it is a Croston-style case: a moving average would average the gaps down to a small steady number that is wrong in every period.
How much demand history do I need to classify an item?
Use at least a full year, about 12 periods, for a CV that holds still. You can classify an item on fewer periods, but a CV on four or five periods is shaky and the item can flicker between classes as you add data, so an early label is provisional. A longer history makes the mean and the standard deviation steadier, which settles borderline items, and it also makes the ADI pattern more reliable for intermittent items. Keep the periods evenly spaced and in time order, one period per value, and re-run the classification when the history grows. An item whose demand averages zero across the whole series cannot be classified at all, because the CV divides by the mean; that is a sign of extreme intermittence and you handle it with a stock policy rather than a forecast.
How does the tool handle zeros and missing periods?
A real zero-demand period is data and belongs in the series, because it is what makes an item intermittent and it feeds both the coefficient of variation and the average demand interval. A missing period, one you simply have no record for, is different and should not be entered as a zero, since a false zero lowers the mean and inflates the variability and can misclassify the item; either estimate the period or leave it out. An item that averages zero across the whole series cannot be classified, because the CV divides by the mean, and the tool treats that as extreme intermittence. For the ABC-XYZ matrix, add the annual value per SKU on its own lines matching the names; without the values the tool still classifies XYZ and simply omits the matrix. Use actual demand rather than censored sales, because a stocked-out period understates the true demand.
Is the tool free, and does it work in my browser?
Yes to both. The XYZ analysis calculator is free with no sign-up, and every calculation runs in your browser, so the demand series and values you enter are never sent to a server, stored, or shared. You can download a PDF of the result, export a CSV, or share a summary on WhatsApp. It computes the mean, the standard deviation in the population or sample form you choose, and the coefficient of variation for each SKU, classifies it X, Y, or Z against the thresholds you set, names the recommended method, flags the intermittency pattern, and, when you supply annual values, builds the 3×3 ABC-XYZ matrix. It also charts the CV per SKU with the two threshold lines drawn. It is a classification and analysis tool, so use it to route each item to the right forecasting method before you forecast, and validate the forecast you build afterward with the Forecast Accuracy Calculator.
More forecasting and analytics calculators
XYZ is the front door of this set: classify each item here, then send it to the method its class points to. All five sibling tools are live, so each class routes straight to a working calculator.
The forecasting tools work as a set, and XYZ sits at the front. Classify each SKU by variability here, route X items to a moving average or exponential smoothing, Y items to regression or a seasonal index, and Z items to a stock policy, then check the forecast you build with the Forecast Accuracy Calculator. The Forecasting and Analytics hub gathers the whole set.
Sources, disclaimer, and editorial transparency
The relationships used here are standard demand-classification and inventory practice. For each SKU over n periods the mean is sum(D) / n, the population standard deviation is sigma = sqrt(sum((D – mean)^2) / n), the sample standard deviation is s = sqrt(sum((D – mean)^2) / (n – 1)), and the coefficient of variation is CV = sigma / mean. The default XYZ thresholds classify CV <= 0.5 as X, 0.5 < CV <= 1.0 as Y, and CV > 1.0 as Z, and because sources disagree the cutoffs are editable, with presets at 0.5 / 1.0, 0.25 / 0.5, and 0.10 / 0.25. The average demand interval is ADI = n / (number of non-zero periods), and the Syntetos-Boylan classification splits demand into smooth, erratic, intermittent, and lumpy at ADI = 1.32 and CV squared = 0.49 on the non-zero sizes. The ABC-XYZ matrix ranks items by annual value in a Pareto sort, with A up to 80 percent of cumulative value, B up to 95 percent, and C the rest, then crosses ABC with XYZ into a 3×3 grid. The worked-example numbers are computed from the series shown: A 100, 102, 98, 101, 99, 100 gives mean 100 and CV 0.013 (X); B 40, 60, 50, 70, 30, 50 gives mean 50 and CV 0.258 (X); C 20, 80, 40, 10, 60, 30 gives mean 40, population sigma 23.80, and CV 0.595 (Y), while the sample s is 26.08 for a CV of 0.652; D 0, 0, 50, 0, 10, 0 gives mean 10, CV 1.826 (Z), and ADI 6 / 2 = 3.0 (intermittent), for counts of X 2, Y 1, Z 1; switching the thresholds to 0.25 / 0.5 moves B to Y and C to Z; and annual values A 100000, B 5000, C 3000, D 1000, total 109000, place A alone at about 92 percent of cumulative value and spread the items across the A, B, and C classes for the matrix. This calculator and guide are built and reviewed by the OpsCalculators team; see our Editorial Policy for how each tool is researched, built, and tested.
Results are accurate for the formulas and the series above, and they are a classification and analysis estimate, not a guarantee of future demand. XYZ tells you which method to start with; it does not build the forecast, and a class is only as steady as the history behind it, so use about a year of data and re-run as the history grows. There is no universal set of thresholds, so tune the cutoffs to your catalog rather than copying one blindly. Read the letters as demand variability, not operational criticality; keep real zeros in the series but do not enter missing periods as zeros; read the ADI pattern before you trust the CV on a lumpy item; and use actual demand rather than censored sales so a stockout does not make an item look calmer than it is. Validate any forecast you build with the Forecast Accuracy Calculator. See our full Disclaimer. OpsCalculators.com is operated by MAFHH INTERNATIONAL LTD. Your inputs are processed in your browser and are never stored; see our Privacy Policy.