← All Use Cases
🏠
Box-Behnken Design

Candle Making Optimization

Box-Behnken design to maximize burn time and scent throw by tuning wick size, fragrance load, and pour temperature

Summary

This experiment investigates candle making optimization. Box-Behnken design to maximize burn time and scent throw by tuning wick size, fragrance load, and pour temperature.

The design varies 3 factors: wick size (mm), ranging from 4 to 10, fragrance pct (%), ranging from 4 to 12, and pour temp c (C), ranging from 55 to 80. The goal is to optimize 2 responses: burn hrs (hrs) (maximize) and scent throw (pts) (maximize). Fixed conditions held constant across all runs include wax type = soy, container = 8oz_jar.

A Box-Behnken design was chosen because it efficiently fits quadratic models with 3 continuous factors while avoiding extreme corner combinations — requiring only 15 runs instead of the 8 needed for a full factorial at two levels.

Quadratic response surface models were fitted to capture potential curvature and factor interactions. The RSM contour plots below visualize how pairs of factors jointly affect each response.

Key Findings

For burn hrs, the most influential factors were wick size (45.9%), pour temp c (29.5%), fragrance pct (24.6%). The best observed value was 51.0 (at wick size = 7, fragrance pct = 12, pour temp c = 80).

For scent throw, the most influential factors were fragrance pct (46.1%), wick size (44.1%), pour temp c (9.8%). The best observed value was 7.7 (at wick size = 7, fragrance pct = 12, pour temp c = 55).

Recommended Next Steps

Experimental Setup

Factors

FactorLowHighUnit
wick_size410mm
fragrance_pct412%
pour_temp_c5580C

Fixed: wax_type = soy, container = 8oz_jar

Responses

ResponseDirectionUnit
burn_hrs↑ maximizehrs
scent_throw↑ maximizepts

Configuration

use_cases/140_candle_making/config.json
{ "metadata": { "name": "Candle Making Optimization", "description": "Box-Behnken design to maximize burn time and scent throw by tuning wick size, fragrance load, and pour temperature" }, "factors": [ { "name": "wick_size", "levels": [ "4", "10" ], "type": "continuous", "unit": "mm" }, { "name": "fragrance_pct", "levels": [ "4", "12" ], "type": "continuous", "unit": "%" }, { "name": "pour_temp_c", "levels": [ "55", "80" ], "type": "continuous", "unit": "C" } ], "fixed_factors": { "wax_type": "soy", "container": "8oz_jar" }, "responses": [ { "name": "burn_hrs", "optimize": "maximize", "unit": "hrs" }, { "name": "scent_throw", "optimize": "maximize", "unit": "pts" } ], "settings": { "operation": "box_behnken", "test_script": "use_cases/140_candle_making/sim.sh" } }

Experimental Matrix

The Box-Behnken Design produces 15 runs. Each row is one experiment with specific factor settings.

Runwick_sizefragrance_pctpour_temp_c
17455
27867.5
310880
410855
57867.5
67867.5
74880
810467.5
97480
10101267.5
114855
1271280
134467.5
1441267.5
1571255

Step-by-Step Workflow

1

Preview the design

Terminal
$ doe info --config use_cases/140_candle_making/config.json
2

Generate the runner script

Terminal
$ doe generate --config use_cases/140_candle_making/config.json \ --output use_cases/140_candle_making/results/run.sh --seed 42
3

Execute the experiments

Terminal
$ bash use_cases/140_candle_making/results/run.sh
4

Analyze results

Terminal
$ doe analyze --config use_cases/140_candle_making/config.json
5

Get optimization recommendations

Terminal
$ doe optimize --config use_cases/140_candle_making/config.json
6

Multi-objective optimization

With 2 competing responses, use --multi to find the best compromise via Derringer–Suich desirability.

Terminal
$ doe optimize --config use_cases/140_candle_making/config.json --multi
7

Generate the HTML report

