Projeto da Disciplina

Author

Rodrigo Lunardelli

Published

March 12, 2026

Projeto da disciplina de Estatística para Cientistas de Dados

2 e 3. Base de dados

A base de dados escolhida foi a Air_Quality_Benchmark_dataset que contem dados de qualidade do ar em série temporal, com informações contextuais categóricas (tempo e condições meteorológicas). E váriáveis numéricas como temperatura, pressão, humidade, velocidade do vento e poluição do ar (PM)

Ela foi escolhida pois tenho formação em Geografia e estagiei em um laboratório de climatologia geografica, sendo este tema um dos varios que tive acesso durante essa fase. O estudo do clima e do tempo exigem grande volume de dados e análises, o que torna esse tipo de base de dados adequado para exploração e aplicação de técnicas de análises de dados. Eu escolhi trabalhar com as variáveis humidity, temp, wind_speed e pressure pois sei que na literatura há uma correlação entre algumas delas e eu espero demonstrar através dos gráficos como funciona essa dinamica climatica.

4. Carregando os dados

library(readr)
library(dplyr)
Warning: pacote 'dplyr' foi compilado no R versão 4.5.2

Anexando pacote: 'dplyr'
Os seguintes objetos são mascarados por 'package:stats':

    filter, lag
Os seguintes objetos são mascarados por 'package:base':

    intersect, setdiff, setequal, union
df <- read_csv("~/MBA - Data Science/5.Estatistica para data science/PD/Air Quality Benchmark dataset.csv")
Rows: 1230693 Columns: 14
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr  (8): boxName, Time of Day, Peak/NoPeak, Day, Week Day, Weather, Weather...
dbl  (5): PM 2.5, temp, pressure, humidity, wind_speed
dttm (1): Time_stamp

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
glimpse(df)
Rows: 1,230,693
Columns: 14
$ Time_stamp            <dttm> 2018-12-31 18:30:12, 2018-12-31 18:32:41, 2018-…
$ boxName               <chr> "iGude", "iGude", "iGude", "iGude", "iGude", "iG…
$ `PM 2.5`              <dbl> 18.20, 19.27, 18.57, 17.85, 25.95, 27.60, 27.87,…
$ temp                  <dbl> 7.71, 7.71, 7.71, 7.71, 7.71, 7.71, 7.71, 7.71, …
$ pressure              <dbl> 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, …
$ humidity              <dbl> 100, 100, 100, 100, 100, 100, 100, 100, 100, 100…
$ wind_speed            <dbl> 3.09, 3.09, 3.09, 3.09, 3.09, 3.09, 3.09, 3.09, …
$ `Time of Day`         <chr> "Evening_Hours", "Evening_Hours", "Evening_Hours…
$ `Peak/NoPeak`         <chr> "Peak", "Peak", "Peak", "Peak", "Peak", "Peak", …
$ Day                   <chr> "Monday", "Monday", "Monday", "Monday", "Monday"…
$ `Week Day`            <chr> "Workday", "Workday", "Workday", "Workday", "Wor…
$ Weather               <chr> "Clouds", "Clouds", "Clouds", "Clouds", "Clouds"…
$ `Weather Description` <chr> "broken clouds", "broken clouds", "broken clouds…
$ label                 <chr> "normal", "normal", "normal", "normal", "normal"…

Selecionando as colunas de interese

df_col <- df %>% 
  select(temp, pressure, humidity, wind_speed) %>% 
  rename(
    temperatura = temp,
    pressao = pressure,
    humidade = humidity,
    velocidade_vento = wind_speed
  )
df_col
# A tibble: 1,230,693 × 4
   temperatura pressao humidade velocidade_vento
         <dbl>   <dbl>    <dbl>            <dbl>
 1        7.71    1032      100             3.09
 2        7.71    1032      100             3.09
 3        7.71    1032      100             3.09
 4        7.71    1032      100             3.09
 5        7.71    1032      100             3.09
 6        7.71    1032      100             3.09
 7        7.71    1032      100             3.09
 8        7.71    1032      100             3.09
 9        7.71    1032      100             3.09
