Vamos ler os dados, disponíveis no site do Data Hub.
financ <- read.csv("constituents-financials_csv.csv")
# verifica se há na's
apply(is.na(financ), 2, sum)
## Symbol Name Sector Price Price.Earnings
## 0 0 0 0 2
## Dividend.Yield Earnings.Share X52.Week.Low X52.Week.High Market.Cap
## 0 0 0 0 0
## EBITDA Price.Sales Price.Book SEC.Filings
## 0 0 8 0
Sucesso!
Um subconjunto (ou um subset) representa uma parte de um grupo. Em análise de dados, significa selecionar apenar uma parcela de um conjunto de dados maior. O data frame financ foi criado a partir de dados em arquivo. Vamos selecionar vários subsets ao longo deste estudo.
Para iniciar, vamos conhecer a estrutura do data frame financ.
str(financ)
## 'data.frame': 505 obs. of 14 variables:
## $ Symbol : chr "MMM" "AOS" "ABT" "ABBV" ...
## $ Name : chr "3M Company" "A.O. Smith Corp" "Abbott Laboratories" "AbbVie Inc." ...
## $ Sector : chr "Industrials" "Industrials" "Health Care" "Health Care" ...
## $ Price : num 222.9 60.2 56.3 108.5 150.5 ...
## $ Price.Earnings: num 24.3 27.8 22.5 19.4 25.5 ...
## $ Dividend.Yield: num 2.33 1.15 1.91 2.5 1.71 ...
## $ Earnings.Share: num 7.92 1.7 0.26 3.29 5.44 1.28 7.43 3.39 6.19 0.03 ...
## $ X52.Week.Low : num 259.8 68.4 64.6 125.9 162.6 ...
## $ X52.Week.High : num 175.5 48.9 42.3 60 114.8 ...
## $ Market.Cap : num 1.39e+11 1.08e+10 1.02e+11 1.81e+11 9.88e+10 ...
## $ EBITDA : num 9.05e+09 6.01e+08 5.74e+09 1.03e+10 5.64e+09 ...
## $ Price.Sales : num 4.39 3.58 3.74 6.29 2.6 ...
## $ Price.Book : num 11.34 6.35 3.19 26.14 10.62 ...
## $ SEC.Filings : chr "http://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=MMM" "http://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=AOS" "http://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=ABT" "http://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=ABBV" ...
Há várias informações importantes. Por exemplo, atualmente há 505 observações (linhas ou registros) e 14 variáveis (colunas ou atributos). Há 4 variáveis do tipo caracter, sendo as demais numéricas. O comando head(df, n) apresenta as primeiros n linhas de df. A função names apresenta o nome das variáveis.
names(financ)
## [1] "Symbol" "Name" "Sector" "Price"
## [5] "Price.Earnings" "Dividend.Yield" "Earnings.Share" "X52.Week.Low"
## [9] "X52.Week.High" "Market.Cap" "EBITDA" "Price.Sales"
## [13] "Price.Book" "SEC.Filings"
head(financ, 2)
Os números inteiros ao lado do ## são os números de linha ou o índice. Usando isso, podemos selecionar qualquer linha ou intervalo de linha a partir do data frame. Aqui está um exemplo onde vamos selecionar todas as colunas das linha 2 a 4.
2:4
## [1] 2 3 4
c(2:4)
## [1] 2 3 4
financ[2:4, ]
dplyrdplyr é parte integrante do tidyverse, um pacote cuja única função é carregar outros pacotes do R. É considerado um “universo” à parte do R, pois todas suas ferramentas possuem formas de uso consistentes e funcionam muito bem em conjunto. É altamente recomendável estudar os exemplos mostrados aqui. Neste estudo discutiremos apenas alguns apsectos básicos necessários para a manipulação de data frames.
filter e selectInicialmente, vamos descobrir quais são os setores das companhias, utilizando a função unique.
unique(financ$Sector)
## [1] "Industrials" "Health Care"
## [3] "Information Technology" "Consumer Discretionary"
## [5] "Utilities" "Financials"
## [7] "Materials" "Real Estate"
## [9] "Consumer Staples" "Energy"
## [11] "Telecommunication Services"
A função filter é utilizada para selecionar partes de um data frame, retornando os casos baseados em alguma expressão condicional. Vamos descobrir se há alguma companhia do setor de tecnologia da informação com o EBITDA maior do que USD 20 bilhões (\(= 2^{10}\)):
# primeiro, com o R base
financ[(financ$EBITDA > 2e10) & (financ$Sector == "Information Technology"),
c('Symbol', 'Name', 'EBITDA')]
# utilizando dplyr
library(dplyr)
financ %>%
filter((EBITDA > 2e10) & (Sector == "Information Technology")) %>%
select(Symbol, Name, EBITDA)
O símbolo %>%, conhecido como o operador pipe, foi introduzido por Stefan Milton Bache no pacote magrittr. Ele permite usar o valor resultante da expressão do lado esquerdo como primeiro argumento da função do lado direito.
subsetsubset é uma função genérica que aceita data frames, matrizes e vetores e retorna subconjuntos do tipo do objeto fornecido, com base em uma condição. Uma vantagem é que você pode definir:
uma condição para um subconjunto das observações, bem como
quais variáveis você gostaria de selecionar, utilizando a cláusula select
Vejamos um exemplo de função subset com a seleção das variáveis Nome e Sector, onde o símbolo da variável (coluna) Symbolsão “ACN” ou “APTV” e a variável Setor é “Industrials” ou “Consumer Discretionary”.
financ %>%
subset((Symbol == "ACN" | Symbol == "APTV") &
(Sector == "Consumer Discretionary" | Sector == "Industrials"),
select = c(Name, Sector))
$head(financ$Sector, 5)
## [1] "Industrials" "Industrials" "Health Care"
## [4] "Health Care" "Information Technology"
[]head(financ['Sector'], 5) # note a necessidade de utilizar ''
[[]]head(financ[['Sector']], 5)
## [1] "Industrials" "Industrials" "Health Care"
## [4] "Health Care" "Information Technology"
Note a diferença entre os dois resultados acima. O operador [[]] retorna o resultado como um vetor, que tem a mesma classe da variável selecionada, e isso é importante ao se trabalhar em transformações de dados.
Há muitos motivos para a transformação de dados. Vamos tratar aqui apenas de quatro situações. Observe que a transformação de dados é um tópico enorme e não pode se limitar aos aspectos a seguir. A necessidade de transformação de dados é impulsionada por requisitos individuais e os tópicos abaixo são genéricos.
Como adicionar uma nova variável ao data frame
Como remover uma variável do data frame
Como renomear múltiplas variáveis de um data frame
Como agrupar e resumir os dados de um data frame
Vamos começar com um exemplo: criaremos uma nova coluna, chamada “muito.alta”, com valores lógicos que informam se o preço da ação da companhia é igual ou superior a UDS 500. Há várias maneiras de se fazer isso.
# 1 (a mais comum)
financ$muito.alta <- financ$Price >= 500
financ$Price >= 500 retorna TRUE ou FALSE dependendo do valor da ação da empresa.
Outras maneiras:
# 2
financ["muito.alta"] <- financ$Price >= 500
# incomum, mas também funciona, pois as colunas dos data frames podem ser tratadas como listas
financ[["muito.alta"]] <- financ$Price >= 500
# 3
# Observe o uso da vírgula. Como estamos adicionando uma nova variável, escrevemos a expressão
# no lado direito da vírgula. Como a variável ainda não existe, R adiciona ao quadro de dados.
financ[,"muito.alta"] <- financ$Price >= 500
Utilizando a função mutate do pacote dplyr
financ <- financ %>%
mutate(muito.alta = Price >= 500)
Podemos verificar a nova coluna utilizando a função arrange do pacote dplyr, ordenando a coluna de peços de ações na ordem decrescente e selecionando apenas algumas colunas e as oito primeiras linhas:
financ %>%
arrange(desc(Price)) %>%
select(Name, Sector, Price, muito.alta) %>%
head(8)
Utilizando o comando R order, obtem-se o mesmo resultado:
head(financ[order(financ$Price, decreasing = TRUE),
c('Name', 'Sector', 'Price', 'muito.alta')], 8)
Podemos utilizar os mesmos comandos para remover variáveis de um data frame, bastando designar um valor NULL para elas.
financ[, "muito.alta"] <- NULL
names(financ)
## [1] "Symbol" "Name" "Sector" "Price"
## [5] "Price.Earnings" "Dividend.Yield" "Earnings.Share" "X52.Week.Low"
## [9] "X52.Week.High" "Market.Cap" "EBITDA" "Price.Sales"
## [13] "Price.Book" "SEC.Filings"
Note que a coluna muito.alta não mais faz parte do data frame financ.
dplyr também torna fácil a remoção de variáveis, utilizando a nossa conhecida função select. Vamos ver o resultado com as colunas “SEC.Filings” e “Sector”. Note o sinal - antes dos nomes das variáveis:
financ %>%
select(-c(SEC.Filings, Sector)) %>%
names()
## [1] "Symbol" "Name" "Price" "Price.Earnings"
## [5] "Dividend.Yield" "Earnings.Share" "X52.Week.Low" "X52.Week.High"
## [9] "Market.Cap" "EBITDA" "Price.Sales" "Price.Book"
Tabelas, gráficos e relatórios devem ser coerentes, informativos e agradáveis de serem vistos e lidos. Frequentemente se faz necessário alterar nomes de variáveis, principalmente quando estamos tratando de data frames criados a partir de dados externos.
Como exemplo, vamos renomear a variável “Price” para “Preco.acao”.
names(financ)[names(financ) == "Price"] <- "Preco.acao"
names(financ)
## [1] "Symbol" "Name" "Sector" "Preco.acao"
## [5] "Price.Earnings" "Dividend.Yield" "Earnings.Share" "X52.Week.Low"
## [9] "X52.Week.High" "Market.Cap" "EBITDA" "Price.Sales"
## [13] "Price.Book" "SEC.Filings"
dplyrUsaremos as funções rename para renomear as variáveis:
financ <- financ %>%
rename(Cap.Mercado = Market.Cap)
names(financ)
## [1] "Symbol" "Name" "Sector" "Preco.acao"
## [5] "Price.Earnings" "Dividend.Yield" "Earnings.Share" "X52.Week.Low"
## [9] "X52.Week.High" "Cap.Mercado" "EBITDA" "Price.Sales"
## [13] "Price.Book" "SEC.Filings"
Se houver um grande número de variáveis começando com um prefixo comum e desejarmos renomear todas elas de uma só vez, a função rename ou select não ajudariam. Há outras funções do pacote dplyrque podem ajudar nesse cenário.
Antes de renomear as colunas, vamos remover o data frame e recriá-lo.
rm(financ)
financ <- read.csv("constituents-financials_csv.csv")
names(financ)
## [1] "Symbol" "Name" "Sector" "Price"
## [5] "Price.Earnings" "Dividend.Yield" "Earnings.Share" "X52.Week.Low"
## [9] "X52.Week.High" "Market.Cap" "EBITDA" "Price.Sales"
## [13] "Price.Book" "SEC.Filings"
rename_atVamos utilizar rename_at primeiro identificando todas as colunas que possuem o texto “Price” e substituí-lo por “Preco”.
Precisamos do pacote stringr para usar a função str_replace, que substitui um sub-string por outro.
library(stringr)
financ <- financ %>% rename_at(vars(contains("Price")),
funs(str_replace(., "Price", "Preco")))
names(financ)
## [1] "Symbol" "Name" "Sector" "Preco"
## [5] "Preco.Earnings" "Dividend.Yield" "Earnings.Share" "X52.Week.Low"
## [9] "X52.Week.High" "Market.Cap" "EBITDA" "Preco.Sales"
## [13] "Preco.Book" "SEC.Filings"
rename_ifA função rename_if nos permite verificar o tipo da variável e, em seguida, aplicar a função str_replace para alterar o nome das variáveis se o teste for positivo.
financ <- financ %>% rename_if(is.character,
funs(str_replace(., "Name", "Nome")))
names(financ)
## [1] "Symbol" "Nome" "Sector" "Preco"
## [5] "Preco.Earnings" "Dividend.Yield" "Earnings.Share" "X52.Week.Low"
## [9] "X52.Week.High" "Market.Cap" "EBITDA" "Preco.Sales"
## [13] "Preco.Book" "SEC.Filings"
rename_allA função rename_all renomeará a coluna sem qualquer verificação. Voltemos aos nomes iniciados com “Price”:
financ <- financ %>% rename_all(funs(str_replace(., "Preco", "Price")))
names(financ)
## [1] "Symbol" "Nome" "Sector" "Price"
## [5] "Price.Earnings" "Dividend.Yield" "Earnings.Share" "X52.Week.Low"
## [9] "X52.Week.High" "Market.Cap" "EBITDA" "Price.Sales"
## [13] "Price.Book" "SEC.Filings"
A última grande operação do pacote dplyr que vamos ver é sua funcionalidade de agrupamento e agregação de dados.
Para este exemplo, vamos agrupar as companhias pelo setor e, em seguida, calcular as médias EBITDA e de Lucro líquido por ação.
financ %>%
group_by(Sector)%>%
summarize(EBITDA_medio = mean(EBITDA),
LL.acao_medio = mean(Earnings.Share))
A má qualidade dos dados é a principal razão para problemas na análise exploratória de dados e de inteligência de negócios.
Vamos estudar alguns importantes processo para a limpeza de dados em R: