Ключ к проверке гипотез для категориальных переменных

Вступление

Статистика хи-квадрат - полезный инструмент для понимания взаимосвязи между двумя категориальными переменными.

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

Отток клиентов

Давайте рассмотрим хи-квадрат через призму оттока клиентов.

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

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

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

churn <- churn %>%
  select(customerID, StreamingTV, Churn)%>%
  mutate(StreamingTV = ifelse(StreamingTV == 'Yes', 1, 0))

Отток будет классифицирован как «Да» или «Нет». Как вы только что видели, StreamingTV будет закодирован либо с помощью 1, либо 0.

Исследовательский анализ данных

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

Таблицы пропорций

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

table(churn$StreamingTV)
table(churn$Churn)

round(prop.table(table(churn$StreamingTV)),2)
round(prop.table(table(churn$Churn)),2)

Таблица дает нам быстрое представление о счетах на любом заданном уровне, а упаковка в prop.table() позволяет нам увидеть процентную разбивку.

Давайте теперь передадим обе переменные нашей table() функции

table(churn$StreamingTV, churn$Churn)
round(prop.table(table(churn$StreamingTV, churn$Churn),1),2)

После того, как вы передадите другую переменную в таблицу пропорций, вы сможете определить, где вы хотите оценивать относительную пропорцию. В этом случае второй параметр, который мы передаем функции prop.table(), '1', указывает, что мы хотели бы видеть относительную долю записей в каждой строке или значении StreamingTV. Как вы можете видеть в приведенной выше таблице, в случаях, когда у клиента не было потокового телевидения, они оставались активными 76% времени, и наоборот, если у них было потоковое телевидение, они фактически оставались менее на 70%.

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

Время визуализировать

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

Начнем с быстрой панели с StreamingTV по оси x и заливкой Churn.

churn %>%
  ggplot(aes(x = StreamingTV, fill = Churn))+
  geom_bar()

Как видите, почти столько же телестримов отозвалось, а общее количество клиентов существенно снизилось. Подобно тому, что мы видели в таблицах пропорций, 100% составная полоса помогает оценить относительное распределение между значениями категориальной переменной. Все, что нам нужно сделать, это передать position = 'fill' в geom_bar().

churn %>%
  ggplot(aes(x = StreamingTV, fill = Churn))+
  geom_bar(position = 'fill')

Погружение в статистику хи-квадрат

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

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

Хи-квадрат Объяснение

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

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

Итак, обо всем по порядку, нам нужен набор данных, чтобы представить указанную независимость.

Создание нашего образца набора данных

Мы будем использовать пакет infer. Этот пакет невероятно полезен для создания выборок данных для проверки гипотез, создания доверительных интервалов и т. Д.

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

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

churn_perm <- churn %>%
  specify(Churn ~ StreamingTV) %>%
  hypothesize(null = "independence") %>%
  generate(reps = 1, type = "permute")

Давайте быстро взглянем на этот набор данных.

head(churn_perm)

Как видите, у нас есть две указанные нами переменные, а также replicate. Все записи в этой таблице будут реплицированы: 1, так как мы сделали только одну репликацию.

Образцы резюме

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

churn_perm %>%
  ggplot(aes(x = StreamingTV, fill = Churn))+
  geom_bar(position = 'fill')

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

В чем может быть цель?

Если мы создадим этот образец набора данных много раз, увидим ли мы когда-нибудь разрыв в размере от 70% до 76%, как мы видели в нашем наблюдаемом наборе данных? Если да, то как часто мы это видим? Неужели так часто у нас нет оснований относить разницу к чему-то большему, чем случайный шум?

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

Давайте посчитаем

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

Формула для указанного «расстояния» выглядит так:

sum(((obs - sample)^2)/sample)

  1. Мы вычитаем наблюдаемое из нашей выборки,
  2. но выровняйте их так, чтобы они не компенсировали друг друга.
  3. Мы делим их на количество образцов, чтобы предотвратить слишком большое присутствие любой отдельной ячейки из-за ее размера.
  4. и наконец мы берем сумму.

Мы получаем статистику хи-квадрат: 20,1.

Так здорово. Мы понимаем цель статистики хи-квадрат, у нас она даже есть ... но мы все еще не знаем ... имеет ли значение показатель хи-квадрат 20,1?

Проверка гипотезы

Ранее в этом посте мы говорили о том, как мы можем использовать пакет infer для создания множества-многих реплик. Проверка гипотез - это как раз то время, когда для этого типа выборки.

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

churn_null <- churn %>%
  specify(Churn ~ StreamingTV) %>%
  hypothesize(null = "independence") %>%
  generate(reps = 500, type = "permute") %>%
  calculate(stat = "Chisq")
churn_null

Основываясь на приведенном выше выводе, вы можете видеть, что каждый replicate имеет свой собственный stat.

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

churn_null %>%
ggplot(aes(x = stat)) +
  geom_density()

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

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

churn_null %>%
ggplot(aes(x = stat)) +
  geom_density() +
  geom_vline(xintercept = obs_chi_sq, color = "red")

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

Расчет P-значения

В заключение этого урока о том, как использовать статистику хи-квадрат, давайте поговорим о том, как нам следует рассчитывать p-значение.

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

В этом суть p-value.

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

churn_null %>%
  summarise(p_value = 2 * mean(stat >= obs_chi_sq))

В случае с нашей выборкой мы получаем значение p, равное 0. Если сказать, что в течение 500 повторений мы никогда не превышали показатель хи-квадрат, равный 20,1.

Таким образом, мы бы отвергли нулевую гипотезу о том, что отток и потоковое телевидение независимы.

Заключение

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

Всего за несколько минут мы рассмотрели:

  • Немного EDA для пар категориальных переменных
  • Таблицы пропорций
  • Гистограммы
  • 100% сложенный бар
  • Хи-квадрат объяснение и цель
  • Как рассчитать статистику хи-квадрат
  • Проверка гипотез с помощью infer
  • Расчет p-значения

Если это было полезно, не стесняйтесь проверить мои другие сообщения на datasciencelessons.com. Поздравления с наукой о данных!