πŸŸ¦Π‘Ρ‚Ρ€Π°Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ#

БущСствуСт Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ ΡΡ‚Π°Ρ‚ΡŒΡ Π½Π° эту Ρ‚Π΅ΠΌΡƒ.

НСобходимо ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ популяционноС срСднСС ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ \(Y\).


ΠžΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:

  • \(\mu = EY\) - популяционноС срСднСС

  • \(\sigma^2\) - популяционная диспСрсия

  • \(\mu_k, \sigma^2_k\) - срСднСС ΠΈ диспСрсия ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈΠΊ для \(k\)-ΠΎΠΉ страты

  • \(n_k\) - число ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈΠ· \(k\)-ΠΎΠΉ страты

  • \(n = \sum_{k=1}^K n_k\) - ΠΎΠ±Ρ‰ΠΈΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π³Ρ€ΡƒΠΏΠΏΡ‹

  • \(w_k\) - доля \(k\)-ΠΎΠΉ страты Π² популяции

  • \(Y_{1, 1}, Y_{1, 2}, ..., Y_{1, n_1}, ..., Y_{k, 1}, ..., Y_{k, n_k}\) - Π²Ρ‹Π±ΠΎΡ€ΠΊΠ° ΠΈΠ· Π³Π΅Π½Π΅Ρ€Π°Π»ΡŒΠ½ΠΎΠΉ совокупности, Π³Π΄Π΅ \(Y_{k, j}\) - ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ° \(j\)-Π³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ \(k\)-ΠΎΠΉ страты.

Π’ΠΎΡ‡Π΅Ρ‡Π½Ρ‹Π΅ ΠΎΡ†Π΅Π½ΠΊΠΈ: Для популяционного срСднСго ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π΄Π²Π΅ нСсмСщСнныС Ρ‚ΠΎΡ‡Π΅Ρ‡Π½Ρ‹Π΅ ΠΎΡ†Π΅Π½ΠΊΠΈ.

  1. \(\overline Y = \frac{1}{n}\sum_{k=1}^K \sum_{j=1}^{n_k} Y_{k, j}\)

  2. \(\hat{Y}_{strat} = \sum_{k=1}^K w_k \overline{Y}_k \,\,\,\,\,\overline{Y}_k= \frac{1}{n_k} \sum_{j=1}^{n_k} Y_{k, j}\)

Основная идСя ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Бтратифицированная сСмплированиС - ΠΌΠ΅Ρ‚ΠΎΠ΄ пониТСния диспСрсии. Для Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ ΠΆΠ΅ Π΄ΠΎΠ»ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ страты, Ρ‡Ρ‚ΠΎ ΠΈ Π² Π³Π΅Π½Π΅Ρ€Π°Π»ΡŒΠ½ΠΎΠΉ совокупности(Π½Π° историчСских Π΄Π°Π½Π½Ρ‹Ρ…). Π Π°Π·ΠΌΠ΅Ρ€Ρ‹ страт \(n_k = nw_k\).

Бпособы сСмплирования:

  1. Π‘Π»ΡƒΡ‡Π°ΠΉΠ½ΠΎΠ΅ сСмплированиС ΠœΡ‹ Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ элСмСнты Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΏΠΎ Π΄ΠΎΠ»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· страт. \((E_{srs}, D_{srs})\).

  2. CΡ‚Ρ€Π°Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ сСмплированиС Частоты ΠΊΠ°ΠΆΠ΄ΠΎΠΉ страты Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ Π² Π“Π‘ \((E_{strat}, D_{strat})\).

Π‘ΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΡ‡Π΅Ρ‡Π½Ρ‹Ρ… ΠΎΡ†Π΅Π½ΠΎΠΊ Π’ условиях стратифицированного сСмплирования Π΄Π²Π΅ ΠΏΡ€ΠΈΠ²Π΄Π΅Π½Π½Ρ‹Π΅ Ρ‚ΠΎΡ‡Π΅Ρ‡Π½Ρ‹Π΅ ΠΎΡ†Π΅Π½ΠΊΠΈ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚:

\[ \hat{Y}_{strat} = \sum_{k=1}^K w_k \overline{Y}_k = \sum_{k=1}^K w_k \sum_{j=1}^{n_k} \frac{1}{n_k}Y_{k, j} = \sum_{k=1}^K \frac{n_k}{n} \frac{1}{n_k}\sum_{j=1}^{n_k}Y_{k, j} = \frac{1}{n} \sum_{k=1}^K \sum_{j=1}^{n_k}Y_{k, j}= \overline Y \]

Π‘Ρ‚Ρ€Π°Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ срСднСС ΠΈ простоС срСднСС ΡΠ²Π»ΡΡŽΡ‚ΡΡ нСсмСщСнными ΠΎΡ†Π΅Π½ΠΊΠ°ΠΌΠΈ:

\[ E_{srs}[\overline Y] = E_{srs}\left[\frac{1}{n} \sum_{k=1}^K \sum_{j=1}^{n_k} Y_{k, j}\right] = \frac{1}{n} \sum_{k=1}^K \sum_{j=1}^{n_k} E_{srs}[Y_{k, j}] = \]
\[ =\frac{1}{n} \sum_{k=1}^K \sum_{j=1}^{n_k}\mu = \mu \]
\[ E_{strat}[\hat Y_{strat}] = \sum_{k=1}^{K} w_k E_{strat}[\overline Y_k] = \sum_{k=1}^{K} w_k \mu_k = \mu \]

Π—Π°ΠΊΠΎΠ½ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ матСматичСского оТидания

\[ E[E[X|Y]] = E[X] \]

Π—Π°ΠΊΠΎΠ½ ΠΏΠΎΠ»Π½ΠΎΠΉ диспСрсии

\[ D[X] = E[D[X|Y]] + D[E[X|Y]], \]

Π³Π΄Π΅ \(E[D[X|Y]]\) - срСдняя диспСрсия ΠΏΠΎ Π³Ρ€ΡƒΠΏΠΏΠ°ΠΌ, \(D[E[X|Y]]\) - вариация срСднСго ΠΏΠΎ Π³Ρ€ΡƒΠΏΠΏΠ°ΠΌ.


ДиспСрсия случайного сСмплирования ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ прСдствлСна Π² Π²ΠΈΠ΄Π΅ суммы диспСрсии Π²Π½ΡƒΡ‚Ρ€ΠΈ стратифицированной Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ стратифицированными Π³Ρ€ΡƒΠΏΠΏΠ°ΠΌΠΈ.

\[ D_{srs}[Y] = E_{srs}[D_{srs}[Y|Z]] + D_{srs}[E[Y|Z]] = \]
\[ =E_{srs}\left[\sum_{k=1}^K \sigma^2_k \cdot I[z=k]\right] + D_{srs}\left[\sum_{k=1}^K \mu_k \cdot I[z=k]\right] = \]
\[ =\sum_{k=1}^K\sigma^2_k \cdot E_{srs}\left[I[z=k]\right] + E_{srs}\left[\sum_{k=1}^K \mu_k \cdot I[z=k]\right]^2 - \]
\[ -\left(E_{srs}\left[\sum_{k=1}^K \mu_k \cdot I[z=k]\right]\right)^2 = \]
\[ =\sum_{k=1}^K \sigma^2_kw_k + \sum_{k=1}^K \mu^2_kw_k - \mu^2= \]
\[ =\sum_{k=1}^K \sigma^2_kw_k + \sum_{k=1}^K w_k(\mu_k - \mu)^2 \]

Π’Ρ‹ΡˆΠ΅ диспСрсия ΠΎΠ΄Π½ΠΎΠΉ случайной Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ случайного сСмлирования.

ΠŸΠΎΡΡ‡ΠΈΡ‚Π°Π΅ΠΌ Π΄ΠΈΡΠΏΡ€Π΅ΡΠΈΡŽ случайного сСмплирования:

\[ D_{srs}[\overline Y] = \frac{1}{n^2} n \sigma^2 = \frac{1}{n} \sum_{k=1}^K w_k \sigma^2_k + \frac{1}{n}\sum_{k=1}^K w_k(\mu_k - \mu)^2 \]

ДиспСрсия стратифицированного сСмплирования выводится ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅:

\[ D_{strat}[\hat Y_{strat}] = \frac{1}{n} \sum_{k=1}^K w_k \sigma^2_k \]

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ стратификации получится ΠΏΠΎΠ½ΠΈΠ·ΠΈΡ‚ΡŒ Π΄ΠΈΡΠΏΠ΅Ρ€ΡΠΈΡŽ Π½Π°

\[ \boxed{D_{srs}[\overline Y] - D_{strat}[\hat Y_{strat}] = \frac{1}{n}\sum_{k=1}^K w_k(\mu_k - \mu)^2} \]

Π§Π΅ΠΌ сильнСС различия ΠΌΠ΅ΠΆΠ΄Ρƒ срСдними Π² стратах, Ρ‚Π΅ΠΌ сильнСС Π±ΡƒΠ΄Π΅Ρ‚ сниТСниС диспСрсии.

ΠŸΠΎΡΡ‚ΡΡ‚Ρ€Π°Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ#

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ случайноС срСднСС Π½Π° стратифицированноС срСндСС

\[ \hat{Y}_{strat} = \sum_{k=1}^K w_k \overline Y_k \]

Π­Ρ‚ΠΎ соотвСствуСт ΠΏΠ΅Ρ€Π΅Π²Π·Π²Π΅ΡˆΠΈΠ²Π°Π½ΠΈΡŽ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ страты Π² соотвСтствии с Π΄ΠΎΠ»Π΅ΠΉ Π² Π“.Π‘. (\(w_k\) ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΏΠΎ историчСским Π΄Π°Π½Π½Ρ‹ΠΌ).

ΠžΡ†Π΅Π½ΠΈΠΌ Π΄ΠΈΡΠΏΠ΅Ρ€ΡΠΈΡŽ стратифицированного срСднСго ΠΏΡ€ΠΈ случайном сСмплировании.

\[ D_{srs}[\hat Y_{strat}] = E_{srs}[D_{srs}[\hat Y_{strat} | n_1, n_2, ..., n_k]]+ \]
\[ +D_{srs}[E_{srs}[\hat Y_{strat} | n_1, n_2, ..., n_k]] = \]
\[ =E_{srs}\left[\sum_{k=1}^K w^2_kD_{srs}[\overline Y | n_k]\right] + D_{srs}\left[\sum_{k=1}^K w^2_k\mu_k\right] = \]
\[ =E_{srs}\left[\sum_{k=1}^K w^2_k\frac{1}{n_k}\sigma^2_k\right] + D_{srs}[\mu] = \sum_{k=1}^K w^2_k\sigma^2_kE_{srs}\left[\frac{1}{n_k}\right] (*) \]

\(n_k\) - биномиальноС распрСдСлСниС (сумма Π‘Π΅Ρ€Π½ΡƒΠ»Π»ΠΈ).

ДиспСрсия биномиальной случайной Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹:

\[ D(n_k) = n w_k (1 - w_k) \]

ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ Ρ€Π°Π·Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π’Π΅ΠΉΠ»ΠΎΡ€Π° для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ \( \frac{1}{n_k} \) Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ \( \frac{1}{n w_k} \):

\[ E_{srs}\left[\frac{1}{n_k}\right] =E_{srs}\left[\frac{1}{n w_k} -\frac{1}{n^2 w_k^2} (n_k - n w_k) +\frac{1}{n^3 w_k^3} (n_k - n w_k)^2 \right] +O\left(\frac{1}{n^2}\right) \]

Π’Π°ΠΊ ΠΊΠ°ΠΊ

\[ E_{srs}[n_k - n w_k] = 0, \quad E_{srs}\big[(n_k - n w_k)^2\big] = n w_k (1 - w_k), \]

Ρ‚ΠΎ:

