Как вычислить среднее значение, дисперсию и стандартное отклонение в Python с NumPy?

Что такое NumPy и зачем он нужен?

NumPy (Numerical Python) — это фундаментальная библиотека для научных вычислений в Python. Она предоставляет мощные инструменты для работы с многомерными массивами и матрицами, а также включает в себя большой набор математических функций для выполнения операций над этими массивами. В контексте статистического анализа NumPy позволяет эффективно вычислять основные статистические показатели, такие как среднее значение, дисперсия и стандартное отклонение, что существенно ускоряет обработку данных по сравнению с использованием стандартных Python-структур данных.

Установка и импорт библиотеки NumPy

Прежде чем начать использовать NumPy, убедитесь, что она установлена. Это можно сделать с помощью pip:

pip install numpy

Для импорта библиотеки в ваш Python-скрипт используйте следующую команду:

import numpy as np

Мы будем использовать np в качестве общепринятого сокращения для NumPy.

Создание NumPy массивов

NumPy массивы (ndarray) — это основные структуры данных в NumPy. Они могут быть созданы из списков Python или других последовательностей. Например:

import numpy as np

data = [1, 2, 3, 4, 5]
array = np.array(data)
print(array) # Output: [1 2 3 4 5]

Также можно создавать многомерные массивы:

data_2d = [[1, 2, 3], [4, 5, 6]]
array_2d = np.array(data_2d)
print(array_2d)
# Output:
# [[1 2 3]
#  [4 5 6]]

Вычисление среднего значения с использованием NumPy

Функция numpy.mean(): синтаксис и параметры

Функция numpy.mean() вычисляет среднее арифметическое элементов массива. Её синтаксис прост:

np.mean(a, axis=None, dtype=None, out=None, keepdims=<no value>, *, where=<no value>)
  • a: Входной массив.
  • axis: Ось или оси, вдоль которых вычисляется среднее значение. По умолчанию None, что означает вычисление среднего для всех элементов массива.
  • dtype: Тип данных, используемый при вычислении среднего значения. Если не указан, используется тип данных массива.
  • out: Альтернативный массив, в который помещается результат.
  • keepdims: Если установлено в True, результирующий массив будет иметь ту же размерность, что и входной массив.
  • where: Элементы для включения в расчёт.

Примеры расчета среднего значения для одномерных и многомерных массивов

Для одномерного массива:

import numpy as np
from typing import List

def calculate_mean_1d(data: List[float]) -> float:
    """Calculates the mean of a 1D numpy array."""
    array = np.array(data)
    mean_value = np.mean(array)
    return mean_value

data = [1, 2, 3, 4, 5]
mean = calculate_mean_1d(data)
print(f"Mean: {mean}") # Output: Mean: 3.0

Для многомерного массива:

import numpy as np
from typing import List

def calculate_mean_2d(data: List[List[float]], axis: int = None) -> np.float64:
    """Calculates the mean of a 2D numpy array along a specified axis."""
    array_2d = np.array(data)
    mean_value = np.mean(array_2d, axis=axis)
    return mean_value

data_2d = [[1, 2, 3], [4, 5, 6]]
mean_all = calculate_mean_2d(data_2d)
mean_axis_0 = calculate_mean_2d(data_2d, axis=0)
mean_axis_1 = calculate_mean_2d(data_2d, axis=1)

print(f"Mean (all elements): {mean_all}") # Output: Mean (all elements): 3.5
print(f"Mean (axis 0): {mean_axis_0}") # Output: Mean (axis 0): [2.5 3.5 4.5]
print(f"Mean (axis 1): {mean_axis_1}") # Output: Mean (axis 1): [2. 5.]

Обработка NaN значений при расчете среднего значения

Если массив содержит значения NaN (Not a Number), np.mean() вернет NaN. Чтобы избежать этого, используйте функцию np.nanmean():

import numpy as np

data_with_nan = [1, 2, np.nan, 4, 5]
mean_with_nan = np.nanmean(data_with_nan)
print(f"Mean (ignoring NaN): {mean_with_nan}") # Output: Mean (ignoring NaN): 3.0

Расчет дисперсии с помощью NumPy

Функция numpy.var(): описание и аргументы

Функция numpy.var() вычисляет дисперсию элементов массива. Дисперсия показывает, насколько значения разбросаны относительно среднего значения. Синтаксис:

np.var(a, axis=None, dtype=None, out=None, ddof=0, keepdims=<no value>, *, where=<no value>)
  • a: Входной массив.
  • axis: Ось или оси, вдоль которых вычисляется дисперсия.
  • dtype: Тип данных для вычислений.
  • out: Альтернативный массив для результата.
  • ddof: «Delta Degrees of Freedom» — поправка для делителя при вычислении дисперсии. По умолчанию 0, что соответствует вычислению дисперсии для генеральной совокупности. Если установить 1, будет вычислена дисперсия для выборки.
  • keepdims: Сохранение размерности.
  • where: Элементы для включения в расчёт.

Вычисление дисперсии для различных типов данных и осей

import numpy as np
from typing import List

def calculate_variance(data: List[float], axis: int = None, ddof: int = 0) -> np.float64:
    """Calculates the variance of a numpy array."""
    array = np.array(data)
    variance = np.var(array, axis=axis, ddof=ddof)
    return variance

