Carregando os dados e pacotes que serão usados nos exemplos da aula:

options(Encoding="UTF-8")
library(gmodels)
dados_exp_vida = read.csv("../data/life_expectancy.csv") # dados sobre expecativa de vida em 197 países
dados_homicidios = read.csv("../data/homicidios_cidade.csv",header=F) # dados sobre as 50 cidades mais violentas por número de homcídio. Fonte: http://glo.bo/1nuIQuK
dados_bancarios = read.csv("../data/dados_bancarios.csv",header=T) # Fonte: http://superdatascience.com/training/
dados_salario = read.csv("../data/salario_barcelona.csv",header=F) #Dados sobre salário semanal dos jogadores do Barcelona 2015-2016 em libras esterlinas.
dados_notas = read.csv("../data/dados_notas.csv") #Notas de alunos de uma turma passada do DME dada a alunos de computa????o.

Sumarização

Uma boa forma de começar a olhar os dados de variáveis quantitativas (ou numéricas) é usar um Scatter Plot (gráfico de dispersão). Abaixo plotamos os dados de notas de uma disciplina do DME dada a alunos de computação:

plot(dados_notas$Aluno,dados_notas$Notas,xlab="Aluno",ylab="Nota")

plot(dados_notas$Aluno,sort(dados_notas$Notas),xlab="Aluno",ylab="Nota") #ordenado por notas

Abaixo plotamos o Boxplot e mostramos o sumário de 5 número dos dados.

boxplot(dados_notas$Notas,ylab="Notas")

summary(dados_notas$Notas)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.000   1.092   3.875   3.880   6.265   8.780

A chamada padrão da função boxplot já calcula automaticamente possíveis outliers como mostrado no Boxplot de salários dos jogadores do Barcelona abaixo.

boxplot(dados_salario$V2,ylab="Salários Semanais")

Distribuição dos Dados

Atribuindo a parte numérica dos dados (expectativa de vida em anos) à variável life_exp:

life_exp = dados_exp_vida[,2]

Quando os dados são quantitativos, um histograma pode dizer muito sobre a distribuição desses dados. O eixo x é composto por intervalos de valores (também chamados de bins) e o eixo y contém a quantidade de valores que caem dentro de cada intervalo. O tamanho do intervalo é configurável e pode mudar a forma da distribuição. O código abaixo gera o histograma para os dados sobre expectativa de vida. Note que o parâmetro breaks especifica o número de bins que desejamos para o histograma.

hist(life_exp,breaks=10, xlab = "Expectativa de Vida (anos)",main = "Histograma de Expectativa de Vida",ylab = "Frequencia")

Abaixo geramos três histogramas como ilustração de distribuições enviesadas para a esquerda, direita e simétricas.

left = rbeta(10000,5,2)
right = rbeta(1000,2,5)
center = rbeta(10000,5,5)

hist(left,main="Dist. Enviesada Esquerda",xlab='',ylab='',prob=T)
lines(density(left,bw=0.05),col='red',lwd=3)

hist(right,main="Dist. Enviesada Direita",xlab='',ylab='',prob=T)
lines(density(right,bw=0.05),col='red',lwd=3)

hist(center,main="Dist. Sim??trica",xlab='',ylab='',prob=T)
lines(density(center,bw=0.05),col='red',lwd=3)

Abaixo geramos o Boxplot (horizontal) dos dados de expectativa de vida que nos ajuda a verificar que a distribuição é enviesada para a esquerda.

boxplot(life_exp,horizontal = T,range=0,xlab="Expectativa de Vida (anos)")

O sumário da distribuição mostra isso mais claramente. Note que a distância do primeiro quartil à mediana é menor que a distância da mediana ao terceiro quartil. Também note que a média possui um valor diferente da mediana.

summary(life_exp)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   47.79   61.52   72.48   68.91   76.74   83.39

Desvio padrão

Para calcular a média, variância e desvio padrão de uma variável quantitativa basta chamar as funções mean, var e sd respectivamente como no exemplo abaixo.

mean(dados_salario$V2)
## [1] 78351.85
var(dados_salario$V2)
## [1] 3823573362
sd(dados_salario$V2)
## [1] 61835.05

Variável Categórica

