← All Use Cases
🍳
Full Factorial Design

Pizza Dough Formulation

Full factorial of flour protein content, yeast amount, olive oil, and fermentation time for chewiness and bubble structure

Summary

This experiment investigates pizza dough formulation. Full factorial of flour protein content, yeast amount, olive oil, and fermentation time for chewiness and bubble structure.

The design varies 4 factors: protein pct (%), ranging from 10 to 14, yeast g (g), ranging from 2 to 7, oil ml (mL), ranging from 10 to 30, and ferment hrs (hrs), ranging from 4 to 72. The goal is to optimize 2 responses: chewiness (pts) (maximize) and bubble score (pts) (maximize). Fixed conditions held constant across all runs include salt pct = 2.5, water temp = 20.

A full factorial design was used to explore all 16 possible combinations of the 4 factors at two levels. This guarantees that every main effect and interaction can be estimated independently, at the cost of a larger experiment (16 runs).

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 chewiness, the most influential factors were oil ml (34.8%), ferment hrs (32.4%), yeast g (24.2%). The best observed value was 9.8 (at protein pct = 10, yeast g = 2, oil ml = 30).

For bubble score, the most influential factors were yeast g (70.1%), ferment hrs (26.6%), oil ml (2.0%). The best observed value was 9.8 (at protein pct = 14, yeast g = 2, oil ml = 30).

Recommended Next Steps

Experimental Setup

Factors

FactorLowHighUnit
protein_pct1014%
yeast_g27g
oil_ml1030mL
ferment_hrs472hrs

Fixed: salt_pct = 2.5, water_temp = 20

Responses

ResponseDirectionUnit
chewiness↑ maximizepts
bubble_score↑ maximizepts

Configuration

use_cases/89_pizza_dough/config.json
{ "metadata": { "name": "Pizza Dough Formulation", "description": "Full factorial of flour protein content, yeast amount, olive oil, and fermentation time for chewiness and bubble structure" }, "factors": [ { "name": "protein_pct", "levels": [ "10", "14" ], "type": "continuous", "unit": "%" }, { "name": "yeast_g", "levels": [ "2", "7" ], "type": "continuous", "unit": "g" }, { "name": "oil_ml", "levels": [ "10", "30" ], "type": "continuous", "unit": "mL" }, { "name": "ferment_hrs", "levels": [ "4", "72" ], "type": "continuous", "unit": "hrs" } ], "fixed_factors": { "salt_pct": "2.5", "water_temp": "20" }, "responses": [ { "name": "chewiness", "optimize": "maximize", "unit": "pts" }, { "name": "bubble_score", "optimize": "maximize", "unit": "pts" } ], "settings": { "operation": "full_factorial", "test_script": "use_cases/89_pizza_dough/sim.sh" } }

Experimental Matrix

The Full Factorial Design produces 16 runs. Each row is one experiment with specific factor settings.

Runprotein_pctyeast_goil_mlferment_hrs
11073072
21421072
31071072
4107304
5147304
6142304
7147104
8142104
91021072
10102304
111471072
121473072
13107104
141423072
15102104
161023072

Step-by-Step Workflow

1

Preview the design

Terminal
$ doe info --config use_cases/89_pizza_dough/config.json
2

Generate the runner script

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

Execute the experiments

Terminal
$ bash use_cases/89_pizza_dough/results/run.sh
4

Analyze results

Terminal
$ doe analyze --config use_cases/89_pizza_dough/config.json
5

Get optimization recommendations

Terminal
$ doe optimize --config use_cases/89_pizza_dough/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/89_pizza_dough/config.json --multi
7

Generate the HTML report

Terminal
$ doe report --config use_cases/89_pizza_dough/config.json \ --output use_cases/89_pizza_dough/results/report.html

Features Exercised

FeatureValue
Design typefull_factorial
Factor typescontinuous (all 4)
Arg styledouble-dash
Responses2 (chewiness ↑, bubble_score ↑)
Total runs16

Analysis Results

Generated from actual experiment runs using the DOE Helper Tool.

Response: chewiness

Top factors: oil_ml (34.8%), ferment_hrs (32.4%), yeast_g (24.2%).

ANOVA

SourceDFSSMSFp-value
SourceDFSSMSFp-value
protein_pct10.27560.27560.0530.8263
yeast_g12.17562.17560.4220.5447
oil_ml14.51564.51560.8760.3924
ferment_hrs13.90063.90060.7560.4243
protein_pct*yeast_g14.30564.30560.8350.4028
protein_pct*oil_ml14.10064.10060.7950.4134
protein_pct*ferment_hrs13.70563.70560.7180.4353
yeast_g*oil_ml15.40565.40561.0480.3529
yeast_g*ferment_hrs10.76560.76560.1480.7159
oil_ml*ferment_hrs12.17562.17560.4220.5447
Error525.78815.1576
Total1557.11443.8076

