В Баварии средний балл \(2{,}33\) подтверждает пригодность для поступления в гимназию \(2{,}34\) — нет. При таком резком пороге порядок двух операций округления может определить, к какой категории относится ребенок. Гюнтер Фельбингер обсуждает потенциальные последствия этого эффекта округления в своем блоге . Из чистого интереса я сам рассчитал влияние этих факторов на все комбинации оценок, допустимые в модели.
Мой главный вопрос: как часто округление оценок по отдельным предметам до целых чисел приводит к иным результатам школьных вычислений, чем вычисления с использованием неокругленных средних значений по предметам? Кроме того, было бы интересно посмотреть, какие изменения произойдут, если средние значения по отдельным предметам (как предлагается) изначально округляются только до одного десятичного знака.
Согласно разделу 6 Баварского устава начальных школ, средний балл рассчитывается на основе оценок по немецкому языку, математике, а также краеведению и общеобразовательным предметам. В действующем уставе установлены пределы: до \(2{,}33\) и до \(2{,}66\) . В приведенной ниже модели расчета каждый общий средний балл округляется до двух знаков после запятой и не округляется повторно. Таким образом, например…
\[
\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{,}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
\]
Случаи. Таким образом, модель является однозначной, но искусственной: она предполагает равномерное распределение средних значений по испытуемым, независимость трех испытуемых и шаг ровно в одну сотую. Она не отражает фактическое распределение учащихся начальной школы в Баварии.
Для трех субъектных средних \(d,m,h\) мы пишем
\[
A(d,m,h)=\frac{\left\lfloor 100\cdot\frac{d+m+h}{3}\right\rfloor}{100}
\]
для общего среднего значения, округленного до двух знаков после запятой. Теперь сравним три метода расчета.:
[
\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\) — предложению с одним десятичным знаком, а \(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 Кроме того, это сводит каждое значение цикла к сетке сотого порядка. Существует как минимум два различных возможных средних значения. \(1/300\) отдельно; терпимость \(10^{-9}\) Таким образом, это значение достаточно мало, чтобы не изменить ни один реальный пограничный случай.
Программа компилируется и запускается с помощью
rustc -O calc.rs && ./calc
Программа перебирает все \(125\,751\,501\) комбинации и возвращает результат.:
| Сравнение | Часть |
| Общие оценки против средних оценок по предметам без округления | \(10{,}4411\,\%\) |
| Оценки в целых числах по сравнению с предложенным вариантом с одним знаком после запятой. | \(10{,}1521\,\%\) |
| Предложение с одним знаком после запятой по сравнению с неокругленными средними значениями экспертов. | \(0{,}6615\,\%\) |
Для меня это главная ценность. \(10{,}4411\,\%\): Более чем в одном из десяти случаев раннее округление до целых оценок приводит к тому, что рассчитанный тип школы отличается от эталонного значения без округления. Эта пропорция описывает исключительно эффект округления в рамках выбранной модели.
Переход к усредненным значениям экспертов с одним десятичным знаком приведет к изменению классификации в \(10{,}1521\,\%\) всех случаев модели по сравнению с предыдущим методом. Однако третье сравнение имеет решающее значение: по сравнению с не округленным эталоном, метод с одним десятичным знаком оставляет лишь \(0{,}6615\,\%\) отклоняющихся случаев. Таким образом, отклонение от эталона уменьшается на
\[
1-\frac{0{,}6615}{10{,}4411}\approx 93{,}7\,\%.
\]
Для меня это как раз и является сомнительным следствием существующего метода расчета: предполагаемые достижения по отдельным предметам остаются неизменными; только момент округления может изменить рассчитанный тип школы. Хотя расчет с одним десятичным знаком не полностью устраняет этот эффект, он значительно уменьшает его в рамках модели.
Однако эти цифры не показывают, сколько детей на самом деле затронуто этой проблемой. Оценки в табелях успеваемости не обязательно формируются механически округленными средними значениями, академическая успеваемость не является ни равномерно распределенной, ни независимой, а фактический выбор типа школы не зависит исключительно от этих трех показателей. Мои расчеты отвечают на более конкретный вопрос: как часто округление меняет вычисленную оценку, когда все комбинации значений долей сотой одинаково вероятны?
Наконец, сравнение с исходным сообщением: общий показатель, упомянутый там, приблизительно \(10\,\%\) близок к моим \(10{,}4411\,\%\) . Однако мои расчеты не подтверждают четыре отдельных случая, каждый из которых указан как \(1/6 \approx 17\,\%\) Для «пропуск средней школы с \(3{,}00\) », «пропуск начальной школы с \(2{,}33\) », «прохождение начальной школы с \(2{,}66\) » и «прохождение средней школы с \(2{,}66\) \(1{,}4615\,\%\) \(59{,}6096\,\%\) \(1{,}2023\,\%\) \(62{,}9395\,\%\) .
Четыре значения представляют собой условные вероятности с референтными группами разного размера. Без различно определенного выборочного пространства из них нельзя вывести \(1/6\) . Таким образом, мои вычисления подтверждают эффект округления, но не эти отдельные вероятности. В любом случае, для утверждений о фактическом количестве пострадавших детей потребуются реальные распределения оценок и их зависимости.