In Beieren is een gemiddeld cijfer van \(2{,}33\) voldoende voor toelating tot het gymnasium \(2{,}34\) dat niet is. Bij deze scherpe grens kan de volgorde van twee afrondingsbewerkingen bepalen aan welke kant een kind valt. Günther Felbinger bespreekt de mogelijke gevolgen van dit afrondingseffect in een blogpost . Uit pure interesse heb ik de effecten zelf berekend voor alle mogelijke cijfercombinaties die in het model zijn toegestaan.
Mijn centrale vraag is: hoe vaak leidt het vroegtijdig afronden van vakcijfers tot een ander soort schoolberekening dan berekeningen met niet-afgeronde vakgemiddelden? Daarnaast zou het interessant zijn om te zien wat er verandert als de gemiddelden van de individuele vakken (zoals daar gesuggereerd) in eerste instantie worden afgerond op slechts één decimaal.
Volgens artikel 6 van de Beierse basisschoolregeling wordt het gemiddelde cijfer berekend op basis van de cijfers voor Duits, wiskunde en lokale en algemene vakken. De uitvoeringsvoorschriften specificeren de limieten als maximaal \(2{,}33\) en maximaal \(2{,}66\) . In het volgende berekeningsmodel wordt elk algemeen gemiddelde afgerond op twee decimalen en niet verder afgerond. Zo wordt bijvoorbeeld...
\[
\frac{2{,}33+2{,}34+2{,}34}{3}=2{,}3366\ldots \longrightarrow 2{,}33.
\]
Dit is cruciaal voor de classificatie: \(2{,}3366\ldots\) wordt niet \(2{,}34\) , maar \(2{,}33\) en is daarom nog steeds voldoende voor het gymnasium.
De eerste invoer illustreert vroege afronding met de aangenomen vakspecifieke gemiddelde waarden \(1{,}6\) , \(2{,}6\) en \(2{,}6\) . Hieruit worden eerst de hele cijfers \(2\) , \(3\) en \(3\) afgeleid. Hun gemiddelde is
\[
\frac{2+3+3}{3}=2{,}6666\ldots \longrightarrow 2{,}66,
\]
Dit betekent dat de leerling niet in aanmerking komt voor de middelbare school. Zonder afronding naar hele cijfers zou het resultaat in het hypothetische voorbeeld echter zijn...
\[
\frac{1{,}6+2{,}6+2{,}6}{3}=2{,}2666\ldots \longrightarrow 2{,}26.
\]
In het tweede voorbeeld werkt de afronding in de tegenovergestelde richting: \(2{,}4\) , \(3{,}4\) en \(2{,}4\) worden de hele notatiewaarden \(2\) , \(3\) en \(2\) , officieel \(2{,}33\) . De niet-afgeronde waarden resulteren echter in \(2{,}73\) . De voorbeelden tonen het effect duidelijk aan. Ze laten echter nog niet zien hoe vaak dit voorkomt of wat de gevolgen zouden zijn van een andere afrondingsmethode.
Daarom gebruik ik voor mijn berekening een duidelijke resultaatruimte. Elk gemiddelde van een onderwerp kan een van de \(501\) waarden binnen die ruimte zijn.
\[
1{,}00,\, 1{,}01,\, 1{,}02,\, \ldots, \, 5{,}99, \, 6{,}00
\]
Stel, ik ken aan alle geordende combinaties van Duits, wiskunde en lokale en algemene studies een gelijk gewicht toe. Dus er zijn
\[
501^3=125\,751\,501
\]
Gevallen. Het model is daarom eenduidig, maar kunstmatig: het gaat uit van gelijk verdeelde gemiddelden van de proefpersonen, de onafhankelijkheid van de drie proefpersonen en stappen van precies een honderdste. Het weerspiegelt niet de werkelijke verdeling van Beierse basisschoolkinderen.
Voor drie subjecten \(d,m,h\) schrijven we
\[
A(d,m,h)=\frac{\left\lfloor 100\cdot\frac{d+m+h}{3}\right\rfloor}{100}
\]
voor het algemene gemiddelde, afgerond op twee decimalen. Nu vergelijken we drie berekeningsmethoden.:
\[
\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\) komt overeen met de berekening met hele cijfers, \(A_1\) met het voorstel met één decimaal, en \(A_\mathrm{ref}\) met de niet-afgeronde referentie binnen het model. De berekening kan bijvoorbeeld direct in Rust worden geïmplementeerd.:
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
);
}
}
De kleine tolerantie in calculate_average voorkomt dat een waarde zoals \(2{,}67\) vanwege de binaire weergave als drijvende-kommawaarde werd het ten onrechte beschouwd \(2{,}669999\ldots\) wordt afgesneden. normalize_grade Bovendien wordt elke luswaarde teruggebracht tot een raster van de honderdste orde. Er bestaan minstens twee verschillende mogelijke gemiddelde waarden. \(1/300\) apart; de tolerantie van \(10^{-9}\) is daarom klein genoeg om geen enkel echt grensgeval te beïnvloeden.
Het programma wordt gecompileerd en gestart met
rustc -O calc.rs && ./calc
Het programma doorloopt alle combinaties \(125\,751\,501\) en retourneert:
| Vergelijking | Deel |
| Hele cijfers versus niet-afgeronde vakgemiddelden | \(10{,}4411\,\%\) |
| Hele cijfers vergeleken met het voorstel, afgerond op één decimaal. | \(10{,}1521\,\%\) |
| Voorstel met één decimaal vergeleken met niet-afgeronde expertgemiddelden | \(0{,}6615\,\%\) |
De belangrijkste waarde voor mij is \(10{,}4411\,\%\): In meer dan één op de tien gevallen leidt vroegtijdig afronden naar hele cijfers tot een ander berekend schooltype dan de niet-afgeronde referentie. Deze verhouding beschrijft uitsluitend het afrondingseffect binnen het gekozen model.
Overstappen op expertgemiddelden met één decimaal zou in \(10{,}1521\,\%\) van alle modelgevallen tot een andere classificatie leiden in vergelijking met de vorige methode. De derde vergelijking is echter cruciaal: vergeleken met de niet-afgeronde referentie, laat de methode met één decimaal slechts \(0{,}6615\,\%\) afwijkende gevallen over. De afwijking van de referentie neemt dus af met
\[
1-\frac{0{,}6615}{10{,}4411}\approx 93{,}7\,\%.
\]
Dit is voor mij precies het twijfelachtige gevolg van de huidige berekeningsmethode: de veronderstelde vakspecifieke prestaties blijven ongewijzigd; alleen het moment waarop afronding plaatsvindt, kan het berekende schooltype beïnvloeden. Hoewel rekenen met één decimaal dit effect niet volledig elimineert, vermindert het het wel aanzienlijk binnen het model.
Deze cijfers vertellen ons echter niet hoeveel kinderen er daadwerkelijk door worden getroffen. Rapportcijfers worden niet per se gegenereerd als mechanisch afgeronde gemiddelden, schoolprestaties zijn noch gelijkmatig verdeeld, noch onafhankelijk, en de uiteindelijke schoolkeuze hangt niet alleen af van deze drie cijfers. Mijn berekening beantwoordt een meer specifieke vraag: hoe vaak verandert afronding het berekende cijfer wanneer alle combinaties van honderdsten even waarschijnlijk zijn?
Tot slot een vergelijking met het oorspronkelijke bericht: het daar genoemde totale percentage van ongeveer \(10\,\%\) ligt dicht bij mijn \(10{,}4411\,\%\) . Mijn berekeningen bevestigen echter niet de vier afzonderlijke gevallen, die elk als \(1/6 \approx 17\,\%\) Voor "middelbare school gemist met \(3{,}00\) ", "gymnasium gemist met \(2{,}33\) ", "gymnasium behaald met \(2{,}66\) " en "middelbare school behaald met \(2{,}66\) \(1{,}4615\,\%\) \(59{,}6096\,\%\) \(1{,}2023\,\%\) \(62{,}9395\,\%\) .
De vier waarden zijn voorwaardelijke kansen met referentiegroepen van verschillende grootte. Zonder een anders gedefinieerde steekproefruimte kan \(1/6\) hieruit niet worden afgeleid. Mijn berekening bevestigt dus het afrondingseffect, maar niet deze individuele kansen. In elk geval zouden uitspraken over het werkelijke aantal getroffen kinderen echte cijferverdelingen en hun onderlinge afhankelijkheden vereisen.