Aplicações em R
Marcos F. Silva
http://marcosfs2006.googlepages.com
04/11/2007
Capı́tulo 0 - Objetivo
Estas notas objetivam ilustrar como o software estatı́stico R1 pode ser utilizado para implementar as técnicas
de análise multivariada descritas no livro Análise Multivariada para os Cursos de Administração, Ciências
Contábeis e Economia de autoria dos Profs. Luiz J. Corrar, Edilson Paulo, José Maria Dias Filho e Colaboradores
(Ed. Atlas, 2007).
O principal objetivo é a reprodução, na medida do possı́vel, dos exemplos apresentados no livro, que em sua
maioria são desenvolvidos utilizando-se o software estatı́stico SPSS. Com isto objetiva-se apresentar o R como
uma alternativa viável, gratuita e de excelente qualidade aos softwares comerciais usualmente utilizados para a
implementação de técnicas estatı́sticas.
Pressupõe-se que o leitor já possua conhecimentos básicos do software R. Caso o leitor não esteja familiarizado
com o software, poderá consultar as referência em português indicadas em http://marcosfs2006.googlepages.com.
Neste capı́tulo, os autores definem a Análise Multivariada e fazem uma rápida apresentação de suas principais
técnicas (Regressão Múltipla, Análise Discriminante, Regressão Logistica, Análise Fatorial, Análise de Con-
glomerados e Escalonamento Multidimensional). Além destas técnicas, são apresentadas duas outras técnicas
(Redes Neurais e Lógica Nebulosa) que não são usualmente tratadas nos compêndios de Análise Multivariada.
No último capı́tulo apresenta-se a Lei de Benford.
Os dados utilizados pelos autores para ilustrar as técnicas apresentadas podem ser obtidos no site da Edi-
tora Atlas (www.EditoraAtlas.com.br). Os dados estão, em sua maioria, no formato .sav que é o formato
proprietário do SPSS.
1
1.2 Exame Gráfico dos Dados
Para a leitura destes dados pelo R precisaremos carregar o pacote foreign e utilizar a função read.spss()
contida no mesmo, que possibilita a importação de dados no formato .sav. Os comandos em R são os seguintes:
> library(foreign)
> dados <- read.spss("Cap 01 - Exemplo.sav")
> dados <- as.data.frame(dados)
> str(dados)
Nesta sessão do livro discute-se a obtenção de estatı́sticas descritivas das variáveis contidas na base de dados
em exame. No R isto pode ser obtido da seguinte forma:
> summary(dados)
CAP TAM PL AC
Capital Aberto :60 Pequena:34 Min. : 33875 Min. :14575
Capital Fechado:40 Média :32 1st Qu.: 61991 1st Qu.:29150
Grande :34 Median : 67750 Median :34450
Mean : 71246 Mean :35311
3rd Qu.: 81300 3rd Qu.:39750
Max. :111110 Max. :60950
PC AP ARLP PELP
Min. :12075 Min. : 56425 Min. : 1668 Min. : 0
1st Qu.:41400 1st Qu.: 88450 1st Qu.:12302 1st Qu.:24450
Median :51750 Median :109038 Median :17931 Median :33252
Mean :50249 Mean :106094 Mean :19716 Mean :34377
3rd Qu.:59081 3rd Qu.:126956 3rd Qu.:26897 3rd Qu.:44988
Max. :79350 Max. :152500 Max. :45036 Max. :59658
VLL
Min. :-0.117278
1st Qu.: 0.005621
Median : 0.015396
Mean : 0.016950
2
3rd Qu.: 0.030162
Max. : 0.096513
Como não consta das estatı́sticas acima o desvio padrão, vamos calculá-los da seguinte forma:
A função sapply() foi utilizada para exibir o tipo de cada uma das variáveis do conjunto de dados. Vê-se que,
à exceção das duas primeiras variáveis, todas são quantitativas. A função apply() foi utilizada para calcular o
desvio padrão para as variáveis quantitativas da base de dados.
Nesta seção do livro são apresentadas algumas técnicas de visualização da distribuição de variáveis. Especı́fica-
mente são feitos histogramas e ramo-e-folhas.
3
Histograma da Variável
Patrimônio Líquido
3e−05
2e−05
Density
1e−05
0e+00
dados$PL
Histograma da Variável
Ativo Circulante
0e+00 1e−05 2e−05 3e−05 4e−05 5e−05 6e−05
Density
dados$AC
4
> hist(dados$ARLP, freq = FALSE, main = "Histograma da Variável\nAtivo Realiz. Longo Prazo")
> mARLP <- mean(dados$ARLP)
> dpARLP <- sd(dados$ARLP)
> curve(dnorm(x, mean = mARLP, sd = dpARLP), xlim = c(min(dados$ARLP),
+ max(dados$ARLP)), n = 999, add = TRUE, col = "blue")
Histograma da Variável
Ativo Realiz. Longo Prazo
4e−05
3e−05
Density
2e−05
1e−05
0e+00
dados$ARLP
O ramo-e-folhas é uma forma alternativa, semelhante ao histograma, de se avaliar a distribuição de uma variável
quando a quantidade de observações não é muito grande.
3 | 4
3 | 9
4 | 12
4 | 567
5 | 00114
5 | 778
6 | 1111111111222444444
6 | 5555555566668888899
7 | 022333
7 | 5556677999
8 | 00001111333344
8 | 57999
9 | 11233
9 | 566
10 |
10 | 666
11 | 1
5
Embora não tenha sido apresentado no livro, o gráfico denominado QQ-Plot é também uma boa opção para
inspecionar graficamente se a distribuição de uma variável aproxima-se da distribuição normal. No R este gráfico
pode ser produzido da seguinte forma:
● ● ● ●
●
●
●
●● ●
40000
●
1e+05
●
●●●● ●●
●● ●●● ●
50000
●
●● ●
● ●●
● ●●
●● ●
●●
●
●● ● ●
●
●
●
30000
● ●
●●
●
●
●●
●
●
●
●
●● ●
●
8e+04
●
●●
● ●
●●
●● ●
●●
● ●
●
Sample Quantiles
Sample Quantiles
Sample Quantiles
●●
● ●
40000
●
●
●
● ●
●
● ●
●
●●
● ●
●
●
●● ●
●
●● ●
●
●
●
●●
●
●● ●
●
●●
● ●
●● ●
●
●●
●
●● ●
●
●
20000
●
●
●●
● ●●
●
●
●●
●
● ●
●
●●
●
●●
● ●●
●
●
●
●●
●
●●
● ●
●
●●
●
●●
●
●●
●
●● ●
●●
●●
●
● ●
●
●●
●●
● ●
●
●
6e+04
●
●
●
30000
●
●●
●●
●●
●
●● ●
●●
●
●
●
●
●●
●●
●
●
●
●●
● ●
●
●● ●●
●
●
●
●
●
●●
●● ●
●
● ●
●●
●
●
●●
●● ●
●● ●●
●
●
10000
●● ●
●●
●●
● ●
● ●●●
● ●
● ●●
20000
● ●
●●●●
●● ●●
4e+04
●
●
● ● ●●●
● ●
● ●●
●
● ● ●
0
−2 −1 0 1 2 −2 −1 0 1 2 −2 −1 0 1 2
Nesta seção apresenta-se um gráfico que permite visualizar simultaneamente gráficos de dispersão para mais de
duas variáveis. O objetivo é avaliar quais variáveis podem apresentar relações lineares entre si.
6
20000 40000 60000 60000 120000
● ● ●
● ● ●● ● ●
● ● ●● ●● ●●●●
● ● ● ● ●
●● ● ● ●
●
●● ● ● ● ● ●●
● ●
8e+04
●● ● ● ● ●●
●●●●● ● ●
● ●● ●●
● ● ● ● ● ● ● ●
●●●
● ● ●● ● ●● ●● ● ●
● ● ● ●
● ●● ● ●
●●● ● ● ● ● ● ●●● ● ●● ● ● ●●
PL ●●
● ● ●●●
●●
●●
● ● ●●
●● ●●
●●
● ●
●●● ● ●
●●●●● ● ●●
●
●
●
●
●● ●●
●
●● ●
●●
● ●●●● ●●●
● ●● ●● ● ●● ●
● ●●
●
●● ●● ●●● ●●
●
●
●
●
●
●●
●
●
●● ●●
●●
● ●
●●
●● ●
●● ● ●●
●
● ●
● ● ●●● ● ●●
● ●● ● ● ●
●● ● ● ●● ●● ●
● ● ●
● ●●● ●● ●● ●
● ● ●
4e+04
● ●● ● ●
●
●
● ●
●● ● ● ●● ●
● ●
● ● ●
60000
● ● ●● ● ●
● ● ●
●
●●●● ● ● ●● ● ● ● ● ●
● ● ● ● ● ● ●●● ● ● ●
● ●●
● ●
40000
●● ● ● ● ●●
●●
● ● ● ●● ● ● ● ● ●● ●
● ● ● ●● ●● ● ● ●
●
●●
●●
●
●
●●
●
●
●
●
●
●
●●●●●● ●
●●
●●
●●
●●
●●●
● ●●
●
●
●
●
● ●
● ● AC ●
●
● ●●●●● ●●
●●●● ●
●●●●
●●●●
●●
●
●
●●
●●● ●●
●●
●
●
●
●●
● ● ●
● ●
●
● ●
● ● ●
●●●
●●
●
●
●
●
●
●● ●
● ●●
●●
●●●
●
●● ●●
● ●●
● ● ●●
●●● ● ● ●● ●● ● ●● ● ●●● ● ●● ●
●●
20000
● ● ● ●●●●● ● ●
● ●
● ● ●●● ● ● ●● ●● ●
●● ● ●
●● ● ● ●● ●●● ●
●
● ●●●
●
● ● ●
● ● ●
● ● ●
70000
● ● ●
●
● ● ● ● ●
● ●
● ● ● ●
● ● ● ● ● ●
● ●● ●●
● ● ●
●● ● ● ●● ● ●● ● ● ●●●● ● ● ● ● ●●●
● ●●● ●●●●
●●●
● ●● ● ●●●●●●● ● ●● ●
●●
●●
●
● ● ●
●● ● ● ●●
●
●
●●● ●● ●
● ● ●
● ●
● ●●●● ● ● ● ● ●●●●● ● ● ●●●● ●
● ●●●●●● ● ● ● ●● ● ● ● ●
●●
● ●
●
●●● ●
● ●● ● ●●● ● ●● ● ● ●●
PC ●●● ● ●
40000
●●● ● ● ● ●●
● ●●● ●● ●●
● ●
● ●●● ● ●●
●● ●● ● ●
●
● ●●● ●
● ●
● ●●
●●
●
●● ●
●● ●
● ●●● ● ● ●● ● ●● ●
●
● ●●
● ● ●
● ● ● ● ●●● ● ● ●
● ● ●
● ● ●● ● ● ●● ● ● ●●
● ● ● ● ● ●
10000
● ● ●
●●● ● ●● ●● ●
● ● ●
● ● ●● ●●
●● ●●● ● ●
● ●●
● ●● ●
●● ● ● ●
120000
● ● ● ●
● ● ●●●●●●●● ● ●● ● ●● ● ●● ●● ● ●
●●●● ● ●●
● ●
● ● ● ●●● ● ● ●●
●● ●● ● ●●●●
●
●●
●● ●● ● ●●●
● ● ● ● ●● ●●●●● ● ●
●● ● ● ●● ● ●
●●● ●●
●
● ●● ●● ●
●● ●●
●
●
● ●●●●
●
●
● ●
●● ●
●● ●●
●
● ●
●
● ● ●●
●
● ●●●● ●
● ●
● ●
●●●
●●●
●
● ●●
● ● ●●
● ●
●●●●
●●
●
●●●
●●● ●
AP
● ● ● ●
● ● ● ● ● ●●●
●
●
● ●● ● ●
● ●●
●● ● ● ● ● ● ● ●
●●● ● ● ●●
● ●●● ●
● ●
● ● ● ●● ● ●●●●
60000
●●● ● ●● ● ● ●●●
●●
● ●● ●● ● ●●
Nesta seção do livro são apresentados recursos gráficos para auxiliar na verificação de diferenças entre grupos de
obeservações em relação às variáveis de interesse. O gráfico a seguir evidencia a diferença na variável Patrimônio
Lı́quido para os dois tipos de companhia existentes na base de dados, sociedades de capital aberto e de capital
fechado.
> boxplot(PL ~ CAP, data = dados, xlab = "Tipos de S.A.", ylab = "Patrim^
onio Lı́quido")
1e+05
Patrimônio Líquido
8e+04
6e+04
4e+04
Tipos de S.A.
7
Observações Atı́picas (outliers)
Nesta seção são apresentados alguns métodos gráficos para a detecção de observações atı́picas. Um gráfico muito
utilizado com esta finalidade é o boxplot. No R este gráfico pode ser produzido da seguinte forma:
●
●
●
50000
30000
10000
Aparentemente, a variável Ativo Circulante apresenta 3 valores atı́picos. Mas na realidade são 4, sendo que
um é repetido conforme mostrado a seguir:
> bxp$out
> bxp$group
[1] 1 1 1 1 2
Para evidenciar diferenças entre grupos de variáveis pode-se utilizar diferentes sı́mbolos ou sı́mbolos de cores
diferentes para plotar os dados. Os comandos a seguir ilustram como fazer isso usando o R:
> plot(PC ~ PL, data = dados, type = "n", xlab = "Passivo Circulante",
+ ylab = "Patrim^
onio Lı́quido")
> with(subset(dados, TAM == "Pequena"), points(PC ~ PL, pch = 16,
+ col = "blue"))
> with(subset(dados, TAM == "Média"), points(PC ~ PL, pch = 15,
8
+ col = "red"))
> with(subset(dados, TAM == "Grande"), points(PC ~ PL, pch = 17,
+ col = "green"))
> legend("bottomright", legend = c("Pequena", "Média", "Grande"),
+ col = c("blue", "red", "green"), pch = c(16, 15, 17))
70000
● ●
Patrimônio Líquido
●
50000
●
● ●
●
● ●
● ● ●
● ● ● ●
●
● ●●
● ●
● ●
30000
●
●
●
● ●
●
●
● ● Pequena
Média
10000
● Grande
Passivo Circulante
Outra possibilidade é a utilização de gráficos condicionais. O pacote lattice disponibiliza funções que possi-
bilitam a elaboração destes gráficos.
> library(lattice)
> xyplot(PC ~ PL | TAM, data = dados, layout = c(3, 1))
●●
● ● ●
●
●
●● ● ●
●● ● ● ● ● ●
6e+04 ● ● ● ● ●
● ● ● ● ●
● ● ● ● ●● ●
● ●
● ● ● ● ●
● ● ●● ● ● ● ●
● ●
● ● ● ● ●
PC
● ● ●
● ● ● ● ●
● ● ● ●
● ● ● ● ●
4e+04 ●
● ●● ●
● ● ● ●
● ●
●
●
●
● ●
●
●
2e+04 ●
Gráficos tridimensionais podem ser produzidos com a função scatterplot3d() do pacote de mesmo nome.
9
> library(scatterplot3d)
> scatterplot3d(dados$AC, dados$PC, dados$PL)
●
●
●
●
●
●
● ●
● ● ●
● ●● ● ● ●
20000 40000 60000 80000 100000120000
● ●● ●●
●● ● ● ●
● ● ●
●
●● ●● ●
● ● ●●
● ● ●● ● ● ●
●● ● ● ●● ●
● ● ●
●● ● ● ●●
dados$PC
●● ●
●●
●
●●
●●● ● ●●
● ●
● ●
●
dados$PL
●● 80000
●● ●
● ● 70000
●
● 60000
● 50000
40000
●
30000
20000
10000
10000 20000 30000 40000 50000 60000 70000
dados$AC
A base de dados utilizada não contém valores faltantes. Assim, para ilustrar os procedimentos descritos nesta
seção para lidar com dados faltantes, vamos construir um conjunto de dados de teste, conforme ilustrado a
seguir:
O primeiro procedimento descrito consiste em remover da base de dados os registros que apresentem valores
faltantes em qualquer das variáveis. Para identificar e, posteriormente, excluir registros com dados faltantes
utilizam-se as funções complete.cases() e na.omit() conforme mostrado a seguir.
10
Identificação dos registros com dados faltantes:
> dadosTeste[!complete.cases(dadosTeste), ]
A remoção dos registros com dados faltantes, que independe da identificação feita anteriormente, pode ser feita
da seguinte forma:
Para a substituição de valores faltantes pela média dos valores, uma abordagem possı́vel é a seguinte (assumindo
que dadosTeste ainda contenha os valores faltantes):
1.5.1 - Normalidade
Nesta seção apresenta-se o teste de Kolmogorov-Smirnov para avaliar a hipótese de normalidade dos dados. No
R este teste pode ser implementado com a função ks.test(), conforme mostrado a seguir:
11
> ks.test(dados$PL, "pnorm", mean(dados$PL), sd(dados$PL))
data: dados$PL
D = 0.1012, p-value = 0.2575
alternative hypothesis: two-sided
data: dados$PC
D = 0.0862, p-value = 0.4479
alternative hypothesis: two-sided
data: dados$ARLP
D = 0.0945, p-value = 0.3331
alternative hypothesis: two-sided
data: dados$VLL
D = 0.1636, p-value = 0.00949
alternative hypothesis: two-sided
Nesta seção do livro são apresentadas algumas transformações que usualmente são feitas nos dados para corrigir
violações das suposições estatı́sticas e/ou melhorar a relação entre as variáveis. Os comandos a seguir apresentam
duas formas alternativas de se obter uma transformação logarı́tmica da variável Patrimônio Lı́quido.
12
4 Capital Fechado Pequena 79945 30475 31050 118950 8340 26406 0.01891738
5 Capital Aberto Grande 105690 60950 58650 68625 7506 58680 0.02453471
6 Capital Fechado Média 65040 25175 44850 147925 27522 18582 0.02704524
LogPL1 LogPL2
1 11.06170 11.06170
2 11.40121 11.40121
3 11.30590 11.30590
4 11.28909 11.28909
5 11.56827 11.56827
6 11.08276 11.08276
Uma tranformação bastante utilizada em Análise Multivariada é a padronização de variáveis, que consiste em
subtrair de cada observação a média das observações e dividir pelo desvio padrão. A função scale() realiza
esta transformação.
A padronização, diferentemente da transformação logarı́tmica acima mencionada e outras, não altera a forma
da distribuição original, apenas altera a escala dos dados. Os gráficos a seguir ilustram esta afirmação.
13
Patrimônio Líquido Patrimônio Líquido
Patrimônio Líquido
(Dados Padronizados) (Logarítmos dos Dados)
25
25
30
20
20
15
15
Frequency
Frequency
Frequency
20
10
10
10
5
0
0
40000 80000 120000 −2 0 1 2 3 10.4 10.8 11.2 11.6
14