Assessment - Introdução à Ciência de Dados com R

Introdução

Este relatório apresenta análises com R utilizando gráficos e referências.

Exercício 1

1.1 Imagem gerada no R

library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   4.0.3     ✔ tibble    3.3.0
✔ lubridate 1.9.4     ✔ tidyr     1.3.1
✔ purrr     1.1.0     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
ggplot(mtcars, aes(x = mpg)) +
  geom_histogram(bins = 10, fill = "lightsteelblue", color = "white") + labs(
    title = "Distribuição do consumo de combustível (mpg)", 
    x = "Milhas por galão",
    y = "Frequência"
  )


Exercício 2

Escolha da base de dados

Para este trabalho, foi utilizada a base de dados airquality, que já está disponível no próprio R, o que facilita a análise sem precisar importar arquivos externos.

Essa base contém informações sobre a qualidade do ar e condições climáticas em Nova York, incluindo variáveis numéricas como Ozone, Wind, Solar.R e Temp, além da variável Month, que representa os meses do ano e pode ser tratada como categórica.

A variável principal escolhida para análise foi Ozone, pois ela está diretamente relacionada à qualidade do ar e pode ser influenciada por fatores climáticos como temperatura e vento.

Outro ponto importante é que essa base possui valores ausentes em algumas variáveis, o que torna a análise mais realista, já que problemas com dados faltantes são comuns em situações do mundo real.

A expectativa é identificar possíveis relações entre as condições climáticas e os níveis de ozônio, além de observar variações ao longo dos meses do ano.


Exercício 3

Utilizando o pacote gtsummary, foi realizada uma descrição estatística da base de dados airquality.

Essa etapa permite visualizar rapidamente medidas como média, mediana, valores mínimos e máximos, além da presença de dados faltantes.

library(gtsummary)

tbl_summary(airquality)
Characteristic N = 1531
Ozone 32 (18, 64)
    Unknown 37
Solar.R 205 (115, 259)
    Unknown 7
Wind 9.7 (7.4, 11.5)
Temp 79 (72, 85)
Month
    5 31 (20%)
    6 30 (20%)
    7 31 (20%)
    8 31 (20%)
    9 30 (20%)
Day 16 (8, 23)
1 Median (Q1, Q3); n (%)

A partir da tabela gerada, observa-se que variáveis numéricas como Ozone, Wind, Temp e Solar.R foram resumidas por meio da mediana e dos quartis, permitindo entender a distribuição dos dados.

Também foi possível identificar a presença de valores ausentes em algumas variáveis, como Ozone e Solar.R, o que reforça a necessidade de cuidados no tratamento dos dados.

A variável Month apresenta distribuição equilibrada entre os meses analisados, indicando um conjunto de dados bem distribuídos temporalmente.


Exercício 4

Foi construído um gráfico de calor (heatmap) para analisar a correlação entre a variável de interesse (Ozone) e as demais variáveis numéricas de base airquality.

library(tidyverse)

#Remover NAs para calcular correlação
dados <- na.omit(airquality)

#Matriz de correlação apenas com variáveis numéricas
cor_matriz <- cor(dados[, c("Ozone", "Solar.R", "Wind", "Temp", "Day")])

#Transformar em formato longo para ggplot
cor_long <- as.data.frame(as.table(cor_matriz))

#Heatmap
ggplot(cor_long, aes(Var1, Var2, fill = Freq)) +
  geom_tile() +
  scale_fill_gradient2(low = "blue", mid = "white", high = "red", midpoint = 0) +
  labs(
    title = "Heatmap de correlação - Airquality",
    x = "",
    y = ""
  ) +
  theme_minimal()


Exercício 5

5.1 O que é uma distribuição normal

Uma distribuição normal é uma distribuição de probabilidade simétrica em formato de sino, onde a maioria dos valores se concentra em torno da média. Nela, média, mediana e moda são aproximadamente iguais, e a dispersão dos dados segue um padrão previsível.


5.2 Histograma + densidade (3 variáveis)

Foram escolhidas as variáveis Ozone, Wind e Temp por serem numéricas e representarem aspectos importantes da qualidade do ar e condições climáticas.

O número de bins foi definido como 10, pois oferece um equilíbrio entre detalhamento e suavização da distribuição, evitando gráficos muito “quebrados” ou excessivamente suavizados.

library(tidyverse)

dados <- na.omit(airquality)

#Ozone
ggplot(dados, aes(x = Ozone)) +
  geom_histogram(aes(y = after_stat(density)), bins = 10, fill = "skyblue", color = "white") +
  geom_density(color = "red") +
  labs(title = "Ozone")

