"""Учебный пример: как связь с прошлым периодом влияет на дисперсию.

Требуется NumPy. Запуск: python cuped.py
Теория: https://telegra.ph/CUPED-pod-mikroskopom-Glavy-1-2-02-02-2
Это самостоятельный учебный пример к лендингу, а не цитата кода из статьи.
"""

import numpy as np

rng = np.random.default_rng(7)
n = 10_000
rho = 0.7  # Попробуйте 0, 0.3, 0.9 и сравните результат.
x = rng.normal(size=n)  # До эксперимента.
y = rho * x + np.sqrt(1 - rho**2) * rng.normal(size=n)

theta = np.cov(y, x, ddof=1)[0, 1] / x.var(ddof=1)
y_cuped = y - theta * (x - x.mean())

var_y = y.var(ddof=1)
var_cuped = y_cuped.var(ddof=1)
gain = 1 - var_cuped / var_y
print(f"Дисперсия Y: {var_y:.3f}")
print(f"После корректировки: {var_cuped:.3f}")
print(f"Снижение дисперсии: {gain:.1%}")
