“Os dados são um negócio bagunçado - um negócio muito, muito bagunçado”. James Tiberius Kirk, Jornada nas Estrelas, episódio: “Um gosto de Armagedon”.
“No meu próprio trabalho, 60% do tempo que gasto em análise de dados estão focados na preparação dos dados para análise. Vou começar a dizer que o mesmo provavelmente é verdade de uma forma ou de outra para a maioria dos analistas de dados do mundo real. Kabacoff, R in Action.
Apresentaremos uma visão conceitual introdutória que será útil para a sequência do curso. Um breve extensão do material aqui apresentado pode ser visto em Distribuições de probabilidade elementares para a análise de dados e Uma breve introdução ao teorema de Bayes para a ciência de dados
Uma variável aleatória fornece um meio para de descrever resultados experimentais usando-se valores numéricos. As variáveis aleatórias devem sempre assumir valores numéricos.
Na realidade, uma variável aleatória associa um valor numérico a cada resultado experimental possível. O valor numérico da variável aleatória depende do resultado do experimento. Uma variável aleatória pode ser classificada como discreta ou contínua, dependendo dos valores que ale assuma.
Variável Aleatória (v.a.): É a descrição numérica do resultado de um experimento.
A v.a. então pode ser algo abstrato, que se torna concreto no momento em que se mede um objeto escolhido para isso. Por exemplo, usamos a variável peso utilizando uma medida em kg e, portanto, criando um dado. Se você escolher um grupo de leitores e medir gêneros, números de livros lidos durante um ano, valores gastos em livros durante o ano, você estará criando um conjunto de dados. Então, temos dados e todos os cálculos serão feitos com os dados, enquanto a interpretação dos resultados vai refletir a informação que queremos e é feita voltando às variáveis e seus significados.
As variáveis aleatórias podem ser categóricas, também chamadas de qualitativas, ou quantitativas.
Figura 17 - Variáveis Aleatórias
Variáveis aleatórias numéricas podem ser discretas ou contínuas.
Variáveis aleatórias discretas, como o nome sugere, podem assumir apenas alguns valores específicos. Por exemplo, quando se joga um dado, os resultados possíveis são 1, 2, 3, 4, 5 ou 6, ou seja, números inteiros entre 1 e 6.
Variáveis aleatórias contínuas podem assumir qualquer valor dentro de um determinado intervalo de valores (domínio). Note que o domínio pode ser finito ou infinito. Por exemplo, a receita de venda de uma determinada empresa em um certo período ou o peso ou a altura de uma pessoa. Resultados experimentais que se baseiam em escalas de medidas como: tempo, peso, distância e temperatura podem ser descritos por meio de variáveis contínuas.
Por sua vez, as variáveis categóricas exprimem somente uma qualidade do que vem a ser medido, a exemplo de sexo, que só tem duas possibilidades, masculino e feminino, ou, então, qualidade de atendimento: ruim, razoável ou bom. Uma carteira de risco de crédito se enquadra numa variável categórica, baixo risco, médio risco, alto risco, especulativo.
Variáveis categóricas podem ser nominais e ordinais. A variável sexo é uma variável categoria nominal. Por sua vez, a variável atendimento é ordinal, pois possuem níveis de atendimento numa escala de 0 a 5 ou 0 a 10.
Antes de ingressarmos nos exercícios, é importante eliminar as variáveis (NA = not available).
Funções is.na() e na.omit()
Em um projeto de qualquer tamanho, é provável que os dados estejam incompletos devido a perguntas perdidas, equipamento defeituoso ou dados codificados incorretamente. Em R, os valores ausentes são representados por o símbolo NA (not availabe ou, não disponível). Valores impossíveis (por exemplo, dividindo por 0) são representados pelo símbolo NaN (Not a Number, ou não é um número). O R usa o mesmo símbolo de valores ausentes para dados numéricos e de caracteres. R fornece várias funções para identificar observações que contêm informações ausentes valores. A função is.na() permite testar a presença de valores ausentes.
Suponha que você esteja estudando de que forma pessoas diferem nas maneiras como lideram suas organizações. Perguntas típicas poderiam ser:
Uma maneira de abordar essas questões é fazer com que chefes de vários países classifiquem gerentes sobre comportamento diferente, utilizando um questionário e classificando como na Figura 18:
Figura 18 - Notas
A pesquisa está compilada na planilha lider.xlsx.
if (!require(readxl)) {
install.packages('readxl')
library(readxl)
}
lider <- readxl::read_excel(here::here("Dados", "lider.xlsx"))
lider
Para cada um dos cinco gerentes foram efetuadas cinco questões (q1 a q5).
Por exemplo: o gerente 1 tem 32 anos, com posto nos Estados Unidos e sexo masculino, ao passo que o gerente 5, trabalha na Grã-Bretanha, tem 99 anos (opa! Essa idade pode ser um dado faltante) e de sexo feminino.
Para abordar as questões de interesse, precisamos primeiro abordar o gerenciamento de vários dados. Aqui está uma lista parcial:
Figura 19 - Operadores Lógicos
Algumas ações:
lider$idade[lider$idade == 99] <- NA
is.na()is.na(lider)
## Gerente Genero idade q1 q2 q3 q4 q5
## [1,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [2,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [3,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [4,] FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE
## [5,] FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE
Você verificará que existem variáveis que são NA (TRUE).
(lider <- na.omit(lider)) # os parênteses exibem a variável
Variáveis categóricas em R são chamadas de “fatores”. Os fatores são cruciais em R, porque determinam como os dados serão analisados e apresentados visualmente.
A função factor() armazena os valores categóricos como um vetor de números inteiros no intervalo [1 … k], onde k é o número de valores únicos na variável nominal, e um vetor interno de cadeias de caracteres (os valores originais) mapeados para esses números inteiros.
Outro exemplo:
A área de Pessoas de uma empresa coletou uma amostra da área fabril e deseja ter maiores informações a respeito dos colaboradores para algumas ações de benefícios. Os dados estão disponibilizados no arquivo colaboradores.csv. Você, como analista de dados, fora convidado para efetuar algumas análises com base nos dados coletados.
O primeiro passo será o de baixar o arquivo para análise em ambiente R.
A função read.csv().
Pode-se importar dados de arquivos de texto delimitados usando read.csv(), que lê um arquivo no formato .csv e o salva como um data frame.
df <- read.csv(here::here("Dados", "colaboradores.csv"), header = TRUE, sep = ";")
class(df)
## [1] "data.frame"
head(df)
# outros recursos de apresentação de dados do R
library(magrittr)
df %>%
kableExtra::kable() %>%
kableExtra::kable_styling(bootstrap_options = c("striped", "hover", "condensed"))
| N | estado_civil | grau_instrucao | n_filhos | salario | idade_anos | idade_meses | reg_procedencia |
|---|---|---|---|---|---|---|---|
| 1 | solteiro | fundamental | 4.00 | 26 | 3 | interior | |
| 2 | casado | fundamental | 1 | 4.56 | 32 | 10 | capital |
| 3 | casado | fundamental | 2 | 5.25 | 36 | 5 | capital |
| 4 | solteiro | medio | 5.73 | 20 | 10 | outra | |
| 5 | solteiro | fundamental | 6.26 | 40 | 7 | outra | |
| 6 | casado | fundamental | 0 | 6.66 | 28 | 0 | interior |
| 7 | solteiro | fundamental | 6.86 | 41 | 0 | interior | |
| 8 | solteiro | fundamental | 7.39 | 43 | 4 | capital | |
| 9 | casado | medio | 1 | 7.59 | 34 | 10 | capital |
| 10 | solteiro | medio | 7.44 | 23 | 6 | outra | |
| 11 | casado | medio | 2 | 8.12 | 33 | 6 | interior |
| 12 | solteiro | fundamental | 8.46 | 27 | 11 | capital | |
| 13 | solteiro | medio | 8.74 | 37 | 5 | outra | |
| 14 | casado | fundamental | 3 | 8.95 | 44 | 2 | outra |
| 15 | casado | medio | 0 | 9.13 | 30 | 5 | interior |
| 16 | solteiro | medio | 9.35 | 38 | 8 | outra | |
| 17 | casado | medio | 1 | 9.77 | 31 | 7 | capital |
| 18 | casado | fundamental | 2 | 9.80 | 39 | 7 | outra |
| 19 | solteiro | superior | 10.53 | 25 | 8 | interior | |
| 20 | solteiro | medio | 10.76 | 37 | 4 | interior | |
| 21 | casado | medio | 1 | 11.06 | 30 | 9 | outra |
| 22 | solteiro | medio | 11.59 | 34 | 2 | capital | |
| 23 | solteiro | fundamental | 12.00 | 41 | 0 | outra | |
| 24 | casado | superior | 0 | 12.79 | 26 | 1 | outra |
| 25 | casado | medio | 2 | 13.23 | 32 | 5 | interior |
| 26 | casado | medio | 2 | 13.60 | 35 | 0 | outra |
| 27 | solteiro | fundamental | 13.85 | 46 | 7 | outra | |
| 28 | casado | medio | 0 | 14.69 | 29 | 8 | interior |
| 29 | casado | medio | 5 | 14.71 | 40 | 6 | interior |
| 30 | casado | medio | 2 | 15.99 | 35 | 10 | capital |
| 31 | solteiro | superior | 16.22 | 31 | 5 | outra | |
| 32 | casado | medio | 1 | 16.61 | 36 | 4 | interior |
| 33 | casado | superior | 3 | 17.26 | 43 | 7 | capital |
| 34 | solteiro | superior | 18.75 | 33 | 7 | capital | |
| 35 | casado | medio | 2 | 19.40 | 48 | 11 | capital |
| 36 | casado | superior | 3 | 23.30 | 42 | 2 | interior |
#alterando nomes das colunas
library(gdata)
str(df)
## 'data.frame': 36 obs. of 8 variables:
## $ N : int 1 2 3 4 5 6 7 8 9 10 ...
## $ estado_civil : chr "solteiro" "casado" "casado" "solteiro" ...
## $ grau_instrucao : chr "fundamental" "fundamental" "fundamental" "medio" ...
## $ n_filhos : int NA 1 2 NA NA 0 NA NA 1 NA ...
## $ salario : num 4 4.56 5.25 5.73 6.26 6.66 6.86 7.39 7.59 7.44 ...
## $ idade_anos : int 26 32 36 20 40 28 41 43 34 23 ...
## $ idade_meses : int 3 10 5 10 7 0 0 4 10 6 ...
## $ reg_procedencia: chr "interior" "capital" "capital" "outra" ...
df <- gdata::rename.vars(df,
from = c("estado_civil", "grau_instrucao","n_filhos",
"reg_procedencia", "idade_anos","idade_meses"),
to = c("civil", "instrucao", "filhos", "regiao", "ano", "mes"))
##
## Changing in df
## From: estado_civil grau_instrucao n_filhos reg_procedencia idade_anos
## To: civil instrucao filhos regiao ano
##
## From: idade_meses
## To: mes
head(df)
# variáveis categóricas (factors) e numéricas
str(df)
## 'data.frame': 36 obs. of 8 variables:
## $ N : int 1 2 3 4 5 6 7 8 9 10 ...
## $ civil : chr "solteiro" "casado" "casado" "solteiro" ...
## $ instrucao: chr "fundamental" "fundamental" "fundamental" "medio" ...
## $ filhos : int NA 1 2 NA NA 0 NA NA 1 NA ...
## $ salario : num 4 4.56 5.25 5.73 6.26 6.66 6.86 7.39 7.59 7.44 ...
## $ ano : int 26 32 36 20 40 28 41 43 34 23 ...
## $ mes : int 3 10 5 10 7 0 0 4 10 6 ...
## $ regiao : chr "interior" "capital" "capital" "outra" ...
summary(df)
## N civil instrucao filhos
## Min. : 1.00 Length:36 Length:36 Min. :0.00
## 1st Qu.: 9.75 Class :character Class :character 1st Qu.:1.00
## Median :18.50 Mode :character Mode :character Median :2.00
## Mean :18.50 Mean :1.65
## 3rd Qu.:27.25 3rd Qu.:2.00
## Max. :36.00 Max. :5.00
## NA's :16
## salario ano mes regiao
## Min. : 4.000 Min. :20.00 Min. : 0.000 Length:36
## 1st Qu.: 7.553 1st Qu.:30.00 1st Qu.: 3.750 Class :character
## Median :10.165 Median :34.50 Median : 6.000 Mode :character
## Mean :11.122 Mean :34.58 Mean : 5.611
## 3rd Qu.:14.060 3rd Qu.:40.00 3rd Qu.: 8.000
## Max. :23.300 Max. :48.00 Max. :11.000
##
#usando factor()
df$civil <- factor(df$civil)
df$instrucao <- factor(df$instrucao)
df$regiao <- factor(df$regiao)
Note que vários colaboradores estão sem informações de dependentes. Trataremos essa questão a posteriori.
Algumas análises.
Criando uma tabela para status civil:
tb.civil <- table(df$civil)
tb.civil
##
## casado solteiro
## 20 16
summary(df$civil)
## casado solteiro
## 20 16
prop.civil <- 100 * prop.table(tb.civil)
round(prop.civil, digits = 2)
##
## casado solteiro
## 55.56 44.44
Há 36 colaboradores, 20 casados (55,56%) e 16 solteiros (44,44%). Note que essas variáveis aleatórias são qualitativas.
Importante: Só se conseguirá efetuar essa análise se tiver usado a função factor().
Criando uma tabela para status grau de instrução:
tb.instrucao <- table(df$instrucao)
tb.instrucao
##
## fundamental medio superior
## 12 18 6
#verificando os percentuais
prop.instrucao <- 100 * prop.table(tb.instrucao)
round(prop.instrucao, 2)
##
## fundamental medio superior
## 33.33 50.00 16.67
Apenas 16,67% dos colaborares possuem nível superior e escolaridade. 83,33% possui escolaridade até o ensino médio.
De forma similar para as regiões em que moram os colaboradores:
Criando uma tabela para status região:
tb.regiao <- table(df$regiao)
tb.regiao
##
## capital interior outra
## 11 12 13
#verificando os percentuais
prop.regiao <- 100 * prop.table(tb.regiao)
round(prop.regiao, 2)
##
## capital interior outra
## 30.56 33.33 36.11
11 colaboradores moram na capital (30,56%), 12 no interior e, 13 no entorno da cidade (ou 36,11% do total).
Uma análise interessante, conjugando as três variáveis, pode ser dada por:
# criando uma tabela de frequencia conjuntas
(tb.conj <- table(df$civil, df$instrucao, df$regiao))
## , , = capital
##
##
## fundamental medio superior
## casado 2 4 1
## solteiro 2 1 1
##
## , , = interior
##
##
## fundamental medio superior
## casado 1 6 1
## solteiro 2 1 1
##
## , , = outra
##
##
## fundamental medio superior
## casado 2 2 1
## solteiro 3 4 1
(minha_ftable <- ftable(tb.conj))
## capital interior outra
##
## casado fundamental 2 1 2
## medio 4 6 2
## superior 1 1 1
## solteiro fundamental 2 2 3
## medio 1 1 4
## superior 1 1 1
# df_ftable <- as.data.frame(minha_ftable)
#
# df_ftable <- gdata::rename.vars(df_ftable,
# from = c("Var1", "Var2","Var3"),
# to = c("civil", "instrucao", "regiao"))
#
# print(df_ftable)
Dos 5 colaboradores casados com ensino fundamental: 2 moram na capital, 1 no interior e 2 no entorno da capital.
Efetuaremos alguns gráficos, que serão explicados com profundidade posteriormente:
# Criando graficos
par(mfrow = c(2, 3)) # 2 linhas e 3 colunas
barplot(tb.civil, col = c("red","green"),
main = "Estado Civil",
xlab = "Status",
ylab = "frequência")
barplot(tb.instrucao,
col = c("red", "green", "blue"),
main = "Escolaridade",
xlab = "Escolaridade",
ylab = "frequência")
barplot(tb.regiao,
col = c("grey", "darkblue", "darkred"),
main = "Região",
xlab = "frequência",
ylab = "regiao",
horiz = T)
hist(df$salario,
col = "darkgrey",
main = "Salário",
xlab = "salário",
ylab = "frequência")
idade <- df$ano+df$mes / 12
x <- idade
y <- df$salario
plot(x, y,
main = "Scatterplot idade vs salário",
xlab = "idade",
ylab = "salário",
pch = 19,
frame = FALSE)
abline(lm(y ~ x, data = mtcars), col = "red", lwd = 2)
boxplot(df$salario ~ df$instrucao,
col = c("red","darkgreen","darkblue"),
main = "Bloxplot",
xlab = "escolaridade",
ylab = "salário")
par(mfrow = c (1, 1))
Parece Excel? Tente trabalhar com milhões de registros!
Três conceitos estão inseridos neste tópico:
Tendência central: corresponde à extensão na qual todos os valores de dados se agrupam em torno de um valor típico o central.
Variação: corresponde ao montante de dispersão de valores em relação a um valor central.
Formato: corresponde ao padrão de distribuição de valores, partindo de um valor mais baixo para o valor mais alto.
Dado um conjunto de valores \(\small (x_1, x_2, ..., x_n)\), tem-se a seguinte fórmula para o cálculo da média aritmética simples \(\small \bar {X}\) , onde n é o número de elementos que compõem a série de dados.
\[\bar {X} = \sum_{i=1}^n \frac {X_i} {n}\] Em R, a função mean(x, trim = 0, na.rm = FALSE, ...)calcula a média dos elementos do vetor x.
Opções:
trim é utilizado para excluir algumas observações em ambos os lados do vetor ordenado - representa a proporção dos dados que se deseja excluir.
se na.rm = TRUE, calcula a média considerando apenas os dados existentes, ignora os dados faltantes; se na.rm = FALSE, calcula a média apenas se todos os valores estiverem preenchidos, caso contrário retorna NA.
Utilizando o nosso caso, colaboradores, para se calcular a média aritmética da variável filho, tem-se:
length(df$filhos)
## [1] 36
summary(df$filhos)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 0.00 1.00 2.00 1.65 2.00 5.00 16
mean(df$filhos)
## [1] NA
mean(df$filhos, na.rm=TRUE)
## [1] 1.65
A mediana é o valor do meio em um conjunto de dados ordenado que tenha sido classificado partindo-se do menor para o maior. Metade dos valores são menores ou iguais a mediana e metade dos valores são maiores ou iguais. A mediana não é afetada por valores extremos.
Para um número ímpar de observações, a mediana será simplesmente o valor de ordem \(\small \frac {n+1} {2}\), para um número par de observações, e \(\small \frac {n}{2}\) para um número ímpar.
Em R, a função median(x)calcula a mediana dos elementos do vetor x.
median(df$salario, na.rm=TRUE)
## [1] 10.165
summary(df$salario)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 4.000 7.553 10.165 11.122 14.060 23.300
apply()A família de funções pertence ao pacote base do R e é composta de funções para manipular fatias de dados de matrizes, arrays, listas e dataframes de forma repetitiva. Essas funções permitem o cruzamento dos dados de várias maneiras e evitam o uso explícito de construções em loop. Eles agem em uma lista, matriz ou array e aplicam uma função com um ou vários argumentos opcionais.
A função tapply()é utilizada para aplicar um procedimento a diferentes partes dos dados dentro de um array, matriz ou data frame. Ela é muito útil quando queremos saber, por exemplo, a média de cada um dos tratamentos avaliados em um experimento.
A sintaxe básica da função é tapply(variável, fator, função).
tapply(df$salario,df$civil,summary)
## $casado
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 4.560 8.742 11.925 12.123 15.030 23.300
##
## $solteiro
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 4.000 7.258 9.045 9.871 11.693 18.750
tapply(df$salario,df$civil,mean)
## casado solteiro
## 12.123500 9.870625
A moda é o valor que tem maior número de ocorrências em um conjunto de dados. A série pode ser unimodal (uma única moda), amodal (não há moda) e multimodal (há duas ou mais modas).
Diferentemente da média e da mediana, a moda pode ser calculada para dados numéricos e de caracteres. o R não possui uma função padrão para calcular a moda, então criamos uma função de usuário para calcular a moda de um conjunto de dados. Esta função toma um vetor como entrada e fornece o valor da moda como saída.
# cria a função
getModa <- function(v) {
unique_v <- unique(na.omit(v))
unique_v[which.max(tabulate(match(v, unique_v)))]
}
# Calcula a moda
print(getModa(df$filhos))
## [1] 2
print(getModa(as.character(df$instrucao)))
## [1] "medio"
# outro maneira - informa a moda e o número casos repetidos
getModa2 <- function(v) {
f <- table(v)
subset(f, f == max(f))
}
print(getModa2(df$filhos))
## 2
## 7
print(getModa2(as.character(df$instrucao)))
## medio
## 18
O Quantil é um valor de uma distribuição onde nele, ou abaixo dele, se encontram um determinado percentual predeterminado dos valores observados, quando estes estiverem ordenados de forma crescente. De um modo geral, o percentil de ordem 100p é a separatriz que nele ou abaixo dele estão \(\small p \times 100\)% das observações com 0 < p < 1.
Cabe destacar que os percentis de ordem 25% (Q1), 50% (Q2 ou mediana) e 75% (Q3) são os mais utilizados nas análises estatísticas e são chamamos de quartis, o seja: os quartis dividem um conjunto de dados em quatro partes iguais – o primeiro quartil, Q1, divide valores que correspondem aos 25% mais baixos dos outros 75%, que são maiores do que eles. O segundo quartil, Q2, é a mediana - 50% dos valores são menores que a mediana e 50% maiores que a mediana. O terceiro quartil, Q3, divide a parcela correspondente ao 75% valores mais baixos dos outros 25% que são maiores. Quartis são importantes, inclusive, na detecção de valores atípicos (outliers), mediante a técnica conhecida por Boxplot (gráfico de caixa de bigodes, em Portugal).
\(Q_p = p \times \frac {n+1} {4}\), onde Q é o quartil, p é a ordem do quartil (1, 2 ou 3) e n é a quantidade de valores, ordenados em ordem crescente.
quantile(c(df$salario),0.25) # Q1
## 25%
## 7.5525
quantile(c(df$salario),0.50) # Q2 - a mediana
## 50%
## 10.165
quantile(c(df$salario),0.75) # Q3
## 75%
## 14.06
summary(df$salario)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 4.000 7.553 10.165 11.122 14.060 23.300
A Amplitude interquartil (também chamada de dispersão média) corresponde à diferença entre o terceiro e o primeiro quartil em um conjunto de dados.
A amplitude mede a dispersão nos dados que estão entre as 50% das observações centrais
quantile(c(df$salario), 0.75) - quantile(c(df$salario), 0.25)
## 75%
## 6.5075
summary(df$salario)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 4.000 7.553 10.165 11.122 14.060 23.300
14.060 - 7.553
## [1] 6.507
O gráfico boxplot proporciona uma representação gráfica para os dados com base no resumo dos cinco números (limite inferior, Q1, mediana, Q3 e limite superior). Outliers, se houver, estarão assinalados como pontos fora dos limites. Outliers são observações que não correspondem aos valores esperados de uma população ou amostra. Em geral, são valores que estão muito acima ou muito abaixo da maioria dos valores observados.
Os boxplots são criados em R usando a função boxplot(). A sintaxe básica é a seguinte:
boxplot(x, data, notch = FALSE, varwidth, names, main)
Onde:
x é um vetor ou uma formula.
data é o data frame.
notch é um valor lógico - TRUE para desenhar um entalhe. É útil para comparar medianas de mais de um conjunto.
varwidth é um valor lógico - TRUE para desenhar a largura da caixa proporcional ao tamanho da amostra.
names são os nomes que serão colocados abaixo de cada gráfico.
main é o título do gráfico.
boxplot(df$salario,
main = "Boxplot - Salário em R$ mil",
xlab = "Salário",
ylab = "Valores em R$ mil",
col = "orange",
border = "brown",
horizontal = FALSE
)
Vamos utilizar os dados mtcars do R para demonstrar o uso de fórmulas.
boxplot(mpg ~ cyl, data = mtcars,
xlab = "Número de cilindros",
ylab = "Milhas por galão",
main = "Consumo",
notch = TRUE,
varwidth = TRUE,
col = c("green", "yellow", "purple"),
names = c("Quatro", "Seis", "Oito")
)
Amplitude é uma medida descritiva numérica mais simples para a variação em um conjunto de dados.
\[A = X_{máximo} - X_{mínimo}\]
range(df$filhos, na.rm = T) # apresenta o mínimo e o máximo do vetor
## [1] 0 5
diff(range(df$filhos, na.rm = T)) # calcula a diferença
## [1] 5
A variância amostral (\(S^2\)) uma medida de variabilidade que se baseia nos desvios dos valores em torno da média e leva em conta, para o seu cálculo, todos os elementos do conjunto de dados. A ideia básica reside em trabalhar-se com uma média de todos os desvios em torno da média do conjunto, isto é, com uma média dos \((x_i-x̄)\). Porém, o fato conhecido de que a soma dos desvios de qualquer conjunto em torno de sua média é identicamente nula, isto é, \(\sum_{i=1}^n (x_i-x̄) = 0\), conduziu à alternativa de trabalhar-se com a soma dos quadrados dos desvios, ou seja, com \(\sum_{i=1}^n (x_i-x̄)^2 = 0\). Desta forma, para levar-se em conta o número de observações e se obter estimativas mais próximas à verdadeira variância da população (\(\sigma^2\)) da qual os dados são extraídos, usa-se a seguinte expressão para a variância:
\[S^2 = \frac {\sum_{i=1}^n (x_i-\bar{x})^2}{n-1}\] O denominador (n-1) é utilizado para tornar o estimador da variância não-enviesado.
Exemplo:
var(df$salario)
## [1] 21.04477
var(df$filhos)
## [1] NA
var(df$filhos, na.rm = TRUE)
## [1] 1.607895
O desvio-padrão (s) é a raiz quadrada da variância.
sd(df$filhos, na.rm=TRUE)
## [1] 1.268028
Trata-se de uma medida relativa de dispersão, útil para a comparação em termos relativos do grau de concentração em torno da média de séries distintas. É dado por:
\[cv = \frac {s}{\bar{x}}\]
cv.salario <- 100 * sd(df$salario) / mean(df$salario)
cv.salario
## [1] 41.24587
A assimetria (\(\gamma\)) é uma medida da distorção da distribuição de probabilidade de uma variável aleatória sobre sua média, ou seja, ela informa a quantidade e a direção da inclinação (partida de simetria horizontal).
O valor de assimetria pode ser positivo ou negativo ou ainda indefinido. Se for negativa, indica uma maior cauda à esquerda da média; se positiva, maior chance de ocorrerem valores distantes da média à direita.Podemos utilizar a seguinte regra prática:
Uma das fórmulas mais empregadas para o cálculo da assimetria é a seguinte:
\[\gamma = \frac {\frac 1 n \sum_{i=1} ^n (x_i- \bar x)^3}{\left[ \frac 1 {n-1} \sum_{i=1} ^n (x_i- \bar x)^2 \right] ^ {3/2} }\] No R há vários pacotes que calculam a assimetria. Por exemplo, o pacote e1071 apresenta a função skewness(x, na.rm = FALSE, type = 3) que calcula a assimetria utiizando a fórmula acima quando type = 3, o valor padrão.
Vejamos como se comportam os salários:
e1071::skewness(df$salario, na.rm = TRUE, type = 3)
## [1] 0.5997938
plot(density(df$salario),
main = 'Gráfico da densidade',
xlab = 'Salários',
ylab = 'Densidade')
No gráfico pode-se perceber uma fraca assimetria à direita, representando alguns altos salários distantes da média, o que é confirmado pelo valor da estatística (\(\gamma = 0.5997938\)). Dados salariais são, frequentemente, assimétricos desta maneira: vários funcionários em uma empresa ganham relativamente pouco, enquanto cada vez menos pessoas ganham altos salários.
A curtose é uma medida de forma que caracteriza o achatamento da curva da função de distribuição de probabilidade da variável. O valor da curtose de qualquer variável com a distribuição Normal é 3. A curtose pode ser de três tipos:
Vamos utilizar agora o pacote PerformanceAnalytics, que possui a função kurtosis(). A inclusão do parãmetro method = 'excess' computa o execesso de curtose em relação à Normal, utilizando o método dos momentos, de acordo com o seguinte modelo:
\[K = \frac 1 n \times \sum _{i=1} ^n \left( \frac {x_i - \bar x} {\sigma} \right) ^ 4 - 3\]
PerformanceAnalytics::kurtosis(df$salario, method = 'excess')
## [1] -0.1743247
Uma distribuição com um valor de curtose negativa indica que a distribuição tem caudas mais leves do que a distribuição normal. Aqui o valor é negativo, mas bastante pequeno, o que não indica um afastamento considerável da Normal.
A Covariância mede a força e o direcionamento de uma relação linear entre duas variáveis numéricas pareadas (algumas vezes chamados de dados bivariados). A existência de tal relação permite estudar o comportamento de uma delas em função da outra.
A covariância da amostra é:
\[cov(X,Y) = \frac {\sum_{i=1}^n (x_i-\bar{x})(y_i-\bar{y})}{n-1}\] A covariância tem dois inconvenientes:
depende da unidade de medida;
pode alcançar qualquer valor, o que dificulta a interpretação.
O coeficiente de correlação de Pearson, também conhecido como coeficiente de correlação produto-momento, mede a força relativa de uma relação linear entre duas variáveis numéricas. Os valores se limitam ao intervalo -1 ≤ \(\rho\) ≤ 1 onde \(\rho = -1\) representa uma correlação linear negativa perfeita. Se \(\rho = 1\) temos uma correlação linear positiva perfeita.
A correlação per si não consegue provar que existe um efeito de causalidade – ou seja: que a variação do valor tenha causado a variação em outra variável. Uma correlação forte pode será produzida simplesmente pelo acaso, pelo efeito de uma terceira variável não considerada no cálculo ou por uma relação de do tipo causa e efeito. A fórmula da correlação para a amostra é dada por:
\[\rho = \frac {cov(X,Y)}{\sigma_X \sigma_Y}\]
cov(df$ano, df$salario)
## [1] 11.23067
cor(df$ano, df$salario)
## [1] 0.3633622
Note que a interpretação da covariância dependerá de uma unidade de medida. O fato é a covariância indica que há uma relação linear positiva entre as variáveis, mas qual é a intensidade? A correlação explica.
Siga para o link