10        7.71    1032      100             3.09
# ℹ 1,230,683 more rows

5. Carregando os Pacotes

library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.5.2     ✔ 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
library(ggplot2)
library(skimr)
Warning: pacote 'skimr' foi compilado no R versão 4.5.2
library(gt)
Warning: pacote 'gt' foi compilado no R versão 4.5.2
library(ggthemes)
library(gtsummary)
Warning: pacote 'gtsummary' foi compilado no R versão 4.5.2
library(summarytools)
Warning: pacote 'summarytools' foi compilado no R versão 4.5.2

Anexando pacote: 'summarytools'

O seguinte objeto é mascarado por 'package:tibble':

    view
library(corrplot)
corrplot 0.95 loaded
library(GGally)

6. Justificativa para os pacotes

Alguns pacotes adicionais foram carregados pois facilitam o trabalho de análise de dados como o summarytools que produz uma tabela contendo as médias, medianas e quartis, além de fazer um histograma para cada variável. GGally que faz as correlações entre as variáveis e traz um gráfico de dispersão. O pacote corrplot que faz a matriz de correlação gráfica. Outros pacotes adicionais foram carregados, mas não necessariamente serão usados nesta análise.

7. Construindo uma função

fun_qqplot <- function(dados, var){
  var_enquo <- rlang::enquo(var)
  
  p1 <- df_col %>% 
    ggplot(aes(sample = !!var_enquo)) +
    stat_qq(size = 1.2, alpha = 0.4) +
    stat_qq_line(color = "red", linewidth = 1) +
    theme_minimal() +
    labs(
      x = "Quantis teóricos (normais)",
      y = "Quantis amostrais",
      title = paste("QQ plot -", rlang::as_name(var_enquo))
    )
  p1
}

Aplicando a função para as variáveis:

fun_qqplot(df_col, humidade)

O QQ plot da variável humidity mostra que a parte central da distribuição apresenta comportamento próximo da normalidade. Entretanto, nas extremidades observa-se um afastamento da linha teórica, especialmente próximo ao valor máximo da variável. Esse comportamento pode ser explicado pelo fato de que a umidade relativa do ar possui limites naturais entre 0% e 100%, o que impede uma distribuição perfeitamente normal.

fun_qqplot(df_col, temperatura) 

O QQ plot da variável temperatura mostra que a parte central da distribuição apresenta comportamento próximo ao de uma distribuição normal. Entretanto, nas extremidades observa-se um afastamento da linha teórica, indicando menor presença de valores extremos do que seria esperado em uma distribuição normal. Esse comportamento pode estar associado aos limites naturais da temperatura registrados no conjunto de dados.

fun_qqplot(df_col, velocidade_vento)

O QQ plot da variável velocidade_vento mostra que a parte central da distribuição apresenta comportamento próximo ao de uma distribuição normal. Entretanto, nas extremidades observa-se um afastamento da linha teórica, indicando menor presença de valores extremos do que seria esperado em uma distribuição normal.

fun_qqplot(df_col, pressao)

O QQ plot da variável pressão mostra que a distribuição apresenta comportamento próximo ao de uma distribuição normal. Uma explicação para este fator é que a pressão tem variações muito mais suaves que as outras variáveis e tende a mudar mais lentamente.

8 e 9. Calculando a média, desvio padrão e quantis.

Para realizar os calculos poderiamos usar as funções quantile(), max(), min(), mean() entre outras, mas para expandirmos mais os conhecimentos sobre os pacotes do R e minimizar o trabalho vou usar o pacote summarytools com a função descr() para gerar uma tabela com essas informações para todos os meus dados.

descr(df_col)
Descriptive Statistics  
df_col  
N: 1230693  

                      humidade      pressao   temperatura   velocidade_vento