data = [1, 2, 3, 4, 5]
variance = calculate_variance(data)
print(f"Variance: {variance}") # Output: Variance: 2.0

data_2d = [[1, 2, 3], [4, 5, 6]]
variance_axis_0 = calculate_variance(data_2d, axis=0)
print(f"Variance (axis 0): {variance_axis_0}") # Output: Variance (axis 0): [2.25 2.25 2.25]
Реклама

Использование параметра ddof для корректировки смещенной оценки

Параметр ddof (Delta Degrees of Freedom) позволяет скорректировать оценку дисперсии. Если ddof=0 (по умолчанию), вычисляется дисперсия для генеральной совокупности. Если ddof=1, вычисляется несмещенная оценка дисперсии для выборки. Использование ddof=1 особенно важно при работе с небольшими выборками, чтобы избежать занижения дисперсии.

import numpy as np

data = [1, 2, 3, 4, 5]
variance_population = np.var(data, ddof=0)
variance_sample = np.var(data, ddof=1)

print(f"Variance (population): {variance_population}") # Output: Variance (population): 2.0
print(f"Variance (sample): {variance_sample}") # Output: Variance (sample): 2.5

Определение стандартного отклонения в NumPy

Функция numpy.std(): как она работает

Стандартное отклонение — это мера разброса значений относительно среднего, равная квадратному корню из дисперсии. Функция numpy.std() вычисляет стандартное отклонение. Синтаксис:

np.std(a, axis=None, dtype=None, out=None, ddof=0, keepdims=<no value>, *, where=<no value>)

Параметры аналогичны функции np.var().

Примеры вычисления стандартного отклонения для массивов

import numpy as np
from typing import List

def calculate_std_dev(data: List[float], axis: int = None, ddof: int = 0) -> np.float64:
    """Calculates the standard deviation of a numpy array."""
    array = np.array(data)
    std_dev = np.std(array, axis=axis, ddof=ddof)
    return std_dev

data = [1, 2, 3, 4, 5]
std_dev = calculate_std_dev(data)
print(f"Standard Deviation: {std_dev}") # Output: Standard Deviation: 1.4142135623730951

data_2d = [[1, 2, 3], [4, 5, 6]]
std_dev_axis_0 = calculate_std_dev(data_2d, axis=0)
print(f"Standard Deviation (axis 0): {std_dev_axis_0}") # Output: Standard Deviation (axis 0): [1.5 1.5 1.5]

Связь между дисперсией и стандартным отклонением

Стандартное отклонение является квадратным корнем из дисперсии:

import numpy as np

data = [1, 2, 3, 4, 5]
variance = np.var(data)
std_dev = np.std(data)

print(f"Variance: {variance}") # Output: Variance: 2.0
print(f"Standard Deviation: {std_dev}") # Output: Standard Deviation: 1.4142135623730951
print(f"sqrt(Variance): {np.sqrt(variance)}") # Output: sqrt(Variance): 1.4142135623730951

assert np.isclose(np.sqrt(variance), std_dev)

Примеры и Практическое применение

Комплексный пример: Анализ данных о продажах

Предположим, у нас есть данные о ежедневных продажах в интернет-магазине за месяц. Мы можем использовать NumPy для анализа этих данных.

import numpy as np
from typing import List

def analyze_sales_data(sales_data: List[float]) -> None:
    """Analyzes sales data to calculate mean, variance, and standard deviation."""
    sales_array = np.array(sales_data)
    mean_sales = np.mean(sales_array)
    variance_sales = np.var(sales_array)
    std_dev_sales = np.std(sales_array)

    print(f"Mean daily sales: {mean_sales:.2f}")
    print(f"Variance of daily sales: {variance_sales:.2f}")
    print(f"Standard deviation of daily sales: {std_dev_sales:.2f}")

# Sample sales data
sales_data = [120, 150, 130, 110, 160, 140, 125, 135, 145, 155, 115, 122, 133, 144, 155, 166, 127, 138, 149, 111, 122, 133, 144, 155, 166, 127, 138, 149, 160, 170]
analyze_sales_data(sales_data)

Этот пример показывает, как NumPy можно использовать для получения статистических показателей, которые могут быть полезны для анализа трендов продаж и принятия решений о маркетинговых кампаниях.

Сравнение производительности NumPy с ручными расчетами

NumPy обеспечивает значительное повышение производительности по сравнению с ручными расчетами или использованием стандартных Python-структур данных, особенно при работе с большими объемами данных. Это связано с тем, что NumPy использует векторизованные операции, которые выполняются гораздо быстрее.

Советы и лучшие практики при работе со статистическими функциями NumPy

  • Всегда проверяйте данные на наличие NaN значений и используйте np.nanmean(), np.nanvar() и np.nanstd() при необходимости.
  • Используйте параметр ddof осознанно, в зависимости от того, вычисляете ли вы статистику для генеральной совокупности или выборки.
  • При работе с многомерными массивами, внимательно следите за параметром axis, чтобы вычисления производились вдоль нужных осей.
  • Используйте типизацию данных для повышения читаемости и надежности кода.
  • Используйте векторизацию NumPy вместо циклов Python для повышения производительности.

Следуя этим советам, вы сможете эффективно использовать NumPy для статистического анализа данных в Python.


Добавить комментарий