# Inclusão de pacotes
library(tidyverse)
library(fs)
# Checa tamanho dos arquivos
dir_info("data") %>%
  select(path,size,modification_time)
#> # A tibble: 4 x 3
#>   path                                 size modification_time  
#>   <fs::path>                    <fs::bytes> <dttm>             
#> 1 data/despesa.zip                  125.32M 2019-03-29 07:40:36
#> 2 data/despesa2018.zip               17.98M 2019-03-29 16:40:21
#> 3 data/despesa2018_squished.zip       9.08M 2019-04-06 12:14:07
#> 4 data/df_all.rds                    24.37M 2019-03-30 12:05:39

Leitura de Dados Higienizados

#Colocar num data frame ("tibble"). Nota: arquivo agora 'e UTF-8
fname_2018_squished_zip <- "data/despesa2018_squished.zip"
df_orcamento <- read_delim(fname_2018_squished_zip,delim=";",
                           quote="'") # evita erro com "
# Quantas linhas, colunas, ou dimensões?
# nrow(df_orcamento)
# ncol(df_orcamento)
dim(df_orcamento)
#> [1] 99362    32
# Seleciona e renomeia colunas a serem utilizadas
df_orcamento_clean <- df_orcamento %>%
  transmute(func_cod=`Função`,
            func=`Nome Função`,
            empenhado=`Valor Empenhado`,
            liquidado=`Valor Liquidado`,
            pago=`Valor Pago`)
knitr::kable(df_orcamento_clean%>%head(4))%>%
  kableExtra::kable_styling("striped")
#> Warning in kableExtra::kable_styling(., "striped"): Please specify format
#> in kable. kableExtra can customize either HTML or LaTeX outputs. See
#> https://haozhu233.github.io/kableExtra/ for details.
func_cod func empenhado liquidado pago
06 Segurança Pública 0 0 0
22 Indústria 0 0 0
10 Saúde 0 0 0
04 Administração 0 0 0
# Quantas linhas não preenchidas (com 'NA')?
df_orcamento_clean$empenhado %>% is.na %>% sum
#> [1] 0

Análise do “Empenho”

Sumariza colunas que parecem conter valores:

summary(df_orcamento_clean%>%select(empenhado:pago)) %>%
  knitr::kable() %>%
  kableExtra::kable_styling("striped",full_width = T)
empenhado liquidado pago
Min. :0.000e+00 Min. :0.000e+00 Min. :0.000e+00
1st Qu.:0.000e+00 1st Qu.:0.000e+00 1st Qu.:0.000e+00
Median :2.588e+03 Median :1.254e+03 Median :2.750e+02
Mean :3.747e+07 Mean :3.768e+07 Mean :3.315e+07
3rd Qu.:9.188e+04 3rd Qu.:7.438e+04 3rd Qu.:4.694e+04
Max. :1.930e+11 Max. :1.930e+11 Max. :1.930e+11

Plota histograma dos Valores Empenhados, Liquisdados e Pagos:

df_orcamento_clean %>%
  transmute_at(vars(empenhado,liquidado,pago),~.+1) %>% # for log
  mutate(row=row_number()) %>%
  gather("key","value",-row) %>%
  mutate(key=factor(key,levels=c("empenhado","liquidado","pago"))) %>%
  ggplot(aes(key,value,fill=key)) +
  geom_violin(draw_quantiles = c(.5)) +
  scale_y_log10(breaks=10^(0:11),labels=c(1,10,100,
                                          "1k","10k" ,"100k" ,
                                          "1M","10M","100M",
                                          "1B","10B","100B"))+
  labs(title="Histograma de Valores",
       subtitle="Ano 2018",
       x="Valor (R$)") +
  theme(legend.position = "none")

Estudo por Função

# Nomes das funções são únicas por código?
df_orcamento_clean %>%
  count(func_cod,func) %>%
  count(func_cod,name="nn") %>%
  count(nn)
