Анализ данных на Python: ключевые задачи и подходы

Раздел: Научные вычисления -> Анализ данных и научные вычисления

Анализ данных включает множество рутинных и сложных операций: загрузку, очистку, преобразование, визуализацию, статистическую проверку гипотез и построение прогнозных моделей. Python с его библиотеками предоставляет элегантные способы решения каждой из этих задач. В статье рассматриваются практические приёмы, которые помогут быстро перейти от сырых данных к осмысленным выводам.

Основные задачи анализа данных на Python

Как эффективно загрузить, очистить и проанализировать табличные данные?

Библиотека pandas - основной инструмент для работы с таблицами. Покажем типовой пайплайн на примере датасета с ценами на недвижимость.

import pandas as pd

# Загрузка данных
url = 'https://example.com/housing.csv'
df = pd.read_csv(url)

# Просмотр первых строк
print(df.head())

# Информация о типах и пропусках
print(df.info())

# Удаление строк с пропусками в важной колонке
df.dropna(subset=['price'], inplace=True)

# Заполнение пропусков в численных колонках медианой
for col in ['bedrooms', 'bathrooms']:
    df[col].fillna(df[col].median(), inplace=True)

# Группировка и агрегация
stats = df.groupby('city')['price'].agg(['mean', 'std', 'count'])
print(stats.head())

# Сохранение результата
stats.to_csv('city_stats.csv')

Python для инженерных задач (python для инженерных задач)

После загрузки полезно визуализировать распределение цен:

import matplotlib.pyplot as plt

df['price'].hist(bins=30, edgecolor='black')
plt.title('Распределение цен на недвижимость')
plt.xlabel('Цена')
plt.ylabel('Частота')
plt.show()

задачи для анализа данных python (задачи анализа данных на python)

Типичные проблемы: неправильное определение типов при чтении (попробовать dtype), колонка с ценами содержит строки с символами валют (использовать pd.to_numeric(..., errors='coerce')), дубликаты строк (df.drop_duplicates()).

Как выполнить быстрые математические операции над массивами?

Библиотека numpy идеальна для численных расчётов с большими массивами. Пример вычисления среднего и стандартного отклонения, а также матричного умножения:

import numpy as np

# Создание случайных данных
arr = np.random.normal(loc=10, scale=2, size=(100, 5))

# Среднее по каждой колонке
means = arr.mean(axis=0)
print('Средние:', means)

# Стандартное отклонение
stds = arr.std(axis=0)
print('Стд. откл.:', stds)

# Матричное умножение
A = np.random.rand(3, 4)
B = np.random.rand(4, 2)
C = A @ B
print('Результат умножения (3x2):\n', C)

задачи линейного программирования python (задачи линейного программирования на python)

Типичные ошибки: несоответствие размерностей при матричном умножении (использовать reshape или транспонирование), потеря производительности при использовании циклов вместо векторизованных операций, неявное приведение типов (лучше задать dtype).

Как провести статистический тест (t-тест, корреляция)?

Библиотека scipy предоставляет функции для проверки гипотез. Пример независимого t-теста и корреляции Пирсона:

from scipy import stats

# Генерация двух выборок
np.random.seed(0)
sample1 = np.random.normal(5, 1, 30)
sample2 = np.random.normal(5.5, 1, 30)

# t-тест для независимых выборок
t_stat, p_value = stats.ttest_ind(sample1, sample2)
print(f't-статистика: {t_stat:.3f}, p-значение: {p_value:.4f}')

# Корреляция Пирсона
x = np.linspace(0, 10, 100)
y = 2*x + np.random.normal(0, 1, 100)
r, p_corr = stats.pearsonr(x, y)
print(f'Коэффициент корреляции: {r:.3f}, p-value: {p_corr:.2e}')

ии для решения задач на python (использование ии для решения задач на python)

Типичные ошибки: игнорирование допущений теста (нормальность, равенство дисперсий - использовать stats.levene), неверное определение альтернативы (параметр alternative), работа с пропущенными значениями (удалить их перед тестом).

Как построить информативные графики для анализа распределений и зависимостей?

Matplotlib и seaborn позволяют создавать профессиональные визуализации. Пример гистограммы, scatter plot, boxplot и heatmap корреляций:

import seaborn as sns
import matplotlib.pyplot as plt

# Загрузка встроенного датасета iris
df = sns.load_dataset('iris')

# Гистограмма с kde
sns.histplot(data=df, x='sepal_length', kde=True)
plt.show()

# Scatter plot с группировкой по виду
sns.scatterplot(data=df, x='sepal_length', y='sepal_width', hue='species')
plt.show()

# Boxplot по видам
sns.boxplot(data=df, x='species', y='petal_length')
plt.show()

# Тепловая карта корреляций
corr_matrix = df.drop(columns='species').corr()
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm')
plt.show()

Типичные ошибки: перегруженность графиков (использовать plt.subplots для раздельного вывода), неправильная цветовая палитра для дальтоников (выбирать colorblind в seaborn), обрезка подписей осей (добавить plt.tight_layout()).

Как применить линейную регрессию для прогнозирования?

Scikit-learn даёт готовые классы для машинного обучения. Пример построения модели линейной регрессии для прогноза стоимости дома:

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score

# Подготовка данных (используем датасет из pandas)
X = df.drop(columns=['price']).select_dtypes(include='number')
y = df['price']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