Terminal
$ doe report --config use_cases/140_candle_making/config.json \ --output use_cases/140_candle_making/results/report.html

Features Exercised

FeatureValue
Design typebox_behnken
Factor typescontinuous (all 3)
Arg styledouble-dash
Responses2 (burn_hrs ↑, scent_throw ↑)
Total runs15

Analysis Results

Generated from actual experiment runs using the DOE Helper Tool.

Response: burn_hrs

Top factors: wick_size (45.9%), pour_temp_c (29.5%), fragrance_pct (24.6%).

ANOVA

SourceDFSSMSFp-value
SourceDFSSMSFp-value
wick_size2146.183373.091710.4420.0059
fragrance_pct230.326215.16312.1660.1771
pour_temp_c251.933325.96673.7100.0725
LackofFit6256.490542.7484
PureError214.0000
Error8270.49057.0000
Total14498.933335.6381

Pareto Chart

Pareto chart for burn_hrs

Main Effects Plot

Main effects plot for burn_hrs

Normal Probability Plot of Effects

Normal probability plot for burn_hrs

Half-Normal Plot of Effects

Half-normal plot for burn_hrs

Model Diagnostics

Model diagnostics for burn_hrs

Response: scent_throw

Top factors: fragrance_pct (46.1%), wick_size (44.1%), pour_temp_c (9.8%).

ANOVA

SourceDFSSMSFp-value
SourceDFSSMSFp-value
wick_size24.81982.40990.6680.5394
fragrance_pct27.38273.69131.0230.4023
pour_temp_c20.31380.15690.0430.9577
LackofFit621.10103.5168
PureError27.2200
Error828.32103.6100
Total1440.83732.9170

Pareto Chart

Pareto chart for scent_throw

Main Effects Plot

Main effects plot for scent_throw

Normal Probability Plot of Effects

Normal probability plot for scent_throw

Half-Normal Plot of Effects

Half-normal plot for scent_throw

Model Diagnostics

Model diagnostics for scent_throw

Response Surface Plots

3D surfaces fitted with quadratic RSM. Red dots are observed data points.

burn hrs fragrance pct vs pour temp c

RSM surface: burn hrs fragrance pct vs pour temp c

burn hrs wick size vs fragrance pct

RSM surface: burn hrs wick size vs fragrance pct

burn hrs wick size vs pour temp c

RSM surface: burn hrs wick size vs pour temp c

scent throw fragrance pct vs pour temp c

RSM surface: scent throw fragrance pct vs pour temp c

scent throw wick size vs fragrance pct

RSM surface: scent throw wick size vs fragrance pct

scent throw wick size vs pour temp c

RSM surface: scent throw wick size vs pour temp c

Multi-Objective Optimization

When responses compete, Derringer–Suich desirability finds the best compromise. Each response is scaled to a 0–1 desirability, then combined via a weighted geometric mean.

Overall Desirability
D = 0.8204

Per-Response Desirability

ResponseWeightDesirabilityPredictedDir
burn_hrs 1.0
0.6166
44.31 0.6166 44.31 hrs
scent_throw 1.5
0.9924
7.94 0.9924 7.94 pts

Recommended Settings

FactorValue
wick_size10 mm
fragrance_pct11.2 %
pour_temp_c55 C

Source: from RSM model prediction

Trade-off Summary

Sacrifice = how much worse than single-objective best.

ResponsePredictedBest ObservedSacrifice
scent_throw7.947.70-0.24

Top 3 Runs by Desirability

RunDFactor Settings
#140.6357wick_size=10, fragrance_pct=8, pour_temp_c=55
#70.5846wick_size=7, fragrance_pct=8, pour_temp_c=67.5

Model Quality

ResponseType
scent_throw0.9330quadratic

Full Multi-Objective Output

doe optimize --multi
============================================================ MULTI-OBJECTIVE OPTIMIZATION Method: Derringer-Suich Desirability Function ============================================================ Overall desirability: D = 0.8204 Response Weight Desirability Predicted Direction --------------------------------------------------------------------- burn_hrs 1.0 0.6166 44.31 hrs ↑ scent_throw 1.5 0.9924 7.94 pts ↑ Recommended settings: wick_size = 10 mm fragrance_pct = 11.2 % pour_temp_c = 55 C (from RSM model prediction) Trade-off summary: burn_hrs: 44.31 (best observed: 51.00, sacrifice: +6.69) scent_throw: 7.94 (best observed: 7.70, sacrifice: -0.24) Model quality: burn_hrs: R² = 0.2611 (linear) scent_throw: R² = 0.9330 (quadratic) Top 3 observed runs by overall desirability: 1. Run #12 (D=0.6600): wick_size=4, fragrance_pct=12, pour_temp_c=67.5 2. Run #14 (D=0.6357): wick_size=10, fragrance_pct=8, pour_temp_c=55 3. Run #7 (D=0.5846): wick_size=7, fragrance_pct=8, pour_temp_c=67.5

Full Analysis Output

doe analyze
=== Main Effects: burn_hrs === Factor Effect Std Error % Contribution -------------------------------------------------------------- wick_size 7.0000 1.5414 45.9% pour_temp_c 4.5000 1.5414 29.5% fragrance_pct 3.7500 1.5414 24.6% === ANOVA Table: burn_hrs === Source DF SS MS F p-value ----------------------------------------------------------------------------- wick_size 2 146.1833 73.0917 10.442 0.0059 fragrance_pct 2 30.3262 15.1631 2.166 0.1771 pour_temp_c 2 51.9333 25.9667 3.710 0.0725 Lack of Fit 6 256.4905 42.7484 6.107 0.1474 Pure Error 2 14.0000 7.0000 Error 8 270.4905 7.0000 Total 14 498.9333 35.6381 === Summary Statistics: burn_hrs === wick_size: Level N Mean Std Min Max ------------------------------------------------------------ 10 4 37.0000 3.5590 34.0000 41.0000 4 4 38.7500 6.5000 33.0000 48.0000 7 7 44.0000 5.5976 36.0000 51.0000 fragrance_pct: Level N Mean Std Min Max ------------------------------------------------------------ 12 4 42.2500 5.9652 38.0000 51.0000 4 4 38.5000 8.4261 33.0000 51.0000 8 7 41.1429 4.9809 34.0000 48.0000 pour_temp_c: Level N Mean Std Min Max ------------------------------------------------------------ 55 4 43.5000 7.5939 34.0000 51.0000 67.5 7 39.0000 4.5461 33.0000 45.0000 80 4 41.0000 7.0711 36.0000 51.0000 === Main Effects: scent_throw === Factor Effect Std Error % Contribution -------------------------------------------------------------- fragrance_pct 1.5929 0.4410 46.1% wick_size 1.5250 0.4410 44.1% pour_temp_c 0.3393 0.4410 9.8% === ANOVA Table: scent_throw === Source DF SS MS F p-value ----------------------------------------------------------------------------- wick_size 2 4.8198 2.4099 0.668 0.5394 fragrance_pct 2 7.3827 3.6913 1.023 0.4023 pour_temp_c 2 0.3138 0.1569 0.043 0.9577 Lack of Fit 6 21.1010 3.5168 0.974 0.5864 Pure Error 2 7.2200 3.6100 Error 8 28.3210 3.6100 Total 14 40.8373 2.9170 === Summary Statistics: scent_throw === wick_size: Level N Mean Std Min Max ------------------------------------------------------------ 10 4 4.4500 1.5022 2.7000 5.8000 4 4 5.9750 1.6860 3.8000 7.7000 7 7 5.0000 1.8583 1.9000 7.5000 fragrance_pct: Level N Mean Std Min Max ------------------------------------------------------------ 12 4 3.9500 1.9330 1.9000 5.6000 4 4 5.5250 1.8554 3.7000 7.7000 8 7 5.5429 1.4093 3.7000 7.5000 pour_temp_c: Level N Mean Std Min Max ------------------------------------------------------------ 55 4 4.8750 0.9777 3.8000 5.8000 67.5 7 5.2143 1.9412 2.7000 7.7000 80 4 5.1750 2.2396 1.9000 6.8000

