Coleta de Dados e Qualidade dos Dados

Planejar a Coleta de Dados e Identificar Problemas de Qualidade

Autor

Márcio Nicolau

Data de Publicação

29 de outubro de 2025

Introdução e Objetivos

Nas aulas anteriores, exploramos as distribuições de probabilidade, amostragem, estimação e a lógica dos testes de hipóteses. Todos esses conceitos, por mais sofisticados que sejam, dependem fundamentalmente de uma base crucial: dados de boa qualidade. De nada adianta aplicar as técnicas mais avançadas de análise se os dados de entrada são falhos, incompletos ou viesados.

A coleta de dados é a primeira e uma das mais importantes etapas em qualquer projeto de análise. Um planejamento cuidadoso nesta fase pode prevenir inúmeros problemas futuros. No entanto, mesmo com o melhor planejamento, os dados raramente vêm perfeitos. A qualidade dos dados refere-se à sua adequação para o uso pretendido, e a identificação e tratamento de problemas de qualidade são habilidades essenciais para qualquer cientista de dados.

Nesta aula, abordaremos o processo de planejamento da coleta de dados, os métodos comuns de aquisição e, em seguida, focaremos nas dimensões da qualidade dos dados e nos problemas mais frequentes que podem surgir, ilustrando como identificá-los usando Python e R.

Objetivos de Aprendizagem

Ao final desta aula, você será capaz de:

  • Compreender a importância do planejamento na coleta de dados.
  • Identificar diferentes métodos para coletar dados.
  • Definir as principais dimensões da qualidade dos dados.
  • Reconhecer problemas comuns de qualidade nos dados (ausentes, outliers, inconsistências, duplicatas).
  • Utilizar Python e R para realizar verificações básicas de qualidade dos dados.
  • Entender a relação entre a qualidade dos dados e a validade da análise estatística.

O Processo de Coleta de Dados

A coleta de dados é o processo sistemático de reunir e medir informações de uma variedade de fontes para obter um quadro completo e preciso de uma área de interesse. Uma coleta bem-sucedida garante que os dados sejam relevantes, precisos e confiáveis.

Etapas Essenciais no Planejamento da Coleta

  1. Definição Clara do Objetivo e da Pergunta de Pesquisa:
    • O que você quer descobrir? Quais perguntas você quer responder? Isso direciona todo o processo.
  2. Identificação da População de Interesse:
    • Quem ou o que você quer estudar? (Pessoas, empresas, transações, etc.).
  3. Escolha do Método de Coleta:
    • Como você vai obter os dados? (Pesquisas, observação, sensores, dados existentes, etc.).
  4. Seleção da Amostra (se aplicável):
    • Se um censo não for viável, como você selecionará um subconjunto representativo da população? (Revisar Amostragem e Tipos de Amostras).
  5. Desenvolvimento dos Instrumentos de Coleta:
    • Formulários, questionários, roteiros de entrevista, protocolos de observação.
  6. Definição do Formato e Armazenamento dos Dados:
    • Como os dados serão estruturados e onde serão armazenados? (Planilhas, bancos de dados, arquivos de texto).
  7. Plano de Qualidade e Limpeza:
    • Como você garantirá a qualidade dos dados durante e após a coleta?
  8. Considerações Éticas e de Privacidade:
    • Como garantir a confidencialidade e o consentimento dos participantes?

Diagrama do Fluxo de Planejamento da Coleta de Dados

graph TD
    A[Início: Definir Objetivo/Pergunta] --> B(Identificar População);
    B --> C(Escolher Método de Coleta);
    C --> D{Precisa de Amostragem?};
    D -- Sim --> E(Definir Plano de Amostragem);
    D -- Não --> F(Censo - Coletar de Todos);
    E --> G(Desenvolver Instrumentos);
    F --> G;
    G --> H(Definir Formato/Armazenamento);
    H --> I(Estabelecer Plano de Qualidade);
    I --> J(Revisar Ética/Privacidade);
    J --> K[Fim: Coleta Pronta para Iniciar];

    classDef startEnd fill:#f9f,stroke:#333,stroke-width:2px;
    classDef process fill:#e6f3ff,stroke:#007bff;
    classDef decision fill:#ffe0b3,stroke:#ffc107;
    class A,K startEnd;
    class B,C,E,F,G,H,I,J process;
    class D decision;
Figura 1: Fluxo de Planejamento da Coleta de Dados

Métodos de Coleta de Dados

A escolha do método depende da natureza do estudo, dos recursos disponíveis e do tipo de dados que se deseja coletar.

  1. Pesquisas (Questionários e Entrevistas):

    • Questionários: Conjunto padronizado de perguntas, autoaplicável ou assistido, para coletar dados de um grande número de pessoas.
      • Vantagens: Eficiente, padronizado.
      • Desvantagens: Rigidez, baixa taxa de resposta para autoaplicáveis.
    • Entrevistas: Interação direta com os participantes, permitindo aprofundamento e flexibilidade.
      • Vantagens: Riqueza de detalhes, adaptabilidade.
      • Desvantagens: Demorado, caro, viés do entrevistador.
  2. Observação:

    • O pesquisador observa comportamentos, eventos ou fenômenos em seu ambiente natural, sem intervenção.
      • Vantagens: Coleta dados em tempo real, capta nuances.
      • Desvantagens: Pode ser influenciado pela presença do observador, demorado.
  3. Dados Secundários (Bases Existentes, Web Scraping):

    • Utilização de dados que já foram coletados por outras fontes para outros propósitos.
      • Vantagens: Rápido, baixo custo, acesso a grandes volumes de dados.
      • Desvantagens: Qualidade e relevância podem ser limitadas, dados podem estar desatualizados ou não serem adequados ao objetivo.
      • Web Scraping: Extração de dados de websites.
        • Cuidado: Respeitar termos de serviço e legalidade.
  4. Experimentos:

    • Manipulação de uma ou mais variáveis (independentes) para observar o efeito em outras variáveis (dependentes) em um ambiente controlado.
      • Vantagens: Permite estabelecer relações de causa e efeito.
      • Desvantagens: Pode ser artificial, questões éticas, caro.
  5. Sensores e IoT (Internet das Coisas):

    • Dispositivos que coletam dados automaticamente do ambiente físico (temperatura, umidade, localização, atividade).
      • Vantagens: Coleta contínua e em tempo real, grande volume.
      • Desvantagens: Custo de infraestrutura, desafios de armazenamento e processamento.

Qualidade dos Dados

A qualidade dos dados refere-se ao grau em que os dados são adequados para um propósito específico. Dados de baixa qualidade podem levar a análises incorretas, insights enganosos e decisões ruins.

Dimensões Chave da Qualidade dos Dados

(Bussab; Morettin, 2017, p. 11–12)

  1. Acurácia (Exatidão): Os dados refletem a realidade de forma verdadeira e correta?
    • Exemplo: Um registro de salário realmente corresponde ao salário pago ao funcionário.
  2. Completude: Todos os valores esperados estão presentes? Não há valores ausentes onde deveriam existir.
    • Exemplo: Nenhuma entrada para “idade” está vazia em um formulário obrigatório.
  3. Consistência: Os dados são coerentes entre si e com outras fontes? Não há contradições.
    • Exemplo: O CEP de um endereço corresponde à cidade e estado informados. A data de nascimento não é posterior à data atual.
  4. Pontualidade (Atualidade): Os dados são recentes o suficiente para o propósito da análise?
    • Exemplo: Dados de estoque refletem a quantidade atual de produtos disponíveis.
  5. Validade: Os dados estão em conformidade com as regras de negócio e os formatos definidos?
    • Exemplo: Um número de telefone tem 9 dígitos, um campo “gênero” só aceita ‘M’ ou ‘F’.
  6. Unicidade: Não há registros duplicados para a mesma entidade.
    • Exemplo: Cada cliente é representado por um único registro no banco de dados.

Problemas Comuns na Qualidade dos Dados e Como Identificá-los

Mesmo com um bom planejamento, problemas de qualidade são inevitáveis. A capacidade de identificá-los é o primeiro passo para a limpeza.

Valores Ausentes (Missing Values)

Dados que não foram registrados ou estão indisponíveis. Podem ser representados por NaN, NA, None, 0, espaços em branco, ou valores específicos como -99.

  • Impacto: Podem causar erros em cálculos, viesar análises ou reduzir o poder estatístico.
  • Identificação: Verificação de null ou valores sentinela.

Exemplo: Identificando Valores Ausentes

import pandas as pd
import numpy as np

data = {'ID':,
        'Nome': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
        'Idade': [25, np.nan, 30, 28, np.nan],
        'Renda': [50000, 60000, np.nan, 70000, 55000]}
df = pd.DataFrame(data)

print("DataFrame original com valores ausentes:")
print(df)

print("\nVerificação de valores ausentes (True para ausente):")
print(df.isnull())

print("\nContagem de valores ausentes por coluna:")
print(df.isnull().sum())

print("\nProporção de valores ausentes por coluna:")
print(df.isnull().sum() / len(df) * 100)
df <- data.frame(
  ID = c(1, 2, 3, 4, 5),
  Nome = c('Alice', 'Bob', 'Charlie', 'David', 'Eve'),
  Idade = c(25, NA, 30, 28, NA),
  Renda = c(50000, 60000, NA, 70000, 55000)
)

cat("DataFrame original com valores ausentes:\n")
print(df)

cat("\nVerificação de valores ausentes (TRUE para ausente):\n")
print(is.na(df))

cat("\nContagem de valores ausentes por coluna:\n")
print(colSums(is.na(df)))

cat("\nProporção de valores ausentes por coluna:\n")
print(colMeans(is.na(df)) * 100)

Outliers (Valores Atípicos)

Observações que se afastam significativamente dos demais dados. Podem ser erros de registro ou eventos genuinamente raros.

  • Impacto: Distorcem médias, desvio padrão, variância e podem influenciar negativamente modelos estatísticos.
  • Identificação: Box plots, histogramas, análise de desvio padrão (valores a mais de 2 ou 3 desvios padrão da média), métodos estatísticos (Z-score, IQR).

Exemplo: Identificando Outliers (Visualmente com Box Plot)

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

# Criando um dataset com outliers
data_outliers = pd.DataFrame({'Valor':})

plt.figure(figsize=(8, 5))
sns.boxplot(y=data_outliers['Valor'])
plt.title('Identificação de Outliers com Box Plot')
plt.ylabel('Valor')
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()

# Identificação numérica (ex: usando Z-score)
mean_val = data_outliers['Valor'].mean()
std_val = data_outliers['Valor'].std()
data_outliers['Z_Score'] = (data_outliers['Valor'] - mean_val) / std_val
print("\nDataFrame com Z-scores:")
print(data_outliers)
print("\nOutliers (Z-score > 2 ou < -2):")
print(data_outliers[(data_outliers['Z_Score'].abs() > 2)])
library(ggplot2)

# Criando um dataset com outliers
df_outliers <- data.frame(Valor = c(10, 12, 11, 13, 10, 12, 100, 9, 11, 13))

ggplot(df_outliers, aes(y = Valor)) +
  geom_boxplot(fill = "lightblue") +
  labs(title = 'Identificação de Outliers com Box Plot', y = 'Valor') +
  theme_minimal()

# Identificação numérica (ex: usando Z-score)
mean_val <- mean(df_outliers$Valor)
std_val <- sd(df_outliers$Valor)
df_outliers$Z_Score <- (df_outliers$Valor - mean_val) / std_val
cat("\nDataFrame com Z-scores:\n")
print(df_outliers)
cat("\nOutliers (Z-score > 2 ou < -2):\n")
print(df_outliers[abs(df_outliers$Z_Score) > 2, ])

Inconsistências e Formatos Incorretos

Erros de digitação, uso de diferentes formatos para a mesma informação, unidades de medida misturadas, etc.

  • Impacto: Dificultam a análise, agregação e comparação de dados.
  • Identificação: Análise de valores únicos (value_counts() em Pandas, table() em R), expressões regulares, limites de validação.

Exemplo: Identificando Inconsistências

import pandas as pd

data_inconsistente = {'País': ['Brasil', 'Brazil', 'ARGENTINA', 'Chile', 'brasil '],
                      'Capital': ['Brasília', 'Brasilia', 'Buenos Aires', 'Santiago', 'Brasilia']}
df_inc = pd.DataFrame(data_inconsistente)

print("DataFrame com inconsistências:")
print(df_inc)

print("\nValores únicos na coluna 'País' antes da limpeza:")
print(df_inc['País'].value_counts())

# Exemplo de limpeza simples
df_inc['País_Limpo'] = df_inc['País'].str.strip().str.capitalize()
print("\nValores únicos na coluna 'País_Limpo' após limpeza simples:")
print(df_inc['País_Limpo'].value_counts())
df_inc <- data.frame(
  País = c('Brasil', 'Brazil', 'ARGENTINA', 'Chile', 'brasil '),
  Capital = c('Brasília', 'Brasilia', 'Buenos Aires', 'Santiago', 'Brasilia')
)

cat("DataFrame com inconsistências:\n")
print(df_inc)

cat("\nValores únicos na coluna 'País' antes da limpeza:\n")
print(table(df_inc$País))

# Exemplo de limpeza simples
df_inc$País_Limpo <- tolower(trimws(df_inc$País))
df_inc$País_Limpo <- Hmisc::capitalize(df_inc$País_Limpo) # Necessita do pacote Hmisc
cat("\nValores únicos na coluna 'País_Limpo' após limpeza simples:\n")
print(table(df_inc$País_Limpo))

Duplicatas

Registros idênticos ou muito semelhantes que representam a mesma entidade.

  • Impacto: Inflam o tamanho do dataset, viesam contagens e podem distorcer análises estatísticas.
  • Identificação: duplicated() em Pandas/R, identificação por um subconjunto de colunas.

Exemplo: Identificando Duplicatas

import pandas as pd

data_duplicada = {'ID':,
                  'Nome': ['Alice', 'Bob', 'Charlie', 'Alice', 'David'],
                  'Idade':}
df_dup = pd.DataFrame(data_duplicada)

print("DataFrame com duplicatas:")
print(df_dup)

print("\nVerificação de linhas duplicadas (True se a linha é uma duplicata posterior):")
print(df_dup.duplicated())

print("\nRegistros duplicados (incluindo o primeiro):")
print(df_dup[df_dup.duplicated(keep=False)]) # keep=False mostra todas as ocorrências de duplicatas
df_dup <- data.frame(
  ID = c(1, 2, 3, 1, 4),
  Nome = c('Alice', 'Bob', 'Charlie', 'Alice', 'David'),
  Idade = c(25, 30, 35, 25, 28)
)

cat("DataFrame com duplicatas:\n")
print(df_dup)

cat("\nVerificação de linhas duplicadas (TRUE se a linha é uma duplicata posterior):\n")
print(duplicated(df_dup))

cat("\nRegistros duplicados (incluindo o primeiro):\n")
print(df_dup[duplicated(df_dup) | duplicated(df_dup, fromLast = TRUE), ])

Dados Desatualizados

Informações que não são mais relevantes ou precisas devido à passagem do tempo.

  • Impacto: Leva a decisões baseadas em informações incorretas sobre o estado atual.
  • Identificação: Campos de data/hora, comparação com fontes externas, regras de negócio para validade temporal.

Vieses na Coleta

Introdução de erro sistemático na amostra ou no processo de coleta, fazendo com que a amostra não seja representativa da população.

  • Impacto: Distorce completamente a capacidade de generalizar os resultados.
  • Identificação: Requer um entendimento profundo do processo de amostragem (revisitar a aula de Amostragem) e do contexto do negócio.

Relação com Outros Conceitos

A qualidade dos dados é a base para a confiabilidade de todas as análises subsequentes.

  • Estatística Descritiva e AED: Medidas de tendência central e dispersão, assim como visualizações, podem ser severamente distorcidas por dados de baixa qualidade (outliers, valores ausentes).
  • Amostragem: Vieses na coleta comprometem a representatividade da amostra, invalidando qualquer inferência.
  • Estimação e Testes de Hipóteses: Intervalos de confiança e p-valores dependem da suposição de dados válidos e aleatoriamente coletados. Dados ruins levam a estimativas imprecisas e conclusões de testes errôneas.
  • Modelagem (ML/IA): Modelos aprendem com os dados. Se os dados são “lixo”, o modelo também será “lixo” (GIGO - Garbage In, Garbage Out).
graph TD
    A[Planejamento da Coleta] --> B(Coleta de Dados);
    B --> C(Qualidade dos Dados);
    C -- Alta Qualidade --> D(Análise Confiável);
    C -- Baixa Qualidade --> E(Análise Viciada/Inconsistente);
    D --> F(AED, Estimação, Testes de Hipóteses);
    E --> G(Decisões Ruim / Modelos Falhos);
    F --> H[Insights e Decisões Sólidas];
    G --> I[Problemas Operacionais/Estratégicos];

    style A fill:#a7e9ff,stroke:#3b82f6,stroke-width:2px;
    style B fill:#ffe0b3,stroke:#ffc107;
    style C fill:#d4edda,stroke:#28a745;
    style D fill:#c8e6c9,stroke:#4caf50;
    style E fill:#f8bbd0,stroke:#e91e63;
    style F fill:#bbdefb,stroke:#2196f3;
    style G fill:#dc3545,stroke:#dc3545;
    style H fill:#afa,stroke:#333,stroke-width:2px;
    style I fill:#333,stroke:#333,color:#fff;
Figura 2: Relação da Qualidade dos Dados com Outros Conceitos Estatísticos

Verificação de Aprendizagem

Responda às perguntas e realize a tarefa prática para verificar sua compreensão sobre coleta e qualidade dos dados.

  1. Conceitos de Qualidade:

    1. Você está analisando um dataset de vendas e percebe que algumas datas de transação estão no futuro (ex: 2026). Qual dimensão da qualidade dos dados está sendo comprometida?
    2. Ao coletar dados de clientes, você observa que o campo “email” está vazio para 40% dos registros. Qual dimensão da qualidade dos dados é mais afetada aqui?
    3. Explique brevemente por que a unicidade dos dados é importante.
  2. Métodos de Coleta:

    Qual método de coleta de dados seria mais apropriado para cada cenário e por quê?

    1. Estimar o tempo médio que os carros levam para passar por um semáforo durante o horário de pico.
    2. Entender as percepções profundas e experiências de pacientes com uma nova terapia.
    3. Obter dados históricos de preços de ações de uma empresa nos últimos 10 anos.
  3. Problema Prático (Identificação de Problemas de Qualidade):

    Considere o seguinte conjunto de dados (simulado) de informações de clientes. Sua tarefa é carregá-lo em Python ou R e identificar os problemas de qualidade.

    ID,Nome,Idade,Renda,Cidade,Status_Cliente
    1,Ana Silva,30,5000,São Paulo,Ativo
    2,Bruno Costa,NA,6000,Rio de Janeiro,Inativo
    3,Carla Dias,25,4500,São Paulo,Ativo
    4,Ana Silva,30,5000,São Paulo,Ativo
    5,Daniel Alves,40,7000,BH,Ativo
    6,Eduarda F.,22,NaN,Curitiba,Ativo
    7,Fábio G.,999,8000,São Paulo,Ativo
    8,Helena I.,35,5500,são paulo,Ativo
    9,IgOR J.,28,6200,RIO DE JANEIRO,Ativo
    10,Julia K.,50,4800,São Paulo,Ativo
    11,Luís L.,-5,7500,Porto Alegre,Ativo
    12,Mariana N.,45,120000,Recife,Ativo
    1. Carregue os dados em um DataFrame/data.frame.
    2. Identifique e conte os valores ausentes.
    3. Identifique e conte os registros duplicados (considerando todas as colunas).
    4. Identifique possíveis outliers ou valores inválidos nas colunas Idade e Renda.
    5. Identifique inconsistências de capitalização/formato nas colunas Cidade e Nome.

1. Conceitos de Qualidade:

  1. Pontualidade (ou Atualidade), pois os dados (datas futuras) não representam um estado real e presente das transações.
  2. Completude, pois há uma grande proporção de informações faltando para o campo “email”.
  3. A unicidade dos dados é importante para garantir que cada entidade (ex: cliente, produto) seja representada apenas uma vez no dataset. A falta de unicidade (duplicatas) pode levar a contagens inflacionadas, análises estatísticas viesadas (ex: média, proporção) e alocação incorreta de recursos, pois os mesmos dados seriam considerados múltiplas vezes como entidades distintas.

2. Métodos de Coleta:

  1. Observação (ou Sensores): Estimar o tempo de passagem de carros por um semáforo é um comportamento que pode ser medido sem intervenção. Sensores de tráfego poderiam coletar dados automaticamente, ou um observador humano poderia registrar os tempos.
  2. Entrevistas (qualitativas): Para entender “percepções profundas e experiências”, é necessário um método que permita explorar nuances, emoções e narrativas pessoais, o que questionários padronizados não conseguiriam captar em sua totalidade.
  3. Dados Secundários (ou Web Scraping): Dados históricos de preços de ações já estão disponíveis em bolsas de valores, sites financeiros ou APIs de dados. Seria ineficiente e desnecessário coletá-los primariamente.

3. Problema Prático (Identificação de Problemas de Qualidade):

Dados:

ID,Nome,Idade,Renda,Cidade,Status_Cliente
1,Ana Silva,30,5000,São Paulo,Ativo
2,Bruno Costa,NA,6000,Rio de Janeiro,Inativo
3,Carla Dias,25,4500,São Paulo,Ativo
4,Ana Silva,30,5000,São Paulo,Ativo
5,Daniel Alves,40,7000,BH,Ativo
6,Eduarda F.,22,NaN,Curitiba,Ativo
7,Fábio G.,999,8000,São Paulo,Ativo
8,Helena I.,35,5500,são paulo,Ativo
9,IgOR J.,28,6200,RIO DE JANEIRO,Ativo
10,Julia K.,50,4800,São Paulo,Ativo
11,Luís L.,-5,7500,Porto Alegre,Ativo
12,Mariana N.,45,120000,Recife,Ativo
import pandas as pd
import numpy as np

# a) Carregar os dados
from io import StringIO
csv_data = """ID,Nome,Idade,Renda,Cidade,Status_Cliente
1,Ana Silva,30,5000,São Paulo,Ativo
2,Bruno Costa,NA,6000,Rio de Janeiro,Inativo
3,Carla Dias,25,4500,São Paulo,Ativo
4,Ana Silva,30,5000,São Paulo,Ativo
5,Daniel Alves,40,7000,BH,Ativo
6,Eduarda F.,22,NaN,Curitiba,Ativo
7,Fábio G.,999,8000,São Paulo,Ativo
8,Helena I.,35,5500,são paulo,Ativo
9,IgOR J.,28,6200,RIO DE JANEIRO,Ativo
10,Julia K.,50,4800,São Paulo,Ativo
11,Luís L.,-5,7500,Porto Alegre,Ativo
12,Mariana N.,45,120000,Recife,Ativo
"""
df = pd.read_csv(StringIO(csv_data))

print("a) DataFrame Carregado:")
print(df)
print("\n" + "="*50 + "\n")

# b) Identificar e contar valores ausentes
print("b) Identificação e contagem de valores ausentes:")
print(df.isnull().sum())
print("\nColunas com valores ausentes: 'Idade' (1), 'Renda' (1).")
print("\n" + "="*50 + "\n")

# c) Identificar e contar registros duplicados
print("c) Identificação e contagem de registros duplicados:")
duplicados = df[df.duplicated(keep=False)] # keep=False mostra todas as ocorrências de duplicatas
print(f"Número total de linhas duplicadas: {df.duplicated().sum()}")
print("Registros duplicados (incluindo o original e sua duplicata):")
print(duplicados)
print("\nRegistro duplicado: A linha com ID 4 ('Ana Silva', 30, 5000, 'São Paulo', 'Ativo') é uma duplicata da linha com ID 1.")
print("\n" + "="*50 + "\n")

# d) Identificar possíveis outliers ou valores inválidos nas colunas Idade e Renda
print("d) Identificação de outliers/valores inválidos em 'Idade' e 'Renda':")
print("Estatísticas descritivas para Idade:")
print(df['Idade'].describe())
print("Estatísticas descritivas para Renda:")
print(df['Renda'].describe())

print("\nOutliers/Valores Inválidos:")
print(f"- Idade: {df[df['Idade'] == 999]['Idade'].iloc} (muito alta, provável erro).")
print(f"- Idade: {df[df['Idade'] == -5]['Idade'].iloc} (valor negativo, inválido).")
print(f"- Renda: {df[df['Renda'] == 120000]['Renda'].iloc} (muito alta em relação às demais, provável outlier ou erro).")
print("\n" + "="*50 + "\n")

# e) Identificar inconsistências de capitalização/formato nas colunas Cidade e Nome
print("e) Identificação de inconsistências de capitalização/formato:")
print("Valores únicos na coluna 'Cidade' antes da limpeza:")
print(df['Cidade'].value_counts())
print("\nInconsistências em 'Cidade': 'São Paulo' e 'são paulo', 'Rio de Janeiro' e 'RIO DE JANEIRO', 'BH' (provável abreviação).")

print("\nValores únicos na coluna 'Nome' antes da limpeza:")
print(df['Nome'].value_counts())
print("\nInconsistências em 'Nome': 'IgOR J.' (capitalização mista).")
library(dplyr)
library(stringr)