Nesse exemplo vamos criar um gráfico de barras para visualizar a quantidade de cidades, do ranking das 50 cidades mais violentas (http://glo.bo/1nuIQuK), por país. Abaixo o código para atribuir a coluna país à variável pais.

pais = dados_homicidios[,2]

A função table() conta o número de ocorrências de cada país nos dados.

counts = table(pais)

A função barplot() abaixo gera o gráfico de barras (por frequencia absoluta e relativa).

barplot(counts, col=rainbow(10),legend.text = rownames(counts))

relfreq = counts/sum(counts)
barplot(relfreq, col=rainbow(10),legend.text = rownames(relfreq))

Relação entre variáveis qualitativas e quantitativas

Aqui vamos comparar as distribuições de homicídios considerando Brasil, Venezuela e México.

colnames(dados_homicidios) = c("Cidade", "Pais", "Homicidios")
attach(dados_homicidios)
homicidios_pais = split(dados_homicidios,Pais)
Brasil = homicidios_pais$Brasil
Venezuela = homicidios_pais$Venezuela
Mexico = homicidios_pais$Mexico
boxplot(Brasil$Homicidios, Venezuela$Homicidios, Mexico$Homicidios, names=c("Brasil","Venezuela", "México"))

Relação entre variáveis categóricas

O código abaixo mostra como gerar as tabelas de contagem absoluta e relativa de cada variável, ou seja, da variável Gender (Sexo) e da variável Exited que indica se o cliente permaneceu (Stayed) ou deixou o banco (Exited).

dados_bancarios$Gender = factor(dados_bancarios$Gender, levels = c("Male","Female"))
dados_bancarios$Exited = factor(dados_bancarios$Exited, levels = c('0','1'), labels = c("Stayed", "Exited"))
freqGender = table(dados_bancarios$Gender)
freqExited = table(dados_bancarios$Exited)
relfreqGender = freqGender/nrow(dados_bancarios)
relfreqExited = freqExited/nrow(dados_bancarios)
cbind(freqGender,relfreqGender)
##        freqGender relfreqGender
## Male         5457        0.5457
## Female       4543        0.4543
cbind(freqExited,relfreqExited)
##        freqExited relfreqExited
## Stayed       7963        0.7963
## Exited       2037        0.2037

Para criar a tabela de contingência chamamos a função CrossTable() do pacote gmodels.

joint = CrossTable(dados_bancarios$Exited,dados_bancarios$Gender,chisq = F)
## 
##  
##    Cell Contents
## |-------------------------|
## |                       N |
## | Chi-square contribution |
## |           N / Row Total |
## |           N / Col Total |
## |         N / Table Total |
## |-------------------------|
## 
##  
## Total Observations in Table:  10000 
## 
##  
##                        | dados_bancarios$Gender 
## dados_bancarios$Exited |      Male |    Female | Row Total | 
## -----------------------|-----------|-----------|-----------|
##                 Stayed |      4559 |      3404 |      7963 | 
##                        |    10.499 |    12.611 |           | 
##                        |     0.573 |     0.427 |     0.796 | 
##                        |     0.835 |     0.749 |           | 
##                        |     0.456 |     0.340 |           | 
## -----------------------|-----------|-----------|-----------|
##                 Exited |       898 |      1139 |      2037 | 
##                        |    41.041 |    49.298 |           | 
##                        |     0.441 |     0.559 |     0.204 | 
##                        |     0.165 |     0.251 |           | 
##                        |     0.090 |     0.114 |           | 
## -----------------------|-----------|-----------|-----------|
##           Column Total |      5457 |      4543 |     10000 | 
##                        |     0.546 |     0.454 |           | 
## -----------------------|-----------|-----------|-----------|
## 
## 
joint
## $t
##         y
## x        Male Female
##   Stayed 4559   3404
##   Exited  898   1139
## 
## $prop.row
##         y
## x             Male    Female
##   Stayed 0.5725229 0.4274771
##   Exited 0.4408444 0.5591556
## 
## $prop.col
##         y
## x             Male    Female
##   Stayed 0.8354407 0.7492846
##   Exited 0.1645593 0.2507154
## 
## $prop.tbl
##         y
## x          Male Female
##   Stayed 0.4559 0.3404
##   Exited 0.0898 0.1139

Chamando a variável \(joint\) temos acesso a várias tabelas de contingência, incluindo tabelas contendo os valores aboslutos e relativos, tais como as distriuições condicionais. O atributo t nos dá a tabela de contingência com os valores absolutos que podemos usar para plotar os gráficos de barra lado a lado e empilhados.

joint_counts = joint$t
barplot(joint_counts,beside=T,col=rainbow(2),ylab='Frequencia',xlab='Sexo')
legend('topright',c('Saiu','Ficou'),pch=15,col=rainbow(2))

barplot(joint_counts,beside=F,col=rainbow(2),ylab='Frequencia',xlab='Sexo')
legend('topright',c('Saiu','Ficou'),pch=15,col=rainbow(2))

Para acessar a distribuição condicional de Exited dado Gender, acessamos o atributo prop.col de joint. A partir disso podemos plotar o gráfico de barras agora com a distribuição condicional.

Exited_given_Gender = joint$prop.col
barplot(Exited_given_Gender, col=rainbow(2), ylab='Propor????o de clientes que sa??ram e ficaram para cada Sexo',xlab='Sexo')

Correlação entre variáveis quantitativas

Além de plotar um Scatter Plot para verificar visualmente se há alguma correlação entre as variáveis, podemos chamar a função cor como no exemplo abaixo que mede o grau de correlação linear entre expectativa de vida e PIB.

PIB = dados_exp_vida[,3]
plot(PIB,life_exp,xlab="PIB",ylab="Expectativa de Vida")

cor(PIB,life_exp)
## [1] 0.6350906