Перейти к основному содержимому

Python для анализа данных

Play ITЗагрузка интерактивного демо…

Всем

Python для анализа данных

Python представляет собой мощный инструмент для работы с данными, обеспечивая доступ к широкому спектру библиотек, инструментов визуализации и математических алгоритмов. Экосистема языка позволяет проводить операции от простой обработки таблиц до сложного машинного обучения и статистического моделирования. Если вы уже считали в Excel, начните с Excel и Google Sheets — формулы — формулы и маршрута Excel → R → Python, затем повторите те же шаги в pandas.

Связанные главы Python-стека

Основные классы, библиотеки и функции Python для анализа и визуализации данных

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


Библиотека NumPy

NumPy — многомерные массивы ndarray, векторизация и матричные операции. Основа для Pandas, scikit-learn и подготовки данных к нейросетям.


import numpy as np

data = np.array([1, 2, 3, 4, 5])
mean_value = np.mean(data)
std_deviation = np.std(data)

Ключевые возможности: создание массивов, @ / np.dot, агрегаты, индексация, broadcasting.

Подробно: 337 — NumPy: массивы, векторы и матрицы (теория и справочник функций). Практика: Lab 1129. Математика: Векторы, Матрицы.


Библиотека Pandas

Библиотека Pandas строится поверх NumPy и предлагает структуры данных высокого уровня, такие как DataFrame и Series. Эти объекты позволяют работать с табличными данными, аналогично электронным таблицам, но с гораздо большими возможностями по автоматизации и анализу.


import pandas as pd

df = pd.DataFrame({
'Имя': ['Алексей', 'Мария', 'Иван'],
'Возраст': [25, 30, 35],
'Зарплата': [50000, 60000, 75000]
})

average_salary = df['Зарплата'].mean()
filtered_data = df[df['Возраст'] > 28]

Основные компоненты:

Те же базовые операции (CSV, фильтр, join, группировка) в Polars, SQL и PySpark — в напоминалке.

Текст как признаки

В таблице pandas каждый столбец — число или категория. Текст (отзыв, тикет, комментарий) модель принимает только после кодирования — превращения строки в вектор чисел фиксированной длины. Это тот же принцип, что кодирование категориальных признаков для столбца "город", только единицами становятся слова или токены.

Общая картина NLP — в NLP и работа с текстом. Ниже — минимум для аналитика, который уже работает с pandas и sklearn.

Термины

  • Документ — один текст целиком (отзыв, письмо, пост).
  • Корпус — набор документов для обучения или анализа.
  • Токен — единица разбиения текста (часто слово; в трансформерах — подслово).
  • Словарь (vocabulary) — список уникальных токенов корпуса; каждому токену соответствует индекс.
  • Bag-of-words (мешок слов) — представление документа как набора слов без учёта порядка.
  • TF (term frequency) — сколько раз слово встретилось в документе.
  • IDF (inverse document frequency) — насколько слово редко во всём корпусе; понижает вес "the", "и", "claim".
  • TF-IDF — произведение TF и IDF; частые везде слова получают малый вес, редкие и характерные — большой.
  • Baseline — простая модель-ориентир; сложное решение сравнивают с ней по метрикам.
  • Embedding (вложение) — плотный короткий вектор на токен, который обучается вместе с сетью.

Способы кодирования

СпособСутьТипичное применение
Bag-of-words1 в ячейке, если слово есть в документеБыстрая проверка идеи
TFСчётчик вхождений по словарюКороткие тексты, частотный анализ
TF-IDFTF с поправкой на редкость в корпусеКлассификация, поиск похожих документов
Индекс + embeddingНомер слова → обучаемый векторPyTorch, трансформеры

Пример — от строк к матрице признаков

Учебный корпус из двух предложений (классический пример с омонимом flies):

from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer

corpus = [
"Time flies like an arrow.",
"Fruit flies like a banana.",
]

bow = CountVectorizer(binary=True)
X_bow = bow.fit_transform(corpus).toarray()
print(bow.get_feature_names_out())
# ['a' 'an' 'arrow' 'banana' 'flies' 'fruit' 'like' 'time']

Разбор:

  • CountVectorizer строит столбец на каждое слово словаря и строку на каждый документ.
  • binary=True даёт bag-of-words (0 или 1). Без флага считается TF — число вхождений.
  • fit_transform обучает словарь на переданных текстах. Для test и production — только transform, иначе утечка данных (модель "видит" статистику будущих документов).

TF-IDF на том же корпусе:

tfidf = TfidfVectorizer()
X_tfidf = tfidf.fit_transform(corpus).toarray()

Слова вроде like и a встречаются в обоих предложениях — их вес снижается. Редкие banana и arrow получают больший вклад в вектор документа.

Классификация текста в sklearn

Тональность — метка настроения текста (например, positive / negative). Задача сводится к классификации после кодирования.

from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
from sklearn.metrics import classification_report

texts = ["great food", "awful service", "loved it", "never again"]
labels = [1, 0, 1, 0] # 1 — positive, 0 — negative

X_train, X_test, y_train, y_test = train_test_split(
texts, labels, test_size=0.25, random_state=42, stratify=labels
)

pipe = Pipeline([
("tfidf", TfidfVectorizer(max_features=5000, ngram_range=(1, 2))),
("clf", LogisticRegression(max_iter=1000)),
])
pipe.fit(X_train, y_train)
print(classification_report(y_test, pipe.predict(X_test)))

Разбор:

  • Pipeline связывает кодирование и классификатор: на test применяется тот же словарь TF-IDF, что выучен на train.
  • ngram_range=(1, 2) добавляет биграммы ("great food", "never again") — устойчивые словосочетания.
  • classification_report показывает precision, recall, F1 по классам — см. метрики ML.

Прикладной контекст — распознавание текста и отзывов.

Путь к PyTorch

Разреженный TF-IDF (тысячи столбцов, много нулей) хорошо сочетается с линейными моделями sklearn. В глубоком обучении текст кодируют целыми индексами токенов, а смысл слова несёт слой nn.Embedding — таблица обучаемых векторов. Сквозной код — практикум по тональности; основы тензоров и цикла обучения — PyTorch для разработчика.

Маршрут после таблиц


import pandas as pd

orders = pd.DataFrame({"order_id": [1, 2], "user_id": [10, 11]})
users = pd.DataFrame({"user_id": [10, 11], "name": ["Alice", "Bob"]})

merged = pd.merge(orders, users, on="user_id", how="left")
merged["user_label"] = merged.apply(
lambda row: f"{row['name']} (#{row['user_id']})",
axis=1,
)

Библиотека Matplotlib

Библиотека Matplotlib является базовым инструментом для построения графиков и визуализации данных. Подробная глава — Matplotlib — графики; галерея примеров с разбором — в лаборатории. Массивы для осей X и Y — NumPy — массивы и матрицы. Таблицы перед графиком готовят в Pandas — примеры расчётов. Сборка PDF-отчёта с формулами и вставкой рисунков — LaTeX — формулы для отчётов. Символьные вычисления (корни уравнения, производная, интеграл) — SymPy — уравнения и производные.


import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

plt.plot(x, y, marker='o')
plt.xlabel('Число')
plt.ylabel('Значение')
plt.title('Пример линейного графика')
plt.grid(True)
plt.show()

Типы визуализаций:

  • Линейные графики (plot);
  • Гистограммы (hist);
  • Диаграммы рассеяния (scatter);
  • Столбчатые диаграммы (bar);
  • Круговые диаграммы (pie);
  • Тепловые карты (imshow, heatmap);
  • Множественные оси и подграфики.

Библиотека Seaborn

Библиотека Seaborn построена на основе Matplotlib и упрощает создание сложных статистических графиков. Она автоматически подбирает цветовые схемы и стили, что делает визуализацию более эстетичной и информативной.


import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset("tips")
sns.scatterplot(data=tips, x="total_bill", y="tip", hue="smoker")
plt.show()

Преимущества использования:

  • Автоматическая группировка и раскраска данных;
  • Построение распределений (distplot, kdeplot);
  • Корреляционные матрицы (heatmap);
  • Графики регрессии (regplot, lmplot);
  • Интеграция с Pandas DataFrames.
Учебный набор tips

Кадр tips из seaborn (чаевые в ресторане — счёт, чаевые, пол, курение, день недели) часто используют в курсах "от Excel к Python" для повторения одного анализа в трёх средах. Сначала формулы в таблице — Excel и Google Sheets — формулы — Excel и Google Sheets; после EDA в Excel тот же смысл в Python — groupby, boxplot, ttest_ind по признаку time (обед/ужин); параллель в R — Простые приложения на R. Маршрут — Маршрут Excel → R → Python.


Библиотека Scikit-learn

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

Код ITЗагрузка примера кода…

Функциональные блоки:

  • Предобработка данных: масштабирование, кодирование категориальных признаков;
  • Разделение данных на обучающую, валидационную и тестовую выборки;
  • Алгоритмы регрессии, классификации, кластеризации;
  • Оценка качества моделей — метрики точности, полноты, F1-мера;
  • Подбор гиперпараметров через GridSearchCV.

Нормализация без утечки в test

StandardScaler и MinMaxScaler из sklearn.preprocessing обучают параметры на train (fit) и применяют их к val/test (transform). Нельзя вызывать fit на всей таблице до split — иначе test влияет на среднее и дисперсию.

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.ensemble import RandomForestClassifier

X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)

pipe = Pipeline([
("scaler", StandardScaler()),
("model", RandomForestClassifier(n_estimators=100, random_state=42)),
])
pipe.fit(X_train, y_train)
print(pipe.score(X_test, y_test))

Для нейросетей на изображениях масштабирование часто встроено в модель (Rescaling(1./255)) или в ImageDataGenerator(rescale=1./255) — см. Keras и подготовку для ML.

Train, validation и test

На малых датасетах validation выделяют из train; test оставляют для финального отчёта:

X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.3, random_state=42)
X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)

GridSearchCV перебирает гиперпараметры с k-fold внутри train, не трогая test — как в проекте Melbourne. Полная теория — Разбиение данных.


Библиотека SciPy

Библиотека SciPy (Scientific Python) содержит модули для научных вычислений, включая оптимизацию, интегрирование, интерполяцию, преобразования Фурье и статистические тесты.

from scipy import stats

data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
t_statistic, p_value = stats.ttest_1samp(data, popmean=5)

Возможности:

  • Статистические тесты — t-тест, ANOVA, хи-квадрат;
  • Оптимизация функций;
  • Интерполяция и аппроксимация;
  • Работа с сигналами и изображениями.

Линейное программирование — scipy.optimize.linprog

Для задач вида "максимизировать прибыль / минимизировать затраты при линейных ограничениях" используют linprog (солвер HiGHS). Теория постановки, симплекс и двойственность — в разделе Математическое программирование; готовый пример кода — в статье 9.

from scipy.optimize import linprog

# max 3x1 + 2x2 => min c^T x, c = [-3, -2]
c = [-3, -2]
A_ub = [[2, 1], [1, 2]]
b_ub = [8, 8]
res = linprog(c, A_ub=A_ub, b_ub=b_ub, bounds=[(0, None)] * 2)

Проверяйте res.success и подставляйте res.x в исходные ограничения. Целочисленные и нелинейные модели linprog не решает — нужны MIP-солверы (OR-Tools и др.).


Основные методы анализа и построение выводов по данным

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


Описательные статистики

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

Основные показатели:

  • Среднее значение (mean) — арифметическое среднее;
  • Медиана (median) — среднее значение упорядоченного ряда;
  • Модальное значение (mode) — наиболее часто встречающееся;
  • Дисперсия (variance) — мера разброса относительно среднего;
  • Стандартное отклонение (std) — корень из дисперсии;
  • Минимум и максимум — границы диапазона;
  • Квантили — значения, делящие данные на равные части (квартили, децили).

import pandas as pd

df = pd.read_csv("sales.csv")
summary_stats = df.describe()
print(df.isna().sum()) # пропуски по столбцам

Play ITЗагрузка интерактивного демо…

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

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


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

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

correlation_matrix = df.corr()

Интерпретация:

  • Положительная корреляция — рост одной переменной сопровождается ростом другой;
  • Отрицательная корреляция — рост одной переменной сопровождается падением другой;
  • Отсутствие корреляции — изменения переменных независимы друг от друга.

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


Метод главных компонент (PCA)

Метод главных компонент (Principal Component Analysis) используется для снижения размерности данных. Он преобразует исходные коррелирующие признаки в новый набор некоррелирующих переменных — главных компонент, которые сохраняют максимальную долю дисперсии данных.

Процесс выполнения:

  1. Стандартизация данных;
  2. Вычисление ковариационной матрицы;
  3. Нахождение собственных векторов и собственных значений;
  4. Сортировка собственных значений по убыванию;
  5. Выбор топ-k компонент для проекции данных.
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA

X = df.select_dtypes("number")
X_train, X_test = train_test_split(X, test_size=0.2, random_state=42)

scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

pca = PCA(n_components=2)
X_train_pca = pca.fit_transform(X_train_scaled)
X_test_pca = pca.transform(X_test_scaled)
explained_variance = pca.explained_variance_ratio_

Результаты применения:

  • Уменьшение количества признаков при сохранении информации;
  • Устранение мультиколлинеарности;
  • Визуализация многомерных данных в 2D или 3D пространстве;
  • Ускорение работы алгоритмов машинного обучения.

