Tentokrát za to může TikTok, že mi ukázal video tzv. Global Consciousness projektu, který započal na univerzitě v Princetonu v roce 1998. Cílem projektu je ověřit, jestli mají emoce (nebo možná “globální vědomí”) mnoha lidí vliv na odchylky generátorů náhodných čísel, které jsou rozmístěny různě po světě. Myslím, že už jsem o tomto projektu slyšel někdy dávno dříve, a jelikož i já si čas od času rád nasadím svou aluminiovou čepičku, rozhodl jsem se zjistit, jaké byly odchylky těchto generátorů okolo dne 24.2.2022, kdy Rusko napadlo Ukrajinu.
Chaos na první pohled
Generátory náhodných čísel se v datech označují jako “egg”, a tak budu tohoto termínu dále v textu využívat. Stažená data bylo třeba nejprve trochu pročistit, protože ne vždy daný egg vrátí každou sekundu nějaké číslo a tak zde máme i přítomnost prázdných (NA) hodnot. Proto když jsem odebral všechny eggy, které měly více než 1000 NA hodnot ve svých datech, zůstalo nám jich v celkovém počtu 16.
Dále když jsem si data připravil pro analýzu, výsledný data frame měl okolo 11 milionu záznamů, což už můj PC příliš nerozdýchal, tak jsem se rozhodl data zredukovat ze sekundových na minutové záznamy pomocí zprůměrování hodnot pro každou minutu:
mdf = mdf %>% group_by(day, egg, format(date, format="%Y-%m-%d %H:%M")) %>%
summarise(value = mean(value, na.rm=T))
NA hodnoty byly v tomto procesu odebrány. Teď už se mi podařilo i data vykreslit do grafu, a za období 20-28. února 2022 vypadají takhle:

Docela pěkný chaos hýřící všemi barvami 🙂 . To nám ale není moc užitečné, a tak provedeme první analýzu pomocí lineární regrese.
Srovnaní pomocí lineární regrese
Přiznám se, že úplně nerozumím, co přesně zobrazují grafy v reportech na stránkách GCP s křivkou označenou jako p-value a pak těmi zbylými (chaotickými) daty okolo ní. A tak jsem se rozhodl to pojmout trochu po svém, podle toho jak mi to dává smysl.
Říká se, že tyto generátory by měly být dosti přesné, ale podle mě každý určitě bude mít nějaký svůj bias. A tak mi přijde nejvíce smysluplné nejdříve najít egg a den, který bude vykazovat hodnoty co nejvíce se blížící teoreticky očekávanému průměru, což je v našem případě 100.
Podle mých propočtů teoretickému očekávání nejvíce odpovídají hodnoty eggu X2178 ze dne 21. února. Proto si ho (a 21. únor) zvolíme jako náš referenční model (Intercept), vůči kterému budeme vše ostatní porovnávat:
> head(means)
egg day mean delta
1 X2178 21 100.00039 0.0003935185
2 X112 27 100.00103 0.0010300926
3 X3066 20 99.99895 0.0010532407
4 X112 22 99.99890 0.0010995370
5 X231 20 99.99890 0.0010995370
6 X3066 22 100.00111 0.0011111111
A nyní samotná lineární regrese, ve které zahrneme i interakce, takže se nelekněte, čeká nás pořádně dlouhý výpis dat 🙂
Call:
lm(formula = value ~ egg * day, data = mdf)
Residuals:
Min 1Q Median 3Q Max
-3.9253 -0.6177 -0.0002 0.6157 4.1156
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.000e+02 2.405e-02 4158.636 <2e-16 ***
eggX37 -4.196e-02 3.401e-02 -1.234 0.2173
eggX112 2.508e-02 3.401e-02 0.738 0.4608
eggX226 -5.395e-03 3.401e-02 -0.159 0.8740
eggX228 -1.495e-02 3.401e-02 -0.440 0.6601
eggX231 -3.970e-03 3.401e-02 -0.117 0.9071
eggX1021 1.046e-02 3.401e-02 0.308 0.7583
eggX2000 4.822e-02 3.401e-02 1.418 0.1562
eggX2220 3.576e-03 3.401e-02 0.105 0.9162
eggX2232 2.334e-02 3.401e-02 0.686 0.4924
eggX2250 8.333e-03 3.401e-02 0.245 0.8064
eggX3002 -4.461e-02 3.401e-02 -1.312 0.1896
eggX3060 -1.957e-02 3.401e-02 -0.576 0.5649
eggX3066 4.780e-03 3.401e-02 0.141 0.8882
eggX3101 7.280e-03 3.401e-02 0.214 0.8305
eggX3106 -6.956e-03 3.401e-02 -0.205 0.8379
day20 -4.618e-03 3.401e-02 -0.136 0.8920
day22 1.278e-02 3.401e-02 0.376 0.7071
day23 9.514e-03 3.401e-02 0.280 0.7797
day24 -5.995e-03 3.401e-02 -0.176 0.8601
day25 -4.263e-02 3.401e-02 -1.253 0.2100
day26 -2.635e-02 3.401e-02 -0.775 0.4384
day27 2.264e-02 3.401e-02 0.666 0.5056
eggX37:day20 7.362e-02 4.809e-02 1.531 0.1258
eggX112:day20 -3.771e-02 4.809e-02 -0.784 0.4330
eggX226:day20 4.813e-02 4.809e-02 1.001 0.3170
eggX228:day20 2.397e-02 4.809e-02 0.498 0.6182
eggX231:day20 7.095e-03 4.809e-02 0.148 0.8827
eggX1021:day20 7.824e-03 4.809e-02 0.163 0.8708
eggX2000:day20 -7.602e-02 4.809e-02 -1.581 0.1140
eggX2220:day20 -5.093e-03 4.809e-02 -0.106 0.9157
eggX2232:day20 -7.780e-02 4.809e-02 -1.618 0.1057
eggX2250:day20 3.704e-04 4.809e-02 0.008 0.9939
eggX3002:day20 2.787e-02 4.809e-02 0.580 0.5622
eggX3060:day20 -8.414e-03 4.809e-02 -0.175 0.8611
eggX3066:day20 -1.609e-03 4.809e-02 -0.033 0.9733
eggX3101:day20 6.162e-02 4.809e-02 1.281 0.2001
eggX3106:day20 5.318e-02 4.809e-02 1.106 0.2688
eggX37:day22 1.797e-02 4.809e-02 0.374 0.7086
eggX112:day22 -3.935e-02 4.809e-02 -0.818 0.4132
eggX226:day22 6.379e-04 4.809e-02 0.013 0.9894
eggX228:day22 2.815e-02 4.809e-02 0.585 0.5584
eggX231:day22 -2.869e-02 4.809e-02 -0.597 0.5508
eggX1021:day22 -3.227e-02 4.809e-02 -0.671 0.5022
eggX2000:day22 -5.688e-02 4.809e-02 -1.183 0.2370
eggX2220:day22 -3.519e-02 4.809e-02 -0.732 0.4644
eggX2232:day22 -1.097e-02 4.809e-02 -0.228 0.8195
eggX2250:day22 -3.227e-02 4.809e-02 -0.671 0.5022
eggX3002:day22 4.062e-02 4.809e-02 0.845 0.3984
eggX3060:day22 1.696e-02 4.809e-02 0.353 0.7244
eggX3066:day22 -1.684e-02 4.809e-02 -0.350 0.7262
eggX3101:day22 -2.559e-02 4.809e-02 -0.532 0.5947
eggX3106:day22 -1.806e-03 4.809e-02 -0.038 0.9701
eggX37:day23 -3.090e-03 4.809e-02 -0.064 0.9488
eggX112:day23 -1.014e-01 4.809e-02 -2.108 0.0350 *
eggX226:day23 -1.030e-02 4.809e-02 -0.214 0.8304
eggX228:day23 -7.836e-03 4.809e-02 -0.163 0.8706
eggX231:day23 3.235e-02 4.809e-02 0.673 0.5012
eggX1021:day23 -1.552e-02 4.809e-02 -0.323 0.7469
eggX2000:day23 -7.994e-02 4.809e-02 -1.662 0.0965 .
eggX2220:day23 9.248e-03 4.809e-02 0.192 0.8475
eggX2232:day23 -3.692e-02 4.809e-02 -0.768 0.4427
eggX2250:day23 -2.726e-02 4.809e-02 -0.567 0.5709
eggX3002:day23 4.278e-02 4.809e-02 0.889 0.3738
eggX3060:day23 1.655e-02 4.809e-02 0.344 0.7307
eggX3066:day23 -2.973e-02 4.809e-02 -0.618 0.5364
eggX3101:day23 1.024e-02 4.809e-02 0.213 0.8313
eggX3106:day23 3.594e-02 4.809e-02 0.747 0.4549
eggX37:day24 7.968e-02 4.809e-02 1.657 0.0976 .
eggX112:day24 -5.137e-02 4.809e-02 -1.068 0.2855
eggX226:day24 -1.329e-02 4.809e-02 -0.276 0.7824
eggX228:day24 5.509e-02 4.809e-02 1.146 0.2520
eggX231:day24 1.436e-02 4.809e-02 0.299 0.7652
eggX1021:day24 -2.123e-02 4.809e-02 -0.441 0.6589
eggX2000:day24 -2.907e-02 4.809e-02 -0.605 0.5455
eggX2220:day24 -1.244e-02 4.809e-02 -0.259 0.7959
eggX2232:day24 -2.715e-02 4.809e-02 -0.565 0.5724
eggX2250:day24 -1.846e-02 4.809e-02 -0.384 0.7011
eggX3002:day24 3.021e-02 4.809e-02 0.628 0.5299
eggX3060:day24 1.041e-02 4.809e-02 0.216 0.8287
eggX3066:day24 -3.866e-03 4.809e-02 -0.080 0.9359
eggX3101:day24 -1.747e-02 4.809e-02 -0.363 0.7165
eggX3106:day24 -3.295e-02 4.809e-02 -0.685 0.4932
eggX37:day25 6.881e-02 4.809e-02 1.431 0.1525
eggX112:day25 3.796e-02 4.809e-02 0.789 0.4299
eggX226:day25 1.889e-02 4.809e-02 0.393 0.6945
eggX228:day25 4.250e-02 4.809e-02 0.884 0.3769
eggX231:day25 4.838e-03 4.809e-02 0.101 0.9199
eggX1021:day25 2.139e-02 4.809e-02 0.445 0.6565
eggX2000:day25 -2.385e-02 4.809e-02 -0.496 0.6199
eggX2220:day25 2.414e-02 4.809e-02 0.502 0.6157
eggX2232:day25 -7.963e-03 4.809e-02 -0.166 0.8685
eggX2250:day25 4.247e-02 4.809e-02 0.883 0.3772
eggX3002:day25 3.709e-02 4.809e-02 0.771 0.4406
eggX3060:day25 6.299e-02 4.809e-02 1.310 0.1903
eggX3066:day25 3.413e-02 4.809e-02 0.710 0.4779
eggX3101:day25 2.088e-02 4.809e-02 0.434 0.6642
eggX3106:day25 5.569e-02 4.809e-02 1.158 0.2468
eggX37:day26 7.160e-02 4.809e-02 1.489 0.1366
eggX112:day26 1.804e-02 4.809e-02 0.375 0.7075
eggX226:day26 1.577e-02 4.809e-02 0.328 0.7431
eggX228:day26 4.821e-02 4.809e-02 1.002 0.3162
eggX231:day26 3.556e-02 4.809e-02 0.739 0.4597
eggX1021:day26 3.162e-02 4.809e-02 0.657 0.5109
eggX2000:day26 4.780e-03 4.809e-02 0.099 0.9208
eggX2220:day26 2.617e-02 4.809e-02 0.544 0.5863
eggX2232:day26 -2.803e-02 4.809e-02 -0.583 0.5600
eggX2250:day26 3.326e-02 4.809e-02 0.692 0.4892
eggX3002:day26 1.206e-02 4.809e-02 0.251 0.8019
eggX3060:day26 6.688e-02 4.809e-02 1.391 0.1644
eggX3066:day26 5.162e-03 4.809e-02 0.107 0.9145
eggX3101:day26 1.042e-02 4.809e-02 0.217 0.8285
eggX3106:day26 5.541e-02 4.809e-02 1.152 0.2493
eggX37:day27 4.687e-03 4.809e-02 0.097 0.9224
eggX112:day27 -4.708e-02 4.809e-02 -0.979 0.3276
eggX226:day27 -4.384e-02 4.809e-02 -0.912 0.3620
eggX228:day27 -2.647e-02 4.809e-02 -0.550 0.5821
eggX231:day27 -2.654e-02 4.809e-02 -0.552 0.5811
eggX1021:day27 -5.970e-02 4.809e-02 -1.241 0.2145
eggX2000:day27 -7.913e-02 4.809e-02 -1.645 0.0999 .
eggX2220:day27 -2.410e-02 4.809e-02 -0.501 0.6163
eggX2232:day27 -5.484e-02 4.809e-02 -1.140 0.2542
eggX2250:day27 -1.464e-02 4.809e-02 -0.304 0.7608
eggX3002:day27 1.879e-02 4.809e-02 0.391 0.6960
eggX3060:day27 1.199e-02 4.809e-02 0.249 0.8031
eggX3066:day27 -4.618e-03 4.809e-02 -0.096 0.9235
eggX3101:day27 -1.668e-02 4.809e-02 -0.347 0.7287
eggX3106:day27 -2.943e-02 4.809e-02 -0.612 0.5405
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.9125 on 184192 degrees of freedom
Multiple R-squared: 0.0006126, Adjusted R-squared: -7.65e-05
F-statistic: 0.889 on 127 and 184192 DF, p-value: 0.8098
Z výsledků lineární regrese nevyplývá statisticky významný vliv pro jednotlivé eggy zvlášť, ani pro jednotlivé dny zvlášť. Je zde však jediná statisticky významná interakce pro egg X112 a den 23. února 2022 s p-value 0.0350. Když si vykreslíme průměrné denní hodnoty pro egg X112 v porovnání s referenčním X2178, vypadá to takhle:

PS: Egg X112 není sám o sobě statisticky významný (jak jsem to trochu mylně nazval v titulku grafu), ale pouze jeho průměr pro 23. den.
Srovnaní pomocí t-testu
Dále jsem se rozhodl udělat ještě srovnání vůči teoretické hodnotě 100 pomocí jednoduchého t-testu pro každý den, kde jsou brány hodnoty všech eggů dohromady. Pro kontrolu parametrů, které jsem použil, přikládám svůj kousek kódu:
days = levels(mdf$day)
ttestdf = data.frame(
den=days,
pvalue=sapply(days, \(d) t.test(mdf %>% filter(day == d) %>% select(value), mu=100)$p.value)
)
A výsledný graf vypadá takto, kde jsem ještě zkoušel porovnat propočty pro originální sekundové data vs. zredukované minutové, kde se ukázalo, že zprůměrování dat po minutách výsledné p-value téměř neovlivnily (červená a modrá křivka se téměř překrývají):

Zde nám vyšlo, že pouze 25. den byl statisticky významně odlišný od teoretické hodnoty 100.
Závěr
Z obou analýz vyplynuly docela odlišné výsledky. Zatímco lineární regrese neoznačila žádný den za statisticky významný, ale pouze 1 egg z 16, a to 1 den před útokem na Ukrajinu, t-test označil pouze 1 den jako významný, konkrétně 1 den po útoku, kde další dny následoval návrat do normálu.
Na základě pořekadla “pro mimořádná tvrzení je třeba mimořádných důkazů” mě výsledky těchto analýz zdaleka nepřesvědčily o tom, že by generátory náhodných čísel projektu GCP nějak smysluplně reagovaly na události okolo 24. února 2022.
Pro dobré počtení stojí za zmínku taky Wiki stránka o GCP projektu včetně nezávislé analýzy dat z událostí 11. září.