Подготовка курса Компьютерный практикум по статистическому анализу данных
Содержание
1 Общая информация
- Сделан на основе Подготовка курса Компьютерный практикум
- От общих вопросов матмоделирования сделан переход к обработке статданных.
2 Содержание для РПД
2.1 Julia. Установка и настройка. Основные принципы
Установка Julia и среды разработки, например, Emacs, VS Code с расширением Julia, Jupyter Notebook через IJulia. Изучается работа с REPL (интерактивная консоль): выполнение команд, режимы help и shell, работа с пакетами (Pkg.add, Pkg.update, using). Вводятся ключевые принципы языка: множественная диспетчеризация (multiple dispatch) как основа производительности и гибкости, JIT-компиляция (LLVM), динамическая типизация с возможностью аннотаций, отсутствие глобальной области видимости. Рассматриваются базовые типы данных: целые числа (Int), числа с плавающей точкой (Float64), строки (String), символы (Char), кортежи (Tuple) и именованные кортежи (NamedTuple), а также функции для работы с ними.
2.2 Структуры данных
Основные структуры данных Julia. Подробно разбираются массивы (Array): создание одномерных (Vector) и многомерных (Matrix), индексация (прямая и обратная, диапазоны), векторизованные операции (broadcasting через точку), конкатенация (vcat, hcat), изменяемые и неизменяемые коллекции. Рассматриваются словари (Dict) и множества (Set) — создание, добавление/удаление элементов, итерация по ключам/значениям, особенности хеширования. Вводятся кортежи (Tuple) как неизменяемые последовательности и именованные кортежи (NamedTuple). Изучаются высокопроизводительные специализированные структуры: StaticArrays (фиксированный размер), SparseArrays (разреженные матрицы), а также концепция отсутствующего значения (missing) и работа с ним (skipmissing, coalesce). Демонстрируются операции с массивами: map, filter, reduce, comprehensions (генераторы массивов).
2.3 Управляющие структуры
Управляющие конструкции языка. Изучаются условные операторы: if-elseif-else (тернарный оператор ? :), короткое замыкание && и ||. Рассматриваются циклы: for (перебор диапазонов, массивов, пар ключ-значение), while, вложенные циклы, досрочный выход break и переход к следующей итерации continue. Вводятся конструкции для обработки ошибок: try-catch-finally, throw(ErrorException), @assert. Разбирается работа с локальными областями видимости (let, do), особенности глобальной области в REPL и скриптах. Демонстрируются итераторы (enumerate, zip, eachindex, pairs) и их применение для эффективного обхода коллекций без выделения промежуточной памяти. Изучается использование составных выражений (begin-end, ;) для группировки операторов.
2.4 Линейная алгебра
Выполнение матричных вычислений в Julia. Изучается встроенный тип Matrix (двумерный массив) и основные операции: сложение/вычитание (элементное), умножение матриц (через *), транспонирование ('), вычисление следа (tr), определителя (det), ранга (rank), собственных чисел и векторов (eigen). Рассматриваются специальные матричные типы: Diagonal, Symmetric, Tridiagonal, UpperTriangular, LowerTriangular, обеспечивающие эффективное хранение и операции. Вводится пакет LinearAlgebra (стандартная библиотека), функции lu, qr, svd (разложения), inv (обратная матрица), решение систем линейных уравнений (оператор \). Демонстрируются работа с комплексными числами (Complex), матричные нормы (norm, opnorm), обусловленность (cond). Разбирается использование разреженных матриц (SparseArrays) и итеративных методов (Conjugate Gradient, GMRES).
2.5 Графика в Julia
Визуализация данных. Изучается экосистема графических пакетов: Plots.jl (универсальный фронтенд с бэкендами GR, PyPlot, Plotly), Makie.jl (высокопроизводительная интерактивная графика), StatsPlots.jl (статистические графики). Разбираются базовые типы графиков: линейный (plot), точечный (scatter), гистограмма (histogram), ящик с усами (boxplot), тепловая карта (heatmap). Настройка внешнего вида: заголовки, подписи осей (xlabel, ylabel), легенда (label, legend), цвета (palette), стили линий (linewidth, linestyle). Демонстрируется создание подграфиков (subplot, layout), сохранение изображений (savefig), анимация (@gif). Вводятся специализированные пакеты: VegaLite.jl (декларативная грамматика графиков), UnicodePlots.jl (графика в терминале). Рассматриваются примеры визуализации распределений, регрессионных кривых, матриц корреляции, временных рядов.
2.6 Функции
Функции в Julia. Изучаются синтаксис: function … end, краткая форма f(x) = x^2, анонимные функции x -> x^2. Рассматриваются аргументы: обязательные, опциональные (со значениями по умолчанию), ключевые (keyword), переменное количество (args..., kwargs...). Вводится концепция множественной диспетчеризации: определение методов для разных типов аргументов (например, f(x::Int) и f(x::Float64)). Изучается возврат значений (return, автоматический возврат последнего выражения). Обсуждается эффективность: предсказуемость типов (type stability), аннотации @code_warntype, методы ввода-вывода для пользовательских типов. Демонстрируются функции высшего порядка (map, filter, reduce, foldl), композиция функций (∘), замыкания. Рассматриваются правила видимости переменных (глобальные, локальные, внешние), декоратор @inline, рекурсивные функции.
2.7 Введение в Data Science
Основы анализа данных на Julia. Изучается работа с табличными данными через DataFrames.jl: создание DataFrame, импорт из CSV (CSV.jl), просмотр (first, last), фильтрация строк (subset, filter), выбор столбцов (select, Not), создание новых переменных (transform), группировка и агрегация (groupby, combine). Рассматриваются обработка пропущенных значений (dropmissing, coalesce), объединение таблиц (innerjoin, leftjoin), изменение типов столбцов (transform!). Вводится тидата-фрейм (TidyData.jl) для преобразования данных из широкого формата в длинный. Изучаются описательная статистика (Statistics.mean, std, median, quantile), корреляционный анализ (cor), частотные таблицы (countmap). Демонстрируются конвейерные операции через макрос @chain (Chain.jl). Рассматриваются примеры: анализ датасета Iris, обработка логов сервера, очистка реальных данных.
2.8 Прогнозирование
Построение моделей прогнозирования. Изучается линейная регрессия (GLM.jl): формула @formula(y ~ x1 + x2), обучение модели (lm), оценка качества (R², RMSE, MAE), проверка значимости коэффициентов (coeftable). Вводятся обобщённые линейные модели (логистическая регрессия для бинарного отклика, пуассоновская регрессия для счётных данных). Рассматриваются методы регуляризации (Ridge, Lasso) через GLMNet.jl. Для временных рядов изучается пакет TimeSeries.jl: создание временного ряда, сезонная декомпозиция, скользящие средние. Демонстрируются модели прогнозирования: ARIMA (TSModels.jl, StatsModels.jl), экспоненциальное сглаживание (ExponentialSmoothing.jl). Рассматриваются решающие деревья и случайный лес (DecisionTree.jl). Изучается оценка качества прогнозов: разбиение на обучающую и тестовую выборки (train_test_split), перекрёстная проверка (k-fold CV). Обсуждается проблема переобучения и методы борьбы с ним.
3 Лабораторные работы
3.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")
Материалы:
3.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)
Материалы:
3.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-значение
Материалы:
3.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/
3.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/
3.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/
3.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/
3.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
3.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/
3.10 PCA и снижение размерности
Цель: Уменьшение размерности данных.
Теоретическая часть:
- Собственные значения и векторы.
- Объясненная дисперсия.
План выполнения:
- Загрузить многомерные данные (например, геномные показатели).
- Выполнить стандартизацию признаков.
- Применить PCA:
M = fit(PCA, data; maxoutdim=2). - Визуализировать проекции на первые две компоненты.
- Проанализировать вклад переменных в компоненты.
Практические шаги:
Стандартизация:
using MultivariateStats M = fit(PCA, data; maxoutdim=2)Визуализация:
transform(M, data) # Проекция данных
Материалы:
3.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/
3.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/
3.13 Бутстреп и устойчивые методы
Цель: Оценка устойчивости статистик.
Теоретическая часть:
- Бутстреп-доверительные интервалы.
- Робастная регрессия.
План выполнения:
- Сгенерировать данные с выбросами.
- Рассчитать бутстреп-доверительный интервал для медианы.
- Обучить робастную регрессию:
rlm(@formula(Y ~ X), df). - Сравнить коэффициенты с обычной линейной регрессией.
- Визуализировать влияние выбросов на обе модели.
Практические шаги:
Бутстреп-интервал для медианы:
using Bootstrap boot_med = bootstrap(median, data, 1000)Робастная регрессия:
using RobustModels rlm(@formula(Y ~ X), df)
3.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)
Материалы:
