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

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

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

Цели разведочного анализа данных

A. Понимание структуры и характеристик набора данных

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

B. Выявление аномалий и выбросов

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

C. Идентификация связей и корреляций между переменными

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

D. Подготовка данных для дальнейших этапов анализа

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

Инструменты и методы разведочного анализа данных (EDA)

A. Визуализация данных

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

  1. Гистограммы и диаграммы рассеяния

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

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

    Пример Python-кода для построения гистограммы и диаграммы рассеяния:

    import matplotlib.pyplot as plt
    import seaborn as sns
    
    # Генерируем случайные данные
    data = [23, 34, 45, 67, 23, 56, 78, 89, 43, 65, 34, 56, 76]
    
    # Построение гистограммы
    plt.hist(data, bins=10, color='blue', alpha=0.7)
    plt.xlabel('Значения')
    plt.ylabel('Частота')
    plt.title('Гистограмма данных')
    plt.show()
    
    # Построение диаграммы рассеяния
    x = [1, 2, 3, 4, 5, 6, 7, 8]
    y = [15, 25, 30, 40, 50, 60, 70, 80]
    
    plt.scatter(x, y, color='red')
    plt.xlabel('Переменная X')
    plt.ylabel('Переменная Y')
    plt.title('Диаграмма рассеяния')
    plt.show()
    
    Результат кода
    Результат кода
  2. Ящик с усами (box plot)

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

    Пример Python-кода для построения ящика с усами:

    import matplotlib.pyplot as plt
    import seaborn as sns
    
    # Генерируем случайные данные
    data = [23, 34, 45, 67, 23, 56, 78, 89, 43, 65, 34, 56, 76]
    
    # Построение ящика с усами
    plt.boxplot(data)
    plt.ylabel('Значения')
    plt.title('Ящик с усами')
    plt.show()
    
    Результат кода
    Результат кода
  3. Тепловые карты (heatmap)

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

    Пример Python-кода для построения тепловой карты:

    import numpy as np
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    # Генерируем случайные данные
    data = np.random.rand(5, 5)
    
    # Построение тепловой карты
    sns.heatmap(data, annot=True, cmap='YlGnBu')
    plt.title('Тепловая карта')
    plt.show()
    
Результат кода
Результат кода

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

B. Сводные статистики и меры центральной тенденции

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

  • Среднее (Mean): Это сумма всех значений, разделенная на количество значений. Оно представляет общую "среднюю" величину данных.

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

  • Мода (Mode): Это значение, которое встречается наиболее часто в наборе данных. Мода может быть полезна для определения наиболее типичного значения.

Пример Python-кода для расчета среднего, медианы и моды:

import numpy as np
from scipy import stats

# Генерируем случайные данные
data = np.random.randint(1, 100, 20)

# Расчет среднего
mean = np.mean(data)
print("Среднее:", mean)

# Расчет медианы
median = np.median(data)
print("Медиана:", median)

# Расчет моды
mode = stats.mode(data)
print("Мода:", mode.mode[0])

C. Корреляционный анализ

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

  • Положительная корреляция: Если одна переменная увеличивается, другая также увеличивается. Коэффициент корреляции находится в диапазоне от 0 до 1.

  • Отрицательная корреляция: Если одна переменная увеличивается, другая уменьшается. Коэффициент корреляции находится в диапазоне от 0 до -1.

  • Нулевая корреляция: Отсутствие линейной зависимости между переменными. Коэффициент корреляции близок к 0.

Пример Python-кода для расчета коэффициента корреляции:

import numpy as np
import matplotlib.pyplot as plt

# Генерируем случайные данные
x = np.array([1, 2, 3, 4, 5, 6])
y = np.array([2, 3, 4, 4, 5, 7])

# Расчет коэффициента корреляции Пирсона
correlation = np.corrcoef(x, y)[0, 1]
print("Коэффициент корреляции:", correlation)

# Визуализация данных
plt.scatter(x, y)
plt.xlabel('Переменная X')
plt.ylabel('Переменная Y')
plt.title('Диаграмма рассеяния и корреляция')
plt.show()
Результат кода
Результат кода

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

E. Преобразование данных (например, нормализация или стандартизация)

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

  • Нормализация (Normalization): Этот метод масштабирует значения переменных так, чтобы они находились в диапазоне от 0 до 1. Это особенно полезно, когда у нас есть переменные с разными единицами измерения и масштабами.

  • Стандартизация (Standardization): Этот метод преобразует значения переменных так, чтобы их среднее было равно 0, а стандартное отклонение – 1. Он делает распределение более "стандартным" и симметричным.

Пример Python-кода для нормализации и стандартизации данных:

import numpy as np
from sklearn.preprocessing import MinMaxScaler, StandardScaler

# Генерируем случайные данные
data = np.array([[1, 2],
                 [2, 3],
                 [3, 4],
                 [4, 5]])

# Нормализация данных
scaler = MinMaxScaler()
normalized_data = scaler.fit_transform(data)
print("Нормализованные данные:")
print(normalized_data)

# Стандартизация данных
scaler = StandardScaler()
standardized_data = scaler.fit_transform(data)
print("Стандартизованные данные:")
print(standardized_data)

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