Optimization Recommendations

doe optimize
=== Optimization: burn_hrs === Direction: maximize Best observed run: #7 wick_size = 7 fragrance_pct = 12 pour_temp_c = 80 Value: 51.0 RSM Model (linear, R² = 0.5216, Adj R² = 0.3911): Coefficients: intercept +40.7333 wick_size +0.6250 fragrance_pct +1.3750 pour_temp_c +5.5000 RSM Model (quadratic, R² = 0.7266, Adj R² = 0.2344): Coefficients: intercept +37.6667 wick_size +0.6250 fragrance_pct +1.3750 pour_temp_c +5.5000 wick_size*fragrance_pct +1.0000 wick_size*pour_temp_c -1.2500 fragrance_pct*pour_temp_c +0.7500 wick_size^2 +0.6667 fragrance_pct^2 +0.1667 pour_temp_c^2 +4.9167 Curvature analysis: pour_temp_c coef=+4.9167 convex (has a minimum) wick_size coef=+0.6667 convex (has a minimum) fragrance_pct coef=+0.1667 convex (has a minimum) Notable interactions: wick_size*pour_temp_c coef=-1.2500 (antagonistic) wick_size*fragrance_pct coef=+1.0000 (synergistic) fragrance_pct*pour_temp_c coef=+0.7500 (synergistic) Predicted optimum (from linear model, at observed points): wick_size = 7 fragrance_pct = 12 pour_temp_c = 80 Predicted value: 47.6083 Surface optimum (via L-BFGS-B, linear model): wick_size = 10 fragrance_pct = 12 pour_temp_c = 80 Predicted value: 48.2333 Model quality: Moderate fit — use predictions directionally, not precisely. Factor importance: 1. pour_temp_c (effect: 11.0, contribution: 73.3%) 2. fragrance_pct (effect: 2.8, contribution: 18.3%) 3. wick_size (effect: 1.2, contribution: 8.3%) === Optimization: scent_throw === Direction: maximize Best observed run: #10 wick_size = 7 fragrance_pct = 12 pour_temp_c = 55 Value: 7.7 RSM Model (linear, R² = 0.6137, Adj R² = 0.5084): Coefficients: intercept +5.1133 wick_size +0.5000 fragrance_pct +0.1875 pour_temp_c -1.6875 RSM Model (quadratic, R² = 0.6807, Adj R² = 0.1060): Coefficients: intercept +5.6667 wick_size +0.5000 fragrance_pct +0.1875 pour_temp_c -1.6875 wick_size*fragrance_pct -0.0500 wick_size*pour_temp_c +0.4500 fragrance_pct*pour_temp_c +0.2750 wick_size^2 -0.4458 fragrance_pct^2 -0.5208 pour_temp_c^2 -0.0708 Curvature analysis: fragrance_pct coef=-0.5208 concave (has a maximum) wick_size coef=-0.4458 concave (has a maximum) pour_temp_c coef=-0.0708 negligible curvature Notable interactions: wick_size*pour_temp_c coef=+0.4500 (synergistic) Predicted optimum (from linear model, at observed points): wick_size = 10 fragrance_pct = 8 pour_temp_c = 55 Predicted value: 7.3008 Surface optimum (via L-BFGS-B, linear model): wick_size = 10 fragrance_pct = 12 pour_temp_c = 55 Predicted value: 7.4883 Model quality: Moderate fit — use predictions directionally, not precisely. Factor importance: 1. pour_temp_c (effect: 3.4, contribution: 66.9%) 2. wick_size (effect: 1.0, contribution: 19.8%) 3. fragrance_pct (effect: 0.7, contribution: 13.3%)
← Previous: Laundry Stain Removal Next: Wood Stain & Finish →