Tópico Especial – INTRODUÇÃO À ESTATÍSTICA PARA ESTUDOS URBANOS

Aula 1

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.

Caption for the picture.

Serão utilizados os pacotes psych e ggplot2.

Use os comandos:

#install.packages('psych')
#install.packages('ggplot2')

library(psych)
library(ggplot2)

Coleta de dados

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:

Tipos de variáveis

Quase sempre essas variáveis são NUMÉRICAS e podem ser basicamente de dois tipos:

  1. CONTÍNUAS - números “com vírgula”, variando em “pequenos passos” quase imperceptíveis;

  2. DISCRETAS

  1. CONTAGENS - números inteiros representando quantidades;

  2. 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"
#Transformando cada fator em um número
transforma_int = as.numeric(transforma_fator)
transforma_int
##  [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

Estatística descritiva

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

2.Medidas de VARIAÇÃO:

#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

Gráficos

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

teste_shapiro = shapiro.test(pietrobelli$SE_N_Educ_gdp_share)
teste_shapiro
## 
##  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.

Variáveis categóricas

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:

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.

teste_chi = chisq.test(table(pietrobelli$PC_N_Gov_type1, pietrobelli$id_cont))
teste_chi
## 
##  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.