# 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.
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())