Buyer-Frequency Persistence and NBD: Claims Narrowed After Code Audit
Table of Contents
Correction — August 2026
The original article interpreted Q4 R²=0.472 as response to an additional marketing contact and treated R²≈0 as poor Dirichlet fit. Both claims are withdrawn. The regression contains no contact or treatment variable, and the NBD evaluation predicted the sample mean rather than using the fitted distribution.
Read the corrected EBM-2025 v0.2 report or the v0.2 PDF. The original v0.1 PDF is archived and superseded.
Series navigation
- Duplication of Purchase analysis
- Double Jeopardy analysis
- Category Entry Points analysis
- Corrected analysis status
TL;DR
The archived quarterly regression produced its largest within-sample association in Q4: standardized slope 3.341 and R²=0.472. This is a descriptive adjacent-quarter frequency result. It does not measure response to an additional marketing contact and does not establish that high-volume buyers are the most valuable intervention target.
The separate NBD routine successfully returned fitted parameters, but its evaluation assigned every user the sample mean. R²≈-7×10⁻⁶ therefore evaluates a constant predictor, not the fitted negative-binomial distribution or an NBD-Dirichlet model.
Two different analyses
The original article combined a buyer-frequency regression and a distribution-fitting exercise. They should be read separately.
- Buyer-frequency persistence: association between transaction counts in adjacent recorded quarters within purchase-volume groups.
- NBD diagnostic: estimation of a negative-binomial purchase-frequency distribution followed by an attempted goodness-of-fit evaluation.
Neither analysis contained a marketing intervention. “Moderation” in the filename did not mean that contact frequency or campaign exposure moderated an outcome.
Archived buyer-frequency method
The UCI transaction rows were aggregated to user-quarter observations. Within each quarter, purchase-volume quartiles Q1–Q4 were recalculated from the observed outcome. The script then standardized the current transaction count and regressed a shifted adjacent-quarter count on it within each quartile using ordinary least squares.
The variable named freq_t1 points to the previous recorded quarter under the implemented shift. The name suggests a forward outcome, but the code’s temporal direction is reversed relative to that label. This does not erase the observed association; it changes what the coefficient describes.
Buyer-frequency result
The UCI analysis assigned users to purchase-volume quartiles within each quarter, then regressed transaction frequency in one observed quarter on the adjacent observed quarter within each quartile. The predictor was standardized before estimation.
| Purchase-volume quartile | Observations | Users | Standardized slope | R² |
|---|---|---|---|---|
| Q1 | 126 | 107 | -0.002 | 0.00001 |
| Q2 | 88 | 76 | 0.321 | 0.196 |
| Q3 | 77 | 67 | 0.765 | 0.204 |
| Q4 | 190 | 120 | 3.341 | 0.472 |
Q4 had the strongest within-sample association under this grouping rule. The result states that adjacent-quarter transaction counts were more predictable among the highest purchase-volume observations in the archived sample.

Figure 1. Archived adjacent-quarter frequency regressions by contemporaneously defined purchase-volume quartile. The chart is descriptive and non-causal.
Why the Q4 pattern can become stronger mechanically
Quartile membership is defined from purchase volume in each observed quarter rather than from a fixed pre-period. High-volume groups also have greater variance. Grouping on an outcome-related variable and then regressing nearby outcomes can produce larger slopes and R² values even without a segment-specific response mechanism.
The reported Q1–Q4 gradient is therefore an object for follow-up, not proof of a behavioral treatment effect. The archived analysis also does not establish that all quartile coefficients are stable across later periods or out of sample.
What R²=0.472 does not identify
The regression contains no marketing-contact variable, campaign exposure, treatment assignment, price, or stock measure. It does not estimate the effect of an additional contact and cannot explain incremental sales or expected return on a targeting budget.
The script’s shifted value points to the previous recorded quarter, while quartile membership is recalculated from purchase volume in each quarter. Outcome-related grouping and the greater variance of high-volume buyers can mechanically increase the Q4 association. A predictive follow-up would need a fixed baseline cohort, explicit time direction, and held-out later periods. A causal follow-up would additionally need an identified exposure or randomized treatment.
Archived NBD method and output
The NBD routine estimated parameters from purchase counts and recorded solver success. The archive reported mean purchases of 19.48, standard deviation 181.9, and R²≈-7×10⁻⁶. Successful optimization only means that the fitting procedure returned a solution; it does not show that the fitted model was used correctly downstream.
The NBD models a category purchase-frequency distribution. A full NBD-Dirichlet analysis would additionally model brand choice probabilities across a valid category-by-brand-by-buyer panel. The archived evaluation did not reach that test.
Withdrawn Dirichlet-fit claim
The archive reports fitted negative-binomial parameters and R²≈-7×10⁻⁶. The evaluation path, however, assigns the same sample-mean prediction to every user. The resulting R² evaluates a constant-mean predictor. It does not evaluate predictions from the fitted NBD distribution and does not test a full NBD-Dirichlet model.
The archived result therefore cannot support either good or poor Dirichlet fit.
The archived P-P plot remains available as a pipeline artifact: NBD diagnostic plot. Because the evaluation path supplied constant-mean predictions, the plot should not be interpreted as fitted-distribution performance.
Reproduction record
The archived entry points were:
poetry run python scripts/eb/compute_moderation.py \
--tx data/processed/tx_uci_beauty_with_categories.csv \
--category_regex bodycare
poetry run python scripts/eb/compute_dirichlet.py \
--tx data/processed/tx_uci_beauty_with_categories.csv \
--category_regex bodycare
The logs identify the input only as loaded and do not record a Git commit. The commands document the original execution path but do not constitute an exact reproduction package.
Claim boundary
The Q4 value is a descriptive adjacent-quarter association. It does not support heavy-buyer targeting, contact-frequency changes, budget allocation, or an optimization claim. The NBD output is an implementation diagnostic, not a model-fit result.
Reimplementation requirements
For prediction, define quartiles from a fixed baseline period, preserve forward time direction, and evaluate on held-out future quarters. For causal response, add an identified exposure or randomized treatment and prevent post-treatment purchase volume from defining the groups. For NBD evaluation, generate expected frequencies or probabilities from the fitted parameters and compare those predictions with observations using pre-specified diagnostics.
References
- Goodhardt, G.J., Ehrenberg, A.S.C., & Chatfield, C. (1984). “The Dirichlet: A Comprehensive Model of Buying Behaviour.” Journal of the Royal Statistical Society: Series A, 147(5), 621–643. https://doi.org/10.2307/2981696
- Chen, D. (2012). Online Retail II. UCI Machine Learning Repository. https://doi.org/10.24432/C5CG6D
EBM-2025 v0.2 — Replication Audit
Read the corrected report, including the withdrawn claims, code-audit findings, methods, and limits.
Related Posts
- The API Hypothesis Was Not the Final Product
- Idea to Service OS v1: A Repeatable Method for AI-built Business Systems
- Reusable Asset Loop: Converting One Case into Repeatable Service Components
- Evidence-first Service Development: A Method to Prevent AI Product Overclaim
- Externalized Cognition for Solo Builders: Turning Notes, Prompts, and Checklists into a Build System
- Operations-first AI Service Design: Privacy, Review, and Launch Constraints
- GTM-attached Development: Designing PoC and LoI as Product Inputs