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

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);
  • Разделение данных на обучающую, валидационную и тестовую выборки.

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

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


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

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


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

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


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

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


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

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