No Brasil os parlamentares dispõe de uma verba destinada a cobrir despesas referentes ao exercicio da atividade parlamentar, aqui falaremos um pouco sobre os dados abertos de despesas parlamentares no ano de 2015 e o conjunto de dados utilizado pode ser encontrado aqui.
# Leitura dos dados e carregamento das bibliotecas
dados <- read.csv("AnoAtual.csv", header = TRUE)
library(ggplot2)
library(dplyr)
O dataset é composto por 45518 registros de despesa de 784 parlamentares, cada despesa possui 27 atributos caracterizadores da mesma.
# Funções auxiliares
multiplot <- function(..., plotlist=NULL, file, cols=1, layout=NULL) {
library(grid)
# Make a list from the ... arguments and plotlist
plots <- c(list(...), plotlist)
numPlots = length(plots)
# If layout is NULL, then use 'cols' to determine layout
if (is.null(layout)) {
# Make the panel
# ncol: Number of columns of plots
# nrow: Number of rows needed, calculated from # of cols
layout <- matrix(seq(1, cols * ceiling(numPlots/cols)),
ncol = cols, nrow = ceiling(numPlots/cols))
}
if (numPlots==1) {
print(plots[[1]])
} else {
# Set up the page
grid.newpage()
pushViewport(viewport(layout = grid.layout(nrow(layout), ncol(layout))))
# Make each plot, in the correct location
for (i in 1:numPlots) {
# Get the i,j matrix positions of the regions that contain this subplot
matchidx <- as.data.frame(which(layout == i, arr.ind = TRUE))
print(plots[[i]], vp = viewport(layout.pos.row = matchidx$row,
layout.pos.col = matchidx$col))
}
}
}
moda <- function(x) {
z <- table(as.vector(x)); names(z)[z == max(z)]
}
Os dados referentes ao ano de 2015 possuem os seguintes atributos:
colnames(dados)
## [1] "orgao..nome." "codLegislatura"
## [3] "datEmissao" "ideCadastro"
## [5] "indTipoDocumento" "nuCarteiraParlamentar"
## [7] "nuLegislatura" "numAno"
## [9] "numEspecificacaoSubCota" "numLote"
## [11] "numMes" "numParcela"
## [13] "numRessarcimento" "numSubCota"
## [15] "sgPartido" "sgUF"
## [17] "txNomeParlamentar" "txtBeneficiario"
## [19] "txtCNPJCPF" "txtDescricao"
## [21] "txtDescricaoEspecificacao" "txtNumero"
## [23] "txtPassageiro" "txtTrecho"
## [25] "vlrDocumento" "vlrGlosa"
## [27] "vlrLiquido"
Com o objetivo de pesquisar onde os deputados investem esse dinheiro, consideraremos os atributos:
head(dados[,c(3,4,5,11, 15,16,17,20,21,25,26,27)], n=3)
## datEmissao ideCadastro indTipoDocumento numMes sgPartido sgUF
## 1 2015-03-02T00:00:00 73483 0 3 PP RS
## 2 2015-01-13T00:00:00 74151 0 1 PSD MG
## 3 2015-01-12T00:00:00 74474 0 1 PCdoB PE
## txNomeParlamentar txtDescricao
## 1 LUIS CARLOS HEINZE ASSINATURA DE PUBLICAÃÃES
## 2 GERALDO THADEU ASSINATURA DE PUBLICAÃÃES
## 3 CARLOS EDUARDO CADOCA ASSINATURA DE PUBLICAÃÃES
## txtDescricaoEspecificacao vlrDocumento vlrGlosa vlrLiquido
## 1 - 3700.00 0 3700.00
## 2 - 3504.55 0 3504.55
## 3 - 1450.90 0 1450.90
A partir disso iremos discorrer sobre as naturezas e distribuções das variáveis acima citadas.
Este atributo representa a data em que a despesa apresentada pelo deputado foi feita, por ser uma data não faz sentido falarmos sobre a centralidade desses valores, sobre sua distribuição / concentração ou simetria. Por outro lado será bem útil caso desejemos verificar os valores gastos ao longo dos dias ou meses, por exemplo - ou outras análises que envolvam distribuições ou comparações ao longo do tempo. Sua natureza por ser classificada como uma variável não-métrica nominal, visto que faz sentido calcularmos a quantidade de observações (despesas) numa determinada data. Em um outro momento, podemos documentar a quantidade de gastos em cada dia, afim de verificar alguma anormalidade nas observações.
De maneira análoga data da despesa, podemos verificar a quantidade de gastos por mês.
ggplot(dados, aes(x = numMes, y = ..count..)) +
geom_bar(aes(fill=..count..)) + ggtitle("Quant. de Gastos por Mês") + ylab("Quantidade") + xlab("Número do Mês")
Estes atributos representam o identificador único e nome do parlamentar, respectivamente. Assim como o anterior não faz sentido falarmos sobre distribuição, simetria ou outras medidas para estas variáveis - também podem ser classificadas como não-métrica nominal, visto que os registros não possuem significado quantitativo numéricos e sim categóricos.
Assim como as variáveis ja descritas esse atributo também pode ser interpretado como não-métrico nominal visto que seu objetivo é caracterizar categorias. Representa o tipo de documento apresentado para comprovar o gasto: 0: nota fiscal, 1: recibo, 2: despesa no exterior. Faz sentido neste caso observarmos a quantidade ou proporção dos tipos de documento entregues.
ggplot(dados, aes(x = indTipoDocumento, y = ..count..)) +
geom_bar(aes(fill=..count..)) + ggtitle("Quant. Tipos Documento") + ylab("Quantidade") + xlab("Tipo Documento")
#table(dados$indTipoDocumento, dados$txtDescricaoEspecificacao)
Estes atributos significam a sigla do partido e sigla da federação aos quais cada deputado pertence e podem ser caracterizados como não-métricos nominais, ja que exercem funções categóricas (partidos e estados). Podemos verificar a proporção de ocorrências por partido e federação.
ggplot(dados, aes(x = sgPartido, y = ..count..)) +
geom_bar(aes(fill=..count..)) + ggtitle("Quant. Ocorrências Por Partido") + ylab("Quantidade") + xlab("Partido") + theme(axis.text.x = element_text(angle = 45, hjust = 1))
ggplot(dados, aes(x = sgUF, y = ..count..)) +
geom_bar(aes(fill=..count..)) + ggtitle("Quant. Ocorrências Por Federação") + ylab("Quantidade") + xlab("Estado") + theme(axis.text.x = element_text(angle = 45, hjust = 1))
Estes atributos significam a descrição em si da despesa em questão e podem ser caracterizados como não-métricos nominais. Faz sentido
ggplot(dados, aes(x = txtDescricao, y = ..count..)) +
geom_bar() + coord_flip()
Representam os valores das despesas realizadas por cada deputado (valor da despesa, valor do desconto e valor líquido do desconto na verba parlamentar, respectivamente). Essas variáveis têm natureza quantitativa de razão, ou seja, nos permitem ter uma noção sobre as tendências centrais, formato da distribuição, outliers, simetria, espalhamento e concentração dos dados.
summary(dados$vlrDocumento)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -2679.00 46.56 113.00 560.90 323.80 50220.00
summary(dados$vlrGlosa)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 0.00 0.00 4.72 0.00 3647.00
summary(dados$vlrLiquido)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -2679.0 46.0 110.9 549.4 319.0 50220.0
Vemos nos breves sumários acima 305 valores negativos, o que em um primeiro momento pode soar estranho em se tratanto de valores monetários, entretanto tais ocorrências são explicadas como bilhetes aéreos de compensação (que foram emitidos mas que não foram utilizados). Nota-se também: uma grande diferença entre a média e mediana das variáveis, e um grande range entre os valores de mínimos, médios e máximos - o que gera curiosidade sobre a distribuição desses dados.
Os gráficos abaixo nos ajudarão a compreender esse aspecto do nosso dataset:
ggplot(data=dados, aes(vlrDocumento)) +
geom_histogram(aes(fill=..count..)) +
xlab("Valor do Documento Fiscal") +
ylab("Frequência") +
ggtitle("Histograma - Valor do Documento")
ggplot(dados, aes(vlrDocumento)) + geom_density() + xlab("Valor Documento") + ylab("Probabilidade dos valores")
ggplot(data=dados, aes(vlrGlosa)) +
geom_histogram(aes(fill=..count..)) +
xlab("Valor da Supressão") +
ylab("Frequência") +
ggtitle("Histograma - Valor da Glosa")
ggplot(dados, aes(vlrGlosa)) + geom_density() + xlab("Valor Glosa") + ylab("Probabilidade dos valores")
ggplot(data=dados, aes(vlrLiquido)) +
geom_histogram(aes(fill=..count..)) +
xlab("Valor Líquido do Desconto") +
ylab("Frequência") +
ggtitle("Histograma - Valor Final")
ggplot(dados, aes(vlrLiquido)) + geom_density() + xlab("Valor Líquido") + ylab("Probabilidade dos valores")
Vemos que os dados possuem uma distribuição enviesada a direita (assimétrica positiva), o que significa uma maior frequência dos valores mais baixos dos ranges.
Ranges:
A distribução também traz uma noção de coo será a “cara” das tendências centrais dos valores, como veremos mais adiante.
Antes de analisar qualquer outro fator, é importante atentarmos para a presença de valores extremos ou estranhos, pois estes podem influenciar outras medições que porventura façamos no futuro.
qplot(data=dados, y = vlrDocumento) + ylab("Valor Documento") + xlab("Ocorrências")
qplot(data=dados, y = vlrGlosa) + ylab("Valor Glosa") + xlab("Ocorrências")
qplot(data=dados, y = vlrLiquido) + ylab("Valor Líquido") + xlab("Ocorrências")
Grosseiramente falando, nos três gráficos anteriores vemos que há presença de alguns valores bastante altos entretanto a maioria está concentrada nos intervalos de:
Nos graficos acima notamos dois pontos incomuns:
ativDocumento <- subset(dados, dados$txtDescricao=="DIVULGACAO DA ATIVIDADE PARLAMENTAR.")
qplot(data = ativDocumento, y = vlrDocumento) + ylab("Valor Documento") + ggtitle("Despesas: Divulgação da atividade parlamentar") + xlab("Ocorrências")
Há que se ter cuidado com esses valores extremos pois a depender da pergunta que desejamos responder com os dados, tais valores podem ter uma má influência no resultado da análise. Neste caso não desconsideraremos estes valores extremos pois apesar de diferir dos demais, quando consideramos o contexto e as observações da mesma categoria, compreendemos serem valores totalmente factíveis.
Para que as observações extremas mantidas não enviesem os resultados da análise devemos ficar atentos aos métodos utilizados mais a frente, como por exemplo no estudo que realizaremos a seguir sobre a tendência central desses valores.
Como já havíamos observado os dados estão dispostos de forma assimétrica, isso implica que a média, mediana e moda não serão coincidentes. Em geral quando a distribuição possui valores extremos não utilizamos a média com uma medida de tendência central, pois esta é bastante afetada por estes valores muito altos ou muito baixos. Na figura abaixo estão em destaque média, mediana e moda.
mediana <- data.frame(Linhas="Mediana", vals=c(median(dados$vlrDocumento), 0))
media <- data.frame(Linhas="Média", vals=c(mean(dados$vlrDocumento), 0))
modaD <- data.frame(Linhas="Moda", vals=c(100, 0))
linhasD <- rbind(media, mediana, modaD)
ggplot(dados, aes(x=vlrDocumento)) +
geom_histogram(colour="white", fill="lightblue") +
geom_vline(data=linhasD, aes(xintercept=vals, linetype=Linhas, colour=Linhas), show_guide = TRUE) +
xlab("Valor da despesa") # + coord_flip()
medianaG <- data.frame(Linhas="Mediana", vals=c(median(dados$vlrGlosa), 0))
mediaG <- data.frame(Linhas="Média", vals=c(mean(dados$vlrGlosa), 0))
modaDG <- data.frame(Linhas="Moda", vals=c(0, 0))
linhasDG <- rbind(mediaG, medianaG, modaDG)
ggplot(dados, aes(x=vlrGlosa)) +
geom_histogram(colour="white", fill="lightblue") +
geom_vline(data=linhasDG, aes(xintercept=vals, linetype=Linhas, colour=Linhas), show_guide = TRUE) + xlab("Valor da supressão") # + coord_flip()
medianaL <- data.frame(Linhas="Mediana", vals=c(median(dados$vlrLiquido), 0))
mediaL <- data.frame(Linhas="Média", vals=c(mean(dados$vlrLiquido), 0))
modaDL <- data.frame(Linhas="Moda", vals=c(100, 0))
linhasDL <- rbind(mediaL, medianaL, modaDL)
ggplot(dados, aes(x=vlrLiquido)) +
geom_histogram(colour="white", fill="lightblue") +
geom_vline(data=linhasDL, aes(xintercept=vals, linetype=Linhas, colour=Linhas), show_guide = TRUE) + xlab("Valor liquido do desconto") # + coord_flip()
Como era de se esperar em distribuições com skew positivo a média é maior que a mediana, que, por sua vez, é maior que a moda. Por mais que possa parecer, a moda não pe coincidente com a mediana - a diferença é pequena, mas existe.
A seguir falaremos sobre os índices de dispersão atrelados as variáveis em questão.
box <- ggplot(dados, aes("", vlrDocumento)) + geom_boxplot() +
xlab("Ano de 2015") + ylab("Valor da Despesa")
boxji <- ggplot(dados, aes("", vlrDocumento)) + geom_boxplot() +
xlab("Ano de 2015 - jitter") + ylab("Valor da Despesa") + geom_jitter()
boxG <- ggplot(dados, aes("", vlrGlosa)) + geom_boxplot() +
xlab("Ano de 2015") + ylab("Valor da Supressão")
boxjiG <- ggplot(dados, aes("", vlrGlosa)) + geom_boxplot() +
xlab("Ano de 2015 - jitter") + ylab("Valor da Supressão") + geom_jitter()
boxL <- ggplot(dados, aes("", vlrLiquido)) + geom_boxplot() +
xlab("Ano de 2015") + ylab("Valor Líquido")
boxjiL <- ggplot(dados, aes("", vlrLiquido)) + geom_boxplot() +
xlab("Ano de 2015 - jitter") + ylab("Valor Líquido") + geom_jitter()
multiplot(box, boxG, boxL, boxji, boxjiG, boxjiL, cols=2)
Nos boxplots acima vê-se que 75% dos dados está abaixo de: 5.000 para vlrDocumento e 500 para vlrGlosa, essa concentração num pequeno range inicial dos valores ratifica a classificação da distribuição feita anteriormente. Os outros 25% dos valores está bastante disperso.
sd(dados$vlrDocumento)
## [1] 1938.82
sd(dados$vlrGlosa)
## [1] 63.40188
sd(dados$vlrLiquido)
## [1] 1904.638
Respondido ao longo do tópico anterior.
Creio que um analista de dados deva, antes de tudo, entender o domínio dos dados e refletir se aqueles valores são realmente estanhos. Observações muito diferentes pode vir tanto de erros durante a fase de coleta dos dados, podem ser observações inesperadas de fenômenos irrelevantes para a pesquisa, como também podem ser ocorrências num contexto que ainda desconhecemos. Caso o analista decida por excluir ou não estes dados destoantes, que contextualize sua decisão.
ggplot(dados, aes(x = txtDescricaoEspecificacao, y = vlrDocumento / 1e3)) +
geom_bar(stat = "identity", aes(fill=txtDescricaoEspecificacao)) + xlab("Tipo do gasto") +
ylab("Total do Gasto") + ggtitle("Tipos de Gastos - Em milhares de reais") + theme(axis.text.x = element_text(angle = 45, hjust = 1))
ggplot(dados, aes(x = txtDescricao, y = vlrDocumento / 1e3)) +
geom_bar(stat = "identity") +
xlab("Tipo do gasto") +
ylab("Total do Gasto") + ggtitle("Tipos de Gastos - Em milhares de reais") + coord_flip()
Vemos, de acordo com o gráfico acima, que os parlamentares investiram bastante na divulgação da atividade parlamentar. Em segundo lugar vem o gasto com combustíveis e lubrificantes.
ggplot(dados, aes(txtDescricaoEspecificacao, vlrDocumento)) + geom_boxplot() + xlab("Descrição Gasto") + ylab("Valor Documento") + theme(axis.text.x = element_text(angle = 45, hjust = 1))
ggplot(dados, aes(txtDescricao, vlrDocumento)) + geom_boxplot() + coord_flip() + xlab("Descrição Gasto") + ylab("Valor Documento")
desvioGastos <- dados %>%
group_by(txtDescricaoEspecificacao, txtDescricao) %>%
summarize(desvioPadrao = sd(vlrDocumento))
ggplot(desvioGastos, aes(x = txtDescricao, y = desvioPadrao)) +
geom_bar(stat = "identity") + coord_flip() + xlab("Descrição") + ylab("Desvio Padrão")
Nos dois primeiros gráficos vemos que a maior variação de dados é da categoria ‘-’ e possui descrição ‘Divulgação da Atividade Parlamentar’. Ainda assim precisamos de um valor que nos mostre isso com certeza, assim calculamos o desvio padrão de cada categoria, o que ratificou nossa primeira impressão.