-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathAula 7 - Estatística Descritiva.Rmd
416 lines (315 loc) · 10.6 KB
/
Aula 7 - Estatística Descritiva.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
---
title: "Aula 7 - Estatística Descritiva"
output: html_notebook
---
### Conteúdo
- 1. Importação e estruturação dos dados
- Demonstrativos contábeis anuais consolidados: Balanço Patrimonial e Demonstrativo de Resultado para os anos 2017 e 2019
- 2. Estatística descritiva
- Média
- Variância
- Desvio padrão
- quantis
- rotina para calcular diversas estatísticas
### 1. Importação dos dados e estruturação dos dados
Vamos fazer download dos demonstrativos financeiros das companhias abertas.
Criar os nomes dos arquivos
```{r}
# demonstrativos
dfp_id <- c("BPP", "BPA", "DRE")
# A quantidade de anos
anos <- 2017:2019
### alteração para o site abaixo:
urls <- paste0("http://dados.cvm.gov.br/dados/CIA_ABERTA/DOC/DFP/DADOS/dfp_cia_aberta_", anos, ".zip")
destino <- paste0("dfp_cia_aberta_", anos, ".zip")
destino
```
Realizar o download dos arquivos
```{r}
# criando função download
funcao_download <- function(u, d){
download.file(u, d)
}
# Fazer download e associar cada url a cada destino (arquivos zipados)
mapply(funcao_download, urls, destino)
```
Leitura dos dados
```{r}
# fazer a leitura dos dados
anos <- rep(2017:2019, each=length(dfp_id))
arquivos_nomes <- paste0("dfp_cia_aberta_", dfp_id, "_con_", anos, ".csv")
# Funcao processo de leitura
funcao_leitura_zip <- function(dest, arq){
unzip <- unz(dest, arq)
read.csv2(unzip, encoding = "latin1")
}
destino <- rep(destino, each=length(dfp_id))
destino
dados <- mapply(funcao_leitura_zip, destino, arquivos_nomes)
```
Resumindo tudo isso na função `dfp_con` abaixo:
```{r}
dfp_con <- function(dfps_id, ano_inicial, ano_final){
dfps_id <- toupper(dfps_id) # transformar em Upper case
anos <- ano_inicial:ano_final
urls <- paste0("http://dados.cvm.gov.br/dados/CIA_ABERTA/DOC/DFP/DADOS/dfp_cia_aberta_", anos, ".zip")
destino <- paste0("dfp_cia_aberta_", anos, ".zip")
funcao_download <- function(u, d){
download.file(u, d)}
mapply(funcao_download, urls, destino) # Fazer download e associar cada url a cada destino
# fazer a leitura dos dados
# o vetor anos será atualizado conforme a quantidade de demonstrativos desejados
anos <- rep(ano_inicial:ano_final, each=length(dfps_id))
arquivos_nomes <- paste0("dfp_cia_aberta_", dfps_id, "_con_", anos, ".csv")
# Funcao processo de leitura
funcao_leitura_zip <- function(dest, arq){
read.csv2(unz(dest, arq), encoding = "latin1")}
destino <- rep(destino, each=length(dfps_id))
dados <<- mapply(funcao_leitura_zip, destino, arquivos_nomes)
}
# Chamar a função que já faz o processo de download
dfp_con(dfps_id = c("bpp", "bpa", "dre"), ano_inicial = 2017, ano_final = 2019)
```
Detalhe para a atribuição aos dados `<<-` em dados. Nesse caso ele vai criar um objeto de mesmo nome no seu ambiente global.
Agora podemos realizar alguns ajustes.
Empilhar os dados em um dataframe:
```{r}
library(dplyr)
library(magrittr)
df <- bind_rows(dados)
# remover dados do ambiente para liberar memória
rm(dados)
str(df)
```
Filtrar:
- as informações do último exercício
- mês de dezembro
- As descrições de contas:
* Ativo Total
* Ativo Circulante
* Passivo Circulante
* Lucros/Prejuízos Acumulados
* Receita de Venda de Bens e/ou Serviços
Selecionar as colunas
- DT_FIM_EXERC
- DENOM_CIA
- CD_CVM
- DS_CONTA
- VL_CONTA
Vamos alterar o formato das coluna:
- VL_CONTA para numeric,
- DT_REFER para data,
- CD_CVM para character
```{r}
# selecionar as contas de interesse
contas <- c("Ativo Total", "Ativo Circulante", "Passivo Circulante", "Receita de Venda de Bens e/ou Serviços")
# as datas de interessse
datas <- as.Date(c("2017-12-31",
"2018-12-31",
"2019-12-31"))
# criar o data frame com os meses de dezembro
df_ultimo <- df %>%
mutate(DT_FIM_EXERC = as.Date(DT_FIM_EXERC),
CD_CVM = as.character(CD_CVM),
VL_CONTA = as.numeric(VL_CONTA)) %>%
filter(DT_FIM_EXERC %in% datas,
ORDEM_EXERC == "ÚLTIMO",
DS_CONTA %in% contas) %>%
select(DT_FIM_EXERC, DENOM_CIA, CD_CVM, DS_CONTA, VL_CONTA)
```
```{r}
# Estrutura
df_ultimo %>%
str()
```
Vamos transformar as contas em variáveis (colunas), mantendo o formato de que cada linha é uma observação (empresa) e cada coluna é uma variável.
Usaremos o pacote tidyr. Esse pacote tem uma função chamada pivot_wider() a qual recebe um data frame no formato longo (df_ultimo).
```{r}
library(tidyr)
# verificar se há linhas repetidas
df_ultimo %>%
distinct()
# pivot_wider
df_wide <- df_ultimo %>%
distinct() %>%
pivot_wider(names_from = DS_CONTA,
values_from = VL_CONTA) %>%
unnest() # desagrupar as linhas
```
### 2. Agora podemos iniciar a apresentação das estatísticas descritivas
Funções:
- Média: `mean(x)`
- Mediana: `median(x)`
- Variância: `var(x)`
- Desvio padrão: `sd(x)`
- Mínimo: `min(x)`
- Máximo: `max(x)`
- Quantis: `quantile(x, probs)`
A função mais básica do R para resumir os dados é chamada `summary`
Ela apresenta as seguintes estatísticas:
* min,
* 1º quartil (25%),
* Mediana (50%),
* Média,
* 3º quartil (75%)
* Máximo.
```{r}
summary(df_wide)
```
Então para iniciarmos nas funções básicas.
Vamos conhecer quantas empresas temos na nossa base. Para tanto, usaremos a função `unique` em `DENOM_CIA`
```{r}
df_wide %>%
select(DENOM_CIA) %>%
unique()
```
Temos 359 empresas ao todo.
Agora sua vez de praticar:
Mostre quais as datas de referência da nossa base
```{r}
# EX. 1
```
Verifique que dispomos de 3 datas.
Agora vamos selecionar as colunas de valores númericos para calcular as estatísticas
Antes de iniciar os cálculo, verificaremos que os dados contém NAs
```{r}
sum(is.na(df_wide))
```
Temos 177 NAs ao todo. Temos que removê-los. Se você quiser visualizar, utilize o código a seguir:
```{r}
df_wide %>%
filter_all(any_vars(is.na(.)))
```
Ao todo são 65 linhas que precisamos remover.
```{r}
df_wide <- df_wide %>%
na.omit()
```
### 2. Estatística descritiva
#### Média
Para calcular a média, utilize a função `mean`
```{r}
# Média do Ativo Total
mean(df_wide$`Ativo Total`)
# ou
df_wide$`Passivo Circulante` %>%
mean()
# Média da Receita
mean(df_wide$`Receita de Venda de Bens e/ou Serviços`)
```
Agora sua vez: Calcule a média para todas as variáveis quantitativas.
Dica: é possível usar a função `summarise` com o sufixo `_if` (`summarise_if(condicao, funcao)`) que testa uma condição e, se o resultado for verdadeira, ela aplica a função declarada no segundo argumento.
```{r}
# Ex. 2:
```
Além disso, calcule a média das variáveis quantitativas para cada ano (2017, 2018 e 2019).
Lembre-se que é possível utilizar a função `group_by()`. Responda a pergunta: As médias variam ao longo do tempo?
```{r}
# Ex. 3:
```
#### Variância
Mede o grau de variabilidade de uma variável.
A variância amostral é calculada a partir da fórmula a seguir:
$$
s^2 = \frac{1}{n-1}\sum_{i=1}^{n}(X_i - \overline{X})^2
$$
onde,
* $\overline{X}$ é a média amostral,
* $n$ é o tamanho amostral, isto é, a quantidade de observações.
No R, utilizamos a função `var`:
```{r}
# Variância do Ativo Total
var(df_wide$`Ativo Total`)
# Variância da Receita
var(df_wide$`Receita de Venda de Bens e/ou Serviços`)
```
#### Desvio Padrão
O desvio padrão é a raiz quadrada da variância:
$$
s = \sqrt(s^2)
$$
No R, o desvio padrão é calculado a partir da função `sd`:
```{r}
# desvio padrão dos ativos totais
sd(df_wide$`Ativo Total`)
```
Agora sua vez: Calcule o desvio padrão de todas as variáveis quantitativas para cada ano. Utilize a função `summarise_if`.
```{r}
# Ex. 4
```
Qual é a variável com maior desvio padrão para cada ano? Mostre-as.
```{r}
# Mostre a variável e o seu nome
sd_quant <- df_wide %>%
group_by(DT_FIM_EXERC) %>%
summarise_if(is.numeric, sd) %>%
select(-DT_FIM_EXERC)
colnames(sd_quant)[apply(sd_quant, 1, which.max)]
sd_quant$`Ativo Total`
```
#### Quantis
A função `quantile(x, probs)` apresenta um ou mais quantis do vetor `x`.
```{r}
# apenas um quantil 0.25 (o ponto onde acumula-se 25% dos dados)
quantile(df_wide$`Passivo Circulante`, probs = 0.25)
# mais de um quantil. 0.1, 0.5 (mediana) e 0.9
quantile(df_wide$`Ativo Total`, probs = c(0.1, 0.5, 0.9))
```
#### Rotina para calcular diversas estatísticas
Vamos criar uma função que calcula diversas estatísticas para um vetor.
```{r}
estatisticas <- function(x){
x <- x[!is.na(x)] # isso serve para que ele omita as observações com NA
me <- mean(x)
med <- median(x)
n <- length(x)
s <- sd(x)
mi <- min(x)
ma <- max(x)
q25 <- quantile(x, probs = 0.25)
q75 <- quantile(x, probs = 0.75)
return(c(n = n, media = me, mediana = med, desvio = s,
Q = q25, Q = q75, min = mi, max = ma))
}
```
Usaremos a função para calcular essas estatísticas para a variável `Ativo Circulante`:
```{r}
estatisticas(df_wide$`Ativo Circulante`)
```
Agora aplicaremos essa função em todas as variáveis quantitativas da nossa base:
```{r}
#Posso fazer com a função sapply. Nesse caso preciso selecionar as variáveis quantitativas
## apply aplica uma função em uma margem de um data frame.
# REtorna uma matrix. Podemos transformar em data frame
df_wide %>%
select_if(is.numeric) %>%
apply(MARGIN = 2, FUN = estatisticas) %>%
as.data.frame()
```
A partir dessas estatísticas podemos nos perguntar qual é o valor mínimo, máximo, média, mediana, desvio padrão etc para cada variável da nossa amostra. Isto é, qual menor valor para a receita de vendas? Qual o maior valor para a receita de vendas?
Agora digamos que desejamos empregar essas mesma função mas para cada ano da nossa base. Como faremos?
```{r}
# criar um vetor com os nomes das variáveis quantitativas
vars_quant <- df_wide %>%
select_if(is.numeric) %>%
colnames()
# Vamos criar uma função que faz o cálculo das estatísticas por colunas
destats <- function(x){
apply(x, 2, estatisticas)
}
### vamos usar a função by(df[, quant_vars], var_grupo, funcao) para calcular estatisticas() por grupos
estatisticas_ano <- by(df_wide[,vars_quant], df_wide$DT_FIM_EXERC, destats)
estatisticas
```
Por fim veremos como calcular uma matriz de correlação. Para tanto, utilizaremos a função `cor`, a qual também calcula correlações entre duas variáveis.
```{r}
# Correlação entre Ativo Total e Ativo Circulante
cor(df_wide$`Ativo Total`, df_wide$`Ativo Circulante`)
# Matriz de correlação
m_cor <- df_wide %>%
select_if(is.numeric) %>%
cor()
# Ë possível transformar em data frame utilizando a função as.data.frame
m_cor %>%
as.data.frame()
```