# a) Carregar os dados
csv_data <- "ID,Nome,Idade,Renda,Cidade,Status_Cliente
1,Ana Silva,30,5000,São Paulo,Ativo
2,Bruno Costa,NA,6000,Rio de Janeiro,Inativo
3,Carla Dias,25,4500,São Paulo,Ativo
4,Ana Silva,30,5000,São Paulo,Ativo
5,Daniel Alves,40,7000,BH,Ativo
6,Eduarda F.,22,NA,Curitiba,Ativo
7,Fábio G.,999,8000,São Paulo,Ativo
8,Helena I.,35,5500,são paulo,Ativo
9,IgOR J.,28,6200,RIO DE JANEIRO,Ativo
10,Julia K.,50,4800,São Paulo,Ativo
11,Luís L.,-5,7500,Porto Alegre,Ativo
12,Mariana N.,45,120000,Recife,Ativo
"
df <- read.csv(text = csv_data, na.strings = "NA") # read.csv já trata "NA" e "NaN" por padrão

cat("a) DataFrame Carregado:\n")
print(df)
cat("\n==================================================\n\n")

# b) Identificar e contar valores ausentes
cat("b) Identificação e contagem de valores ausentes:\n")
print(colSums(is.na(df)))
cat("\nColunas com valores ausentes: 'Idade' (1), 'Renda' (1).\n")
cat("\n==================================================\n\n")

# c) Identificar e contar registros duplicados
cat("c) Identificação e contagem de registros duplicados:\n")
duplicados <- df[duplicated(df) | duplicated(df, fromLast = TRUE), ]
cat(sprintf("Número total de linhas duplicadas (contando apenas a segunda ocorrência como duplicata): %d\n", sum(duplicated(df))))
cat("Registros duplicados (incluindo o original e sua duplicata):\n")
print(duplicados)
cat("\nRegistro duplicado: A linha com ID 4 ('Ana Silva', 30, 5000, 'São Paulo', 'Ativo') é uma duplicata da linha com ID 1.\n")
cat("\n==================================================\n\n")

# d) Identificar possíveis outliers ou valores inválidos nas colunas Idade e Renda
cat("d) Identificação de outliers/valores inválidos em 'Idade' e 'Renda':\n")
cat("Estatísticas descritivas para Idade:\n")
print(summary(df$Idade))
cat("Estatísticas descritivas para Renda:\n")
print(summary(df$Renda))

cat("\nOutliers/Valores Inválidos:\n")
cat(sprintf("- Idade: %d (muito alta, provável erro).\n", df$Idade[df$Idade == 999]))
cat(sprintf("- Idade: %d (valor negativo, inválido).\n", df$Idade[df$Idade == -5]))
cat(sprintf("- Renda: %d (muito alta em relação às demais, provável outlier ou erro).\n", df$Renda[df$Renda == 120000]))
cat("\n==================================================\n\n")

# e) Identificar inconsistências de capitalização/formato nas colunas Cidade e Nome
cat("e) Identificação de inconsistências de capitalização/formato:\n")
cat("Valores únicos na coluna 'Cidade' antes da limpeza:\n")
print(table(df$Cidade))
cat("\nInconsistências em 'Cidade': 'São Paulo' e 'são paulo', 'Rio de Janeiro' e 'RIO DE JANEIRO', 'BH' (provável abreviação).\n")

cat("\nValores únicos na coluna 'Nome' antes da limpeza:\n")
print(table(df$Nome))
cat("\nInconsistências em 'Nome': 'IgOR J.' (capitalização mista).\n")

Sumário dos Problemas Identificados:

  • Valores Ausentes: Colunas Idade (1 NA) e Renda (1 NaN).
  • Duplicatas: A linha de ID=4 (‘Ana Silva’, 30, 5000, ‘São Paulo’, ‘Ativo’) é uma duplicata exata da linha de ID=1.
  • Outliers/Valores Inválidos:
    • Idade: Valor 999 (linha 7, provável erro de digitação para idade) e -5 (linha 11, idade inválida).
    • Renda: Valor 120000 (linha 12, pode ser um outlier legítimo ou erro, mas se destaca muito).
  • Inconsistências de Formato/Capitalização:
    • Cidade: ‘São Paulo’ vs. ‘são paulo’, ‘Rio de Janeiro’ vs. ‘RIO DE JANEIRO’, ‘BH’ (abreviação que pode precisar ser padronizada para ‘Belo Horizonte’).
    • Nome: ‘IgOR J.’ (capitalização inconsistente, deve ser padronizada, ex: ‘Igor J.’).

Referências Bibliográficas

BUSSAB, Luiz O. de M.; MORETTIN, Pedro A. Estatı́stica Básica. 9. ed. São Paulo: Saraiva, 2017.