В этой главе мы будем опираться на описанный ранее принцип универсального подробного логирования. Мы можем приступить к конструированию и расчету супербалла. Почему супербалла? Потому что, как вы увидите далее, этот балл включает в себя максимум информации, который можно выжать из лога минимального учебного действия, и при этом остается простым в понимании и легко интерпретируется.
При конструировании супербалла мы решаем две задачи:
1) объединить максимум доступной информации о минимальном учебном действии в одном числе;
2) обеспечить интерпретируемость этого числа.
В общем виде композиция супербалла представлена следующими компонентами:
1) результатом минимального учебного действия;
2) корректировкой на эффективную попытку;
3) корректировкой на использование подсказки;
4) другими возможными корректировками.
Начнем с результата минимального учебного действия. И здесь сразу будем использовать универсальный подробный лог, потому что, как мы уже рассказали, он записывает результат максимально подробно (максимально возможно подробно), а мы не теряем информацию при конвертации в дихотомическую логику. Это первый шаг в решении первой задачи (объединить максимум доступной информации о минимальном учебном действии в одном числе). При использовании универсального подробного логирования результат учебного действия представляет собой выбранное студентом количество верных опций, суммированное с количеством неверных опций, не выбранных студентом, и деленное на общее количество опций задания. Другими словами, мы рассчитываем долю всего правильного (верного или целевого), что сделал студент в этом задании, относительно всего того, что вообще есть в этом задании. Что значит «все правильное»? Это значит выбрать все правильное, что было правильным с точки зрения задания, и одновременно не выбрать неправильное с точки зрения задания. Рассмотрим это на примерах.
В задании пять вариантов ответа, три из которых верные и два неверные. Студентам необходимо выбрать все верные варианты ответа. Первый студент выбрал три верных варианта и не отметил неверные – таким образом, полностью верно решил задание. Каким будет его результат? (3 + 2–0) / (3 + 2) = 1. Полный балл за полностью верное решение.
Теперь представим другую ситуацию: второй студент выбрал две верные опции и одну неверную. Получается, он решил задание частично верно. Каким будет его результат? (3 + 2–1) / (3 + 2) = 4 / 5. Частично верному решению – часть балла.
Третий студент выбрал сразу все варианты ответа: и верные, и неверные. Каким будет результат? (3 + 2–2) / (3 + 2) = 3 / 5. Тоже часть балла: хотя студент выбрал все правильные варианты ответа, его балл был скорректирован на выбранные неправильные варианты. Четвертый студент не отметил ни одного верного варианта, но отметил все неверные. В этом случае результат будет (0 + 2) / (3 + 2) = 0 – ноль баллов за полностью неверное выполнение.
Такой подход к расчету результата учебного действия отлично сочетается с универсальным подробным логированием. Потому что компоненты Incorrect учитываются только тогда, когда в соответствующих столбцах присутствуют значения. А когда столбцы не заполнены (а мы помним, что столбцы содержат NA, если в заданиях предусмотрен только один верный ответ и не предусмотрены неверные варианты), эти компоненты «выключаются» из подсчета.
Так, если в задании только один верный вариант ответа, мы получим только два возможных результата учебного действия: 1 – за выбор верного варианта (1/1) ответа, 0 – за выбор неверного (0/1). Если же задача представлена действиями, которые нужно выполнить, и при этом неверных действий нет, то вычисление результата учебного действия представляет собой подсчет количества выполненных действий из общего числа этих действий в задаче, например 1/3, 2/3 и 3/3 для задачи с тремя действиями.
Рассчитаем результат по данным. Датасет book_dataset_3.tsv можно скачать по ссылке clck.ru/3Eiw7W и подгрузить с помощью уже знакомой команды df <– read.table("book_dataset_3.tsv", header = TRUE, quote = "", sep = "\t"). Он уже содержит переменные possible_correct, possible_incorrect, selected_correct и selected_incorrect для каждой попытки студента student_id выполнить задание task_id.
Однако прежде чем перейти к вычислению результата, необходимо обозначить попытки на основании метки времени с помощью уже знакомого нам кода[30]. Переменная с номером попытки понадобится несколько позднее в этой главе. Теперь мы можем воспользоваться кодом для вычисления результата учебного действия. Вот он:
Этот код работает построчно (на это указывает команда rowwise()), а это значит, что для каждой попытки студента j решить задачу i вычисляется новая переменная result, равная количеству верных опций, выбранных студентом, суммированному с количеством неверных опций, не выбранных студентом, и деленному на общее количество опций задания.
Поскольку в данных результат рассчитывается для каждой попытки, нужно отобрать эффективный результат, которым является максимальный результат, полученный студентом в этом задании. Отобрать строки с эффективным результатом можно с помощью такого кода:
Мы снова видим знакомые нам корзинки «студент – задание» (group_by(student_id, task_id)), в которых находится максимальный полученный результат (filter(result == max(result))) для каждой пары, при этом выбирается первый максимальный результат, что обеспечивается упорядочиванием по времени arrange(timestamp) и командой slice(1).
Таким образом, полученный результат учебного действия отражает долю верных ответов в решении студента, которая получена органическим способом, без применения каких-либо конвертаций, и, соответственно, это значение легко и однозначно интерпретируется. Кроме того, этот подход максимально работает на студента, так как отбирает именно эффективную попытку, максимизирующую результат (а не первую или последнюю, что показало бы искаженную оценку результата).
Конструирование супербалла продолжается вычислением корректировки на использование попыток (если они были доступны в продукте). Это важно сделать, потому что один и тот же результат, например ½, но полученный с первой и с третьей попытки, – это разные результаты. Второму студенту потребовалось на два шага больше, чтобы получить тот же результат, что и первому. Супербалл должен учитывать эти различия.
Процесс корректировки результата учебного действия на использование попытки представляет собой уменьшение балла пропорционально попытке, при которой этот эффективный результат был достигнут. Чем больше порядковый номер попытки, с которой студент получил эффективный результат, тем меньший балл в итоге корректировки он имеет. При этом у процесса корректировки есть важный нюанс. Он заключается в том, что уменьшение балла за использование попытки происходит пропорционально не номеру попытки, а уровню, к которому эффективная попытка относится: чем выше этот уровень (а не просто номер попытки), тем меньший балл получит студент по итогам применения корректировки на попытку. Эти уровни рассчитываются эмпирически и зависят от продукта, но на основании анализа десятков миллионов строк логов мы сформулировали относительно универсальное разбиение на пять уровней попыток. Первая попытка является самой результативной, и, если студент нашел эффективное решение именно с первой попытки, он должен получить максимальный балл, что логично. Далее распределение попыток происходит следующим образом:
• 2–3-я попытки – второй уровень,
• 4–6-я попытки – третий уровень,
• 7–10-я попытки – четвертый уровень,
• 11-я и последующие попытки – пятый уровень.
Вычислительный код для конвертации попыток, при которых получен эффективный результат, в уровни попыток будет выглядеть следующим образом:
Этот код читается следующим образом:
• если попытка, соответствующая эффективному результату, 1, – уровень 1 ifelse(df$attempt == 1, 1;
• если попытка, соответствующая эффективному результату, 2 или 3, – уровень 2 ifelse(df$attempt %in% c(2, 3), 2;
• если попытки 4–6 – уровень 3 ifelse(df$attempt %in% c(4, 5, 6), 3;
• если попытки 7–10 – уровень 4 ifelse(df$attempt %in% c(7, 8, 9, 10), 4;
• для всех остальных попыток – уровень 5.
Вычислительный код для расчета скорректированного на использование попытки балла выглядит так:
df$scoreij <– df$result * (1–0.2 * (df$tier – 1))
Для того чтобы лучше его понять, рассмотрим иллюстрирующий пример.
Предположим, что студент i решил задание j верно (эффективный результат равен 1) с первой попытки. В таком случае его балл 1 · (1 − 0,2 · (1 − 1)) = 1 будет полным (равен 1).
Если студент получил эффективный результат со второй или третьей попытки, что соотносится с уровнем 2, то его балл равен 1 · (1 − 0,2 · (2 − 1)) = 0,8 – таким образом, он получит на 20 % меньше полного балла.
В случае если студент решил задание с 4–6-й попытки, что сопоставимо с уровнем 3, его балл равен 1 · (1 − 0,2 · (3 − 1)) = 0,6, что соответствует 40 %-ному снижению.
Если же студент справился с заданием с 7–10-й попытки, что соответствует уровню 4, его балл получится равным 1 · (1 − 0,2 · (4 − 1)) = 0,4; снижение составит 60 %.
Наконец, при количестве попыток 11 и выше, что соотносится с уровнем 5, студент получит 1 · (1 − 0,2 · (5 − 1)) = 0,2 балла; снижение составит 80 %.
Здесь важно обратить внимание на один нюанс: даже при условии решения задания с максимально возможной попытки студент получает небольшой балл. Таким образом, успешное решение вознаграждается в любом случае – здесь мы снова стоим на стороне наших студентов. Мне встречались разные способы вознаграждения студентов за верные решения, но в подавляющем большинстве это более жесткие альтернативы от «все (за верное решение при первой попытке) или ничего» до вознаграждения сотой долей балла за верные решения с большого количества попыток. Однако мой опыт исследования оптимальных с точки зрения восприятия студентами форм начисления баллов показывает, что снижение на 80–90 % для максимальной попытки оставляет ощущение справедливости, потому что различает верный и неверный ответы в балле, но при этом повышает ценность самой попытки (например, я слышал такие аргументы от студентов: «Надо постараться затратить меньше попыток»»; «Важно не пытаться “натыкать” ответ»; «При первой неудаче нужно понять причину, прежде чем переходить к следующей попытке»).
Мини-практикум. Сравните эффективный результат и скорректированный на использование попытки балл студента
95754bcd795ace386e00b58a620a923fза заданиеcaa2a204b0ca6922. Как вы интерпретируете увиденное?
Правильный ответ: эффективный результат студента равен 1, а скорректированный на использование попыток балл – 0,6. Это значит, что студент решил задание полностью верно, но это получилось сделать с 4–6-й попытки[31].
Наконец, конструирование супербалла завершается с вычислением еще одной корректировки – на использование подсказок (если они были доступны в продукте). Предположим, что в каждом задании в продукте есть подсказка, к которой студент может обратиться по желанию. В таком случае важно отразить, была ли использована подсказка в балле, потому что одинаковые результаты, полученные с подсказкой и без нее, – это все же разные результаты.
Вычислительный код, учитывающий и корректировку на попытку, и корректировку на использование подсказки, выглядит следующим образом:
df$scoreij <– df$result * (1–0.2 * (df$tier – 1)) * (1–0.4 * df$hint)
Мы видим, что добавился компонент (1–0.4 * df$hint). Он показывает, что если студент использовал подсказку, то его балл будет скорректирован на 40 % в меньшую сторону. Значение в 40 % установлено нами эмпирически на основе регрессионного анализа. Это значит, что этот коэффициент может быть иным для других продуктов (его следует вычислять дополнительно), однако для целей этой книги, а именно для «первых шагов» в психометрике, мы можем считать его отправной точкой, подтвержденной эмпирически.
Таким образом, если мы вернемся к нашему примеру, то получим: студент i, выполнивший задание j верно с первой попытки, но с использованием подсказки, получит не 1 балл, а 0,6. Для уровней 2, 3, 4 и 5 эти значения составят 0,48; 0,36; 0,24 и 0,12 соответственно.
Мини-практикум. Изменился ли супербалл студента
95754bcd795ace386e00b58a620a923fза заданиеcaa2a204b0ca6922по итогам корректировки на использование подсказки? О чем это говорит?
Правильный ответ: супербалл студента уменьшился до 0,36. Эта корректировка отражает использование студентом подсказки[32].