Pareto Chart

Pareto chart for chewiness

Main Effects Plot

Main effects plot for chewiness

Normal Probability Plot of Effects

Normal probability plot for chewiness

Half-Normal Plot of Effects

Half-normal plot for chewiness

Model Diagnostics

Model diagnostics for chewiness

Response: bubble_score

Top factors: yeast_g (70.1%), ferment_hrs (26.6%), oil_ml (2.0%).

ANOVA

SourceDFSSMSFp-value
SourceDFSSMSFp-value
protein_pct10.00560.00560.0030.9588
yeast_g118.275618.27569.5750.0270
oil_ml10.01560.01560.0080.9314
ferment_hrs12.64062.64061.3840.2924
protein_pct*yeast_g12.97562.97561.5590.2671
protein_pct*oil_ml12.97562.97561.5590.2671
protein_pct*ferment_hrs15.64065.64062.9550.1462
yeast_g*oil_ml110.080610.08065.2820.0699
yeast_g*ferment_hrs115.405615.40568.0720.0362
oil_ml*ferment_hrs18.55568.55564.4830.0878
Error59.54311.9086
Total1576.11445.0743

Pareto Chart

Pareto chart for bubble_score

Main Effects Plot

Main effects plot for bubble_score

Normal Probability Plot of Effects

Normal probability plot for bubble_score

Half-Normal Plot of Effects

Half-normal plot for bubble_score

Model Diagnostics

Model diagnostics for bubble_score

Response Surface Plots

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

bubble score oil ml vs ferment hrs

RSM surface: bubble score oil ml vs ferment hrs

bubble score protein pct vs ferment hrs

RSM surface: bubble score protein pct vs ferment hrs

bubble score protein pct vs oil ml

RSM surface: bubble score protein pct vs oil ml

bubble score protein pct vs yeast g

RSM surface: bubble score protein pct vs yeast g

bubble score yeast g vs ferment hrs

RSM surface: bubble score yeast g vs ferment hrs

bubble score yeast g vs oil ml

RSM surface: bubble score yeast g vs oil ml

chewiness oil ml vs ferment hrs

RSM surface: chewiness oil ml vs ferment hrs

chewiness protein pct vs ferment hrs

RSM surface: chewiness protein pct vs ferment hrs

chewiness protein pct vs oil ml

RSM surface: chewiness protein pct vs oil ml

chewiness protein pct vs yeast g

RSM surface: chewiness protein pct vs yeast g

chewiness yeast g vs ferment hrs

RSM surface: chewiness yeast g vs ferment hrs

chewiness yeast g vs oil ml

RSM surface: chewiness yeast g vs oil ml

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.8687

Per-Response Desirability

ResponseWeightDesirabilityPredictedDir
chewiness 1.5
0.8247
8.90 0.8247 8.90 pts
bubble_score 1.5
0.9150
9.50 0.9150 9.50 pts

Recommended Settings

FactorValue
protein_pct10 %
yeast_g2 g
oil_ml10 mL
ferment_hrs72 hrs

Source: from observed run #12

Trade-off Summary

Sacrifice = how much worse than single-objective best.

ResponsePredictedBest ObservedSacrifice
bubble_score9.509.80+0.30

Top 3 Runs by Desirability

RunDFactor Settings
#110.8144protein_pct=14, yeast_g=7, oil_ml=30, ferment_hrs=72
#140.5768protein_pct=14, yeast_g=7, oil_ml=10, ferment_hrs=72

Model Quality

ResponseType
bubble_score0.1952linear

Full Multi-Objective Output