\[ E_{srs}\left[\frac{1}{n_k}\right] =\frac{1}{n w_k} +\frac{1}{n^2 w_k^2} \cdot 0 +\frac{1}{n^3 w_k^3} n w_k (1 - w_k) +O\left(\frac{1}{n^2}\right) =\frac{1}{n w_k} + \frac{1 - w_k}{n^2 w_k^2} + O\left(\frac{1}{n^2}\right) \]

ΠŸΠΎΠ΄ΡΡ‚Π°Π²ΠΈΠ² Π² (*), ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ:

\[ D_{srs}[\hat{Y}_{strat}] =\frac{1}{n} \sum_{k=1}^K w_k \sigma_k^2 +\frac{1}{n^2} \sum_{k=1}^K (1 - w_k) \sigma_k^2 +O\left(\frac{1}{n^2}\right) \]

Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²:

\( D_{srs}[\overline Y] = \frac{1}{n^2} n \sigma^2 = \frac{1}{n} \sum_{k=1}^K w_k \sigma^2_k + \frac{1}{n}\sum_{k=1}^K w_k(\mu_k - \mu)^2 \)

\( D_{strat}[\hat Y_{strat}] = \frac{1}{n} \sum_{k=1}^K w_k \sigma^2_k \)

\( D_{srs}[\hat{Y}_{strat}] =\frac{1}{n} \sum_{k=1}^K w_k \sigma_k^2 +\frac{1}{n^2} \sum_{k=1}^K (1 - w_k) \sigma_k^2 +O\left(\frac{1}{n^2}\right) \)

\( D_{strat}[\hat Y_{strat}] \leq D_{srs}[\hat{Y}_{strat}] \leq D_{srs}[\overline Y] \)


Код

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from scipy import stats

N = 1000
n_iter = 10000

data = np.zeros(2 * N)
data[:N] = 1

res = []
sample_sizes = [10, 20, 50, 100, 500]
for sample_size in sample_sizes:
    list_part_second_strata = []
    for _ in range(n_iter):
        sample = np.random.choice(data, sample_size, False)
        list_part_second_strata.append(np.mean(sample))
    res.append(list_part_second_strata)

df_res = pd.DataFrame(res, index=sample_sizes).T

fig = plt.figure(figsize=[12, 8])
sns.violinplot(data=df_res, cut=1, linewidth=1)
plt.title('РаспрСдСлСниС Π΄ΠΎΠ»ΠΈ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· страт Π² зависимости ΠΎΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ')
plt.grid()
plt.show()
../_images/91c1a014e9c5a2be2258ab68fda67465e90c518b59bb51a3f28d74346c99a41f.png

МалСнькиС Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ нСсут Π·Π°ΠΌΠ΅Ρ‚Π½Ρ‹ΠΉ риск нСрСпрСзСнтативности.

Иногда ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π½Π° этапС Π΄ΠΈΠ·Π°ΠΉΠ½Π° экспСримСнта. И Π·Π°Ρ€Π°Π½Π΅Π΅ ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€ Ρ€Π΅ΠΏΡ€Π΅Π·Π΅Π½Ρ‚Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… Π³Ρ€ΡƒΠΏΠΏ. Но это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ всСгда. Π’Π°ΠΊ Ссли Π·Π½Π°Ρ‡ΠΈΠΌΡ‹Ρ… ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠ² ΠΌΠ½ΠΎΠ³ΠΎ, Ρ‚ΠΎ Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ΡΡ ΡΡ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠ°Π»ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΈ Ρ‚ΠΎΡ‡Π½ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Ρ€Π°Ρ‚ΡŒ Ρ€Π΅ΠΏΡ€Π΅Π·Π΅Π½Ρ‚Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ тяТСло. По Ρ‚Π΅ΠΌ ΠΈΠ»ΠΈ ΠΈΠ½Ρ‹ΠΌ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠ°ΠΌ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ отклонСния.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, для ΠΌΠ°Π»Ρ‹Ρ… Π³Ρ€ΡƒΠΏΠΏ сущСствуСт Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: Π½Π΅ΡΠ±Π°Π»Π°Π½ΡΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΡΡ‚ΡŒ прСдставлСнности ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠ° Π² ΠΏΠΈΠ»ΠΎΡ‚Π½ΠΎΠΉ ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΠ°Ρ….

Если ΠΌΡ‹ случайным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ распрСдСляСм ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π² ΠΏΠΈΠ»ΠΎΡ‚Π½ΡƒΡŽ ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ Π³Ρ€ΡƒΠΏΠΏΡ‹, Ρ‚ΠΎ ΠΏΡ€ΠΈ условии Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ всСго Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π±Ρ€Π°Π½ΠΎ \(N\) ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‰ΠΈΡ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠΌ, число Ρ‚Π°ΠΊΠΈΡ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π² ΠΏΠΈΠ»ΠΎΡ‚Π½ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄Ρ‡ΠΈΠ½ΡΡ‚ΡŒΡΡ Π±ΠΈΠ½ΠΎΠΌΠΈΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ.

МоТно ΠΏΠΎΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… пСрСкосов: отличия Π² ΠΏΠΈΠ»ΠΎΡ‚Π½ΠΎΠΉ ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΠ°Ρ… Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ Π² \(K\) Ρ€Π°Π·. Для этого Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ scipy.stats.binom:

scipy.stats.binom(*args, **kwds)
N = np.arange(10, 1000)
plt.title('Π’Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ пСрСкосов')
for K in [1.25, 1.5, 2, 3]:
    prob = 2 * stats.binom.cdf(N / (1 + K), N, 0.5)
    plt.plot(N, prob, label=f'K = {K}')
plt.xscale('log')
plt.legend()
plt.grid()
../_images/e708be1b8a82bc10be63405049bc48bc4b5e248c6bf8ba613f3521063be79a6f.png

ΠŸΡ€ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π±ΠΎΡ€ΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ нСсбалансированная ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ.

Однако ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π΅ Π³Ρ€ΡƒΠΏΠΏΡ‹ \(N=100\) Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠΈΠ»ΠΎΡ‚Π½ΡƒΡŽ ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‰ΠΈΠΌΠΈΡΡ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ Π½Π° 25% составляСт \(p=0.3\). Π‘ ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΠΌΡ‹Ρ… ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ, ΠΌΡ‹ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ часто Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΌΠ°Π»Ρ‹ΠΌΠΈ Π³Ρ€ΡƒΠΏΠΏΠ°ΠΌΠΈ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½Π°Π΄ΠΎ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ Ρ‚Π°ΠΊΠΈΠ΅ пСрСкосы Π²Π»ΠΈΡΡŽΡ‚. И ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ.

2. ДиспСрсия ΠΏΡ€ΠΈ стратификации#

Π‘Ρ€Π°Π²Π½ΠΈΠΌ ΠΊΠ°ΠΊ мСняСтся диспСрсия ΠΏΡ€ΠΈ стратификации ΠΈ случайном сэмплировании для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… исходных Π΄Π°Π½Π½Ρ‹Ρ….

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ‚Ρ€ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΊ ΡΠ΅ΠΌΠΏΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ:

  • Π‘Π»ΡƒΡ‡Π°ΠΉΠ½ΠΎΠ΅ сСмплированиС. Из всСго датасСта (объСдинСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ стратам) ΠΌΡ‹ Π±Π΅Ρ€Π΅ΠΌ Π±Π΅Π· Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠΉ случайный сСмпл Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°. Для Ρ‚Π°ΠΊΠΎΠΉ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ считаСм срСднСС.

  • Π‘Ρ‚Ρ€Π°Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ сСмплированиС. Из ΠΊΠ°ΠΆΠ΄ΠΎΠΉ страты ΠΌΡ‹ Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ число ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ этой страты Π² Π³Π΅Π½Π΅Ρ€Π°Π»ΡŒΠ½ΠΎΠΉ совокупности. ОбъСдиняСм ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ Π² ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΡƒΡŽ ΠΈ для Π½Π΅Ρ‘ считаСм срСднСС.

  • ΠŸΠΎΡΡ‚ΡΡ‚Ρ€Π°Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ. Если Π²Ρ‹Π±ΠΎΡ€ΠΊΠ° ΡƒΠΆΠ΅ сформирована, Ρ‚ΠΎ считаСм срСднСС для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ страты ΠΈ Π±Π΅Ρ€Π΅ΠΌ ΠΈΡ… Π²Π·Π²Π΅ΡˆΠ΅Π½Π½ΡƒΡŽ сумму с вСсами страт ΠΈΠ· Π³Π΅Π½Π΅Ρ€Π°Π»ΡŒΠ½ΠΎΠΉ совокупности.

Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Ρ‚Ρ€Π΅Ρ… случаСв ΠΎΡ†Π΅Π½ΠΈΠΌ Π΄ΠΈΡΠΏΠ΅Ρ€ΡΠΈΡŽ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠΉ случайной Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹.

