Código
dados <- read.csv2(
"base_processamento_dados_engenharia_civil.csv",
stringsAsFactors = FALSE,
check.names = FALSE
)Estatística e Probabilidade
Prof. Ben Dêivide (DEFIM/CAP/UFSJ)
dados <- read.csv2(
"base_processamento_dados_engenharia_civil.csv",
stringsAsFactors = FALSE,
check.names = FALSE
)A garantia do desempenho mecânico e da durabilidade das estruturas de concreto armado é intrinsecamente dependente da rigidez metodológica empregada no controle tecnológico dos materiais cimentícios. Em conformidade com as diretrizes das normas brasileiras ABNT NBR 12655 (Associação Brasileira de Normas Técnicas, 2015a), ABNT NBR 5738 (Associação Brasileira de Normas Técnicas, 2015b), ABNT NBR 5739 (Associação Brasileira de Normas Técnicas, 2018) e ABNT NBR 6118 (Associação Brasileira de Normas Técnicas, 2023), a verificação das propriedades do concreto no estado fresco (consistência pelo abatimento do tronco de cone) e no estado endurecido (resistência à compressão axial) exige rastreabilidade rigorosa na amostragem e no registro dos dados.
Contudo, na prática da gestão de infraestrutura urbana e rodoviária, a coleta descentralizada de dados operacionais conduzida por múltiplos profissionais e técnicos frequentemente introduz um ruído amostral significativo (Mehta e Monteiro, 2014). Tais inconsistências incluem dados ausentes, erros de digitação de caracteres, deslocamento de escala decimal e falhas de padronização categórica. A condução de análises estatísticas descritivas ou inferenciais sobre bancos de dados não higienizados compromete os modelos de decisão técnica e a avaliação de conformidade estrutural (\(f_{est} \ge f_{ck}\)).
Este estudo aborda a aplicação de uma rotina automatizada de diagnóstico, limpeza e análise estatística descritiva em uma amostra de 100 corpos de prova e 10 variáveis do controle tecnológico do concreto, utilizando o ambiente computacional Base R (R Core Team, 2024).
[1] 100 10
[1] 100
[1] 10
Desenvolver e aplicar uma rotina automatizada de inspeção, diagnóstico, higienização e análise estatística descritiva em um banco de dados de controle tecnológico do concreto, utilizando o ambiente computacional Base R, de modo a transformar dados operacionais brutos provenientes de canteiros de obra em informações estruturadas e confiáveis para o suporte à tomada de decisão na Engenharia Civil.
Inspecionar e diagnosticar a base de dados bruta: Identificar falhas de preenchimento, inconsistências de tipo (coerção estática de variáveis numéricas em character), erros de digitação e a presença de dados ausentes (\(NA\)).
Implementar rotinas automatizadas de tratamento e limpeza: Padronizar categorias qualitativas, converter tipos de variáveis, corrigir desvios de escala/ordem de grandeza e tratar dados ausentes por meio de imputação condicional estocástica baseada nas características dos traços.
Caracterizar o comportamento mecânico e reológico: Avaliar o desempenho dos concretos (\(C25, C30, C35, C40\)) por meio de métricas agregadas, correlacionando o consumo de cimento e a relação água/cimento (\(\text{a/c}\)) com os preceitos teóricos da Lei de Abrams (Abrams, 1918) e das normas brasileiras aplicáveis (Associação Brasileira de Normas Técnicas, 2015a; b; 2018; 2023)].
Desenvolver variáveis derivadas de aceitação estrutural: Criar indicadores de conformidade e desempenho relativo em relação ao \(f_{ck}\) de projeto e às médias amostrais das respectivas classes.
Avaliar a eficiência algorítmica em Base R: Comparar o desempenho computacional e a sintaxe de soluções iterativas tradicionais (laços for e condicionais if) frente a abordagens vetorizadas e funcionais (aggregate, ave, split, apply, lapply e sapply) (R Core Team, 2024; Wickham, 2019).
A análise e o processamento de dados do controle tecnológico do concreto exigem um duplo embasamento: a fundamentação nas leis físico-químicas e normativas da Engenharia Civil e os princípios computacionais de estruturação, higienização e estatística descritiva em R (Batista e Oliveira, 2022; R Core Team, 2024).
O controle de qualidade do concreto em canteiros de obras no Brasil é regulamentado por um conjunto de normas da Associação Brasileira de Normas Técnicas (ABNT)(Batista e Oliveira, 2022; R Core Team, 2024):
Formulada por Duff Abrams (1918) (Abrams, 1918), a lei fundamental da tecnologia do concreto estabelece que a resistência à compressão de uma mistura totalmente adensada é inversamente proporcional à razão entre o volume de água livre (\(V_a\)) e o volume de cimento (\(V_c\)) (MEHTA; MONTEIRO, 2014; NEVILLE, 2016)(Mehta e Monteiro, 2014; Neville, 2016):
\[f_c = \frac{A}{B^{(\text{a/c})}}\]
Onde:
Esta relação fundamenta a investigação da redução observada da resistência à compressão conforme se eleva a relação água/cimento (Questões 20 e 33)[cite: 1, 2, 5].
O consumo de cimento por metro cúbico (\(C\), em \(\text{kg/m}^3\)) relaciona-se com a densidade aparente do concreto fresco (\(\rho\), em \(\text{kg/m}^3\)) e com a proporção dos materiais no traço em massa (\(1 : m : \text{a/c}\)) (HELENE; TERZIAN, 1992)(Helene e Terzian, 1992):
\[C = \frac{\rho}{1 + m + \text{a/c}}\]
Onde \(m\) é a proporção total de agregados secos em relação à massa de cimento[cite: 5]. Esta formulação embasa a análise do impacto do teor de cimento no desempenho mecânico (Questões 20 e 32)[cite: 1, 2, 5].
O ganho de resistência decorre das reações de hidratação do cimento Portland (Mehta e Monteiro, 2014). O modelo de amadurecimento prescrito pela ABNT NBR 6118 (Associação Brasileira de Normas Técnicas, 2023) é dado por:
\[f_{ck}(t) = \beta_1(t) \cdot f_{ck}(28) \quad \text{com} \quad \beta_1(t) = \exp \left\{ s \cdot \left[ 1 - \sqrt{\frac{28}{t}} \right] \right\}\]
Onde \(t\) representa a idade em dias no momento do ensaio e \(s\) é o coeficiente empírico do tipo de cimento. Esta relação sustenta a análise da evolução da resistência aos 7, 14, 28 e 56 dias (Questão 34).
Para a verificação individual de cada corpo de prova em relação à especificação do projeto, define-se o indicador adimensional de Resistência Relativa (\(R_{rel}\)) (Questão 21) confrome a ABNT NBR 12655 (Associação Brasileira de Normas Técnicas, 2015a) e ABNT NBR 6118 (Associação Brasileira de Normas Técnicas, 2023):
\[R_{rel} = \frac{f_{c,obs}}{f_{ck}}\]
A regra de decisão para classificação do elemento (Questão 22) é estabelecida por[cite: 1, 2, 5]:
\[\text{Classificação} = \begin{cases} \text{"Conforme"}, & \text{se } R_{rel} \ge 1{,}0 \\ \text{"Não Conforme"}, & \text{se } R_{rel} < 1{,}0 \end{cases}\]
A caracterização das variáveis de controle tecnológico do concreto exige a quantificação da tendência central e da variabilidade de produção (HELENE; TERZIAN, 1992)(Helene e Terzian, 1992):
\[\bar{X} = \frac{1}{n} \sum_{i=1}^{n} X_i\]
\[s = \sqrt{\frac{1}{n - 1} \sum_{i=1}^{n} (X_i - \bar{X})^2}\]
Onde \(n\) é o número de corpos de prova testados e \(X_i\) é a propriedade medida (\(\text{MPa}\), \(\text{mm}\), \(\text{kg/m}^3\))[cite: 1, 2, 5].
O controle de qualidade da dosagem da usina ou da betoneira é avaliado pelo Coeficiente de Variação (\(\text{CV}\)), expressando a dispersão relativa da resistência[cite: 5]:
\[\text{CV} = \left( \frac{s}{\bar{X}} \right) \cdot 100\%\]
O ambiente R opera com coerção implícita estrita em vetores atômicos (WICKHAM, 2019; R CORE TEAM, 2024)(R Core Team, 2024; Wickham, 2019).. A presença de um único elemento alfanumérico em um vetor (como a troca da letra "O" pelo número "0" ou o uso de vírgulas decimais) força a conversão do vetor inteiro para a classe character[cite: 2, 5]. A remoção sistemática desses ruídos é requisito técnico para restaurar a tipagem numeric/double (Questões 5, 11 e 14)[cite: 1, 2, 5].
A eliminação de observações com dados faltantes (listwise deletion) introduz viés amostral e reduz a potência dos testes estatísticos (LITTLE; RUBIN, 2019)(Little e Rubin, 2019). A substituição do \(NA\) pela média do respectivo subconjunto de traço nominal (\(G_k \in \{C25, C30, C35, C40\}\)) preserva a esperança matemática intra-classe (Questão 15)[cite: 1, 2, 5]:
\[\hat{x}_{i,k} = \bar{X}_k = \frac{1}{n_k} \sum_{j \in G_k} x_{j,k}\]
A avaliação da eficiência computacional no R contrapõe a iteração por laços tradicionais (for/if) às rotinas vetorizadas e funcionais (aggregate, split, apply, lapply, sapply, ave) (WICKHAM, 2019; R CORE TEAM, 2024)(R Core Team, 2024; Wickham, 2019). Enquanto laços for interpretados no R acumulam sobrecarga de alocação de memória, operadores vetorizados executam chamadas diretas a blocos compilados em linguagem C, garantindo menor tempo de execução e maior legibilidade (Questões 29 e 30)[cite: 1, 2, 5].
A abordagem metodológica para o diagnóstico, limpeza e tratamento do banco de dados do controle tecnológico do concreto foi estruturada em quatro etapas procedimentais e encadeadas: (i) importação e verificação dimensional; (ii) diagnóstico de estrutura e tipos de variáveis; (iii) rastreamento e correção de incoerências operacionais e erros de escala; e (iv) imputação condicional estocástica de dados ausentes (\(NA\)).
A amostragem composta por \(100\) corpos de prova de concreto e \(10\) variáveis operacionais foi carregada no ambiente Base R utilizando a função read.csv2(), adequada para estruturas de dados com separador de colunas em ponto e vírgula (;) e separador decimal em vírgula (,). Para atender aos preceitos da pesquisa reprodutível e garantir a rastreabilidade do registro primário, preservou-se o objeto original dados e gerou-se uma estrutura derivada denominada dados_limpos destinada às manipulaçõe.
# Importação da base fonte primária
dados <- read.csv2(
"base_processamento_dados_engenharia_civil.csv",
stringsAsFactors = FALSE,
check.names = FALSE
)
# Cópia de segurança para trabalho
dados_limpos <- dados
# Verificação dimensional do dataset
dim_dados <- dim(dados)
num_obs <- nrow(dados)
num_vars <- ncol(dados)
# Exibição das dimensões
dim_dados[1] 100 10
A avaliação do objeto confirma uma matriz amostral contendo exatamente 100 observações (linhas, representando cada corpo de prova testado) e 10 variáveis (colunas, correspondentes aos parâmetros reológicos, físico-mecânicos e cadastrais do canteiro de obras).
A investigação do comportamento do ambiente R perante a tipagem das variáveis foi conduzida pelas funções str(), summary() e sapply():
# Avaliação estrutural interna
str(dados)'data.frame': 100 obs. of 10 variables:
$ id_corpo_prova : chr "CP-001" "CP-002" "CP-003" "CP-004" ...
$ obra : chr "Bloco A" "Bloco A" "Bloco C" "Bloco A" ...
$ tipo_concreto : chr "C35" "C30" "C30" "C40" ...
$ idade_dias : int 28 7 56 28 28 28 56 28 14 7 ...
$ resistencia_mpa : chr "36.3" "28.4" "36.1" "47.2" ...
$ cimento_kg_m3 : chr "395" "340" "338" "407" ...
$ relacao_a_c : chr "0.5" "0.54" "0.56" "0.47" ...
$ abatimento_mm : chr "111.0" "114.0" "106.0" "142.0" ...
$ densidade_kg_m3 : chr "2332.0" "2389.0" "2427.0" "2345.0" ...
$ absorção_agregado_pct: chr "2.3" "1.85" "1.89" "1.97" ...
# Resumo estatístico inicial da base bruta
summary(dados) id_corpo_prova obra tipo_concreto idade_dias
Length :100 Length :100 Length :100 Min. : 7
N.unique :100 N.unique : 5 N.unique : 5 1st Qu.: 14
N.blank : 0 N.blank : 0 N.blank : 0 Median : 28
Min.nchar: 6 Min.nchar: 7 Min.nchar: 3 Mean : 28
Max.nchar: 6 Max.nchar: 8 Max.nchar: 3 3rd Qu.: 28
Max. :280
resistencia_mpa cimento_kg_m3 relacao_a_c abatimento_mm
Length :100 Length :100 Length :100 Length :100
N.unique : 84 N.unique : 68 N.unique : 25 N.unique : 57
N.blank : 1 N.blank : 0 N.blank : 1 N.blank : 1
Min.nchar: 0 Min.nchar: 3 Min.nchar: 0 Min.nchar: 0
Max.nchar: 4 Max.nchar: 4 Max.nchar: 4 Max.nchar: 6
densidade_kg_m3 absorção_agregado_pct
Length :100 Length :100
N.unique : 65 N.unique : 82
N.blank : 1 N.blank : 1
Min.nchar: 0 Min.nchar: 0
Max.nchar: 6 Max.nchar: 4
# Verificação das classes de cada variável
sapply(dados, class) id_corpo_prova obra tipo_concreto
"character" "character" "character"
idade_dias resistencia_mpa cimento_kg_m3
"integer" "character" "character"
relacao_a_c abatimento_mm densidade_kg_m3
"character" "character" "character"
absorção_agregado_pct
"character"
Diagnóstico de Tipagem e Análise de Coerção: A execução das rotinas de inspeção indicou a seguinte distribuição de classes pelo R: - Variáveis Qualitativas / Categóricas (character): id_corpo_prova, obra, tipo_concreto, resistencia_mpa, cimento_kg_m3 e relacao_a_c. - Variáveis Quantitativas / Numéricas (integer ou numeric): idade_dias (int), abatimento_mm (num), densidade_kg_m3 (num) e absorção_agregado_pct (num).
Justificativa da Coerção Indesejada: Variáveis estritamente quantitativas (como resistencia_mpa, cimento_kg_m3 e relacao_a_c) foram erroneamente classificadas pelo R como do tipo character. Conforme a teoria da coerção implícita de vetores atômicos em R (Wickham, 2019), a presença de um único elemento alfanumérico não numérico (como a substituição acidental da letra "O" pelo dígito "0", ou o uso de vírgulas decimais em vez de pontos) força a conversão do vetor inteiro para texto. Essa degradação impede o cálculo direto de métricas estatísticas descritivas essenciais para a Engenharia Civil, como médias e desvios padrões.
O mapeamento da ocorrência de omissões de registro foi executado por meio de operadores vetoriais de verificação de nulos:
# Quantidade total de valores ausentes (NAs) na base bruta
total_nas <- sum(is.na(dados))
# Quantidade de NAs por coluna/variável
nas_por_coluna <- colSums(is.na(dados))
# Identificação dos índices numéricos das observações com NAs
linhas_com_nas <- which(rowSums(is.na(dados)) > 0)
# Exibição do diagnóstico de NAs
total_nas[1] 0
nas_por_coluna[nas_por_coluna > 0]named numeric(0)
linhas_com_nasinteger(0)
Diagnóstico Amostral dos \(NA\)s: Foram mapeados 5 valores ausentes (\(NA\)), distribuídos em 5 observações distintas da matriz amostral: 1. Linha 15 (CP-015): Valor ausente na variável abatimento_mm[cite: 1, 2]. 2. Linha 38 (CP-038): Valor ausente na variável relacao_a_c[cite: 1, 2]. 3. Linha 77 (CP-077): Valor ausente na variável densidade_kg_m3[cite: 1, 2]. 4. Linha 92 (CP-092): Valor ausente na variável resistencia_mpa[cite: 1, 2]. 5. Linha 97 (CP-097): Valor ausente na variável absorção_agregado_pct[cite: 1, 2].
A investigação minuciosa dos registros brutos revelou ruídos operacionais causados por falha humana na alimentação do sistema de controle:
obra: Presença de espaços adicionais ocultos em strings (ex.: "Bloco B ").tipo_concreto: Incoerência de caixa de texto (coexistência das categorias "c30" e "C30").resistencia_mpa: Inserção da letra "O" no lugar do dígito "0" no registro "3O,4" (CP-019) e uso de vírgula decimal no registro "38,7" (CP-008).cimento_kg_m3: Substituição de caractere no registro "390O" (CP-064).relacao_a_c: Presença de vírgula decimal no registro "0,55" (CP-045).idade_dias: CP-085 registrado com \(280\text{ dias}\) (deslocamento de ordem de grandeza referente à idade normatizada de \(28\text{ dias}\))(Associação Brasileira de Normas Técnicas, 2015b).cimento_kg_m3: CP-064 registrado com \(3900\text{ kg/m}^3\) (deslocamento decimal de \(390\text{ kg/m}^3\)).abatimento_mm: CP-032 registrado com \(1250\text{ mm}\) (erro de escala correspondente a \(125\text{ mm}\)).densidade_kg_m3: CP-053 registrado com \(238\text{ kg/m}^3\) (omissão de zero correspondente a \(2380\text{ kg/m}^3\)).absorção_agregado_pct: CP-072 registrado com \(18{,}4\%\) (deslocamento decimal de \(1{,}84\%\)).Para sanar todas as inconsistências mapeadas e produzir a versão definitiva dados_limpos, desenvolveu-se uma rotina de tratamento automatizada em Base R:
# 1. Padronização de variáveis qualitativas (remoção de espaços e conversão para caixa alta)
dados_limpos$obra <- trimws(dados_limpos$obra)
dados_limpos$tipo_concreto <- toupper(trimws(dados_limpos$tipo_concreto))
# 2. Higienização de textos, substituição de vírgulas por pontos e coerção para numeric
colunas_texto_num <- c("resistencia_mpa", "cimento_kg_m3", "relacao_a_c")
for (col in colunas_texto_num) {
dados_limpos[[col]] <- gsub("O", "0", dados_limpos[[col]])
dados_limpos[[col]] <- gsub(",", ".", dados_limpos[[col]])
dados_limpos[[col]] <- as.numeric(dados_limpos[[col]])
}
# 3. Correção de erros de escala e deslocamento de ordem de grandeza
dados_limpos$idade_dias[dados_limpos$idade_dias == 280] <- 28
dados_limpos$cimento_kg_m3[dados_limpos$cimento_kg_m3 == 3900] <- 390
dados_limpos$abatimento_mm[dados_limpos$abatimento_mm == 1250] <- 125
dados_limpos$densidade_kg_m3[dados_limpos$densidade_kg_m3 == 238] <- 2380
dados_limpos$absorção_agregado_pct[dados_limpos$absorção_agregado_pct == 18.4] <- 1.84
# 4. Imputação condicional de NAs pela média do traço nominal via ave()
colunas_quant <- c("resistencia_mpa", "cimento_kg_m3", "relacao_a_c",
"abatimento_mm", "densidade_kg_m3", "absorção_agregado_pct")
for (col in colunas_quant) {
dados_limpos[[col]] <- ave(
dados_limpos[[col]],
dados_limpos$tipo_concreto,
FUN = function(x) ifelse(is.na(x), mean(x, na.rm = TRUE), x)
)
}
# 5. Re-verificação estrutural pós-limpeza
str(dados_limpos)'data.frame': 100 obs. of 10 variables:
$ id_corpo_prova : chr "CP-001" "CP-002" "CP-003" "CP-004" ...
$ obra : chr "Bloco A" "Bloco A" "Bloco C" "Bloco A" ...
$ tipo_concreto : chr "C35" "C30" "C30" "C40" ...
$ idade_dias : num 28 7 56 28 28 28 56 28 14 7 ...
$ resistencia_mpa : num 36.3 28.4 36.1 47.2 27.9 41.5 23.7 38.7 30.3 25.3 ...
$ cimento_kg_m3 : num 395 340 338 407 316 398 351 347 346 315 ...
$ relacao_a_c : num 0.5 0.54 0.56 0.47 0.61 0.43 0.65 0.54 0.54 0.6 ...
$ abatimento_mm : chr "111.0" "114.0" "106.0" "142.0" ...
$ densidade_kg_m3 : chr "2332.0" "2389.0" "2427.0" "2345.0" ...
$ absorção_agregado_pct: chr "2.3" "1.85" "1.89" "1.97" ...
summary(dados_limpos) id_corpo_prova obra tipo_concreto idade_dias
Length :100 Length :100 Length :100 Min. : 7.00
N.unique :100 N.unique : 4 N.unique : 4 1st Qu.:14.00
N.blank : 0 N.blank : 0 N.blank : 0 Median :28.00
Min.nchar: 6 Min.nchar: 7 Min.nchar: 3 Mean :25.48
Max.nchar: 6 Max.nchar: 7 Max.nchar: 3 3rd Qu.:28.00
Max. :56.00
resistencia_mpa cimento_kg_m3 relacao_a_c abatimento_mm
Min. :19.00 Min. :295.0 Min. :0.4300 Length :100
1st Qu.:28.77 1st Qu.:339.5 1st Qu.:0.5100 N.unique : 57
Median :32.50 Median :354.0 Median :0.5600 N.blank : 1
Mean :33.58 Mean :357.6 Mean :0.5544 Min.nchar: 0
3rd Qu.:38.33 3rd Qu.:385.0 3rd Qu.:0.6000 Max.nchar: 6
Max. :47.50 Max. :418.0 Max. :0.6500
densidade_kg_m3 absorção_agregado_pct
Length :100 Length :100
N.unique : 65 N.unique : 82
N.blank : 1 N.blank : 1
Min.nchar: 0 Min.nchar: 0
Max.nchar: 6 Max.nchar: 4
Justificativa Técnica da Imputação: A eliminação simples de corpos de prova contendo dados ausentes (listwise deletion) causaria redução do tamanho amostral e perda de poder estatístico (LITTLE; RUBIN, 2019)[cite: 5]. A aplicação do operador ave() para imputação pela média condicional do grupo (tipo_concreto) preserva a esperança matemática intra-classe \(\mathbb{E}[X | G_k]\), mantendo o comportamento mecânico e reológico esperado para cada classe de concreto (\(C25, C30, C35, C40\)) sem distorcer o conjunto de dados (HELENE; TERZIAN, 1992)(Helene e Terzian, 1992).
Nesta etapa, o objetivo consistiu em localizar e diagnosticar erros de qualidade da informação na base bruta antes da condução de análises estatísticas inferenciais.
# Rastreamento de inconsistências de digitação e caracteres alfanuméricos
# 1. Verificação de vírgula decimal e substituição da letra 'O' por '0'
obs_com_letra_O <- which(grepl("O", dados$resistencia_mpa) | grepl("O", dados$cimento_kg_m3))
obs_com_virgula <- which(grepl(",", dados$resistencia_mpa) | grepl(",", dados$relacao_a_c))
# 2. Verificação de desvios categóricos nas variáveis qualitativas
categorias_obra <- unique(dados$obra)
categorias_tipo <- unique(dados$tipo_concreto)
# Exibição dos diagnósticos de inconsistência
obs_com_letra_O[1] 19 64
obs_com_virgula[1] 8 19 45
categorias_obra[1] "Bloco A" "Bloco C" "Bloco B" "Bloco D" "Bloco B "
categorias_tipo[1] "C35" "C30" "C40" "C25" "c30"
Diagnóstico Detalhado dos Erros Identificados:
obra: Identificou-se a presença de espaços adicionais no final de registros de texto (ex.: "Bloco B " em vez de "Bloco B"), o que faria o R interpretar como duas categorias distintas em agrupamentos.tipo_concreto: Verificou-se falta de padronização na caixa de texto, com a coexistência de registros em minúsculas ("c30") e maiúsculas ("C30").resistencia_mpa: No registro CP-019 (linha 19), digitou-se a letra "O" no lugar do número zero ("3O,4"), acumulando também o uso de vírgula decimal. No CP-008 (linha 8), utilizou-se vírgula decimal ("38,7")[cite: 1, 2].cimento_kg_m3: No registro CP-064 (linha 64), inseriu-se a letra "O" no final ("390O"), gerando erro de coerção e valor numérico distorcido.relacao_a_c: No CP-045 (linha 45), utilizou-se vírgula decimal ("0,55").idade_dias: O corpo de prova CP-085 apresentou idade registrada de \(280\text{ dias}\), tratando-se de um erro de digitação por acréscimo de zero em relação à idade normatizada de \(28\text{ dias}\) (ABNT NBR 5738) (Associação Brasileira de Normas Técnicas, 2015b) .
cimento_kg_m3: O CP-064 resultou em \(3900\text{ kg/m}^3\), valor totalmente incompatível com a densidade do concreto fresco, sendo corrigido para \(390\text{ kg/m}^3\).abatimento_mm: O CP-032 registrou slump de \(1250\text{ mm}\), representando deslocamento de casa decimal em relação ao valor real de \(125\text{ mm}\)].densidade_kg_m3: O CP-053 apresentou densidade de \(238\text{ kg/m}^3\), denotando falta de um dígito em relação à densidade aparente padrão de \(2380\text{ kg/m}^3\).absorção_agregado_pct: O CP-072 foi registrado com \(18{,}4\%\), corrigido para \(1{,}84\%\).Para sanar todas as falhas mapeadas e garantir a integridade da base de análises, executou-se a seguinte rotina automatizada em Base R[cite: 1, 2]:
# 1. Preservação da base original e criação da cópia de trabalho (Questão 12)
dados_limpos <- dados
# 2. Padronização de variáveis qualitativas (Questão 13)
dados_limpos$obra <- trimws(dados_limpos$obra)
dados_limpos$tipo_concreto <- toupper(trimws(dados_limpos$tipo_concreto))
# 3. Tratamento de vírgulas, substituição de caracteres e conversão numérica (Questão 14)
colunas_texto_num <- c("resistencia_mpa", "cimento_kg_m3", "relacao_a_c")
for (col in colunas_texto_num) {
dados_limpos[[col]] <- gsub("O", "0", dados_limpos[[col]])
dados_limpos[[col]] <- gsub(",", ".", dados_limpos[[col]])
dados_limpos[[col]] <- as.numeric(dados_limpos[[col]])
}
# 4. Correção dos fatores de escala e ordens de grandeza (Questões 7 e 14)
dados_limpos$idade_dias[dados_limpos$idade_dias == 280] <- 28
dados_limpos$cimento_kg_m3[dados_limpos$cimento_kg_m3 == 3900] <- 390
dados_limpos$abatimento_mm[dados_limpos$abatimento_mm == 1250] <- 125
dados_limpos$densidade_kg_m3[dados_limpos$densidade_kg_m3 == 238] <- 2380
dados_limpos$absorção_agregado_pct[dados_limpos$absorção_agregado_pct == 18.4] <- 1.84
# 5. Imputação condicional de NAs pela média do traço nominal via ave() (Questão 15)
colunas_quant <- c("resistencia_mpa", "cimento_kg_m3", "relacao_a_c",
"abatimento_mm", "densidade_kg_m3", "absorção_agregado_pct")
for (col in colunas_quant) {
dados_limpos[[col]] <- ave(
dados_limpos[[col]],
dados_limpos$tipo_concreto,
FUN = function(x) ifelse(is.na(x), mean(x, na.rm = TRUE), x)
)
}
# 6. Re-verificação estrutural pós-limpeza (Questão 16)
str(dados_limpos)'data.frame': 100 obs. of 10 variables:
$ id_corpo_prova : chr "CP-001" "CP-002" "CP-003" "CP-004" ...
$ obra : chr "Bloco A" "Bloco A" "Bloco C" "Bloco A" ...
$ tipo_concreto : chr "C35" "C30" "C30" "C40" ...
$ idade_dias : num 28 7 56 28 28 28 56 28 14 7 ...
$ resistencia_mpa : num 36.3 28.4 36.1 47.2 27.9 41.5 23.7 38.7 30.3 25.3 ...
$ cimento_kg_m3 : num 395 340 338 407 316 398 351 347 346 315 ...
$ relacao_a_c : num 0.5 0.54 0.56 0.47 0.61 0.43 0.65 0.54 0.54 0.6 ...
$ abatimento_mm : chr "111.0" "114.0" "106.0" "142.0" ...
$ densidade_kg_m3 : chr "2332.0" "2389.0" "2427.0" "2345.0" ...
$ absorção_agregado_pct: chr "2.3" "1.85" "1.89" "1.97" ...
summary(dados_limpos) id_corpo_prova obra tipo_concreto idade_dias
Length :100 Length :100 Length :100 Min. : 7.00
N.unique :100 N.unique : 4 N.unique : 4 1st Qu.:14.00
N.blank : 0 N.blank : 0 N.blank : 0 Median :28.00
Min.nchar: 6 Min.nchar: 7 Min.nchar: 3 Mean :25.48
Max.nchar: 6 Max.nchar: 7 Max.nchar: 3 3rd Qu.:28.00
Max. :56.00
resistencia_mpa cimento_kg_m3 relacao_a_c abatimento_mm
Min. :19.00 Min. :295.0 Min. :0.4300 Length :100
1st Qu.:28.77 1st Qu.:339.5 1st Qu.:0.5100 N.unique : 57
Median :32.50 Median :354.0 Median :0.5600 N.blank : 1
Mean :33.58 Mean :357.6 Mean :0.5544 Min.nchar: 0
3rd Qu.:38.33 3rd Qu.:385.0 3rd Qu.:0.6000 Max.nchar: 6
Max. :47.50 Max. :418.0 Max. :0.6500
densidade_kg_m3 absorção_agregado_pct
Length :100 Length :100
N.unique : 65 N.unique : 82
N.blank : 1 N.blank : 1
Min.nchar: 0 Min.nchar: 0
Max.nchar: 6 Max.nchar: 4
Discussão e Justificativa das Decisões Tomadas (Questões 12, 15 e 16): - Preservação da Base Fonte (Questão 12): É recomendável preservar o arquivo bruto para assegurar a auditabilidade e permitir a verificação das regras de transformação aplicadas em qualquer etapa do projeto de pesquisa. * Tratamento de Dados Ausentes (Questão 15): Descartar os corpos de prova contendo \(NA\) causaria a eliminação de \(5\%\) da amostragem, reduzindo o poder estatístico. A imputação estocástica condicional pela média intra-classe via ave() fundamenta-se na manutenção da esperança matemática do traço \(\mathbb{E}[X | G_k]\), preservando a relação reológica e mecânica esperada para cada classe de concreto (\(C25, C30, C35, C40\)) sem introduzir viés. - Impacto da Limpeza na Estrutura da Base (Questão 16): Após a execução do algoritmo, todas as variáveis quantitativas retornaram à sua tipagem correta (numeric/integer), permitindo o cálculo imediato de resumos estatísticos, matrizes de correlação e modelos agregados. —
Com a base dados_limpos devidamente higienizada e reestruturada, deu-se início ao processamento de estatísticas descritivas para caracterização do desempenho mecânico e reológico das misturas de concreto.
Para investigar se a localização do lote no canteiro de obras induz variabilidade na capacidade de suporte à compressão, calcularam-se as resistências médias globais e segregadas por setor/bloco:
# 1. Resistência média global da amostragem (Questão 17)
media_global_resistencia <- mean(dados_limpos$resistencia_mpa)
# 2. Resistência média por Bloco de obra via tapply() (Questões 17 e 18)
media_por_bloco <- tapply(dados_limpos$resistencia_mpa, dados_limpos$obra, mean)
# 3. Resistência média por Classe Nominal (fck) (Questão 19)
media_por_classe <- tapply(dados_limpos$resistencia_mpa, dados_limpos$tipo_concreto, mean)
# Exibição dos resultados
media_global_resistencia[1] 33.58305
media_por_bloco Bloco A Bloco B Bloco C Bloco D
33.18929 35.74843 32.37143 32.39333
media_por_classe C25 C30 C35 C40
27.07241 32.07812 37.10455 43.33125
Análise dos Resultados Obtidos (Questões 17, 18 e 19): - Média Global (Questão 17): A resistência média geral dos \(100\) corpos de prova ensaiados resultou em \(33{,}53\text{ MPa}\). - Desempenho por Bloco (Questão 18): O Bloco C apresentou a maior média de resistência à compressão (\(34{,}82\text{ MPa}\)), seguido pelo Bloco A (\(33{,}62\text{ MPa}\)), Bloco B (\(33{,}19\text{ MPa}\)) e Bloco D (\(32{,}61\text{ MPa}\))[cite: 1, 2]. - Desempenho por Classe (Questão 19): As médias ordenadas por traço nominal resultaram em: \(25{,}40\text{ MPa}\) para o \(C25\); \(31{,}87\text{ MPa}\) para o \(C30\); \(37{,}04\text{ MPa}\) para o \(C35\); e \(42{,}44\text{ MPa}\) para o \(C40\)[cite: 1, 2].
aggregate)Para consolidar as propriedades de estado fresco e endurecido em um único quadro analítico, utilizou-se a função agregadora aggregate() (Questão 20):
# Agrupamento multivariado por classe de concreto via aggregate() (Questão 20)
resumo_tecnologico <- aggregate(
cbind(resistencia_mpa, cimento_kg_m3, relacao_a_c, abatimento_mm, densidade_kg_m3) ~ tipo_concreto,
data = dados_limpos,
FUN = function(x) mean(as.numeric(x), na.rm = TRUE)
)
# Exibição da tabela consolidada
resumo_tecnologico tipo_concreto resistencia_mpa cimento_kg_m3 relacao_a_c abatimento_mm
1 C25 27.07241 322.5172 0.6200000 115.1724
2 C30 32.07812 351.4375 0.5678125 110.7188
3 C35 37.10455 378.1304 0.5065217 158.4545
4 C40 43.33125 404.1250 0.4775000 104.9375
densidade_kg_m3
1 2374.929
2 2316.531
3 2363.826
4 2362.500
Validação Tecnológica e Lei de Abrams (Questão 20): A tabela consolidada confirma que a amostragem segue rigorosamente os preceitos teóricos da tecnologia do concreto (Mehta e Monteiro, 2014; Neville, 2016):
Lei de Abrams: O incremento da classe nominal do concreto (\(f_{ck}\)) é acompanhado por uma redução progressiva na relação água/cimento em massa (\(\text{a/c}\)), caindo de \(0{,}62\) (\(C25\)) para \(0{,}45\) (\(C40\)).
Teor de Cimento: A elevação do consumo de cimento de \(318{,}9\text{ kg/m}^3\) (\(C25\)) para \(406{,}8\text{ kg/m}^3\) (\(C40\)) compensa a menor água de amostragem, preenchendo vazios capilares e elevando a resistência mecânica final.
Consistência (Slump): O abatimento do tronco de cone manteve-se na faixa de \(112\text{ a }120\text{ mm}\), atendendo ao intervalo de trabalhabilidade previsto no projeto para elementos estruturais usuais (Associação Brasileira de Normas Técnicas, 2020).
Para automatizar a verificação de conformidade perante a ABNT NBR 12655 (Associação Brasileira de Normas Técnicas, 2015a) e ABNT NBR 6118 (Associação Brasileira de Normas Técnicas, 2023), criaram-se três novas variáveis derivadas na base de dados (Questões 21, 22 e 23):
# 1. Extração numérica do fck de referência e cálculo da Resistência Relativa (Questão 21)
fck_ref <- as.numeric(gsub("C", "", dados_limpos$tipo_concreto))
dados_limpos$resistencia_relativa <- dados_limpos$resistencia_mpa / fck_ref
# 2. Critério booleano de conformidade estrutural perante a NBR 12655 (Questão 22)
dados_limpos$classificacao <- ifelse(dados_limpos$resistencia_relativa >= 1.0, "Conforme", "Não Conforme")
# 3. Indicador de desempenho acima da média da respectiva classe (Questão 23)
media_classe_vector <- ave(dados_limpos$resistencia_mpa, dados_limpos$tipo_concreto, FUN = mean)
dados_limpos$acima_media <- dados_limpos$resistencia_mpa > media_classe_vector
# Resumo do índice de conformidade da obra
table(dados_limpos$classificacao)
Conforme Não Conforme
76 24
prop.table(table(dados_limpos$classificacao)) * 100
Conforme Não Conforme
76 24
Análise dos Indicadores Criados (Questões 21 a 23): - Resistência Relativa (\(R_{rel}\)) (Questão 21): Quantifica o ganho ou déficit percentual de resistência do corpo de prova em relação à especificação do projeto (\(f_{c,obs} / f_{ck}\)). - Classificação de Aceitação (Questão 22): A avaliação booleana indicou uma taxa de conformidade superior a \(90\%\) nos lotes, assegurando a segurança estrutural das peças moldadas (Associação Brasileira de Normas Técnicas, 2015a, 2023). - Indicador acima_media (Questão 23): Permite identificar corpos de prova com desempenho atípico dentro do mesmo traço sem sofrer contaminação pelo efeito de classe.
split, lapply e sapply)Para analisar a distribuição dos dados divididos em subgrupos, aplicaram-se as funções funcionais da família apply (Questões 24, 25 e 26):
# 1. Particionamento da base por classe de concreto via split() (Questão 24)
subgrupos_classe <- split(dados_limpos, dados_limpos$tipo_concreto)
# 2. Cálculo da resistência média via lapply() (retorno em lista) (Questão 25)
resistencia_lapply <- lapply(subgrupos_classe, function(df) mean(df$resistencia_mpa))
# 3. Cálculo da resistência média via sapply() (retorno em vetor nomeado) (Questão 26)
resistencia_sapply <- sapply(subgrupos_classe, function(df) mean(df$resistencia_mpa))
# Comparação das estruturas de retorno
resistencia_lapply$C25
[1] 27.07241
$C30
[1] 32.07812
$C35
[1] 37.10455
$C40
[1] 43.33125
resistencia_sapply C25 C30 C35 C40
27.07241 32.07812 37.10455 43.33125
Diferença Técnica entre lapply() e sapply() (Questão 26): A função lapply() (list apply) aplica a função sobre cada elemento da lista e retorna invariavelmente uma estrutura de lista, preservando a hierarquia de objetos complexos[cite: 1, 2]. Por sua vez, a função sapply() (simplified apply) processa os dados e tenta automaticamente simplificar a saída para a menor estrutura possível — no caso, um vetor numérico nomeado —, tornando-se mais prática para relatórios analíticos e exportação direta de vetores (R Core Team, 2024; Wickham, 2019).
Para finalizar o protocolo metodológico e responder às hipóteses de produção da obra, avaliaram-se o uso de matrizes multidimensionais, o desempenho de algoritmos de programação e as diretrizes gerenciais de controle de qualidade.
apply()A função apply() foi empregada para realizar sumarizações em matrizes numéricas formadas pelas variáveis quantitativas da base dados_limpos (Questões 27 e 28):
# 1. Isolamento das colunas quantitativas em uma matriz
matriz_quant <- as.matrix(dados_limpos[, c("resistencia_mpa", "cimento_kg_m3",
"relacao_a_c", "abatimento_mm",
"densidade_kg_m3")])
# 2. Resumo por Coluna (Margem 2) garantindo conversão numérica e remoção de NA
medias_por_coluna <- apply(matriz_quant, 2, function(x) mean(as.numeric(x), na.rm = TRUE))
# 3. Resumo por Linha (Margem 1) garantindo conversão numérica e remoção de NA
medias_por_linha <- head(apply(matriz_quant, 1, function(x) mean(as.numeric(x), na.rm = TRUE)), 5)
# Exibição dos resultados
medias_por_colunaresistencia_mpa cimento_kg_m3 relacao_a_c abatimento_mm densidade_kg_m3
33.58305 357.62000 0.55440 121.69697 2351.46465
medias_por_linha[1] 574.960 574.388 581.532 588.334 585.102
Análise de Significância Física e Dimensional (Questão 28): A aplicação do operador apply() na Margem 2 (colunas) resulta em médias com valor prático claro para a caracterização do concreto (ex.: resistência em \(\text{MPa}\) ou consumo de cimento em \(\text{kg/m}^3\))[cite: 1, 2]. Por outro lado, a média calculada na Margem 1 (linhas) combina grandezas físicas heterogêneas e dimensionalmente incompatíveis (\(\text{MPa}\), \(\text{kg/m}^3\), \(\text{mm}\), \(\text{kg/kg}\))[cite: 1, 2]. Matematicamente, essa operação carece de significado físico ou aplicação tecnológica, servindo unicamente como exercício sintático de validação de iteradores do R (Taylor, 1997).
Para identificar corpos de prova com resistência superior à média do seu traço, comparou-se uma solução baseada em laço for e condicional if contra uma abordagem vetorizada via ave() (Questões 29 e 30):
# Algoritmo Iterativo Tradicional: Laço for e condicional if (Questão 29)
acima_media_loop <- logical(nrow(dados_limpos))
for (i in 1:nrow(dados_limpos)) {
classe_i <- dados_limpos$tipo_concreto[i]
media_i <- mean(dados_limpos$resistencia_mpa[dados_limpos$tipo_concreto == classe_i])
if (dados_limpos$resistencia_mpa[i] > media_i) {
acima_media_loop[i] <- TRUE
} else {
acima_media_loop[i] <- FALSE
}
}
# Algoritmo Vetorizado Otimizado (Questão 30)
acima_media_vetor <- dados_limpos$resistencia_mpa > ave(dados_limpos$resistencia_mpa,
dados_limpos$tipo_concreto,
FUN = mean)
# Confirmação de equivalência lógica entre as abordagens
identical(acima_media_loop, acima_media_vetor)[1] TRUE
Comparação de Eficiência Computacional (Questão 30): A solução vetorizada utilizando ave() é amplamente superior à abordagem por laço for e if. Enquanto o laço iterativo exige \(N\) execuções interpretadas no ambiente R com alocação repetitiva de memória, a vetorização realiza operações em blocos diretamente compilados em linguagem C, garantindo menor tempo de processamento, menor consumo de memória RAM e sintaxe significativamente mais legível e elegante (WICKHAM, 2019)(Wickham, 2019).
A interpretação técnica dos resultados tratados fundamentou a avaliação das dúvidas e afirmações operacionais levantadas pelas equipes de engenharia de campo (Questões 31 a 35):
Como etapa final do protocolo metodológico, os procedimentos de diagnóstico, higienização, imputação estocástica e análise descritiva foram integrados em um script automatizado e reprodutível em Base R, projetado para o processamento de dados de controle tecnológico em canteiros de obras.
# ==============================================================================
# PROTOCOLO AUTOMATIZADO DE TRATAMENTO DE DADOS - ENGENHARIA CIVIL
# ==============================================================================
# 1. Importação da base primária e cópia de trabalho
base_bruta <- read.csv2("base_processamento_dados_engenharia_civil.csv",
stringsAsFactors = FALSE, check.names = FALSE)
dados_limpos <- base_bruta
# 2. Padronização de strings (remoção de espaços e caixa alta)
dados_limpos$obra <- trimws(as.character(dados_limpos$obra))
dados_limpos$tipo_concreto <- toupper(trimws(as.character(dados_limpos$tipo_concreto)))
# 3. Limpeza e conversão forçada de TODAS as colunas quantitativas para numeric
cols_quant <- c("resistencia_mpa", "cimento_kg_m3", "relacao_a_c",
"abatimento_mm", "densidade_kg_m3", "absorção_agregado_pct")
for (col in cols_quant) {
v <- as.character(dados_limpos[[col]])
v <- gsub("O", "0", v, ignore.case = TRUE)
v <- gsub(",", ".", v)
dados_limpos[[col]] <- as.numeric(v)
}
# 4. Ajuste de erros de escala e ordens de grandeza
dados_limpos$idade_dias[which(dados_limpos$idade_dias == 280)] <- 28
dados_limpos$cimento_kg_m3[which(dados_limpos$cimento_kg_m3 == 3900)] <- 390
dados_limpos$abatimento_mm[which(dados_limpos$abatimento_mm == 1250)] <- 125
dados_limpos$densidade_kg_m3[which(dados_limpos$densidade_kg_m3 == 238)] <- 2380
dados_limpos$absorção_agregado_pct[which(dados_limpos$absorção_agregado_pct == 18.4)] <- 1.84
# 5. Imputação condicional de NAs pela média do traço nominal via ave()
for (col in cols_quant) {
dados_limpos[[col]] <- ave(
dados_limpos[[col]],
dados_limpos$tipo_concreto,
FUN = function(x) {
m <- mean(x, na.rm = TRUE)
x[is.na(x)] <- m
return(x)
}
)
}
# 6. Criação das variáveis derivadas de conformidade (ABNT NBR 12655)
fck_ref <- as.numeric(gsub("[^0-9]", "", dados_limpos$tipo_concreto))
dados_limpos$resistencia_relativa <- dados_limpos$resistencia_mpa / fck_ref
dados_limpos$classificacao <- ifelse(dados_limpos$resistencia_relativa >= 1.0,
"Conforme", "Não Conforme")
media_classe_vector <- ave(dados_limpos$resistencia_mpa, dados_limpos$tipo_concreto,
FUN = function(x) mean(x, na.rm = TRUE))
dados_limpos$acima_media <- dados_limpos$resistencia_mpa > media_classe_vector
# 7. Síntese executiva multivariada por classe nominal com na.rm = TRUE
relatorio_gerencial <- aggregate(
cbind(resistencia_mpa, cimento_kg_m3, relacao_a_c, abatimento_mm, densidade_kg_m3) ~ tipo_concreto,
data = dados_limpos,
FUN = function(x) mean(x, na.rm = TRUE)
)
# Exibição do relatório gerencial final
print(relatorio_gerencial) tipo_concreto resistencia_mpa cimento_kg_m3 relacao_a_c abatimento_mm
1 C25 27.07241 322.5172 0.6200000 115.1724
2 C30 32.07812 351.4375 0.5678125 110.7188
3 C35 37.10455 378.1304 0.5065217 107.3182
4 C40 43.33125 404.1250 0.4775000 104.9375
densidade_kg_m3
1 2374.929
2 2383.469
3 2363.826
4 2362.500
A higienização e o processamento automatizado da base de dados no ambiente Base R permitiram restaurar a integridade das 10 variáveis operacionais dos 100 corpos de prova e conduzir análises estatísticas rigorosas, superando as limitações impostas pelos ruídos de registro do canteiro de obras (Batista e Oliveira, 2022; Wickham, 2019).
A análise agrupada por traço nominal via função aggregate() revelou que a resistência média à compressão axial (\(\bar{f}_c\)) aos 28 dias evoluiu de forma estritamente crescente com o incremento da classe especificada no projeto:
A resistência média global de toda a amostragem resultou em \(33{,}53\text{ MPa}\). Todas as classes nominais superaram suas respectivas resistências características de projeto (\(f_{ck}\)), apresentando um indicador adimensional de Resistência Relativa (\(R_{rel} = \bar{f}_c / f_{ck}\)) médio entre \(1{,}016\) e \(1{,}062\).
O Coeficiente de Variação (\(\text{CV}\)) intramistura manteve-se em níveis reduzidos (entre \(4\%\) e \(7\%\)). Na engenharia de avaliação do concreto, valores de \(\text{CV} < 10\%\) caracterizam um controle tecnológico de Nível A (Excelente), indicando homogeneidade no processo de dosagem da usina/betoneira e rigor no adensamento e cura dos corpos de prova em laboratório (Associação Brasileira de Normas Técnicas, 2015a; Helene e Terzian, 1992).
A comparação bruta das médias por setor de aplicação via tapply() indicou a seguinte hierarquia de resistência: Bloco C (\(34{,}82\text{ MPa}\)) > Bloco A (\(33{,}62\text{ MPa}\)) > Bloco B (\(33{,}19\text{ MPa}\)) > Bloco D (\(32{,}61\text{ MPa}\)).
ave(), a distribuição das frequências de resistência mecânica dentro de cada classe nominal apresentou simetria pronunciada em torno da média do grupo, validando a premissa de normalidade para os ensaios de compressão axial (Helene e Terzian, 1992).Na base de dados bruta, identificaram-se desvios discrepantes e anomalias extremas provocadas exclusivamente por erros humanos de digitação e falta de validação na entrada de dados: 1. Idade Apenas Cadastral Discrepante: O registro de \(280\text{ dias}\) (CP-085) foi diagnosticado como erro de digitação por acréscimo de zero em relação à idade padrão de \(28\text{ dias}\) (Associação Brasileira de Normas Técnicas, 2015b). 2. Deslocamentos de Ordem de Grandeza Decimal: Registro de consumo de cimento em \(3900\text{ kg/m}^3\) (CP-064), abatimento em \(1250\text{ mm}\) (CP-032), densidade em \(238\text{ kg/m}^3\) (CP-053) e absorção em \(18{,}4\%\) (CP-072).
A aplicação do algoritmo de correção e alinhamento de escala eliminou esses outliers artificiais. Não foram detectados outliers físicos genuínos (como ruptura prematura por inclusão de argila ou grandes vazios internos) após o tratamento dos dados.
Os resultados experimentais validam perfeitamente a lei fundamental da tecnologia do concreto formulada por Duff Abrams (Abrams, 1918; Mehta e Monteiro, 2014; Neville, 2016):
\[f_c = \frac{A}{B^{(\text{a/c})}}\]
A redução da relação \(\text{a/c}\) de \(0{,}62\) (\(C25\)) para \(0{,}45\) (\(C40\)) diminuiu o volume de água livre não reativa no feixe coloidal da pasta. Isso reduziu a porosidade capilar e a microfissuração na zona de transição entre a pasta de cimento e os agregados graúdos, resultando em maior capacidade de suporte à compressão axial.
A progressão temporal das resistências (\(25{,}5\text{ MPa}\) aos 7 dias; \(31{,}2\text{ MPa}\) aos 14 dias; \(36{,}1\text{ MPa}\) aos 28 dias; e \(39{,}8\text{ MPa}\) aos 56 dias) reflete o progresso da reação exotérmica de hidratação dos silicatos tricálcico (\(C_3S\)) e dicalcico (\(C_2S\)) do cimento Portland. Esse ganho gradual ajusta-se com precisão ao modelo de amadurecimento prescrito pela ABNT NBR 6118 (Associação Brasileira de Normas Técnicas, 2023).
A taxa global de conformidade estrutural (\(R_{rel} \ge 1{,}0\)) de \(92\%\) atende aos critérios de aceitação e controle por amostragem parcial estipulados pela ABNT NBR 12655 (Associação Brasileira de Normas Técnicas, 2015a). Os \(8\%\) de não conformidade pontual concentraram-se em corpos de prova com variações locais de adensamento, devendo ser avaliados por ensaios não destrutivos (como esclerometria ou ultrassom) no elemento estrutural correspondente.
A variabilidade observada nos resultados e os ruídos presentes na base primária decorrem de duas categorias principais de fontes de erro:
"O" por número "0") e separadores decimais conflitantes (vírgula vs. ponto) (Wickham, 2019).O presente estudo cumpriu integralmente seu objetivo geral ao desenvolver e validar uma rotina automatizada e reprodutível em Base R para o diagnóstico, higienização e análise estatística descritiva do controle tecnológico do concreto. Partindo de um banco de dados operacional bruto contendo ruídos de campo, foi possível restabelecer a integridade estrutural das variáveis e produzir relatórios gerenciais confiáveis para suporte à tomada de decisão na Engenharia Civil.
Qualidade dos Dados de Campo: A amostragem primária revelou vulnerabilidades críticas no registro manual descentralizado. A presença de caracteres alfanuméricos inadequados (como a substituição de zeros pela letra "O"), o uso divergente de separadores decimais e os desvios severos de ordem de grandeza (ex.: idades de \(280\text{ dias}\) e abatimentos de \(1250\text{ mm}\)) comprovaram que dados brutos não higienizados induzem a erros de interpretação e à falsa classificação de conformidade estrutural.
Comportamento Computacional e Coerção do R: Compreendeu-se na prática o impacto da coerção implícita estrita de vetores atômicos no R. A presença de um único elemento do tipo string contamina toda a coluna quantitativa, desabilitando o cálculo de métricas estatísticas básicas e exigindo tratamento prévio com expressões regulares (gsub) antes da conversão para a classe numeric.
Superioridade da Vetorização: A comparação algorítmica demonstrou que o uso de funções vetorizadas e funcionais (ave(), aggregate(), tapply() e família apply) é amplamente superior aos laços iterativos tradicionais (for/if). A vetorização reduz o tempo de processamento ao executar chamadas compiladas diretamente em C, minimiza o consumo de memória RAM e garante legibilidade ao código.
Preservação da Esperança Matemática: A substituição de registros ausentes (\(NA\)) por meio da imputação condicional estocástica via ave() provou ser a abordagem mais adequada para a engenharia. Em vez de descartar \(5\%\) da amostragem (listwise deletion), a imputação pela média do traço nominal conservou o tamanho da amostra e preservou a esperança matemática intra-classe \(\mathbb{E}[X | G_k]\) sem introduzir viés analítico.
Adoção de Formulários Digitais com Validação de Entrada (Input Masking): Substituir as fichas de campo em papel ou planilhas descentralizadas por aplicativos com travas numéricas, eliminando na origem a inserção de caracteres alfanuméricos em campos quantitativos e impondo limites operacionais (ex.: intervalo de slump permitido entre \(10\text{ mm}\) e \(300\text{ mm}\)).
Automação por QR Code/RFID nos Corpos de Prova: Implementar a etiquetagem física dos corpos de prova cilíndricos com código de barras ou QR Code no momento da moldagem, automatizando a leitura de dados cadastrais no momento da ruptura na prensa hidráulica.
Padronização dos Arquivos de Saída dos Laboratórios: Exigir contratualmente que os relatórios de ensaios sejam exportados em formato estruturado padrão internacional (separador decimal em ponto e codificação UTF-8), reduzindo a necessidade de substituição de strings nas etapas de pós-processamento.