----------------- ------------ ------------ ------------- ------------------
             Mean        75.33      1015.27          9.81               3.78
          Std.Dev        18.76        10.68          7.73               2.31
              Min        14.00       976.00         -8.91               0.31
               Q1        65.00      1009.00          4.14               2.10
           Median        80.00      1015.00          8.20               3.60
               Q3        92.00      1022.00         14.69               5.10
              Max       100.00      1046.00         39.28              17.50
              MAD        19.27        10.38          7.21               2.22
              IQR        27.00        13.00         10.55               3.00
               CV         0.25         0.01          0.79               0.61
         Skewness        -0.80        -0.13          0.74               1.13
      SE.Skewness         0.00         0.00          0.00               0.00
         Kurtosis        -0.07         0.29          0.17               2.06
          N.Valid   1230693.00   1230693.00    1230693.00         1230693.00
                N   1230693.00   1230693.00    1230693.00         1230693.00
        Pct.Valid       100.00       100.00        100.00             100.00

A base de dados analisada possui 1.230.693 observações, sem presença de valores faltantes, o que garante alta confiabilidade para a análise estatística. Entre as variáveis analisadas, a humidade apresenta média de 75,33% e mediana de 80%, indicando uma assimetria negativa, ou seja, há maior concentração de valores elevados de umidade, o que é comum em dados climáticos. A pressão atmosférica apresenta média e mediana praticamente iguais (1015 hPa), além de baixo desvio padrão e coeficiente de variação muito reduzido, indicando uma distribuição bastante estável e próxima da normalidade. A temperatura possui média de 9,81 °C e mediana de 8,20 °C, apresentando assimetria positiva, o que indica maior concentração de temperaturas mais baixas e alguns valores mais altos que elevam a média, além de uma amplitude significativa que varia de -8,91 °C a 39,28 °C. Já a velocidade do vento apresenta média de 3,78 e mediana de 3,60, com assimetria positiva mais acentuada, indicando predominância de ventos fracos e ocorrência de alguns episódios de vento mais intenso. De forma geral, observa-se que a pressão atmosférica é a variável mais estável, enquanto temperatura e velocidade do vento apresentam maior variabilidade, comportamento típico em dados meteorológicos. Se não soubessemos onde fica esta localidade poderíamos supor que pela média de temperatura observada (9,81 °C) que se trata de um local com clima relativamente frio, característico de regiões de latitudes médias ou altas. A elevada umidade média e a baixa velocidade do vento indicam condições atmosféricas relativamente estáveis.

10. Criando um histograma de uma variável

Eu escolhi a variável pressão pois de acordo com as análises feitas anteriormente ela é a que apresenta uma maior tendencia a normalidade.

df_col %>% 
  ggplot(aes( x = pressao)) +
  geom_histogram(aes(y = after_stat(density)),
    bins = 30,
    fill = "lightblue",
    color = "white",
    alpha = 0.6
  )+
  geom_density(color = "red", linewidth = 1.2) +
  theme_minimal() + 
  labs(
    x = "Pressão",
    y = "densidade",
    title = "Distribuição dos dados de Pressão"
  )

Para a variável Pressão, o histograma apresenta uma clara aproximação da distribuição normal, exibindo o clássico formato de “sino” . O número de bins utilizado de 30 justifica-se por equilibrar a suavização dos dados com a sensibilidade necessária para observar a densidade sem gerar ruído visual, permitindo identificar que a maior parte das observações se concentra no centro.

11. Analisando a correlação entre as variáveis

Para calcular as correlações iremos utilizar o pacote corrplot() e as funções cor() para criar a matriz de correlção e a corrplot() para gerar o gráfico.

matriz_cor <- cor(df_col, use = "complete.obs")

