Подготовка курса Компьютерный практикум по статистическому анализу данных

2025-05-06 · 6 мин. для прочтения
Содержание

1 Общая информация

2 Лабораторные работы

2.1 Основы описательной статистики

  • Цель: Освоить расчет базовых статистических показателей и визуализацию данных.

  • Теоретическая часть:

    • Определения: среднее, медиана, мода, дисперсия, стандартное отклонение, квартили.
    • Интерпретация boxplot и гистограмм.
  • План выполнения:

    • Установить пакеты Statistics, StatsBase, Plots.
    • Сгенерировать массив данных (например, data = randn(100)).
    • Рассчитать среднее, медиану, моду, стандартное отклонение.
    • Построить boxplot и гистограмму распределения.
    • Сравнить эмпирические квартили с теоретическими для нормального распределения.
  • Практические шаги:

    • Установить пакеты:

      using Pkg; Pkg.add(["Statistics", "StatsBase", "Plots"])
      
    • Сгенерировать данные:

      data = randn(100) # 100 точек из стандартного нормального распределения
      
    • Рассчитать показатели:

      using Statistics, StatsBase
      mean_val = mean(data)
      median_val = median(data)
      mode_val = mode(data) # из StatsBase
      
    • Построить графики:

      using Plots
      histogram(data, label="Распределение")
      savefig("histogram.png")
      
  • Материалы:

2.2 Генерация данных и распределения

  • Цель: Изучить работу с вероятностными распределениями в Julia.

  • Теоретическая часть:

    • Функции плотности (PDF) и распределения (CDF).
    • Особенности нормального и экспоненциального распределений.
  • План выполнения:

    • Импортировать Distributions.jl.
    • Создать объекты распределений: Normal(0,1), Exponential(2).
    • Сгенерировать по 500 точек для каждого распределения.
    • Построить гистограммы и наложить теоретические PDF-кривые.
    • Рассчитать вероятность P(X < 1) для нормального распределения через cdf().
  • Практические шаги:

    • Импортировать пакет:

      using Distributions
      
    • Создать распределения:

      d_normal = Normal(0, 1)
      d_exp = Exponential(2)
      
    • Сгенерировать выборки:

      samples_normal = rand(d_normal, 500)
      
    • Рассчитать вероятность:

      prob = cdf(d_normal, 1) # P(X ≤ 1)
      
  • Материалы:

2.3 Проверка гипотез (t-тесты)

  • Цель: Научиться сравнивать средние двух выборок.

  • Теоретическая часть:

    • Нулевая и альтернативная гипотезы.
    • Интерпретация p-значения и доверительных интервалов.
  • План выполнения:

    • Создать две выборки: group_a = rand(Normal(5, 2), 30), group_b = rand(Normal(6, 2), 30).
    • Провести независимый t-тест: UnequalVarianceTTest(group_a, group_b).
    • Рассчитать 95% доверительный интервал для разницы средних.
      • Визуализировать распределения с помощью violin-plot.
  • Практические шаги:

    • Создать выборки:

      group_a = rand(Normal(5, 2), 30)
      group_b = rand(Normal(6, 2), 30)
      
    • Провести t-тест:

      using HypothesisTests
      test_result = UnequalVarianceTTest(group_a, group_b)
      p_value(test_result) # Получить p-значение
      
  • Материалы:

2.4 Непараметрические тесты

  • Цель: Анализ данных с нарушением предположений о нормальности.

  • Теоретическая часть:

    • Преимущества ранговых тестов.
    • Критерий Шапиро-Уилка.
  • План выполнения:

    • Сгенерировать данные с выбросами: data = [randn(50); randn(10)*3 .+ 5].
    • Провести тест Шапиро-Уилка на нормальность.
    • Выполнить ранговый анализ (Манна-Уитни для двух групп).
    • Сравнить результаты с параметрическим t-тестом.
  • Практические шаги:

    • Проверить нормальность:

      using HypothesisTests
      shapiro_test = ShapiroWilkTest(data)
      
    • Тест Манна-Уитни:

      mannwhitneyu(group_a, group_b)
      
  • Материалы:

  • https://juliastats.org/HypothesisTests.jl/stable/nonparametric/