Классификация данных

Классификация — это задача предсказания категориальной метки для новых объектов на основе обученной модели. Алгоритмы учатся разделять данные по заданным классам.

Популярные алгоритмы:

  • Логистическая регрессия — вероятностная модель для бинарной классификации;
  • Деревья решений — последовательность условий, ведущих к классу;
  • Случайный лес — ансамбль деревьев решений;
  • Метод опорных векторов (SVM) — поиск оптимальной разделяющей гиперплоскости;
  • K-ближайших соседей (KNN) — классификация по большинству соседей;
  • Нейронные сети — многослойные архитектуры для сложных задач.
from sklearn.ensemble import RandomForestClassifier

model = RandomForestClassifier(n_estimators=100)
model.fit(X_train, y_train)
predictions = model.predict(X_test)

Оценка качества:

  • Матрица ошибок (confusion matrix);
  • Точность (accuracy);
  • Полнота (recall);
  • F1-мера (F1-score);
  • ROC-кривая и площадь под ней (AUC).

Кластеризация данных

Кластеризация — это процесс группировки объектов по схожести без предварительных меток. Цель состоит в том, чтобы объекты внутри группы были максимально похожи, а группы — максимально различны.

Основные алгоритмы:

  • K-средних (K-Means) — разбиение на k кластеров с минимизацией внутрикластерного расстояния;
  • Иерархическая кластеризация — построение дерева кластеров (дендрограмма);
  • DBSCAN — кластеризация на основе плотности, устойчива к шуму;
  • Гауссовы смеси (GMM) — вероятностная модель кластеризации.
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans

df_scaled = StandardScaler().fit_transform(df.select_dtypes("number"))
kmeans = KMeans(n_clusters=3, random_state=42, n_init="auto")
clusters = kmeans.fit_predict(df_scaled)

Критерии выбора числа кластеров:

  • Метод локтя (elbow method);
  • Индекс силуэта (silhouette score);
  • Эвристические подходы на основе предметной области.

Тестирование гипотез

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

Шаги процедуры:

  1. Формулировка гипотез:
    • Нулевая гипотеза ($H_0$) — утверждение об отсутствии эффекта;
    • Альтернативная гипотеза ($H_1$) — утверждение об эффекте.
  2. Выбор уровня значимости ($\alpha$), обычно 0.05.
  3. Выбор статистического критерия (t-тест, U-тест Манна-Уитни, хи-квадрат и др.).
  4. Расчет статистики и p-значения.
  5. Сравнение p-значения с уровнем значимости.
  6. Принятие решения: отвергнуть или не отвергнуть $H_0$.
from scipy import stats

import pandas as pd

df = pd.read_csv("experiment.csv")
group_a = df.loc[df["group"] == "A", "metric"]
group_b = df.loc[df["group"] == "B", "metric"]

t_stat, p_val = stats.ttest_ind(group_a, group_b)
if p_val < 0.05:
print("Отвергаем нулевую гипотезу")
else:
print("Не отвергаем нулевую гипотезу")

Виды тестов:

  • Параметрические (предполагают нормальное распределение): t-тест, ANOVA;
  • Непараметрические (не требуют предположений о распределении): U-тест, Краскела-Уоллиса;
  • Тесты на нормальность: Шапиро-Уилка, Колмогорова-Смирнова.

Основные ограничения методов извлечения знаний из данных

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


Качество входных данных

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

  • Пропущенные значения, которые могут исказить статистику;
  • Шум и ошибки измерения, снижающие точность моделей;
  • Смещение выборки (bias), когда данные не репрезентативны для генеральной совокупности;
  • Несбалансированные классы в задачах классификации;
  • Дубликаты и артефакты сбора.

Принцип "мусор на входе — мусор на выходе" (Garbage In, Garbage Out) остается актуальным.


Риск ложных корреляций

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


Проблема переобучения (Overfitting)

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

Меры борьбы:

  • Регуляризация;
  • Уменьшение сложности модели;
  • Использование перекрестной проверки (cross-validation);
  • Разделение данных на обучающую, валидационную и тестовую выборки.

Интерпретируемость моделей

Сложные модели, такие как глубокие нейронные сети или ансамбли, часто работают как "черные ящики". Их внутренняя логика труднодоступна для понимания, что затрудняет объяснение решений, особенно в регулируемых отраслях.


Вычислительная сложность

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


Зависимость от предположений

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


Этические аспекты

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


Ограниченность контекста

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