Понимание данных

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

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

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


Что такое понимание данных?

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

  • Какие данные у меня есть?(Структура и типы данных)
  • Каково качество данных?(Являются ли данные чистыми, полными и надёжными?)
  • Что говорят данные?(Какие закономерности, взаимосвязи и распределения скрыты в данных?)

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


Основные шаги и инструменты

Мы будем использовать самую популярную библиотеку для обработки данныхPandasи библиотеку визуализацииMatplotlib/Seabornдля демонстрации.

Перед началом давайте установим следующие библиотеки зависимостей:

pip install pandas matplotlib seaborn

Описание основных библиотек анализа данных pandas:

  • pandas
    Основная библиотека для обработки данных, специализирующаяся на чтении/записи табличных данных, очистке, статистике; поддерживает чтение Excel/CSV и предоставляет таблицу DataFrame.
  • matplotlib
    Низкоуровневая базовая библиотека для построения графиков, основа визуализации в Python; позволяет строить различные базовые графики, такие как линейные, столбчатые и точечные диаграммы, обладает высокой гибкостью, но код довольно многословен.
  • seaborn
    Высокоуровневая библиотека для построения графиков на основе matplotlib, предназначенная для статистических диаграмм; имеет приятные цветовые схемы и позволяет строить графики распределения, тепловые карты и ящичные диаграммы одной строкой кода.

Шаг 1: Первое знакомство — загрузка и обзор

Сначала нам нужно загрузить данные в программу и быстро просмотреть их общий вид.

Для начала скачайте тестовые данные и поместите их в тот же каталог, что и тестовый код Python:

URL для скачивания тестовых данных:https://raw.githubusercontent.com/uiuc-cse/data-fa14/gh-pages/data/iris.csv

Если загрузка через сеть githubusercontent не удалась, можно напрямую нажать на ссылку для скачивания:/static.jyshare.com/download/iris.csv。

Пример

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

# 1. Загрузка данных (здесь в качестве примера используется классический набор данных Iris; вы также можете загрузить собственный CSV-файл)
# Загрузка из локального файла
df = pd.read_csv('iris.csv')

# Загрузка из сети
# url = "https://raw.githubusercontent.com/uiuc-cse/data-fa14/gh-pages/data/iris.csv"
# df = pd.read_csv(url)

# 2. Просмотр первых нескольких строк данных - первое впечатление
print("Первые 5 строк данных:")
print(df.head())
print("\n" + "="*50 + "\n")

# 3. Просмотр общей информации о данных: количество строк, количество столбцов, типы данных, использование памяти
print("Основная информация о наборе данных:")
print(df.info())
print("\n" + "="*50 + "\n")

