# ==========================================
# 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()`).