corrplot(
  matriz_cor,
  method = "color",
  type = "upper",
  addCoef.col = "black",
  tl.col = "black",
  tl.srt = 45
)

  • Temperatura vs. Humidade (-0.63): Esta é a correlação mais forte do gráfico. É uma correlação negativa moderada a forte. Isso indica que, geralmente, quando a temperatura aumenta, a umidade relativa tende a diminuir. Fisicamente, isso faz sentido, pois o ar mais quente tem maior capacidade de reter vapor, reduzindo a umidade relativa se a quantidade de água no ar permanecer constante.

  • Pressão vs. Velocidade do Vento (-0.30): Existe uma correlação negativa fraca. Valores mais baixos de pressão (comuns em centros de baixa pressão ou frentes) costumam estar associados a ventos mais fortes. É o princípio básico da dinâmica de ventos: o ar se move da alta para a baixa pressão.

  • Humidade vs. Velocidade do Vento (-0.29): Existe uma correlação negativa fraca. Isso indica que quando a velocidade do vento aumenta, a humidade tende a diminuir. Isso pode ser explicado pois em dias de vento mais fortes eles podem acabar levando a humidade para outro lugar e trazendo massas de ar mais secas.

12. Criando um gráfico de dispersão entre duas variáveis

As variaveis escolhidas são temperatura e humidade pois tem maior correlação entre todas as outras.

df_col %>% 
  ggplot(aes( x = temperatura, y = humidade, color = humidade, color = temperatura)) +
  geom_point(alpha = 0.3) + 
  geom_smooth(method = "lm", color = "red") +
  scale_color_viridis_c() +
  theme_minimal()
Warning: Duplicated aesthetics after name standardisation: colour
`geom_smooth()` using formula = 'y ~ x'

O gráfico de dispersão entre temperatura e humidade mostra uma relação negativa entre as variáveis, indicando que, à medida que a temperatura aumenta, a humidade relativa tende a diminuir. Esse comportamento é coerente com a dinâmica atmosférica, uma vez que o ar mais quente possui maior capacidade de retenção de vapor de água, reduzindo a humidade relativa. Observa-se também uma concentração de valores elevados de humidade próximos de 100%, possivelmente associada a condições de saturação atmosférica.

df_col %>% 
  ggplot(aes(x = velocidade_vento, y = temperatura)) +
  geom_point(alpha = 0.4, color = "lightblue") +
  geom_smooth(method = "lm", se = FALSE, color = "red") +
  theme_minimal()
`geom_smooth()` using formula = 'y ~ x'

13. Gráfico de linha

Selecionando as varáveis do gráfico

df_linha <- df %>% 
  rename(tempo = Time_stamp,
         temperatura = temp) %>% 
  select(tempo, temperatura)
df_linha
# A tibble: 1,230,693 × 2
   tempo               temperatura
   <dttm>                    <dbl>
 1 2018-12-31 18:30:12        7.71
 2 2018-12-31 18:32:41        7.71
 3 2018-12-31 18:35:11        7.71
 4 2018-12-31 18:37:41        7.71
 5 2018-12-31 18:40:11        7.71
 6 2018-12-31 18:42:40        7.71
 7 2018-12-31 18:45:09        7.71
 8 2018-12-31 18:47:39        7.71
 9 2018-12-31 18:50:08        7.71
10 2018-12-31 18:52:37        7.71
# ℹ 1,230,683 more rows

Gráfico

df_linha %>% 
  ggplot(aes(x = tempo, y = temperatura)) +
  geom_line( color = "steelblue", alpha = 0.6) +
  theme_minimal() +
  labs(
    title = "Variação da temperatura no período de 2019 a 2020",
    x = "Tempo",
    y = "Temperatura"
  )

No gráfico é possível observar uma tendência de aumento gradual da temperatura entre os meses de abril e julho, atingindo valores máximos durante o período de verão no hemisfério norte, aproximadamente entre junho e agosto. Após esse período, observa-se uma diminuição progressiva da temperatura até os meses de inverno, evidenciando o comportamento sazonal típico das regiões de clima temperado.