Визуализация данных обучения по-разному

Простые принципы для более быстрого изучения визуализации

Я считаю, что ключевая сила Medium как платформы для письма - это ее простота. Средний упрощает написание до такой степени, что заставляет авторов сосредотачиваться на содержании, а не на размере и стиле шрифта.

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

Типичная визуализация данных представляет собой три вещи:

  • информация - что нам говорит цифра
  • эстетика - как красиво выглядит
  • стиль - как он устроен

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

Общая ценность (100) = Информация (80) + Эстетика (10) + Стиль (10)

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

Если мы хотим снизить барьеры для входа в науку о данных, это область, которая требует некоторого внимания.

Ладно, хватит философии, вернемся к работе!

Визуальное представление данных служит двум целям:

а) он показывает, как отдельная переменная распределяется относительно ее центральной тенденции и дисперсии;

б) как одна переменная изменяется по отношению к одной или нескольким другим переменным в пространстве признаков.

Давайте сделаем несколько примеров с библиотекой Pythonseaborn. Конечно, мы держимся подальше от эстетики и стиля и фокусируемся на ключевой цели - информации.

Импортируем знакомые библиотеки:

import pandas as pd
import nunpy as np
import seaborn as sns
import matplotlib.pyplot as plt

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

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

df = sns.load_dataset("tips")
df.head()

df.info()

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

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

Итак, вот план на оставшуюся часть этой статьи:

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

Визуализация одной переменной

Как я только что сказал, визуализация ОДНОЙ переменной говорит нам, как она распределяется относительно центральной тенденции и дисперсии (например, среднего, медианного, квартилей и т. Д.).

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

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

Гистограмма

sns.distplot(df["total_bill"], kde=False)

KDE сюжет

sns.kdeplot(df["total_bill"])

Boxplot

sns.boxplot(df["total_bill"])

Сюжет для скрипки

sns.violinplot(df["total_bill"])

Визуализация двух переменных

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

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

Корреляционная диаграмма

Диаграмма рассеяния показывает, как одна переменная распределяется по отношению к другой переменной, и представляет собой простейшую форму двумерных графиков, которые сразу же выявляют ценную информацию, которая также видна «закрытым глазам».

sns.scatterplot(x="total_bill", y='tip', data=df)

Линейная модель

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

sns.lmplot(x="total_bill", y="tip", data=df)

Boxplot

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

sns.boxplot(x='time', y='tip', data=df)

Сюжет роя

Коробчатая диаграмма выше хороша, но диаграммы роя могут показать каждую точку данных и их распределение. Вы теряете некоторую статистическую информацию, как на коробчатых диаграммах, но получаете что-то другое! Таким образом, они могут дополнять друг друга во время исследовательского анализа данных (EDA).

sns.swarmplot(x='time', y='tip', data=df)

Сюжет для скрипки

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

sns.violinplot(x='time', y='tip', data=df)

Barplot

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

sns.barplot(x='time', y='tip', data=df)

3) Визуализация нескольких переменных

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

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

Давайте рассмотрим несколько графиков ниже.

Диаграмма рассеяния с оттенком (цветом)

На диаграмме рассеяния мы можем разделить разные категории (например, мужские и женские) с разными оттенками цвета (так называемый параметр «оттенок»).

Итак, у нас есть 3 переменные: tip, total_bill и пол.

sns.scatterplot(x="total_bill", y='tip', data=df, hue='sex')

Диаграмма рассеяния с оттенком + стиль

Поверх приведенного выше графика мы могли бы добавить еще одну переменную, разделенную параметром «style».

Теперь у нас есть 4 переменные: чаевые, total_bill, пол, время посещения.

Отлично, но как вы можете отслеживать и интерпретировать всю эту информацию на одном 2D-графике?

sns.scatterplot(x="total_bill", y='tip', data=df, hue='sex', style='time')

Диаграмма рассеяния с оттенком + стилем + размером

Мы можем стать еще безумнее и добавить параметр «размер» для еще одной переменной. Мы можем продолжить, но на этом этапе вы, должно быть, потерялись, если пытаетесь интерпретировать суть этого сюжета!

Я пытаюсь подчеркнуть следующее: просто потому, что вы можете, вам не следует пытаться выполнить слишком много вещей за одну визуализацию. После определенного момента он становится мусором! Как я сказал в начале, простота имеет значение.

Но есть законные способы показать несколько переменных, и для этого мы можем вернуться к нашему коробочному графику, сюжету скрипки и сюжету роя. Они отлично работают в 2D-графике для представления нескольких переменных.

Boxplot

sns.boxplot(x='time', y='tip', data=df, hue='sex')

Сюжет для скрипки

sns.violinplot(x='time', y='tip', data=df, hue='sex', split=True)

Swarmplot

sns.swarmplot(x='time', y='tip', data=df, hue='sex')

Я мог бы продолжить, но вы поняли.

Резюме и заключительное слово

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

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

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

Надеюсь, это был полезный пост. Если у вас есть комментарии, не стесняйтесь записывать их ниже. Вы можете подписаться на меня в Medium, Twitter или LinkedIn.

Удачного построения!