Features Conjoint & MaxDiff Survey Items Pricing & Kano Product Evaluation Analytics Market Simulation Survey Analysis How It Works Transparency Pricing Log in Start Free

No black boxes: a replication package for every analysis

Click estimate and Choicery runs the analysis in your browser, no install needed. Or download a self-contained replication package and run it on your own machine: read every line, change any parameter, re-estimate the whole thing. Use either, or both. That holds for every estimator, not just HB. Share a package with reviewers or clients, attach it to a journal submission, upload it to OSF, and re-run it years later, with or without an active Choicery subscription.

The replication package

Estimators
HB, Latent Class, Profile Analysis, Neural HB, Interaction Search
Code
HB in Julia, the other four in Python
Setup
Pinned environment, one-command launcher
In-app run first
Not needed for HB, Profile Analysis and Neural HB
Back in Choicery
Optional. HB, Profile Analysis and Neural HB results re-import for the simulator and WTP

Two ways to run every estimator

The same estimator is available two ways, and both produce identical results from identical settings.

In the browser

Click estimate and watch it run on Choicery's server, with live convergence progress. Ideal for the normal working loop. Bounded for fair use (a cap on chains and a wall-time limit).

As a replication package

Download a self-contained project, HB in Julia, the AI, segment and interaction models in Python, with a pinned environment and a one-command launcher. No caps, no time limit, no Choicery account, and if you want, HB and Profile Analysis results re-import to unlock every downstream tool. This is also where upper-level covariates run.

The HB engine is validated against independent CBC/HB benchmark results: individual utilities correlate at roughly 0.96 to 0.99 across benchmark studies.

Each package holds the complete estimator as readable source code: about 3,500 lines of Julia for HB, about 7,000 lines of Python for the AI-Driven Profile Analysis. Every script has a clearly marked block of settings you can change. Two short excerpts from those blocks:

hb_analysis.jlHB · Julia
# ============================================================================
# USER SETTINGS - CBC HB
# Edit values in this block, save the file, and run the script again.
# ============================================================================

const USER_DATA_FILE = "data/choicemodel_data.csv"  # Input CSV path; normally keep the packaged file.
const USER_OUTPUT_DIR = "results"  # Output folder created by the script.
const USER_N_CHAINS = 2  # Independent MCMC chains.
const USER_N_BURN = 5000  # Warm-up draws discarded per chain.
const USER_N_DRAWS = 5000  # Post-burn-in draws per chain.

Excerpt: lines 1 to 10 of about 3,500. Below them follow the sampler, the convergence diagnostics and the code that writes every result file.

run_tastenet_bootstrap.pyProfile Analysis · Python
# --- Model architecture ---
HIDDEN_SIZES = [32, 16]      # hidden layer widths for the covariate->utility network
ACTIVATION   = "tanh"        # hidden activation: tanh | elu
DROPOUT      = 0.10          # dropout rate applied after each hidden layer

# --- Training loop ---
LEARNING_RATE       = 0.005  # Adam step size
L2_LAMBDA           = 0.001  # L2 regularization strength (weight decay)
LABEL_SMOOTHING_EPS = 0.05   # label smoothing epsilon for cross-entropy
MAX_EPOCHS          = 2000   # max training epochs for baseline model
PATIENCE            = 200    # early-stopping patience (epochs without improvement)
N_RESTARTS          = 5      # random restarts; best loss wins
BATCH_SIZE          = 0      # 0 = full-batch, >0 = mini-batch size
SEED                = 42     # global random seed (numpy, torch, bootstrap resamples)

Excerpt: lines 771 to 784 of about 7,000. Above them sit the imports and helper functions, below them the network itself, training, bootstrap refits, SHAP and the code that writes every result file.

Every estimator ships the same way, a self-contained, runnable package with the script, your data, the exact environment, a README and a guide for each setting. There are four packages, one for each kind of question you might be answering:

Preference Analysis Julia

Hierarchical Bayes part-worths and importances, per respondent, with full convergence diagnostics.

Use it when you need defensible, individual-level utilities, for example pricing a new subscription tier and reproducing the numbers for a journal submission.

AI-Driven Profile Analysis Python

Profile Analysis and Neural HB. A deep model that learns how respondent characteristics bend each person's tastes.

Use it when tastes shift non-linearly across people, for example showing how price sensitivity differs between younger and older buyers.

Preference Segments Python

Latent Class, with optional covariates (concomitant-variable model). Discovers the distinct preference groups in your sample, assigns every respondent a class, and explains who is in each segment.

Use it when one average hides several markets, for example separating price-driven from brand-loyal buyers and sizing each group.

Interaction Effects Python

Interaction Search. Tests which attributes work together instead of assuming they act independently.

Use it when combinations matter, for example checking whether a premium brand only pays off at premium price points (brand × price).

Open it, change whatever you like, then run julia --project=julia_env hb_analysis.jl for HB or python run_*.py for the AI, segment and interaction models. Leave the settings untouched and you get the exact numbers Choicery showed you. Done.

Try It Yourself