Anotaciones para la limpieza de datos utilizando Rstudio
Pasos.
- Cargar datos, puede utilizar distintos formatos desde, xlsx, csv,
pdf, otros
- Explorar los datos con herramientas estadísticas: Medidas de
tendencia central y dispersión Evaluaciones gráficas
- Tratamiento de datos faltantes como: NA
- Determinación de datos atípicos: mediante el uso de boxplot
- Eliminación de coordenadas duplicadas (por variable de estudio)
- Verificación de supuestos de normalidad: test de Shapiro Wilk y
qqplot
- Transformación de datos (opcional)
- Creación de datos de entrenamiento (80%) y validación (20), opcional
indicar un dato semilla utilizando la función set.seed ()
- Guardar los resultados generados
Establecer directorio de trabajo y carga de datos
rm(list=ls()) #remover lista de datos
# Configuracion de ruta de acceso
getwd() # ruta de directorio que esta utilizando
## [1] "/Users/juansantos/Library/Mobile Documents/com~apple~CloudDocs/Documentos Rstudio/CRS/Limpieza de datos"
list.files() # Visualizacion de documentos contenidos en la carpeta
## [1] "Base.xlsx" "Limpieza de datos.Rmd" "Limpieza-de-datos.html"
## [4] "Limpieza-de-datos.Rmd" "Lipieza de datos.R" "rsconnect"
## [7] "testing_data.csv" "training_data.csv"
# Cargar documentos utilizando y visualizaciones básicas
#install.packages("readxl")
library(readxl)
sdato2<- read_excel("Base.xlsx" )# extraer objeto de Excel
names(sdato2)
## [1] "X" "Y" "pH" "CE"
str(sdato2) # Estructura de la tabla
## tibble [63 × 4] (S3: tbl_df/tbl/data.frame)
## $ X : num [1:63] 735552 735640 735750 735853 735579 ...
## $ Y : num [1:63] 1594125 1594110 1594136 1594129 1594024 ...
## $ pH: num [1:63] 6.01 6.01 6.25 5.96 6.05 6 6.13 5.93 6.17 6.09 ...
## $ CE: num [1:63] 70 70 70 70 70 70 70 70 70 70 ...
head(sdato2,5) # Visualización de los primeros 5 datos de la tabla
## # A tibble: 5 × 4
## X Y pH CE
## <dbl> <dbl> <dbl> <dbl>
## 1 735552. 1594125. 6.01 70
## 2 735640. 1594110. 6.01 70
## 3 735750. 1594136. 6.25 70
## 4 735853. 1594129. 5.96 70
## 5 735579. 1594024. 6.05 70
Generación de estadísticas
# Visualización de los datos y estadística básica
library(fBasics)
Estadistica <- round(basicStats(sdato2[,c(1:4)], ci = 0.95),2) #Estadistica descriptiva para todos los datos en la tabla
print(Estadistica)
## X Y pH CE
## nobs 63.00 63.00 63.00 63.00
## NAs 0.00 0.00 0.00 0.00
## Minimum 735551.79 1592988.49 5.47 70.00
## Maximum 736291.78 1594136.02 6.25 75.60
## 1. Quartile 735780.15 1593285.46 5.80 70.00
## 3. Quartile 736099.95 1593890.75 6.00 70.00
## Mean 735928.19 1593586.07 5.91 70.09
## Median 735921.72 1593607.04 5.92 70.00
## Sum 46363476.28 100395922.16 372.46 4415.60
## SE Mean 24.81 44.22 0.02 0.09
## LCL Mean 735878.60 1593497.67 5.87 69.91
## UCL Mean 735977.79 1593674.46 5.95 70.27
## Variance 38774.83 123202.94 0.02 0.50
## Stdev 196.91 351.00 0.16 0.71
## Skewness -0.05 -0.08 -0.05 7.56
## Kurtosis -1.06 -1.36 -0.24 56.09
# Visualización de los datos grafica
par(mfrow=c(1,1))
hist(sdato2$pH)

boxplot(sdato2$pH, xlab="", main="pH")

Eliminación de datos atípicos
# eliminación datos atípicos
# guardamos el boxplot en un objeto
boxg <- boxplot(sdato2$pH,xlab="", main="pH")

out <- boxg$out # muestra los datos atípicos
out
## [1] 5.47
# Subset data based on outlier indices in 'out'
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
data.box <- sdato2 %>%
filter(!pH %in% out)
# Visualización de los datos sin outliers
boxplot(data.box$pH)

Eliminación de coordenadas duplicadas
# eliminar coordenadas duplicadas
sdato.dupli <- data.box[!duplicated(data.box[,c("X","Y")]),] # eliminar coordenadas duplicadas
sdato.dupli
## # A tibble: 62 × 4
## X Y pH CE
## <dbl> <dbl> <dbl> <dbl>
## 1 735552. 1594125. 6.01 70
## 2 735640. 1594110. 6.01 70
## 3 735750. 1594136. 6.25 70
## 4 735853. 1594129. 5.96 70
## 5 735579. 1594024. 6.05 70
## 6 735676. 1594009. 6 70
## 7 735776. 1594050. 6.13 70
## 8 735883. 1594039. 5.93 70
## 9 735933. 1594082. 6.17 70
## 10 735586. 1593931. 6.09 70
## # ℹ 52 more rows
# visualización de coordenadas sin duplicados
plot(sdato.dupli$X, sdato.dupli$Y, xlab="X", ylab="Y", main="Coordenadas sin duplicados", col="blue", pch=19)

Verificación de supuestos de normalidad
# verificación de supuestos de normalidad
library(car)
## Loading required package: carData
##
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
##
## recode
## The following object is masked from 'package:fBasics':
##
## densityPlot
qqPlot(sdato.dupli$pH, main="QQ Plot de pH sin outliers") # QQ plot para verificar normalidad

## [1] 3 32
# Verificación de normalidad con test de Shapiro-Wilk
shapiro.test(sdato.dupli$pH) # Test de normalidad
##
## Shapiro-Wilk normality test
##
## data: sdato.dupli$pH
## W = 0.97617, p-value = 0.2692
#Ho: Los datos siguen una distribución normal
#Ha: Los datos no siguen una distribución normal
# Si el p-valor es menor que 0.05, se rechaza la hipótesis nula de normalidad
Partición de las muestras, datos de entrenamiento y validación
# Cargar datos
training <- sdato.dupli # Datos de entrenamiento
testing <- sdato.dupli # Datos de validación
# Partición de los datos en entrenamiento (80%) y validación (20%)
set.seed(2024) # Para hacer reproducibles los subset
training_indices <- sample(1:nrow(training), size = 0.8 * nrow(training))
testing_indices <- setdiff(1:nrow(training), training_indices)
training <- training[training_indices, ]
testing <- testing[testing_indices, ]
# Verificación de las particiones
nrow(training) # Número de filas en el conjunto de entrenamiento
## [1] 49
nrow(testing) # Número de filas en el conjunto de validación
## [1] 13
# Visualización de las particiones
plot(training$X, training$Y, xlab="X", ylab="Y", main="Entrenamiento 80%", col="blue", pch=19)

plot(testing$X, testing$Y, xlab="X", ylab="Y", main="Validación 20%", col="red", pch=19)

Guardar los conjuntos de entrenamiento y validación en archivos
CSV
# Guardar los conjuntos de entrenamiento y validación en archivos CSV
write.csv(training, file = "training_data.csv", row.names = FALSE)
write.csv(testing, file = "testing_data.csv", row.names = FALSE)