Закон Бенфорда продают так: наводишь его на столбец чисел и выдуманные видно сразу. Настоящие величины начинаются с 1 примерно в 30 процентах случаев и с 9 примерно в 4.6 процента, придуманные ложатся ровно. Гистограмма обвиняет за тебя. Эту гистограмму я вижу на слайдах второй год и ни разу не прогнал её на числах, про которые точно знаю, что они чистые.
Прогнал на 4 столбцах, где мотива нет ни у кого. Все они из истории express, обрезанной по 2013-06-12: это 4108 коммитов и дерево из 197 файлов на aec34284. Никто не завышает, сколько строк добавил коммит. Столбцы такие: строки, добавленные каждым коммитом, размер каждого файла в байтах, длина каждого файла в строках и секунды между соседними коммитами.
Проваливаются 3 из 4.
Числа, которые стоят за картинкой. Среднее абсолютное отклонение это средний зазор между 9 наблюдёнными долями и 9 предсказанными. Пороги у Нигрини такие: тесное согласие ниже 0.006, приемлемое ниже 0.012, несогласие выше 0.015. Строки коммитов дают 0.0259. Размеры файлов дают 0.0242. Длины файлов дают 0.0287. Секунды между коммитами дают 0.0065. Это единственный столбец, который проходит.
Я ждал, что всё объяснит размах. Интервалы идут от 1 секунды до 6209407 секунд, то есть 6.79 порядка. Столбец с таким запасом обязан разложить первые цифры так, как говорит Бенфорд. Остальные 3 столбца укладываются в 3.06, 3.36 и 4.61 порядка. Это стандартное объяснение и оно верно наполовину: у размеров файлов 4.61 порядка, в полтора раза больше запаса, чем у длин файлов. Отклонение при этом 0.0242 против 0.0287, то есть примерно то же самое.
Два экрана расходятся
Дальше я прогнал по тем же 4 столбцам второй принятый тест, chi square. При 8 степенях свободы таблица даёт 15.51 на уровне 5 процентов и 20.09 на уровне 1 процента.
Размеры файлов набирают 13.3 и chi square их не отвергает, при том что MAD называет их несогласными. Интервалы набирают 20.1 против порога 20.09, ближе к черте вердикт не встаёт. Chi square отвергает их на уровне 1 процента, а MAD говорит, что всё в порядке. То есть на одном репозитории, в один и тот же час, два опубликованных экрана выдают противоположное, а какой из них тебе достанется, зависит от того, какой тест взял аудитор.
Механика перестаёт быть загадкой, как только выпишешь формулу. Chi square умножает каждое квадратичное отклонение на объём выборки, поэтому неизменная форма ошибки переходит порог, стоит накопить достаточно строк. У размеров файлов 197 значений, у интервалов 4043. Это отношение в 20 раз решает вердикт сильнее, чем любое свойство самих чисел. У MAD слепота ровно обратная: он делит отклонение на 9 и никогда не спрашивает, сколько строк его дали, поэтому 158 длин файлов и 4043 интервала для него одинаково надёжны.
Где я споткнулся
В столбце коммитов 4108 строк в git и 3587 в моей гистограмме. 521 коммит не добавляет ни строки: мержи, удаления, смена прав. У нуля первой цифры не бывает, эти строки выпадают молча. Я не сразу заметил, что выборка тихо стала на 13 процентов меньше истории, которую я взялся мерить. Выбрасывать их не нейтрально. Это ровно коммиты мелкого конца, а мелкий конец и даёт перевес единицы.
Перевес настоящий и причина у него обычная. Репозиторий такого возраста состоит в основном из мелких правок. Как только огромная часть коммитов трогает от 1 до 9 строк, единица собирает их все. Никто ничего не прячет. Экран видит честную форму работы над кодом и называет её подозрительной.
Чего я не проверял
Сдвинет ли эти столбцы подложенная подделка. Если честные данные стоят на 0.026, а порог 0.015, то интересен вопрос, сколько вранья надо подмешать, чтобы число изменилось так, что аудитор отличит его от этой базы. Я этого не мерил. Ещё я прогнал только тест первой цифры. Тест второй цифры и тест двух последних цифр это то, на что опирается бухгалтерская литература. Там поведение может оказаться лучше или хуже. И это 1 репозиторий из 197 файлов, взятый потому, что он лежал на диске.
Утверждение, которое я оставлю, узкое. Закон Бенфорда это высказывание про числа, размазанные на много порядков. Экран, построенный на нём, наследует это условие, но на слайде с гистограммой условие не написано. Наведи его на столбец, который живёт внутри 3 порядков. Он сработает. Каждый раз и ни на кого.