def get_sample_mean(data, size):
    return np.random.choice(data, size, False).mean()


def calc_srs_stats(
    strata: list,
    sample_size=100, n_iter=1000
):
    """Π‘Ρ‡ΠΈΡ‚Π°Π΅ΠΌ Π΄ΠΈΡΠΏΠ΅Ρ€ΡΠΈΡŽ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ срСднСго ΠΏΡ€ΠΈ случайном сэмплировании.
    
    strata - список страт
    sample_size - Ρ€Π°Π·ΠΌΠ΅Ρ€ сэмплируСмой Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ
    n_iter - ΠΊΠΎΠ»-Π²ΠΎ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ сэмплирования
    
    return: срСднСС срСдних, диспСрсия срСдних
    """
    data = np.concatenate(strata)
    means = [get_sample_mean(data, sample_size) for _ in range(n_iter)]

    return np.mean(means), np.var(means)


def calc_strat_stats(
    strata: list,
    sample_size=100, n_iter=1000,
    is_stratified=True
):
    """Π‘Ρ‡ΠΈΡ‚Π°Π΅ΠΌ Π΄ΠΈΡΠΏΠ΅Ρ€ΡΠΈΡŽ срСднСго значСния ΠΏΡ€ΠΈ стратифицированном сэмплировании.
    
    strata - список страт
    sample_size - Ρ€Π°Π·ΠΌΠ΅Ρ€ сэмплируСмой Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ
    n_iter - ΠΊΠΎΠ»-Π²ΠΎ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ сэмплирования
    is_stritified - Ρ„Π»Π°Π³ стратификационного сСмплирования (сохраняСм Π»ΠΈ ΠΌΡ‹ ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΠΈ страт)
    
    return: срСднСС срСдних, диспСрсия срСдних
    """
    
    strata_sizes = [len(stratum) for stratum in strata]
    full_size = np.sum(strata_sizes)
    weights = np.array(strata_sizes) / full_size
    
    sample_sizes = np.zeros(shape=len(strata))
    if is_stratified:
        sample_sizes = (weights * sample_size + 0.5).astype(int)
    else:
        while (np.array(sample_sizes)).min() == 0:
            sample_sizes = np.random.default_rng().multinomial(sample_size, weights)

    assert sample_sizes.min() != 0
    
    means = []
    for _ in range(n_iter):
        strata_means = [get_sample_mean(stratum, size) for stratum, size in zip(strata, sample_sizes)]
        means.append((weights * np.array(strata_means)).sum())
    return np.mean(means), np.var(means)


def calc_srs_strat_stats(
    strata: list,
    sample_size=100, n_iter=1000
):
    """Π‘Ρ‡ΠΈΡ‚Π°Π΅ΠΌ Π΄ΠΈΡΠΏΠ΅Ρ€ΡΠΈΡŽ срСднСго стратифицированного ΠΏΡ€ΠΈ случайном сэмплировании.
    
    strata - список страт
    strata_second - мноТСства Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π²Ρ‚ΠΎΡ€ΠΎΠΉ страты
    sample_size - Ρ€Π°Π·ΠΌΠ΅Ρ€ сэмплируСмой Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ
    n_iter - ΠΊΠΎΠ»-Π²ΠΎ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ сэмплирования
    
    return: срСднСС срСдних, диспСрсия срСдних
    """
    
    return calc_strat_stats(strata, sample_size=sample_size, n_iter=n_iter, is_stratified=False)

НапишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для провСдСния экспСримСнтов.

Π­Ρ‚Π° функция Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ всС Π²ΠΈΠ΄Ρ‹ подсчСта срСднСго ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ статистику.

def run_calc_vars(
    strata: list,
    sample_size=100, n_iter=1000,
    show=False
):
    """CΡ‡ΠΈΡ‚Π°Π΅Ρ‚ срСдниС ΠΈ диспСрсии срСдних Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, посчитанных ΠΏΡ€ΠΈ
    сэмплировании Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ способами.
    """
    function_dict = {
        'strat': calc_strat_stats,
        'srs_strat': calc_srs_strat_stats,
        'srs': calc_srs_stats
    }
    res_dict = {}
    for function_name, function in function_dict.items():
        mean_, var_ = function(strata, sample_size, n_iter)
        res_dict[f'mean {function_name}'] = mean_
        res_dict[f'var {function_name}'] = var_
        if show:
            print(f'{function_name:<10} mean {mean_:0.4f}, var {var_:0.4f}')
    return res_dict

ΠŸΡ€ΠΎΠ²Π΅Π΄Π΅ΠΌ ΡΠ΅Ρ€ΠΈΡŽ числСнных экспСримСнтов#

ΠŸΡ€ΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ… распрСдСлСниях Π² стратах диспСрсии Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹. Π Π°Π·Π½ΠΈΡ†Π° срСдних ΠΆΠ΅ обСспСчиваСт Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ Π² диспСрсиях.

np.random.seed(45)

data_for_experiments = [
    {
        'experiment_title': 'Same mean, same variance',
        'strata': [
            np.random.normal(0, 1, 100),
            np.random.normal(0, 1, 100),
        ]
    },
    {
        'experiment_title': 'Same mean, different variance',
        'strata': [
            np.random.normal(0, 1, 100),
            np.random.normal(0, 2, 100),
        ]
    },
    {
        'experiment_title': 'Different mean, same variance',
        'strata': [
            np.random.normal(0, 1, 100),
            np.random.normal(2, 1, 100),
        ]
    },
    {
        'experiment_title': 'Different mean, different variance',
        'strata': [
            np.random.normal(0, 1, 100),
            np.random.normal(40, 2, 100),
        ]
    },
]

sample_size = 100
n_iter = 10000

for data in data_for_experiments:
    print(f'\n    Experiment: {data["experiment_title"]}')
    _ = run_calc_vars(data['strata'], sample_size, n_iter, show=True)
    Experiment: Same mean, same variance
strat      mean -0.0316, var 0.0046
srs_strat  mean -0.0323, var 0.0048
srs        mean -0.0309, var 0.0048

    Experiment: Same mean, different variance
strat      mean -0.0575, var 0.0117
srs_strat  mean -0.0559, var 0.0116
srs        mean -0.0570, var 0.0123

    Experiment: Different mean, same variance
strat      mean 0.9366, var 0.0046
srs_strat  mean 0.9375, var 0.0049
srs        mean 0.9364, var 0.0103

    Experiment: Different mean, different variance
strat      mean 19.9789, var 0.0139
srs_strat  mean 19.9783, var 0.0128
srs        mean 19.9867, var 2.0294

Как ΠΈ оТидалось, различия Π² диспСрсии Ρƒ нас ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Ρ€Π°Π·Π½ΠΈΡ†Π΅ΠΉ Π² срСдних значСниях ΠΌΠ΅ΠΆΠ΄Ρƒ стратами.

ΠŸΠΎΡΡ‚Ρ€ΠΎΠΈΠΌ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ диспСрсии ΠΎΡ†Π΅Π½ΠΎΠΊ срСднСго Π² зависимости ΠΎΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ#