model = LinearRegression()
model.fit(X_train, y_train)

y_pred = model.predict(X_test)

print(f'MSE: {mean_squared_error(y_test, y_pred):.2f}')
print(f'R^2: {r2_score(y_test, y_pred):.3f}')

Типичные ошибки: не масштабирование признаков (регрессия в sklearn не требует, но для других моделей нужно StandardScaler), мультиколлинеарность (проверить VIF), переобучение (использовать Ridge или Lasso).

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

Дополнительные примеры

1. Обработка временных рядов с pandas

Датасет с дневными температурами. Вычисление скользящего среднего и агрегация по месяцам.

Пример
import pandas as pd
import numpy as np

# Создание временного ряда
dates = pd.date_range('2023-01-01', periods=365, freq='D')
temp = np.random.normal(15, 5, 365)
df = pd.DataFrame({'date': dates, 'temp': temp})
df.set_index('date', inplace=True)

# Скользящее среднее (окно 7 дней)
df['rolling_7'] = df['temp'].rolling(window=7).mean()

# Средняя температура по месяцам
monthly = df.resample('M')['temp'].mean()
print(monthly.head())

# Нахождение аномалий (отклонение более 2 сигм от скользящего среднего)
df['anomaly'] = (df['temp'] - df['rolling_7']).abs() > 2 * df['temp'].rolling(7).std()
anomalies = df[df['anomaly']]
print('Количество аномалий:', len(anomalies))
2023-01-31    14.2
2023-02-28    15.1
2023-03-31    14.8
...
Количество аномалий: 14

2. Многомерные преобразования с numpy

Работа с трёхмерными массивами - свёртка изображения (градиент).

Пример
import numpy as np

# Создание тестового изображения 4x4
image = np.array([[10, 20, 30, 40],
                  [50, 60, 70, 80],
                  [90,100,110,120],
                  [130,140,150,160]])

# Ядро Собеля для выделения границ по оси X
kernel = np.array([[-1, 0, 1],
                   [-2, 0, 2],
                   [-1, 0, 1]])

# Операция свёртки с нулевым паддингом
pad = 1
padded = np.pad(image, pad, mode='constant')
output = np.zeros_like(image)
for i in range(image.shape[0]):
    for j in range(image.shape[1]):
        region = padded[i:i+3, j:j+3]
        output[i,j] = np.sum(region * kernel)
print('Результат градиента (X):\n', output)
Результат градиента (X):
 [[ 60  60  60  60]
 [120 120 120 120]
 [120 120 120 120]
 [ 60  60  60  60]]

3. Непараметрические статистические тесты в scipy

Тест Манна-Уитни для непараметрического сравнения двух групп.

Пример
from scipy.stats import mannwhitneyu

# Данные с выбросами (не подчиняются нормальному распределению)
group1 = [10, 12, 14, 15, 100]  # один большой выброс
group2 = [11, 13, 13, 16, 17]

stat, p = mannwhitneyu(group1, group2, alternative='two-sided')
print(f'Статистика U: {stat}, p-значение: {p:.4f}')

# Визуализация с помощью boxplot (seaborn)
import seaborn as sns
import pandas as pd
df = pd.DataFrame({'val': group1+group2, 'grp': ['A']*5 + ['B']*5})
sns.boxplot(x='grp', y='val', data=df)
plt.show()
Статистика U: 12.5, p-значение: 0.8345

4. Продвинутая визуализация: Pairplot и настройка стилей

Pairplot с разными диагональными элементами и ограничением количества признаков.

Пример
import seaborn as sns
import matplotlib.pyplot as plt

# Используем датасет penguins
penguins = sns.load_dataset('penguins')
penguins.dropna(inplace=True)

# Pairplot только для двух видов (Adelie и Chinstrap)
subset = penguins[penguins['species'].isin(['Adelie', 'Chinstrap'])]
sns.pairplot(subset, vars=['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm'],
             hue='species', diag_kind='kde', palette='Set2', markers=['o', 's'])
plt.suptitle('Pairplot выборочных признаков', y=1.02)
plt.show()
(График с тремя парами scatter и kde на диагонали)

5. Регуляризованная регрессия (Ridge) с подбором alpha

Используем встроенный датасет диабета из sklearn.

Пример
from sklearn.datasets import load_diabetes
from sklearn.linear_model import Ridge
from sklearn.model_selection import cross_val_score
import numpy as np

diabetes = load_diabetes()
X, y = diabetes.data, diabetes.target

alphas = np.logspace(-3, 3, 7)
cv_scores = []
for alpha in alphas:
    model = Ridge(alpha=alpha)
    scores = cross_val_score(model, X, y, cv=5, scoring='neg_mean_squared_error')
    cv_scores.append(-scores.mean())

best_alpha = alphas[np.argmin(cv_scores)]
print('Лучшая alpha:', best_alpha, 'с MSE:', min(cv_scores))

# Обучение модели с лучшей alpha
final_model = Ridge(alpha=best_alpha)
final_model.fit(X, y)
print('Коэффициенты:', final_model.coef_[:5])
Лучшая alpha: 10.0 с MSE: 2905.4
Коэффициенты: [ -9.1  205.9  518.3  306.8  -75.0 ...]

Задачи анализа данных на Python - comments

En
задачи для анализа данных python (python)