По следам Тафти: делаю понятный график из двух непонятных

Прочитал первую книгу Тафти и захотел сделать редизайн какого-нибудь графика. Далеко ходить не пришлось — в дипломной работе моего друга как раз был слайд с двумя графиками, их мы сегодня и улучшим.

По следам Тафти: делаю понятный график из двух непонятных

Это слайд из презентации на предзащите диплома. Тема связана с машинным обучением, но для простоты вместо технических терминов я буду использовать пирожки в корзине. В конце статьи можно почитать, какие термины были под прикрытием пирожков.

Задача графиков найти такую длину пирожка, что 99% всех пирожков такой же длины или короче

Что не так с этими графиками

По следам Тафти: делаю понятный график из двух непонятных

По горизонтали показана длина пирожка, а по вертикали количество пирожков такой длины в корзине.

Каждый столбик показывает суммарное количество пирожков для каждого диапазона длин. Например, второй столбик говорит нам, что есть примерно 1000 пирожков, у которых длина от 50 до 100.

У графика три проблемы:

  • Оси не подписаны. Даже со словесными объяснениями я не понял, что происходит на графике
  • Вертикальная ось неравномерная: отрезки 10²–10³ и 10³–10⁴ выглядят одинаковыми по высоте, но первый представляет 900 пирожков (1000–100), а второй 9000 (10000–1000). Создается впечатление, что пирожков в первом столбике меньше половины от корзинки, хотя их там намного больше, чем в остальных столбиках вместе взятых
  • График не помогает найти эталонную длину пирожка, которую мы ищем — придется вычислять
По следам Тафти: делаю понятный график из двух непонятных

Второй график — ящик с усами, он же box plot. По вертикали указано количество пирожков. Друг построил его когда понял, что первый график не решил задачу.

Тут уже лучше видно, что бóльшая часть пирожков длиной от ~15 до ~30, а средняя длина около 20.

Проблемы три:

  • Оси не подписаны
  • График так же не помогает найти эталонную длину пирожка
  • Такой график мало кто видел в своей жизни. Как читать его без пояснений автора или ныряния в интернет — непонятно

Новый график

Теперь мы знаем про проблемы старых графиков, какие данные они отображают и какую задачу решают. Пора сделать новый график, который решит все проблемы.

По следам Тафти: делаю понятный график из двух непонятных
  • Стало видно, что бóльшая часть пирожков имеет длину до 50. Теперь с помощью графика легко обосновать выбор этой длины как эталонной. Наглядно видно, что площадь графика левее 50 занимает около 99% от всего графика. Пирожки длиннее 50 — очень редкие случаи, на которые можно забить. Это главное отличие графика от старых, где выбор эталонной длины пирожка не был очевиден ни автору, ни зрителю
  • Каждый столбик теперь отвечает за одно число, а не отрезок. Тем самым повысил data-ink ratio — стало больше визуала, который показывает данные. Как следствие, убрал широкие столбики с заливкой краской, которая не несла никакой информации
  • Вертикальная ось стала равномерной. Ушло искажение — теперь два любых отрезка равной длины обозначают одинаковое количество пирожков. Это помогло увидеть, сколько на самом деле пирожков с конкретной длиной
  • Оси стали показывать размах данных — минимальные и максимальные значения. А еще избавились от ненужных засечек, которые никак не помогали зрителю понять решение задачи
  • Оси обрели понятные подписи. График стал более самостоятельным, его стало проще понять без объяснений автора

Что же было вместо пирожков

Сейчас будет небольшое погружение в программирование. Старался объяснить так, чтобы любой смог понять.

В языке программирования «Питон» есть много функций, которые делают разные вещи: одна читает ввод с клавиатуры, другая вычисляет квадратный корень числа. Каждая функция занимает несколько строчек кода. Каждая строчка — инструкция для компьютера. Например, print('hello') это инструкция «напечатать слово hello в консоль», а return a + b — «вычислить сумму a и b и вернуть это значение».

По следам Тафти: делаю понятный график из двух непонятных

Токен — смысловой кусочек инструкции. Если разобрать последнюю строку на токены, то получится список [return, a, +, b], состоящий из 4 токенов. Будем называть это число длиной строки. То есть длина строки return a + b равна 4, а print('hello') — 2.

Длина пирожка — это «длина функции» — длина самой длинной строки в этой функции. В примере выше она равна 4, а на графике показана горизонтальной осью X. В оригинале ось назвали «Length of the longest line of function».

На вертикальной оси Y показываем количество функций такой длины. В оригинале ось назвали «# of such functions».

Задача поиска оптимальной длины функции родилась из-за ограничений машинного обучения. Если вкратце, то при включении больших длин в данные для обучения, нам не хватит памяти на компьютере, чтобы обучить модель. Оптимальное решение — взять большинство функций, а на редкие и длинные забить.

Что почитать

Если хотите узнать больше про представление количественной информации, рекомендую прочитать книгу Эдварда Тафти «The Visual Display of Quantitative Information».

Статью написал @fed0rus
Отредактировала @sushaislove
Диплом написал @datapaf

77
1 комментарий

Неприятно вам это говорить, но вы изобрели велосипед с квадратными колесами. Любой третьекурсник, прошедший курс теории вероятностей знает как в действительности изображается, то что вы хотели получить. См. функция распределения.

P.S. Больше не читайте Тафти, полезного в этой книге ничего нет...

Ответить