# ==========================================
# Configuração Inicial e Base de Dados
# ==========================================

# Carregar os pacotes necessários
if (!require(ggplot2)) install.packages("ggplot2")
## Carregando pacotes exigidos: ggplot2
if (!require(dplyr)) install.packages("dplyr")
## Carregando pacotes exigidos: dplyr
## 
## 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
library(ggplot2)
library(dplyr)

# Usar a base de dados nativa do R (não precisa de arquivo CSV externo!)
dados_starwars <- dplyr::starwars

# Criar a coluna de grupo para Humanos e Não Humanos
# A função %in% é ótima aqui porque lida automaticamente com valores vazios (NAs)
dados_starwars$grupo <- ifelse(dados_starwars$species %in% "Human", "Humanos", "Não Humanos")

# Filtrar bases separadas para os cálculos da Questão 1
humanos <- subset(dados_starwars, grupo == "Humanos")
nao_humanos <- subset(dados_starwars, grupo == "Não Humanos")


# ==========================================
# 1. Medidas Resumo (Humanos vs Não Humanos)
# ==========================================

# Função para calcular estatísticas
calcular_estatisticas <- function(dados, nome_grupo) {
  alturas <- na.omit(dados$height) # Remove NAs se houver
  
  estatisticas <- list(
    Grupo = nome_grupo,
    Média = mean(alturas),
    Mínimo = min(alturas),
    Q1 = quantile(alturas, 0.25),
    Mediana = median(alturas),
    Q3 = quantile(alturas, 0.75),
    Máximo = max(alturas),
    Variância = var(alturas) # Variância amostral (n-1)
  )
  return(estatisticas)
}

# Calcular estatísticas para humanos e não humanos
estat_humanos <- calcular_estatisticas(humanos, "Humanos")
estat_nao_humanos <- calcular_estatisticas(nao_humanos, "Não Humanos")

# Exibir resultados
print("=== Estatísticas para Humanos ===")
## [1] "=== Estatísticas para Humanos ==="
print(estat_humanos)
## $Grupo
## [1] "Humanos"
## 
## $Média
## [1] 178
## 
## $Mínimo
## [1] 150
## 
## $Q1
## 25% 
## 170 
## 
## $Mediana
## [1] 181
## 
## $Q3
##   75% 
## 184.5 
## 
## $Máximo
## [1] 202
## 
## $Variância
## [1] 145.1034
print("\n=== Estatísticas para Não Humanos ===")
## [1] "\n=== Estatísticas para Não Humanos ==="
print(estat_nao_humanos)
## $Grupo
## [1] "Não Humanos"
## 
## $Média
## [1] 172.6078
## 
## $Mínimo
## [1] 66
## 
## $Q1
##   25% 
## 164.5 
## 
## $Mediana
## [1] 180
## 
## $Q3
## 75% 
## 196 
## 
## $Máximo
## [1] 264
## 
## $Variância
## [1] 1839.643
# ==========================================
# 2. Polígonos de Porcentagem 
# ==========================================

# Gráfico corrigido: multiplicando por 10 (binwidth) e por 100 para %
ggplot(dados_starwars, aes(x = height, y = after_stat(density * 10 * 100), 
                           color = grupo, group = grupo)) +
  geom_freqpoly(binwidth = 10, linewidth = 1.2) + 
  scale_color_manual(values = c("Humanos" = "blue", "Não Humanos" = "red")) +
  labs(
    title = "Distribuição de Alturas em Star Wars",
    subtitle = "Polígonos de porcentagem por grupo",
    x = "Altura (cm)",
    y = "Porcentagem de personagens (%)",
    color = "Grupo"
  ) +
  theme_minimal() +
  theme(legend.position = "top")
## Warning: Removed 6 rows containing non-finite outside the scale range
## (`stat_bin()`).

# ==========================================
# 3. Histogramas
# ==========================================

# Criar histogramas separados
ggplot(dados_starwars, aes(x = height, fill = grupo)) +
  geom_histogram(binwidth = 10, color = "white", alpha = 0.7) +
  facet_wrap(~ grupo, scales = "free_y") +
  scale_fill_manual(values = c("Humanos" = "#1f77b4", "Não Humanos" = "#ff7f0e")) +
  labs(
    title = "Distribuição de Alturas em Star Wars",
    subtitle = "Histogramas separados para Humanos e Não Humanos",
    x = "Altura (cm)",
    y = "Contagem de Personagens",
    fill = "Grupo"
  ) +
  theme_minimal() +
  theme(
    legend.position = "none",
    panel.spacing = unit(1, "lines"),
    strip.text = element_text(size = 12, face = "bold")
  )
## Warning: Removed 6 rows containing non-finite outside the scale range
## (`stat_bin()`).