doe optimize --multi
============================================================ MULTI-OBJECTIVE OPTIMIZATION Method: Derringer-Suich Desirability Function ============================================================ Overall desirability: D = 0.8687 Response Weight Desirability Predicted Direction --------------------------------------------------------------------- chewiness 1.5 0.8247 8.90 pts ↑ bubble_score 1.5 0.9150 9.50 pts ↑ Recommended settings: protein_pct = 10 % yeast_g = 2 g oil_ml = 10 mL ferment_hrs = 72 hrs (from observed run #12) Trade-off summary: chewiness: 8.90 (best observed: 9.80, sacrifice: +0.90) bubble_score: 9.50 (best observed: 9.80, sacrifice: +0.30) Model quality: chewiness: R² = 0.2487 (linear) bubble_score: R² = 0.1952 (linear) Top 3 observed runs by overall desirability: 1. Run #12 (D=0.8687): protein_pct=10, yeast_g=2, oil_ml=10, ferment_hrs=72 2. Run #11 (D=0.8144): protein_pct=14, yeast_g=7, oil_ml=30, ferment_hrs=72 3. Run #14 (D=0.5768): protein_pct=14, yeast_g=7, oil_ml=10, ferment_hrs=72

Full Analysis Output

doe analyze
=== Main Effects: chewiness === Factor Effect Std Error % Contribution -------------------------------------------------------------- oil_ml 1.0625 0.4878 34.8% ferment_hrs -0.9875 0.4878 32.4% yeast_g -0.7375 0.4878 24.2% protein_pct -0.2625 0.4878 8.6% === ANOVA Table: chewiness === Source DF SS MS F p-value ----------------------------------------------------------------------------- protein_pct 1 0.2756 0.2756 0.053 0.8263 yeast_g 1 2.1756 2.1756 0.422 0.5447 oil_ml 1 4.5156 4.5156 0.876 0.3924 ferment_hrs 1 3.9006 3.9006 0.756 0.4243 protein_pct*yeast_g 1 4.3056 4.3056 0.835 0.4028 protein_pct*oil_ml 1 4.1006 4.1006 0.795 0.4134 protein_pct*ferment_hrs 1 3.7056 3.7056 0.718 0.4353 yeast_g*oil_ml 1 5.4056 5.4056 1.048 0.3529 yeast_g*ferment_hrs 1 0.7656 0.7656 0.148 0.7159 oil_ml*ferment_hrs 1 2.1756 2.1756 0.422 0.5447 Error 5 25.7881 5.1576 Total 15 57.1144 3.8076 === Interaction Effects: chewiness === Factor A Factor B Interaction % Contribution ------------------------------------------------------------------------ yeast_g oil_ml -1.1625 21.7% protein_pct yeast_g -1.0375 19.4% protein_pct oil_ml 1.0125 18.9% protein_pct ferment_hrs 0.9625 18.0% oil_ml ferment_hrs 0.7375 13.8% yeast_g ferment_hrs 0.4375 8.2% === Summary Statistics: chewiness === protein_pct: Level N Mean Std Min Max ------------------------------------------------------------ 10 8 6.1000 1.8754 3.6000 8.9000 14 8 5.8375 2.1454 3.5000 9.8000 yeast_g: Level N Mean Std Min Max ------------------------------------------------------------ 2 8 6.3375 2.0764 4.0000 9.8000 7 8 5.6000 1.8807 3.5000 8.9000 oil_ml: Level N Mean Std Min Max ------------------------------------------------------------ 10 8 5.4375 1.6707 3.6000 8.9000 30 8 6.5000 2.1732 3.5000 9.8000 ferment_hrs: Level N Mean Std Min Max ------------------------------------------------------------ 4 8 6.4625 2.2462 3.5000 9.8000 72 8 5.4750 1.5989 3.6000 8.0000 === Main Effects: bubble_score === Factor Effect Std Error % Contribution -------------------------------------------------------------- yeast_g -2.1375 0.5632 70.1% ferment_hrs 0.8125 0.5632 26.6% oil_ml -0.0625 0.5632 2.0% protein_pct -0.0375 0.5632 1.2% === ANOVA Table: bubble_score === Source DF SS MS F p-value ----------------------------------------------------------------------------- protein_pct 1 0.0056 0.0056 0.003 0.9588 yeast_g 1 18.2756 18.2756 9.575 0.0270 oil_ml 1 0.0156 0.0156 0.008 0.9314 ferment_hrs 1 2.6406 2.6406 1.384 0.2924 protein_pct*yeast_g 1 2.9756 2.9756 1.559 0.2671 protein_pct*oil_ml 1 2.9756 2.9756 1.559 0.2671 protein_pct*ferment_hrs 1 5.6406 5.6406 2.955 0.1462 yeast_g*oil_ml 1 10.0806 10.0806 5.282 0.0699 yeast_g*ferment_hrs 1 15.4056 15.4056 8.072 0.0362 oil_ml*ferment_hrs 1 8.5556 8.5556 4.483 0.0878 Error 5 9.5431 1.9086 Total 15 76.1144 5.0743 === Interaction Effects: bubble_score === Factor A Factor B Interaction % Contribution ------------------------------------------------------------------------ yeast_g ferment_hrs -1.9625 24.8% yeast_g oil_ml -1.5875 20.0% oil_ml ferment_hrs 1.4625 18.5% protein_pct ferment_hrs 1.1875 15.0% protein_pct yeast_g -0.8625 10.9% protein_pct oil_ml 0.8625 10.9% === Summary Statistics: bubble_score === protein_pct: Level N Mean Std Min Max ------------------------------------------------------------ 10 8 5.4875 2.4416 2.9000 9.5000 14 8 5.4500 2.2162 3.4000 9.8000 yeast_g: Level N Mean Std Min Max ------------------------------------------------------------ 2 8 6.5375 1.8875 4.6000 9.8000 7 8 4.4000 2.1679 2.9000 9.5000 oil_ml: Level N Mean Std Min Max ------------------------------------------------------------ 10 8 5.5000 2.0791 3.4000 9.5000 30 8 5.4375 2.5590 2.9000 9.8000 ferment_hrs: Level N Mean Std Min Max ------------------------------------------------------------ 4 8 5.0625 2.0135 3.0000 9.5000 72 8 5.8750 2.5381 2.9000 9.8000

Optimization Recommendations

doe optimize
=== Optimization: chewiness === Direction: maximize Best observed run: #14 protein_pct = 10 yeast_g = 2 oil_ml = 30 ferment_hrs = 4 Value: 9.8 RSM Model (linear, R² = 0.5357, Adj R² = 0.3669): Coefficients: intercept +5.9688 protein_pct +0.7438 yeast_g -0.6187 oil_ml +0.3937 ferment_hrs -0.9062 RSM Model (quadratic, R² = 0.6694, Adj R² = -3.9593): Coefficients: intercept +1.1938 protein_pct +0.7438 yeast_g -0.6188 oil_ml +0.3937 ferment_hrs -0.9062 protein_pct*yeast_g -0.0437 protein_pct*oil_ml -0.0063 protein_pct*ferment_hrs +0.0188 yeast_g*oil_ml -0.1687 yeast_g*ferment_hrs -0.2187 oil_ml*ferment_hrs -0.6312 protein_pct^2 +1.1938 yeast_g^2 +1.1938 oil_ml^2 +1.1938 ferment_hrs^2 +1.1938 Curvature analysis: yeast_g coef=+1.1938 convex (has a minimum) ferment_hrs coef=+1.1938 convex (has a minimum) protein_pct coef=+1.1938 convex (has a minimum) oil_ml coef=+1.1938 convex (has a minimum) Notable interactions: oil_ml*ferment_hrs coef=-0.6312 (antagonistic) Predicted optimum (from linear model, at observed points): protein_pct = 14 yeast_g = 2 oil_ml = 30 ferment_hrs = 4 Predicted value: 8.6313 Surface optimum (via L-BFGS-B, linear model): protein_pct = 14 yeast_g = 2 oil_ml = 30 ferment_hrs = 4 Predicted value: 8.6313 Model quality: Moderate fit — use predictions directionally, not precisely. Factor importance: 1. ferment_hrs (effect: -1.8, contribution: 34.0%) 2. protein_pct (effect: 1.5, contribution: 27.9%) 3. yeast_g (effect: -1.2, contribution: 23.2%) 4. oil_ml (effect: 0.8, contribution: 14.8%) === Optimization: bubble_score === Direction: maximize Best observed run: #11 protein_pct = 14 yeast_g = 2 oil_ml = 30 ferment_hrs = 72 Value: 9.8 RSM Model (linear, R² = 0.1596, Adj R² = -0.1460): Coefficients: intercept +5.4688 protein_pct +0.8063 yeast_g -0.0437 oil_ml +0.2437 ferment_hrs -0.2187 RSM Model (quadratic, R² = 0.4196, Adj R² = -7.7053): Coefficients: intercept +1.0938 protein_pct +0.8063 yeast_g -0.0437 oil_ml +0.2438 ferment_hrs -0.2187 protein_pct*yeast_g +0.5938 protein_pct*oil_ml +0.3312 protein_pct*ferment_hrs +0.7438 yeast_g*oil_ml +0.4312 yeast_g*ferment_hrs -0.1563 oil_ml*ferment_hrs +0.1062 protein_pct^2 +1.0938 yeast_g^2 +1.0938 oil_ml^2 +1.0938 ferment_hrs^2 +1.0938 Curvature analysis: protein_pct coef=+1.0938 convex (has a minimum) yeast_g coef=+1.0938 convex (has a minimum) oil_ml coef=+1.0938 convex (has a minimum) ferment_hrs coef=+1.0938 convex (has a minimum) Notable interactions: protein_pct*ferment_hrs coef=+0.7438 (synergistic) protein_pct*yeast_g coef=+0.5938 (synergistic) yeast_g*oil_ml coef=+0.4312 (synergistic) protein_pct*oil_ml coef=+0.3312 (synergistic) Predicted optimum (from linear model, at observed points): protein_pct = 14 yeast_g = 2 oil_ml = 30 ferment_hrs = 4 Predicted value: 6.7813 Surface optimum (via L-BFGS-B, linear model): protein_pct = 14 yeast_g = 2 oil_ml = 30 ferment_hrs = 4 Predicted value: 6.7813 Model quality: Weak fit — consider adding center points or using a different design. Factor importance: 1. protein_pct (effect: 1.6, contribution: 61.4%) 2. oil_ml (effect: 0.5, contribution: 18.6%) 3. ferment_hrs (effect: -0.4, contribution: 16.7%) 4. yeast_g (effect: -0.1, contribution: 3.3%)
← Previous: Coffee Brewing Extraction All Use Cases →