update
16989
rgr1/archive/report.pdf
Normal file
571
rgr1/archive/report.typ
Normal file
@@ -0,0 +1,571 @@
|
||||
#set document(title: "РГР №1")
|
||||
#set page(
|
||||
paper: "a4",
|
||||
margin: (top: 2.5cm, bottom: 2.5cm, left: 3cm, right: 2cm),
|
||||
numbering: "1",
|
||||
)
|
||||
#set text(font: "New Computer Modern", size: 14pt, lang: "ru")
|
||||
// #set heading(numbering: "1.")
|
||||
#set par(justify: true, leading: 0.75em)
|
||||
#show math.equation: set text(size: 14pt)
|
||||
#show link: underline
|
||||
|
||||
#set page(footer: context {
|
||||
if counter(page).get().first() > 1 [
|
||||
#align(center)[
|
||||
#counter(page).display("1")
|
||||
]
|
||||
]
|
||||
if counter(page).get().first() == 1 [
|
||||
#align(center)[
|
||||
Санкт-Петербург \ 2026
|
||||
]
|
||||
]
|
||||
})
|
||||
|
||||
#set page(header: context {
|
||||
if counter(page).get().first() == 1 [
|
||||
#align(center)[
|
||||
Санкт-Петербургский национальный исследовательский университет информационных технологий, механики и оптики
|
||||
]
|
||||
]
|
||||
})
|
||||
|
||||
#show raw.where(block: false): box.with(
|
||||
fill: luma(240),
|
||||
inset: (x: 3pt, y: 0pt),
|
||||
outset: (y: 3pt),
|
||||
radius: 2pt,
|
||||
)
|
||||
|
||||
#show raw.where(block: true): block.with(
|
||||
fill: luma(240),
|
||||
inset: 10pt,
|
||||
radius: 4pt,
|
||||
)
|
||||
|
||||
|
||||
#for _ in range(5) { linebreak() }
|
||||
|
||||
#align(center)[Лабораторная работа №4. Postgres]
|
||||
|
||||
#for _ in range(15) { linebreak() }
|
||||
|
||||
#align(right)[Выполнил:]
|
||||
#align(right)[Дощенников Никита]
|
||||
#align(right)[Группа: К3221]
|
||||
#align(right)[Проверила:]
|
||||
#align(right)[Александра Валерьевна Купера]
|
||||
|
||||
#pagebreak()
|
||||
|
||||
#outline(title: "Содержание", indent: 1.5em)
|
||||
|
||||
#pagebreak()
|
||||
|
||||
= Первичное описание выборки
|
||||
|
||||
В данном разделе выполняется первичный анализ столбцов $X_1$, $X_2$, $X_3$
|
||||
из предоставленного CSV-файла объёмом $n = 200$ наблюдений.
|
||||
|
||||
== Вариационный ряд
|
||||
|
||||
Вариационный ряд --- упорядоченная по возрастанию последовательность наблюдений $x_1 lt.eq x_2 lt.eq dots lt.eq x_n$.
|
||||
|
||||
#align(center)[
|
||||
#figure(
|
||||
image("assets/variation-series-X1.png"),
|
||||
caption: [Вариационный ряд столбца $X_1$]
|
||||
)
|
||||
]
|
||||
|
||||
#align(center)[
|
||||
#figure(
|
||||
image("assets/variation-series-X2.png"),
|
||||
caption: [Вариационный ряд столбца $X_2$]
|
||||
)
|
||||
]
|
||||
|
||||
#align(center)[
|
||||
#figure(
|
||||
image("assets/variation-series-X3.png"),
|
||||
caption: [Вариационный ряд столбца $X_3$]
|
||||
)
|
||||
]
|
||||
|
||||
#align(center)[
|
||||
#figure(
|
||||
image("assets/variation-series-X4.png"),
|
||||
caption: [Вариационный ряд столбца $X_4$]
|
||||
)
|
||||
]
|
||||
|
||||
== Эмпирическая функция распределения
|
||||
|
||||
Эмпирическая функция распределения определяется как
|
||||
|
||||
$
|
||||
F_n (x) = frac(nu_n (x), n),
|
||||
$
|
||||
|
||||
где $nu_n (x)$ --- число наблюдений, строго меньших $x$. График $F_n (x)$ является ступенчатой функцией: в каждой точке $x_i$ происходит скачок на $1/n$.
|
||||
|
||||
#align(center)[
|
||||
#figure(
|
||||
image("assets/ecdf-X1.png"),
|
||||
caption: [Эмпирическая функция распределения $F_n (x)$ для ряда $X_1$]
|
||||
)
|
||||
]
|
||||
|
||||
#align(center)[
|
||||
#figure(
|
||||
image("assets/ecdf-X2.png"),
|
||||
caption: [Эмпирическая функция распределения $F_n (x)$ для ряда $X_2$]
|
||||
)
|
||||
]
|
||||
|
||||
#align(center)[
|
||||
#figure(
|
||||
image("assets/ecdf-X3.png"),
|
||||
caption: [Эмпирическая функция распределения $F_n (x)$ для ряда $X_3$]
|
||||
)
|
||||
]
|
||||
|
||||
#align(center)[
|
||||
#figure(
|
||||
image("assets/ecdf-X4.png"),
|
||||
caption: [Эмпирическая функция распределения $F_n (x)$ для ряда $X_4$]
|
||||
)
|
||||
]
|
||||
|
||||
== Гистограммы
|
||||
|
||||
Для выбора числа интервалов использовались три правила:
|
||||
|
||||
- *Правило Скотта:* $h = 3.5 hat(sigma) n^(-1/3)$, откуда $k = ceil.l (x_max - x_min) / h ceil.r$.
|
||||
- *Правило Фридмана–Диакониса:* $h = 2 dot "IQR" dot n^(-1/3), space "IQR" = q_0.75 - q_0.25$.
|
||||
- *Правило Стерджеса:* $k = 1 + floor.l log_2 n floor.r$.
|
||||
|
||||
Результаты для $n = 200$:
|
||||
|
||||
#figure(
|
||||
table(
|
||||
columns: 4,
|
||||
align: horizon + center,
|
||||
table.header([*Правило*], [*$X_1$*], [*$X_2$*], [*$X_3$*]),
|
||||
[Скотт], [10], [6], [11],
|
||||
[Фридман–Диакон.], [12], [6], [17],
|
||||
[Стерджес], [8], [8], [8],
|
||||
),
|
||||
caption: [Число интервалов $k$ по разным правилам],
|
||||
)
|
||||
|
||||
В дальнейшем используется правило Скотта как наиболее устойчивое к форме
|
||||
распределения.
|
||||
|
||||
#figure(
|
||||
rect(width: 100%, height: 7cm, fill: luma(240), stroke: luma(180))[
|
||||
#align(center + horizon)[_[Вставить гистограммы X1 (три правила рядом)]_]
|
||||
],
|
||||
caption: [Гистограммы $X_1$ по трём правилам],
|
||||
)
|
||||
|
||||
#figure(
|
||||
rect(width: 100%, height: 7cm, fill: luma(240), stroke: luma(180))[
|
||||
#align(center + horizon)[_[Вставить гистограммы X2 (три правила рядом)]_]
|
||||
],
|
||||
caption: [Гистограммы $X_2$ по трём правилам],
|
||||
)
|
||||
|
||||
#figure(
|
||||
rect(width: 100%, height: 7cm, fill: luma(240), stroke: luma(180))[
|
||||
#align(center + horizon)[_[Вставить гистограммы X3 (три правила рядом)]_]
|
||||
],
|
||||
caption: [Гистограммы $X_3$ по трём правилам],
|
||||
)
|
||||
|
||||
// ─── 1.4 ─────────────────────────────────────────────────────────────────────
|
||||
== Числовые характеристики
|
||||
|
||||
Выборочное среднее:
|
||||
$
|
||||
macron(x) = frac(1,n) sum_(i=1)^n x_i.
|
||||
$
|
||||
|
||||
Смещённая и несмещённая дисперсии:
|
||||
$
|
||||
S^2 = frac(1,n) sum_(i=1)^n (x_i - macron(x))^2, quad
|
||||
hat(sigma)^2 = frac(1,n-1) sum_(i=1)^n (x_i - macron(x))^2.
|
||||
$
|
||||
|
||||
#figure(
|
||||
table(
|
||||
columns: (2.2fr, 1fr, 1fr, 1fr),
|
||||
align: (left, center, center, center),
|
||||
table.header(
|
||||
[*Характеристика*], [*$X_1$*], [*$X_2$*], [*$X_3$*]
|
||||
),
|
||||
[$macron(x)$ — выборочное среднее], [\_\_\_\_], [\_\_\_\_], [\_\_\_\_],
|
||||
[$S^2$ — смещённая дисперсия], [\_\_\_\_], [\_\_\_\_], [\_\_\_\_],
|
||||
[$hat(sigma)^2$ — несмещённая дисперсия], [\_\_\_\_], [\_\_\_\_], [\_\_\_\_],
|
||||
[$S$ — смещённое ст. откл.], [\_\_\_\_], [\_\_\_\_], [\_\_\_\_],
|
||||
[$hat(sigma)$ — несмещённое ст. откл.],[\_\_\_\_], [\_\_\_\_], [\_\_\_\_],
|
||||
[$m_e$ — медиана], [\_\_\_\_], [\_\_\_\_], [\_\_\_\_],
|
||||
[$q_{0.25}$ — первый квартиль], [\_\_\_\_], [\_\_\_\_], [\_\_\_\_],
|
||||
[$q_{0.75}$ — третий квартиль], [\_\_\_\_], [\_\_\_\_], [\_\_\_\_],
|
||||
[$"IQR" = q_{0.75} - q_{0.25}$], [\_\_\_\_], [\_\_\_\_], [\_\_\_\_],
|
||||
[$x_min$], [\_\_\_\_], [\_\_\_\_], [\_\_\_\_],
|
||||
[$x_max$], [\_\_\_\_], [\_\_\_\_], [\_\_\_\_],
|
||||
),
|
||||
caption: [Числовые характеристики выборок],
|
||||
)
|
||||
|
||||
// ─── 1.5 ─────────────────────────────────────────────────────────────────────
|
||||
== Описание формы распределений
|
||||
|
||||
*Столбец $X_1$.*
|
||||
_(Заполнить после анализа: симметрия/асимметрия, наличие выбросов,
|
||||
естественные границы значений, характер хвостов.)_
|
||||
|
||||
*Столбец $X_2$.*
|
||||
_(Заполнить после анализа.)_
|
||||
|
||||
*Столбец $X_3$.*
|
||||
_(Заполнить после анализа.)_
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
= Гипотезы о виде закона распределения
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
На основании гистограмм, ЭФР и числовых характеристик для каждого столбца
|
||||
выдвигается гипотеза о законе распределения из списка:
|
||||
нормальное $N(a, sigma^2)$, равномерное $U(a, b)$,
|
||||
экспоненциальное со сдвигом $"Exp"_(lambda, c)$.
|
||||
|
||||
*Столбец $X_1$ — предполагаемый закон: \_\_\_\_\_\_\_\_\_.*
|
||||
|
||||
_(Обоснование: форма гистограммы, симметрия, соотношение среднего и медианы,
|
||||
характер ЭФР и т.д. — 2–6 предложений.)_
|
||||
|
||||
*Столбец $X_2$ — предполагаемый закон: \_\_\_\_\_\_\_\_\_.*
|
||||
|
||||
_(Обоснование.)_
|
||||
|
||||
*Столбец $X_3$ — предполагаемый закон: \_\_\_\_\_\_\_\_\_.*
|
||||
|
||||
_(Обоснование.)_
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
= Оценивание параметров
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
// ─── 3.1 ─────────────────────────────────────────────────────────────────────
|
||||
== Метод моментов
|
||||
|
||||
Идея метода: приравнять теоретические моменты $E X$ и $D X$ к выборочным
|
||||
оценкам и решить систему уравнений.
|
||||
|
||||
=== Нормальное распределение $N(a, sigma^2)$
|
||||
|
||||
Теория: $E X = a$, $D X = sigma^2$. Оценки:
|
||||
$
|
||||
hat(a) = macron(x), quad hat(sigma)^2 = S^2.
|
||||
$
|
||||
|
||||
=== Равномерное распределение $U(a, b)$
|
||||
|
||||
Теория: $E X = (a+b)/2$, $D X = (b-a)^2 / 12$. Оценки:
|
||||
$
|
||||
hat(a) = macron(x) - sqrt(3 S^2), quad hat(b) = macron(x) + sqrt(3 S^2).
|
||||
$
|
||||
|
||||
=== Экспоненциальное распределение со сдвигом $"Exp"_(lambda,c)$
|
||||
|
||||
Плотность: $f(x) = lambda e^{-lambda(x-c)}$, $x gt.eq c$, $lambda > 0$.
|
||||
|
||||
Теория: $E X = c + 1/lambda$, $D X = 1/lambda^2$. Оценки:
|
||||
$
|
||||
hat(lambda) = 1/S, quad hat(c) = macron(x) - 1/hat(lambda).
|
||||
$
|
||||
|
||||
=== Результаты метода моментов
|
||||
|
||||
#figure(
|
||||
table(
|
||||
columns: (2fr, 1fr, 1fr, 1fr),
|
||||
align: (left, center, center, center),
|
||||
table.header([*Параметр*], [*$X_1$*], [*$X_2$*], [*$X_3$*]),
|
||||
[Параметр 1 (\_\_\_)], [\_\_\_\_], [\_\_\_\_], [\_\_\_\_],
|
||||
[Параметр 2 (\_\_\_)], [\_\_\_\_], [\_\_\_\_], [\_\_\_\_],
|
||||
),
|
||||
caption: [Оценки параметров методом моментов],
|
||||
)
|
||||
|
||||
// ─── 3.2 ─────────────────────────────────────────────────────────────────────
|
||||
== Метод максимального правдоподобия
|
||||
|
||||
Функция правдоподобия и логарифм правдоподобия:
|
||||
$
|
||||
L(theta) = product_(i=1)^n f(x_i | theta), quad
|
||||
ell(theta) = sum_(i=1)^n ln f(x_i | theta).
|
||||
$
|
||||
|
||||
Оценка ММП: $hat(theta) = arg max_theta ell(theta)$.
|
||||
|
||||
=== Нормальное распределение
|
||||
|
||||
$
|
||||
ell(a, sigma) = -n ln sigma - frac(1, 2 sigma^2) sum_(i=1)^n (x_i - a)^2 + "const".
|
||||
$
|
||||
|
||||
Из условий первого порядка:
|
||||
$
|
||||
hat(a)_("МП") = macron(x), quad hat(sigma)^2_("МП") = S^2 = frac(1,n) sum_(i=1)^n (x_i - macron(x))^2.
|
||||
$
|
||||
|
||||
=== Равномерное распределение
|
||||
|
||||
Плотность $f(x) = 1/(b-a)$ при $x in [a,b]$. Правдоподобие максимизируется при
|
||||
наименьшем возможном $(b-a)$, откуда:
|
||||
$
|
||||
hat(a)_("МП") = min{x_1, dots, x_n}, quad hat(b)_("МП") = max{x_1, dots, x_n}.
|
||||
$
|
||||
|
||||
=== Экспоненциальное распределение со сдвигом
|
||||
|
||||
$
|
||||
ell(lambda, c) = n ln lambda - lambda sum_(i=1)^n (x_i - c).
|
||||
$
|
||||
|
||||
Так как $ell$ возрастает по $c$ (при $c lt.eq x_min$):
|
||||
$
|
||||
hat(c)_("МП") = min{x_1, dots, x_n}, quad hat(lambda)_("МП") = frac(1, macron(x) - hat(c)).
|
||||
$
|
||||
|
||||
=== Результаты ММП
|
||||
|
||||
#figure(
|
||||
table(
|
||||
columns: (2fr, 1fr, 1fr, 1fr),
|
||||
align: (left, center, center, center),
|
||||
table.header([*Параметр*], [*$X_1$*], [*$X_2$*], [*$X_3$*]),
|
||||
[Параметр 1 (\_\_\_)], [\_\_\_\_], [\_\_\_\_], [\_\_\_\_],
|
||||
[Параметр 2 (\_\_\_)], [\_\_\_\_], [\_\_\_\_], [\_\_\_\_],
|
||||
),
|
||||
caption: [Оценки параметров методом максимального правдоподобия],
|
||||
)
|
||||
|
||||
// ─── 3.3 ─────────────────────────────────────────────────────────────────────
|
||||
== Сравнение оценок двух методов
|
||||
|
||||
#figure(
|
||||
table(
|
||||
columns: (2fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1fr),
|
||||
align: center,
|
||||
table.header(
|
||||
[], table.cell(colspan: 2)[$X_1$], table.cell(colspan: 2)[$X_2$], table.cell(colspan: 2)[$X_3$],
|
||||
[*Параметр*], [*ММ*], [*МП*], [*ММ*], [*МП*], [*ММ*], [*МП*],
|
||||
),
|
||||
[Параметр 1], [\_\_], [\_\_], [\_\_], [\_\_], [\_\_], [\_\_],
|
||||
[Параметр 2], [\_\_], [\_\_], [\_\_], [\_\_], [\_\_], [\_\_],
|
||||
),
|
||||
caption: [Сравнение оценок методом моментов и ММП],
|
||||
)
|
||||
|
||||
_(Комментарий: для нормального распределения оценки совпадают. Для равномерного
|
||||
и экспоненциального оценки различаются — пояснить почему, 2–4 предложения.)_
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
= Оценивание вероятности $P(X > x_0)$
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
В качестве порога выбирается $x_0 = macron(x) + hat(sigma)$.
|
||||
|
||||
*Эмпирическая оценка:*
|
||||
$
|
||||
hat(p)_("эмп") = frac(1,n) sum_(i=1)^n bold(1)[x_i > x_0].
|
||||
$
|
||||
|
||||
*Параметрическая оценка* — подстановка найденных оценок в теоретическую формулу:
|
||||
|
||||
- Для $N(a, sigma^2)$: $quad P(X > x_0) = 1 - Phi\( (x_0 - hat(a)) / hat(sigma) \)$.
|
||||
- Для $U(a,b)$: $quad P(X > x_0) = (hat(b) - x_0) / (hat(b) - hat(a))$ при $x_0 in [hat(a), hat(b)]$.
|
||||
- Для $"Exp"_(lambda,c)$: $quad P(X > x_0) = e^{-hat(lambda)(x_0 - hat(c))}$.
|
||||
|
||||
#figure(
|
||||
table(
|
||||
columns: (2.5fr, 1fr, 1fr, 1fr),
|
||||
align: (left, center, center, center),
|
||||
table.header([*Оценка*], [*$X_1$*], [*$X_2$*], [*$X_3$*]),
|
||||
[$x_0 = macron(x) + hat(sigma)$], [\_\_\_\_], [\_\_\_\_], [\_\_\_\_],
|
||||
[$hat(p)_"эмп"$], [\_\_\_\_], [\_\_\_\_], [\_\_\_\_],
|
||||
[$hat(p)_"пар"$], [\_\_\_\_], [\_\_\_\_], [\_\_\_\_],
|
||||
[Расхождение $|hat(p)_"эмп" - hat(p)_"пар"|$], [\_\_\_\_], [\_\_\_\_], [\_\_\_\_],
|
||||
),
|
||||
caption: [Сравнение эмпирической и параметрической оценок вероятности],
|
||||
)
|
||||
|
||||
_(Комментарий к расхождению — 2–3 предложения.)_
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
= Оценка моментов по сгруппированной выборке
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
Пусть гистограмма содержит $m$ интервалов, в $k$-й интервал попало $n_k$
|
||||
наблюдений, $hat(X)_k$ — середина $k$-го интервала. Тогда:
|
||||
|
||||
$
|
||||
hat(X)_g = frac(1,n) sum_(k=1)^m n_k hat(X)_k, quad
|
||||
hat(sigma)^2_g = frac(1,n-1) sum_(k=1)^m n_k (hat(X)_k - hat(X)_g)^2.
|
||||
$
|
||||
|
||||
#figure(
|
||||
table(
|
||||
columns: (2.5fr, 1fr, 1fr, 1fr),
|
||||
align: (left, center, center, center),
|
||||
table.header([*Характеристика*], [*$X_1$*], [*$X_2$*], [*$X_3$*]),
|
||||
[$hat(X)_g$ (по сгруппированной)], [\_\_\_\_], [\_\_\_\_], [\_\_\_\_],
|
||||
[$macron(x)$ (по исходным)], [\_\_\_\_], [\_\_\_\_], [\_\_\_\_],
|
||||
[$hat(sigma)^2_g$ (по сгруппированной)],[\_\_\_\_], [\_\_\_\_], [\_\_\_\_],
|
||||
[$hat(sigma)^2$ (по исходным)], [\_\_\_\_], [\_\_\_\_], [\_\_\_\_],
|
||||
),
|
||||
caption: [Сравнение оценок по сгруппированной и исходной выборкам],
|
||||
)
|
||||
|
||||
_(Комментарий: потеря точности при группировке обусловлена заменой каждого
|
||||
наблюдения серединой интервала — 2–3 предложения.)_
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
= Доверительные интервалы
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
Уровень доверия $1 - alpha = 0.95$, то есть $alpha = 0.05$.
|
||||
|
||||
== Асимптотический доверительный интервал для $E X$
|
||||
|
||||
По центральной предельной теореме для всех трёх столбцов:
|
||||
|
||||
$
|
||||
E X in
|
||||
lr(( macron(x) - z_{1-alpha/2} frac(hat(sigma), sqrt(n)), space
|
||||
macron(x) + z_{1-alpha/2} frac(hat(sigma), sqrt(n)) )),
|
||||
$
|
||||
|
||||
где $z_{0.975} approx 1.960$.
|
||||
|
||||
#figure(
|
||||
table(
|
||||
columns: (2fr, 1fr, 1fr, 1fr),
|
||||
align: (left, center, center, center),
|
||||
table.header([*Граница*], [*$X_1$*], [*$X_2$*], [*$X_3$*]),
|
||||
[Нижняя граница], [\_\_\_\_], [\_\_\_\_], [\_\_\_\_],
|
||||
[Верхняя граница], [\_\_\_\_], [\_\_\_\_], [\_\_\_\_],
|
||||
[Ширина интервала], [\_\_\_\_], [\_\_\_\_], [\_\_\_\_],
|
||||
),
|
||||
caption: [Асимптотические ДИ для $E X$ на уровне $0.95$],
|
||||
)
|
||||
|
||||
== Точные доверительные интервалы для нормального столбца
|
||||
|
||||
Для столбца $X\_\_$ (отнесённого к $N(mu, sigma^2)$):
|
||||
|
||||
*ДИ для $mu$ при неизвестной $sigma^2$* (распределение Стьюдента):
|
||||
$
|
||||
mu in lr((
|
||||
macron(x) - t_{1-alpha/2,, n-1} frac(hat(sigma), sqrt(n)),
|
||||
space
|
||||
macron(x) + t_{1-alpha/2,, n-1} frac(hat(sigma), sqrt(n))
|
||||
)),
|
||||
$
|
||||
где $t_{0.975, 199} approx \_\_\_\_$.
|
||||
|
||||
*ДИ для $sigma^2$* (распределение $chi^2$):
|
||||
$
|
||||
sigma^2 in lr((
|
||||
frac((n-1) hat(sigma)^2, chi^2_{1-alpha/2,, n-1}),
|
||||
space
|
||||
frac((n-1) hat(sigma)^2, chi^2_{alpha/2,, n-1})
|
||||
)).
|
||||
$
|
||||
|
||||
#figure(
|
||||
table(
|
||||
columns: (2.5fr, 1fr),
|
||||
align: (left, center),
|
||||
table.header([*Интервал*], [*Значение*]),
|
||||
[ДИ для $mu$ (асимптотический)], [(\_\_\_\_, \_\_\_\_)],
|
||||
[ДИ для $mu$ (точный, $t$-распределение)], [(\_\_\_\_, \_\_\_\_)],
|
||||
[ДИ для $sigma^2$], [(\_\_\_\_, \_\_\_\_)],
|
||||
),
|
||||
caption: [Точные ДИ для параметров нормального распределения ($X\_\_$)],
|
||||
)
|
||||
|
||||
// ─── 6.3 ─────────────────────────────────────────────────────────────────────
|
||||
== Интерпретация доверительных интервалов
|
||||
|
||||
Доверительный интервал с уровнем $1 - alpha = 0.95$ означает следующее:
|
||||
если бы мы многократно повторяли эксперимент и строили интервал по каждой
|
||||
новой выборке, то примерно 95% таких интервалов покрывали бы истинное значение
|
||||
параметра. Это *не* означает, что истинный параметр попадает в данный конкретный
|
||||
интервал с вероятностью 95% — параметр либо лежит в интервале, либо нет.
|
||||
Вероятностный смысл относится к процедуре построения, а не к конкретному результату.
|
||||
|
||||
Чем уже интервал, тем точнее оценка. Ширина убывает как $O(1/sqrt(n))$, поэтому
|
||||
для вдвое более узкого интервала требуется вчетверо большая выборка.
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
= Итоговый вывод
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
_(Заполнить после получения числовых результатов — 5–12 строк.)_
|
||||
|
||||
По результатам анализа установлено следующее соответствие столбцов и законов
|
||||
распределения:
|
||||
|
||||
- $X_1$ — \_\_\_\_\_\_\_\_ с параметрами \_\_\_\_\_\_\_\_;
|
||||
- $X_2$ — \_\_\_\_\_\_\_\_ с параметрами \_\_\_\_\_\_\_\_;
|
||||
- $X_3$ — \_\_\_\_\_\_\_\_ с параметрами \_\_\_\_\_\_\_\_.
|
||||
|
||||
Оценки методом моментов и методом максимального правдоподобия _(совпали /
|
||||
незначительно расходятся)_. Доверительные интервалы для среднего имеют ширину
|
||||
порядка \_\_\_\_, что свидетельствует о _(высокой / умеренной)_ точности оценок
|
||||
при $n = 200$. Асимптотический и точный интервалы для нормального столбца
|
||||
практически совпадают, что подтверждает применимость ЦПТ при данном объёме
|
||||
выборки.
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
= Бонус: анализ столбца $X_4$
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
== Первичное описание
|
||||
|
||||
#figure(
|
||||
rect(width: 100%, height: 5cm, fill: luma(240), stroke: luma(180))[
|
||||
#align(center + horizon)[_[Вставить гистограмму и ЭФР для X4]_]
|
||||
],
|
||||
caption: [Гистограмма и ЭФР столбца $X_4$],
|
||||
)
|
||||
|
||||
_(Описание формы: признаки бимодальности, неоднородности, наличие двух мод.)_
|
||||
|
||||
== Кластеризация ($k$-средних, $k=2$)
|
||||
|
||||
_(Описание метода и результат разбиения на два кластера.)_
|
||||
|
||||
#figure(
|
||||
table(
|
||||
columns: (2fr, 1fr, 1fr),
|
||||
align: (left, center, center),
|
||||
table.header([*Характеристика*], [*Кластер 1*], [*Кластер 2*]),
|
||||
[Объём $n_j$], [\_\_\_\_], [\_\_\_\_],
|
||||
[Среднее $macron(x)_j$], [\_\_\_\_], [\_\_\_\_],
|
||||
[Ст. откл. $hat(sigma)_j$], [\_\_\_\_], [\_\_\_\_],
|
||||
[Мин / Макс], [\_\_\_\_ / \_\_\_\_], [\_\_\_\_ / \_\_\_\_],
|
||||
),
|
||||
caption: [Характеристики кластеров столбца $X_4$],
|
||||
)
|
||||
|
||||
«Общее среднее» $macron(x)$ плохо описывает смесь двух режимов, поскольку
|
||||
является взвешенным средним двух различных распределений и может не
|
||||
соответствовать ни одному из них. Например, если моды расположены на расстоянии
|
||||
$d$ друг от друга, общее среднее окажется между ними в области низкой плотности.
|
||||
BIN
rgr1/assets/ecdf-X1.png
Normal file
|
After Width: | Height: | Size: 70 KiB |
BIN
rgr1/assets/ecdf-X2.png
Normal file
|
After Width: | Height: | Size: 71 KiB |
BIN
rgr1/assets/ecdf-X3.png
Normal file
|
After Width: | Height: | Size: 74 KiB |
BIN
rgr1/assets/ecdf-X4.png
Normal file
|
After Width: | Height: | Size: 71 KiB |
BIN
rgr1/assets/histogram-X1.png
Normal file
|
After Width: | Height: | Size: 102 KiB |
BIN
rgr1/assets/histogram-X2.png
Normal file
|
After Width: | Height: | Size: 91 KiB |
BIN
rgr1/assets/histogram-X3.png
Normal file
|
After Width: | Height: | Size: 110 KiB |
BIN
rgr1/assets/histogram-X4.png
Normal file
|
After Width: | Height: | Size: 103 KiB |
BIN
rgr1/assets/variation-series-X1.png
Normal file
|
After Width: | Height: | Size: 70 KiB |
BIN
rgr1/assets/variation-series-X2.png
Normal file
|
After Width: | Height: | Size: 71 KiB |
BIN
rgr1/assets/variation-series-X3.png
Normal file
|
After Width: | Height: | Size: 76 KiB |
BIN
rgr1/assets/variation-series-X4.png
Normal file
|
After Width: | Height: | Size: 70 KiB |
201
rgr1/data.csv
Normal file
@@ -0,0 +1,201 @@
|
||||
X1,X2,X3,X4
|
||||
1.15,-0.39,8.41,0.28
|
||||
2.04,0.95,1.83,2.54
|
||||
4.25,0.03,1.30,2.69
|
||||
1.02,-0.87,2.02,2.99
|
||||
2.70,0.89,2.23,-1.41
|
||||
-1.24,2.60,3.73,-1.15
|
||||
2.05,-1.27,8.17,-0.20
|
||||
2.66,1.45,6.60,-0.90
|
||||
0.76,1.27,1.32,-0.69
|
||||
3.65,-1.41,3.16,2.60
|
||||
-0.42,3.31,1.84,0.30
|
||||
-0.08,2.55,1.15,2.36
|
||||
0.64,1.74,1.14,-1.32
|
||||
0.84,-0.72,3.55,2.51
|
||||
0.05,-0.22,1.38,-1.38
|
||||
0.96,1.80,1.77,2.51
|
||||
-1.47,0.14,4.13,-0.10
|
||||
0.07,-0.99,2.21,-0.48
|
||||
-1.65,1.54,1.99,2.12
|
||||
4.43,-0.53,1.64,1.91
|
||||
-1.03,0.34,2.95,2.78
|
||||
-0.07,1.90,3.25,2.06
|
||||
3.50,2.63,9.27,-1.44
|
||||
4.45,0.03,6.66,2.07
|
||||
3.77,0.14,3.04,2.84
|
||||
-1.63,-0.79,1.65,-0.98
|
||||
1.32,2.37,2.83,1.50
|
||||
-1.34,0.34,2.46,1.85
|
||||
3.31,0.41,1.55,3.01
|
||||
0.79,-0.44,4.65,-1.34
|
||||
0.31,2.85,1.73,-0.82
|
||||
1.47,0.85,7.08,-1.99
|
||||
-1.23,-1.55,1.33,-1.32
|
||||
1.45,-1.22,1.32,-0.93
|
||||
0.36,1.47,13.14,3.05
|
||||
0.07,1.32,2.05,1.39
|
||||
-0.67,-0.79,8.19,-2.24
|
||||
1.81,0.10,2.54,-0.67
|
||||
-1.29,1.58,5.43,2.20
|
||||
1.49,1.78,1.17,1.88
|
||||
2.33,2.08,1.55,-1.08
|
||||
1.48,0.24,6.79,1.46
|
||||
4.73,3.40,8.02,0.33
|
||||
0.99,2.98,2.22,2.20
|
||||
-0.15,3.05,2.25,2.17
|
||||
0.27,-1.14,13.29,0.31
|
||||
0.01,-1.52,3.46,2.45
|
||||
3.58,0.54,1.75,3.21
|
||||
-1.25,3.38,16.92,-1.20
|
||||
1.88,0.78,1.30,2.83
|
||||
2.72,1.76,1.48,2.88
|
||||
0.69,3.36,5.12,3.10
|
||||
0.98,-0.83,1.65,2.28
|
||||
-1.51,-0.53,1.88,-0.95
|
||||
-0.14,2.90,8.05,-0.74
|
||||
-0.10,1.85,2.06,0.32
|
||||
1.41,3.10,2.24,-0.67
|
||||
0.67,-1.46,3.84,-1.23
|
||||
0.82,1.28,1.67,1.53
|
||||
-1.57,-0.57,3.57,2.59
|
||||
1.46,0.30,5.27,0.13
|
||||
1.91,1.99,1.25,2.00
|
||||
1.60,0.99,2.01,-1.26
|
||||
0.24,-1.08,4.95,-0.50
|
||||
3.39,2.61,3.33,-0.27
|
||||
3.37,2.06,2.94,-1.39
|
||||
2.40,2.32,8.12,1.46
|
||||
-1.23,0.31,2.12,-0.26
|
||||
3.22,2.65,1.17,2.23
|
||||
2.52,2.24,3.18,-1.39
|
||||
3.78,0.38,3.38,2.40
|
||||
3.26,-0.27,2.35,-0.97
|
||||
0.53,2.14,4.47,-0.56
|
||||
1.51,1.72,1.22,2.51
|
||||
3.92,-0.34,4.77,2.53
|
||||
1.63,1.71,1.15,2.24
|
||||
2.95,3.25,8.37,-1.49
|
||||
3.81,0.74,2.45,-0.74
|
||||
1.04,0.34,2.98,-1.07
|
||||
2.57,3.34,4.45,-1.37
|
||||
-0.26,-0.76,1.12,2.75
|
||||
3.94,0.03,5.09,-1.51
|
||||
1.66,2.33,7.56,-0.66
|
||||
1.95,2.23,2.98,-0.06
|
||||
0.79,2.32,2.62,2.56
|
||||
-0.96,-0.43,3.53,2.07
|
||||
1.94,2.67,2.13,3.30
|
||||
0.81,-1.23,4.57,-0.47
|
||||
1.25,-1.14,5.49,-0.45
|
||||
1.50,-1.49,1.32,-0.92
|
||||
-0.98,1.00,4.96,2.71
|
||||
-0.64,0.29,3.84,-1.46
|
||||
-2.46,2.95,6.63,2.38
|
||||
-2.01,3.34,5.81,-1.14
|
||||
1.21,-0.77,1.78,2.34
|
||||
3.73,0.72,2.19,4.04
|
||||
-0.21,-0.86,5.46,-0.87
|
||||
-0.20,-0.33,1.27,2.22
|
||||
-1.50,3.32,1.13,-0.49
|
||||
1.47,0.47,1.67,1.30
|
||||
2.95,-0.65,1.24,-1.33
|
||||
0.82,0.85,3.49,-0.49
|
||||
-1.71,-0.71,1.52,3.41
|
||||
4.35,1.06,3.59,-0.76
|
||||
1.48,2.16,3.47,2.10
|
||||
2.94,-0.75,1.30,2.97
|
||||
0.73,0.33,8.37,2.31
|
||||
2.03,-0.49,1.65,2.85
|
||||
4.26,3.07,3.63,3.29
|
||||
2.97,2.14,2.30,1.80
|
||||
2.93,-0.06,2.09,-1.24
|
||||
2.47,2.72,3.39,2.12
|
||||
1.42,2.78,1.77,2.96
|
||||
-0.66,-1.19,7.98,-0.66
|
||||
1.00,3.26,1.95,-0.26
|
||||
-0.50,-0.05,3.22,-1.03
|
||||
2.63,2.31,1.69,2.75
|
||||
2.42,-0.37,6.74,-1.06
|
||||
-1.02,-0.08,4.64,-0.01
|
||||
-1.20,1.75,2.61,2.75
|
||||
1.10,-0.66,5.30,-1.21
|
||||
-0.56,1.39,4.00,2.68
|
||||
-0.52,1.85,2.25,2.22
|
||||
3.28,-0.41,2.41,2.63
|
||||
0.97,2.12,3.97,2.54
|
||||
0.97,0.99,1.83,-0.13
|
||||
-0.90,1.62,1.60,-0.43
|
||||
3.11,3.38,2.99,-1.05
|
||||
-0.23,0.16,3.20,2.21
|
||||
1.38,-0.97,4.16,3.03
|
||||
0.78,2.99,2.87,3.15
|
||||
0.99,-1.44,1.75,3.36
|
||||
2.26,3.02,5.58,-0.70
|
||||
1.80,-1.16,1.47,2.62
|
||||
1.73,-1.46,3.44,2.27
|
||||
0.87,0.65,2.31,2.38
|
||||
-3.74,1.90,3.41,-0.08
|
||||
1.14,0.05,3.08,2.58
|
||||
2.90,-0.83,8.44,2.14
|
||||
0.26,-1.49,3.87,0.21
|
||||
0.30,2.63,1.26,0.99
|
||||
-1.31,2.95,2.66,-0.87
|
||||
1.76,2.22,3.91,2.84
|
||||
1.95,2.77,2.79,-0.42
|
||||
0.29,-1.22,2.91,-1.44
|
||||
1.07,-0.46,3.52,-0.24
|
||||
-0.24,1.40,5.35,0.46
|
||||
3.84,1.44,3.52,-1.01
|
||||
-2.71,-0.29,3.21,-0.43
|
||||
-0.06,0.10,8.14,2.54
|
||||
1.96,-0.17,1.25,-0.29
|
||||
0.45,0.65,8.59,-0.83
|
||||
0.35,0.06,5.58,2.46
|
||||
1.21,2.12,6.54,-0.72
|
||||
1.85,0.60,2.88,-1.07
|
||||
4.16,3.10,3.55,0.12
|
||||
-0.08,2.87,2.08,-1.03
|
||||
-0.10,-0.70,1.24,1.98
|
||||
1.59,2.70,4.14,-0.93
|
||||
-0.27,2.63,1.96,-0.40
|
||||
2.29,2.29,4.83,-0.83
|
||||
0.27,2.49,4.37,1.75
|
||||
1.65,0.18,2.26,-1.32
|
||||
1.37,-0.76,5.23,3.73
|
||||
-0.95,2.97,2.64,1.85
|
||||
3.27,-0.48,9.98,3.04
|
||||
0.26,1.05,12.21,-0.42
|
||||
0.25,0.74,4.64,-1.27
|
||||
-0.51,1.09,3.72,-0.89
|
||||
0.98,1.00,2.17,-0.10
|
||||
1.02,2.24,2.17,-1.07
|
||||
1.34,0.24,4.16,2.01
|
||||
-1.48,2.70,1.79,-0.38
|
||||
-1.72,1.56,3.27,0.66
|
||||
3.10,-1.23,1.52,3.07
|
||||
1.89,0.14,2.72,1.62
|
||||
3.04,3.32,2.38,3.13
|
||||
-2.35,2.66,3.20,-0.77
|
||||
-0.53,0.03,4.37,2.80
|
||||
1.54,2.39,1.44,-1.78
|
||||
-0.94,1.05,5.62,-0.94
|
||||
1.15,1.12,3.96,-0.62
|
||||
0.60,1.85,10.75,3.09
|
||||
0.65,1.52,5.11,0.14
|
||||
1.65,-0.17,4.42,2.69
|
||||
0.01,0.31,2.66,1.92
|
||||
2.31,2.72,2.89,-0.66
|
||||
1.21,3.12,6.56,1.72
|
||||
-0.41,1.21,7.16,-0.61
|
||||
0.51,1.96,1.77,2.22
|
||||
-1.87,1.81,6.63,2.20
|
||||
2.65,2.47,3.94,2.73
|
||||
1.18,2.27,3.81,2.80
|
||||
5.78,-0.45,5.36,2.67
|
||||
2.26,-1.48,4.79,-0.58
|
||||
2.56,0.15,3.35,-0.36
|
||||
4.44,2.01,3.36,0.94
|
||||
-0.33,2.20,2.27,1.85
|
||||
1.23,2.54,3.66,-0.73
|
||||
2.58,1.86,2.36,2.00
|
||||
|
380
rgr1/main.py
Normal file
@@ -0,0 +1,380 @@
|
||||
from google.colab import files
|
||||
import matplotlib.pyplot as plt
|
||||
from statsmodels.distributions.empirical_distribution import ECDF
|
||||
import math
|
||||
from scipy import stats as sp_stats
|
||||
import numpy as np
|
||||
|
||||
|
||||
|
||||
def load_data(uploaded: dict) -> dict[str, np.ndarray]:
|
||||
filename = list(uploaded.keys())[0]
|
||||
data = np.loadtxt(filename, delimiter=",", skiprows=1)
|
||||
return {"X3": data[:, 2]}
|
||||
|
||||
def compute_statistics(data: np.ndarray) -> dict:
|
||||
return {
|
||||
"mean": np.mean(data),
|
||||
"var_b": np.var(data),
|
||||
"var_ub": np.var(data, ddof=1),
|
||||
"std_b": np.std(data),
|
||||
"std_ub": np.std(data, ddof=1),
|
||||
"median": np.median(data),
|
||||
"q25": np.quantile(data, 0.25),
|
||||
"q75": np.quantile(data, 0.75),
|
||||
"q10": np.quantile(data, 0.10),
|
||||
"q90": np.quantile(data, 0.90),
|
||||
"min": np.min(data),
|
||||
"max": np.max(data),
|
||||
"n": len(data),
|
||||
}
|
||||
|
||||
def print_statistics(name: str, stats: dict) -> None:
|
||||
print(f"\n{'=' * 40}")
|
||||
print(f" Выборка: {name} (n = {stats['n']})")
|
||||
print(f"{'=' * 40}")
|
||||
print(f" Среднее: {stats['mean']:.4f}")
|
||||
print(f" Медиана: {stats['median']:.4f}")
|
||||
print(f" Дисперсия смещённая S²: {stats['var_b']:.4f}")
|
||||
print(f" Дисперсия несмещённая σ̂²: {stats['var_ub']:.4f}")
|
||||
print(f" Ст. откл. смещённое S: {stats['std_b']:.4f}")
|
||||
print(f" Ст. откл. несмещённое σ̂: {stats['std_ub']:.4f}")
|
||||
print(f" Квартиль Q1 (0.25): {stats['q25']:.4f}")
|
||||
print(f" Квартиль Q3 (0.75): {stats['q75']:.4f}")
|
||||
print(f" Квантиль 0.10: {stats['q10']:.4f}")
|
||||
print(f" Квантиль 0.90: {stats['q90']:.4f}")
|
||||
print(f" Минимум: {stats['min']:.4f}")
|
||||
print(f" Максимум: {stats['max']:.4f}")
|
||||
print(f" IQR: {stats['q75'] - stats['q25']:.4f}")
|
||||
|
||||
def plot_variation_series(data: np.ndarray, name: str) -> None:
|
||||
sorted_data = np.sort(data)
|
||||
plt.figure(figsize=(8, 3))
|
||||
plt.plot(sorted_data, color="steelblue", linewidth=0.8)
|
||||
plt.title(f"Вариационный ряд — {name}", fontweight="bold")
|
||||
plt.xlabel("Порядковый номер")
|
||||
plt.ylabel("Значение")
|
||||
plt.grid(True, alpha=0.3)
|
||||
plt.tight_layout()
|
||||
|
||||
plt.show()
|
||||
|
||||
def plot_ecdf(data: np.ndarray, name: str) -> None:
|
||||
ecdf = ECDF(data)
|
||||
x = np.linspace(np.min(data) - 0.5, np.max(data) + 0.5, 1000)
|
||||
|
||||
plt.figure(figsize=(7, 4))
|
||||
plt.step(x, ecdf(x), where="post", color="steelblue", linewidth=1.5)
|
||||
plt.title(f"Эмпирическая функция распределения — {name}", fontweight="bold")
|
||||
plt.xlabel("x")
|
||||
plt.ylabel(r"$F_n(x)$")
|
||||
plt.grid(True, alpha=0.3)
|
||||
plt.tight_layout()
|
||||
|
||||
plt.show()
|
||||
|
||||
def _scott_bins(data: np.ndarray) -> int:
|
||||
h = 3.5 * np.std(data, ddof=1) * len(data) ** (-1 / 3)
|
||||
return math.ceil((np.max(data) - np.min(data)) / h)
|
||||
|
||||
|
||||
def _freedman_diaconis_bins(data: np.ndarray) -> int:
|
||||
iqr = np.quantile(data, 0.75) - np.quantile(data, 0.25)
|
||||
h = 2 * iqr * len(data) ** (-1 / 3)
|
||||
return math.ceil((np.max(data) - np.min(data)) / h)
|
||||
|
||||
|
||||
def _sturges_bins(data: np.ndarray) -> int:
|
||||
return 1 + math.floor(math.log2(len(data)))
|
||||
|
||||
|
||||
_BIN_RULES: dict[str, callable] = {
|
||||
"scott": _scott_bins,
|
||||
"freedman-diaconis": _freedman_diaconis_bins,
|
||||
"sturges": _sturges_bins,
|
||||
}
|
||||
|
||||
|
||||
def get_number_of_bins(data: np.ndarray, method: str = "scott") -> int:
|
||||
if method not in _BIN_RULES:
|
||||
raise ValueError(
|
||||
f"unknown method '{method}'. available methods are: {list(_BIN_RULES.keys())}"
|
||||
)
|
||||
return _BIN_RULES[method](data)
|
||||
|
||||
|
||||
def plot_histogram(
|
||||
data: np.ndarray,
|
||||
name: str,
|
||||
methods: list[str] | None = None,
|
||||
) -> None:
|
||||
if methods is None:
|
||||
methods = list(_BIN_RULES.keys())
|
||||
|
||||
fig, axes = plt.subplots(
|
||||
1, len(methods), figsize=(5 * len(methods), 4), sharey=False
|
||||
)
|
||||
if len(methods) == 1:
|
||||
axes = [axes]
|
||||
|
||||
for ax, method in zip(axes, methods):
|
||||
bins = get_number_of_bins(data, method)
|
||||
print(f"{method} -- {name} -- {bins}")
|
||||
ax.hist(data, bins=bins, color="steelblue", edgecolor="white", linewidth=0.5)
|
||||
ax.set_title(f"{method}\n(k = {bins})", fontsize=10)
|
||||
ax.set_xlabel("Значения")
|
||||
ax.set_ylabel("Частота")
|
||||
|
||||
fig.suptitle(f"Гистограммы — {name}", fontsize=13, fontweight="bold")
|
||||
plt.tight_layout()
|
||||
|
||||
plt.show()
|
||||
|
||||
def describe_distribution(data: np.ndarray, name: str) -> None:
|
||||
n = len(data)
|
||||
mean = np.mean(data)
|
||||
median = np.median(data)
|
||||
std = np.std(data, ddof=1)
|
||||
skewness = sp_stats.skew(data)
|
||||
kurtosis = sp_stats.kurtosis(data)
|
||||
q25, q75 = np.quantile(data, [0.25, 0.75])
|
||||
iqr = q75 - q25
|
||||
|
||||
if abs(skewness) < 0.2:
|
||||
sym = "симметричное"
|
||||
elif skewness > 0:
|
||||
sym = f"правосторонняя асимметрия (skew = {skewness:.3f})"
|
||||
else:
|
||||
sym = f"левосторонняя асимметрия (skew = {skewness:.3f})"
|
||||
|
||||
if kurtosis > 1:
|
||||
tails = f"тяжёлые хвосты (kurt = {kurtosis:.3f})"
|
||||
elif kurtosis < -1:
|
||||
tails = f"лёгкие хвосты (kurt = {kurtosis:.3f})"
|
||||
else:
|
||||
tails = f"хвосты близки к нормальным (kurt = {kurtosis:.3f})"
|
||||
|
||||
lo, hi = q25 - 1.5 * iqr, q75 + 1.5 * iqr
|
||||
outliers = data[(data < lo) | (data > hi)]
|
||||
if len(outliers) == 0:
|
||||
out_str = "выбросы не обнаружены"
|
||||
else:
|
||||
pct = 100 * len(outliers) / n
|
||||
out_str = f"{len(outliers)} выброс(ов) ({pct:.1f}%) за пределами [{lo:.3f}, {hi:.3f}]"
|
||||
|
||||
kde = sp_stats.gaussian_kde(data)
|
||||
x_grid = np.linspace(np.min(data), np.max(data), 1000)
|
||||
kde_vals = kde(x_grid)
|
||||
peaks = [i for i in range(1, len(kde_vals) - 1)
|
||||
if kde_vals[i] > kde_vals[i-1] and kde_vals[i] > kde_vals[i+1]]
|
||||
threshold = 0.1 * np.max(kde_vals)
|
||||
significant_peaks = [x_grid[i] for i in peaks if kde_vals[i] > threshold]
|
||||
|
||||
if len(significant_peaks) == 1:
|
||||
modes_str = f"унимодальное (пик ≈ {significant_peaks[0]:.3f})"
|
||||
elif len(significant_peaks) == 2:
|
||||
modes_str = f"бимодальное (пики ≈ {significant_peaks[0]:.3f} и {significant_peaks[1]:.3f})"
|
||||
else:
|
||||
modes_str = f"многомодальное ({len(significant_peaks)} пика)"
|
||||
|
||||
print(f"\n{'=' * 40}")
|
||||
print(f" Описание формы распределения — {name}")
|
||||
print(f"{'=' * 40}")
|
||||
print(f" Симметрия: {sym}")
|
||||
print(f" Хвосты: {tails}")
|
||||
print(f" Выбросы: {out_str}")
|
||||
print(f" Модальность: {modes_str}")
|
||||
print(f" Среднее vs медиана: {mean:.4f} vs {median:.4f}")
|
||||
|
||||
|
||||
def estimate_exponential_parameters(data: np.ndarray, name: str) -> None:
|
||||
n = len(data)
|
||||
mean = np.mean(data)
|
||||
var_ub = np.var(data, ddof=1)
|
||||
|
||||
lambda_mm = 1.0 / mean
|
||||
|
||||
lambda_mm2 = 1.0 / np.sqrt(var_ub)
|
||||
|
||||
lambda_mle = n / np.sum(data)
|
||||
|
||||
def log_likelihood(lam: float) -> float:
|
||||
return n * np.log(lam) - lam * np.sum(data)
|
||||
|
||||
ll_mm = log_likelihood(lambda_mm)
|
||||
ll_mle = log_likelihood(lambda_mle)
|
||||
|
||||
print(f"\n{'=' * 50}")
|
||||
print(f" Оценка параметров — {name}")
|
||||
print(f" Модель: Экспоненциальное распределение Exp(λ)")
|
||||
print(f"{'=' * 50}")
|
||||
|
||||
print(f"\n [Метод моментов]")
|
||||
print(f" EX = {lambda_mm:.6f}")
|
||||
print(f" DX = {lambda_mm2:.6f} (через дисперсию)")
|
||||
|
||||
print(f"\n [Метод максимального правдоподобия]")
|
||||
print(f" ММП = {lambda_mle:.6f}")
|
||||
|
||||
print(f"\n [Сравнение]")
|
||||
print(f" ММ = {lambda_mm:.6f}")
|
||||
print(f" ММП = {lambda_mle:.6f}")
|
||||
print(f" Разница = {abs(lambda_mle - lambda_mm):.2e}")
|
||||
|
||||
if abs(lambda_mle - lambda_mm) < 1e-10:
|
||||
comment = ()
|
||||
else:
|
||||
comment = ("Небольшое расхождение обусловлено численными погрешностями.")
|
||||
print(f"\n Оценки совпадают: для Exp(λ) метод моментов (через EX) и МПП дают одинаковую формулу λ̂ = 1/x̄.")
|
||||
|
||||
lambdas = np.linspace(lambda_mle * 0.5, lambda_mle * 1.8, 500)
|
||||
ll_vals = [log_likelihood(l) for l in lambdas]
|
||||
|
||||
plt.figure(figsize=(7, 4))
|
||||
plt.plot(lambdas, ll_vals, color="steelblue", linewidth=1.8,
|
||||
label="log L(λ)")
|
||||
plt.axvline(lambda_mle, color="crimson", linestyle="--", linewidth=1.2,
|
||||
label=f"λ̂_MLE = {lambda_mle:.4f}")
|
||||
plt.axvline(lambda_mm, color="darkorange", linestyle=":", linewidth=1.2,
|
||||
label=f"λ̂_MM = {lambda_mm:.4f}")
|
||||
plt.scatter([lambda_mle, lambda_mm],
|
||||
[log_likelihood(lambda_mle), log_likelihood(lambda_mm)],
|
||||
color=["crimson", "darkorange"], zorder=5)
|
||||
plt.title(f"Логарифм правдоподобия — {name}", fontweight="bold")
|
||||
plt.xlabel("λ")
|
||||
plt.ylabel("log L(λ)")
|
||||
plt.legend()
|
||||
plt.grid(True, alpha=0.3)
|
||||
plt.tight_layout()
|
||||
plt.show()
|
||||
|
||||
return lambda_mle
|
||||
|
||||
|
||||
def estimate_probability(data: np.ndarray, name: str, lambda_mle: float) -> None:
|
||||
n = len(data)
|
||||
mean = np.mean(data)
|
||||
std_ub = np.std(data, ddof=1)
|
||||
c_hat = np.min(data)
|
||||
|
||||
x0 = mean + std_ub
|
||||
|
||||
p_empirical = np.sum(data > x0) / n
|
||||
|
||||
p_parametric = np.exp(-lambda_mle * (x0 - c_hat))
|
||||
|
||||
print(f"\n{'=' * 50}")
|
||||
print(f" Оценка P(X > x0) — {name}")
|
||||
print(f" Модель: Exp(λ={lambda_mle:.4f}, c={c_hat:.4f})")
|
||||
print(f"{'=' * 50}")
|
||||
print(f" Порог x0 = x̄ + σ̂ = {mean:.4f} + {std_ub:.4f} = {x0:.4f}")
|
||||
print(f"\n Эмпирическая P(X > x0) = {p_empirical:.6f} ({int(p_empirical*n)}/{n} наблюдений)")
|
||||
print(f" Параметрическая P(X > x0) = {p_parametric:.6f}")
|
||||
print(f"\n Абсолютное расхождение: {abs(p_parametric - p_empirical):.2e}")
|
||||
rel = abs(p_parametric - p_empirical) / p_parametric * 100
|
||||
print(f" Относительное расхождение: {rel:.2f}%")
|
||||
|
||||
if rel < 5:
|
||||
comment = "Расхождение незначительное — модель хорошо описывает данные."
|
||||
elif rel < 15:
|
||||
comment = "Умеренное расхождение — модель в целом подходит, но есть отклонения."
|
||||
else:
|
||||
comment = "Заметное расхождение — стоит перепроверить выбор модели или оценки параметров."
|
||||
print(f" Вывод: {comment}")
|
||||
|
||||
x_grid = np.linspace(np.min(data) - 0.5, np.max(data) + 2, 500)
|
||||
|
||||
cdf_param = np.where(x_grid >= c_hat, 1 - np.exp(-lambda_mle * (x_grid - c_hat)), 0.0)
|
||||
|
||||
from statsmodels.distributions.empirical_distribution import ECDF
|
||||
ecdf = ECDF(data)
|
||||
|
||||
fig, ax = plt.subplots(figsize=(8, 4))
|
||||
ax.plot(x_grid, 1 - ecdf(x_grid), color="steelblue", linewidth=1.5, label="Эмпирическая P(X > x)")
|
||||
ax.plot(x_grid, 1 - cdf_param, color="crimson", linewidth=1.5, linestyle="--", label=f"Параметрическая P(X > x)")
|
||||
ax.axvline(x0, color="darkorange", linestyle=":", linewidth=1.5, label=f"x₀ = {x0:.3f}")
|
||||
ax.scatter([x0], [p_empirical], color="steelblue", zorder=5, s=60)
|
||||
ax.scatter([x0], [p_parametric], color="crimson", zorder=5, s=60)
|
||||
ax.annotate(f" эмп. = {p_empirical:.4f}", (x0, p_empirical), fontsize=9, color="steelblue")
|
||||
ax.annotate(f" пар. = {p_parametric:.4f}", (x0, p_parametric), fontsize=9, color="crimson",
|
||||
xytext=(x0, p_parametric - 0.03))
|
||||
ax.set_title(f"P(X > x) — эмпирическая vs параметрическая — {name}", fontweight="bold")
|
||||
ax.set_xlabel("x")
|
||||
ax.set_ylabel("P(X > x)")
|
||||
ax.legend()
|
||||
ax.grid(True, alpha=0.3)
|
||||
plt.tight_layout()
|
||||
plt.show()
|
||||
|
||||
def estimate_grouped_moments(data: np.ndarray, name: str, method: str = "scott") -> None:
|
||||
n = len(data)
|
||||
bins = get_number_of_bins(data, method)
|
||||
|
||||
counts, edges = np.histogram(data, bins=bins)
|
||||
midpoints = (edges[:-1] + edges[1:]) / 2
|
||||
|
||||
mean_grouped = np.sum(counts * midpoints) / n
|
||||
var_grouped = np.sum(counts * (midpoints - mean_grouped) ** 2) / (n - 1)
|
||||
std_grouped = np.sqrt(var_grouped)
|
||||
|
||||
mean_raw = np.mean(data)
|
||||
var_raw = np.var(data, ddof=1)
|
||||
std_raw = np.std(data, ddof=1)
|
||||
|
||||
print(f"\n{'=' * 55}")
|
||||
print(f" Моменты по сгруппированной выборке — {name}")
|
||||
print(f" Правило разбиения: {method} (k = {bins} интервалов)")
|
||||
print(f"{'=' * 55}")
|
||||
print(f" {'Характеристика':<28} {'По исходным':>12} {'По группир.':>12} {'Δ':>10}")
|
||||
print(f" {'-'*62}")
|
||||
print(f" {'Среднее EX':<28} {mean_raw:>12.6f} {mean_grouped:>12.6f} {abs(mean_grouped - mean_raw):>10.2e}")
|
||||
print(f" {'Дисперсия DX (несмещ.)':<28} {var_raw:>12.6f} {var_grouped:>12.6f} {abs(var_grouped - var_raw):>10.2e}")
|
||||
print(f" {'Ст. отклонение σ̂':<28} {std_raw:>12.6f} {std_grouped:>12.6f} {abs(std_grouped - std_raw):>10.2e}")
|
||||
|
||||
rel_mean = abs(mean_grouped - mean_raw) / abs(mean_raw) * 100
|
||||
rel_var = abs(var_grouped - var_raw) / abs(var_raw) * 100
|
||||
print(f"\n Относительное отклонение среднего: {rel_mean:.3f}%")
|
||||
print(f" Относительное отклонение дисперсии: {rel_var:.3f}%")
|
||||
|
||||
if max(rel_mean, rel_var) < 1:
|
||||
comment = "Группировка практически не вносит погрешности — интервалов достаточно."
|
||||
elif max(rel_mean, rel_var) < 5:
|
||||
comment = "Незначительная потеря точности из-за группировки — результат приемлем."
|
||||
else:
|
||||
comment = "Заметная погрешность группировки — стоит увеличить число интервалов."
|
||||
print(f" Вывод: {comment}")
|
||||
|
||||
fig, ax = plt.subplots(figsize=(8, 4))
|
||||
ax.bar(edges[:-1], counts, width=np.diff(edges), align="edge",
|
||||
color="steelblue", edgecolor="white", linewidth=0.5,
|
||||
alpha=0.7, label="Частоты интервалов")
|
||||
ax.scatter(midpoints, counts, color="darkorange", zorder=5, s=50, label="Середины интервалов")
|
||||
ax.axvline(mean_raw, color="crimson", linestyle="--", linewidth=1.5,
|
||||
label=f"x̄ исходное = {mean_raw:.4f}")
|
||||
ax.axvline(mean_grouped, color="darkgreen", linestyle=":", linewidth=1.5,
|
||||
label=f"x̄ группир. = {mean_grouped:.4f}")
|
||||
ax.set_title(f"Гистограмма с оценками среднего — {name}", fontweight="bold")
|
||||
ax.set_xlabel("Значения")
|
||||
ax.set_ylabel("Частота")
|
||||
ax.legend(fontsize=9)
|
||||
ax.grid(True, alpha=0.3)
|
||||
plt.tight_layout()
|
||||
plt.show()
|
||||
|
||||
|
||||
def analyze_column(name: str, data: np.ndarray) -> None:
|
||||
stats = compute_statistics(data)
|
||||
print_statistics(name, stats)
|
||||
describe_distribution(data, name)
|
||||
plot_variation_series(data, name)
|
||||
plot_ecdf(data, name)
|
||||
plot_histogram(data, name)
|
||||
|
||||
lambda_mle = estimate_exponential_parameters(data, name)
|
||||
estimate_probability(data, name, lambda_mle)
|
||||
estimate_grouped_moments(data, name)
|
||||
|
||||
|
||||
uploaded = files.upload()
|
||||
columns = load_data(uploaded)
|
||||
analyze_column("X3", columns["X3"])
|
||||
BIN
rgr1/task.pdf
Normal file
BIN
rgr1/theory/theory.pdf
Normal file
37
rgr1/theory/theory.typ
Normal file
@@ -0,0 +1,37 @@
|
||||
$
|
||||
E x p(lambda): space.quad E X = frac(1, lambda), space.quad D X = frac(1, lambda^2)
|
||||
$
|
||||
|
||||
По определению
|
||||
|
||||
$
|
||||
E X eq integral_0^infinity x dot lambda e^(-lambda x) space d x eq 1/lambda
|
||||
$
|
||||
|
||||
Заменяем $E X$ на выборочное среднее $overline(x)$
|
||||
|
||||
$
|
||||
E X eq overline(x) arrow.double 1/lambda eq overline(x) arrow.double hat(lambda)_"ММ" eq frac(1, overline(x))
|
||||
$
|
||||
|
||||
Альтернативная оценка через дисперсию --- приравняем $D X eq S^2$
|
||||
|
||||
$
|
||||
frac(1, lambda^2) eq S^2 arrow.double hat(lambda)_"ММ2" eq frac(1, sqrt(S^2))
|
||||
$
|
||||
|
||||
Функция правдоподобия
|
||||
|
||||
$
|
||||
L(lambda) eq product_(i eq 1)^n lambda e^(-lambda x i) eq lambda^n dot e^(-lambda sum x_i)
|
||||
$
|
||||
|
||||
$
|
||||
ell(lambda) eq ln L(lambda) eq n ln lambda - lambda sum_(i eq 1)^n x_i
|
||||
$
|
||||
|
||||
Берем производную и приравниваем к нулю
|
||||
|
||||
$
|
||||
frac(d ell, d lambda) eq n/lambda - sum x_i eq 0 arrow.double hat(lambda)_"ММП" eq frac(n, sum x_i) eq frac(1, overline(x))
|
||||
$
|
||||