dřívější úvahy o dojíždění za prací mě dovedly k zamyšlení se nad benzínem. Cena PHM je pro náklady dojíždění klíčová, a přitom není zcela transparentní. Naštěstí máme několik agragátorů, kteří ceny shromažďují.

Mě osobně dělá největší radost Rááádio Impuls, protože jde o stránky na starší technologii, která se příliš nebrání strojovému škrábání. Pustil jsem se do nich přes package rvest a podrobil získaná data krátké analýze.

Data jsou aktuální k 27.07.2018; pro tento den znám cenu Naturalu 95 ze 1 330 čerpacích stanic.

Pro úvodní orientaci se hodí jednoduchá vizualizace; provedu jí s pomocí package tmap.

Je vidět, že oranžové shluky drahého benzínu nejsou po mapě rozmístěny náhodně. Z řady vybočuje v jednak Praha jako město, a druhak některé dálnice (brněnská D1 vypadá nejhůř, ale plzeňská D5 se na ní dotahuje statečně).

Vedle polohy čerpací stanice je zajímavé se zamyslet nad její značkou: kolega Ota, který tomu rozumí, mi svého času radil že na Onu se dá tankovat levněji nežli na Shellce. Abych si ověřil, jestli na tom něco bude, jsem si spočetl průměrnou cenu na čerpacích stanicích podle značky.

Číslo v kroužku znamená počet stanic dané značky v ČR (pro zjednodušení uvádám pouze značky s pěti a více pumpami; ostatní jsou v kategorii ostatní :).

Průměr je veličina ošidná, a tak jsem se kromě průměru zamyslel nad rozsahem hodnot. Použil jsem k tomu klasický graf fousaté krabičky. Nejzajímavější na něm je medián, ten je pro čitelnost červeně.

V prvním místě jsem se zaměřil na dálnici. Graf mi radí na dálničním OMV či MOLu tankovat jen když opravdu musím.

Na druhém místě jsem se podíval na Prahu; OMV s MOLem opět “vedou”.

A na třetí místo mi zbyl “zbytek republiky”. Graf je o korunu jinde, nežli Praha s dálnicí. OMV mi ve “zbytku světa” spadla na druhou pozici za Avanti (což může souviset s tím, že obě firmy mají stejného vlastníka, a zbytečně si nekonkurují).

Abych se dozvěděl ještě více tak jsem svěřil data jednoduché lineární regresi.

## 
## Call:
## lm(formula = cena ~ praha + dalnice + nazev, data = frmBenzin)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2.83411 -0.40272 -0.01196  0.42564  2.89413 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    34.07436    0.07059 482.679  < 2e-16 ***
## prahaTRUE       0.51106    0.07212   7.086 2.25e-12 ***
## dalniceTRUE     0.94652    0.08751  10.817  < 2e-16 ***
## nazevAvanti    -0.14101    0.26904  -0.524 0.600290    
## nazevMOL       -0.25751    0.09542  -2.699 0.007049 ** 
## nazevShell     -0.34025    0.09186  -3.704 0.000221 ***
## nazevSlovnaft  -0.45008    0.16294  -2.762 0.005822 ** 
## nazevBenzina   -0.77164    0.08230  -9.376  < 2e-16 ***
## nazevPento     -0.69636    0.33618  -2.071 0.038519 *  
## nazevAlbert    -0.90436    0.24290  -3.723 0.000205 ***
## nazevPap Oil   -1.11790    0.10870 -10.284  < 2e-16 ***
## nazevKM Prona  -1.21436    0.33618  -3.612 0.000315 ***
## nazevEuroOil   -1.25813    0.09374 -13.421  < 2e-16 ***
## nazevRobin Oil -1.33572    0.12039 -11.095  < 2e-16 ***
## nazevČepro     -1.48366    0.33631  -4.412 1.11e-05 ***
## nazevAs        -1.63150    0.28662  -5.692 1.55e-08 ***
## nazevTesco     -2.16240    0.22351  -9.675  < 2e-16 ***
## nazevGlobus    -2.15647    0.24254  -8.891  < 2e-16 ***
## nazevONO       -3.25107    0.18240 -17.823  < 2e-16 ***
## nazevostatní   -1.06849    0.08193 -13.042  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.735 on 1310 degrees of freedom
## Multiple R-squared:  0.4308, Adjusted R-squared:  0.4225 
## F-statistic: 52.18 on 19 and 1310 DF,  p-value: < 2.2e-16

Což přeloženo do lidské řeči znamená: benzín na dálnici je o korunu dražší než mimo ní; Pražáci si připlatí 51 haléřů.

Když budu tankovat místo na nejdražším OMV na nejlevnějším ONO, tak ušetřím přes tři koruny na litru. Pumpy u hypermarketů - Tesco, Globus - se také vyplatí. Trošku překvapivě Albert až tak ne.


Technická perlička na závěr: Rádio Impuls nevrací pokaždé stejný počet pump, a tak pro mě nebylo praktické škrábat data pomocí klasického for cyklu.

Pro získání dat jsem tak musel použít méně obvyklý - ale o to zajímavější! :) - repeat cyklus s vnořeným příkazem break, který plní roli hlášky “hrnečku dost!” ze známé pohádky.

library(rvest)

url <- "http://benzin.impuls.cz/benzin.aspx?strana=" # bez čísla stránky
frmBenzin <- data.frame() # prázdný data frame
i <- 1

repeat { # dokud se něco vrací - škrábat
  
    target <- paste0(url, i)

    asdf <- read_html(target) %>%
      html_node(".list-gas table") %>%
      html_table()
    
    frmBenzin <- rbind(frmBenzin, asdf)  
    
    if (nrow(asdf) < 50 ) break # tabulka je standardně po 50 řádcích; poslední strana je kratší
    
    i <- i + 1 # prošel jsem testem, mohu iterovat...
}