D. Анализ выбросов и аномалий

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

Основные шаги анализа выбросов и аномалий:

  • Визуализация данных: Используйте графики, такие как ящик с усами (box plot) или диаграммы рассеяния, чтобы визуально выявить потенциальные выбросы.

  • Статистический анализ: Используйте статистические методы, чтобы определить, какие значения считаются выбросами на основе критериев, таких как интерквартильный размах или Z-оценка.

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

Пример Python-кода для анализа выбросов с использованием ящика с усами:

import numpy as np
import matplotlib.pyplot as plt

# Генерируем случайные данные с выбросами
data = np.array([10, 15, 20, 25, 30, 500])

# Построение ящика с усами
plt.boxplot(data)
plt.ylabel('Значения')
plt.title('Анализ выбросов')
plt.show()
Результат кода
Результат кода

E. Преобразование данных (например, нормализация или стандартизация)

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

  • Нормализация (Normalization): Этот метод масштабирует значения переменных так, чтобы они находились в диапазоне от 0 до 1. Это особенно полезно, когда у нас есть переменные с разными единицами измерения и масштабами.

  • Стандартизация (Standardization): Этот метод преобразует значения переменных так, чтобы их среднее было равно 0, а стандартное отклонение – 1. Он делает распределение более "стандартным" и симметричным.

Пример Python-кода для нормализации и стандартизации данных:

import numpy as np
from sklearn.preprocessing import MinMaxScaler, StandardScaler

# Генерируем случайные данные
data = np.array([[1, 2],
                 [2, 3],
                 [3, 4],
                 [4, 5]])

# Нормализация данных
scaler = MinMaxScaler()
normalized_data = scaler.fit_transform(data)
print("Нормализованные данные:")
print(normalized_data)

# Стандартизация данных
scaler = StandardScaler()
standardized_data = scaler.fit_transform(data)
print("Стандартизованные данные:")
print(standardized_data)

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

Шаги разведочного анализа данных

Давайте рассмотрим каждый шаг.

A. Загрузка и первичный осмотр данных

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

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

import pandas as pd

# Загрузка данных
data = pd.read_csv('sales_data.csv')

# Вывод первых 5 строк таблицы
print(data.head())

B. Обработка пропущенных значений

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

Задача: Допустим, у нас есть пропущенные значения в столбце Цена. Мы решим эту проблему, заполнив пропущенные значения средней ценой продуктов.

mean_price = data['Цена'].mean()
data['Цена'].fillna(mean_price, inplace=True)

C. Анализ распределения переменных

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

Задача: Представим, что нам интересно распределение цен на продукты. Давайте построим гистограмму для этой переменной.

import matplotlib.pyplot as plt

plt.hist(data['Цена'], bins=20, color='blue', alpha=0.7)
plt.xlabel('Цена')
plt.ylabel('Частота')
plt.title('Распределение цен на продукты')
plt.show()

D. Исследование корреляций между переменными

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

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

correlation = data['Цена'].corr(data['Количество'])
print("Корреляция между ценой и количеством продаж:", correlation)

E. Выявление выбросов и аномалий

В этом шаге мы будем искать выбросы и аномалии в данных. Для этого используется визуализация, например, ящик с усами (box plot).

Задача: Давайте определим, есть ли выбросы в столбце Количество (количество продаж продукта). Мы построим ящик с усами для этой переменной.

plt.boxplot(data['Количество'])
plt.ylabel('Количество')
plt.title('Анализ выбросов в количестве продаж')
plt.show()

F. Изучение категориальных переменных

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

Задача: Пусть нас интересует, какие продукты являются наиболее популярными среди покупателей. Давайте построим график частоты продаж для каждого продукта.

product_counts = data['Продукт'].value_counts()
product_counts.plot(kind='bar')
plt.xlabel('Продукт')
plt.ylabel('Частота продаж')
plt.title('Частота продаж продуктов')
plt.xticks(rotation=45)
plt.show()

G. Визуализация результатов EDA

Последний шаг – визуализация результатов всего EDA. Мы объединим несколько графиков для более полного представления.

Задача: Давайте создадим обобщенную визуализаци

ю результатов EDA, включая гистограмму, диаграмму рассеяния и ящик с усами.

plt.figure(figsize=(10, 6))

plt.subplot(2, 2, 1)
plt.hist(data['Цена'], bins=20, color='blue', alpha=0.7)
plt.xlabel('Цена')
plt.ylabel('Частота')
plt.title('Распределение цен на продукты')

plt.subplot(2, 2, 2)
plt.scatter(data['Цена'], data['Количество'], color='green')
plt.xlabel('Цена')
plt.ylabel('Количество')
plt.title('Диаграмма рассеяния между ценой и количеством продаж')

plt.subplot(2, 2, 3)
plt.boxplot(data['Количество'])
plt.ylabel('Количество')
plt.title('Анализ выбросов в количестве продаж')

plt.tight_layout()
plt.show()

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

Заключение

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

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

Комментарии (1)


  1. QtRoS
    06.08.2023 11:52

    Статью следовало бы дополнить парой замечательных Python-библиотек, которые делают базовый EDA за одну строчку кода, например DataPrep