I Bayern bekræfter en samlet gennemsnitskarakter på \(2{,}33\) egnethed til gymnasiet \(2{,}34\) ikke gør. Ved denne skarpe grænse kan rækkefølgen af to afrundingsoperationer afgøre, hvilken side et barn havner på. Günther Felbinger diskuterer de potentielle konsekvenser af denne afrundingseffekt i et blogindlæg . Af ren interesse beregnede jeg selv effekterne på tværs af alle tilladte karakterkombinationer i modellen.
Mit centrale spørgsmål er: Hvor ofte fører tidlig afrunding til hele fagkarakterer til en anden type skoleberegning end beregninger med uafrundede faggennemsnit? Desuden ville det være interessant at se, hvad der ændrer sig, hvis gennemsnittene for de enkelte fag (som foreslået der) i første omgang kun afrundes til én decimal.
I henhold til § 6 i de bayerske grundskoleregler beregnes gennemsnitskarakteren ud fra karaktererne i tysk, matematik og lokale og almene fag. Gennemførelsesbestemmelserne specificerer grænserne til op til og med \(2{,}33\) og op til og med \(2{,}66\) . I den følgende beregningsmodel afkortes hvert samlet gennemsnit til to decimaler og afrundes ikke igen. Således, for eksempel...
\[
\frac{2{,}33+2{,}34+2{,}34}{3}=2{,}3366\ldots \longrightarrow 2{,}33.
\]
Dette er afgørende for klassifikationen: \(2{,}3366\ldots\) bliver ikke \(2{,}34\) , men \(2{,}33\) og er derfor stadig tilstrækkelig til folkeskolen.
Den indledende indtastning illustrerer tidlig afrunding med de antagne fagspecifikke middelværdier \(1{,}6\) , \(2{,}6\) og \(2{,}6\) . Ud fra disse udledes først de samlede karakterer \(2\) , \(3\) og \(3\) . Deres middelværdi er
\[
\frac{2+3+3}{3}=2{,}6666\ldots \longrightarrow 2{,}66,
\]
hvilket betyder, at eleven ikke kvalificerer sig til direkte optagelse på folkeskolen. Uden afrunding til hele karakterer ville resultatet i det hypotetiske eksempel dog være...
\[
\frac{1{,}6+2{,}6+2{,}6}{3}=2{,}2666\ldots \longrightarrow 2{,}26.
\]
I det andet eksempel fungerer afrundingen i den modsatte retning: \(2{,}4\) , \(3{,}4\) og \(2{,}4\) bliver til de hele nodeværdier \(2\) , \(3\) og \(2\) , officielt \(2{,}33\) . De uafrundede værdier resulterer dog i \(2{,}73\) . Eksemplerne demonstrerer tydeligt effekten. De afslører dog endnu ikke, hvor ofte det forekommer, eller hvad konsekvenserne af en anden afrundingsmetode ville være.
Derfor bruger jeg et klart resultatrum til min beregning. Hver subjektmiddelværdi kan være en af \(501\) -værdierne i den.
\[
1{,}00,\, 1{,}01,\, 1{,}02,\, \ldots, \, 5{,}99, \, 6{,}00
\]
Antag. Jeg vægter alle ordnede kombinationer af tysk, matematik og lokale og almene studier ligeligt. Der er således
\[
501^3=125\,751\,501
\]
Tilfælde. Modellen er derfor entydig, men kunstig: Den antager ligeligt fordelte faggennemsnit, de tre fags uafhængighed og trin på præcis en hundrededel. Den afspejler ikke den faktiske fordeling af bayerske folkeskolebørn.
For tre subjektmidler \(d,m,h\) skriver vi
\[
A(d,m,h)=\frac{\left\lfloor 100\cdot\frac{d+m+h}{3}\right\rfloor}{100}
\]
for det samlede gennemsnit afkortet til to decimaler. Nu sammenligner vi tre beregningsmetoder.:
\[
\begin{aligned}
A_0 &= A(\operatorname{runde}(d),\operatorname{runde}(m),\operatorname{runde}(h)),\\
A_1 &= A(\operatorname{runde}_1(d),\operatorname{runde}_1(m),\operatorname{runde}_1(h)),\\
A_\mathrm{ref} & = A(d,m,h).
\end{aligned}
\]
\(A_0\) svarer til beregningen med hele karakterer, \(A_1\) til forslaget med én decimal, og \(A_\mathrm{ref}\) til den uafrundede reference i modellen. Beregningen kan f.eks. implementeres direkte i Rust .:
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
);
}
}
Den lille tolerance i calculate_average forhindrer en værdi som f.eks. \(2{,}67\) på grund af dens binære flydende repræsentation blev den fejlagtigt betragtet som \(2{,}669999\ldots\) er afskåret. normalize_grade Desuden reduceres hver loopværdi tilbage til et hundredeordens gitter. Der findes mindst to forskellige mulige middelværdier. \(1/300\) fra hinanden; tolerancen af \(10^{-9}\) er derfor lille nok til ikke at ændre noget reelt grænsetilfælde.
Programmet kompileres og startes med
rustc -O calc.rs && ./calc
Programmet gentager sig gennem alle \(125\,751\,501\) kombinationer og returnerer:
| Sammenligning | Del |
| Hele karakterer versus uafrundede faggennemsnit | \(10{,}4411\,\%\) |
| Hele karakterer sammenlignet med forslaget med én decimal | \(10{,}1521\,\%\) |
| Forslag med én decimal sammenlignet med uafrundede ekspertgennemsnit | \(0{,}6615\,\%\) |
Den centrale værdi for mig er \(10{,}4411\,\%\): I mere end én ud af ti kombinationer fører tidlig afrunding til hele klassetrin til en anden beregnet skoletype end den uafrundede reference. Denne andel beskriver udelukkende afrundingseffekten inden for den valgte model.
At skifte til ekspertgennemsnit med én decimal ville føre til en anden klassificering i \(10{,}1521\,\%\) af alle modeltilfælde sammenlignet med den tidligere metode. Den tredje sammenligning er dog afgørende: Sammenlignet med den uafrundede reference efterlader metoden med én decimal kun \(0{,}6615\,\%\) afvigende tilfælde. Afvigelsen fra referencen falder således med
\[
1-\frac{0{,}6615}{10{,}4411}\approx 93{,}7\,\%.
\]
Dette er for mig netop den tvivlsomme konsekvens af den nuværende beregningsmetode: de antagne fagspecifikke præstationer forbliver uændrede; kun tidspunktet for afrunding kan ændre den beregnede skoletype. Selvom beregning med én decimal ikke helt eliminerer denne effekt, reducerer den den betydeligt inden for modellen.
Disse tal fortæller os dog ikke, hvor mange børn der rent faktisk er berørt. Karakterer på karakterkort genereres ikke nødvendigvis som mekanisk afrundede gennemsnit, de akademiske præstationer er hverken ensartet fordelte eller uafhængige, og det faktiske valg af skoletype afhænger ikke udelukkende af disse tre tal. Min beregning besvarer et mere specifikt spørgsmål: Hvor ofte ændrer afrunding den beregnede karakter, når alle hundrededelsværdikombinationer er lige sandsynlige?
Endelig en sammenligning med det oprindelige indlæg: Den samlede rate nævnt der, cirka \(10\,\%\) er tæt på mine \(10{,}4411\,\%\) . Mine beregninger bekræfter dog ikke de fire individuelle tilfælde, der hver især er rapporteret som \(1/6 \approx 17\,\%\) For "missede gymnasiet med \(3{,}00\) ", "missede folkeskolen med \(2{,}33\) ", "opnåede folkeskolen med \(2{,}66\) " og "opnåede folkeskolen med \(2{,}66\) \(1{,}4615\,\%\) \(59{,}6096\,\%\) \(1{,}2023\,\%\) \(62{,}9395\,\%\) .
De fire værdier er betingede sandsynligheder med referencegrupper af forskellig størrelse. Uden et forskelligt defineret stikprøverum kan \(1/6\) ikke udledes af dem. Min beregning bekræfter således afrundingseffekten, men ikke disse individuelle sandsynligheder. Under alle omstændigheder ville udsagn om det faktiske antal berørte børn kræve reelle karakterfordelinger og deres afhængigheder.