संक्रमण के दौरान राउंडिंग त्रुटियाँ

बवेरिया में, \(2{,}33\) का औसत ग्रेड जिम्नेजियम \(2{,}34\) नहीं। इस स्पष्ट सीमा पर, दो राउंडिंग प्रक्रियाओं का क्रम यह निर्धारित कर सकता है कि बच्चा किस श्रेणी में आता है। गुंथर फेलबिंगर ने एक ब्लॉग पोस्ट में इस राउंडिंग प्रभाव के संभावित परिणामों पर चर्चा की है । केवल जिज्ञासावश, मैंने मॉडल में अनुमत सभी ग्रेड संयोजनों पर इसके प्रभावों की गणना स्वयं की।


मेरा मुख्य प्रश्न यह है: क्या पूर्ण विषय ग्रेडों में प्रारंभिक राउंडिंग से बिना राउंड किए गए विषय औसत का उपयोग करके की जाने वाली गणनाओं की तुलना में स्कूल की गणनाओं का प्रकार भिन्न होता है? इसके अलावा, यह देखना दिलचस्प होगा कि यदि व्यक्तिगत विषयों के औसत (जैसा कि वहां सुझाया गया है) को शुरू में केवल एक दशमलव स्थान तक राउंड किया जाता है तो क्या परिवर्तन होते हैं।

बवेरियन प्राथमिक विद्यालय विनियमों की धारा 6 के अनुसार, औसत ग्रेड की गणना जर्मन, गणित और स्थानीय एवं सामान्य अध्ययन के ग्रेडों से की जाती है। कार्यान्वयन विनियमों में \(2{,}33\) और \(2{,}66\) सीमा निर्धारित की गई है। निम्नलिखित गणना मॉडल में, प्रत्येक समग्र औसत को दो दशमलव स्थानों तक सीमित किया जाता है और पुनः पूर्णांकित नहीं किया जाता है। इस प्रकार, उदाहरण के लिए...

\[
\frac{2{,}33+2{,}34+2{,}34}{3}=2{,}3366\ldots \longrightarrow 2{,}33.
\]

यह वर्गीकरण के लिए महत्वपूर्ण है: \(2{,}3366\ldots\) \(2{,}34\) नहीं बनता है, बल्कि \(2{,}33\) बनता है और इसलिए यह अभी भी व्याकरण विद्यालय के लिए पर्याप्त है।

प्रारंभिक प्रविष्टि में विषय-विशिष्ट औसत मानों \(1{,}6\) , \(2{,}6\) और \(2{,}6\) के साथ प्रारंभिक राउंडिंग को दर्शाया गया है। इनसे, संपूर्ण ग्रेड \(2\) , \(3\) और \(3\) प्राप्त किए जाते हैं। उनका औसत है

\[
\frac{2+3+3}{3}=2{,}6666\ldots \longrightarrow 2{,}66,
\]

इसका मतलब है कि छात्र सीधे ग्रामर स्कूल में प्रवेश के लिए योग्य नहीं है। हालांकि, अंकों को पूर्ण संख्या में परिवर्तित किए बिना, काल्पनिक उदाहरण में परिणाम यह होगा...

\[
\frac{1{,}6+2{,}6+2{,}6}{3}=2{,}2666\ldots \longrightarrow 2{,}26.
\]

दूसरे उदाहरण में, राउंडिंग विपरीत दिशा में काम करती है: \(2{,}4\) , \(3{,}4\) और \(2{,}4\) पूर्ण स्वर मान \(2\) , \(3\) और \(2\) बन जाते हैं, आधिकारिक तौर पर \(2{,}33\) । हालांकि, बिना राउंड किए गए मान \(2{,}73\) होते हैं। उदाहरण स्पष्ट रूप से इस प्रभाव को दर्शाते हैं। हालांकि, वे अभी तक यह नहीं बताते कि यह कितनी बार होता है या राउंडिंग की किसी अन्य विधि के क्या परिणाम होंगे।

इसलिए, अपनी गणना के लिए मैं एक स्पष्ट परिणाम स्थान का उपयोग करता हूँ। प्रत्येक विषय का माध्य इसके भीतर \(501\) मानों में से एक हो सकता है।

\[
1{,}00,\, 1{,}01,\, 1{,}02,\, \ldots, \, 5{,}99, \, 6{,}00
\]

मान लीजिए, मैं जर्मन, गणित और स्थानीय एवं सामान्य अध्ययन के सभी क्रमबद्ध संयोजनों को समान महत्व देता हूँ। इस प्रकार,

\[
501^3=125\,751\,501
\]

उदाहरण के लिए, यह मॉडल स्पष्ट तो है, लेकिन कृत्रिम है: यह समान रूप से वितरित विषय औसत, तीनों विषयों की स्वतंत्रता और ठीक सौवें हिस्से के चरणों को मानता है। यह बवेरिया के प्राथमिक विद्यालय के बच्चों के वास्तविक वितरण को प्रतिबिंबित नहीं करता है।

तीन विषय माध्यों \(d,m,h\) के लिए हम लिखते हैं

\[
A(d,m,h)=\frac{\left\lfloor 100\cdot\frac{d+m+h}{3}\right\rfloor}{100}
\]

कुल औसत को दो दशमलव स्थानों तक सीमित करके निकाला जाता है। अब हम तीन गणना विधियों की तुलना करते हैं।:

\[
\begin{aligned}
A_0 &= A(\operatorname{round}(d),\operatorname{round}(m),\operatorname{round}(h)),\\
A_1 &= A(\operatorname{round}_1(d),\operatorname{round}_1(m),\operatorname{round}_1(h)),\\
A_\mathrm{ref} &= A(d,m,h).
\end{aligned}
\]

\(A_0\) पूर्ण अंकों का उपयोग करके की गई गणना को दर्शाता है, \(A_1\) एक दशमलव स्थान वाले प्रस्ताव को और \(A_\mathrm{ref}\) मॉडल के भीतर बिना राउंड किए गए संदर्भ को दर्शाता है। यह गणना सीधे रस्ट में लागू की जा सकती है।:

const SCHOOL_GYMNASIUM: i32 = 0;
const SCHOOL_REALSCHULE: i32 = 1;
const SCHOOL_MITTELSCHULE: i32 = 2;
const FLOAT_TOLERANCE: f64 = 1e-9;

#[derive(Clone, Copy, Default)]
struct Statistic {
    conflict_count: u64,
    total_count: u64,
}

fn determine_school(average: f64) -> i32 {
    if average <= 2.33 {
        return SCHOOL_GYMNASIUM;
    }
    if average <= 2.66 {
        return SCHOOL_REALSCHULE;
    }
    SCHOOL_MITTELSCHULE
}

fn calculate_average(note_deutsch: f64, note_mathe: f64, note_hsu: f64) -> f64 {
    let average = (note_deutsch + note_mathe + note_hsu) / 3.0;
    ((average + FLOAT_TOLERANCE) * 100.0).floor() / 100.0
}

fn round_to_whole_grade(grade: f64) -> f64 {
    grade.round()
}

fn round_to_one_decimal(grade: f64) -> f64 {
    (grade * 10.0).round() / 10.0
}

fn normalize_grade(grade: f64) -> f64 {
    (grade * 100.0).round() / 100.0
}

fn percentage(count: u64, total: u64) -> f64 {
    count as f64 / total as f64 * 100.0
}

