Вы должны быть благоразумны в том, как вы отображаете результаты groupby, иначе ваша аудитория может получить ложные выводы из ваших данных.

Одна из самых важных задач ученых, занимающихся данными, — эффективно донести информацию о сложных данных до своей аудитории. Это включает в себя обобщение данных и представление «общей картины», так сказать. Иными словами, было бы совершенно бесполезно представлять вашей аудитории гигантскую таблицу необработанных данных.

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

Введите популярную функцию groupby в Pandas — популярный среди пользователей Python метод создания сводных данных. Было написано много статей об общем использовании и применении groupby , но сегодня я хочу изучить более тонкий вопрос. Если вы невнимательно относитесь к тому, как вы отображаете свои данные после их группировки, вы можете непреднамеренно ввести свою аудиторию в заблуждение, заставив ее поверить в то, что не соответствует действительности.

Краткий обзор GroupBy

Прежде чем перейти к основной теме этой статьи, я кратко расскажу, как работает groupby. Технически то, что большинство программистов делают при использовании этой функции, лучше назвать «группировкой и агрегированием». Принцип работы groupby заключается в том, что он берет столбец для формирования ваших групп, а затем объединяет другие столбцы, которые вы выбираете, с помощью определенной функции.

Это немного сложное предложение. Проиллюстрируем это на примере. Скажем, у нас есть следующий DataFrame с именем grades, который содержит информацию об оценках студентов на разных курсах колледжа:

Теперь предположим, что нам интересно узнать максимальные промежуточные баллы за каждый год. Следующий код использует groupby для выполнения этой задачи:

grades.groupby('Year')[['Midterm Score']].max()

Некоторые ключевые моменты из приведенного выше фрагмента кода:

  • Столбец, по которому мы группируем, — 'Year'. Программно это означает, что этот столбец становится новым индексом DataFrame. Концептуально это означает, что любая следующая статистика, которую мы укажем, будет вычислена после группировки значений на основе этого столбца.
  • После группировки мы выбираем столбец, который хотим агрегировать, используя [['Midterm Score']] . Причина, по которой мы используем двойные скобки, заключается в том, что наш код возвращает DataFrame, а не серию.
  • На данный момент, под капотом, Pandas определил два мини-DataFrames, которые выглядят примерно так (обратите внимание, что вы не можете увидеть их в явном виде очень легко; это требует некоторой манипуляции с базовыми объектами groupby):

  • Наконец, .max() выбирает максимальное значение из каждого из них (т. е. объединяет все значения для каждой уникальной группы в одно, в соответствии с функцией агрегирования) и объединяет их обратно в сгруппированный агрегированный DataFrame, который мы видим выше.
  • Более полный синтаксис для выполнения той же задачи — grades.groupby('Year')[['Midterm Score']].agg(max) . Это синтаксис, который вам нужно использовать, если вы хотите использовать определяемую пользователем функцию, а не встроенную.

Итак, давайте перейдем к основной теме.

Почему GroupBy может ввести в заблуждение, если вы не будете осторожны

Вы заметите, что в приведенном выше примере я извлек промежуточные оценки до того, как агрегировал значения с помощью функции max. Очевидная причина этого заключалась в том, чтобы не усложнять и сосредоточиться на одном столбце для иллюстрации.

Однако основная причина заключалась в том, что невыполнение этого требования приводит к точно такому результату, который может ввести в заблуждение. Давайте посмотрим на пример. Мы используем тот же grades DataFrame, что и выше, но на этот раз запустим следующий фрагмент кода:

grades.groupby('Year').max()

Это дает нам следующий DataFrame в качестве вывода:

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

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

Для такого человека приведенный выше DataFrame, кажется, подразумевает, что есть первокурсник, который заработал 97 баллов в середине семестра и 99 баллов в финале. Однако, если мы вернемся к исходным данным, это не так. Два разных студента получили эти баллы, и они оказались максимальными баллами для каждого соответствующего экзамена.

Это важное наблюдение. Когда вы объединяете несколько столбцов как часть вашей группы, Pandas обрабатывает их по отдельности. Таким образом, новые столбцы могут совпадать друг с другом, а могут и не совпадать. Выше, например, на самом деле есть второкурсник, набравший 88 и 100 баллов соответственно.

Проблема станет еще более заметной, если мы добавим в микс больше столбцов. Ниже у нас тот же DataFrame, что и раньше, за исключением того, что он также включает имена учеников:

Давайте запустим тот же код на этом новом DataFrame с именем grades_with_names:

grades_with_names.groupby('Year').max()

Теперь похоже, что есть второкурсница по имени Зендая, которая набрала 88 баллов в промежуточном экзамене и 100 баллов в финале. На самом деле есть второкурсница по имени Зендая, но это не ее оценки. В качестве примечания: если вам интересно, почему max вообще работает в столбце 'Names', это потому, что он рассматривает более поздние буквы в алфавите как «больше».

Приведенные выше примеры показывают, как в большинстве случаев лучше изолировать конкретный столбец при агрегировании как части вашего groupby . Если вы решите не делать этого по какой-либо причине, вы должны предельно четко заявить об этом тому, кто может просмотреть ваши данные в будущем.

Последние мысли

Как специалисты по данным, важно тщательно обдумывать информацию, которую мы передаем аудитории. Часто очень легко не заметить непреднамеренно вводящие в заблуждение данные, когда мы работаем с ними так долго. Наш разум достаточно знаком с данными, чтобы избежать обмана.

Однако для нашей аудитории это не так. Многие из них увидят данные впервые, и мы несем ответственность за то, чтобы то, что им показано, было точным и легко интерпретируемым.

Поскольку groupby является одним из основных способов обобщения данных в Pandas, уместно знать о его внутренней работе, прежде чем широко его использовать. Когда кто-то впервые объяснил мне вышеупомянутую проблему, это оказалось чрезвычайно полезным в отношении того, как я думаю о представлении данных. Я надеюсь, что это может быть полезно и для вас.

До следующего раза, ребята!

Хотите преуспеть в Python? Получите эксклюзивный бесплатный доступ к моим простым и понятным руководствам здесь.

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