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áří.