Полное практическое руководство по тестированию предположений о данных (MCAR, MAR, MNAR, центральная тенденция, асимметрия и выбросы) в Python.

Визуализация данных и статистика

Большая часть нашей работы с данными включает 70 % описательной аналитики, 10 % аналитической аналитики, а оставшиеся 20 % — прогнозную и предписывающую аналитику. Описательная аналитика может дать ответ на то, что происходит на рынке. Например, если мы работаем в розничном магазине, мы хотели бы определить их месячные продажи, количество клиентов, рост, чистую прибыль, источник бизнеса (скажем, новых и существующих клиентов) и множество других KPI. Все эти KPI можно рассчитать и представить визуально с помощью любого инструмента бизнес-аналитики (BI), такого как Power BI, Tableau, Qlik Sense, или даже с помощью комбинации Excel и PowerPoint. Тогда зачем нам Python и его возможности визуализации?

Создание эстетически привлекательных визуализаций в Python является сложной задачей, учитывая ограничения пакетов и воспроизводимых графиков. Matplotlib (с использованием Pyplot), Seaborn и Plotly (plotly.express) могут генерировать большинство статистических графиков в Python. Основное ограничение этих пакетов заключается в их гибкости форматирования, поэтому они не предпочтительны по сравнению с инструментами BI для описательного анализа. Хотя Seaborn не создает метки данных автоматически, Plotly не поддерживает всю возможную визуализацию в Python. Matplotlib формирует основу всех визуализаций и работает в трехуровневой архитектурной системе: «Бэкенд-уровень», «Уровень исполнителя» и «Уровень сценариев». позволяя пользователям управлять макетом и форматированием. Тем не менее, это связано с большими затратами на сложное кодирование, которого многие пользователи избегают.

Какое место занимают статистика и Python?

В Python есть пакеты, которые позволяют пользователям изучать свойства данных и принимать соответствующие меры перед построением какой-либо прогностической модели. Статистические модели, такие как линейная регрессия, логистическая регрессия, наивные байесовские классификаторы и даже задачи на основе кластеризации, делают предположения о данных. Мы можем использовать графики для проверки этих предположений перед построением модели. Эти графики используют описательную статистику в качестве основы. Мы обсудим это по крупицам. Вы можете найти набор данных, использованный для этого анализа, в Kaggle с лицензией Public Domain, что означает, что он доступен для всех. В этой статье мы рассмотрим следующие понятия:

  1. Отсутствующее значение и корреляция отсутствующих значений — Измерение случайности отсутствующих значений.
  2. Асимметрия данных с использованием распределения данных
  3. Выбросы и лестница Тьюки
  4. Коэффициент корреляции Пирсона — понимание мультиколлинеарности

Данные, используемые в этом анализе, состоят из следующих атрибутов — «Имя», «Собственность», «Страна», «Источник», «Ранг», «Возраст» и «Отрасль» миллиардеров.

#---------------------Importing packages for visualization----------------
import pandas as pd #---Pandas for dataframe
import numpy as np #---Numpy for manipulation; Not used in this analysis
import seaborn as sns #---Seaborn for graphs
import matplotlib.pyplot as plt #---Pyplot for canvas (e.g. figure size, title, x and y axis ranges etc.)
sns.set(color_codes=True)
%matplotlib inline
#With this backend, the output of plotting commands is displayed inline within frontends like the Jupyter notebook, 
#directly below the code cell that produced it. The resulting plots will then also be stored in the notebook document.
data_MM=pd.read_csv('Billionaire - 2021.csv')
data_MM.head()

1. Понимание пропущенных значений

Отсутствующие значения часто называют атрибутами, которые не были введены или были потеряны в процессе сбора данных. К отсутствующим значениям можно отнести несколько причин, включая процедуры ручного ввода данных, ошибки оборудования и неправильные измерения. Python рассматривает отсутствующие значения как NA/Null/NaN и автоматически игнорирует их для описательной аналитики. Например, когда мы создаем гистограмму на исходных данных для анализа количества миллиардеров по отраслям, любые отсутствующие имена в данных будут игнорироваться при создании графика подсчета. Однако предположим, что одни и те же отсутствующие значения используются в качестве входных данных для построения модели кластеризации или регрессии. В этом случае Python выдаст ошибку, поскольку большинство встроенных пакетов статистического моделирования не могут обрабатывать отсутствующие значения. Мы можем использовать следующее для проверки пропущенных значений:

data_MM.info()
data_MM.isnull().sum()

Визуальное представление этих отсутствующих значений можно создать с помощью пакета missingno.

!pip install missingno
import missingno as ms
plt.title("Missing Values", fontsize=20);
ms.bar(data_MM);

Как видите, у нас есть только один атрибут «Возраст», в котором отсутствуют некоторые записи.

  1. Первый подход заключается в отбрасывании записей с пропущенными значениями в их атрибутах. В эту категорию включено удаление атрибутов с более высокими отсутствующими значениями. Однако выбор такой методики зависит от процента данных, удаленных из анализа. Если процент ниже, то пользователь может принять вызов об удалении отсутствующих атрибутов, в противном случае требуется какая-либо форма вменения.
  2. В другом подходе используются процедуры максимального правдоподобия, при которых параметры модели для полной части данных оцениваются, а затем используются для вменения с использованием выборки. К ним относятся максимизация ожидания, множественные вменения, байесовский анализ главных компонентов и т. д.
  3. Наконец, вменение пропущенных значений — это класс процедур, целью которых является заполнение пропущенных значений оценочными значениями. В большинстве случаев атрибуты набора данных не являются независимыми друг от друга. Таким образом, идентифицируя отношения между атрибутами, можно определить недостающие значения. Это также требует знания предметной области и бизнес-правил, которые можно использовать для исправления отсутствующих значений.

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

  • Полное случайное отсутствие (MCAR): отсутствие не имеет отношения ни к каким значениям, наблюдаемым или отсутствующим.
  • Случайные пропущенные данные (MAR): существует систематическая связь между пропущенными данными и другими наблюдаемыми данными, но не пропущенными данными.
  • Отсутствие не случайно (MNAR): существует взаимосвязь между отсутствием и его значениями, отсутствующими или неотсутствующими.
