Python: основные библиотеки анализа данных и их применение
Для кого эта статья:
- Новички в области анализа данных и программирования
- Профессионалы, желающие усовершенствовать навыки работы с Python и библиотеками для анализа данных
Студенты и специалисты, заинтересованные в карьере аналитика данных и необходимых инструментах для работы
Python покорил мир анализа данных, и на это есть веские причины. Мощное трио библиотек — NumPy, Pandas и Matplotlib — превратили этот язык в незаменимый инструмент для всех, кто работает с информацией. 📊 Эти библиотеки решают три критические задачи: NumPy обеспечивает молниеносные вычисления с многомерными массивами, Pandas мастерски обрабатывает таблицы любой сложности, а Matplotlib превращает сухие цифры в наглядные визуализации. Даже если вы только начинаете путь в анализе данных, освоение этих инструментов откроет перед вами огромные возможности — от простой обработки CSV-файлов до продвинутого машинного обучения.
Хотите за 9 месяцев освоить не только NumPy, Pandas и Matplotlib, но и стать востребованным аналитиком данных? Курс Профессия аналитик данных от Skypro превращает новичков в профессионалов с зарплатой от 90 000 рублей. Вы освоите Python, SQL и BI-инструменты под руководством практикующих экспертов, работая с реальными кейсами от бизнеса. 87% выпускников трудоустраиваются в первые 3 месяца после обучения. Пора перестать читать о возможностях и начать их использовать!
Python для анализа данных: что такое NumPy, Pandas и Matplotlib
Python стал стандартом в анализе данных благодаря своей простоте и мощным специализированным библиотекам. Трио NumPy, Pandas и Matplotlib формирует ядро инструментария аналитика данных, создавая полный цикл обработки информации — от вычислений до визуализации. 🐍
NumPy (Numerical Python) — фундамент научных вычислений в Python. Он вводит многомерные массивы и функции для их эффективной обработки, обеспечивая производительность, сравнимую с C/C++. NumPy незаменим для линейной алгебры, статистических операций и случайных генераций.
Pandas строится на NumPy и предоставляет структуры данных, оптимизированные для анализа: DataFrame и Series. По сути, это мощный Excel в Python, умеющий справляться с миллионами строк данных. Pandas особенно силен в обработке временных рядов и табличных данных.
Matplotlib — это библиотека визуализации, превращающая числовые данные в понятные графики. Она предлагает API для создания профессиональных визуализаций — от простых линейных графиков до сложных тепловых карт и 3D-визуализаций.
| Библиотека | Основное назначение | Ключевые структуры данных | Когда использовать |
|---|---|---|---|
| NumPy | Научные вычисления | ndarray (n-мерный массив) | Векторизованные операции, матричные вычисления, случайные числа |
| Pandas | Анализ структурированных данных | DataFrame, Series | Обработка CSV/Excel, фильтрация, группировка, слияние данных |
| Matplotlib | Визуализация данных | Figure, Axes | Построение графиков, диаграмм и других визуализаций |
Вместе эти библиотеки образуют экосистему, которая трансформирует Python из языка общего назначения в специализированный инструмент анализа данных. Они интегрируются между собой: NumPy обеспечивает вычислительную мощность, Pandas структурирует данные, а Matplotlib визуализирует результаты.
Михаил Карпов, ведущий аналитик данных
Когда я пришел в аналитику из традиционного программирования, меня поразила скорость решения задач с помощью этих библиотек. Помню проект по анализу клиентских транзакций в финтех-компании. Нам требовалось проанализировать миллионы записей и выявить аномалии. Только представьте — код на чистом Python обрабатывал данные 47 минут. Переписав его с использованием NumPy и Pandas, я сократил время до 39 секунд! Для визуализации результатов использовал Matplotlib, создав дашборд с графиками отклонений. Руководство было в восторге, а я окончательно понял, почему эта триада библиотек — золотой стандарт в индустрии.

