バイエルン州では、総合平均成績が\(2{,}33\)であればギムナジウム\(2{,}34\)資格がない。この明確な境界線において、2回の四捨五入の順序によって、子供がどちらの側に該当するかが決まる可能性がある。ギュンター・フェルビンガーはこの四捨五入の影響についてブログ記事で論じている。純粋な興味から、私はモデルで許可されているすべての成績の組み合わせについて、その影響を自分で計算してみた。
私の中心的な疑問は、科目ごとの成績を整数に丸めることが、丸めない科目平均を用いた計算とは異なる種類の学校計算につながる頻度はどのくらいか、ということです。さらに、個々の科目の平均を(そこで提案されているように)最初に小数点以下1桁に丸めた場合、どのような変化が生じるかを見てみるのも興味深いでしょう。
バイエルン州小学校規則第6条によれば、平均成績はドイツ語、数学、地域・一般教養の成績から算出されます。実施規則では、 \(2{,}33\)以下、 \(2{,}66\)以下と規定されています。以下の計算モデルでは、各総合平均は小数点以下2桁に切り捨てられ、再度四捨五入は行われません。したがって、例えば…
\[
\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 番目の例では、丸め処理は逆方向に行われます。 \(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
\]
事例。したがって、このモデルは明確ではあるものの、人為的なものである。被験者の平均値が均等に分布していること、3つの被験者が独立していること、そしてステップが正確に100分の1であることを前提としている。これは、バイエルン州の小学校児童の実際の分布を反映していない。
3つの主観平均\(d,m,h\)については、次のように記述します。
\[
A(d,m,h)=\frac{\left\lfloor 100\cdot\frac{d+m+h}{3}\right\rfloor}{100}
\]
全体の平均値は小数点以下2桁に切り捨てて表示します。次に、3つの計算方法を比較します。:
\[
\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\)は小数点以下1桁の提案、 \(A_\mathrm{ref}\)モデル内の丸められていない参照値に対応します。この計算は、例えば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
);
}
}
小さな許容範囲 calculate_average 次のような値を防ぐ \(2{,}67\) バイナリ浮動小数点表現のため、誤って \(2{,}669999\ldots\) 途切れる。 normalize_grade さらに、各ループの値を100次グリッドに縮小します。少なくとも2つの異なる平均値が存在します。 \(1/300\) 別々に; 寛容 \(10^{-9}\) したがって、実際の境界線上の事例に影響を与えないほど十分に小さい。
プログラムはコンパイルされ、起動されます。
rustc -O calc.rs && ./calc
このプログラムは\(125\,751\,501\)通りの組み合わせを順に処理し、結果を返します。:
| 比較 | 部分 |
| 整数値の成績と四捨五入しない科目別平均点 | \(10{,}4411\,\%\) |
| 小数点以下1桁までで提案と比較した整数値 | \(10{,}1521\,\%\) |
| 小数点以下1桁の提案と、四捨五入していない専門家の平均値との比較 | \(0{,}6615\,\%\) |
私にとっての中心的な価値観は \(10{,}4411\,\%\): 10回に1回以上の割合で、成績を整数に丸めると、丸めない基準値とは異なる学校種別が算出されます。この割合は、選択したモデル内での丸めの影響のみを表しています。
小数点以下1桁の専門家平均値に切り替えると、以前の方法と比較して、モデルケース全体の\(10{,}1521\,\%\)で異なる分類になります。しかし、3番目の比較が重要です。丸められていない参照と比較すると、小数点以下1桁の方法では、逸脱するケース\(0{,}6615\,\%\)しか残りません。したがって、参照からの偏差は減少します。
\[
1-\frac{0{,}6615}{10{,}4411}\approx 93{,}7\,\%.
\]
これはまさに、現在の計算方法における問題点だと私は考えています。想定される教科ごとの成績は変更されず、計算される学校の種類は、丸め処理が行われる時点によってのみ変化するのです。小数点以下1桁で計算してもこの影響は完全には解消されませんが、モデル内では大幅に軽減されます。
しかし、これらの数字だけでは、実際に何人の子供が影響を受けているかはわかりません。成績表の成績は必ずしも機械的に四捨五入された平均値として生成されるわけではなく、学業成績は均一に分布しているわけでも、互いに独立しているわけでもなく、実際の学校タイプの選択はこれら3つの数字だけに依存するわけでもありません。私の計算は、より具体的な疑問に答えるものです。すべての100分の1の値の組み合わせが等しく発生する場合、四捨五入によって計算された成績が変わる頻度はどれくらいでしょうか?
最後に、元の投稿との比較です。そこに記載されている全体の割合は約\(10\,\%\)私の\(10{,}4411\,\%\)に近い値です。ただし、私の計算では、それぞれ\(1/6 \approx 17\,\%\) 「中等学校を\(3{,}00\)で欠席」、「高等学校を\(2{,}33\)で欠席」、「高等学校を\(2{,}66\)で卒業」、「中等学校\(2{,}66\)で卒業\(1{,}4615\,\%\) \(59{,}6096\,\%\) \(62{,}9395\,\%\) \(1{,}2023\,\%\)なります。
これら4つの値は、参照グループのサイズが異なる条件付き確率です。異なるサンプル空間を定義しない限り\(1/6\)は導き出せません。したがって、私の計算は丸め効果を裏付けていますが、これらの個々の確率を裏付けているわけではありません。いずれにせよ、影響を受けた子供の実際の人数について述べるには、実際の学年分布とその依存関係が必要となります。