# 4. Просмотр формы данных (сколько строк, сколько столбцов)
print(f"Форма набора данных: {df.shape}") # Вывод (строки, столбцы)
print(f"Всего {df.shape)

Объяснение кода:

  • df.head(): Словно пролистывая оглавление книги, быстро просмотрите первые несколько строк данных, чтобы понять, как выглядят данные.
  • df.info(): Это "отчёт о медосмотре" данных. Он расскажет вам:
    • Название каждого столбца (Column)
    • Количество непустых значений (Non-Null Count), поэтому можно сразу узнать, есть ли пропущенные значения
    • Типы данных (Dtype), такие какint64(integer),float64(float),object(текстовый или смешанный тип)
  • df.shape: Непосредственно получить размеры таблицы данных.

После выполнения приведённого выше кода вывод будет примерно следующим:

数据的前5行:
   sepal_length  sepal_width  petal_length  petal_width species
0           5.1          3.5           1.4          0.2  setosa
1           4.9          3.0           1.4          0.2  setosa
2           4.7          3.2           1.3          0.2  setosa
3           4.6          3.1           1.5          0.2  setosa
4           5.0          3.6           1.4          0.2  setosa

==================================================

数据集的基本信息:
<class 'pandas.DataFrame'>

Шаг 2: Проверка качества — обнаружение пропущенных значений и аномалий

Данные редко бывают идеальными. К распространённым «болезням данных» относятсяпропущенные значения(некоторые позиции пусты) ивыбросы(некоторые числа аномально велики или аномально малы).

Пример

# 1. Проверка пропущенных значений
print("Количество пропущенных значений по каждому признаку:")
print(df.isnull().sum())
print("\n" + "="*50 + "\n")

# Если пропущенных значений много, можно рассчитать долю пропусков
missing_ratio = df.isnull().sum() / len(df) * 100
print("Доля пропущенных значений по признакам (%):")
print(missing_ratio)
print("\n" + "="*50 + "\n")

# 2. Проверьте статистическую сводку числовых признаков — это может помочь выявить выбросы
print("Статистическое описание числовых признаков:")
print(df.describe())

Объяснение кода:

  • df.isnull().sum(): Вычислить общее количество null-значений (NaN) в каждом столбце.
  • df.describe(): Сгенерировать статистическую сводку числовых столбцов, включая:
    • count: count (можно использовать для перепроверки пропущенных значений)
    • mean: mean
    • std: стандартное отклонение (насколько сильно колеблются данные)
    • min: минимальное значение
    • 25%, 50%(медиана),75%: квартили
    • max: максимальное значение
    • Наблюдаяminиmax, можно предварительно определить, есть ли выбросы(например, столбец возраста, содержащий 200 лет).

Шаг 3: Углубленное понимание - визуализация распределений и взаимосвязей

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

Пример

# Установить стиль графика
sns.set(style="whitegrid")

# 1. Одномерное распределение - понять распределение каждого признака по отдельности
fig, axes = plt.subplots(2, 2, figsize=(12, 8)) # Создать холст 2x2
features = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']
colors = ['skyblue', 'lightgreen', 'salmon', 'gold']

for i, (ax, feature, color) in enumerate(zip(axes.flat, features, colors)):
    # Нарисовать гистограмму (распределение) и кривую оценки ядерной плотности
    sns.histplot(df[feature], kde=True, ax=ax, color=color, bins=20)
    ax.set_title(f'Распределение {feature}', fontsize=14)
    ax.set_xlabel(feature)
    ax.set_ylabel('Частота')

plt.tight_layout()
plt.show()

# 2. Ящичная диаграмма - просмотр распределения данных и выбросов (более наглядно)
plt.figure(figsize=(10, 6))
# Выбрать числовые столбцы для построения ящичной диаграммы
df_box = df.drop(columns=['species']) # Предположим, что 'species' — текстовый столбец меток, удалите его сначала
sns.boxplot(data=df_box)
plt.title('Ящичная диаграмма для каждого числового признака (просмотр распределения и выбросов)', fontsize=14)
plt.xticks(rotation=45)
plt.show()

# 3. Связи между переменными - матрица диаграмм рассеяния
print("\nПостроение матрицы диаграмм рассеяния взаимосвязей признаков... (Это поможет нам обнаружить связи между признаками.)")
# Используйте pairplot из Seaborn, параметр hue может окрашивать по категории (например, виды ириса)
sns.pairplot(df, hue='species', height=2.5)
plt.suptitle('Матрица диаграмм рассеяния взаимосвязей признаков (с окраской по видам)', y=1.02, fontsize=16)
plt.show()

# 4. Тепловая карта корреляций - количественная оценка линейных связей между признаками
plt.figure(figsize=(8, 6))
# Вычислить коэффициент корреляции между числовыми признаками
numeric_df = df.select_dtypes(include=['float64', 'int64'])
correlation_matrix = numeric_df.corr()
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', center=0, square=True)
plt.title('Тепловая карта корреляций признаков', fontsize=14)
plt.show()

Пояснение к графику:

  • Гистограмма: показывает, как распределены значения признака (например, длина лепестка). Сконцентрированы ли они в определённом интервале или разбросаны?
  • Ящичная диаграмма:
    • Линия в середине ящика обозначаетмедиану。
    • Верхняя и нижняя границы ящика представляют25-й (Q1) и 75-й (Q3) процентили。
    • «Усы», идущие вверх и вниз, обычно представляют разумный диапазон (от Q1 - 1.5 IQR до Q3 + 1.5 IQR).
    • Отдельные точки, вероятно, являютсявыбросами!
  • Матрица диаграмм рассеяния: позволяет одновременно увидеть взаимосвязь между любыми двумя признаками. Если точки образуют полосовидное распределение, они могут быть коррелированы.
  • Тепловая карта корреляций: точно представляет степень линейной корреляции между двумя признаками с помощью цветов и чисел (от -1 до 1).
    • 1: Идеальная положительная корреляция (одно увеличивается, другое также увеличивается)
    • -1: Идеальная отрицательная корреляция (одна увеличивается, другая уменьшается)
    • 0: Линейная связь отсутствует

Результат этапа понимания данных: отчёт об исследовании данных

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

Отчёт об исследовании набора данных Iris

Обзор данных: Всего 150 образцов, 5 признаков (4 числовых признака: длина и ширина чашелистика/лепестка; 1 категориальная метка: вид).

Качество данных: Пропущенных значений нет; все числовые признаки находятся в разумных биологических диапазонах; явных выбросов не обнаружено.

Выводы по данным:

  • Длина лепестка (petal_length) и ширина лепестка (petal_width) имеют чрезвычайно высокую корреляцию (>0.96), что может указывать на информационную избыточность.
  • Различные виды Iris чётко различаются по размеру лепестков, и на диаграмме рассеяния наблюдается чёткая кластеризация.
  • Ширина чашелистика (sepal_width) распределение приблизительно нормальное.
Другие расширения