Ako som chybu v SK-NIC štatistikách našiel

sknic-domains-count-comparisonNašiel som doma na disku staré archívy so zoznamom domén registrovaných v systéme SK-NIC. Bolo mi ľúto tieto súbory len tak vymazať, kedže šlo o pomerne slušnú vzorku dát. Celkovo 893 súborov v skomprimovanej veľkosti 2.4G bolo na diskovom poli bezpečne uložené od roku 2009. Osemstodeväťdesiattri krát sa podarilo zoznam slovenských domén stiahnuť a uložiť na disk.

Zároveň som našiel pekný graf na stránke štatistiky-domén.sk. Paráda!

Spravil som zopár voodoo príkazov v shelli a v MySQL a na svete boli dáta pekne zoradené v dvoch tabuľkách – jedna vypreparovaná zo stránky štatistiky-domén.sk a tá druhá z mojich súborov na disku. Zámerom bolo dáta spojiť a vytvoriť tak dlhšiu históriu.

Zo zdrojového kódu HTML som vyrobil cca takýto SQL skript:

SET @DATE = FROM_UNIXTIME(1306101600);
INSERT INTO trend_daily_counters_from_SD (date, value, counter) VALUES (@DATE, 'sknic_domains_count',234918); set @DATE = @DATE + INTERVAL 1 DAY;
INSERT INTO trend_daily_counters_from_SD (date, value, counter) values (@DATE, 'sknic_domains_count',235123); set @DATE = @DATE + INTERVAL 1 DAY;
INSERT INTO trend_daily_counters_from_SD (date, value, counter) values (@DATE, 'sknic_domains_count',235290); set @DATE = @DATE + INTERVAL 1 DAY;
INSERT INTO trend_daily_counters_from_SD (date, value, counter) values (@DATE, 'sknic_domains_count',235444); set @DATE = @DATE + INTERVAL 1 DAY;
INSERT INTO trend_daily_counters_from_SD (date, value, counter) values (@DATE, 'sknic_domains_count',235630); set @DATE = @DATE + INTERVAL 1 DAY;
...

A takto som vytiahol dáta z mojich súborov:

$ cat extract-domains-count.sh
#!/bin/sh

cd data || exit 1;

echo "insert into trend_daily_counters_from_LH (date, value, counter) values ";

for f in `find . -name 'sk-nic.*.csv.bz2' -print | sort`; do
    ff=${f%.bz2};    dt=${f%.csv.bz2};    dt=${dt#./sk-nic.}
    bunzip2 $f;
    ct=`wc -l $ff | awk '{ print $1 - 11; }'` # header is 11 lines long
    pbzip2 --best $ff & # repack with pbzip2 in the background
    echo        "('$dt', 'sknic_domains_count', $ct),";
done
echo "(0,0,0);"

Dáta vyzerali na prvý pohľad veľmi podobne, ale opatrne som ich porovnal. A čuduj sa svete, boli v dátach jemné rozdiely.

Porovnanie dátPostupne sa analýzou podarilo prísť na to, ktoré hodnoty v ktorom zdroji sú chybné. Drobné chybičky boli v nakoniec v obidvoch. Fascinujúce je, ako postupné súvislosti odhalili celkový obraz. Napríklad zaujímavý je fakt, ak je počet domén rovnaký v niektoré dni. Pri takomto veľkom počte záznamov je to veľmi nepravdepodobné.

Taktiež ľahko odhalíte chybu, ak jeden zdroj dát vykáže nižšie počty. Pravdepodobne šlo o chybu spracovania v začiatkoch projektu štatistiky-domén.sk.

A ešte jedna finta – spravíte graf a podľa podobnosti oboch čiar, ktoré si vaše oko ihneď všimne, zistíte, že hodnoty sú nejako posunuté.

Po odstránení chybných záznamov som históriu pekne spojil a do tabuľky pribudli dáta za 813 dní. 🙂 Časom z toho bude možno rovnako pekný graf, ako je na stránke štatistiky-domén.sk.

mysql> insert ignore into trend_daily_counters
  select * from trend_daily_counters_from_LH;
Query OK, 813 rows affected (0.15 sec)
Records: 892  Duplicates: 79  Warnings: 0