title: “Lista de Exercicios II”
author: “Leonardo Istamilo Silva Ferreira.”
date: “2025-03-23”
output:
html_document: default

1. Levando-se em consideração o Banco de Dados de 36 funcionários de uma determinada empresa, pode-se

1. Faça a importação destes dados para o R.

#importando os dados:
dados <- read.table("C:/Users/Leonardo/Documents/RStudio/Lista II/Dados_Funcionarios.csv", header = TRUE, sep = ",", dec = ".")
# Mostrando as seis primeira linhas
head(dados)
##   Funcionario Est.civil    Inst Filhos Salario Anos Meses   Regiao
## 1           1  solteiro 1o Grau     NA    4.00   26     3 interior
## 2           2    casado 1o Grau      1    4.56   32    10  capital
## 3           3    casado 1o Grau      2    5.25   36     5  capital
## 4           4  solteiro 2o Grau     NA    5.73   20    10    outro
## 5           5  solteiro 1o Grau     NA    6.26   40     7    outro
## 6           6    casado 1o Grau      0    6.66   28     0 interior

2. Considerando a variável “estado civil” (Est.civil):

2a. Faça tabelas de frequência absoluta e relativa

# Calculando Frequencia Absoluta e Relativa
freq_abs <- table(dados$Est.civil)
freq_rel <- prop.table(freq_abs);

# Criando a tabela
library(gt)
tabela_freq <- data.frame(
  Estado_Civil = names(freq_abs),
  Frequencia_Absoluta = as.vector(freq_abs),
  Frequencia_Relativa = as.vector(freq_rel)
)

# Criar a linha de total
total_linha <- data.frame(
  Estado_Civil = "Total",
  Frequencia_Absoluta = sum(tabela_freq$Frequencia_Absoluta),
  Frequencia_Relativa =  sum(tabela_freq$Frequencia_Relativa)
  )

tabela_freq_com_total <- rbind(tabela_freq, total_linha)

# Mostrando a tabela com Frequencia Absoluta e relativa
tabela_freq_com_total %>%
  gt() %>%
  cols_label(
    `Estado_Civil` = "Estado Civil ",
    `Frequencia_Absoluta` = " Frequencia Absoluta ",
    `Frequencia_Relativa` = " Frequencia Relativa",
  ) %>%
  fmt_number(
    columns = c(`Frequencia_Relativa`),
    decimals = 4
  ) %>%
  tab_style(
    style = list(
      cell_fill(color = "#f0f0f0"),
      cell_text(weight = "bold")
    ),
    locations = cells_body(
      rows = nrow(tabela_freq_com_total)
    )
  )%>%
  tab_options(
    table.font.size = "14px",
    column_labels.font.weight = "bold",
    table.width = "80%"
  )
Estado Civil Frequencia Absoluta Frequencia Relativa
casado 20 0.5556
solteiro 16 0.4444
Total 36 1.0000

2b. Faça um gráfico de barras e um de setores (“pizza”)

library(kableExtra)

# Mostrando gráfico de barras
barplot(freq_abs, 
        main = "Distribuição por Estado Civil",
        xlab = "Estado Civil", 
        ylab = "ni",
        col = c("lightblue", "lightgreen"))

# Mostrando gráfico de pizza (setores)
porcentagens <- paste0(round(freq_rel*100, 1), "%")

pie(freq_abs, 
    main = "Distribuição por Estado Civil",
    col = c("lightblue", "lightgreen"),
    labels = paste(porcentagens),
    cex = 0.8,
    border = "white",
    init.angle = 90
    )

legend("topright",
       legend = names(freq_abs),
       fill = c("lightblue", "lightgreen"),
       box.lty = 0)

3. Considerando a variável “grau de instrução” (Inst):

3a. Faça tabelas de frequência absoluta e relativa

# Calculando Frequencia Absoluta e Relativa
freq_abs_inst <- table(dados$Inst)
freq_rel_inst <- prop.table(freq_abs_inst)

# Criando a tabela
tabela_inst <- data.frame(
  Grau_Instrucao = names(freq_abs_inst),
  Frequencia_Absoluta = as.vector(freq_abs_inst),
  Frequencia_Relativa = as.vector(freq_rel_inst)
)

# Criar a linha de total
total_linha <- data.frame(
  Grau_Instrucao = "Total",
  Frequencia_Absoluta = sum(tabela_inst$Frequencia_Absoluta),
  Frequencia_Relativa = sum(tabela_inst$Frequencia_Relativa)
)

# Concatenar com a tabela original
tabela_inst_com_total <- rbind(tabela_inst, total_linha)

# Mostrar a tabela formatada
tabela_inst_com_total %>%
  gt() %>%
  cols_label(
    Grau_Instrucao = "Grau de Instrução ",
    Frequencia_Absoluta = " Frequência Absoluta ",
    Frequencia_Relativa = " Frequência Relativa "
  ) %>%
  fmt_number(
    columns = c(Frequencia_Relativa),
    decimals = 4
  ) %>%
  tab_style(
    style = list(
      cell_fill(color = "#f0f0f0"),
      cell_text(weight = "bold")
    ),
    locations = cells_body(
      rows = nrow(tabela_inst_com_total)
    )
  ) %>%
  tab_options(
    table.font.size = "14px",
    column_labels.font.weight = "bold",
    table.width = "80%"
  )
Grau de Instrução Frequência Absoluta Frequência Relativa
1o Grau 12 0.3333
2o Grau 18 0.5000
Superior 6 0.1667
Total 36 1.0000

3b - Gerando um gráfico de barras e um de setores para a váriavel “grau de instrução” (Inst)

# Mostrar gráfico de barras
barplot(freq_abs_inst, 
        main = "Distribuição por Grau de Instrução", 
        xlab = "Grau de Instrução",
        ylab = "ni",
        col = rainbow(length(freq_abs_inst)))

# Mostrar gráfico de pizza
porcentagens <- paste0(round(freq_rel_inst*100, 1), "%")

pie(freq_abs_inst,
    main = "Distribuição por Grau de Instrução",
    col = c("lightblue", "lightgreen", "salmon"),
    labels = (porcentagens),
    cex = 0.8,
    border = "white",
    init.angle = 90)

legend("topright",
       legend = names(freq_abs_inst),
       fill = c("lightblue", "lightgreen", "salmon"),
       box.lty = 0)

4. Considerando a variável “número de”filhos” (Filhos):

4a. Faça tabelas de frequência absoluta, relativa e acumulada

dados$Filhos[is.na(dados$Filhos)] <- 0 #Substitui NA por 0 na coluna Filhos

# Calculando as frequências absoluta, relativa e acumulada
freq_abs_filhos = table(dados$Filhos)
freq_rel_filhos = prop.table((freq_abs_filhos))
freq_rel_acum_filhos <- cumsum(freq_rel_filhos)

# criando a tabela
tabela_filhos <- data.frame(
  n_filhos = as.numeric(names(freq_abs_filhos)),
  freq_abs_filhos = as.vector(freq_abs_filhos),
  freq_rel_filhos = as.vector(freq_rel_filhos),
  freq_rel_acum_filhos = as.vector(freq_rel_acum_filhos)
)

# Criar a linha de total
total_linha <- data.frame(
  n_filhos = "Total",
  freq_abs_filhos = sum(tabela_filhos$freq_abs_filhos),
  freq_rel_filhos = sum(tabela_filhos$freq_rel_filhos),
  freq_rel_acum_filhos = NA
)

# Concatenar a linha de total na tabela original
tabela_filhos_com_total <- rbind(tabela_filhos, total_linha)


# Mostrar a tabela formatada
tabela_filhos_com_total %>%
  gt() %>%
  cols_label(
    n_filhos = "Número de Filhos",
    freq_abs_filhos = "Frequência Absoluta",
    freq_rel_filhos = "Frequência Relativa",
    freq_rel_acum_filhos = "Frequência Relativa Acumulada"
  ) %>%
  fmt_number(
    columns = c(freq_rel_filhos, freq_rel_acum_filhos),
    decimals = 4
  ) %>%
  tab_style(
    style = list(
      cell_fill(color = "#f0f0f0"),
      cell_text(weight = "bold")
    ),
    locations = cells_body(
      rows = nrow(tabela_filhos_com_total)
    )
  )%>%
  tab_options(
    table.font.size = "14px",
    column_labels.font.weight = "bold",
    table.width = "90%"
  )
Número de Filhos Frequência Absoluta Frequência Relativa Frequência Relativa Acumulada
0 20 0.5556 0.5556
1 5 0.1389 0.6944
2 7 0.1944 0.8889
3 3 0.0833 0.9722
5 1 0.0278 1.0000
Total 36 1.0000 NA

4b. Faça um gráfico com as frequências relativas e outro com as frequências relativas acumuladas

barplot(freq_rel_filhos,
        main = "Distribuição do Número de Filhos - Frequência Relativa",
        xlab = "Número de Filhos",
        ylab = "fi",
        col = "skyblue",
        ylim = c(0, max(freq_rel_filhos) * 1.1))

plot(names(freq_rel_acum_filhos), freq_rel_acum_filhos,
     type = "b",  
     main = "Distribuição do Número de Filhos - Frequência Relativa Acumulada",
     xlab = "Número de Filhos",
     ylab = "Fi",
     pch = 19,    
     col = "red",
     xaxt = "n")  

axis(1, at = names(freq_rel_acum_filhos))

grid()

5.) Considerando a variável “salário” (Salario):

5a. Verifique os valores máximo e mínimo e qual seria o número adequado de classes para a construção de uma tabela de frequência para resumir esta variável

# Verificar valores máximo e mínimo
salario_min <- min(dados$Salario)
salario_max <- max(dados$Salario)

amplitude_total <- salario_max - salario_min

# Determinar número de classes (Regra de Sturges)
n_intervalos <- ceiling(log2(nrow(dados)) + 1)

# Calcular largura das classes
amplitude_intervalos <- amplitude_total / n_intervalos

# Sugestão de intervalos de classe
classes <- seq(from = salario_min, 
               to = salario_max + amplitude_intervalos, 
               by = amplitude_intervalos)

Salário mínimo: 4
Salário máximo: 23.3
Amplitude total: 19.3

Sugestão para Construção de Classes

Número de intervalos (Regra de Sturges): 7
Amplitude de cada intervalo: 2.76

Intervalos Sugeridos:

4, 6.76, 9.51, 12.27, 15.03, 17.79, 20.54, 23.3, 26.06

5b. Faça um histograma

# Criar histograma com intervalos calculadas
hist(dados$Salario,
     breaks = classes,  # Usando os intervalos calculados
     main = "Distribuição de Salários dos Funcionários",
     xlab = "Salário",
     ylab = "ni",
     col = "steelblue",
     border = "white",
     right = FALSE,
     xaxt = "n")    

axis(1, at = round(classes, 2), las = 2, cex.axis = 0.8)

grid(nx = NA, ny = NULL, lty = 2, col = "gray")

6. Considerando as variáveis “estado civil” (Est.civil) e “grau de instrução” (Inst):

6a. Faça uma tabela de contingência para resumir o cruzamento destas duas variáveis

tab_contingencia <- table(dados$Est.civil, dados$Inst)
knitr::kable(tab_contingencia, 
             caption = "Tabela de Contingência: Estado Civil × Grau de Instrução",
             col.names = c("1º Grau", "2º Grau", "Superior"))
Tabela de Contingência: Estado Civil × Grau de Instrução
1º Grau 2º Grau Superior
casado 5 12 3
solteiro 7 6 3

b. A partir da tabela de contingência, faça um gráfico de barras (veja como ficam as barras sobrepostas e lado a lado)

library(ggplot2)
ggplot(dados, aes(x = Inst, fill = Est.civil)) +
  geom_bar(position = "dodge", alpha = 0.8) +
  labs(title = "Distribuição por Grau de Instrução e Estado Civil",
       x = "Grau de Instrução", 
       fill = "Estado Civil") +
  scale_fill_manual(values = c("casado" = "#1f77b4", "solteiro" = "#ff7f0e")) +
  theme_minimal()

7. Considerando as variáveis “grau de instrução” (Inst) e “salário” (Salario):

7a. Faça um box-plot para verificar a relação entre estas duas variáveis

ggplot(dados, aes(x = Inst, y = Salario, fill = Inst)) +
  geom_boxplot() +
  labs(title = "Distribuição Salarial por Grau de Instrução",
       x = "Grau de Instrução",
       y = "Salário") +
  scale_fill_brewer(palette = "Pastel1") +
  theme(legend.position = "none")

7b. Calcule a média e o desvio padrão dos salários para cada grau de instrução

suppressPackageStartupMessages({
  library(dplyr)
})

library(dplyr)
dados %>%
  group_by(Inst) %>%
  summarise(
    Média = mean(Salario, na.rm = TRUE),
    `Desvio Padrão` = sd(Salario, na.rm = TRUE),
    .groups = 'drop'
  ) %>%
  knitr::kable(digits = 2)
