Method
This app forecasts the next 3 to 6 months of search demand for a category and its segments using only the 48 monthly search volumes returned by the ListeningMind Data API `keyword_info` (ads_info). Search demand is a sum of monthly search volumes, not sales. Every number carries a source label.
1. Data collection
- For each seed, `intent_finder/keyword_list` is called sorted by volume (100 or 200 per seed) and by growth (40) to build the category keyword universe. [measured]
- An LLM removes homonyms, news items and off-topic keywords; the exclusions and reasons are listed in the evidence tab. [LLM]
- Every remaining keyword gets its 48-month series from `keyword_info` (ads_info, 1 credit per keyword). Korea is Google plus Naver; Japan and the US are Google. [measured]
2. Segments
- Auto, in two stages: (1) from the top 80 keywords by volume the LLM defines a taxonomy of 5 to 8 segments (name, definition, examples); (2) every keyword is assigned, in batches of 100, to one segment or to a special bucket (adjacent category / event and people / other). Matching normalises spacing and case so spelling differences do not drop keywords. A segment's volume is the sum of its keywords. [LLM]
- Isolated groups: adjacent-category keywords (an ingredient, a by-product, a product that merely shares the word, e.g. wine vinegar in a wine category) and event or people keywords are shown separately and excluded from the category total, the ranking and the timing.
- Failure rule: fewer than 3 segments, or "Other" above 50% of category keywords, means the auto segmentation failed; the run falls back to per-seed segments and says so. Head keywords are never promoted into fake segments.
- Per seed: one seed is one segment. Custom: your segment names and keywords are fixed and stage (2) assigns the rest.
- Top-3 keyword share (concentration) is shown so you can see when a sum is driven by one or two keywords. [calc]
3. Regime classification
Before any model is chosen, each series is classified; the first matching rule wins. [calc]
| Regime | Rule | Handling |
| breakout | last 6-month mean / prior 18-month mean at or above 3.0 (and 20+ searches a month) | level hold of the last 3 months instead of a seasonal model; band −50%/+60%; reference only; no timing, no ranking |
| event spike | peak month at or above 4x the median, within the last 24 months, current 3-month mean at or below 50% of the peak, no repeat a year apart | decay by 40% a month toward the pre-spike 12-month median; reference only; no timing, no ranking |
| unstable | chosen model's backtest error above 50% | forecast shown as reference only; no timing, no ranking |
| seasonal | strength 0.3 or more and amplitude 1.25 or more | timing rules apply |
| rising / falling trend | annualised deseasonalised Theil-Sen slope beyond +15% / −15% | treated as evergreen, trend shown |
| stable evergreen | everything else | evergreen |
- Low-base guard: when the denominator of YoY, momentum or horizon YoY is under 20 searches a month, or the ratio is 10x or more, the figure is replaced by "base too small". [calc]
4. Forecast models
The series is used from its first non-zero month. Under 24 months of history the seasonal models are switched off; under 12 months nothing is forecast.
| Model | Method |
| S seasonal naive (baseline) | same month last year |
| M 12-month mean (baseline) | trailing 12-month mean, flat |
| A seasonal naive + growth | same month last year × (1 + last 12 months / previous 12 months − 1) |
| B decomposition + Theil-Sen | seasonal index = monthly median of ratio to a centered 12-month moving average; Theil-Sen line on the deseasonalised last 24 months; forecast = (level + slope×h) × index |
| C Holt-Winters multiplicative | triple exponential smoothing with α, β, γ chosen by grid search on one-step training error |
| D ensemble | median of A, B, C |
- Expanding rolling-origin backtest: the training length grows one month at a time from 36 to 42 months and each origin forecasts 6 months (7 origins and 42 error points on 48 months, 7 per horizon step). The lowest mean sMAPE wins; within 0.5 pt the simpler model wins (order S, M, A, B, C, D), so a complex model that cannot beat a baseline is never chosen. All six sMAPEs and the chosen model's MASE (absolute error relative to seasonal naive, 1.0 = equal) are in the evidence tab. [calc]
- The 80% band takes the chosen model's pooled 10th/90th log-error percentiles, scales them by each horizon step's RMS error (monotone, so later months are never narrower), and multiplies by 1.1 to correct for choosing the model on the same backtest. Never narrower than ±10%. A backtest error above 25% earns a "reference only" badge.
- Whole category = the sum of the segment forecasts (Other included, isolated groups excluded), so segments always add up to the category. Its backtest error and band come from summing the segments' chosen-model backtest forecasts at each origin and scoring that sum against the category actuals. The stand-alone category model (top-down) is kept in the raw data for reference. [calc]
- Seasonality strength = max(0, 1 − Var(remainder) / Var(seasonal + remainder)) on the log scale. Peak, trough, amplitude (max/min index), YoY and momentum (last 3 months vs the same 3 months a year earlier) are computed alongside. [calc]
5. Timing rules [rule]
- Ramp start: the first month of the season block (index at or above 1.0) that contains the peak; a two-hump season ramps at its first hump. A one-month spike ramps the month before it.
- Peak: the month with the highest index. Decline start: the first month after the peak where the index falls below 1.0.
- Campaign start = ramp start. Content and SEO prep = two months earlier [convention]. Launch window = two months from ramp start. Promotion end = decline start.
- High / low season: forecast divided by the trailing 12-month mean at or above 1.15 / at or below 0.85.
- Seasonality strength under 0.3 or amplitude under 1.25 = evergreen; no month is singled out.
- Breakout, event-spike and unstable series and isolated groups get no timing.
- Opportunity score (a relative rank): among rankable segments, 40 × rank of MEASURED trailing-12-month YoY (not the forecast's own YoY, which is 0 by construction for a seasonal-naive forecast) + 30 × rank of momentum + 30 × rank of high-season share within the horizon (rank percentiles). It is relative, so in a category where everything declines someone still ranks first. Backtest error above 25%, breakout, event spike, unstable and isolated groups get no score at all (hard gate). [calc]
Current parameters: ramp_cross_level=1.0, prep_lead_months=2, launch_window_months=2, peak_high=1.15, peak_low=0.85, evergreen_strength=0.3, min_amplitude=1.25
6. Brief and numeric guard
The timing brief and the one-line guidance per segment are written by an LLM. Every number in a sentence is checked against the evidence pack; a sentence carrying a number that is not in the evidence is dropped and replaced by a template sentence. Dropped sentences are kept in the evidence tab. [LLM]
7. Limitations
- 48 months give 7 origins and 42 error points, only 7 per horizon step, so the band is widened by RMS ratio rather than per-step percentiles. Errors are shown as they are.
- Segment assignment and isolation are LLM judgements; the keywords of each isolated group are visible on screen.
- The latest data month is the previous month; the current month is treated as forecast month one.
- Search demand leads interest, not sales; the lag between search and purchase differs by category.
- Gender and age exist only for Korea and are volume-weighted means of the top keywords. [derived]