Подготовка курса Компьютерный практикум по статистическому анализу данных
Содержание
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 dataset через
Практические шаги:
Загрузить данные 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)
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)
Материалы: