Объяснение кросс-таблицы в Pandas

Open in Colab


telegram

Введение

Pandas предлагает несколько вариантов группировки и обобщения данных, но такое разнообразие вариантов может быть как благословением, так и проклятием. Все эти подходы являются мощными инструментами анализа данных, но не всегда понятно, использовать ли groupby, pivot_table или crosstab для построения сводной таблицы.

Поскольку я ранее рассматривал pivot_tables, в этой статье будет обсуждаться функция crosstab, объяснено ее использование и показано, как ее можно использовать для быстрого суммирования данных.

оригинал статьи Криса по ссылке

Обзор

Функция crosstab создает таблицу кросс-табуляции, которая может показать частоту, с которой появляются определенные группы данных.

В качестве быстрого примера в следующей таблице показано количество двух- или четырехдверных автомобилей, произведенных различными автопроизводителями:

cross_tab

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

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

Давайте начнем с импорта всех необходимых модулей:

Теперь прочитаем набор данных об автомобилях из репозитория машинного обучения UCI и внесем для ясности некоторые изменения в наименование меток.

Этот набор данных из автомобильного ежегодника Уорда 1985 года состоит из трех типов записей: (а) спецификация автомобиля с точки зрения различных характеристик, (б) присвоенный ему рейтинг страхового риска, (в) его нормализованные потери при использовании по сравнению с другими автомобилями.

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

В качестве первого примера давайте воспользуемся crosstab, чтобы посмотреть, сколько различных стилей кузова изготовили эти автопроизводители в 1985 году (год, который содержится в этом наборе данных):

Функция crosstab может работать с массивами numpy, т.е. с series или столбцами во фрейме данных.

В этом примере я передаю df.make для индекса кросс-таблицы и df.body_style для столбцов кросс-таблицы. Pandas подсчитывает количество вхождений каждой комбинации. Например, в этом наборе данных Volvo производит 8 седанов и 3 универсала.

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

Во-первых, мы можем использовать groupby, а затем unstack, чтобы получить те же результаты:

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

Также можно сделать что-то подобное с помощью pivot_table:

Обязательно прочтите мою статью о pivot_tables, если хотите понять, как это работает.

По-прежнему остается вопрос, зачем вообще использовать функцию crosstab?

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

Более длинный ответ: бывает сложно запомнить все шаги для самостоятельного выполнения.

По моему опыту, важно знать о вариантах и использовать тот, который наиболее естественным образом вытекает из анализа.

У меня был опыт, когда я пытался написать решение на основе pivot_table, а затем быстро получил то, что хотел, используя crosstab.

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

Углубляемся в кросс-таблицу

Одна из распространенных потребностей в кросс-таблице - это включение промежуточных итогов.

Мы можем добавить их с помощью ключевого слова margins:

Ключевое слово margins указало pandas добавлять Total (итог) для каждой строки, а также итог внизу.

Я также передал значение в margins_name при вызове функции, потому что хотел обозначить результаты Total вместо значения по умолчанию All.

Во всех этих примерах подсчитывались отдельные случаи комбинаций данных.

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

Используя aggfunc='mean' и values=df.curb_weight, мы говорим pandas применить функцию mean к весу снаряжения для всех комбинаций данных. Под капотом pandas группирует все значения вместе по make и body_style, а затем вычисляет среднее значение. В тех областях, где нет машины с такими значениями, отображается NaN. В этом примере я также округляю результаты.

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

Эта таблица показывает нам, что 2.3% от общей численности населения составляют хардтопы Toyota, а 6.25% - седаны Volvo.

Параметр normalize еще умнее, т.к. он позволяет выполнять сводку отдельно для столбцов или строк.

Например, если мы хотим увидеть, как стили корпуса распределяются по маркам:

Взглянув только на колонку кабриолетов, можно увидеть, что 50% автомобилей с откидным верхом производится Toyota, а остальные 50% - Volkswagen.

Мы можем сделать то же самое по строкам:

Это представление данных показывает, что из автомобилей Mitsubishi в этом наборе данных 69.23% - это хэтчбеки, а оставшаяся часть (30.77%) - седаны.

Я надеюсь, вы согласитесь с тем, что эти приемы могут быть полезны во многих видах анализа.

Группировка

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

Например, если мы хотим увидеть, как данные распределяются по переднему приводу (fwd) и заднему приводу (rwd), мы можем включить столбец drive_wheels, включив его в список допустимых столбцов во втором аргументе crosstab:

То же самое можно сделать и с индексом:

Я ввел пару дополнительных параметров для управления способом отображения вывода.

Во-первых, я задал определенные rownames и colnames, которые хочу включить в вывод. Это чисто для целей отображения, но может быть полезно, если имена столбцов во фрейме данных не конкретны.

Затем я использовал dropna=False в конце вызова функции. Причина, по которой я это включил, состоит в том, что я хотел убедиться, что включены все строки и столбцы, даже если в них все нули. Если бы я не включил его, то последний Volvo, двухдверный ряд, был бы исключен из таблицы.

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

Приведу еще несколько примеров с различными параметрами:

Перейдем к заключительной части статьи.

Визуализация

В последнем примере я соберу все воедино, показав, как выходные данные кросс-таблицы могут быть переданы на тепловую карту Seaborn, чтобы визуально обобщить данные.

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

К счастью, Seaborn позволяет взять результат кросс-таблицы и визуализировать его:

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

Шпаргалка

Чтобы собрать все воедино, вот памятка, показывающая, как использовать все компоненты функции crosstab.

Вы можете скачать PDF-версию по ссылке.

Заключение

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