taguchi
v1.0.6
Published
A TypeScript package for implementing Taguchi Method design of experiments
Maintainers
Readme
Taguchi Method
A TypeScript package for implementing Taguchi Method design of experiments
Motivation/Background
The Taguchi Method is a statistical approach to experimental design that helps optimize processes and products while minimizing the number of required experiments. Unlike traditional full factorial experiments that test every possible combination of factors, the Taguchi Method uses specially designed orthogonal arrays to test pairs of combinations, significantly reducing the number of required experiments while still capturing the main effects of each factor.
Key benefits of using the Taguchi Method include:
- Efficient Testing: Reduce the number of experiments needed while maintaining statistical validity
- Design for Robustness: Identify parameters that make your process or product less sensitive to variations
- Cheap Results: Save time and resources by running fewer experiments
- Improve Quality: Optimize multiple factors at the same time
- Clear Results: Determine exactly factors most strongly influence your desired outcome
For example, if you're optimizing a process time, temp, and pressure variables (3 factors), and you're trying 3 levels of each, a full factorial design would require 27 experiments. Using the Taguchi L9 array, you can get meaningful results with just 9 experiments.
Read more:
https://www.sciencedirect.com/topics/materials-science/taguchi-method
Or watch this great breakdown by NighHawkinLight
https://www.youtube.com/watch?v=5oULEuOoRd0
Installation
bun install taguchi
or
npm install taguchi
Usage
Let's say we're optimizing a process that has temperature, time, and pressure variables. We decide on 3 levels we want to test, and setup the experiment.
import { Taguchi } from 'taguchi'
// Create a new Taguchi experiment with factors and levels
const experiment = new Taguchi({
type: 'L9',
factors: {
Temperature: [150, 175, 200],
Time: [30, 45, 60],
Pressure: [10, 15, 20],
},
})
// Generate experiments - a list of values you should run to feed the analysis
const experiments = experiment.generateExperiments()
console.log(experiments)
// After running experiments, analyze results
const results = await Promise.all(
experiments.map(async (exp, i) => ({
factors: exp,
result: await getExperimentValue(exp), // Run the specified experiment and get a value (eg. 95)
}))
)
const analysis = experiment.analyzeResults(results)Example analysis output:
{
optimalLevels: {
Temperature: 2, // Index of the optimal level (0-based)
Time: 1,
Pressure: 2
},
snRatios: {
Temperature: [35.2, 38.1, 36.7], // S/N ratio for each level
Time: [37.1, 36.8, 35.9],
Pressure: [36.2, 37.4, 38.5]
},
mainEffects: {
Temperature: [92.3, 97.8, 94.5], // Average result at each level
Time: [96.2, 95.1, 93.4],
Pressure: [93.8, 95.9, 98.2]
},
contributions: {
Temperature: 28.5, // Percentage contribution to variation
Time: 31.2,
Pressure: 40.3
},
variance: {
Temperature: {
ss: 156.2, // Sum of squares
df: 2, // Degrees of freedom
ms: 78.1, // Mean square
f: 12.3, // F-ratio
contribution: 28.5, // Contribution percentage
confidenceInterval: [25.2, 31.8],
isPooled: false
},
Time: {
ss: 123.4,
df: 2,
ms: 61.7,
f: 10.2,
contribution: 31.2,
confidenceInterval: [28.9, 33.5],
isPooled: false
},
Pressure: {
ss: 187.6,
df: 2,
ms: 93.8,
f: 15.4,
contribution: 40.3,
confidenceInterval: [37.1, 43.5],
isPooled: false
}
}
}Statistical Analysis Features
The package provides comprehensive statistical analysis of experimental results:
1. Optimal Levels (optimalLevels)
- The best level for each factor according to the experiments
2. Signal-to-Noise Ratios (snRatios)
- Measures the robustness of each factor level
- Higher values indicate better stability and less sensitivity to noise
3. Main Effects (mainEffects)
- Shows the average result at each level of each factor
- Helps visualize how each factor affects the result
- Useful for:
- Understanding factor impact
- Identifying trends (linear, nonlinear)
- Confirming optimal settings
4. Factor Contributions (contributions)
- Percentage of total variation attributed to each factor
- Higher percentages indicate more influential factors
- Use to:
- Prioritize which factors to control tightly
- Identify which factors can have looser tolerances
- Focus improvement efforts on high-impact factors
5. Analysis of Variance (variance)
Detailed ANOVA results for each factor:
ss(Sum of Squares): Total variation attributed to the factordf(Degrees of Freedom): Number of independent comparisons availablems(Mean Square): Average variation per degree of freedomf(F-ratio): Statistical significance of the factorcontribution: Percentage contribution to total variationconfidenceInterval: 95% confidence interval for the factor effectisPooled: Whether the factor was pooled into the error term
Interpreting ANOVA Results
F-ratio (f)
- The F-ratio is a key indicator of factor significance
- Higher F-ratios indicate stronger factor effects
- Rule of thumb:
- F > 2: Factor likely has a real effect
- F > 4: Strong evidence of factor effect
- F > 10: Very strong evidence of factor effect
- Example: If factor A has F=12.5 and factor B has F=1.2:
if (analysis.variance.A.f > 4) { console.log('Factor A has a strong effect') }
Confidence Intervals
- Shows the range where the true factor effect likely lies
- If interval doesn't include 0, effect is statistically significant
- Wider intervals indicate more uncertainty
- Example:
const [lower, upper] = analysis.variance.A.confidenceInterval if (lower > 0) { console.log('Factor A has a positive effect (95% confidence)') }
Pooling
- Factors with low F-ratios are automatically pooled
- Pooled factors are considered insignificant
- Check pooling status:
if (analysis.variance.B.isPooled) { console.log('Factor B is insignificant') }
Contributions
- Shows relative importance of each factor
- Higher percentages indicate more influential factors
- Use for prioritizing control factors:
const significantFactors = Object.entries(analysis.contributions) .filter(([_, contribution]) => contribution > 10) .map(([factor]) => factor)
Orthogonal Array Types
The package includes several standard orthogonal arrays:
L4: 2 levels, up to 3 factorsL8: 2 levels, up to 7 factorsL9: 3 levels, up to 4 factorsL16: 2 levels, up to 15 factorsL18: 3 levels, up to 8 factors (mixed level design)
The appropriate array type should be selected based on your factors and their levels.
API Reference
Class: Taguchi
new Taguchi({
type: 'L4' | 'L8' | 'L9' | 'L16' | 'L18',
factors: Record<string, any[]>,
})Methods
generateExperiments(): Array<Record<string, any>>analyzeResults(results: ExperimentResult[]): AnalysisResult
Types
type ExperimentResult = {
factors: Record<string, any>
result: number
}
type AnalysisResult = {
optimalLevels: Record<string, number>
snRatios: Record<string, number[]>
mainEffects: Record<string, number[]>
contributions: Record<string, number>
variance: Record<
string,
{
ss: number
df: number
ms: number
f: number
contribution: number
confidenceInterval: [number, number]
isPooled: boolean
}
>
}License
MIT
