R: R Relatório abrangente de análise de dados
Última atualização: 2026-08-26
Esta é a aula final do tutorial sobre R — ela reúne tudo o que você aprendeu nas 29 aulas anteriores para criar um projeto completo, do início ao fim. Desde a leitura dos dados até a limpeza deles, passando pela análise exploratória de dados (EDA), construção de modelos, visualização de resultados e geração de relatórios, esta aula simula um dia típico na vida de um analista de dados.
Ao concluir esta lição, você será capaz de realizar de forma independente um projeto completo de análise de dados no R — no nível de um portfólio para uma entrevista de emprego na área de ciência de dados.
1. O que você vai aprender
- Projeto completo em 6 etapas (Dados → Limpeza → Análise exploratória de dados → Modelagem → Visualização → Relatórios)
- Uso abrangente de: readr + tidyr + dplyr + ggplot2 + broom + rmarkdown
- O R Markdown gera relatórios automaticamente
- Persistência e implantação de modelos no saveRDS
- Gerar relatórios em PDF/HTML
- Guia prático: Relatório abrangente sobre a análise do comportamento do cliente
2. Um dia na vida de um analista de dados
(1) Problema: Leva 3 dias para transformar os dados em um relatório
Alice é uma analista de dados que recebeu a tarefa de analisar o comportamento dos clientes em 2024 e apresentar ao seu gerente um relatório abrangente.
Processo tradicional: Importar dados do Excel → Limpar os dados → Criar uma tabela dinâmica no Excel → Gerar um gráfico → Copiar para o PowerPoint → Redigir a análise → O gerente solicita ver o resultado uma semana depois.
(2) Solução usando R
# 1. One line R Markdown Report
rmarkdown::render('customer_analysis.Rmd')
1 linha de código → Relatório completo em HTML/PDF (incluindo código, resultados, gráficos e análise).
3. As 6 etapas de um projeto de ponta a ponta
graph TB
A[1. Data Loading] --> B[2. Data Cleaning]
B --> C[3. EDA Explore]
C --> D[4. Descriptive Statistics]
D --> E[5. Modeling and Analysis]
E --> F[6. Visualization and Reporting]
A --> A1[readr/DBI]
B --> B1[tidyr/stringr]
C --> C1[skimr/GGally]
D --> D1[dplyr summary]
E --> E1[lm/glm]
F --> F1[ggplot2/Rmd]
style A fill:#fff3cd
style B fill:#cce5ff
style C fill:#d4edda
style D fill:#f8d7da
style E fill:#e1d4ff
style F fill:#ffe1d4
(1) Metas em 6 etapas
| Fase | Objetivo | Resultado |
|---|---|---|
| 1. Carregando dados | Lendo dados | tibble |
| 2. Limpeza de dados | Tratamento de valores ausentes, atípicos e duplicados | Limpar o tibble |
| 3. EDA | Explorar distribuição/relações | Gráficos + Estatísticas |
| 4. Estatística descritiva | Principais métricas | Tabela resumida |
| 5. Modelagem | Regressão/Classificação/Agrupamento | Objetos de modelo |
| 6. Relatório | Síntese + Análise | HTML/PDF |
4. Prática: Projeto de análise de comportamento do cliente de ponta a ponta
(1) Script completo em R
# ============================================
# Customer Behavior Analysis - End-to-End Projects
# Stage: 1. Data Loading -> 6. Report Output
# ============================================
library(readr)
library(dplyr)
library(tidyr)
library(stringr)
library(lubridate)
library(ggplot2)
library(broom)
library(skimr)
# ========== Stage 1: Data Loading ==========
cat('=== Stage 1: Data Loading ===\n')
set.seed(42)
n <- 2000
customers_raw <- tibble(
customer_id = 1:n,
age = round(rnorm(n, 35, 12)),
gender = sample(c('M', 'F'), n, replace = TRUE),
city = sample(c('Beijing', 'Shanghai', 'Guangzhou', 'Shenzhen', 'Hangzhou'), n, replace = TRUE),
register_date = sample(seq(as.Date('2023-01-01'),
as.Date('2024-06-30'), by = 'day'), n, replace = TRUE),
monthly_visits = round(rnorm(n, 10, 5)),
avg_order_value = round(rnorm(n, 200, 80)),
support_calls = sample(0:10, n, replace = TRUE),
plan = sample(c('Basics', 'Advanced', 'Company'), n, replace = TRUE,
prob = c(0.5, 0.3, 0.2))
) |>
mutate(
logit_p = -2 + 0.02 * age - 0.05 * monthly_visits + 0.2 * support_calls,
p = 1 / (1 + exp(-logit_p)),
churn = rbinom(n, 1, p)
) |>
select(-logit_p, -p) |>
mutate(
age = ifelse(row_number() %in% sample(n, 10), NA, age),
avg_order_value = ifelse(row_number() %in% sample(n, 5), -999, avg_order_value),
register_date = ifelse(row_number() %in% sample(n, 8), NA, register_date)
)
write_csv(customers_raw, 'customer_raw.csv')
cat('Loaded', nrow(customers_raw), 'Raw Data Row\n\n')
# ========== Stage 2: Data Cleaning ==========
cat('=== Stage 2: Data Cleaning ===\n')
customers <- customers_raw |>
janitor::clean_names() |>
distinct() |>
mutate(
age = ifelse(is.na(age) | age < 0 | age > 150,
median(age[age > 0 & age < 150], na.rm = TRUE), age),
avg_order_value = ifelse(avg_order_value < 0, NA, avg_order_value)
) |>
drop_na(register_date) |>
filter(monthly_visits >= 0, support_calls >= 0)
cat('After cleaning:', nrow(customers), 'rows\n')
cat(' - Duplicates:', nrow(customers_raw) - nrow(distinct(customers_raw)), 'removed\n')
cat(' - Age Missing/Exception: Processed\n')
cat(' - Abnormal Order Amount: Set to NA\n\n')
# ========== Stage 3: EDA Explore ==========
cat('=== Stage 3: EDA Explore ===\n')
cat('Data Dimensions:', nrow(customers), 'rows x', ncol(customers), 'cols\n')
cat('Churn rate:', round(mean(customers$churn) * 100, 2), '%\n')
churn_by_plan <- customers |>
group_by(plan) |>
summarise(
n = n(),
churn_rate = round(mean(churn) * 100, 2),
avg_age = round(mean(age), 1),
avg_visits = round(mean(monthly_visits), 1)
)
cat('\nChurn Rate by Plan Type:\n')
print(churn_by_plan)
p1 <- ggplot(customers, aes(x = monthly_visits, y = avg_order_value,
color = factor(churn))) +
geom_point(alpha = 0.5) +
geom_smooth(method = 'lm', se = FALSE) +
scale_color_brewer(palette = 'Set1', labels = c('Not lost', 'Loss')) +
labs(title = 'Number of visits vs Average Order Value',
x = 'Monthly Visits', y = 'Average Order Value', color = 'Status') +
theme_minimal()
cat('Generate 2 Key Charts\n\n')
# ========== Stage 4: Descriptive Statistics ==========
cat('=== Stage 4: Descriptive Statistics ===\n')
key_metrics <- customers |>
summarise(
Total Number of Customers = n(),
Number of Lost Customers = sum(churn),
Churn rate = round(mean(churn) * 100, 2),
Average Age = round(mean(age), 1),
Average Monthly Visits = round(mean(monthly_visits), 1),
Average Order Value = round(mean(avg_order_value, na.rm = TRUE), 2),
Average Number of Customer Service Inquiries = round(mean(support_calls), 1)
)
print(key_metrics)
by_city <- customers |>
group_by(city) |>
summarise(
Number of customers = n(),
Churn rate = round(mean(churn) * 100, 2),
Average Order = round(mean(avg_order_value, na.rm = TRUE), 2)
) |>
arrange(desc(Number of customers))
cat('\nBy City:\n')
print(by_city)
cat('\n')
# ========== Stage 5: Modeling and Analysis ==========
cat('=== Stage 5: Modeling and Analysis ===\n')
# 5.1 Logistic Regression: Churn Prediction
churn_model <- glm(churn ~ age + gender + plan + monthly_visits +
avg_order_value + support_calls,
data = customers, family = binomial)
cat('Logistic Regression Model:\n')
summary(churn_model)
cat('\nOdds Ratio Analysis:\n')
or_df <- tidy(churn_model, conf.int = TRUE, exponentiate = TRUE) |>
filter(term != '(Intercept)')
print(or_df |> select(term, estimate, std.error, p.value, conf.low, conf.high))
# 5.3 Linear Regression: Visits Forecast
visit_model <- lm(monthly_visits ~ age + plan + avg_order_value,
data = customers)
cat('\nVisits Forecast Model:\n')
summary(visit_model)
# 5.4 Model Evaluation
library(pROC)
customers$churn_prob <- predict(churn_model, type = 'response')
roc_obj <- roc(customers$churn, customers$churn_prob)
cat('\nChurn Model AUC:', round(auc(roc_obj), 3), '\n\n')
# ========== Stage 6: Visualization and Reporting ==========
cat('=== Stage 6: Visualization and Reporting ===\n')
p2 <- customers |>
group_by(plan, churn) |>
summarise(n = n(), .groups = 'drop') |>
ggplot(aes(x = plan, y = n, fill = factor(churn))) +
geom_col(position = 'fill') +
scale_y_continuous(labels = scales::percent) +
scale_fill_brewer(palette = 'Set1', labels = c('Not lost', 'Loss')) +
labs(title = 'Churn Rates by Plan Type', x = 'Plan', y = 'Ratio', fill = 'Status') +
theme_minimal()
p3 <- customers |>
group_by(plan) |>
summarise(
n = n(),
churn_rate = mean(churn)
) |>
ggplot(aes(x = plan, y = churn_rate, fill = plan)) +
geom_col() +
geom_text(aes(label = paste0(round(churn_rate * 100, 1), '%')),
vjust = -0.5) +
scale_y_continuous(labels = scales::percent,
expand = expansion(mult = c(0, 0.15))) +
labs(title = 'Churn Rates by Plan Type', x = 'Plan', y = 'Churn rate') +
theme_minimal() +
theme(legend.position = 'none')
p4 <- ggplot(customers, aes(x = plan, y = monthly_visits, fill = plan)) +
geom_boxplot() +
labs(title = 'Distribution of Monthly Visits by Plan', x = 'Plan', y = 'Monthly Visits') +
theme_minimal() +
theme(legend.position = 'none')
# 6.2 Save Chart
ggsave('chart_visits_vs_order.png', p1, width = 8, height = 6, dpi = 300)
ggsave('chart_churn_by_plan.png', p2, width = 8, height = 6, dpi = 300)
ggsave('chart_churn_rate.png', p3, width = 8, height = 6, dpi = 300)
ggsave('chart_visits_by_plan.png', p4, width = 8, height = 6, dpi = 300)
# 6.3 Save Model
saveRDS(churn_model, 'churn_model.rds')
saveRDS(visit_model, 'visit_model.rds')
# 6.4 Save the processed data
write_csv(customers, 'customer_clean.csv')
saveRDS(customers, 'customer_clean.rds')
# 6.5 Summary of Business Insights
cat('\n=== Summary of Business Insights ===\n')
cat('1. Overall attrition rate:', round(mean(customers$churn) * 100, 2), '%\n')
cat('2. Customers with >5 support calls churn rate:',
round(mean(customers$churn[customers$support_calls > 5]) * 100, 2), '%\n')
cat('3. Customers with <5 monthly visits churn rate:',
round(mean(customers$churn[customers$monthly_visits < 5]) * 100, 2), '%\n')
cat('4. The Basic Plan has the highest churn rate (',
round(mean(customers$churn[customers$plan == 'Basics']) * 100, 2), '%)\n')
cat('5. Older age and fewer visits -> higher probability of attrition\n')
cat('6. Suggestion: Add customers with >5 support calls to the high-risk list, proactively retain\n')
cat('\n=== All Done ===\n')
cat('Output Files:\n')
cat(' - customer_raw.csv (Raw Data)\n')
cat(' - customer_clean.csv / .rds (Data After Cleaning)\n')
cat(' - chart_*.png (4 charts)\n')
cat(' - churn_model.rds (Churn Prediction Model)\n')
cat(' - visit_model.rds (Visits Forecast Model)\n')
(2) Modelo de relatório em R Markdown (versão simplificada)
Crie um novo arquivo customer_report.Rmd com a estrutura completa do modelo Rmd (YAML + 6 seções + blocos de código R + texto explicativo):
Metadados YAML (no início do arquivo): definam título / autor / formato de saída (html_document + theme: flatly + toc: true).
6 capítulos principais:
- Visão geral do projeto — Uma breve introdução ao contexto + 3 objetivos de análise
- Visão geral dos dados - Carregar dados limpos + resumo do Skimr
- Análise exploratória - Taxa de cancelamento + Distribuição por plano + Gráfico de dispersão
- Modelo estatístico — Carregue o arquivo churn_model.rds salvo e organize-o para exibir OR
- Principais conclusões — lista com marcadores, de 3 a 5 itens OU interpretação
- Recomendações de negócios — 3 recomendações práticas + lista de anexos
Cada capítulo é separado por blocos de código R (```{r}) embedding analysis code, with ## 1. xxx / ## 2. xxx como títulos entre as seções.
(3) Gerar um relatório
# Generate HTML Report
rmarkdown::render('customer_report.Rmd',
output_format = 'html_document',
output_file = 'customer_report.html')
# Generate PDF Report (LaTeX installation required)
rmarkdown::render('customer_report.Rmd',
output_format = 'pdf_document',
output_file = 'customer_report.pdf')
Resultado esperado:
- 1 relatório em HTML com 10 a 15 páginas (incluindo código, resultados, gráficos e análise)
- 4 gráficos em PNG
- 2 modelos .rds
- 1 arquivo CSV contendo dados limpos
9. Percurso de aprendizagem completo com tutoriais sobre R
(1) 5 etapas
graph TB
A[Phase 1 Basics 10 lessons] --> B[Phase 2 Data 7 lessons]
B --> C[Phase 3 Visualization 5 lessons]
C --> D[Phase 4 Statistics 5 lessons]
D --> E[Phase 5 Practical Application 3 lessons]
E --> F[End Able to work independently on projects]
style A fill:#cce5ff
style B fill:#d4edda
style C fill:#f8d7da
style D fill:#e1d4ff
style E fill:#ffe1d4
style F fill:#fff3cd
(2) Lista de 30 lições
| Fase | Turma | Tema |
|---|---|---|
| 1 Noções básicas | 01-10 | Introdução ao R / Sintaxe básica / Tipos de dados / Vetores / Operadores / Fluxo de controle / Funções / Matrizes / Listas / Quadros de dados |
| 2 Dados | 11-17 | CSV / Excel / JSON / Banco de dados / String / Expressões regulares / Refatoração |
| 3 Visualização | 18–22 | Gráficos básicos / Introdução ao ggplot2 / Avançado / Temas / Mapas |
| 4 Estatística | 23–27 | Estatística descritiva / Distribuições de probabilidade / Teste de hipóteses / Regressão linear / Regressão logística |
| 5 exercícios práticos | 28–30 | EDA / Limpeza de dados / Relatório abrangente |
10. Sugestões para estudos futuros
(1) Pacotes avançados do R
| Bolsa | Finalidade |
|---|---|
| Shiny | Aplicativo web (painel interativo) |
| encanador | API REST (implantação de aprendizado de máquina) |
| tidymodels | Aprendizado de Máquina Moderno (alternativa ao caret) |
| torch | Aprendizado Profundo |
| seta | Big Data (arquivos Parquet) |
(2) Recursos essenciais
| Recurso | Descrição |
|---|---|
| R para Ciência de Dados (2ª ed.) | Livro oficial de Hadley, hadley/r4ds |
| R Avançado (2ª ed.) | Programação Avançada em R |
| ggplot2: Gráficos elegantes | Livro sobre os princípios do ggplot2 |
| R Markdown Cookbook | Geração de relatórios |
| Folhas de referência do RStudio | Cartões de referência rápida |
(3) Projetos do mundo real
- Kaggle (kaggle.com) — Competições de ciência de dados com casos reais
- TidyTuesday (tidytues.day) — Conjuntos de dados semanais gratuitos
- Meus próprios dados (trabalho / hobbies / investimentos)
❓ Perguntas Frequentes
P: Como uso o R Markdown? R: Crie um arquivo
.Rmd(metadados YAML + texto Markdown + blocos de código R).rmarkdown::render()Gere HTML/PDF. Use o botão “Knit” do RStudio para gerar um relatório com um único clique.
P: Qual é a diferença entre .rds e .RData? R: Os arquivos .rds armazenam um único objeto (como um único modelo), enquanto os arquivos .RData armazenam vários objetos (como um espaço de trabalho inteiro). O uso de .rds é uma prática mais comum no novo código.
P: Como faço para implantar um modelo em produção? R: Existem três maneiras: ① Usar o pacote Plumber para criar uma API REST; ② Usar o pacote Vetiver para uma implantação padronizada; ③ Exportar para PMML ou Python para chamada.
P: Como faço para gerenciar meus projetos? R: Use o RStudio Project + o pacote renv (gerenciamento de pacotes) + o Git (controle de versão) + o pacote here (gerenciamento de caminhos).
P: O que posso fazer depois de concluir as 30 aulas? R: Você será capaz de realizar de forma autônoma 80% das tarefas de análise de dados — incluindo leitura de dados, limpeza de dados, análise exploratória de dados (EDA), estatística, modelagem, visualização e elaboração de relatórios. Os 20% restantes (aprendizado de máquina, aprendizado profundo e big data) exigirão estudo adicional.
P: O que devo aprender a seguir? R: ① Aprendizado de máquina (tidymodels) ② Mineração de texto (tidytext) ③ Séries temporais (fable) ④ Painéis do Shiny ⑤ Programação avançada em R. Basta escolher uma área para explorar em profundidade.
📖 Resumo
- 6 etapas de um projeto de ponta a ponta: Dados → Limpeza → Análise exploratória de dados (EDA) → Descrição → Modelagem → Relatórios
- R Markdown = Uma ferramenta de relatórios que combina documentação, código, resultados e gráficos
saveRDSarmazena um único objeto,write_csvarmazena uma tabela eggsavearmazena um gráfico- Projeto RStudio + renv + Git = O trio da ciência de dados
- As 30 aulas abrangem 80% do trabalho envolvido na análise de dados no R; os 20% restantes exigem extensões de aprendizado de máquina/aprendizado profundo.
- Próximo: tidymodels (aprendizado de máquina) / Shiny (painéis) / plumber (API) / tidytext (texto)
- Conceito-chave: Fluxo de trabalho de ponta a ponta, desde os dados até as conclusões = as competências fundamentais de um cientista de dados
- Tutorial concluído — Agora você pode realizar projetos de análise de dados no R de forma independente
📝 Exercícios
Tarefa do Projeto de Conclusão de Curso (Projeto completo de análise de dados de ponta a ponta, Projeto final da Lição 30 do Tutorial de R):
- Seleção de dados: Selecione 1 conjunto de dados público (recomendado: Titanic / Iris / mtcars / mpg / nycflights13)
- Processo completo:
- Passo 1: Ler os dados (usando
readroudatasets) - Fase 2: Limpeza (ausências/anomalias/duplicações/erros de digitação)
- Fase 3: EDA (resumo + skimr + visualização)
- Fase 4: Estatística descritiva (agregada por grupo)
- Etapa 5: Modelagem (lm ou glm)
- Fase 6: Relatório (R Markdown HTML)
- Passo 1: Ler os dados (usando
- Entregáveis:
analysis.RScript principal (mais de 200 linhas)report.RmdRelatório em R Markdown- Mais de 5 gráficos
-
- Resumo das perspectivas de negócios (500 caracteres)
- Critérios de avaliação:
- O código funciona (20 pontos)
- Processo completo (20 pontos)
- Profundidade da análise (20 pontos)
- Gráficos esteticamente agradáveis (20 pontos)
- Legibilidade do relatório (20 pontos) Concluir o projeto de conclusão de curso = Concluir o tutorial de R!
▶ Exemplo: Resumo da Lição 30
# ============================================
# R Tutorial 30 Lesson Study Summary Script
# After running, it outputs the topic for each lesson
# ============================================
lessons <- c(
"01 UnderstandingR", "02 Basic Grammar", "03 Data Types", "04 Vector",
"05 Operators", "06 Control Flow", "07 Function", "08 Matrices and Arrays",
"09 List", "10 Data Frames and Factors",
"11 CSV", "12 Excel", "13 JSON and XML", "14 Database",
"15 String", "16 Regular", "17 Data Reimagined",
"18 Basic Drawing", "19 ggplot2 Getting Started", "20 ggplot2 Advanced",
"21 Theme Customization", "22 Map",
"23 Descriptive Statistics", "24 Probability Distribution", "25 Hypothesis Testing",
"26 Linear Regression", "27 Logistic Regression",
"28 EDA", "29 Data Cleaning", "30 Comprehensive Report"
)
cat("R Tutorial 30 Course List:\n")
for (i in seq_along(lessons)) {
cat(sprintf("%2d. %s\n", i, lessons[i]))
}
Resultado esperado:
R Tutorial 30 Course List:
1. 01 UnderstandingR
2. 02 Basic Grammar
...
30. 30 Comprehensive Report
12. Parabéns por ter concluído a Lição 30 do Tutorial de R
Você concluiu sistematicamente as 30 lições do curso “R Data Science” — desde a sintaxe básica até projetos completos — e está pronto para lidar sozinho com tarefas reais de análise de dados. O próximo passo é a prática hands-on — encontrar dados reais, trabalhar em projetos reais e construir seu portfólio. Desejamos a você todo o sucesso para se tornar um excelente cientista de dados!