Created by AIImproved by people
Riqli · living documents · updated continuously
Where AI knowledge meets human practice.
Share with friends

Введение
Аннотация. Современный мир генерирует колоссальные объёмы данных, но сами по себе они бесполезны без правильной интерпретации. Данный курс посвящён фундаментальным навыкам исследовательского анализа данных (EDA) с использованием экосистемы Python. Мы разберём, как превратить сырые, неструктурированные наборы данных в чистые, структурированные таблицы, готовые для построения моделей и принятия решений. Курс ориентирован на практиков, которые хотят освоить всю цепочку анализа: от первой загрузки CSV-файла до формулировки выводов на основе визуализаций и статистик.
Цель курса. После прохождения курса вы сможете самостоятельно подключать библиотеки Pandas и NumPy, загружать данные из различных источников, выполнять полный цикл их очистки и предобработки, исследовать структуру данных с помощью статистических методов и визуализаций, а также формулировать обоснованные бизнес-гипотезы на основе выявленных закономерностей.
Результаты обучения.
- Знать: основные структуры данных Pandas (Series, DataFrame) и NumPy (ndarray); методы загрузки данных (read_csv, read_excel, read_sql); принципы работы с пропущенными значениями и дубликатами; типы визуализаций для разных типов переменных.
- Уметь: выполнять фильтрацию, сортировку и группировку данных; применять оконные функции и сводные таблицы; строить гистограммы, ящики с усами и матрицы корреляции; использовать SQL-запросы для извлечения данных.
- Владеть: навыками написания чистого и эффективного кода на Python для анализа данных; методиками выявления выбросов и аномалий; инструментами для автоматизации отчётов (Jupyter Notebook).
Для кого этот курс.
Курс создан для начинающих аналитиков данных, специалистов по бизнес-аналитике и разработчиков, желающих прокачать свои навыки в области обработки данных. Он будет полезен всем, кто работает с таблицами в Excel и хочет перейти на более мощный и гибкий инструментарий Python.
Курс НЕ предназначен для опытных Data Scientist, уже знакомых с машинным обучением и глубокой статистикой. Мы не изучаем сложные алгоритмы и нейронные сети — наш фокус исключительно на подготовке данных и их первичном исследовании.
Модуль 1. Основы работы с Pandas и NumPy
Установка и настройка окружения. Для работы с данными в Python вам потребуется установить дистрибутив Anaconda или Miniconda, который включает в себя менеджер пакетов conda и популярные библиотеки. Альтернативный путь — использование pip для установки пакетов в виртуальное окружение. Создайте виртуальное окружение с Python версии 3.8 или выше и выполните команду:
pip install pandas numpy matplotlib seaborn jupyter Jupyter Notebook станет вашей основной средой для исследования данных, так как позволяет выполнять код по ячейкам и сразу визуализировать результаты. Практический совет: всегда фиксируйте версии библиотек в файле requirements.txt для воспроизводимости экспериментов.Структура данных Pandas: Series. Series — это одномерный массив с индексами, который является основой для построения более сложных объектов. Он похож на столбец в таблице или словарь, где ключ — это индекс, а значение — элемент данных. Создать Series можно из списка или словаря:
import pandas as pd
s = pd.Series([10, 20, 30], index=['a', 'b', 'c']) Обращение к элементу происходит по индексу (s['b']) или по позиции (s.iloc[1]). В отличие от списков Python, Series поддерживают векторные операции (например, умножение на число применяется ко всем элементам сразу). Это свойство критически ускоряет вычисления по сравнению с циклами for.Структура данных Pandas: DataFrame. DataFrame — это двумерная таблица с индексированными строками и столбцами, являющаяся основной рабочей лошадкой в анализе. Каждый столбец в DataFrame является объектом Series. DataFrame можно создать из словаря списков, из списка словарей, или загрузив из внешнего файла. Обращение к столбцу выполняется через квадратные скобки df['column_name'] или через точку df.column_name (если имя не содержит пробелов). Фильтрация строк по условию: df[df['age'] > 30]. Важно понимать, что операции с DataFrame возвращают новые объекты, не изменяя исходные (если не указан параметр inplace=True).
NumPy: основы работы с массивами. NumPy (Numerical Python) — это библиотека для эффективных численных вычислений, лежащая в основе Pandas. Её ключевой объект — многомерный массив ndarray, который хранит данные одного типа и позволяет выполнять операции со скоростью скомпилированного кода. Создание массива:
import numpy as np
arr = np.array([1, 2, 3, 4, 5]) Универсальные функции (ufunc), такие как np.sqrt(), np.exp(), np.sum(), применяются поэлементно. Понимание правил вещания (broadcasting) позволяет работать с массивами разной размерности без явных циклов. Например, к матрице можно прибавить вектор, и он будет автоматически расширен до нужной размерности.Загрузка данных из файлов и баз данных. Первый шаг в любом анализе — получение данных. Pandas поддерживает множество форматов: pd.read_csv() для текстовых файлов, pd.read_excel() для Excel, pd.read_json() для JSON. Для работы с базами данных используйте подключение через SQLAlchemy:
from sqlalchemy import create_engine
engine = create_engine('postgresql://user:pass@localhost/db')
df = pd.read_sql('SELECT * FROM table', engine) При загрузке CSV важно указывать параметры sep (разделитель), encoding (кодировка) и parse_dates для автоматического преобразования дат. Антипаттерн: не игнорируйте параметр dtype — явное указание типов столбцов экономит память и время.Модуль 2. Предварительная очистка и предобработка данных
Обзор данных: info и describe. После загрузки данных необходимо выполнить первичный осмотр. Метод df.info() показывает общую информацию о DataFrame: количество записей, имена столбцов, типы данных и количество ненулевых значений. Это помогает быстро обнаружить пропуски и несоответствие типов. Метод df.describe() вычисляет основные статистики для числовых столбцов: среднее, стандартное отклонение, минимум, максимум и квартили. Для категориальных столбцов используйте df.describe(include='object') для получения количества уникальных значений и наиболее частого значения. Эти методы дают вам первый «снимок» качества данных.
Работа с пропущенными значениями. Пропуски (NaN) — неизбежная часть реальных данных. Существует два подхода к работе с ними: удаление или заполнение. Метод df.dropna() удаляет строки с любым пропуском (или подмножеством столбцов). Заполнение df.fillna(value) может выполняться константой, средним, медианой или методом ffill (заполнение предыдущим значением). Выбор стратегии зависит от контекста: в временных рядах часто используют интерполяцию, в табличных данных — заполнение медианой для устойчивости к выбросам. Важно фиксировать количество пропусков до и после очистки в отчёте.
Удаление дубликатов и обработка аномалий. Дублирующиеся строки могут исказить результаты агрегации. Метод df.duplicated() возвращает булев массив, указывающий на дубликаты, а df.drop_duplicates() удаляет их, оставляя только первое вхождение. Часто дублирование происходит из-за ошибок при слиянии или сборе данных. Аномалии (выбросы) можно обнаружить через межквартильный размах (IQR): , где границы — и . Значения за пределами этих границ считаются выбросами и требуют внимательного анализа.
Преобразование типов данных. Корректные типы данных критичны для производительности и правильной логики. Используйте df.dtypes для проверки типов. Строковые даты преобразуйте в тип datetime с помощью pd.to_datetime(), что позволит выполнять операции сдвига, ресемплинга и извлечения компонентов (год, месяц, день). Категориальные переменные с малым числом уникальных значений лучше преобразовывать в тип category для экономии памяти. Числовые данные, ошибочно загруженные как строки, можно привести к числу через pd.to_numeric() с параметром errors='coerce', заменяя ошибочные записи на NaN.
Переименование и перестановка столбцов. Чистота данных включает и удобство работы с ними. Переименование столбцов выполняется через df.rename(columns={'old_name': 'new_name'}). Используйте строчные буквы, заменяйте пробелы на нижние подчеркивания. Это облегчает доступ через синтаксис точки. Для изменения порядка столбцов просто передайте список желаемых столбцов: df[['col1', 'col2', 'col3']]. Метод df.sort_values() позволяет отсортировать строки по одному или нескольким столбцам, что полезно перед визуализацией трендов.
Модуль 3. Фильтрация, группировка и агрегация
Фильтрация данных с помощью булевых условий. Основной способ отбора строк — использование булевых масок. Например, df[(df['age'] > 18) & (df['city'] == 'Moscow')] отфильтрует совершеннолетних жителей Москвы. Для сложных условий можно использовать методы query(), которые позволяют писать условия в строковом виде: df.query('age > 18 and city == "Moscow"'). Операторы сравнения: & (И), | (ИЛИ), ~ (НЕ). Помните о приоритете операторов: используйте круглые скобки для группировки условий.
Группировка данных с помощью groupby. GroupBy — один из мощнейших инструментов Pandas, реализующий паттерн «разделяй-властвуй». Операция состоит из трёх этапов: разбиение (split) по ключам, применение (apply) функции к каждой группе, комбинирование (combine) результатов. Пример: df.groupby('department')['salary'].mean() вычислит среднюю зарплату по отделам. Возможно группировать по нескольким столбцам, передавая список. После группировки результат — это объект DataFrameGroupBy, к которому можно применять встроенные функции (sum, count, std) или пользовательские.
Агрегация с использованием agg и transform. Метод agg() позволяет одновременно применять несколько агрегирующих функций: df.groupby('city')['temperature'].agg(['min', 'max', 'mean']). Для разных столбцов можно указать свой словарь функций: df.groupby('city').agg({'temperature': 'mean', 'humidity': 'std'}). Метод transform() выполняет операцию внутри групп, сохраняя исходный размер DataFrame. Например, df['mean_temp'] = df.groupby('city')['temperature'].transform('mean') добавит столбец со средним значением для каждой строки.
Сводные таблицы и кросс-таблицы. Сводные таблицы (pivot_table) позволяют агрегировать данные по нескольким измерениям, как в Excel. Синтаксис: pd.pivot_table(df, values='sales', index='region', columns='quarter', aggfunc='sum'). Этот метод строит матрицу, где строки — один измерение, столбцы — другое, а значения — агрегированный показатель. pd.crosstab(index, columns) строит таблицу частот для двух категориальных переменных, что удобно для анализа взаимосвязей и построения тепловых карт.
Работа с индексами в DataFrame. Индекс в Pandas — это не просто порядковый номер, а мощный инструмент для быстрого доступа и слияния данных. Установите индекс через df.set_index('column_name'). Это даёт доступ к методам loc для выборки по меткам и iloc по позициям. Мультииндекс (MultiIndex) позволяет иметь иерархическую структуру строк, что удобно для работы с многомерными данными. Сброс индекса выполняется через df.reset_index(), что превращает индекс обратно в обычный столбец.
Модуль 4. Анализ данных с помощью SQL в Pandas
Выполнение SQL-запросов через Pandas. Библиотека pandasql позволяет выполнять SQL-запросы непосредственно к DataFrame, что полезно для тех, кто лучше знаком с SQL, чем с методами Pandas. Установите её через pip install pandasql. Пример:
from pandasql import sqldf
query = "SELECT name, AVG(salary) FROM df WHERE age > 30 GROUP BY name"
result = sqldf(query, locals()) Аналогом в чистом Pandas является цепочка query, groupby, agg. Этот подход помогает плавно переходить между двумя экосистемами.Соединение таблиц (JOIN) в Pandas. Операции объединения данных — критически важный навык. Pandas предоставляет метод merge(), который имитирует SQL JOIN:
df_merged = pd.merge(df1, df2, on='key_column', how='inner') Типы объединений: inner (пересечение), outer (объединение), left, right. Альтернативный метод join() работает на основе индекса. При объединении больших таблиц всегда проверяйте типы данных ключевых столбцов — они должны совпадать, иначе объединение не сработает.Оконные функции и их аналоги. В SQL оконные функции позволяют выполнять вычисления относительно текущей строки. В Pandas это достигается с помощью группировки и метода cumsum(), cumprod(), rank() или через объект groupby. Пример: df['cumulative_sales'] = df.groupby('region')['sales'].cumsum() даст накопительную сумму продаж в разрезе регионов. Для лагов и сдвигов используйте df['prev_value'] = df.groupby('group')['value'].shift(1).
Оптимизация производительности запросов. При работе с большими наборами данных производительность становится критической. Предпочитайте apply() с векторизованными функциями вместо циклов. Используйте pd.eval() для сложных выражений. При соединении таблиц убедитесь, что столбцы объединения проиндексированы через df.set_index(). Для максимальной эффективности используйте библиотеку modin или dask, которые распараллеливают вычисления.
Модуль 5. Визуализация данных для EDA
Построение гистограмм и распределений. Гистограмма — ключевой инструмент для понимания распределения числовой переменной. В Matplotlib: plt.hist(df['age'], bins=20). В Seaborn: sns.histplot(df['age'], kde=True) добавит линию плотности. Выбор количества бинов влияет на интерпретацию: слишком мало — потеряем детали, слишком много — увидим шум. Правило Скотта или метод Freedman-Diaconis помогают выбрать оптимальное количество бинов. Гистограмма сразу показывает скошенность (skewness), наличие нескольких мод и выбросы.
Ящики с усами (Boxplot) для выявления выбросов. Ящик с усами (boxplot) — компактный способ отображения пяти ключевых статистик: минимум, нижний квартиль (Q1), медиана (Q2), верхний квартиль (Q3), максимум (без выбросов). Точки за «усами» считаются выбросами. В Seaborn: sns.boxplot(x='category', y='value', data=df) позволяет сравнивать распределения по категориям. Ящики с усами незаменимы для быстрой оценки разброса и обнаружения аномалий в данных.
Матрица корреляции и тепловые карты. Для выявления взаимосвязей между числовыми переменными используется матрица корреляции. Рассчитайте её через df.corr(). Визуализируйте через тепловую карту Seaborn: sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm'). Коэффициент корреляции Пирсона измеряет линейную связь: . Значения близкие к +1 или -1 говорят о сильной связи, к 0 — об отсутствии линейной зависимости. Это важный шаг для отбора признаков перед построением моделей.
Диаграммы рассеяния и парные графики. Диаграмма рассеяния (scatter plot) отображает зависимость между двумя переменными: plt.scatter(df['x'], df['y']). Для множества парных сравнений используется sns.pairplot(df), который строит все возможные диаграммы рассеяния и гистограммы по диагонали. Это мощный инструмент для первичного исследования, особенно на небольших наборах данных. На диаграммах рассеяния видны кластеры, выбросы и нелинейные зависимости.
Кастомизация графиков для отчётов. Чистый и понятный график — результат работы с деталями. Настройте размер холста: plt.figure(figsize=(12, 6)). Добавляйте заголовки и подписи осей через plt.title(), plt.xlabel() и plt.ylabel(). Используйте легенду (plt.legend()) для цветных категорий. Современный стиль Seaborn — sns.set_style('whitegrid'). Экспортируйте графики в высоком разрешении: plt.savefig('plot.png', dpi=300) для включения в презентации.
Модуль 6. Продвинутые техники исследования данных
Работа с временными рядами. Временные ряды требуют особого подхода. Установите дату в качестве индекса: df.set_index(pd.to_datetime(df['date']), inplace=True). Ресемплинг (изменение частоты) выполняется через df.resample('M').mean() для усреднения по месяцам. Сдвиг рядов (shift()) используется для создания лаговых признаков. Для визуализации трендов и сезонности используйте декомпозицию из statsmodels: from statsmodels.tsa.seasonal import seasonal_decompose.
Обработка текстовых данных (String methods). Pandas предоставляет мощный набор строковых методов через атрибут .str: df['name'].str.lower(), df['name'].str.split('_'), df['address'].str.contains('ул'). Регулярные выражения доступны через df['col'].str.extract(r'(\d+)'). Очистка текста включает удаление пробелов (strip()) и замену подстрок. Эти методы критически важны для анализа логов, отзывов и пользовательских данных.
Применение пользовательских функций. Когда встроенных методов недостаточно, используйте df.apply(func, axis=1) для применения функции к каждой строке, или df.apply(func, axis=0) для столбцов. Для максимальной скорости старайтесь использовать векторизованные версии через NumPy. Пример:
df['weight_kg'] = df['weight_lbs'].apply(lambda x: x * 0.453) Для более сложных преобразований используйте df.transform() в связке с группировкой.Иерархическая индексация и её применение. MultiIndex позволяет работать с многомерными данными в плоской таблице. Создаётся через pd.MultiIndex.from_tuples() или при группировке: df.groupby(['year', 'month']).sum(). Доступ к данным по уровням: df.xs('year', level=0). Это незаменимо при анализе данных с несколькими измерениями (продажи по годам и регионам), позволяя удобно переключаться между сводками и детализацией.
Сохранение результатов анализа. Завершающий этап — экспорт обработанных данных. Сохраняйте DataFrame в CSV: df.to_csv('clean_data.csv', index=False), в Excel: df.to_excel('report.xlsx', sheet_name='data'). Для быстрого обмена с коллегами используйте формат Parquet: df.to_parquet('data.parquet'), который сжимает данные и сохраняет типы. Сохраняйте также свои графики в PNG или SVG. Это гарантирует воспроизводимость и возможность дальнейшего использования.
Модуль 7. Практические кейсы и бизнес-применение
EDA для маркетинговых данных. Предположим, у вас есть данные о клиентских транзакциях. Используйте EDA для сегментации клиентов по частоте покупок (RFM-анализ). Рассчитайте метрики: recency = (today - df['last_purchase']).dt.days, frequency = df.groupby('client')['purchase_id'].count(), monetary = df.groupby('client')['amount'].sum(). Визуализируйте распределение клиентов по этим осям. Это позволит выявить ценные сегменты и разработать персонализированные предложения.
Анализ данных в здравоохранении. В медицинских данных критически важна точность. При проведении EDA всегда проверяйте диапазоны показателей (например, давление, пульс). Используйте визуализации для обнаружения артефактов и ошибок измерения. Группировка по диагнозам позволяет выявить закономерности. Антипаттерн: удаление выбросов без консультации с предметным специалистом. Аномальные значения могут указывать на новые симптомы или редкие состояния.
Финансовый анализ с Pandas. Работа с финансовыми данными требует работы с процентными изменениями: df['pct_change'] = df['close'].pct_change(). Скользящие средние (moving average) сглаживают тренды: df['sma_30'] = df['close'].rolling(30).mean(). Волатильность — стандартное отклонение логарифмических доходностей. Боллинджеры и RSI строятся на основе этих базовых блоков. Используйте pandas_datareader для загрузки биржевых данных для практики.
Анализ пользовательского опыта (UX). Данные о кликах и времени сессии требуют детальной очистки от ботов и тестовых аккаунтов. Используйте группировку по пользователю для расчёта средней длины сессии. Визуализируйте воронку (funnel) с помощью горизонтальных столбцов, показывая падение конверсии на каждом этапе. Сравнение когорт (когортный анализ) позволяет увидеть, как меняется поведение пользователей с течением времени после регистрации.
Автоматизация отчётов в Jupyter Notebook. Превратите свой Jupyter Notebook в автоматизированный отчёт. Используйте параметризацию через papermill, который позволяет подставлять параметры (например, дату отчёта). Добавьте маркдаун-ячейки с выводами, оформленные в виде заголовков и абзацев. Это делает ваш анализ самодокументируемым и пригодным для повторного запуска. Настройте автоматическую отправку отчёта по почте или в облачное хранилище.
Модуль 8. Заключение и дальнейшие шаги
Что дальше? Переход к машинному обучению. После завершения EDA вы имеете чистый, размеченный набор данных. Следующий шаг — построение прогнозных моделей. Библиотеки scikit-learn и xgboost ждут вас. Используйте результаты EDA для выбора признаков: удаляйте сильно коррелирующие, масштабируйте числовые и кодируйте категориальные переменные. Правильно выполненный EDA определяет до 80% успеха в построении модели.
Полезные ресурсы и сообщества. Для углублённого изучения рекомендую книги «Python for Data Analysis» (Wes McKinney) и «Hands-On Machine Learning» (Aurélien Géron). Активные сообщества: Kaggle, Stack Overflow, официальный чат Pandas в Slack. Периодически проходите соревнования на Kaggle для получения опыта работы с реальными данными и обратной связи от сообщества.
Краткий чек-лист для любого EDA. Всегда начинайте с df.head() и df.info(). Затем: проверьте на пропуски, обработайте дубликаты, постройте гистограммы для всех числовых столбцов, проанализируйте корреляции. Потратьте время на чистку текстовых полей. Завершите формулировкой гипотез и проверкой их на визуализациях. Следуйте этому чек-листу — и ваши исследования всегда будут системными и полными.