Установка и настройка библиотек для работы с данными
Перед погружением в анализ данных необходимо корректно установить требуемые библиотеки. Процесс установки прост, особенно при использовании менеджера пакетов pip или дистрибутивов вроде Anaconda. 🛠️
Установка через pip — стандартный способ для большинства проектов:
pip install numpy pandas matplotlib
Anaconda — предпочтительный вариант для новичков, так как включает предустановленные библиотеки и удобную среду Jupyter Notebook:
- Загрузите и установите Anaconda с официального сайта
- После установки откройте Anaconda Navigator
- Запустите Jupyter Notebook или JupyterLab для работы
Если библиотеки необходимо установить в существующее окружение Anaconda:
conda install numpy pandas matplotlib
Проверка установки — критический шаг для убеждения в корректности настройки:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
print(np.__version__)
print(pd.__version__)
print(matplotlib.__version__)
При работе в виртуальных окружениях (что рекомендуется для изоляции зависимостей проекта), используйте следующий подход:
# Создание виртуального окружения
python -m venv myenv
# Активация (Windows)
myenv\Scripts\activate
# Активация (macOS/Linux)
source myenv/bin/activate
# Установка библиотек
pip install numpy pandas matplotlib
Для профессиональной разработки рекомендуется создавать файл requirements.txt со списком зависимостей:
numpy==1.24.3
pandas==2.0.1
matplotlib==3.7.1
Затем установка выполняется одной командой:
pip install -r requirements.txt
| Метод установки | Преимущества | Недостатки | Рекомендуется для |
|---|---|---|---|
| pip | Простота, универсальность | Возможные конфликты зависимостей | Опытных пользователей, проектов с четкими требованиями |
| Anaconda | Предустановленные библиотеки, удобная экосистема | Занимает больше места на диске | Начинающих, научных проектов |
| Виртуальные окружения | Изоляция зависимостей, воспроизводимость | Дополнительные шаги настройки | Промышленной разработки, командных проектов |
После установки рекомендую создать тестовый Jupyter-блокнот для проверки работоспособности. Простой график с использованием всех трех библиотек убедит вас в корректности настройки:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# Создаем данные с помощью NumPy
x = np.linspace(0, 10, 100)
y = np.sin(x)
# Преобразуем в DataFrame с помощью Pandas
df = pd.DataFrame({'x': x, 'y': y})
# Визуализируем с помощью Matplotlib
plt.figure(figsize=(10, 6))
plt.plot(df['x'], df['y'])
plt.title('Синусоида')
plt.xlabel('X')
plt.ylabel('sin(X)')
plt.grid(True)
plt.show()
Основы NumPy: массивы, индексация и математические операции
NumPy — это сердце экосистемы анализа данных в Python. Библиотека предоставляет эффективные структуры данных и алгоритмы, которые выполняются значительно быстрее стандартных Python-списков. Ключевой объект NumPy — многомерный массив ndarray. 🧮
Создание массивов — первый шаг в работе с NumPy:
import numpy as np
# Создание массива из Python-списка
arr1 = np.array([1, 2, 3, 4, 5])
# Создание массива с нулями
zeros = np.zeros((3, 4)) # матрица 3x4 из нулей
# Создание массива с единицами
ones = np.ones((2, 2)) # матрица 2x2 из единиц
# Создание массива с диапазоном чисел
range_arr = np.arange(0, 10, 2) # [0, 2, 4, 6, 8]
# Создание линейно распределенных значений
linspace = np.linspace(0, 1, 5) # 5 точек от 0 до 1
# Случайные числа
random_arr = np.random.random((2, 3)) # матрица 2x3 со случайными числами
Основные атрибуты и методы массивов:
shape: форма массива (размерности)ndim: количество измеренийsize: общее количество элементовdtype: тип данных элементов
Индексация и срезы — мощный механизм доступа к элементам массива:
# Создадим двумерный массив
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# Доступ к элементу
element = arr[1, 2] # 6
# Срезы строк и столбцов
row = arr[1, :] # [4, 5, 6]
column = arr[:, 1] # [2, 5, 8]
# Сложные срезы
subset = arr[0:2, 1:3] # [[2, 3], [5, 6]]
# Логическая индексация
mask = arr > 5
filtered = arr[mask] # [6, 7, 8, 9]
Векторизованные операции — ключевое преимущество NumPy, позволяющее выполнять вычисления над всеми элементами массива без явных циклов:
# Арифметические операции
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
sum_result = a + b # [5, 7, 9]
diff_result = a – b # [-3, -3, -3]
prod_result = a * b # [4, 10, 18]
div_result = a / b # [0\.25, 0.4, 0.5]
exp_result = a ** 2 # [1, 4, 9]
# Статистические функции
mean_value = np.mean(a) # 2.0
max_value = np.max(a) # 3
sum_value = np.sum(a) # 6
std_value = np.std(a) # 0.816...
# Тригонометрические и другие математические функции
angles = np.array([0, np.pi/2, np.pi])
sin_values = np.sin(angles) # [0\., 1., 0.]
log_values = np.log(a) # [0\., 0.693..., 1.098...]
Анна Сергеева, научный сотрудник
В нашей лаборатории мы обрабатываем огромные массивы экспериментальных данных. До знакомства с NumPy каждый расчет занимал часы — мы использовали обычные циклы Python для обработки сигналов с датчиков. Однажды я попробовала переписать один из скриптов с использованием векторизованных операций NumPy. Помню свое удивление, когда процесс, ранее занимавший 45 минут, завершился за 12 секунд! Особенно нас выручает работа с многомерными массивами: данные с наших сенсоров естественно представляются как 3D-массивы (время, координаты X и Y). NumPy делает вычисление корреляций, фильтрацию и визуализацию таких данных элегантной и молниеносной. Теперь мы можем обрабатывать в 10 раз больше экспериментов с тем же оборудованием.
Преобразования формы и объединение массивов:
# Изменение формы
arr = np.arange(12)
reshaped = arr.reshape(3, 4) # преобразование в матрицу 3x4
# Транспонирование
transposed = reshaped.T # транспонирование матрицы
# Объединение массивов
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
vertical = np.vstack((a, b)) # вертикальное объединение
horizontal = np.hstack((a, b)) # горизонтальное объединение
Линейная алгебра — одна из сильных сторон NumPy:
# Умножение матриц
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
matrix_product = np.dot(a, b) # или a @ b в Python 3.5+
# Вычисление собственных значений и векторов
eigenvalues, eigenvectors = np.linalg.eig(a)
# Решение системы линейных уравнений
x = np.linalg.solve(a, np.array([1, 2]))
Освоение NumPy открывает дверь к эффективной обработке числовых данных. Векторизация операций не только ускоряет код, но и делает его более читаемым и поддерживаемым, что критически важно для сложных проектов анализа данных.
Pandas в действии: обработка и анализ структурированных данных
Pandas поднимает анализ данных на новый уровень, предлагая интуитивные структуры данных для работы с табличной информацией. Эта библиотека особенно полезна при обработке реальных наборов данных, которые часто бывают неполными, шумными и требуют очистки. 📈
Основные структуры данных в Pandas:
Series— одномерный индексированный массив данныхDataFrame— двумерная таблица с именованными столбцами
import pandas as pd
import numpy as np
# Создание Series
s = pd.Series([1, 3, 5, np.nan, 6, 8])
# Создание DataFrame из словаря
data = {
'Имя': ['Анна', 'Борис', 'Виктор', 'Галина'],
'Возраст': [25, 30, 35, 40],
'Город': ['Москва', 'Санкт-Петербург', 'Казань', 'Новосибирск']
}
df = pd.DataFrame(data)
# Создание DataFrame из CSV-файла
# df = pd.read_csv('data.csv')
Исследование и визуализация данных — первый шаг в любом аналитическом процессе:
# Просмотр первых/последних строк
df.head() # первые 5 строк
df.tail(3) # последние 3 строки
# Основная информация о DataFrame
df.info()
df.describe() # статистическое описание числовых столбцов
# Проверка наличия пропущенных значений
df.isnull().sum()
# Быстрая визуализация данных
df['Возраст'].hist() # гистограмма возрастов
df.plot(kind='bar', x='Имя', y='Возраст') # столбчатая диаграмма
Индексация и выбор данных в Pandas похожи на NumPy, но имеют дополнительные возможности:
# Выбор столбца
ages = df['Возраст']
# Выбор нескольких столбцов
subset = df[['Имя', 'Город']]
# Выбор по условию
young_people = df[df['Возраст'] < 35]
# Выбор по местоположению с iloc
first_row = df.iloc[0]
specific_cells = df.iloc[0:2, 1:3]
# Выбор по метке с loc
by_name = df.loc[df['Имя'] == 'Анна']
Обработка пропущенных данных — критический этап в работе с реальными данными:
# Создадим DataFrame с пропусками
df_missing = pd.DataFrame({
'A': [1, 2, np.nan, 4],
'B': [5, np.nan, np.nan, 8],
'C': [9, 10, 11, 12]
})
# Проверка наличия пропусков
missing_values = df_missing.isnull().sum()
# Удаление строк с пропусками
df_dropped = df_missing.dropna()
# Заполнение пропусков
df_filled = df_missing.fillna(0) # заполнение нулями
df_mean_filled = df_missing.fillna(df_missing.mean()) # заполнение средним значением
Группировка и агрегация — мощные инструменты для аналитики:
# Создадим DataFrame с данными о продажах
sales = pd.DataFrame({
'Дата': pd.date_range(start='2023-01-01', periods=10),
'Товар': ['A', 'B', 'A', 'C', 'B', 'A', 'C', 'B', 'A', 'C'],
'Количество': [10, 15, 8, 12, 20, 5, 15, 10, 7, 18],
'Цена': [100, 200, 100, 300, 200, 100, 300, 200, 100, 300]
})
# Добавим столбец с выручкой
sales['Выручка'] = sales['Количество'] * sales['Цена']
# Группировка по товару и подсчет статистики
grouped = sales.groupby('Товар').agg({
'Количество': 'sum',
'Выручка': ['sum', 'mean']
})
# Сводная таблица
pivot = sales.pivot_table(
values='Выручка',
index='Товар',
columns=sales['Дата'].dt.day,
aggfunc='sum'
)
Объединение и слияние данных — необходимые операции при работе с несколькими источниками:
# Создадим два DataFrame для демонстрации
employees = pd.DataFrame({
'ID': [1, 2, 3, 4],
'Имя': ['Алексей', 'Мария', 'Иван', 'Елена'],
'Отдел ID': [10, 20, 10, 30]
})
departments = pd.DataFrame({
'Отдел ID': [10, 20, 30],
'Название': ['Разработка', 'Маркетинг', 'HR']
})
# Внутреннее соединение (inner join)
merged = pd.merge(employees, departments, on='Отдел ID')
# Левое соединение (left join)
left_merged = pd.merge(employees, departments, on='Отдел ID', how='left')
# Конкатенация DataFrame по строкам
df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df2 = pd.DataFrame({'A': [5, 6], 'B': [7, 8]})
concatenated = pd.concat([df1, df2], axis=0)
# Конкатенация по столбцам
concatenated_cols = pd.concat([df1, df2], axis=1)
Работа с временными рядами — одна из сильных сторон Pandas:
# Создание временного ряда
dates = pd.date_range('20230101', periods=6)
ts = pd.Series(np.random.randn(6), index=dates)
# Ресемплирование (изменение частоты) временного ряда
monthly = ts.resample('M').mean() # среднее по месяцам
# Скользящее окно
rolling_mean = ts.rolling(window=3).mean()
# Сдвиг данных
shifted = ts.shift(1) # сдвиг на 1 период вперед
Экспорт данных в различные форматы:
# Экспорт в CSV
df.to_csv('output.csv', index=False)
# Экспорт в Excel
df.to_excel('output.xlsx', sheet_name='Sheet1')
# Экспорт в JSON
df.to_json('output.json', orient='records')
Визуализация результатов с помощью Matplotlib: графики и диаграммы
Визуализация — это мост между сложными данными и человеческим пониманием. Matplotlib предоставляет мощный инструментарий для создания профессиональных визуализаций, от базовых графиков до сложных многослойных диаграмм. 📉
Основы Matplotlib начинаются с понимания его двух основных интерфейсов:
- MATLAB-подобный процедурный интерфейс (plt)
- Объектно-ориентированный интерфейс (работа с объектами Figure и Axes)
import matplotlib.pyplot as plt
import numpy as np
# Процедурный интерфейс
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.figure(figsize=(10, 6)) # Размер в дюймах
plt.plot(x, y)
plt.title('Синусоида')
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.grid(True)
plt.show()
# Объектно-ориентированный интерфейс
fig, ax = plt.subplots(figsize=(10, 6))
ax.plot(x, y)
ax.set_title('Синусоида')
ax.set_xlabel('x')
ax.set_ylabel('sin(x)')
ax.grid(True)
plt.show()
Создание различных типов графиков для отображения разных аспектов данных:
# Линейный график
plt.figure(figsize=(12, 8))
x = np.linspace(0, 10, 100)
plt.plot(x, np.sin(x), label='sin(x)')
plt.plot(x, np.cos(x), label='cos(x)')
plt.legend()
plt.title('Тригонометрические функции')
plt.show()
# Гистограмма
data = np.random.randn(1000)
plt.figure(figsize=(10, 6))
plt.hist(data, bins=30, alpha=0.7, color='blue')
plt.title('Гистограмма нормального распределения')
plt.show()
# Диаграмма рассеивания (scatter plot)
x = np.random.rand(50)
y = x + np.random.rand(50) * 0.5
plt.figure(figsize=(10, 6))
plt.scatter(x, y, c=x, cmap='viridis', s=100, alpha=0.7)
plt.colorbar(label='Значение X')
plt.title('Диаграмма рассеивания')
plt.show()
# Столбчатая диаграмма
categories = ['A', 'B', 'C', 'D', 'E']
values = np.random.randint(1, 10, size=len(categories))
plt.figure(figsize=(10, 6))
plt.bar(categories, values, color='teal')
plt.title('Столбчатая диаграмма')
plt.show()
Настройка стиля и форматирования для создания профессиональных визуализаций:
# Доступные стили
print(plt.style.available)
# Применение стиля
plt.style.use('seaborn-darkgrid')
# Настройка цветов и стиля линий
plt.figure(figsize=(12, 8))
plt.plot(x, np.sin(x), 'r--', linewidth=2, label='sin(x)')
plt.plot(x, np.cos(x), 'b-', linewidth=2, label='cos(x)')
plt.legend(fontsize=12)
plt.title('Тригонометрические функции', fontsize=16)
plt.xlabel('x', fontsize=14)
plt.ylabel('y', fontsize=14)
plt.grid(True, linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()
# Настройка пределов осей и меток
plt.figure(figsize=(10, 6))
plt.plot(x, np.sin(x))
plt.xlim(0, 10)
plt.ylim(-1.5, 1.5)
plt.xticks([0, np.pi, 2*np.pi, 3*np.pi], ['0', '$\pi$', '$2\pi$', '$3\pi$'])
plt.show()
Работа с подграфиками для создания сложных панелей визуализации:
# Создание сетки подграфиков
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
# Верхний левый график
axes[0, 0].plot(x, np.sin(x))
axes[0, 0].set_title('sin(x)')
# Верхний правый график
axes[0, 1].plot(x, np.cos(x), 'r')
axes[0, 1].set_title('cos(x)')
# Нижний левый график
axes[1, 0].plot(x, np.sin(2*x), 'g')
axes[1, 0].set_title('sin(2x)')
# Нижний правый график
axes[1, 1].plot(x, np.cos(2*x), 'b')
axes[1, 1].set_title('cos(2x)')
# Настройка общего заголовка и расположения
plt.suptitle('Тригонометрические функции', fontsize=16)
plt.tight_layout(rect=[0, 0, 1, 0.96]) # Оставляем место для общего заголовка
plt.show()
Добавление аннотаций и дополнительных элементов:
plt.figure(figsize=(10, 6))
plt.plot(x, np.sin(x))
# Добавление текста
plt.text(5, 0.5, 'Максимум', fontsize=12)
# Добавление аннотации со стрелкой
plt.annotate('Локальный минимум',
xy=(3*np.pi/2, -1),
xytext=(4, -0.5),
arrowprops=dict(facecolor='black', shrink=0.05))
# Добавление горизонтальной и вертикальной линий
plt.axhline(y=0, color='k', linestyle='-', alpha=0.3)
plt.axvline(x=np.pi, color='r', linestyle='--', alpha=0.3)
plt.title('Аннотированный график синусоиды')
plt.show()
Интеграция с Pandas для быстрой визуализации данных фреймов:
import pandas as pd
# Создаем DataFrame с данными о продажах
months = ['Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июн']
sales_data = {
'Продукт A': [10, 15, 12, 18, 20, 22],
'Продукт B': [5, 8, 10, 12, 15, 18],
'Продукт C': [8, 9, 7, 10, 12, 14]
}
df = pd.DataFrame(sales_data, index=months)
# Построение линейного графика напрямую из DataFrame
df.plot(figsize=(10, 6), marker='o')
plt.title('Ежемесячные продажи по продуктам')
plt.ylabel('Количество продаж')
plt.grid(True, linestyle='--', alpha=0.7)
plt.show()
# Построение столбчатой диаграммы
df.plot(kind='bar', figsize=(12, 6), width=0.8)
plt.title('Ежемесячные продажи по продуктам')
plt.ylabel('Количество продаж')
plt.show()
# Построение круговой диаграммы для последнего месяца
df.iloc[-1].plot(kind='pie', figsize=(10, 10), autopct='%1.1f%%')
plt.title('Доля продаж по продуктам в июне')
plt.ylabel('') # Удаляем метку оси Y, которая по умолчанию добавляется
plt.show()
Сохранение визуализаций в различных форматах:
# Создаем график
plt.figure(figsize=(10, 6))
plt.plot(x, np.sin(x))
plt.title('Синусоида')
# Сохраняем в различных форматах
plt.savefig('sine_wave.png', dpi=300) # PNG с высоким разрешением
plt.savefig('sine_wave.pdf') # PDF для печати
plt.savefig('sine_wave.svg') # SVG для веб
plt.show()
Matplotlib — чрезвычайно гибкая библиотека, позволяющая тонко настраивать каждый аспект визуализации. Хотя начальная кривая обучения может быть крутой, овладение этим инструментом позволяет создавать впечатляющие визуализации, которые эффективно передают информацию в данных.
Освоение триады NumPy, Pandas и Matplotlib — это не просто изучение инструментов, а приобретение нового мышления для работы с данными. Эти библиотеки трансформируют сложные аналитические задачи в интуитивно понятный код. Начните с простых примеров, постепенно переходя к более сложным проектам. Регулярная практика с реальными данными — ключ к мастерству. Помните, что каждая строчка кода приближает вас к пониманию скрытых паттернов в данных и принятию решений на их основе.