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



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

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

100%
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

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:

  1. Visão geral do projeto — Uma breve introdução ao contexto + 3 objetivos de análise
  2. Visão geral dos dados - Carregar dados limpos + resumo do Skimr
  3. Análise exploratória - Taxa de cancelamento + Distribuição por plano + Gráfico de dispersão
  4. Modelo estatístico — Carregue o arquivo churn_model.rds salvo e organize-o para exibir OR
  5. Principais conclusões — lista com marcadores, de 3 a 5 itens OU interpretação
  6. 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.

💡 Dica: O modelo completo do Rmd foi omitido (consulte o gerador oficial de modelos do RMarkdown do RStudio para referência). A estrutura básica consiste em quatro elementos: metadados YAML + blocos de código ```{r} + títulos #/## + texto explicativo.

(3) Gerar um relatório

R
# 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:



9. Percurso de aprendizagem completo com tutoriais sobre R

(1) 5 etapas

100%
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


❓ 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



📝 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):

  1. Seleção de dados: Selecione 1 conjunto de dados público (recomendado: Titanic / Iris / mtcars / mpg / nycflights13)
  2. Processo completo:
    • Passo 1: Ler os dados (usando readr ou datasets)
    • 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)
  3. Entregáveis:
    • analysis.R Script principal (mais de 200 linhas)
    • report.Rmd Relatório em R Markdown
    • Mais de 5 gráficos
      1. Resumo das perspectivas de negócios (500 caracteres)
  4. 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
# ============================================
# 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]))
}
▶ Experimente

Resultado esperado:

TEXT 📖 Somente leitura
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!

Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%