Python для аналитика

pandas, numpy, matplotlib — инструменты которые используются в работе каждый день. С примерами кода.

pandas — загрузка и первичный анализ данных

~10 мин

read_csv, head, info, describe, shape — первые команды при работе с любым датасетом.

import pandas as pd

df = pd.read_csv('data.csv', parse_dates=['date'])

# Первичный осмотр
df.shape          # (строк, столбцов)
df.head(5)        # первые 5 строк
df.info()         # типы, пустые значения
df.describe()     # статистика по числовым
df.dtypes         # типы каждого столбца

# Фильтрация
active = df[df['status'] == 'active']
big_orders = df[df['amount'] > 10000]
df[(df['country'] == 'KZ') & (df['amount'] > 5000)]

# Выборка столбцов
df[['user_id', 'email', 'amount']]
df.loc[0:4, 'user_id':'email']   # по меткам
df.iloc[0:5, 0:3]                # по индексам

groupby, pivot_table, agg — агрегация

~10 мин

Группировка данных, сводные таблицы, несколько агрегатных функций за раз.

# groupby — аналог GROUP BY в SQL
monthly = df.groupby(df['date'].dt.to_period('M'))['amount'].agg(
    revenue='sum',
    orders='count',
    avg_check='mean'
).reset_index()

# Несколько уровней группировки
df.groupby(['country', 'category'])['amount'].sum().unstack()

# pivot_table — удобно для матриц
pivot = df.pivot_table(
    values='amount',
    index='country',
    columns='category',
    aggfunc='sum',
    fill_value=0
)

# apply — произвольная функция
df['bucket'] = df['amount'].apply(
    lambda x: 'high' if x > 50000 else ('mid' if x > 10000 else 'low')
)

Очистка данных — пропуски, дубли, типы

~8 мин

fillna, dropna, duplicated, astype — стандартные операции подготовки данных перед анализом.

# Пропущенные значения
df.isnull().sum()                     # сколько NaN в каждом столбце
df['age'].fillna(df['age'].median())  # заменить медианой
df.dropna(subset=['user_id', 'date']) # удалить строки с NaN в ключевых полях

# Дубликаты
df.duplicated().sum()                 # количество дублей
df.drop_duplicates(subset=['user_id', 'order_id'], inplace=True)

# Изменение типов
df['date'] = pd.to_datetime(df['date'])
df['amount'] = df['amount'].astype(float)
df['is_paid'] = df['status'].map({'paid': True, 'pending': False})

# Строковые операции
df['email'] = df['email'].str.lower().str.strip()
df['city']  = df['city'].str.replace(' ', '_')

# Winsorize — обрезать выбросы
p99 = df['amount'].quantile(0.99)
df['amount_clipped'] = df['amount'].clip(upper=p99)

Визуализация — matplotlib и seaborn

~9 мин

Линейный график, гистограмма, scatter plot, box plot — быстрый EDA и красивые отчёты.

import matplotlib.pyplot as plt
import seaborn as sns

# Линейный — динамика метрики
fig, ax = plt.subplots(figsize=(10, 4))
ax.plot(df['date'], df['revenue'], color='#22C55E', linewidth=2)
ax.set_title('Выручка по дням')
ax.set_xlabel('Дата')
ax.set_ylabel('₸')
plt.tight_layout()

# Гистограмма распределения
sns.histplot(df['amount'], bins=30, kde=True, color='#3B82F6')

# Scatter — корреляция двух метрик
sns.scatterplot(data=df, x='sessions', y='revenue', hue='country')

# Box plot — выбросы и медиана
sns.boxplot(data=df, x='category', y='amount', palette='Set2')

# Тепловая карта корреляций
corr = df[['revenue', 'sessions', 'cac', 'ltv']].corr()
sns.heatmap(corr, annot=True, cmap='RdYlGn', center=0)

numpy — статистика и векторные операции

~7 мин

mean, std, percentile, corrcoef — быстрые статистические вычисления без циклов.

import numpy as np

arr = df['amount'].values  # pandas → numpy array

np.mean(arr)               # среднее
np.median(arr)             # медиана
np.std(arr)                # стандартное отклонение
np.var(arr)                # дисперсия
np.percentile(arr, [25, 75])   # квартили
np.corrcoef(df['sessions'], df['revenue'])  # матрица корреляций

# Векторные операции — без циклов
prices = np.array([100, 200, 300])
tax = prices * 0.12        # элементно
discounted = np.where(prices > 150, prices * 0.9, prices)

# Случайные числа (для A/B симуляций)
np.random.seed(42)
control = np.random.normal(loc=100, scale=20, size=1000)
variant = np.random.normal(loc=108, scale=20, size=1000)

from scipy import stats

import type { Metadata } from 'next';

export const metadata: Metadata = {
  title: 'Python для аналитика',
  description: 'pandas, numpy, matplotlib — инструменты для работы с данными каждый день.',
  openGraph: { title: 'Python для аналитика', description: 'pandas, numpy, matplotlib — инструменты для работы с данными каждый день.' },
};

t_stat, p_value = stats.ttest_ind(control, variant)
print(f'p-value = {p_value:.4f}')  # < 0.05 → значимо