Bavyera'da, \(2{,}33\) genel not ortalaması Gymnasium'a \(2{,}34\) ortalaması onaylamıyor. Bu keskin sınırda, iki yuvarlama işleminin sırası, çocuğun hangi tarafa düşeceğini belirleyebilir. Günther Felbinger, bir blog yazısında bu yuvarlama etkisinin potansiyel sonuçlarını tartışıyor . Sadece merakımdan, modelde izin verilen tüm not kombinasyonları için etkileri kendim hesapladım.
Temel sorum şu: Ders notlarının erken yuvarlanması, yuvarlanmamış ders ortalamaları kullanılarak yapılan hesaplamalardan ne sıklıkla farklı bir okul hesaplamasına yol açar? Ayrıca, (orada önerildiği gibi) bireysel derslerin ortalamalarının başlangıçta yalnızca bir ondalık basamağa yuvarlanması durumunda ne gibi değişiklikler olduğunu görmek ilginç olurdu.
Bavyera İlköğretim Yönetmeliği'nin 6. maddesine göre, ortalama not Almanca, Matematik ve Yerel ve Genel Bilgiler derslerindeki notlardan hesaplanır. Uygulama yönetmeliği, \(2{,}33\) kadar ve \(2{,}66\) kadar olan sınırları belirtmektedir. Aşağıdaki hesaplama modelinde, her genel ortalama iki ondalık basamağa yuvarlanır ve tekrar yuvarlanmaz. Dolayısıyla, örneğin...
\[
\frac{2{,}33+2{,}34+2{,}34}{3}=2{,}3366\ldots \longrightarrow 2{,}33.
\]
Bu, sınıflandırma için çok önemlidir: \(2{,}3366\ldots\) \(2{,}34\) olmaz, \(2{,}33\) olur ve bu nedenle hala ortaokul için yeterlidir.
İlk giriş, varsayılan konuya özgü ortalama değerler \(1{,}6\) , \(2{,}6\) ve \(2{,}6\) ile erken yuvarlamayı göstermektedir. Bunlardan, öncelikle tam notlar \(2\) , \(3\) ve \(3\) türetilir. Bunların ortalaması şöyledir:
\[
\frac{2+3+3}{3}=2{,}6666\ldots \longrightarrow 2{,}66,
\]
Bu da öğrencinin doğrudan ortaokula kayıt için uygun olmadığı anlamına gelir. Ancak, notları tam sayılara yuvarlamadan, varsayımsal örnekteki sonuç şöyle olurdu...
\[
\frac{1{,}6+2{,}6+2{,}6}{3}=2{,}2666\ldots \longrightarrow 2{,}26.
\]
İkinci örnekte, yuvarlama ters yönde çalışır: \(2{,}4\) , \(3{,}4\) ve \(2{,}4\) tam nota değerleri olan \(2\) , \(3\) ve \(2\) olur, yani resmi olarak \(2{,}33\) . Ancak yuvarlanmamış değerler \(2{,}73\) sonucunu verir. Örnekler etkiyi açıkça göstermektedir. Bununla birlikte, henüz ne sıklıkla meydana geldiğini veya farklı bir yuvarlama yönteminin sonuçlarının ne olacağını ortaya koymamaktadırlar.
Bu nedenle, hesaplamam için açık bir sonuç alanı kullanıyorum. Her denek ortalaması, bu alan içindeki \(501\) değerlerden biri olabilir.
\[
1{,}00,\, 1{,}01,\, 1{,}02,\, \ldots, \, 5{,}99, \, 6{,}00
\]
Varsayalım ki, Almanca, matematik, yerel ve genel çalışmaların tüm sıralı kombinasyonlarına eşit ağırlık veriyorum. Dolayısıyla, şunlar vardır:
\[
501^3=125\,751\,501
\]
Vakalar. Bu nedenle model açık ve nettir, ancak yapaydır: Eşit dağılımlı denek ortalamalarını, üç denek arasındaki bağımsızlığı ve tam olarak yüzde birlik adımları varsayar. Bavyera ilkokul çocuklarının gerçek dağılımını yansıtmaz.
Üç öznenin ortalamaları \(d,m,h\) için şunu yazıyoruz:
\[
A(d,m,h)=\frac{\left\lfloor 100\cdot\frac{d+m+h}{3}\right\rfloor}{100}
\]
Genel ortalama iki ondalık basamağa yuvarlanmıştır. Şimdi üç hesaplama yöntemini karşılaştıralım.:
\[
\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\) tam notlar kullanılarak yapılan hesaplamaya, \(A_1\) bir ondalık basamaklı öneriye ve \(A_\mathrm{ref}\) model içindeki yuvarlanmamış referansa karşılık gelir. Hesaplama, örneğin Rust'ta doğrudan uygulanabilir.:
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
);
}
}
Küçük tolerans calculate_average şu gibi bir değeri engeller \(2{,}67\) İkili kayan noktalı gösterimi nedeniyle yanlışlıkla öyle kabul edildi. \(2{,}669999\ldots\) bağlantısı kesildi. normalize_grade Ayrıca, her döngü değerini yüzüncü dereceden bir ızgaraya indirger. En az iki farklı olası ortalama değer mevcuttur. \(1/300\) ayrı olarak; hoşgörüsü \(10^{-9}\) Bu nedenle, gerçek sınır durumlarının hiçbirini değiştirmeyecek kadar küçüktür.
Program derlendi ve başlatıldı.
rustc -O calc.rs && ./calc
Program tüm \(125\,751\,501\) kombinasyonlarını tek tek inceler ve geri döner.:
| Karşılaştırmak | Porsiyon |
| Tam not ortalamaları ile yuvarlanmamış ders ortalamaları arasındaki fark | \(10{,}4411\,\%\) |
| Öneriye kıyasla tam notlar, bir ondalık basamak hassasiyetinde. | \(10{,}1521\,\%\) |
| Bir ondalık basamaklı öneri, yuvarlanmamış uzman ortalamalarıyla karşılaştırıldığında. | \(0{,}6615\,\%\) |
Benim için en önemli değer şudur: \(10{,}4411\,\%\): Her on kombinasyondan birinden fazlasında, tam notlara erken yuvarlama, yuvarlanmamış referansa göre farklı bir hesaplanmış okul türüne yol açmaktadır. Bu oran, seçilen model içindeki yuvarlama etkisini özel olarak açıklamaktadır.
Bir ondalık basamaklı uzman ortalamalarına geçmek, önceki yönteme kıyasla tüm model vakalarının \(10{,}1521\,\%\) farklı bir sınıflandırmaya yol açacaktır. Bununla birlikte, üçüncü karşılaştırma çok önemlidir: yuvarlanmamış referansa kıyasla, bir ondalık basamaklı yöntem yalnızca \(0{,}6615\,\%\) sapma gösteren vakalar bırakmaktadır. Dolayısıyla referanstan sapma azalmaktadır.
\[
1-\frac{0{,}6615}{10{,}4411}\approx 93{,}7\,\%.
\]
Bana göre, mevcut hesaplama yönteminin tartışmalı sonucu tam olarak budur: varsayılan derse özgü başarılar değişmeden kalır; hesaplanan okul türünü yalnızca yuvarlamanın gerçekleştiği zaman noktası değiştirebilir. Bir ondalık basamakla hesaplama bu etkiyi tamamen ortadan kaldırmasa da, model içinde önemli ölçüde azaltır.
Ancak bu rakamlar, gerçekte kaç çocuğun etkilendiğini bize söylemiyor. Karne notları mutlaka mekanik olarak yuvarlanmış ortalamalar olarak oluşturulmaz, akademik performans ne eşit dağılımlıdır ne de bağımsızdır ve okul türü seçimi yalnızca bu üç rakama bağlı değildir. Benim hesaplamam daha spesifik bir soruyu yanıtlıyor: Tüm yüzde birlik değer kombinasyonlarının eşit olasılığa sahip olduğu durumlarda, yuvarlama hesaplanan notu ne sıklıkla değiştirir?
Son olarak, orijinal gönderiyle bir karşılaştırma: Orada belirtilen genel oran, yaklaşık \(10\,\%\) benim \(10{,}4411\,\%\) oranıma yakın. Ancak, hesaplamalarım her biri \(1/6 \approx 17\,\%\) "Ortaokulu \(3{,}00\) oranında kaçıranlar", "liseyi \(2{,}33\) oranında kaçıranlar", "liseyi \(2{,}66\) oranında tamamlayanlar" ve "ortaokulu \(2{,}66\) oranında tamamlayanlar \(1{,}4615\,\%\) \(59{,}6096\,\%\) \(1{,}2023\,\%\) \(62{,}9395\,\%\) elde ediyorum.
Dört değer, farklı büyüklükteki referans gruplarına sahip koşullu olasılıklardır. Farklı tanımlanmış bir örneklem alanı olmadan \(1/6\) elde edilemez. Dolayısıyla hesaplamam yuvarlama etkisini doğrular, ancak bu bireysel olasılıkları doğrulamaz. Her durumda, etkilenen çocukların gerçek sayısı hakkında ifadeler, gerçek sınıf dağılımlarını ve bunların bağımlılıklarını gerektirir.