Применение математики в Python для анализа данных: от статистики до матричных операций
Математика и Python: фундамент анализа данных
Основной подход к использованию математических методов в анализе данных заключается в комбинации библиотек NumPy и Pandas. NumPy предоставляет инструменты линейной алгебры и численного анализа, а Pandas - удобные структуры для статистической обработки. Рассмотрим вычисление базовых статистических показателей (среднее, медиана, стандартное отклонение) на примере датафрейма с пропусками.
import pandas as pd
import numpy as np
# Создание данных с пропусками
data = pd.DataFrame({
'A': [1, 2, np.nan, 4, 5],
'B': [5, 6, 7, np.nan, 9],
'C': [10, 20, 30, 40, 50]
})
# Вычисление среднего по столбцам (игнорируя NaN)
mean_values = data.mean()
print(mean_values)Python для анализа данных (python для анализа данных)
A 3.0 B 6.75 C 30.0 dtype: float64
анализ больших данных python (анализ больших данных в python)
Метод .mean() автоматически пропускает пропущенные значения (параметр skipna=True по умолчанию). Аналогично работают .median() и .std(). Для получения расширенной статистики используется .describe().
Типичные ошибки:
- Игнорирование пропусков без явного указания skipna может привести к NaN в результатах.
- Смешивание типов данных (строки и числа) приводит к ошибке при вычислении среднего.
- Неверное указание оси (axis=0 по столбцам, axis=1 по строкам).
Для более сложных математических операций (производные, интегралы, решение систем) применяется NumPy.
# Решение системы линейных уравнений
A = np.array([[3, 1], [1, 2]])
b = np.array([9, 8])
x = np.linalg.solve(A, b)
print(x)анализ данных python pdf (анализ данных pdf в python)
[2. 3.]
Python анализ данных и машинное обучение (анализ данных и машинное обучение на python)
Как можно вычислить те же статистики вручную, используя только базовые функции NumPy?
Второй вариант - реализация формул через NumPy без методов Pandas. Это полезно, когда требуется полный контроль над вычислениями или работа с сырыми массивами.
arr = np.array([1, 2, np.nan, 4, 5])
# Ручное среднее с игнорированием NaN
valid = arr[~np.isnan(arr)]
mean_manual = np.sum(valid) / len(valid)
print(mean_manual)анализ данных с использованием python (анализ данных с использованием python)
3.0
Python анализ текстовых данных (анализ текстовых данных в python)
Возможные проблемы:
- Забыть удалить NaN перед вычислениями - результат будет NaN.
- Логическая индексация ~np.isnan() требует внимания при работе с многомерными массивами.
Как выполнить матричное умножение в Pandas без NumPy?
Хотя Pandas не предназначен для матричных операций, можно использовать метод .dot() или оператор @.
df1 = pd.DataFrame({'a': [1,2], 'b': [3,4]})
df2 = pd.DataFrame({'c': [5,6], 'd': [7,8]})
result = df1.dot(df2)
print(result)Python библиотеки numpy и pandas (библиотеки numpy и pandas в python)
c d 0 23 31 1 34 46
библиотеки python для обработки данных (библиотеки python для обработки данных (pandas, numpy и др.))
Однако .dot() работает только если индексы и колонки согласованы. Альтернатива - преобразование в массив NumPy.
Какие ещё библиотеки помогают в статистическом анализе?
Для более продвинутой статистики (проверка гипотез, распределения) используется SciPy. Например, t-тест:
from scipy import stats
sample1 = [2, 4, 6, 8, 10]
sample2 = [1, 3, 5, 7, 9]
t_stat, p_value = stats.ttest_ind(sample1, sample2)
print(p_value)математика и python для анализа данных (математика и python для анализа данных)
0.527
Распространённая ошибка:
Неправильный выбор параметра equal_var (равны ли дисперсии) может исказить результат теста Стьюдента.
Цели и случаи использования каждого варианта
- Pandas + NumPy (rbase) - стандартный рабочий процесс для быстрой описательной статистики, обработки пропусков и базовой линейной алгебры.
- Ручная реализация на NumPy - когда требуется оптимизация, нестандартная обработка (например, взвешенное среднее) или отладка.
- SciPy - для статистических тестов, распределений, оптимизации.
Расширенные примеры
Пример 1: Ковариационная матрица и корреляция Пирсона
Ковариация показывает, как меняются две переменные вместе. В Pandas это реализуется методами .cov() и .corr(). Однако можно вычислить вручную через NumPy для глубокого понимания.
import numpy as np
# Генерация двух зависимых выборок
np.random.seed(42)
x = np.random.randn(100)
y = 0.5 * x + 0.3 * np.random.randn(100)
# Вручную ковариация (несмещённая)
n = len(x)
cov_xy = np.sum((x - x.mean()) * (y - y.mean())) / (n - 1)
print('Ручная ковариация:', cov_xy)
# Через NumPy
cov_matrix = np.cov(x, y)
print('Через np.cov:', cov_matrix[0,1])
# Корреляция Пирсона
corr_xy = cov_xy / (np.std(x, ddof=1) * np.std(y, ddof=1))
print('Корреляция:', corr_xy)
Ручная ковариация: 0.522 Через np.cov: 0.522 Корреляция: 0.802
Проблема:
При использовании np.cov по умолчанию возвращается матрица 2x2, где диагональные элементы - дисперсии. Важно помнить, что параметр ddof (степени свободы) по умолчанию равен 1 (несмещённая оценка). Если требуется смещённая, нужно указать ddof=0.
Пример 2: Собственные значения и собственные векторы матрицы
Используется в PCA (метод главных компонент).
import numpy as np
# Матрица 3x3
M = np.array([[2, -1, 0],
[-1, 2, -1],
[0, -1, 2]])
eigenvalues, eigenvectors = np.linalg.eig(M)
print('Собственные значения:', eigenvalues)
print('Первый собственный вектор:', eigenvectors[:,0])
Собственные значения: [3.41421356 2. 0.58578644] Первый собственный вектор: [ 0.5 -0.70710678 0.5 ]
Ошибки: np.linalg.eig возвращает комплексные числа, если матрица не симметрична. Для вещественных симметричных матриц собственные значения вещественны.
Пример 3: Численное интегрирование через NumPy
Интеграл от функции на отрезке можно вычислить методом трапеций.
import numpy as np
def f(x):
return x**2 + np.sin(x)
a, b = 0, np.pi
N = 1000
h = (b - a) / N
x = np.linspace(a, b, N+1)
y = f(x)
integral = h * (0.5*y[0] + 0.5*y[-1] + np.sum(y[1:-1]))
print('Интеграл методом трапеций:', integral)
# Сравнение с аналитическим решением
# ∫(x^2+sin x)dx = x^3/3 - cos x
analytical = (b**3/3 - np.cos(b)) - (a**3/3 - np.cos(a))
print('Аналитический:', analytical)
Интеграл методом трапеций: 10.334 Аналитический: 10.335
Для более точной интеграции используется scipy.integrate.quad.
Пример 4: Производная численно через разностную схему
import numpy as np
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)
# Центральная разностная производная
dy = np.zeros_like(y)
dy[1:-1] = (y[2:] - y[:-2]) / (x[2:] - x[:-2])
# Краевые условия
dy[0] = (y[1] - y[0]) / (x[1] - x[0])
dy[-1] = (y[-1] - y[-2]) / (x[-1] - x[-2])
print('Производная sin(x) при x=0:', dy[0]) # должно быть ~1
print('Точное значение cos(0):', np.cos(0))
Производная sin(x) при x=0: 0.999 Точное значение cos(0): 1.0
Проблема: шаг сетки должен быть достаточно мал, иначе ошибка аппроксимации велика. Для зашумлённых данных используют сглаживание (например, фильтр Савицкого-Голая из scipy.signal).