Python для анализа данных: NumPy, Pandas и Matplotlib

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

1. Основы вычислительной математики и работа с многомерными массивами ndarray в библиотеке NumPy

Основы вычислительной математики и работа с многомерными массивами ndarray в библиотеке NumPy

Добро пожаловать в курс «Python для анализа данных»! Мы начинаем наше погружение в мир Data Science с фундаментальной библиотеки, на которой держится практически вся экосистема научного Python. Речь пойдет о NumPy.

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

Почему Python нужен NumPy?

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

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

NumPy (Numerical Python) решает эту проблему. Основная часть этой библиотеки написана на языках C и C++, что позволяет выполнять вычисления с невероятной скоростью, сохраняя при этом удобный синтаксис Python.

!Сравнение организации памяти: список Python хранит ссылки на объекты, тогда как NumPy хранит данные в непрерывном блоке памяти.

Ключевые преимущества NumPy:

  • Скорость: Операции векторизованы (выполняются над всем массивом сразу без явных циклов Python).
  • Память: Массивы NumPy занимают меньше места, так как хранят данные одного типа.
  • Функциональность: Огромная коллекция функций линейной алгебры, генерации случайных чисел и преобразований Фурье.
  • Основа всего: объект ndarray

    Центральным элементом библиотеки является объект ndarray (N-dimensional array — -мерный массив). В отличие от списков Python, которые могут содержать смесь целых чисел, строк и словарей, массив NumPy обязан быть гомогенным (однородным). Это значит, что все элементы массива должны иметь один и тот же тип данных (например, только int64 или только float32).

    Для начала работы необходимо импортировать библиотеку. Общепринятым стандартом является сокращение np.

    Создание массивов

    Самый простой способ создать массив — преобразовать обычный список Python:

    NumPy также предоставляет удобные функции для генерации данных:

    * np.zeros((3, 4)) — создает массив размером 3x4, заполненный нулями. * np.ones((2, 2)) — создает массив, заполненный единицами. * np.arange(0, 10, 2) — аналог range() в Python: создает массив от 0 до 10 с шагом 2 ([0, 2, 4, 6, 8]). * np.linspace(0, 1, 5) — создает 5 чисел, равномерно распределенных на отрезке от 0 до 1.

    Размерность, форма и тип данных

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

    Основные атрибуты:

    * .ndim — количество измерений (осей). * 1 — вектор. * 2 — матрица. * 3 и более — тензор. * .shape — кортеж, показывающий размер массива по каждому измерению. Например, (2, 3) означает 2 строки и 3 столбца. * .size — общее количество элементов в массиве. * .dtype — тип данных элементов (например, int32, float64).

    Пример:

    Вычислительная математика: Векторизация

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

    Рассмотрим простую математическую операцию: сложение двух векторов. В математике это записывается так:

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

    Где — -й элемент вектора результата, — -й элемент первого вектора, — -й элемент второго вектора.

    В коде NumPy это выглядит элементарно:

    Вы можете применять любые арифметические операции (+, -, , /, *) к массивам. Операция будет применена к каждому элементу.

    Агрегирующие функции

    Часто нам нужно получить одну сводную характеристику массива, например, сумму всех элементов или среднее значение.

    Математически среднее арифметическое (mean) записывается формулой:

    Где — среднее значение, — количество элементов, — знак суммирования, — каждый отдельный элемент массива.

    В NumPy:

    Индексация и срезы (Slicing)

    Работа с индексами в NumPy похожа на работу со списками Python, но с расширенными возможностями для многомерных массивов.

    Одномерные массивы

    Доступ осуществляется так же, как и в списках: arr[0] — первый элемент, arr[-1] — последний. Срезы работают по принципу [start:stop:step].

    Многомерные массивы

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

    !Визуализация принципов индексации и срезов в двумерной матрице.

    Пример:

    Практическое применение: Линейная алгебра

    Машинное обучение базируется на линейной алгебре. Одной из самых частых операций является перемножение матриц (Dot Product).

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

    Где — элемент новой матрицы на пересечении -й строки и -го столбца, — элементы строки первой матрицы, — элементы столбца второй матрицы.

    В NumPy для этого используется функция np.dot() или оператор @:

    Заключение

    Мы рассмотрели основы библиотеки NumPy: создание массивов ndarray, их атрибуты, базовую арифметику и индексацию. Это тот фундамент, на котором строятся более сложные инструменты, такие как Pandas (для табличных данных) и Matplotlib (для визуализации), которые мы изучим в следующих статьях курса.

    Помните: в Data Science данные почти всегда представлены в виде массивов чисел. Картинка — это трехмерный массив пикселей (высота, ширина, цвет). Звук — это одномерный массив амплитуд. Таблица Excel — это двумерный массив. И NumPy — это универсальный ключ к работе с ними.

    2. Введение в Pandas: структуры данных Series и DataFrame, загрузка файлов и первичный осмотр данных

    Введение в Pandas: структуры данных Series и DataFrame, загрузка файлов и первичный осмотр данных

    В предыдущей статье мы изучили NumPy — фундамент вычислительного Python. Мы узнали, как эффективно работать с числами, упакованными в многомерные массивы. Однако в реальном мире данные редко приходят в виде идеально чистых матриц чисел. Чаще всего аналитику приходится иметь дело с таблицами, где есть имена столбцов, текстовые описания, временные метки и, что самое неприятное, пропуски в данных.

    Здесь на сцену выходит Pandas.

    Pandas — это высокоуровневая библиотека, построенная поверх NumPy. Если NumPy — это молоток и зубило, то Pandas — это швейцарский нож для работы с данными. Она добавляет к массивам метки (индексы и названия колонок) и позволяет работать с разнородными данными так же удобно, как в Excel или SQL, но с мощью языка программирования Python.

    Для начала работы нам необходимо импортировать библиотеку. Стандартное сокращение в сообществе — pd.

    Архитектура Pandas: Два кита

    Вся работа в Pandas строится вокруг двух основных структур данных: Series (Серия) и DataFrame (Датафрейм).

    1. Series: Одномерный массив с метками

    Объект Series — это одномерный массив, который может хранить данные любого типа (целые числа, строки, числа с плавающей точкой, объекты Python). Главное отличие от массива NumPy (ndarray) заключается в наличии индекса.

    Индекс — это метка для каждой точки данных. Если в NumPy мы обращаемся к элементам только по их порядковому номеру (0, 1, 2...), то в Series мы можем использовать осмысленные метки.

    Вы можете представлять Series как упорядоченный словарь (dictionary) фиксированной длины, где ключи — это индексы, а значения — это данные.

    2. DataFrame: Табличные данные

    DataFrame — это двумерная структура данных, то есть таблица, состоящая из строк и столбцов. Это самый популярный объект в Pandas.

    Технически DataFrame — это набор объектов Series, которые имеют общий индекс (строки). Каждый столбец в DataFrame является отдельной Series.

    !Визуальное представление структуры DataFrame: индекс строк, названия столбцов и данные.

    Создадим простую таблицу вручную:

    Результат:

    Обратите внимание: так как мы не задали индекс явно, Pandas автоматически создал числовой индекс от 0 до .

    Загрузка данных из файлов

    В реальности вы редко будете создавать датафреймы вручную. Обычно данные загружаются из внешних источников: CSV-файлов, Excel-таблиц, баз данных SQL или JSON.

    Самый распространенный формат хранения данных в Data Science — это CSV (Comma-Separated Values).

    Чтение CSV

    Функция pd.read_csv() — это, пожалуй, самая часто используемая функция в Pandas. Она умеет превращать текстовый файл в DataFrame.

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

    * sep: разделитель данных (по умолчанию запятая ,, но бывает точка с запятой ; или табуляция \t). * header: номер строки, в которой находятся заголовки столбцов. * index_col: какой столбец использовать в качестве индекса строк. * names: список имен для столбцов, если в файле нет заголовка.

    Пример загрузки файла с нестандартным разделителем:

    Первичный осмотр данных

    После того как данные загружены в переменную df, первое, что нужно сделать — понять, с чем мы имеем дело. Загружать миллион строк на экран через print(df) — плохая идея, это засорит вывод и может затормозить среду разработки.

    Pandas предоставляет набор методов для быстрой разведки данных.

    1. Просмотр части данных

    Методы .head() и .tail() позволяют взглянуть на начало и конец таблицы.

    2. Техническая сводка

    Метод .info() — это рентген вашего датафрейма. Он показывает:

    * Класс объекта. * Индекс и количество строк. * Количество столбцов. * Имя каждого столбца и количество ненулевых (non-null) значений в нем. * Тип данных каждого столбца (int64, float64, object и т.д.). * Объем занимаемой памяти.

    Это критически важный метод для обнаружения пропусков. Если в датафрейме 1000 строк, а в столбце Age метод показывает 800 non-null значений, значит, у вас 200 пропусков, которые нужно будет обработать.

    3. Статистическая сводка

    Метод .describe() вычисляет основные описательные статистики для всех числовых столбцов.

    Этот метод возвращает новый DataFrame, содержащий:

    * count — количество значений. * mean — среднее арифметическое. * std — стандартное отклонение. * min, max — минимальное и максимальное значения. * 25%, 50%, 75% — квартили (перцентили).

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

    Среднее арифметическое (Mean):

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

    Стандартное отклонение (Standard Deviation):

    Где — стандартное отклонение, — квадратный корень, — конкретное значение, — среднее значение, — размер выборки. В знаменателе используется (поправка Бесселя) для несмещенной оценки выборки.

    Стандартное отклонение показывает, насколько сильно данные разбросаны вокруг среднего. Если велико, данные имеют большой разброс; если мало — данные сгруппированы кучно возле среднего.

    4. Атрибуты формы

    Иногда вам не нужны данные, а только понимание размеров таблицы. Для этого используются атрибуты (без скобок):

    * .shape — возвращает кортеж (количество_строк, количество_столбцов). * .columns — возвращает список названий столбцов. * .index — возвращает описание индекса строк.

    Извлечение столбцов

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

    Когда вы извлекаете один столбец из DataFrame, вы получаете объект Series. Если вы хотите получить подтаблицу (DataFrame) из одного столбца, используйте двойные скобки:

    Заключение

    Сегодня мы познакомились с библиотекой Pandas, узнали о структурах Series и DataFrame, научились загружать данные из CSV-файлов и проводить их первичный осмотр с помощью info() и describe().

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

    3. Продвинутая обработка данных в Pandas: фильтрация, группировка, очистка от пропусков и агрегация

    Продвинутая обработка данных в Pandas: фильтрация, группировка, очистка от пропусков и агрегация

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

    В этой части курса мы переходим от пассивного наблюдения к активным действиям. Вы узнаете, как очищать данные от «мусора», выбирать только необходимую информацию с помощью сложной фильтрации и, самое главное, получать инсайты с помощью группировки и агрегации. Это те навыки, которые занимают 80% времени работы Data Scientist'а.

    Очистка данных: Работа с пропусками

    Пропущенные значения (Missing Values) — бич любого аналитика. В Pandas они обычно обозначаются как NaN (Not a Number) для чисел или None для объектов. Пропуски могут возникать из-за ошибок ввода, сбоев оборудования или просто потому, что данные не были предоставлены.

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

    Обнаружение пропусков

    Чтобы узнать, где именно спрятались NaN, используются методы .isna() (или .isnull()). Они возвращают таблицу того же размера, заполненную True (если пропуск есть) и False (если данные на месте).

    Метод .sum() здесь работает очень удобно: так как True интерпретируется как 1, а False как 0, сумма по столбцу покажет точное количество пропусков.

    Стратегия 1: Удаление

    Самый радикальный метод — удалить строки или столбцы, содержащие хотя бы один пропуск. Для этого используется метод .dropna().

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

    Стратегия 2: Заполнение

    Более мягкий подход — заполнить пропуски каким-то значением (импутация). Это может быть ноль, среднее арифметическое или константа. Метод .fillna() делает именно это.

    !Блок-схема алгоритма принятия решений при работе с пропущенными данными.

    Фильтрация данных и индексация

    Часто нам нужна не вся таблица, а только её часть, удовлетворяющая определенным условиям. Например, «все пассажиры Титаника старше 30 лет, купившие билет 1-го класса».

    Логические маски (Boolean Indexing)

    В основе фильтрации лежит понятие маски. Маска — это серия булевых значений (True/False), которая накладывается на датафрейм. Pandas оставляет только те строки, где маска равна True.

    Сложные условия

    В Python для логических операций используются and, or, not. Но в Pandas (и NumPy) для работы с массивами нужно использовать побитовые операторы:

    * & — И (AND) * | — ИЛИ (OR) * ~ — НЕ (NOT)

    Важно: Каждое условие должно быть обернуто в круглые скобки (). Это самая частая ошибка новичков.

    Доступ через .loc и .iloc

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

  • .loc[строки, столбцы] — доступ по меткам (названиям).
  • .iloc[строки, столбцы] — доступ по целочисленным индексам (позициям).
  • Группировка и агрегация (Groupby)

    Это, пожалуй, самый мощный инструмент в арсенале аналитика. Метод .groupby() позволяет разбить данные на группы по какому-то признаку, применить к каждой группе функцию и собрать результаты обратно. Эта парадигма называется Split-Apply-Combine.

    !Визуализация парадигмы Split-Apply-Combine: разделение данных, применение функции и объединение результатов.

    Простая группировка

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

    Результат:

    Агрегация с несколькими функциями

    Метод .agg() позволяет применять разные функции к разным столбцам или несколько функций к одному столбцу.

    Математика взвешенного среднего

    Иногда стандартных функций (mean, sum) недостаточно. Рассмотрим пример, когда нам нужно посчитать взвешенное среднее. Например, среднюю оценку товара, учитывая количество голосов.

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

    Где: * — искомое взвешенное среднее значение. * — количество групп или элементов. * — вес -го элемента (например, количество проданных товаров). * — значение -го элемента (например, цена товара). * — знак суммирования.

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

    Сортировка данных

    После агрегации данные часто нужно упорядочить. Для этого используется метод .sort_values().

    Заключение

    Мы рассмотрели ключевые инструменты манипуляции данными в Pandas:

  • Очистка: dropna() и fillna() помогают бороться с пропусками.
  • Фильтрация: Логические маски и операторы &, |, ~ позволяют выделять нужные сегменты данных.
  • Группировка: groupby() реализует стратегию Split-Apply-Combine для получения сводной статистики.
  • Теперь ваши данные чисты, отфильтрованы и агрегированы. Но сухие таблицы цифр сложны для восприятия человеком. В следующей статье мы оживим эти данные, изучив библиотеку Matplotlib для построения графиков и визуализации.

    4. Визуализация данных с помощью Matplotlib: построение графиков, гистограмм и настройка визуального стиля

    Визуализация данных с помощью Matplotlib: построение графиков, гистограмм и настройка визуального стиля

    Мы прошли долгий путь: от создания массивов в NumPy до сложной агрегации данных в Pandas. Теперь у нас есть очищенные, структурированные данные. Но сухие таблицы с цифрами, какими бы точными они ни были, плохо воспринимаются человеческим мозгом. Чтобы найти скрытые закономерности, выбросы или тренды, данные нужно увидеть.

    В этой статье мы изучим Matplotlib — самую старую, надежную и фундаментальную библиотеку для визуализации данных в Python. Именно на её основе построены более современные инструменты, такие как Seaborn или встроенная визуализация в Pandas.

    Зачем нужна визуализация?

    Визуализация — это не просто «красивые картинки» для презентации. Это мощный инструмент разведочного анализа данных (EDA — Exploratory Data Analysis). График может мгновенно показать то, что скрыто в тысячах строк таблицы: сезонность продаж, корреляцию между возрастом и доходом или ошибку в данных.

    Для начала работы нам потребуется стандартный импорт. В сообществе принято импортировать модуль pyplot под псевдонимом plt.

    Архитектура Matplotlib: Анатомия графика

    Многие новички путаются в Matplotlib, потому что не понимают иерархию объектов библиотеки. Давайте разберем её раз и навсегда.

    В Matplotlib есть два главных объекта:

  • Figure (Фигура): Это «холст» или контейнер верхнего уровня. Это само окно или файл изображения, на котором будет нарисовано всё остальное.
  • Axes (Оси): Это сам график — область с системой координат, где рисуются линии, точки, подписи осей и заголовок. На одной Figure может быть размещено несколько Axes (например, 2x2 графика).
  • !Схема иерархии объектов Matplotlib: Figure содержит Axes, который в свою очередь содержит элементы графика.

    Существует два способа писать код в Matplotlib:

    * State-based (как в MATLAB): Вы просто пишете команды plt.plot(), plt.title(), и библиотека сама понимает, к какому графику это относится. Это просто, но может вызвать путаницу при работе с несколькими графиками. * Object-oriented (Объектно-ориентированный): Вы явно создаете объекты fig и ax, а затем вызываете методы у них (например, ax.plot()). Это профессиональный подход, который дает полный контроль.

    Мы будем использовать второй подход.

    Линейный график (Line Plot)

    Самый простой и распространенный тип графика. Он идеально подходит для отображения изменения величины во времени (временные ряды) или зависимости одной непрерывной переменной от другой.

    Рассмотрим простую математическую функцию — линейную зависимость:

    Где — зависимая переменная (значение по вертикальной оси), — независимая переменная (значение по горизонтальной оси), — угловой коэффициент (наклона прямой), — свободный член (смещение по оси Y).

    Построим график этой функции:

    Функция plt.subplots() создает и возвращает кортеж из двух объектов: фигуры и осей. Метод ax.plot(x, y) соединяет точки линиями.

    Диаграмма рассеяния (Scatter Plot)

    Когда нам нужно понять, есть ли взаимосвязь (корреляция) между двумя переменными, мы используем Scatter Plot. Здесь точки не соединяются линиями.

    Представьте, что мы анализируем данные о квартирах. По оси X — площадь, по оси Y — цена.

    Если точки выстраиваются в диагональную линию, значит, корреляция есть. Если они разбросаны хаотично («облако»), связи нет.

    Гистограмма (Histogram)

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

    При построении гистограммы весь диапазон значений разбивается на равные интервалы, называемые bins (корзины). Высота столбца показывает, сколько элементов попало в этот интервал.

    Математически высота столбца для интервала определяется как:

    Где — количество элементов в -й корзине, — общее количество элементов выборки, — знак суммирования, — индикаторная функция (равна 1, если условие в скобках истинно, и 0, если ложно), — -й элемент данных, — -й интервал (корзина).

    Настройка визуального стиля

    «Голый» график редко подходит для отчета. Matplotlib позволяет настроить практически каждый пиксель.

    1. Легенда

    Если на одном графике несколько линий, легенда обязательна. Для этого при построении графика нужно добавить параметр label, а затем вызвать ax.legend().

    2. Сетка

    Сетка помогает глазу соотносить точки с осями. Включается методом ax.grid(True).

    3. Размеры и разрешение

    Размер фигуры задается при создании: plt.subplots(figsize=(10, 6)). Размеры указываются в дюймах.

    Пример комплексной настройки:

    Несколько графиков (Subplots)

    Иногда нужно показать несколько графиков рядом для сравнения. Функция plt.subplots() позволяет задать количество строк и столбцов.

    Обратите внимание: plt.subplots(1, 2) возвращает кортеж осей, который мы сразу распаковали в переменные ax1 и ax2.

    Интеграция с Pandas

    Хорошая новость: вам не всегда нужно писать много кода на Matplotlib. Pandas имеет встроенный метод .plot(), который «под капотом» использует Matplotlib.

    Параметр kind определяет тип графика: * 'line' — линейный (по умолчанию). * 'bar' — столбчатая диаграмма. * 'hist' — гистограмма. * 'box' — ящик с усами (boxplot). * 'scatter' — точечный (требует указания x и y).

    Сохранение результата

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

    Заключение

    Сегодня мы познакомились с Matplotlib — инструментом, который превращает сухие цифры в наглядные истории. Мы разобрали:

  • Разницу между Figure (холстом) и Axes (графиком).
  • Построение базовых графиков: линейного, точечного и гистограммы.
  • Настройку стиля: цвета, линии, легенды и сетки.
  • Создание нескольких графиков на одном холсте.
  • Визуализация — это мост между аналитикой и принятием решений. В следующей части курса мы объединим все полученные знания (NumPy, Pandas, Matplotlib) для решения полноценной задачи анализа данных от загрузки файла до финального отчета.

    5. Комплексный проект: разведочный анализ данных (EDA) и подготовка признаков для моделей машинного обучения

    Комплексный проект: разведочный анализ данных (EDA) и подготовка признаков для моделей машинного обучения

    Поздравляю! Вы прошли большой путь. Мы начали с низкоуровневой математики в NumPy, научились манипулировать таблицами в Pandas и освоили искусство визуализации в Matplotlib. Теперь настало время собрать все эти инструменты воедино.

    В этой финальной статье курса мы не будем изучать новые библиотеки. Вместо этого мы смоделируем реальную задачу Data Science: от получения «сырого» файла до подготовки чистого набора данных, готового к передаче в модель машинного обучения. Этот процесс называется EDA (Exploratory Data Analysis) и Feature Engineering.

    Постановка задачи

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

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

    !Визуализация этапов подготовки данных: от сырого файла через очистку и анализ к готовому набору для обучения

    Для работы нам понадобятся все изученные библиотеки:

    Шаг 1: Загрузка и первичный осмотр

    Допустим, мы загрузили данные и видим следующий набор столбцов: * Price (Цена) — наша целевая переменная. * Area (Площадь) — числовой признак. * Rooms (Количество комнат) — числовой признак. * District (Район) — категориальный признак (текст). * YearBuilt (Год постройки) — числовой признак.

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

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

    Шаг 2: Борьба с выбросами (Outliers)

    Выбросы — это аномальные значения, которые сильно отличаются от остальных. Например, квартира площадью 5000 кв.м. или ценой в 1 доллар. Такие данные могут «сломать» модель, так как алгоритм будет пытаться подстроиться под эту ошибку.

    Один из самых надежных статистических методов поиска выбросов — межквартильный размах (IQR).

    Математически это выглядит так. Сначала мы находим 25-й перцентиль () и 75-й перцентиль ().

    Где — межквартильный размах, — значение, ниже которого находится 75% данных, — значение, ниже которого находится 25% данных.

    Границы нормальных значений определяются формулами:

    Где — нижняя граница, — верхняя граница, — стандартный коэффициент масштабирования для определения «усов» ящика с усами (boxplot).

    Все, что лежит за пределами интервала , считается выбросом.

    Реализуем это в коде для столбца Area:

    Шаг 3: Работа с категориальными признаками

    Модели машинного обучения понимают только числа. Они не знают, что такое «Center» или «Suburb». Нам нужно перевести текст в цифры.

    Самый популярный метод — One-Hot Encoding (OHE). Суть метода: для каждого уникального значения категории создается новый столбец, где ставится 1, если объект принадлежит к этой категории, и 0 — если нет.

    Если у нас был столбец District со значениями ['Center', 'Suburb'], мы получим: * District_Center: [1, 0] * District_Suburb: [0, 1]

    В Pandas это делается одной командой:

    Теперь наш датафрейм стал шире, но зато полностью состоит из чисел.

    Шаг 4: Масштабирование признаков (Feature Scaling)

    Представьте, что у нас есть два признака:

  • Area (Площадь): значения от 30 до 200.
  • YearBuilt (Год): значения от 1950 до 2020.
  • Для многих алгоритмов (например, KNN или градиентного спуска) разница в масштабах критична. Год (число около 2000) будет влиять на результат сильнее, чем площадь (число около 100), просто потому что оно больше по модулю. Чтобы уравнять их права, мы используем Стандартизацию (Z-score normalization).

    Формула стандартизации:

    Где: * — новое масштабированное значение. * — исходное значение. * (мю) — среднее арифметическое столбца. * (сигма) — стандартное отклонение столбца.

    После этого преобразования среднее значение признака станет равным 0, а стандартное отклонение — 1. Реализуем это с помощью NumPy и Pandas:

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

    Шаг 5: Анализ корреляций

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

    Для этого мы строим матрицу корреляций. Коэффициент корреляции Пирсона меняется от -1 до 1: * 1: полная прямая зависимость (чем больше площадь, тем выше цена). * -1: полная обратная зависимость (чем старше дом, тем ниже цена — условно). * 0: связи нет.

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

    Итоговый чек-лист проекта

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

  • Загрузка: pd.read_csv().
  • Очистка: dropna() или fillna() для пропусков.
  • Фильтрация выбросов: Использование IQR и логической индексации.
  • Кодирование: pd.get_dummies() для превращения текста в бинарные признаки.
  • Масштабирование: Приведение данных к нормальному распределению (-score).
  • Визуализация: Гистограммы распределений и тепловые карты корреляций.
  • Заключение курса

    На этом наш курс «Python для анализа данных» завершен. Мы начали с того, как компьютер хранит числа в памяти (NumPy), научились управлять гигабайтами данных в таблицах (Pandas) и рисовать графики, достойные научных публикаций (Matplotlib).

    Эти три библиотеки — «святая троица» Data Science. Куда бы вы ни пошли дальше — в глубокое обучение (Deep Learning), анализ временных рядов или классическую статистику — вы будете использовать np.array, pd.DataFrame и plt.plot каждый день.

    Ваш следующий шаг — изучение библиотек машинного обучения, таких как Scikit-learn. Но теперь, имея прочный фундамент, вы готовы к этому вызову. Удачи в мире данных!