2.5 Дисперсионный анализ (ANOVA)

  • Цель: Сравнение средних трех и более групп.
  • Теоретическая часть:
    • F-статистика и ее интерпретация.
    • Поправки на множественные сравнения.
  • План выполнения:
    • Создать три группы данных с разными средними.
    • Сформировать DataFrame с метками групп.
    • Запустить однофакторный ANOVA: anova_lm(@formula(Y ~ Group), df).
    • Выполнить пост-хок анализ с поправкой Бонферрони.
    • Визуализировать результаты через групповые boxplot.
  • Практические шаги:
    • Создать DataFrame:

      using DataFrames
      df = DataFrame(Y = vcat(group_a, group_b, group_c),
                    Group = repeat(["A", "B", "C"], inner=30))
      
    • Запустить ANOVA:

      using GLM
      anova_result = anova_lm(@formula(Y ~ Group), df)
      
  • Материалы: https://juliastats.org/GLM.jl/stable/

2.6 Корреляционный анализ

  • Цель: Исследование взаимосвязи переменных.

  • Теоретическая часть:

    • Корреляция Пирсона vs Спирмена.
    • Визуализация scatter plot.
  • План выполнения:

    • Загрузить датасет с двумя числовыми переменными (например, рост и вес).
    • Рассчитать корреляцию Пирсона и Спирмена.
    • Построить scatter plot с линией регрессии.
    • Проверить значимость корреляции через permutation test.
  • Практические шаги:

    • Рассчитать корреляцию:

      cor_pearson = cor(x, y)
      cor_spearman = corspearman(x, y)
      
    • Построить график:

      scatter(x, y, label="Точки", xlabel="X", ylabel="Y")
      
  • Материалы: https://juliastats.org/StatsBase.jl/stable/

2.7 Линейная регрессия

  • Цель: Построение и оценка линейной модели.

  • Теоретическая часть:

    • Метод наименьших квадратов.
    • Интерпретация R² и коэффициентов.
  • План выполнения:

    • Сгенерировать синтетические данные: X = rand(100); Y = 2*X .+ randn(100).
    • Обучить модель: model = lm(@formula(Y ~ X), DataFrame(X=X, Y=Y)).
    • Извлечь коэффициенты, R², p-значения.
    • Построить график остатков vs предсказанных значений.
  • Практические шаги:

    • Обучить модель:

      using GLM
      model = lm(@formula(Y ~ X), df)
      
    • Анализ остатков:

      residuals = residuals(model)
      
  • Материалы: https://juliastats.org/GLM.jl/stable/

2.8 Логистическая регрессия

  • Цель: Классификация бинарных данных.

  • Теоретическая часть:

    • Функция сигмоиды.
    • ROC-AUC анализ.
  • План выполнения:

    • Создать бинарный таргет: Y = Int.(rand(100) .> 0.5).
    • Обучить модель: glm(@formula(Y ~ X), df, Binomial(), LogitLink()).
    • Рассчитать AUC-ROC с помощью ROCAnalysis.jl.
    • Построить calibration plot для оценки калибровки модели.
  • Практические шаги:

    • Обучить модель:

      model = glm(@formula(Y ~ X), df, Binomial(), LogitLink())
      
    • Рассчитать AUC:

      using ROCAnalysis
      roc_curve = roc(y_true, y_pred)
      
  • Материалы: https://github.com/davidavdav/ROCAnalysis.jl