def plot_mean_var(df):
    """РисуСт Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ срСдних ΠΈ диспСрсий ΠΏΠΎ значСниям Π² столбцах Π΄Π°Ρ‚Π°Ρ„Ρ€Π΅ΠΉΠΌΠ°."""
    columns = df.columns
    columns_var = [c for c in columns if 'var' in c]
    columns_mean = [c for c in columns if 'mean' in c]
    
    fig = plt.figure(figsize=[16, 6])
    
    ax_one = plt.subplot(121)
    df[columns_var].plot(ax=ax_one)
    ax_one.set_title('var')
    plt.grid()
    
    ax_two = plt.subplot(122)
    df[columns_mean].plot(ax=ax_two)
    ax_two.set_title('mean')
    
    ax_two.set_ylim([-0.1, df[columns_mean].values.max() * 1.1])
    plt.grid()
np.random.seed(45)

data_first = np.random.normal(0, 1, 100)
data_second = np.random.normal(2, 1, 100)

sample_sizes = np.arange(5, 100, 5)
n_iter = 10000

res = []
for sample_size in sample_sizes:
    res.append(run_calc_vars([data_first, data_second], sample_size, n_iter, show=False))

df = pd.DataFrame(res, index=sample_sizes)

plot_mean_var(df)
../_images/bf2d759cc1bfe7dab3392c2aef51b2b98f3e71e0092c1ddd9a511129e6fc0607.png

ЧислСнныС экспСримСнт согласуСтся с Ρ‚Π΅ΠΎΡ€ΠΈΠ΅ΠΉ. ДиспСрсия Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ Ρ‚Π°ΠΊ $\(var_{srs} \geq var_{srs\_strat} \geq var_{strat}\)$

ΠŸΡ€ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ \(var_{srs\_strat} \approx var_{strat}\).

ΠŸΠΎΡΡ‚Ρ€ΠΎΠΈΠΌ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ диспСрсий ΠΎΡ‚ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹ отличия срСдних ΠΌΠ΅ΠΆΠ΄Ρƒ стратами#

np.random.seed(45)

sample_size = 40
n_iter = 1000
mean_deltas = np.linspace(0, 5, 51)

data_first = np.random.normal(0, 1, 100)
data_second = np.random.normal(0, 1, 100)

res = []
for mean_delta in mean_deltas:
    res.append(run_calc_vars([data_first, data_second + mean_delta], sample_size, n_iter, show=False))

df = pd.DataFrame(res, index=mean_deltas)

plot_mean_var(df)
../_images/eddfe118eaf910b69208c57306121564ab69c13e1cfc94165a33b821dfc0b74a.png

ΠŸΡ€ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠΈ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ стратами диспСрсии strat ΠΈ srs_strat практичСски Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ, Π° диспСрсия srs растёт.

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΎΡ†Π΅Π½ΠΈΠΌ ошибки 1 ΠΈ 2 Ρ€ΠΎΠ΄Π°#

def get_confidence_interval(mu, se):
    quant = stats.norm.ppf(0.975)
    return mu - quant * se, mu + quant * se

def dot_in_interval(lb, rb, dot=0):
    return lb <= dot <= rb


size = 1000
std = 100
mu = 100
weight = 0.5 # size are equal

first_type_errors_srs = []
first_type_errors_strat = []

for _ in range(10**4):
    strata_first = np.random.normal(-mu, std, size)
    strata_second = np.random.normal(mu, std, size)
    all_data = np.concatenate((strata_first, strata_second))

    mean = np.mean(all_data)
    var_srs = np.var(all_data) / len(all_data)
    std_srs = var_srs ** 0.5

    var_strat = (
        weight * np.var(strata_first) +
        (1 - weight) * np.var(strata_second)
    ) / len(all_data)
    std_strat = var_strat ** 0.5

    ci_srs = get_confidence_interval(mean, std_srs)
    ci_strat = get_confidence_interval(mean, std_strat)

    first_type_errors_srs.append(~dot_in_interval(*ci_srs, 0))
    first_type_errors_strat.append(~dot_in_interval(*ci_strat, 0))

print(np.mean(first_type_errors_srs))
print(np.mean(first_type_errors_strat))
0.0038
0.0469