Анализ данных на Python: что это, этапы и первый пример

Анализ данных на Python: что это, этапы и первый пример Полезное

Анализ данных на Python — это работа с таблицами, логами и выгрузками, в которой данные собирают, чистят, считают и визуализируют кодом на Python с помощью библиотек NumPy, pandas и Matplotlib. Сам язык здесь — «клей» между шагами: тяжелые вычисления внутри библиотек написаны на C и работают быстрее обычных циклов Python. Ниже — этапы работы, роли трех главных библиотек, один сквозной пример от CSV до графика и ошибки, на которых чаще всего спотыкаются новички.

Примеры проверены 24.09.2026 на Python 3.14, pandas 3.0, NumPy 2.5 и Matplotlib 3.11.

Три термина, которые часто путают

  • Анализ данных — ответ на конкретный вопрос по данным: сколько, где, как изменилось, с чем связано. Результат — таблица, график, вывод для решения.
  • Data Science — шире: сюда входят статистика, эксперименты и построение моделей. Анализ данных — его базовая часть, но не синоним.
  • Машинное обучение — обучение модели, которая предсказывает на новых данных. Без предварительного анализа и очистки данных модель обычно учится на мусоре.

Упрощенно: аналитик отвечает «что было и почему», ML-модель — «что будет на новом объекте». Граница размыта, но для первого знакомства этого различения достаточно.

Почему для анализа берут Python

Python выбирают не за скорость самого языка, а за экосистему. Одна среда закрывает весь путь: чтение CSV, Excel и SQL-выгрузок, очистка, расчеты, графики, автоматизация отчета по расписанию. Код можно выполнять по кусочку в Jupyter Notebook и сразу видеть результат — удобно, когда гипотез много.

Есть и границы. Для таблицы на пару сотен строк и разового ответа Excel бывает быстрее. Если данные лежат в базе и нужны простые агрегаты, их разумнее посчитать SQL-запросом прямо в СУБД. pandas держит таблицу в оперативной памяти, поэтому для данных, которые в нее не помещаются, нужны другие инструменты (чтение частями, распределенная обработка).

Этапы анализа данных

Этапы ниже — не строгий конвейер: на практике после анализа часто возвращаются к очистке, потому что нашлась новая аномалия.

Этап Что делаем Типичные инструменты Частая ошибка
Сбор Загружаем CSV, Excel, выгрузку из БД или API pd.read_csv, pd.read_excel, pd.read_sql Не та кодировка или разделитель
Очистка Убираем дубли, приводим типы, решаем, что делать с пропусками drop_duplicates, to_numeric, dropna, fillna Числа остались строками
Анализ Группируем, считаем агрегаты, сравниваем периоды и сегменты groupby, agg, pivot_table, NumPy Среднее без учета выбросов и пропусков
Визуализация Строим график, который отвечает на вопрос Matplotlib, DataFrame.plot График есть, вывода нет

NumPy, pandas и Matplotlib: кто за что отвечает

Библиотека Главный объект Роль Когда нужна напрямую
NumPy ndarray — массив одного типа Быстрые вычисления над массивами без циклов Математика, матрицы, фильтры по условию
pandas Series (столбец) и DataFrame (таблица) Таблицы с подписями строк и столбцов, чтение файлов, группировки Почти в каждой аналитической задаче
Matplotlib Figure и Axes Графики любого вида, сохранение в PNG/SVG Настройка графика, отчеты в файлы

pandas построен поверх NumPy, а метод DataFrame.plot внутри вызывает Matplotlib. Поэтому новичку достаточно начать с pandas и подключать остальное по мере нужды.

Главная идея NumPy — векторизация: операция применяется ко всему массиву сразу.

import numpy as np

prices = np.array([1200, 850, 2300, 640, 1500])
qty = np.array([1, 2, 1, 3, 2])

revenue = prices * qty          # поэлементно, без цикла
print(revenue)                  # [1200 1700 2300 1920 3000]
print(revenue.sum(), revenue.mean())
print(revenue[revenue > 1800])  # фильтр маской
[1200 1700 2300 1920 3000]
10120 2024.0
[2300 1920 3000]

Первый пример: от CSV до графика