2.9 Кластеризация данных

  • Цель: Группировка данных методом k-средних.

  • Теоретическая часть:

    • Метрика силуэтета.
    • Оптимальное число кластеров.
  • План выполнения:

    • Загрузить Iris dataset через RDatasets.jl.
    • Нормализовать данные (Z-score).
    • Запустить k-means с k=3: kmeans_result = kmeans(data, 3).
    • Оценить силу кластеризации через silhouette score.
    • Визуализировать кластеры в 2D (PCA-проекция).
  • Практические шаги:

    • Загрузить данные Iris:

      using RDatasets
      iris = dataset("datasets", "iris")
      
    • Запустить k-means:

      using Clustering
      result = kmeans(Matrix(iris[:, 1:4])', 3)
      
  • Материалы: https://juliastats.org/Clustering.jl/stable/

2.10 PCA и снижение размерности

  • Цель: Уменьшение размерности данных.

  • Теоретическая часть:

    • Собственные значения и векторы.
    • Объясненная дисперсия.
  • План выполнения:

    • Загрузить многомерные данные (например, геномные показатели).
    • Выполнить стандартизацию признаков.
    • Применить PCA: M = fit(PCA, data; maxoutdim=2).
    • Визуализировать проекции на первые две компоненты.
    • Проанализировать вклад переменных в компоненты.
  • Практические шаги:

    • Стандартизация:

      using MultivariateStats
      M = fit(PCA, data; maxoutdim=2)
      
    • Визуализация:

      transform(M, data) # Проекция данных
      
  • Материалы:

2.11 Анализ временных рядов

  • Цель: Прогнозирование с использованием ARIMA.

  • Теоретическая часть:

    • Стационарность ряда.
    • Подбор параметров (p, d, q).
  • План выполнения:

    • Импортировать данные временного ряда (например, ежемесячные продажи).
    • Построить график ряда с выделением тренда и сезонности.
    • Обучить модель ARIMA: arima_model = arima(train_data, order=(1,1,1)).
    • Спрогнозировать значения на 10 шагов вперед.
    • Рассчитать RMSE на тестовой выборке.
  • Практические шаги:

    • Построить ACF/PACF:

      using TimeSeries
      autocor(ts_data) # Автокорреляция
      
    • Обучить ARIMA:

      using ARIMA
      model = arima(train_data, order=(1,1,1))
      
  • Материалы: https://juliastats.org/TimeSeries.jl/stable/

2.12 Байесовская статистика

  • Цель: Построение вероятностных моделей.

  • Теоретическая часть:

    • Априорные и апостериорные распределения.
    • MCMC-сэмплирование.
  • План выполнения:

    • Определить байесовскую модель.
    • Запустить MCMC-сэмплирование через Turing.jl.
    • Визуализировать апостериорное распределение θ.
    • Сравнить с частотным подходом (доверительные интервалы).
  • Практические шаги:

    • Определить модель в Turing.jl:

      using Turing
      @model function coin_model(y)
          θ ~ Beta(1, 1)
          y ~ Bernoulli(θ)
      end
      
    • Запустить сэмплер:

      chain = sample(coin_model(data), NUTS(), 1000)
      
  • Материалы: https://turing.ml/stable/

2.13 Бутстреп и устойчивые методы

  • Цель: Оценка устойчивости статистик.

  • Теоретическая часть:

    • Бутстреп-доверительные интервалы.
    • Робастная регрессия.
  • План выполнения:

    • Сгенерировать данные с выбросами.
    • Рассчитать бутстреп-доверительный интервал для медианы.
    • Обучить робастную регрессию: rlm(@formula(Y ~ X), df).
    • Сравнить коэффициенты с обычной линейной регрессией.
    • Визуализировать влияние выбросов на обе модели.
  • Практические шаги:

    • Бутстреп-интервал для медианы:

      using Bootstrap
      boot_med = bootstrap(median, data, 1000)
      
    • Робастная регрессия:

      using RobustModels
      rlm(@formula(Y ~ X), df)
      
  • Материалы: https://github.com/juliangehring/Bootstrap.jl

2.14 Power-анализ и размер выборки

  • Цель: Планирование экспериментов.

  • Теоретическая часть:

    • Мощность статистического теста.
    • Влияние размера эффекта.
  • План выполнения:

    • Задать параметры: ожидаемый эффект (d=0.5), α=0.05, мощность=0.8.
    • Рассчитать минимальный размер выборки через PowerAnalyses.jl.
    • Провести симуляцию 1000 A/B-тестов с рассчитанным N.
    • Оценить фактическую мощность (доля отвергнутых H₀).
    • Построить зависимость мощности от величины эффекта.
  • Практические шаги:

    • Расчет размера выборки:

      using PowerAnalyses
      n = required_sample_size(d=0.5, α=0.05, power=0.8)
      
    • Симуляция A/B-теста:

      simulate_ab_test(n, effect_size=0.5)
      
  • Материалы:

3 Литература

4 Библиография

Литература

Дмитрий Сергеевич Кулябов
Authors
Профессор кафедры теории вероятностей и кибербезопасности
Мои научные интересы включают физику, администрирование Unix и сетей.