UNPKG

taguchi

Version:

A TypeScript package for implementing Taguchi Method design of experiments

276 lines (217 loc) 7.95 kB
# 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. ```typescript 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: ```typescript { 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 factor - `df` (Degrees of Freedom): Number of independent comparisons available - `ms` (Mean Square): Average variation per degree of freedom - `f` (F-ratio): Statistical significance of the factor - `contribution`: Percentage contribution to total variation - `confidenceInterval`: 95% confidence interval for the factor effect - `isPooled`: Whether the factor was pooled into the error term #### Interpreting ANOVA Results 1. **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: ```typescript if (analysis.variance.A.f > 4) { console.log('Factor A has a strong effect') } ``` 2. **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: ```typescript const [lower, upper] = analysis.variance.A.confidenceInterval if (lower > 0) { console.log('Factor A has a positive effect (95% confidence)') } ``` 3. **Pooling** - Factors with low F-ratios are automatically pooled - Pooled factors are considered insignificant - Check pooling status: ```typescript if (analysis.variance.B.isPooled) { console.log('Factor B is insignificant') } ``` 4. **Contributions** - Shows relative importance of each factor - Higher percentages indicate more influential factors - Use for prioritizing control factors: ```typescript 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 factors - `L8`: 2 levels, up to 7 factors - `L9`: 3 levels, up to 4 factors - `L16`: 2 levels, up to 15 factors - `L18`: 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 ```typescript new Taguchi({ type: 'L4' | 'L8' | 'L9' | 'L16' | 'L18', factors: Record<string, any[]>, }) ``` #### Methods - `generateExperiments(): Array<Record<string, any>>` - `analyzeResults(results: ExperimentResult[]): AnalysisResult` #### Types ```typescript 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