#---------------------------------------Plotting data using msno----------------------------
ms.heatmap(data_MM,figsize=(10,8), fontsize=12);
plt.title("Missing Number Correlation Plot");

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

2. Неравномерность данных

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

  • Среднее значение › Медиана: Положительное или смещенное вправо распределение
  • Среднее = медиана: нулевая асимметрия или симметричное распределение
  • Среднее ‹ Медиана: отрицательное или смещенное влево распределение

data_MM['Age'].skew()

Выход: 0,045

data_MM[‘Age’].mean()

Выход: 63,11

data_MM['Age'].median()

Выход: 63,0

Как мы можем видеть, что Среднее значение > Медиана, данные искажены вправо с асимметрией 0,04. Поскольку асимметрия очень мала, ~0, график распределения показывает почти нормальное распределение.

plt.figure(figsize=(8,7))
sns.distplot(data_MM['Age']);
plt.title("Distribution plot for Age:");

Часто график распределения всех данных может не давать правильной картины. Поскольку sns.displot() не позволяет нам разбивать данные по категориям, мы можем создать график скрипки, используя catplot. Обратите внимание, что мы не можем использовать pyplot и figsize для установки высоты и ширины холста, поэтому мы используем параметр высоты внутри catplot.

sns.catplot(x="Age", y="Industry",
            kind="violin", data=data_MM, height=12);
plt.title("Distribution plot for Age:");

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

Линейные модели (регрессия и логистика) используют «нормальное распределение данных» в качестве одного из основных предположений. Модели глубокого обучения, такие как искусственная нейронная сеть, также используют параметрические уравнения, предполагая, что данные нормально распределены.

3. Выбросы

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

Среднее значение рассчитывается как:

Медиана рассчитывается как:

Квартили Q1 и Q3 рассчитываются как:

Например, рассмотрим следующий набор чисел: время в секундах, затраченное 11 учащимися на решение головоломки, указано в порядке 7, 12, 13, 17, 18, 20, 22, 24, 25, 30, 45. Поскольку 𝑛 равно 11 в этой постановке задачи, 𝑞 всегда будет 0. Поскольку (𝑛+1) равно 12, MOD 4 равно 0, следовательно, для 𝑘=1 p=floor(1x (12/4)), что равно 3. Для K=3 p=floor( 3x (12/4)), что равно 9.Следовательно, Q1 = Xp или X3 , 13 из приведенного выше списка, а Q3 равно X9, 25.

Межквартильный диапазон (IQR) = Q3 — Q1

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

  1. Нижний ус = Q1–1,5 x IQR
  2. Верхний ус = Q3 + 1,5 x IQR
data_MM['Age'].describe()
count    2676.000000
mean       63.113602
std        13.445153
min        18.000000
25%        54.000000
50%        63.000000
75%        73.000000
max        99.000000

В приведенном выше примере Q3 = 75% или 75-й процентиль = 73, а Q1 = 25% или 25-й процентиль = 54. IQR = 73–54 = 19. Нижний ус = 54–1,5x19 = 25,5 и верхний ус = 73 + 1,5. х 19 = 101,5

plt.figure(figsize=(15,7))
sns.boxplot(x = ‘Age’, data = data_MM, showmeans=True)
plt.title(“Boxplot for Age”)
plt.show()

plt.figure(figsize=(30,9))
sns.boxplot(y = 'Age', x="Industry", data = data_MM, showmeans=True)
plt.title("Boxplot for Age")
plt.show()

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

  • Winsorization — закрытие выбросов нижними и верхними усами. Эти усы определяются IQR или даже стандартным отклонением (например, +-2/3 стандартного отклонения).

  • Лестница сил Тьюки. Для любых искаженных данных, если мы создадим график между двумя переменными X и Y (скажем, Возраст и Нетворт, нам нужно преобразовать Нетворта в числовой), форму графика можно использовать для определения типа преобразования. на данные.

data_MM['Value']=data_MM['NetWorth'].apply(lambda x: x.replace("$","").split()[0])
data_MM['Value']=data_MM['Value'].astype('float')
data_MM.head()
plt.figure(figsize = (15,8));
sns.scatterplot(x="Age", y="Value", data=data_MM);

Коэффициент корреляции Пирсона — понимание мультиколлинеарности

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

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

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

correlation = data_MM.corr().round(2) # creating a 2-D Matrix with correlation plots
correlation
plt.figure(figsize = (15,8)) #figsize=(width,height)
sns.heatmap(correlation, annot=True, cmap='vlag_r', vmin=-1, vmax=1); #color palette

В отличие от ковариации, коэффициент корреляции не зависит от масштаба и может принимать значения от -1 до +1. Значение ближе к -1 указывает на отрицательную корреляцию между переменными. Например, корреляция между Rank и Value равна -0,48. Это указывает на то, что по мере увеличения значения ранг уменьшается (что будет выше, поскольку ранг 1 считается самым высоким).

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

Ссылка

  1. Каггль. (н.д.). Forbes Billionaires 2021 года. Получено 20 января 2022 года с веб-сайта kaggle.com: https://www.kaggle.com/roysouravcu/forbes-billionaires-of-2021?select=Billionaire.csv.

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