#> # A tibble: 1 x 2
#>      nn     n
#>   <int> <int>
#> 1     1    25

Top 5 funções por número de execuções

df_orcamento_clean %>%
  count(func_cod,func,sort=T) %>%
  head(5) %>%
  knitr::kable() %>%
  kableExtra::kable_styling("striped")
func_cod func n
12 Educação 30588
06 Segurança Pública 12812
10 Saúde 11441
26 Transporte 5684
03 Essencial à Justiça 5428

Totais dos valores das top 5 funções:

df_orcamento_clean %>%
  group_by(func) %>% {
    ns <- summarize(.,n=n())
    ss <- summarize_at(.,vars(empenhado,liquidado,pago),
                 list(sum=~sum(.),
                      mean=~mean(.),
                      median=~median(.),
                      sd=~sd(.),
                      mad=~mad(.)))
    ns %>% inner_join(ss,by="func")
    } %>%
  mutate_at(vars(-func),~(./10^3)%>%as.integer) %>%
  arrange(-n) %>%
  rename_all(~str_replace(.,fixed("_"),"\n")) %>%
  head(5) %>%
  knitr::kable() %>%
  kableExtra::kable_styling("striped") #%>%
func n empenhado sum liquidado sum pago sum empenhado mean liquidado mean pago mean empenhado median liquidado median pago median empenhado sd liquidado sd pago sd empenhado mad liquidado mad pago mad
Educação 30 401164009 378952112 322584024 13115 12388 10546 8 7 2 236587 229497 211258 12 10 4
Segurança Pública 12 665571698 655641842 532828763 51949 51174 41588 0 0 0 1050315 1050935 860183 0 0 0
Saúde 11 230771890 199187734 146430920 20170 17409 12798 0 0 0 269881 258990 186038 0 0 0
Essencial à Justiça 5 88609648 166434811 161649118 16324 30662 29780 6 5 3 243451 577796 571660 9 8 5
Transporte 5 91109975 58852547 56240952 16029 10354 9894 1 1 1 549802 338344 337974 2 1 1
  #kableExtra::row_spec(0, angle = -45)

Valores por função: Top 5

df_orcamento_clean %>%
  mutate(func=func%>%fct_reorder(-empenhado,sum)) %>%
  filter(as.integer(func)<6) %>%
  mutate(func=func%>%fct_rev) %>% # for coord_flip
  group_by(func) %>%
  # milhoes
  summarize_at(vars(empenhado,liquidado,pago),
               list(~(sum(.)/10^9))) %>%
  gather("key","value",-func) %>%
  mutate(key=factor(key,levels=c("pago","liquidado","empenhado"))) %>%
  ggplot(aes(func,value,group=key,fill=key)) +
  geom_col(position="dodge") +
  coord_flip() +
  labs(title="Valores Totais por Função",
       subtitle="Ano 2018, Top 5",
       y="Valor (R$ bilhões)") +
  theme(legend.position = "top",
        legend.title = element_blank(),
        axis.title.y=element_blank())

ggsave("pics/valores_por_funcao.png")
#> Saving 7 x 5 in image

Distribuição dos Valores por Função (boxbplot)

df_orcamento_clean %>%
  mutate(func=func%>%fct_reorder(empenhado+1,.fun=median,.desc=T)) %>%
  filter(as.integer(func)<6) %>%
  mutate(func=func%>%fct_rev) %>% # for coord_flip
  ggplot(aes(func,empenhado+1)) +
  geom_boxplot(aes(fill=func),notch=T) +
  scale_y_log10(breaks=10^c(0,3,6,9),labels=c("1","1k","1M","1B"))+
  coord_flip() +
  labs(title="Distribuição dos Valores por Função",
       subtitle="Ano 2018, Top 5 medianas",
       y="Valor (R$)") +
  theme(legend.position = "none",
        axis.title.y=element_blank())