Задача: по выгрузке заказов понять, какой город приносит больше выручки. В данных специально оставлены типичные проблемы: дубль заказа, пустая сумма и сумма с пробелом внутри. Установка библиотек: pip install pandas matplotlib.

import io

import matplotlib
matplotlib.use("Agg")  # рисуем в файл, без окна
import matplotlib.pyplot as plt
import pandas as pd

# 1. Сбор: в реальной задаче это pd.read_csv("orders.csv") или выгрузка из БД
raw = io.StringIO("""order_id,date,city,amount
1,2026-09-01,Москва,1200
2,2026-09-01,Казань,850
2,2026-09-01,Казань,850
3,2026-09-02,Москва,
4,2026-09-02,Пермь,"2 300"
5,2026-09-03,Казань,640
6,2026-09-03,Москва,1500
""")
df = pd.read_csv(raw, parse_dates=["date"])
print(df.dtypes, end="\n\n")

# 2. Очистка
df = df.drop_duplicates(subset="order_id")
df["amount"] = pd.to_numeric(
    df["amount"].astype(str).str.replace(r"\s", "", regex=True), errors="coerce"
)
print("Пропусков в amount:", df["amount"].isna().sum())
df = df.dropna(subset=["amount"])

# 3. Анализ
by_city = (
    df.groupby("city")["amount"]
    .agg(["count", "sum", "mean"])
    .sort_values("sum", ascending=False)
)
print(by_city.round(1), end="\n\n")

# 4. Визуализация
ax = by_city["sum"].plot(kind="bar", title="Выручка по городам, руб.")
ax.set_xlabel("")
plt.tight_layout()
plt.savefig("revenue_by_city.png", dpi=120)
print("График сохранен: revenue_by_city.png")

В консоли появится:

order_id             int64
date        datetime64[us]
city                   str
amount                 str
dtype: object

Пропусков в amount: 1
        count     sum    mean
city                         
Москва      2  2700.0  1350.0
Пермь       1  2300.0  2300.0
Казань      2  1490.0   745.0

График сохранен: revenue_by_city.png

Рядом со скриптом появится файл revenue_by_city.png со столбчатой диаграммой из трех городов.

Что происходит по шагам

  1. Сбор. read_csv читает таблицу, parse_dates превращает строку даты в тип даты. Первое, что стоит сделать с любыми новыми данными, — посмотреть dtypes: здесь видно, что amount прочитан как строка из-за значения «2 300».
  2. Очистка. drop_duplicates(subset="order_id") убирает повтор заказа 2. Пробелы удаляем регулярным выражением \s: оно ловит и неразрывный пробел, которым Excel в русской локали разделяет тысячи (replace(" ", "") его не видит). Затем to_numeric(..., errors="coerce") переводит в число, а то, что перевести нельзя, молча превращает в пропуск — поэтому число пропусков печатаем: если их больше ожидаемого, часть сумм потерялась при очистке, а не отсутствовала в данных. Пустую сумму заказа 3 удаляем — это решение, а не правило: иногда пропуск правильнее заполнить или разобрать отдельно.
  3. Анализ. groupby + agg дают количество заказов, сумму и среднее по городу. Пермь с одним заказом лидирует по среднему, но на одной строке выводы делать рано — поэтому count стоит держать в таблице рядом со средним.
  4. Визуализация. matplotlib.use("Agg") рисует без окна — так скрипт работает и на сервере. В Jupyter эта строка не нужна, график покажется в ячейке.

Вывод типов зависит от версии: в pandas 3 текстовые столбцы по умолчанию получают тип str, а даты из parse_dates — разрешение [us]. В pandas 2.x тот же код покажет object и datetime64[ns]. Результат расчетов при этом одинаковый.

Ошибка, которую делает почти каждый: считать строки

Если пропустить очистку и сразу посчитать сумму столбца, прочитанного как текст:

import io
import pandas as pd

raw = io.StringIO("""order_id,city,amount
1,Москва,1200
2,Казань,850
4,Пермь,"2 300"
""")
df = pd.read_csv(raw)
print(df["amount"].sum())
print(df["amount"].mean())

Фактический результат в pandas 3.0:

12008502 300
Traceback (most recent call last):
  ...
TypeError: Cannot perform reduction 'mean' with string dtype

sum не упал, а склеил строки — это опаснее ошибки, потому что «число» выглядит правдоподобно. mean уже падает (в pandas 2.x текст ошибки другой: Could not convert string '12008502 300' to numeric). Исправление — привести тип до расчетов, как в шаге 2 примера выше, и проверить результат через df.dtypes: у amount должен быть числовой тип (float64 или int64).

Если не получилось

Симптом Вероятная причина Что сделать
ModuleNotFoundError: No module named 'pandas' Библиотека поставлена в другое окружение python -m pip install pandas тем же интерпретатором, которым запускаете скрипт
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcc ... Файл сохранен в cp1251 (часто выгрузки из Excel) pd.read_csv("file.csv", sep=";", encoding="cp1251")
Вся строка попала в один столбец Разделитель не запятая, а точка с запятой Указать sep=";"
Сумма выглядит как набор цифр подряд Столбец — строка, числа склеились pd.to_numeric после очистки пробелов и запятых
После to_numeric пропусков больше, чем пустых ячеек errors="coerce" молча превратил в пропуск значения, которые не распознал (неразрывный пробел, запятая как десятичный разделитель) Посмотреть исходные строки, где появился пропуск; чистить через str.replace(r"\s", "", regex=True), запятую менять на точку
Скрипт отработал, окна с графиком нет Нет plt.show() или включен режим без окна В скрипте — plt.show() или plt.savefig(...); в Jupyter график выводится в ячейке

Дорожная карта: от нуля до первого отчета

  1. Поставить Python и Jupyter, прогнать пример выше без изменений.
  2. Заменить данные на свою выгрузку (CSV из банка, трекера задач, магазина) и пройти те же четыре шага.
  3. Научиться pivot_table, merge (объединение таблиц) и работе с датами: группировка по неделям и месяцам.
  4. Собрать артефакт — ноутбук, где есть вопрос, очищенные данные, 2-3 графика и абзац вывода. Такой ноутбук уже можно показать коллеге или положить в портфолио.

Подробнее про устройство Series и DataFrame — в статье Основы работы с pandas: Series и DataFrame, а про место анализа в более широкой картине — в материале Введение в Data Science.

Выводы

  • Анализ данных на Python — это сбор, очистка, анализ и визуализация кодом; этапы повторяются по кругу, а не идут строго один раз.
  • NumPy дает быстрые вычисления над массивами, pandas — таблицы и группировки поверх NumPy, Matplotlib — графики; начинать удобнее с pandas.
  • Первое действие с новыми данными — проверить типы столбцов: текстовый столбец с числами в pandas склеивается при sum вместо сложения.
  • Поведение зависит от версии: pandas 3 по умолчанию хранит текст как str, pandas 2 — как object.
  • Для небольших разовых задач подойдет Excel, для агрегатов в базе — SQL; Python выигрывает, когда шаги нужно повторять и автоматизировать.

Где применяется / связь с практикой

Освойте тему на практике

Те же четыре шага встречаются в отчетах по продажам, анализе воронки и маркетинговых кампаний, разборе логов и подготовке данных для моделей. Разница между учебным и рабочим примером — в объеме и грязи данных, но инструменты те же. Системно пройти путь от основ Python до аналитических отчетов на pandas и визуализации можно на курсе «Python для аналитики». Попробовать формат и задать вопросы практикам можно на открытых уроках Otus.

FAQ

Нужно ли знать математику, чтобы начать анализ данных на Python?
Для первых отчетов хватает арифметики, процентов и понимания среднего и медианы. Статистика понадобится, когда появятся выводы вида «разница между группами неслучайна».

Чем Jupyter Notebook отличается от обычного скрипта .py?
В ноутбуке код выполняется по ячейкам, а результаты и графики сохраняются рядом с кодом — удобно для исследования. Скрипт удобнее запускать по расписанию и хранить в репозитории.

Сколько строк выдержит pandas?
Жесткого лимита нет: ограничение — оперативная память, а таблица в памяти обычно занимает больше, чем CSV на диске. Для данных, которые не помещаются, читают файл частями (chunksize) или считают агрегаты заранее в базе.

OTUS Журнал
Скидка 5% 14-20 сентября на курсы (popup)