Introdução

Obtendo os dados - companhias do S&P 500

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!

Subset (subconjunto)

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.

Subset o data frame por registros (linhas) ou índices

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, ]

Utilizando o pacote dplyr

dplyr é 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 select

Inicialmente, 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.

A função subset

subset é 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))

Utilizando operadores básicos

operador $

head(financ$Sector, 5)
## [1] "Industrials"            "Industrials"            "Health Care"           
## [4] "Health Care"            "Information Technology"

operador []

head(financ['Sector'], 5)  # note a necessidade de utilizar ''

operador [[]]

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.

Tranformação 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

Como adicionar novas variáveis ao 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)

Como remover uma variável do data frame

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"

Como renomear variáveis de um data frame

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"

Usando o pacote dplyr

Usaremos 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"

Como renomear múltiplas variáveis de um data frame

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"

Função rename_at

Vamos 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"

Função rename_if

A 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"

Função rename_all

A 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"

Como agrupar e resumir os dados de um data frame

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))

Limpeza de Dados

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:

  • Clique aqui, se estiver utilizando a versão LOCAL deste arquivo, ou

  • Clique aqui, se estiver utiizando a versão WEB deste arquivo.