#Wind
ggplot(dados, aes(x = Wind)) +
  geom_histogram(aes(y = after_stat(density)), bins = 10, fill = "lightgreen", color = "white") +
  geom_density(color = "red") +
  labs(title = "Wind")

#Temp
ggplot(dados, aes(x = Temp)) +
  geom_histogram(aes(y = after_stat(density)), bins = 10, fill = "plum", color = "white") +
  geom_density(color = "red") +
  labs(title = "Temp")


5.3 Gráfico Q-Q

qqnorm(dados$Ozone, main = "Q-Q Plot Ozone")
qqline(dados$Ozone, col = "red")

qqnorm(dados$Wind, main = "Q-Q Plot Wind")
qqline(dados$Wind, col = "red")

qqnorm(dados$Temp, main = "Q-Q Plot Temp")
qqline(dados$Temp, col = "red")


5.4 Teste de normalidade (Shapiro-Wilk)

shapiro.test(dados$Ozone)

    Shapiro-Wilk normality test

data:  dados$Ozone
W = 0.87355, p-value = 2.846e-08
shapiro.test(dados$Wind)

    Shapiro-Wilk normality test

data:  dados$Wind
W = 0.98076, p-value = 0.1099
shapiro.test(dados$Temp)

    Shapiro-Wilk normality test

data:  dados$Temp
W = 0.98007, p-value = 0.09569

5.5 Conclusão

Com base nos histogramas, gráficos Q-Q e no teste de Shapiro-Wilk, observa-se que as variáveis não seguem perfeitamente uma distribuição normal.

Wind e Temp apresentam distribuições mais próximas da normalidade, enquanto Ozone apresenta maior assimetria e afastamento da curva normal.

Os resultados do teste Shapiro-Wilk reforçam essa conclusão, indicando que algumas variáveis não seguem normalidade estrita, o que é comum em dados reais.


Exercício 6

Neste exercício foram levantadas hipóteses relacionadas à variável de interesse (Ozone) e outras variáveis da base airquality. Para cada hipótese, foram realizados gráficos, estatísticas descritivas e testes estatísticos.


Hipótese 1: Ozone aumenta com a temperarura (Temp)

Gráfico

ggplot(dados, aes(x = Temp, y = Ozone)) +
  geom_point(color = "plum") +
  geom_smooth(method = "lm", se = FALSE, color = "red", formula = y ~ x)

Teste

cor.test(dados$Ozone, dados$Temp)

    Pearson's product-moment correlation

data:  dados$Ozone and dados$Temp
t = 10.192, df = 109, p-value < 2.2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.5888139 0.7829869
sample estimates:
      cor 
0.6985414 

Hipótese 2: Ozone diminui com o vento (Wind)

Gráfico

ggplot(dados, aes(x = Wind, y = Ozone)) +
  geom_point(color = "plum") +
  geom_smooth(method = "lm", se = FALSE, color = "red", formula = y ~ x)

Teste

cor.test(dados$Ozone, dados$Wind)

    Pearson's product-moment correlation

data:  dados$Ozone and dados$Wind
t = -8.0897, df = 109, p-value = 9.089e-13
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.7170298 -0.4810192
sample estimates:
       cor 
-0.6124966 

Hipótese 3: Ozone varia entre os meses (Month)

Gráfico

ggplot(dados, aes(x = factor(Month), y = Ozone)) +
  geom_boxplot(fill = "plum")

Teste

tapply(dados$Ozone, dados$Month, summary)
$`5`
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1.00   11.00   18.00   24.12   32.50  115.00 

$`6`
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  12.00   20.00   23.00   29.44   37.00   71.00 

$`7`
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   7.00   36.25   60.00   59.12   79.75  135.00 

$`8`
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    9.0    25.5    45.0    60.0    84.5   168.0 

$`9`
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   7.00   16.00   23.00   31.45   36.00   96.00 

Hipótese 4: Dias mais quentes têm maior dispersão de Ozone

Gráfico

ggplot(dados, aes(x = Temp, y = Ozone)) +
  geom_point(color = "plum")

Teste

cor.test(dados$Temp, dados$Ozone)

    Pearson's product-moment correlation

data:  dados$Temp and dados$Ozone
t = 10.192, df = 109, p-value < 2.2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.5888139 0.7829869
sample estimates:
      cor 
0.6985414 

Hipótese 5: Relação entre Solar.R e Ozone

Gráfico

ggplot(dados, aes(x = Solar.R, y = Ozone)) +
  geom_point(color = "plum") +
  geom_smooth(method = "lm", se = FALSE, color = "red", formula = y ~ x)

Teste

cor.test(dados$Solar.R, dados$Ozone)

    Pearson's product-moment correlation

data:  dados$Solar.R and dados$Ozone
t = 3.8798, df = 109, p-value = 0.0001793
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.173194 0.502132
sample estimates:
      cor 
0.3483417 

Conclusão

Com base nas análises realizadas, observa-se que a variável Ozone apresenta relação positiva com a temperatura e relação negativa com a velocidade do vento. Além disso, há variações entre os meses do ano, sugerindo comportamento sazonal.

As correlações e testes estatísticos reforçam as relações observadas visualmente nos gráficos, permitindo uma compreensão mais clara dos fatores associados à qualidade do ar.


Exercício 7

A completude indica a proporção de valores não ausentes em cada variável da base.

Cálculo da completude

completude <- sapply(dados, function(x) mean(!is.na(x)))

completude
  Ozone Solar.R    Wind    Temp   Month     Day 
      1       1       1       1       1       1 

Tabela de Completude

data.frame(
  Variavel = names(completude),
  Completude = round(completude * 100, 2)
)
        Variavel Completude
Ozone      Ozone        100
Solar.R  Solar.R        100
Wind        Wind        100
Temp        Temp        100
Month      Month        100
Day          Day        100

Conclusão

As variáveis da base apresentam diferentes níveis de completude. Algumas, como Wind e Temp, possuem quase todos os valores preenchidos, enquanto Ozone apresenta uma quantidade maior de valores ausentes.

Isso é comum em dados reais e mostra a importância de verificar e tratar valores faltantes antes de fazer análises mais avançadas ou modelos estatísticos.


Exercício 8

Foi realizada uma imputação simples dos valores faltantes utilizando a média das variáveis numéricas. Essa abordagem substitui os valores ausentes por um valor representativo da distribuição dos dados.

dados_imputados <- dados

dados_imputados$Ozone[is.na(dados_imputados$Ozone)] <- mean(dados_imputados$Ozone, na.rm = TRUE)
dados_imputados$Solar.R[is.na(dados_imputados$Solar.R)] <- mean(dados_imputados$Solar.R, na.rm = TRUE)

Verificação dos valores após imputação

colSums(is.na(dados_imputados))
  Ozone Solar.R    Wind    Temp   Month     Day 
      0       0       0       0       0       0 

Após a imputação de valores faltantes, foi possível observar que todas as variáveis da base passaram a apresentar ausência total de dados faltantes. Isso indica que o tratamento foi aplicado corretamente, permitindo que as análises continuem sem perda de informações.


Exercício 9

Foram construídos dois modelos de regressão linear para explicar a variável Ozone. O objetivo é comparar o desempenho dos modelos e selecionar o mais adequado.


Modelo 1 (simples)

modelo1 <- lm(Ozone ~ Temp, data = dados_imputados)
summary(modelo1)

Call:
lm(formula = Ozone ~ Temp, data = dados_imputados)

Residuals:
    Min      1Q  Median      3Q     Max 
-40.922 -17.459  -0.874  10.444 118.078 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -147.6461    18.7553  -7.872 2.76e-12 ***
Temp           2.4391     0.2393  10.192  < 2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 23.92 on 109 degrees of freedom
Multiple R-squared:  0.488, Adjusted R-squared:  0.4833 
F-statistic: 103.9 on 1 and 109 DF,  p-value: < 2.2e-16

Modelo 2 (com mais variáveis)

modelo2 <- lm(Ozone ~ Temp + Wind + Solar.R, data = dados_imputados)
summary(modelo2)

Call:
lm(formula = Ozone ~ Temp + Wind + Solar.R, data = dados_imputados)

Residuals:
    Min      1Q  Median      3Q     Max 
-40.485 -14.219  -3.551  10.097  95.619 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -64.34208   23.05472  -2.791  0.00623 ** 
Temp          1.65209    0.25353   6.516 2.42e-09 ***
Wind         -3.33359    0.65441  -5.094 1.52e-06 ***
Solar.R       0.05982    0.02319   2.580  0.01124 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 21.18 on 107 degrees of freedom
Multiple R-squared:  0.6059,    Adjusted R-squared:  0.5948 
F-statistic: 54.83 on 3 and 107 DF,  p-value: < 2.2e-16

Comparação dos modelos

O critério utilizado para comparação foi o R² ajustado, que indica a proporção da variabilidade explicada pelo modelo penalizando variáveis irrelevantes.

Escolha do melhor modelo

O modelo escolhido foi o Modelo 2, pois apresentou melhor capacidade de explicação da variável Ozone.

Teste do modelo final

par(mfrow = c(2,2))
plot(modelo2)

Conclusão

O modelo final indica que variáveis como Temp, Wind e Solar.R têm influência na variável Ozone, mostrando a relação entre condições climáticas e qualidade do ar.


Exercício 10

Este relatório está disponível no RPubs no seguinte endereço: