Erori de rotunjire în timpul tranziției

În Bavaria, o notă medie generală de \(2{,}33\) certifică eligibilitatea pentru Gimnaziu \(2{,}34\) nu. La această limită precisă, ordinea a două operațiuni de rotunjire poate determina de ce parte se încadrează un copil. Günther Felbinger discută potențialele consecințe ale acestui efect de rotunjire într-o postare pe blog . Din pur interes, am calculat eu însumi efectele pentru toate combinațiile de note permise în model.


Întrebarea mea centrală este: Cât de des rotunjirea timpurie la notele pe materii întregi duce la un tip diferit de calcul școlar față de calculele care utilizează medii nerotunjite pe materii? În plus, ar fi interesant de văzut ce se schimbă dacă mediile materiilor individuale (așa cum se sugerează acolo) sunt rotunjite inițial la o singură zecimală.

Conform articolului 6 din Regulamentul școlilor primare bavareze, media se calculează pe baza notelor la limba germană, matematică și studii locale și generale. Regulamentul de aplicare specifică limitele până la \(2{,}33\) și până la \(2{,}66\) . În modelul de calcul următor, fiecare medie generală este trunchiată la două zecimale și nu este rotunjită din nou. Astfel, de exemplu...

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

Acest lucru este crucial pentru clasificare: \(2{,}3366\ldots\) nu devine \(2{,}34\) , ci \(2{,}33\) și, prin urmare, este încă suficient pentru școala generală.

Intrarea inițială ilustrează rotunjirea timpurie cu valorile medii specifice materiilor asumate \(1{,}6\) , \(2{,}6\) și \(2{,}6\) . Din acestea, se derivă mai întâi notele întregi \(2\) , \(3\) și \(3\) . Media lor este

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

ceea ce înseamnă că elevul nu se califică pentru admiterea directă la școala generală. Fără rotunjirea la note întregi, însă, rezultatul din exemplul ipotetic ar fi...

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

În al doilea exemplu, rotunjirea funcționează în direcția opusă: \(2{,}4\) , \(3{,}4\) și \(2{,}4\) devin valorile notei întregi \(2\) , \(3\) și \(2\) , oficial \(2{,}33\) . Valorile nerotunjite, însă, rezultă în \(2{,}73\) . Exemplele demonstrează clar efectul. Cu toate acestea, ele nu dezvăluie încă cât de des apare sau care ar fi consecințele unei metode de rotunjire diferite.

Prin urmare, pentru calculul meu utilizez un spațiu de rezultate clar. Fiecare medie a subiectului poate fi una dintre valorile \(501\) din cadrul acestuia.

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

Presupunem. Ponderez în mod egal toate combinațiile ordonate de germană, matematică și studii locale și generale. Prin urmare, există

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

Cazuri. Prin urmare, modelul este lipsit de ambiguitate, dar artificial: presupune medii la nivel de materie distribuite în mod egal, independența celor trei materii și trepte de exact o sutime. Nu reflectă distribuția reală a elevilor de școală primară bavareză.

Pentru trei medii subiective \(d,m,h\) scriem

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

pentru media generală trunchiată la două zecimale. Acum comparăm trei metode de calcul.:

\[
\begin{aliniat}
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{aliniat}
\]

\(A_0\) corespunde calculului folosind note întregi, \(A_1\) propunerii cu o zecimală și \(A_\mathrm{ref}\) referinței nerotunjite din cadrul modelului. Calculul poate fi implementat direct în Rust , de exemplu.:

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
        );
    }
}

Toleranța mică în calculate_average previne o valoare precum \(2{,}67\) din cauza reprezentării sale binare cu număr de float-uri, a fost considerată în mod eronat \(2{,}669999\ldots\) este tăiat. normalize_grade În plus, reduce fiecare valoare a buclei înapoi la o grilă de ordinul sutim. Există cel puțin două valori medii posibile diferite. \(1/300\) separat; toleranța față de \(10^{-9}\) este, prin urmare, suficient de mică pentru a nu schimba niciun caz real la limită.

Programul este compilat și pornit cu

rustc -O calc.rs && ./calc

Programul iterează prin toate combinațiile \(125\,751\,501\) și returnează:

ComparaţiePorţiune
Note întregi versus medii nerotunjite la materii\(10{,}4411\,\%\)
Note întregi comparate cu propunerea cu o singură zecimală\(10{,}1521\,\%\)
Propunere cu o singură zecimală în comparație cu mediile experților nerotunjite\(0{,}6615\,\%\)

Valoarea centrală pentru mine este \(10{,}4411\,\%\): În mai mult de una din zece combinații, rotunjirea timpurie la clase întregi duce la un tip de școală calculat diferit față de referința nerotunjită. Această proporție descrie exclusiv efectul de rotunjire din cadrul modelului ales.

Trecerea la medii ale experților cu o singură zecimală ar duce la o clasificare diferită în \(10{,}1521\,\%\) din toate cazurile modelului, comparativ cu metoda anterioară. Cu toate acestea, a treia comparație este crucială: comparativ cu referința nerotunjită, metoda cu o singură zecimală lasă doar \(0{,}6615\,\%\) cazurile de abatere. Astfel, abaterea de la referință scade cu

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

Pentru mine, aceasta este tocmai consecința discutabilă a metodei actuale de calcul: realizările specifice materiilor presupuse rămân neschimbate; doar momentul în care are loc rotunjirea poate modifica tipul de școală calculat. Deși calculul cu o singură zecimală nu elimină complet acest efect, îl reduce semnificativ în cadrul modelului.

Aceste cifre, însă, nu ne spun câți copii sunt de fapt afectați. Notele din carnetele de note nu sunt neapărat generate ca medii rotunjite mecanic, performanța academică nu este nici distribuită uniform, nici independentă, iar alegerea efectivă a tipului de școală nu depinde exclusiv de aceste trei cifre. Calculul meu răspunde la o întrebare mai specifică: Cât de des modifică rotunjirea nota calculată atunci când toate combinațiile de valori de sutimi sunt la fel de probabile?

În final, o comparație cu postarea inițială: Rata generală menționată acolo, de aproximativ \(10\,\%\) este apropiată de valoarea mea \(10{,}4411\,\%\) . Cu toate acestea, calculele mele nu confirmă cele patru cazuri individuale, fiecare raportat ca \(1/6 \approx 17\,\%\) Pentru „absent de la școala secundară cu \(3{,}00\) ”, „absent de la școala generală cu \(2{,}33\) ”, „absent de la școala generală cu \(2{,}66\) ” și „absent de la școala generală cu \(2{,}66\) \(1{,}4615\,\%\) \(59{,}6096\,\%\) \(1{,}2023\,\%\) \(62{,}9395\,\%\) .

Cele patru valori sunt probabilități condiționate cu grupuri de referință de dimensiuni diferite. Fără un spațiu de eșantionare definit diferit \(1/6\) nu poate fi derivat din ele. Prin urmare, calculul meu confirmă efectul de rotunjire, dar nu și aceste probabilități individuale. În orice caz, afirmațiile despre numărul real de copii afectați ar necesita distribuții reale ale notelor și dependențele acestora.

Înapoi