Anotaciones para la limpieza de datos utilizando Rstudio

Pasos.
  1. Cargar datos, puede utilizar distintos formatos desde, xlsx, csv, pdf, otros
  2. Explorar los datos con herramientas estadísticas: Medidas de tendencia central y dispersión Evaluaciones gráficas
  3. Tratamiento de datos faltantes como: NA
  4. Determinación de datos atípicos: mediante el uso de boxplot
  5. Eliminación de coordenadas duplicadas (por variable de estudio)
  6. Verificación de supuestos de normalidad: test de Shapiro Wilk y qqplot
  7. Transformación de datos (opcional)
  8. Creación de datos de entrenamiento (80%) y validación (20), opcional indicar un dato semilla utilizando la función set.seed ()
  9. 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)