Анализ данных на Python — это работа с таблицами, логами и выгрузками, в которой данные собирают, чистят, считают и визуализируют кодом на Python с помощью библиотек NumPy, pandas и Matplotlib. Сам язык здесь — «клей» между шагами: тяжелые вычисления внутри библиотек написаны на C и работают быстрее обычных циклов Python. Ниже — этапы работы, роли трех главных библиотек, один сквозной пример от CSV до графика и ошибки, на которых чаще всего спотыкаются новички.
Содержание
- Три термина, которые часто путают
- Почему для анализа берут Python
- Этапы анализа данных
- NumPy, pandas и Matplotlib: кто за что отвечает
- Первый пример: от CSV до графика
- Ошибка, которую делает почти каждый: считать строки
- Если не получилось
- Дорожная карта: от нуля до первого отчета
- Выводы
- Где применяется / связь с практикой
- FAQ
Примеры проверены 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 со столбчатой диаграммой из трех городов.
Что происходит по шагам
- Сбор.
read_csvчитает таблицу,parse_datesпревращает строку даты в тип даты. Первое, что стоит сделать с любыми новыми данными, — посмотретьdtypes: здесь видно, чтоamountпрочитан как строка из-за значения «2 300». - Очистка.
drop_duplicates(subset="order_id")убирает повтор заказа 2. Пробелы удаляем регулярным выражением\s: оно ловит и неразрывный пробел, которым Excel в русской локали разделяет тысячи (replace(" ", "")его не видит). Затемto_numeric(..., errors="coerce")переводит в число, а то, что перевести нельзя, молча превращает в пропуск — поэтому число пропусков печатаем: если их больше ожидаемого, часть сумм потерялась при очистке, а не отсутствовала в данных. Пустую сумму заказа 3 удаляем — это решение, а не правило: иногда пропуск правильнее заполнить или разобрать отдельно. - Анализ.
groupby+aggдают количество заказов, сумму и среднее по городу. Пермь с одним заказом лидирует по среднему, но на одной строке выводы делать рано — поэтомуcountстоит держать в таблице рядом со средним. - Визуализация.
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 график выводится в ячейке |
Дорожная карта: от нуля до первого отчета
- Поставить Python и Jupyter, прогнать пример выше без изменений.
- Заменить данные на свою выгрузку (CSV из банка, трекера задач, магазина) и пройти те же четыре шага.
- Научиться
pivot_table,merge(объединение таблиц) и работе с датами: группировка по неделям и месяцам. - Собрать артефакт — ноутбук, где есть вопрос, очищенные данные, 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) или считают агрегаты заранее в базе.



