msa op• Data kinds: table → table
• Call: import fullseye as fs; fs.ledger.msa_gauge_rr(table, part='part', operator='operator', value='value', tolerance=None, pool_interaction='auto', pool_alpha=0.25) (implementation को सीधे call करना हो तो import spc; spc.msa_gauge_rr(table, part='part', operator='operator', value='value', tolerance=None, pool_interaction='auto', pool_alpha=0.25), registry से लेना हो तो opsspc.get("msa_gauge_rr"))
analysis of variance method द्वारा gauge R&R (table)।
repeatability EV (एक ही व्यक्ति एक ही चीज़ को दोबारा मापे तब का scatter), reproducibility AV (व्यक्ति बदलने पर scatter; interaction सहित), दोनों का combination GRR, part-to-part PV, total variation TV, %GRR = 100 GRR/TV, और अलग पहचानी जा सकने वाली श्रेणियों की संख्या ndc = 1.41 PV/GRR।
*tolerance* देने पर tolerance के सापेक्ष अनुपात %tolerance = 100 GRR/tolerance भी लौटाता है।
★ variance component balanced crossed design के expected mean square से निकाले जाते हैं:
var_repeat = MS_err
var_inter = (MS_inter - MS_err) / r
var_oper = (MS_oper - MS_inter) / (p r)
var_part = (MS_part - MS_inter) / (o r)
★★ negative variance component को 0 पर round किया जाता है, पर round करने की बात छिपाई नहीं जाती (clamped column)। expected mean square का अंतर एक estimator है, इसलिए सच्चा component 0 के पास हो तो यह negative हो सकता है। चुपचाप 0 कर देने से "operator में कोई अंतर नहीं" पढ़ा जाता है, जबकि सही अर्थ है "estimate नहीं हो सका"। और यह कोई दुर्लभ किनारा नहीं है -- 60 part x 4 operator x 5 repeat वाले synthetic data को, जिसमें operator अंतर बिल्कुल 0 रखा गया, 40 seed पर चलाने पर 31 seed में reproducibility component negative आता है (measured 2026-09-23)। जो implementation rounding की घोषणा नहीं करता, वह इन सभी 31 में "कोई अंतर नहीं" कह देता है।
★ estimator का उतार-चढ़ाव भी छिपाया नहीं जाता। उसी 60x4x5 में ground truth 0.4 वाली repeatability 40 seed पर mean 0.39710, standard deviation 0.00788 देती है -- यह सैद्धांतिक sigma/sqrt(2 df) (df = 960 पर 0.00913) के समान order का है, इसलिए 1 seed पर 1 % precision से भरोसा नहीं करना चाहिए। reproducibility और भी ख़राब है: यह 4 operator (3 degrees of freedom) से estimate होती है, इसलिए ground truth 0.5 के मुक़ाबले standard deviation 0.159 है -- ऐसी मात्रा जिसमें order सही आ जाए तो भी काफ़ी है।
★★ interaction रखने या उसे error में pool करने से जवाब बदल जाता है। standard की प्रक्रिया है "interaction का F test significant न हो तो interaction term हटाकर दोबारा गणना करो", और *pool_interaction* वही चुनाव है:
• "auto" (default) -- interaction का p value *pool_alpha* (default 0.25) से अधिक हो तो pool करता है।
★★ 0.25 standard में लिखा हुआ अंक नहीं है। reference manual का text केवल यह गुणात्मक निर्देश देता है कि "interaction छूटने का जोखिम कम करने के लिए ऊँचा significance level चुनो", कोई संख्या नहीं लिखी। 0.25 software की ओर की परंपरा का बहुमत है, और दूसरा implementation 0.05 को default रखता है। α को बड़ा करने से p > alpha कम बार सही होता है = interaction आसानी से बना रहता है, इसलिए 0.25 text की नीति के प्रति वफ़ादार (conservative) पक्ष है। दूसरी ओर standard के worked example की table के footnote में "α = 0.05 पर निर्णय" लिखा है, इसलिए जो check उस table को reproduce करने का दावा करे, उसे pool_alpha=0.05 स्पष्ट रूप से देना चाहिए (default की बात और published example को reproduce करने की शर्त की बात अलग हैं)। इस example में F = 0.434 दोनों α पर non-significant है, इसलिए result नहीं बदलता, लेकिन boundary के पास के data में default का अंतर EV / AV को कुछ % हिला देता है -- measured रूप से model बदलने से EV 7.3 % हिला।
• False -- हमेशा interaction रखता है।
• True -- हमेशा pool करता है।
लौटाए गए interaction_pooled / interaction_p / pool_alpha में कौन-सा इस्तेमाल हुआ, यह हमेशा दर्ज होता है। चुपचाप बदलने पर एक ही tool एक ही process के लिए अलग-अलग अंक लौटाएगा, और उसका कारण output में कहीं नहीं बचेगा।
★ measured (standard का example, 10 part x 3 operator x 3 बार के 90 point): interaction रखने पर EV = 0.214435, pool करने पर EV = 0.199933 -- 7.3 % का अंतर। चुनाव p value के threshold से तय होता है, इसलिए data ज़रा-सा हिले तो model उछल जाता है। इस example में F = 0.4337 / p = 0.9741 है, यानी interaction का कोई असर नहीं, इसलिए standard pool किए गए पक्ष को published value बनाता है (यह implementation उस मान को 3e-7 तक reproduce करता है)।
★ gate के रूप में इस्तेमाल होने वाले सटीक संबंध: TV^2 == GRR^2 + PV^2 और GRR^2 == EV^2 + AV^2 (परिभाषा ही), contribution का योग 100 %, और operator 1 होने पर EV हर cell के sample variance के औसत से बिल्कुल मेल खाता है (numpy ground truth बनता है)।
• Sample data catalog (DL URL / license) — 2-D के लिए skimage.data (BSD/public) + synthetic, 3-D के लिए real data sources (Stanford/PDS आदि) के DL URL।
• Operators का स्रोत और संदर्भ — इस op family के मूल research/methods के स्रोत।
• Algorithm का मानक स्रोत (लेखक, वर्ष) और उपयोग ऊपर की family usage guide में दिए गए हैं।
• poc_measurement_system_analysis — py -3.11 examples/poc_measurement_system_analysis.py
table को input के रूप में लेते हैं)msa_anova_table · msa_bias_linearity · msa_attribute_agreement · gum_standard_uncertainty · gum_propagate · gum_expanded · gum_monte_carlo · gum_validate
msa)msa_anova_table · msa_bias_linearity · msa_attribute_agreement
*Provenance: spc.py — SPC operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.