Inst Média Desvio Padrão
1o Grau 7.84 2.96
2o Grau 11.53 3.72
Superior 16.48 4.50

8. Considerando as variáveis Anos e Meses:

8a. Calcule a idade como Anos+Meses/12(criando uma nova “coluna” chamada Idade)

dados <- dados %>%
  mutate(Idade = Anos + Meses/12)
  
head(dados) # Mostrando as  6 primeiras linhas da base de dados
##   Funcionario Est.civil    Inst Filhos Salario Anos Meses   Regiao    Idade
## 1           1  solteiro 1o Grau      0    4.00   26     3 interior 26.25000
## 2           2    casado 1o Grau      1    4.56   32    10  capital 32.83333
## 3           3    casado 1o Grau      2    5.25   36     5  capital 36.41667
## 4           4  solteiro 2o Grau      0    5.73   20    10    outro 20.83333
## 5           5  solteiro 1o Grau      0    6.26   40     7    outro 40.58333
## 6           6    casado 1o Grau      0    6.66   28     0 interior 28.00000

9. Considerando as variáveis Salario e Idade:

9a. Faça um gráfico para explorar a relação entre estas duas variáveis

ggplot(dados, aes(x = Idade, y = Salario)) +
  geom_point(color = "#3498db", size = 3, alpha = 0.7) +  
  geom_smooth(method = "lm", color = "#e74c3c", se = FALSE) +  
  labs(
    title = "Relação entre Salário e Idade",
    subtitle = "Dados dos Funcionários",
    x = "Idade (Anos)",
    y = "Salário"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 14, face = "bold"),
    axis.title = element_text(size = 12),
    panel.grid.minor = element_blank()
  ) +
  scale_y_continuous(labels = scales::number_format(big.mark = ".", decimal.mark = ","))
## `geom_smooth()` using formula = 'y ~ x'

9b. Calcule a correlação entre estas duas variáveis.

correlacao <- cor(dados$Salario, dados$Idade, use = "complete.obs")
cat("Coeficiente de correlação entre Salário e Idade:", round(correlacao, 3))
## Coeficiente de correlação entre Salário e Idade: 0.365

10. Experimente as funções mean(), var(), sd(), median(), quantile() nos dados mostrados anteriormente. Veja a documentação das funções e as opções de uso.

# Cálculo das estatísticas básicas
salario_stats <- dados %>%
  summarise(
    Média = mean(Salario, na.rm = TRUE),
    Variância = var(Salario, na.rm = TRUE),
    Desvio_Padrão = sd(Salario, na.rm = TRUE),
    Mediana = median(Salario, na.rm = TRUE),
    Mínimo = min(Salario, na.rm = TRUE),
    Máximo = max(Salario, na.rm = TRUE)
  )

#Cálculo dos quartis (com a correção)
quartis <- quantile(dados$Salario, probs = c(0.25, 0.5, 0.75), na.rm = TRUE)
quartis_df <- data.frame(
  Quartil = c("1º Quartil (25%)", "Mediana (50%)", "3º Quartil (75%)"),
  Valor = as.numeric(quartis)
)

# Tabela de estatísticas básicas
salario_stats %>%
  gt() %>%
  fmt_number(decimals = 2) %>%
  tab_header(title = "Estatísticas Descritivas do Salário") %>%
  cols_label(
    Média = "Média",
    Variância = "Variância",
    Desvio_Padrão = "Desvio Padrão",
    Mediana = "Mediana",
    Mínimo = "Mínimo",
    Máximo = "Máximo"
  )%>%
  tab_options(
    table.font.size = "14px",
    column_labels.font.weight = "bold",
    table.width = "80%"
  )
Estatísticas Descritivas do Salário
Média Variância Desvio Padrão Mediana Mínimo Máximo
11.12 21.04 4.59 10.16 4.00 23.30
# Tabela de quartis
quartis_df %>%
  gt() %>%
  fmt_number(columns = "Valor", decimals = 2) %>%
  tab_header(title = "Quartis do Salário") %>%
  cols_label(
    Quartil = "Quartil",
    Valor = "Valor"
  )%>%
  tab_options(
    table.font.size = "14px",
    column_labels.font.weight = "bold",
    table.width = "60%"
  )
Quartis do Salário
Quartil Valor
1º Quartil (25%) 7.55
Mediana (50%) 10.16
3º Quartil (75%) 14.06