Prof. Responsável: Prof. Dr. Júlio Celso Borello Vargas
August 22, 2023
Para acompanhar a aula, instalar o R e o Rstudio aqui ou usar o R na nuvem aqui.
Será usado o banco de dados “PIETROBELLI_2020.csv”. Para usá-lo, coloque o arquivo na mesma pasta do projeto, ou, caso use o Posit.cloud, clique em “upload” e selecione o arquivo.
Serão utilizados os pacotes psych e ggplot2.
Use os comandos:
Ao coletar dados, receber pronto e/ou criar bancos de dados, procure saber o propósito, o interesse, a disponibilidade, a capacidade de processamento, o entendimento…
DICAS PARA COLETA DE DADOS:
Certifique-se de que os dados representem a população de interesse, quando for o caso.
Colete dados suficientes para proporcionar a precisão necessária.
Meça as variáveis com o máximo rigor e precisão possível.
Registre os dados na ordem em que são coletados.
Atentar para o tipo dos dados/variáveis coletados (Aleatórias? Com desenho experimental?)
Numa tabela, o convencional é que cada coluna seja um CAMPO, que representa um ATRIBUTO (valor, quantidade, característica, medida, etc.) dos OBJETOS (casos, indivíduos, etc.) que estão nas linhas.
Esse atributos são (devem ser) VARIÁVEIS, pois devem justamente variar, ter valores diferentes para cada objeto.
Quase sempre essas variáveis são NUMÉRICAS e podem ser basicamente de dois tipos:
CONTÍNUAS - números “com vírgula”, variando em “pequenos passos” quase imperceptíveis;
DISCRETAS
CONTAGENS - números inteiros representando quantidades;
ORDINAIS - números inteiros representando classes/hierarquias em ordem. Por exemplo, 1 = rodovia, 2 = arterial, 3 = coletora, etc.
Quando as variáveis são TEXTO, sempre serão DISCRETAS do tipo CATEGÓRICA (nomes, lugares, tipos), podendo ou não representar classes ou grupos.
É possível, claro, transformar variáveis, geralmente passando de NUMÉRICA para CATEGÓRICA (criar grupos ou classes).
É conveniente usar a função “attach(pietrobelli)”, que tira a necessidade de digitar o nome do banco a cada vez que usarmos uma de suas variáveis.
#Lendo o csv
pietrobelli = read.csv2("PIETROBELLI_2020.csv")
#Separando apenas as últimas 6 linhas do csv
dados_frac = tail(pietrobelli)
#Transformando a variável continente em fatores
transforma_fator = as.factor(pietrobelli$id_cont)
levels(transforma_fator)## [1] "America do Norte" "America Latina" "Asia" "Europa"
## [5] "Oceania"
## [1] 4 4 4 4 4 4 1 4 4 3 4 4 2 4 3 5 1 4 4 4 2 4 2 2 2 2 1 2 4 4 1 5 5 2 3 2 3 1
## [39] 2 4 3 2 3 4 3 3
Fazemos isso muito comumente no SIG, simbolizando variáveis numéricas contínuas em classes (“cortes” ou breaks).
Nos softwares de estatística existem ferramentas para isso.
Por exemplo, o banco de dados “PIETROBELLI_2020” mostra as variáveis ““id_hemisf” ” e “DE_N_fert_rate”, que são categórica e contínua, respectivamente.
| id_name | id_country | id_cont | id_cont_CHINA | id_hemisf | DE_N_fert_rate | |
|---|---|---|---|---|---|---|
| 41 | Jakarta | Indonesia | Asia | Asia | Sul | 2.4 |
| 42 | Sao Paulo | Brasil | America Latina | America Latina | Sul | 1.8 |
| 43 | Shenzhen | China | Asia | China | Norte | 1.6 |
| 44 | Moscow | Russia | Europa | Europa | Norte | 1.7 |
| 45 | Guangzhou | China | Asia | China | Norte | 1.6 |
| 46 | Shanghai | China | Asia | China | Norte | 1.6 |
O primeiro passo após receber/criar um banco de dados (tabela, CSV, XLS, etc.) é DESCREVÊ-LO, para entender e para pensar que tipo de ferramenta de análise/modelo poderemos/deveremos usar.
As ESTATÍSTICAS DESCRITIVAS servem para isso.
Para variáveis do tipo NUMÉRICO, as estatísticas são geralmente as seguintes:
1.Medidas de CENTRO (ou TENDÊNCIA CENTRAL):
Média
Mediana
Moda
2.Medidas de VARIAÇÃO:
Amplitude
Mínimo / Máximo
Desvio-padrão
Variância / Coeficiente de variação
Quantis (quartis, quintis, decis…)
#Estatísticas descritivas da variável índice de fertilidade
descritivas <- describe(pietrobelli$DE_N_fert_rate)
kable(descritivas[,2:10], row.names = F)| n | mean | sd | median | trimmed | mad | min | max | range |
|---|---|---|---|---|---|---|---|---|
| 46 | 1.832609 | 0.4253387 | 1.8 | 1.789474 | 0.29652 | 1.2 | 3 | 1.8 |
ESTATÍSTICAS DESCRITIVAS (“univariadas”)
Dois GRÁFICOS são usados geralmente para essa descrição de variáveis NUMÉRICAS:
A função ggplot tem uma sintaxe um pouco diferente. O padrão é iniciar com os parâmetros “data” e “aes”, depois digitamos “+” para acrescentar as demais funções que darão os detalhes do gráfico. “geom_histogram” e “geom_density” dizem o tipo de gráfico, enquanto “theme” e “labs” adicionam os textos.
ggplot(data=pietrobelli, aes(x=SE_N_Educ_gdp_share)) +
geom_histogram(aes(y = ..density..), color = "gray1", fill = "steelblue", binwidth = 0.004) + geom_density(fill = "red", alpha = 0.3) +
theme(plot.title = element_text(hjust = 0.5), plot.subtitle = element_text(hjust = 0.5)) +
labs(x = 'Proporções do PIB', y = 'Propabilidade (%)', title = 'Histograma - Cidades cujo país gasta determinada proporção do PIB em educação')OBS: Podemos rodar as descritivas POR “GRUPOS”, escolhendo uma variável categórica (ou numérica discreta com poucos valores que indicam classes, ordem, hierarquia…)
Repetindo a lógica do código anterior, mas com a função “stat_summary” para definir onde está a média.
ggplot(data = pietrobelli, aes(x = id_hemisf, y = DE_N_lifeexpc_fem)) + geom_boxplot(fill = "springgreen3") +
stat_summary(fun = 'mean', geom = "point", shape = 9, size = 4, color = 'white') + geom_point() + labs(x = 'Hemisférios', y = 'Expectativa de vida feminina (anos)', title = 'Boxplot') +
theme(plot.title = element_text(hjust = 0.5))Geralmente fazemos também dois TESTES (“paramétricos”) para entender a distribuição de dados NUMÉRICOS:
Os pontos de dados ficam relativamente próximos à linha de distribuição normal ajustada. O valor de p é maior do que o nível de significância de 0,05.
Portanto, o cientista não rejeita a hipótese nula de que os dados seguem uma distribuição normal.
TRADUZINDO: podemos dizer com 95% de certeza que a distribuição é normal. Ou que a probabilidade de essa inferência estar errada é menor do que 5%.
O teste Shapiro-Wilk é comumente usado para atestar a normalidade dos dados, por exemplo. No caso abaixo, não podemos rejeitar a hipótese nula a um nível de significância \(\alpha = 0,05\), que supõe a normalidade na distribuição dos dados, pois o p-valor > \(0,05\).
##
## Shapiro-Wilk normality test
##
## data: pietrobelli$SE_N_Educ_gdp_share
## W = 0.96158, p-value = 0.1321
Como o valor de p é menor do que o nível de significância de 0,05, a decisão é rejeitar a hipótese nula e concluir que existe um outlier.
TRADUZINDO: Um nível de significância de 0,05 indica um risco de 5% de se concluir que existe um outlier quando não existe um outlier real.
Nesse gráfico, conforme os pontos se afastam da linha tracejada, interpretamo-lo como um possível outlier. O eixo \(y\) representa os quantis da distribuição da amostra e o \(x\) representa os quantis de uma distribuição normal teórica.
qqnorm(pietrobelli$SE_N_Educ_gdp_share, main = "Q-Q Plot")
qqline(pietrobelli$SE_N_Educ_gdp_share, col = "red", lty = 2)TESTE DE NORMALIDADE…
E se os dados não forem normais?????
Existem muitas variáveis com distribuições ASSIMÉTRICAS, é claro, com histogramas inclinados para um lado ou outro, diferentemente do “sino” gaussiano.
Podemos, obviamente, “normalizá-los”, buscando aproximar a forma ao sino (e operar com as técnicas que exigem normalidade), geralmente aplicando logaritmo (cuidado com valores zero ou negativos!), raiz quadrada, cúbica ou quarta.
Já a PADRONIZAÇÃO de dados é quase a mesma coisa, mas pode ser aplicada em distribuições normais para botar as variáveis em uma mesma ORDEM DE GRANDEZA, por exemplo, entre ZERO e UM.
1.Subtrair a média e dividir pelo desvio padrão = ESCORE-Z. Centraliza os dados e altera as unidades para os desvios-padrão. Na prática vai resultar em média igual a 0 e desvio-padrão igual a 1.
2.Subtrair a média. Centraliza os dados.
3.Dividir pelo desvio padrão: Padroniza a escala para cada variável que você especificar.
4.Subtrair um primeiro parâmetro e, em seguida, dividir por um segundo: Usar outros valores de média e desvio padrão que não os da distribuição a variável.
5.Criação de amplitude do início ao fim: Transforma os dados de forma linear, de modo que os dados resultantes tenham o primeiro valor que você especificar como mínimo, e o segundo valor que você especificar como máximo.
#Subtrair o valor da média de cada valor do vetor e dividir pelo desvio-padrão
z = (pietrobelli$DE_N_avg_age - mean(pietrobelli$DE_N_avg_age)) / sd(pietrobelli$DE_N_avg_age)
round(z, 3)## [1] 1.334 0.913 0.526 0.913 0.421 0.298 0.035 0.632 1.615 -1.335
## [11] 1.334 0.913 -0.808 1.615 -1.335 -0.018 0.035 1.194 0.913 0.632
## [21] -1.791 0.737 -1.194 -0.808 -1.791 -1.194 0.526 -1.159 1.194 1.334
## [31] 0.035 -0.035 -0.035 -0.492 0.719 -1.194 -1.703 0.035 -1.563 0.421
## [41] -1.475 -0.808 0.052 0.263 0.052 0.052
Em casos de amostras pequenas (grosseiramente ABAIXO DE 30 CASOS), os testes não-paramétricos funcionam bem, pois trabalham com a MEDIANA ao invés da média.
Eles não exigem distribuição normal, mas as duas (ou mais) amostras ou grupos ou variáveis a serem comparadas têm de ter distribuição parecida, SEM OUTLIERS.
Também funcionam bem para amostras grandes não-normais, atendendo a essa exigência.
Para variáveis do tipo CATEGÓRICO (ou numéricas ordinais/classes) as descritivas são geralmente as seguintes:
OBS: Podemos rodar essas contagens POR “GRUPOS”, escolhendo outra variável categórica (ou numérica discreta com poucos valores que indicam classes, ordem, hierarquia…)
A variável “frequencia” recebe um ‘data.frame’ com as frequências dos tipos de governo em cada continente. A partir de “frequencia”, usamos o ggplot.
frequencia = as.data.frame(table(pietrobelli$PC_N_Gov_type1, pietrobelli$id_cont))
names(frequencia)[2] = 'Continentes'
ggplot(data=frequencia, aes(x=Var1, y=Freq, fill=Continentes)) + geom_bar(stat="identity", position = "dodge") + labs(x = 'Tipos de governo', y = 'Frequência', title = 'Frequência de continentes cujos países são Monarquias ou Repúblicas') + theme(plot.title = element_text(hjust = 0.5), plot.subtitle = element_text(hjust = 0.5))E os GRÁFICOS geralmente usados para essa descrição são:
Gráfico de barras
Gráfico de setores (“pizza”)
A variável “frequencia2” recebe um ‘data.frame’ com as frequências dos tipos de governo. A partir de “frequencia2”, usamos o ggplot. Nesse caso, para uma melhor visualização, foram retirados os eixos do plano cartesiano em “theme” e incluída uma legenda com “geom_text”.
frequencia2 = as.data.frame(table(pietrobelli$PC_N_Gov_type_FINAL))
names(frequencia2)[1] = 'Governo'
ggplot(data=frequencia2, aes(x='',y=Freq, fill=Governo)) + geom_col(color='black') + coord_polar("y") + theme(axis.ticks = element_blank(), axis.title.x = element_blank(), axis.title.y = element_blank(), panel.border = element_blank()) + geom_text(aes(label=Freq), position = position_stack(vjust = 0.5)) + theme_void() + labs(title = 'Frequência de tipos de governo') + theme(plot.title = element_text(hjust = 0.5), plot.subtitle = element_text(hjust = 0.5))Já os TESTES mais usados para entender a “distribuição” de dados CATEGÓRICOS são
Compara as contagens em cada categoria/grupo/classe com contagens ESPERADAS (“sexo”, por exemplo)
Compara as contagens para determinar se duas variáveis categóricas estão associados. Isto é, para determinar se a distribuição de observações de uma variável varia dependendo da categoria da segunda variável.
Teste com duas variáveis categóricas a partir de uma tabela de frequências, explorada no gráfico de frequências
A função “chisq.test” retorna o valor da estatística de teste \(\chi^2\), os graus de liberdade e o p-valor.
##
## Pearson's Chi-squared test
##
## data: table(pietrobelli$PC_N_Gov_type1, pietrobelli$id_cont)
## X-squared = 18.69, df = 4, p-value = 0.0009041
No exemplo acima, como o p-valor é muito abaixo de um nível de significância de \(\alpha = 0,05\) podemos rejeitar a hipótese nula \(H_{0}\), que afirma que as variáveis são independentes, então podemos afirmar que há uma associação entre elas.