fn main() {
    let mut combination_count = 0;
    let mut official_reference_conflicts = 0;
    let mut official_proposal_conflicts = 0;
    let mut proposal_reference_conflicts = 0;
    let mut statistics = [Statistic::default(); 4];

    let mut note_deutsch = 1.0;
    while note_deutsch <= 6.0 {
        let mut note_mathe = 1.0;
        while note_mathe <= 6.0 {
            let mut note_hsu = 1.0;
            while note_hsu <= 6.0 {
                combination_count += 1;

                let official_average = calculate_average(
                    round_to_whole_grade(note_deutsch),
                    round_to_whole_grade(note_mathe),
                    round_to_whole_grade(note_hsu),
                );
                let proposed_average = calculate_average(
                    round_to_one_decimal(note_deutsch),
                    round_to_one_decimal(note_mathe),
                    round_to_one_decimal(note_hsu),
                );
                let reference_average =
                    calculate_average(note_deutsch, note_mathe, note_hsu);
                let official_school = determine_school(official_average);
                let proposed_school = determine_school(proposed_average);
                let reference_school = determine_school(reference_average);

                if official_average == 3.0 {
                    statistics[0].total_count += 1;
                    if reference_school != SCHOOL_MITTELSCHULE {
                        statistics[0].conflict_count += 1;
                    }
                }
                if official_average == 2.66 {
                    statistics[1].total_count += 1;
                    if reference_school == SCHOOL_GYMNASIUM {
                        statistics[1].conflict_count += 1;
                    }
                }
                if official_average == 2.33 {
                    statistics[2].total_count += 1;
                    if reference_school != SCHOOL_GYMNASIUM {
                        statistics[2].conflict_count += 1;
                    }
                }
                if official_average == 2.66 {
                    statistics[3].total_count += 1;
                    if reference_school == SCHOOL_MITTELSCHULE {
                        statistics[3].conflict_count += 1;
                    }
                }

                if official_school != reference_school {
                    official_reference_conflicts += 1;
                }
                if official_school != proposed_school {
                    official_proposal_conflicts += 1;
                }
                if proposed_school != reference_school {
                    proposal_reference_conflicts += 1;
                }

                note_hsu = normalize_grade(note_hsu + 0.01);
            }
            note_mathe = normalize_grade(note_mathe + 0.01);
        }
        note_deutsch = normalize_grade(note_deutsch + 0.01);
    }

    println!(
        "official/reference: {}%",
        percentage(official_reference_conflicts, combination_count)
    );
    println!(
        "official/proposal: {}%",
        percentage(official_proposal_conflicts, combination_count)
    );
    println!(
        "proposal/reference: {}%",
        percentage(proposal_reference_conflicts, combination_count)
    );
    for (index, statistic) in statistics.iter().enumerate() {
        println!(
            "#{}: {}% ({}/{})",
            index + 1,
            percentage(statistic.conflict_count, statistic.total_count),
            statistic.conflict_count,
            statistic.total_count
        );
    }
}

छोटी सहनशीलता में calculate_average इस तरह के मान को रोकता है \(2{,}67\) इसके बाइनरी फ्लोट निरूपण के कारण, इसे गलती से माना गया था \(2{,}669999\ldots\) संपर्क टूट गया है। normalize_grade इसके अलावा, यह प्रत्येक लूप मान को सौवें क्रम के ग्रिड में बदल देता है। कम से कम दो अलग-अलग संभावित औसत मान मौजूद हैं। \(1/300\) अलग; सहिष्णुता \(10^{-9}\) इसलिए यह इतना छोटा है कि किसी भी वास्तविक सीमावर्ती मामले को प्रभावित नहीं करेगा।

प्रोग्राम को कंपाइल करके शुरू किया जाता है।

rustc -O calc.rs && ./calc

यह प्रोग्राम सभी \(125\,751\,501\) संयोजनों के माध्यम से पुनरावृति करता है और परिणाम लौटाता है।:

तुलनाभाग
पूर्ण अंक बनाम बिना राउंड किए गए विषय औसत\(10{,}4411\,\%\)
एक दशमलव स्थान सहित प्रस्ताव की तुलना में पूर्ण अंक\(10{,}1521\,\%\)
एक दशमलव स्थान वाले प्रस्ताव की तुलना बिना राउंड किए गए विशेषज्ञ औसत से की गई है।\(0{,}6615\,\%\)

मेरे लिए केंद्रीय मूल्य यह है \(10{,}4411\,\%\): दस में से एक से अधिक संयोजनों में, पूर्ण ग्रेड में प्रारंभिक राउंडिंग के परिणामस्वरूप बिना राउंडिंग वाले संदर्भ की तुलना में एक भिन्न गणना किया गया स्कूल प्रकार प्राप्त होता है। यह अनुपात चयनित मॉडल के भीतर केवल राउंडिंग प्रभाव का वर्णन करता है।

एक दशमलव स्थान वाले विशेषज्ञ औसतों पर स्विच करने से पिछली विधि की तुलना में सभी मॉडल मामलों के \(10{,}1521\,\%\) में अलग वर्गीकरण होगा। हालाँकि, तीसरी तुलना महत्वपूर्ण है: बिना राउंड किए गए संदर्भ की तुलना में, एक दशमलव स्थान वाली विधि केवल \(0{,}6615\,\%\) छोड़ती है। इस प्रकार संदर्भ से विचलन कम हो जाता है।

\[
1-\frac{0{,}6615}{10{,}4411}\approx 93{,}7\,\%.
\]

मेरे लिए, वर्तमान गणना पद्धति का यही एक संदिग्ध परिणाम है: विषय-विशिष्ट उपलब्धियों का अनुमान अपरिवर्तित रहता है; केवल राउंडिंग के समय ही गणना किए गए स्कूल प्रकार में परिवर्तन आ सकता है। यद्यपि एक दशमलव स्थान के साथ गणना करने से यह प्रभाव पूरी तरह समाप्त नहीं होता, फिर भी मॉडल में यह इसे काफी हद तक कम कर देता है।

हालांकि, ये आंकड़े हमें यह नहीं बताते कि वास्तव में कितने बच्चे प्रभावित होते हैं। रिपोर्ट कार्ड के ग्रेड हमेशा मशीनी रूप से गोल किए गए औसत के रूप में उत्पन्न नहीं होते, शैक्षणिक प्रदर्शन न तो समान रूप से वितरित होता है और न ही स्वतंत्र होता है, और स्कूल के प्रकार का वास्तविक चुनाव केवल इन तीन आंकड़ों पर निर्भर नहीं करता है। मेरी गणना एक अधिक विशिष्ट प्रश्न का उत्तर देती है: जब सभी सैकड़े-मूल्य संयोजन समान रूप से संभावित हों, तो कितनी बार राउंडिंग से गणना किए गए ग्रेड में परिवर्तन होता है?

अंत में, मूल पोस्ट से तुलना: वहाँ उल्लिखित कुल दर, लगभग \(10\,\%\) मेरे \(10{,}4411\,\%\) के करीब है। हालाँकि, मेरी गणनाएँ चार अलग-अलग मामलों की पुष्टि नहीं करती हैं, जिनमें से प्रत्येक को \(1/6 \approx 17\,\%\) "माध्यमिक विद्यालय में \(3{,}00\) कमी", "प्राथमिक विद्यालय में \(2{,}33\) कमी", "प्राथमिक विद्यालय में \(2{,}66\) वृद्धि" और "माध्यमिक विद्यालय में \(2{,}66\) वृद्धि \(1{,}4615\,\%\) \(59{,}6096\,\%\) \(1{,}2023\,\%\) \(62{,}9395\,\%\) प्राप्त होते हैं।

ये चारों मान अलग-अलग आकार के संदर्भ समूहों के साथ सशर्त प्रायिकताएँ हैं। एक अलग तरह से परिभाषित नमूना स्थान के बिना \(1/6\) प्राप्त नहीं किया जा सकता है। इस प्रकार मेरी गणना राउंडिंग प्रभाव की पुष्टि करती है, लेकिन इन व्यक्तिगत प्रायिकताओं की नहीं। किसी भी स्थिति में, प्रभावित बच्चों की वास्तविक संख्या के बारे में कथनों के लिए वास्तविक ग्रेड वितरण और उनकी निर्भरता की आवश्यकता होगी।

वापस