I. Manipulacion de dataframe

a. Funciones, Módulos y Librerías principales en R

En R, las funciones, módulos y librerías son elementos clave para trabajar de manera eficiente.

Funciones

Las funciones en R son bloques de código reutilizables diseñados para realizar una tarea específica. Para definir una función se utiliza la palabra clave “function” seguidad de los argumentos y el cuerpo de la función.

Por ejemplo podemos obtener la suma de dos elementos mediante la función suma

suma <- function(a, b) {
  resultado <- a + b
  return(resultado)
}

resultado_suma <- suma(3,4)

print(resultado_suma)
## [1] 7

Módulos

En R, no existe un concepto directo de “módulos” como en algunos otros lenguajes de programación, sin embargo existe la capacidad de organizar el código en scripts o archivos separados para mejorar la modularidad y la legibilidad.

Por ejemplo cargaremos una función de un script.R a nuestro proyecto:

source("mis_funciones.R")

resultado <- mi_suma(5,2)

print(resultado)
## [1] 7

Librerías

Las librerías son conjuntos de funciones y datos adicionales que no están incluidos en la instalación base de R. Se puede instalar librerías adicionales y cargar en la sesión de R para acceder a funcionalidades especializadas.

La función install.packages(“nombre_paquete”) se utiliza para instalar paquetes, y library(nombre_paquete) se utiliza para cargarlos.

A continuación mostraremos algunas librerías importantes:

ggplot2:
- Descripción: Librería para crear gráficos elegantes.
- Instalación y Carga:

 ```r
 options(repos = c(CRAN = "https://cloud.r-project.org"))
 install.packages("ggplot2")
 ```
 
 ```
 ## Installing package into 'C:/Users/MALM/AppData/Local/R/win-library/4.3'
 ## (as 'lib' is unspecified)
 ```
 
 ```
 ## package 'ggplot2' successfully unpacked and MD5 sums checked
 ## 
 ## The downloaded binary packages are in
 ##     C:\Users\MALM\AppData\Local\Temp\RtmpQHj6l1\downloaded_packages
 ```
 
 ```r
 library(ggplot2)
 ```
 
 ```
 ## Warning: package 'ggplot2' was built under R version 4.3.2
 ```
  • Ejemplo:

    # Crear un gráfico de dispersión
    datos <- data.frame(x = c(1, 2, 3, 4, 5), y = c(2, 4, 1, 7, 3))
    ggplot(datos, aes(x = x, y = y)) + geom_point()

dplyr:
- Descripción: Librería para manipulación eficiente de datos.
- Instalación y Carga:

 ```r
 options(repos = c(CRAN = "https://cloud.r-project.org"))
 install.packages("vctrs")
 ```
 
 ```
 ## Installing package into 'C:/Users/MALM/AppData/Local/R/win-library/4.3'
 ## (as 'lib' is unspecified)
 ```
 
 ```
 ## package 'vctrs' successfully unpacked and MD5 sums checked
 ```
 
 ```
 ## Warning: cannot remove prior installation of package 'vctrs'
 ```
 
 ```
 ## Warning in file.copy(savedcopy, lib, recursive = TRUE): problema al copiar
 ## C:\Users\MALM\AppData\Local\R\win-library\4.3\00LOCK\vctrs\libs\x64\vctrs.dll a
 ## C:\Users\MALM\AppData\Local\R\win-library\4.3\vctrs\libs\x64\vctrs.dll:
 ## Permission denied
 ```
 
 ```
 ## Warning: restored 'vctrs'
 ```
 
 ```
 ## 
 ## The downloaded binary packages are in
 ##     C:\Users\MALM\AppData\Local\Temp\RtmpQHj6l1\downloaded_packages
 ```
 
 ```r
 install.packages("dplyr")
 ```
 
 ```
 ## Installing package into 'C:/Users/MALM/AppData/Local/R/win-library/4.3'
 ## (as 'lib' is unspecified)
 ```
 
 ```
 ## package 'dplyr' successfully unpacked and MD5 sums checked
 ```
 
 ```
 ## Warning: cannot remove prior installation of package 'dplyr'
 ```
 
 ```
 ## Warning in file.copy(savedcopy, lib, recursive = TRUE): problema al copiar
 ## C:\Users\MALM\AppData\Local\R\win-library\4.3\00LOCK\dplyr\libs\x64\dplyr.dll a
 ## C:\Users\MALM\AppData\Local\R\win-library\4.3\dplyr\libs\x64\dplyr.dll:
 ## Permission denied
 ```
 
 ```
 ## Warning: restored 'dplyr'
 ```
 
 ```
 ## 
 ## The downloaded binary packages are in
 ##     C:\Users\MALM\AppData\Local\Temp\RtmpQHj6l1\downloaded_packages
 ```
 
 ```r
 library(dplyr)
 ```
 
 ```
 ## Warning: package 'dplyr' was built under R version 4.3.2
 ```
 
 ```
 ## 
 ## 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
 ```
  • Ejemplo:

    # Filtrar y resumir datos
    datos_filtrados <- filter(datos, y > 2)
    resumen <- summarise(datos_filtrados, media_y = mean(y))
    resumen
    ##    media_y
    ## 1 4.666667

caret:
- Descripción: Librería para entrenamiento y evaluación de modelos de machine learning.
- Instalación y Carga:

 ```r
 options(repos = c(CRAN = "https://cloud.r-project.org"))
 install.packages("caret")
 ```
 
 ```
 ## Installing package into 'C:/Users/MALM/AppData/Local/R/win-library/4.3'
 ## (as 'lib' is unspecified)
 ```
 
 ```
 ## package 'caret' successfully unpacked and MD5 sums checked
 ## 
 ## The downloaded binary packages are in
 ##     C:\Users\MALM\AppData\Local\Temp\RtmpQHj6l1\downloaded_packages
 ```
 
 ```r
 library(caret)
 ```
 
 ```
 ## Warning: package 'caret' was built under R version 4.3.2
 ```
 
 ```
 ## Loading required package: lattice
 ```
  • Ejemplo:

    # Dividir datos en conjunto de entrenamiento y prueba
    set.seed(123)
    indices_entrenamiento <- createDataPartition(datos$y, p = 0.7, list = FALSE)
    datos_entrenamiento <- datos[indices_entrenamiento, ]
    datos_prueba <- datos[-indices_entrenamiento, ]
    
    # Entrenar un modelo de regresión lineal
    modelo <- train(y ~ x, data = datos_entrenamiento, method = "lm")
    ## Warning in nominalTrainWorkflow(x = x, y = y, wts = weights, info = trainInfo,
    ## : There were missing values in resampled performance measures.
    modelo
    ## Linear Regression 
    ## 
    ## 5 samples
    ## 1 predictor
    ## 
    ## No pre-processing
    ## Resampling: Bootstrapped (25 reps) 
    ## Summary of sample sizes: 5, 5, 5, 5, 5, 5, ... 
    ## Resampling results:
    ## 
    ##   RMSE      Rsquared   MAE     
    ##   3.427597  0.8772797  3.252954
    ## 
    ## Tuning parameter 'intercept' was held constant at a value of TRUE

tidyr:
- Descripción: Librería para trabajar con datos en formato tidy.
- Instalación y Carga:

 ```r
 options(repos = c(CRAN = "https://cloud.r-project.org"))
 install.packages("tidyr")
 ```
 
 ```
 ## Installing package into 'C:/Users/MALM/AppData/Local/R/win-library/4.3'
 ## (as 'lib' is unspecified)
 ```
 
 ```
 ## package 'tidyr' successfully unpacked and MD5 sums checked
 ```
 
 ```
 ## Warning: cannot remove prior installation of package 'tidyr'
 ```
 
 ```
 ## Warning in file.copy(savedcopy, lib, recursive = TRUE): problema al copiar
 ## C:\Users\MALM\AppData\Local\R\win-library\4.3\00LOCK\tidyr\libs\x64\tidyr.dll a
 ## C:\Users\MALM\AppData\Local\R\win-library\4.3\tidyr\libs\x64\tidyr.dll:
 ## Permission denied
 ```
 
 ```
 ## Warning: restored 'tidyr'
 ```
 
 ```
 ## 
 ## The downloaded binary packages are in
 ##     C:\Users\MALM\AppData\Local\Temp\RtmpQHj6l1\downloaded_packages
 ```
 
 ```r
 library(tidyr)
 ```
 
 ```
 ## Warning: package 'tidyr' was built under R version 4.3.2
 ```
  • Ejemplo:

    # Convertir datos a formato tidy
    datos_tidy <- gather(datos, key = "variable", value = "valor", -x)
    datos_tidy
    ##   x variable valor
    ## 1 1        y     2
    ## 2 2        y     4
    ## 3 3        y     1
    ## 4 4        y     7
    ## 5 5        y     3

stringr:
- Descripción: Librería para manipulación de cadenas de texto.
- Instalación y Carga:

 ```r
 options(repos = c(CRAN = "https://cloud.r-project.org"))
 install.packages("reshape2")
 ```
 
 ```
 ## Installing package into 'C:/Users/MALM/AppData/Local/R/win-library/4.3'
 ## (as 'lib' is unspecified)
 ```
 
 ```
 ## package 'reshape2' successfully unpacked and MD5 sums checked
 ```
 
 ```
 ## Warning: cannot remove prior installation of package 'reshape2'
 ```
 
 ```
 ## Warning in file.copy(savedcopy, lib, recursive = TRUE): problema al copiar
 ## C:\Users\MALM\AppData\Local\R\win-library\4.3\00LOCK\reshape2\libs\x64\reshape2.dll
 ## a C:\Users\MALM\AppData\Local\R\win-library\4.3\reshape2\libs\x64\reshape2.dll:
 ## Permission denied
 ```
 
 ```
 ## Warning: restored 'reshape2'
 ```
 
 ```
 ## 
 ## The downloaded binary packages are in
 ##     C:\Users\MALM\AppData\Local\Temp\RtmpQHj6l1\downloaded_packages
 ```
 
 ```r
 install.packages("stringr")
 ```
 
 ```
 ## Installing package into 'C:/Users/MALM/AppData/Local/R/win-library/4.3'
 ## (as 'lib' is unspecified)
 ```
 
 ```
 ## package 'stringr' successfully unpacked and MD5 sums checked
 ## 
 ## The downloaded binary packages are in
 ##     C:\Users\MALM\AppData\Local\Temp\RtmpQHj6l1\downloaded_packages
 ```
 
 ```r
 library(stringr)
 ```
 
 ```
 ## Warning: package 'stringr' was built under R version 4.3.2
 ```
  • Ejemplo:

    # Extraer números de una cadena de texto
    cadena <- "123abc"
    numeros <- str_extract(cadena, "\\d+")
    numeros
    ## [1] "123"

b. Dataframe, Manipulación e Introducción al análisis de datos

El análisis de datos es un proceso clave en el campo de la ciencia de datos que implica la exploración, limpieza, transformación y visualización de datos para obtener información significativa. R es un lenguaje de programación estadística ampliamente utilizado que ofrece una variedad de herramientas y paquetes para realizar análisis de datos de manera eficiente.

Dataframe

Un Dataframe es una estructura de datos bidimensional que se utiliza para almacenar y organizar datos de manera tabular. Puede entenderse como una tabla donde los datos están organizados en filas y columnas, similar a una hoja de cálculo.

A continuación daremos un ejemplo de un DataFrame básico:

# Crear un DataFrame básico
datos <- data.frame(
  Nombre = c("Juan", "María", "Carlos", "Ana", "Pedro"),
  Edad = c(25, 30, 22, 28, 35),
  Puntuacion = c(85, 92, 78, 88, 95)
)

# Mostrar los datos
datos
##   Nombre Edad Puntuacion
## 1   Juan   25         85
## 2  María   30         92
## 3 Carlos   22         78
## 4    Ana   28         88
## 5  Pedro   35         95

Manipulación

La manipulación de datos se refiere al tratamiento de datos de acuerdo al objetivo del proyecto presentado. Filtrar valores, resumenes estadisticos entre otros tipos de manipulación.

Mostraremos 2 ejemplos:

# Filtrar personas mayores de 25 años
mayores_de_25 <- datos[datos$Edad > 25, ]
mayores_de_25
##   Nombre Edad Puntuacion
## 2  María   30         92
## 4    Ana   28         88
## 5  Pedro   35         95
# Resumen estadístico de la puntuación
resumen_puntuacion <- summary(datos$Puntuacion)
resumen_puntuacion
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    78.0    85.0    88.0    87.6    92.0    95.0

c. Flujo del proceso de análisis de datos

El flujo del proceso de análisis de datos en R Markdown generalmente sigue una serie de pasos estructurados. A continuación, te presento un esquema general que puedes adaptar según tus necesidades específicas:

Configuración e Importación de Datos:

  • Cargar Librerías: Comienza cargando las librerías necesarias para tu análisis. Por ejemplo:
# library(tidyverse)
  • Importar Datos: Importa los datos que necesitas analizar. Puedes cargar datos desde archivos CSV, bases de datos u otras fuentes
# datos <- read.csv("archivo.csv")

Exploración Inicial de Datos:

  • Ver los Primeros Registros: Examina los primeros registros del DataFrame para entender su estructura
# head(datos)
  • Resumen Estadístico: Genera un resumen estadístico básico para obtener una visión general de las variables
# summary(datos)

Limpieza y Transformación de Datos:

  • Manejo de Valores Nulos: Identifica y maneja los valores nulos en los datos
# datos <- na.omit(datos)
  • Transformación de Variables: Realiza transformaciones en las variables según sea necesario
# datos$NuevaVariable <- log(datos$VariableExistente)

Análisis Exploratorio de Datos (EDA):

  • Visualización de Datos: Realiza transformaciones en las variables según sea necesario
# ggplot(datos, aes(x = Variable1, y = Variable2)) + geom_point()
  • Análisis de Correlación:: Examina la correlación entre variables
# cor(datos)

Modelado y Estadísticas Descriptivas:

  • Modelado Estadístico: Si es necesario, ajusta modelos estadísticos a tus datos
# modelo <- lm(Y ~ X1 + X2, data = datos)
  • Estadísticas Descriptivas Adicionales: Calcula estadísticas descriptivas específicas según tus necesidades
# mean(datos$Variable)

Comunicación de Resultados:

  • Generación de Informes: Utiliza R Markdown para crear un informe que incluya texto, código y resultados
# Tu código y resultados aquí
  • Visualización Interactiva (Opcional) Si es necesario, considera utilizar herramientas como shiny para crear visualizaciones interactivas
# Código de Shiny aquí

Los pasos descritos proporcionan una guía general, pero ten en cuenta que el proceso exacto puede variar según la naturaleza específica del análisis y los datos que se utilice.

d. Importación de datos

La importación de datos en R studio se da a traves de librerias de acuerdo al tipo de dato. A continuación mostraremos algunos tipos de archivo:

jsonlite:
- Instalación y Carga:

 ```r
 options(repos = c(CRAN = "https://cloud.r-project.org"))
 install.packages("jsonlite")
 ```
 
 ```
 ## Installing package into 'C:/Users/MALM/AppData/Local/R/win-library/4.3'
 ## (as 'lib' is unspecified)
 ```
 
 ```
 ## package 'jsonlite' successfully unpacked and MD5 sums checked
 ```
 
 ```
 ## Warning: cannot remove prior installation of package 'jsonlite'
 ```
 
 ```
 ## Warning in file.copy(savedcopy, lib, recursive = TRUE): problema al copiar
 ## C:\Users\MALM\AppData\Local\R\win-library\4.3\00LOCK\jsonlite\libs\x64\jsonlite.dll
 ## a C:\Users\MALM\AppData\Local\R\win-library\4.3\jsonlite\libs\x64\jsonlite.dll:
 ## Permission denied
 ```
 
 ```
 ## Warning: restored 'jsonlite'
 ```
 
 ```
 ## 
 ## The downloaded binary packages are in
 ##     C:\Users\MALM\AppData\Local\Temp\RtmpQHj6l1\downloaded_packages
 ```
 
 ```r
 library(jsonlite)
 ```
 
 ```
 ## Warning: package 'jsonlite' was built under R version 4.3.2
 ```
  • Ejemplo:

    # Especificamos la ruta
    ruta_json <- "D:/PELICAN/ML/TF_SANMARCOS/drake_data.json"
    
    # Cargar datos de Drake Lyrics (https://www.kaggle.com/datasets/juicobowley/drake-lyrics):
    datos_drake <- fromJSON(ruta_json)
    str(datos_drake)
    ## 'data.frame':   290 obs. of  5 variables:
    ##  $ album       : chr  "Certified Lover Boy" "Certified Lover Boy" "Certified Lover Boy" "Certified Lover Boy" ...
    ##  $ lyrics_title: chr  "Certified Lover Boy* Lyrics" "Like I’m Supposed To/Do Things Lyrics" "Not Around Lyrics" "In the Cut (Ft. Roddy Ricch) Lyrics" ...
    ##  $ lyrics_url  : chr  "https://genius.com/Drake-certified-lover-boy-lyrics" "https://genius.com/Drake-like-im-supposed-to-do-things-lyrics" "https://genius.com/Drake-not-around-lyrics" "https://genius.com/Drake-in-the-cut-lyrics" ...
    ##  $ lyrics      : chr  "Lyrics from CLB Merch\n\n[Verse]\nPut my feelings on ice\nAlways been a gem\nCertified lover boy, somehow still"| __truncated__ "[Verse]\nHands are tied\nSomeone's in my ear from the other side\nTellin' me that I should pay you no mind\nWan"| __truncated__ "[Intro]\nYeah, we back\nWassup ladies?\nSwishahouse, baby\nWassup to all the ladies on the Northside, Southside"| __truncated__ "[Intro: Drake]\nAyy, yeah\nPipe this shit up and I turn this shit up\nWhen I was down, I was down\nNow them dia"| __truncated__ ...
    ##  $ track_views : chr  "8.7K" "38.8K" "129.8K" "72.1K" ...

csv:
- Ejemplo:

 ```r
 # Especificamos la ruta
 ruta_csv <- "D:/PELICAN/ML/TF_SANMARCOS/Airline_Delay_Cause.csv"
 
 # Flight Delay Data (https://www.kaggle.com/datasets/sriharshaeedala/airline-delay):
 datos_csv <- read.csv(ruta_csv)
 str(datos_csv)
 ```
 
 ```
 ## 'data.frame':   171666 obs. of  21 variables:
 ##  $ year               : int  2023 2023 2023 2023 2023 2023 2023 2023 2023 2023 ...
 ##  $ month              : int  8 8 8 8 8 8 8 8 8 8 ...
 ##  $ carrier            : chr  "9E" "9E" "9E" "9E" ...
 ##  $ carrier_name       : chr  "Endeavor Air Inc." "Endeavor Air Inc." "Endeavor Air Inc." "Endeavor Air Inc." ...
 ##  $ airport            : chr  "ABE" "ABY" "AEX" "AGS" ...
 ##  $ airport_name       : chr  "Allentown/Bethlehem/Easton, PA: Lehigh Valley International" "Albany, GA: Southwest Georgia Regional" "Alexandria, LA: Alexandria International" "Augusta, GA: Augusta Regional at Bush Field" ...
 ##  $ arr_flights        : num  89 62 62 66 92 ...
 ##  $ arr_del15          : num  13 10 10 12 22 256 12 7 13 4 ...
 ##  $ carrier_ct         : num  2.25 1.97 2.73 3.69 7.76 ...
 ##  $ weather_ct         : num  1.6 0.04 1.18 2.27 0 ...
 ##  $ nas_ct             : num  3.16 0.57 1.8 4.47 2.96 ...
 ##  $ security_ct        : num  0 0 0 0 0 0 0 0 0 0 ...
 ##  $ late_aircraft_ct   : num  5.99 7.42 4.28 1.57 11.28 ...
 ##  $ arr_cancelled      : num  2 0 1 1 2 32 0 2 0 1 ...
 ##  $ arr_diverted       : num  1 1 0 1 0 11 0 0 0 0 ...
 ##  $ arr_delay          : num  1375 799 766 1397 1530 ...
 ##  $ carrier_delay      : num  71 218 56 471 628 ...
 ##  $ weather_delay      : num  761 1 188 320 0 ...
 ##  $ nas_delay          : num  118 62 78 388 134 ...
 ##  $ security_delay     : num  0 0 0 0 0 0 0 0 0 0 ...
 ##  $ late_aircraft_delay: num  425 518 444 218 768 ...
 ```
 

txt:
- Ejemplo:

 ```r
 # Especificamos la ruta
 ruta_txt <- "D:/PELICAN/ML/TF_SANMARCOS/alicia-keys.txt"
 
 # Music (https://www.kaggle.com/code/jvedarutvija/music-genre-classification):
 datos_txt <- read.table(ruta_txt, header = TRUE, sep = "\t")
 ```
 
 ```
 ## Warning in scan(file = file, what = what, sep = sep, quote = quote, dec = dec,
 ## : EOF within quoted string
 ```
 
 ```r
 str(datos_txt)
 ```
 
 ```
 ## 'data.frame':   1486 obs. of  1 variable:
 ##  $ Ooh........New.York.x2.Grew.up.in.a.town.that.is.famous.as.a.place.of.movie.scenes: chr  "Noise is always loud, there are sirens all around and the streets are mean" "If I can make it here, I can make it anywhere, thats what they say\nSeeing my face in lights or my name on marq"| __truncated__ "Baby, Im from New York\nConcrete jungle where dreams are made of\nTheres nothing you cant do\nNow youre in New York" "These streets will make you feel brand new" ...
 ```

archivo en la web:
- Ejemplo:

 ```r
 # Especificamos la ruta
 url <- "https://raw.githubusercontent.com/malegria01/AD/main/dataset/censo.csv"
 
 # Music (https://www.kaggle.com/code/jvedarutvija/music-genre-classification):
 datos_url <- read.csv(url)
 str(datos_url)
 ```
 
 ```
 ## 'data.frame':   7634 obs. of  11 variables:
 ##  $ ORDEN           : int  0 1 2 3 4 5 6 7 8 9 ...
 ##  $ NOMBRE.REGIÓN   : chr  "PAÍS" "PAÍS" "PAÍS" "PAÍS" ...
 ##  $ Código.Región   : chr  "PAÍS" "PAÍS" "PAÍS" "PAÍS" ...
 ##  $ NOMBRE.PROVINCIA: chr  "PAÍS" "PAÍS" "PAÍS" "PAÍS" ...
 ##  $ Código.Provincia: chr  "PAÍS" "PAÍS" "PAÍS" "PAÍS" ...
 ##  $ NOMBRE.COMUNA   : chr  "PAÍS" "PAÍS" "PAÍS" "PAÍS" ...
 ##  $ Código.Comuna   : chr  "PAÍS" "PAÍS" "PAÍS" "PAÍS" ...
 ##  $ Edad            : chr  "Total País" "0 a 4" "5 a 9" "10 a 14" ...
 ##  $ Hombres         : int  8601989 594059 618121 585855 636064 702706 742265 645359 595608 586674 ...
 ##  $ Mujeres         : int  8972014 572087 592068 561560 608633 685116 731885 648278 612169 611829 ...
 ##  $ TOTAL           : int  17574003 1166146 1210189 1147415 1244697 1387822 1474150 1293637 1207777 1198503 ...
 ```

II. Manejo de datos

a. Identificación y manejo de datos missing

Los datos faltantes, también conocidos como valores nulos o NA (Not Available), son un aspecto común en conjuntos de datos del mundo real. La identificación y manejo adecuado de estos valores es esencial para realizar un análisis de datos preciso y confiable. En este documento, exploraremos cómo identificar y manejar datos faltantes en R.

Identificación datos missing

Método 1:

La función is.na() en R se utiliza para identificar valores nulos en un conjunto de datos. Devuelve un vector lógico del mismo tamaño que la variable o conjunto de datos original, indicando TRUE para las posiciones donde se encuentran valores nulos y FALSE para los valores no nulos.

# Crear un conjunto de datos con valores nulos
datos <- data.frame(
  A = c(1, 2, NA, 4),
  B = c(NA, 2, 3, 4)
)

# Identificar valores nulos en el conjunto de datos
is_na_resultado <- is.na(datos)

# Mostrar el resultado
is_na_resultado
##          A     B
## [1,] FALSE  TRUE
## [2,] FALSE FALSE
## [3,]  TRUE FALSE
## [4,] FALSE FALSE

Método 2:

La función complete.cases() devuelve un vector lógico que indica si una observación está completa (sin valores nulos) o no. Puede ser útil para filtrar observaciones completas.

# Filtrar observaciones completas
datos_completos <- datos[complete.cases(datos), ]

# Mostrar el conjunto de datos resultante
datos_completos
##   A B
## 2 2 2
## 4 4 4

Manejo datos missing

Eliminar filas o columnas

Eliminar filas o columnas con datos faltantes es una opción, pero debe hacerse con precaución, ya que puede reducir el tamaño del conjunto de datos y posiblemente introducir sesgos.

# Eliminar filas con datos faltantes
datos_sin_na_filas <- na.omit(datos)

Imputación de Datos Faltantes

La imputación implica reemplazar los valores faltantes con estimaciones. En el siguiente ejemplo, se utiliza la función na_mean() del paquete tidyr para reemplazar los valores faltantes con la media de cada columna.

library(tidyr)

# Imputar valores faltantes con la media
datos_imputados <- replace_na(datos, list(A = mean(datos$A), B = mean(datos$B)))

# Mostrar el conjunto de datos resultante
datos_imputados
##    A  B
## 1  1 NA
## 2  2  2
## 3 NA  3
## 4  4  4

b. Identificación y manejo de datos outlier e inconsistentes

Los datos atípicos (outliers) e inconsistentes pueden afectar significativamente el análisis de datos, introduciendo sesgos y distorsionando los resultados. En este documento, exploraremos cómo identificar y manejar datos atípicos e inconsistentes en R.

Identificación datos outlier

Método 1:

Los boxplots son una herramienta gráfica efectiva para identificar datos atípicos. Valores que caen fuera de los “bigotes” del boxplot son considerados atípicos.

# Crear un conjunto de datos con datos atípicos
datos_atipicos <- c(rnorm(50), 10, 12, -15)

# Crear un boxplot
boxplot(datos_atipicos, main = "Boxplot de Datos", ylab = "Valores")

Método 2:

El Z-Score mide cuántas desviaciones estándar un punto de datos está del promedio. Puntos con Z-Scores elevados pueden considerarse atípicos.

# Calcular el Z-Score
z_scores <- scale(datos_atipicos)

# Identificar puntos atípicos con Z-Scores
atipicos_z <- abs(z_scores) > 2

# Mostrar el resultado
atipicos_z
##        [,1]
##  [1,] FALSE
##  [2,] FALSE
##  [3,] FALSE
##  [4,] FALSE
##  [5,] FALSE
##  [6,] FALSE
##  [7,] FALSE
##  [8,] FALSE
##  [9,] FALSE
## [10,] FALSE
## [11,] FALSE
## [12,] FALSE
## [13,] FALSE
## [14,] FALSE
## [15,] FALSE
## [16,] FALSE
## [17,] FALSE
## [18,] FALSE
## [19,] FALSE
## [20,] FALSE
## [21,] FALSE
## [22,] FALSE
## [23,] FALSE
## [24,] FALSE
## [25,] FALSE
## [26,] FALSE
## [27,] FALSE
## [28,] FALSE
## [29,] FALSE
## [30,] FALSE
## [31,] FALSE
## [32,] FALSE
## [33,] FALSE
## [34,] FALSE
## [35,] FALSE
## [36,] FALSE
## [37,] FALSE
## [38,] FALSE
## [39,] FALSE
## [40,] FALSE
## [41,] FALSE
## [42,] FALSE
## [43,] FALSE
## [44,] FALSE
## [45,] FALSE
## [46,] FALSE
## [47,] FALSE
## [48,] FALSE
## [49,] FALSE
## [50,] FALSE
## [51,]  TRUE
## [52,]  TRUE
## [53,]  TRUE

Manejo datos outliers

Eliminar Datos outlier

Eliminar datos atípicos puede ser una opción, pero debe hacerse con precaución, ya que puede influir en la interpretación de los resultados.

# Eliminar datos atípicos según Z-Scores
datos_sin_atipicos <- datos_atipicos[!atipicos_z]

# Mostrar el conjunto de datos resultante
datos_sin_atipicos
##  [1]  0.34284706  0.34582925  0.10074529 -1.92762959 -1.28937617 -1.30329056
##  [7] -0.03609330  1.29403358  1.89348908 -0.67844200  0.65967843  0.99029457
## [13] -0.49922138  1.30419368  0.43779962  0.14842850 -1.10879985 -0.93982844
## [19] -0.75140042 -0.53493519 -0.25866708 -0.28513154 -0.23557225  0.49189261
## [25] -0.46891035 -2.20016995 -2.07968009 -1.74655726  0.13795098  0.19023739
## [31]  0.34065802  0.39000006 -1.66657450  0.39189366 -1.40262068 -0.43551315
## [37] -0.27276344  1.16650449 -0.90301908 -0.26768953  0.71778137  0.85181243
## [43]  1.59534999  0.79308480  1.41235567  1.95113103 -1.00699586 -0.13364257
## [49] -0.05146045  0.10522997

Transformación de Datos

Aplicar transformaciones a los datos, como la transformación logarítmica, puede reducir la influencia de los valores atípicos.

# Aplicar transformación logarítmica
datos_transformados <- log(datos_atipicos)
## Warning in log(datos_atipicos): Se han producido NaNs
# Mostrar el conjunto de datos resultante
datos_transformados
##  [1] -1.070470834 -1.061810110 -2.295159834          NaN          NaN
##  [6]          NaN          NaN  0.257764150  0.638421199          NaN
## [11] -0.416002795 -0.009752839          NaN  0.265584979 -0.825993952
## [16] -1.907651916          NaN          NaN          NaN          NaN
## [21]          NaN          NaN          NaN -0.709494850          NaN
## [26]          NaN          NaN          NaN -1.980856861 -1.659482574
## [31] -1.076876182 -0.941608387          NaN -0.936764753          NaN
## [36]          NaN          NaN  0.154011664          NaN          NaN
## [41] -0.331590251 -0.160388934  0.467093139 -0.231825127  0.345258998
## [46]  0.668409218          NaN          NaN          NaN -2.251607096
## [51]  2.302585093  2.484906650          NaN

c. Limpieza de datos y preparación de datos

La limpieza y preparación de datos son pasos críticos en el proceso de análisis de datos. Estas tareas contribuyen a la calidad y confiabilidad de los resultados finales. Adaptar las técnicas de limpieza y preparación según el contexto y los objetivos específicos del análisis es fundamental para obtener insights significativos.

Limpieza de datos

Manejo de Datos Faltantes:

La identificación y manejo de datos faltantes es esencial para evitar sesgos en los resultados del análisis.

# Crear un conjunto de datos con valores faltantes
datos <- data.frame(
  A = c(1, 2, NA, 4),
  B = c(NA, 2, 3, 4)
)

# Eliminar filas con datos faltantes
datos_sin_na_filas <- na.omit(datos)

# Imputar valores faltantes con la media
datos_imputados <- replace_na(datos, list(A = mean(datos$A), B = mean(datos$B)))

Identificación de Datos Atípicos:

Identificar y manejar datos atípicos es crucial para obtener resultados más robustos en el análisis.

# Crear un conjunto de datos con datos atípicos
datos_atipicos <- c(rnorm(50), 10, 12, -15)

# Calcular el Z-Score
z_scores <- scale(datos_atipicos)

# Identificar puntos atípicos con Z-Scores
atipicos_z <- abs(z_scores) > 2

Preparación de Datos

Codificación de Variables Categóricas:

La codificación adecuada de variables categóricas es esencial para muchos modelos y análisis estadísticos.

# Crear un conjunto de datos con variables categóricas
datos_categoricos <- data.frame(
  Categoria = c("A", "B", "A", "C", "B")
)

# Codificar variables categóricas
datos_codificados <- model.matrix(~ . - 1, datos_categoricos)

Escalado de Variables:

El escalado de variables puede ser necesario para algoritmos sensibles a la escala, como los métodos basados en distancias.

# Crear un conjunto de datos con variables en diferentes escalas
datos_escalados <- data.frame(
  X1 = c(10, 20, 30, 40),
  X2 = c(0.1, 0.5, 0.2, 0.9)
)

# Escalar variables
datos_escalados <- scale(datos_escalados)

III. Visualizacion de datos

a. Visualización de datos univariados.

En este apartado tomaremos el dataframe que fue cargado de internet datos_url

url <- "https://raw.githubusercontent.com/malegria01/AD/main/dataset/censo.csv"
datos_url <- read.csv(url)

colnames(datos_url)
##  [1] "ORDEN"            "NOMBRE.REGIÓN"    "Código.Región"    "NOMBRE.PROVINCIA"
##  [5] "Código.Provincia" "NOMBRE.COMUNA"    "Código.Comuna"    "Edad"            
##  [9] "Hombres"          "Mujeres"          "TOTAL"

Utilizaremos algunas columnas para la visualización univariado

De cara a la variable cualitativa

Grafica de barras

barplot(table(datos_url$NOMBRE.REGIÓN))

De cara a la variable cuantitativa

Histograma Hombres

hist(datos_url$Hombres)

Histrograma Mujeres

hist(datos_url$Mujeres)

b. Visualización de datos bivariados

Usaremos la región y hombres por media en agrupación

library(dplyr)
datos_url %>% group_by(NOMBRE.REGIÓN) %>% summarise( media_Hombres= mean(Hombres))
## # A tibble: 16 × 2
##    NOMBRE.REGIÓN                             media_Hombres
##    <chr>                                             <dbl>
##  1 ANTOFAGASTA                                       3182.
##  2 ARICA Y PARINACOTA                                2559.
##  3 ATACAMA                                           1459.
##  4 AYSÉN DEL GENERAL CARLOS IBÁÑEZ DEL CAMPO          488.
##  5 BIOBÍO                                            1655.
##  6 COQUIMBO                                          2235.
##  7 LA ARAUCANÍA                                      1321.
##  8 LIBERTADOR GENERAL BERNARDO O'HIGGINS             1250.
##  9 LOS LAGOS                                         1241.
## 10 LOS RÍOS                                          1431.
## 11 MAGALLANES Y DE LA ANTÁRTICA CHILENA               705.
## 12 MAULE                                             1550.
## 13 METROPOLITANA DE SANTIAGO                         6053.
## 14 PAÍS                                            781999 
## 15 TARAPACÁ                                          2179.
## 16 VALPARAÍSO                                        2106.

Gráficos

library(ggplot2)
grafico_barras <- ggplot(datos_url, aes(x = datos_url$NOMBRE.REGIÓN, y = datos_url$Hombres)) +
  geom_bar(stat = "summary", fun = "mean", fill = "skyblue") +
  labs(title = "Gráfico de Barras Región vs Hombres", x = "Región", y = "Hombres")
grafico_barras
## Warning: Use of `datos_url$NOMBRE.REGIÓN` is discouraged.
## ℹ Use `NOMBRE.REGIÓN` instead.
## Warning: Use of `datos_url$Hombres` is discouraged.
## ℹ Use `Hombres` instead.

# Crear el gráfico de caja y bigotes usando ggplot2
grafico_caja_bigotes <- ggplot(datos_url, aes(x = datos_url$NOMBRE.REGIÓN, y = datos_url$Hombres, fill = datos_url$NOMBRE.REGIÓN)) +
  geom_boxplot() +
  labs(title = "Gráfico de Caja y Bigotes Bivariado", x = "Región", y = "Media Hombres") +
  theme_minimal()

# Mostrar el gráfico
print(grafico_caja_bigotes)
## Warning: Use of `datos_url$NOMBRE.REGIÓN` is discouraged.
## ℹ Use `NOMBRE.REGIÓN` instead.
## Warning: Use of `datos_url$Hombres` is discouraged.
## ℹ Use `Hombres` instead.
## Warning: Use of `datos_url$NOMBRE.REGIÓN` is discouraged.
## ℹ Use `NOMBRE.REGIÓN` instead.

c. Visualización de datos bivariados multivariados.

Para el caso de datos bivariados multivariados

Data_media <- as.data.frame(datos_url %>% group_by(NOMBRE.REGIÓN) %>% summarise( media_Hombres= mean(Hombres), media_Mujeres = mean(Mujeres)))
Data_media
##                                NOMBRE.REGIÓN media_Hombres media_Mujeres
## 1                                ANTOFAGASTA     3181.9596     2954.7475
## 2                         ARICA Y PARINACOTA     2558.6591     2579.2500
## 3                                    ATACAMA     1458.7879     1431.7980
## 4  AYSÉN DEL GENERAL CARLOS IBÁÑEZ DEL CAMPO      487.7000      450.1000
## 5                                     BIOBÍO     1655.4158     1774.5741
## 6                                   COQUIMBO     2234.9939     2356.4364
## 7                               LA ARAUCANÍA     1321.3949     1397.9915
## 8      LIBERTADOR GENERAL BERNARDO O'HIGGINS     1249.8898     1269.5455
## 9                                  LOS LAGOS     1240.6061     1270.6303
## 10                                  LOS RÍOS     1430.6591     1484.7727
## 11      MAGALLANES Y DE LA ANTÁRTICA CHILENA      704.5372      671.7686
## 12                                     MAULE     1550.3758     1616.1394
## 13                 METROPOLITANA DE SANTIAGO     6052.9143     6382.0647
## 14                                      PAÍS   781999.0000   815637.6364
## 15                                  TARAPACÁ     2179.1299     2113.8312
## 16                                VALPARAÍSO     2105.7775     2238.4856
# Reorganizar el DataFrame para facilitar la visualización
Data_R <- tidyr::gather(Data_media, key = "Media", value = "Valor", -NOMBRE.REGIÓN)

# Crear el gráfico de barras apiladas usando ggplot2
grafico_barras_apiladas <- ggplot(Data_R, aes(x = Data_R$NOMBRE.REGIÓN, y = Valor, fill = Media)) +
  geom_bar(stat = "identity") +
  labs(title = "Gráfico de Barras Bivariado", x = "NOMBRE.REGIÓN", y = "Media") +
  theme_minimal()

# Mostrar el gráfico
print(grafico_barras_apiladas)
## Warning: Use of `Data_R$NOMBRE.REGIÓN` is discouraged.
## ℹ Use `NOMBRE.REGIÓN` instead.

d. Visualización de datos avanzados (imágenes)

Graficos de datos perdidos del dataframe

install.packages("DataExplorer")
## Installing package into 'C:/Users/MALM/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'DataExplorer' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\MALM\AppData\Local\Temp\RtmpQHj6l1\downloaded_packages
library(DataExplorer)
## Warning: package 'DataExplorer' was built under R version 4.3.2
plot_histogram(datos_url)

library(DataExplorer)
plot_correlation(datos_url)
## 5 features with more than 20 categories ignored!
## NOMBRE.PROVINCIA: 55 categories
## Código.Provincia: 55 categories
## NOMBRE.COMUNA: 347 categories
## Código.Comuna: 347 categories
## Edad: 23 categories

IV. Manipulacion de datos no estructurados - texto

En el análisis de datos, a menudo nos encontramos con datos no estructurados, especialmente en forma de texto. La manipulación de datos no estructurados es esencial para extraer información valiosa. Aquí exploraremos algunos conceptos y ejemplos utilizando R Markdown

Tokenización

La tokenización implica dividir un texto en unidades más pequeñas llamadas “tokens”. Un token puede ser una palabra, una frase, o incluso un carácter, dependiendo de la granularidad deseada.

# Ejemplo de tokenización con la librería 'tokenizers'
install.packages("tokenizers")
## Installing package into 'C:/Users/MALM/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'tokenizers' successfully unpacked and MD5 sums checked
## Warning: cannot remove prior installation of package 'tokenizers'
## Warning in file.copy(savedcopy, lib, recursive = TRUE): problema al copiar
## C:\Users\MALM\AppData\Local\R\win-library\4.3\00LOCK\tokenizers\libs\x64\tokenizers.dll
## a
## C:\Users\MALM\AppData\Local\R\win-library\4.3\tokenizers\libs\x64\tokenizers.dll:
## Permission denied
## Warning: restored 'tokenizers'
## 
## The downloaded binary packages are in
##  C:\Users\MALM\AppData\Local\Temp\RtmpQHj6l1\downloaded_packages
library(tokenizers)
## Warning: package 'tokenizers' was built under R version 4.3.2
texto <- "La tokenización divide el texto en unidades más pequeñas."
tokens <- unlist(tokenize_words(texto))
tokens
## [1] "la"           "tokenización" "divide"       "el"           "texto"       
## [6] "en"           "unidades"     "más"          "pequeñas"

Limpieza de texto

La limpieza de texto implica eliminar caracteres no deseados, como signos de puntuación, números o espacios adicionales.

# Ejemplo de limpieza de texto
texto_sin_puntuacion <- gsub("[[:punct:]]", "", texto)
texto_limpio <- tolower(texto_sin_puntuacion)
texto_limpio
## [1] "la tokenización divide el texto en unidades más pequeñas"

Análisis de Frecuencia de Palabras

El análisis de frecuencia de palabras permite contar la ocurrencia de cada palabra en un texto.

# Ejemplo de análisis de frecuencia de palabras
palabras <- strsplit(texto_limpio, " ")[[1]]
frecuencia_palabras <- table(palabras)
frecuencia_palabras
## palabras
##       divide           el           en           la          más     pequeñas 
##            1            1            1            1            1            1 
##        texto tokenización     unidades 
##            1            1            1

Una gran aplicación es en el analisis de sentimiento:

# Texto de ejemplo
comentario <- "¡Me encanta este producto! Es increíblemente útil y fácil de usar."

# Limpieza de texto
comentario_limpio <- tolower(gsub("[[:punct:]]", "", comentario))

# Tokenización del texto limpio
tokens_limpio <- unlist(tokenize_words(comentario_limpio))

# Análisis de Sentimientos
palabras_positivas <- c("encanta", "increíblemente", "útil", "fácil")
sentimiento <- ifelse(any(tokens_limpio %in% palabras_positivas), "Positivo", "Negativo")
sentimiento
## [1] "Positivo"

V. Conclusiones

1 .La correcta importación de datos es crucial, adaptándola según el formato del archivo.
2 .La librería dplyr simplifica la manipulación de datos en dataframes.
3. Identificar y manejar datos missing y outliers mejora la calidad del análisis.
4. La limpieza de datos, como eliminar duplicados, es esencial antes del análisis.
5. La visualización univariada y bivariada proporciona información rápida y clara.
6. La preparación de datos incluye imputación de valores faltantes y escalado si es necesario.
7. La exploración de datos sigue un flujo lógico: importación, limpieza, análisis y visualización.
8. La visualización avanzada, como la incorporación de imágenes, enriquece la presentación de datos.

VI. Referencias

  1. Hadley Wickham (2016). R Packages: Organize, Test, Document, and Share Your Code. O’Reilly Media.

  2. Garrett Grolemund and Hadley Wickham (2017). R for Data Science: Import, Tidy, Transform, Visualize, and Model Data. O’Reilly Media.

  3. Winston Chang (2012). R Graphics Cookbook. O’Reilly Media.

  4. Phil Spector (2008). Data Manipulation with R. Springer.

  5. Roger D. Peng (2016). Exploratory Data Analysis with R. Springer.

  6. Jeffrey M. Stanton (2016). An Introduction to Data Science. Sage Publications.

  7. Robert Kabacoff (2015). R in Action: Data Analysis and Graphics with R. Manning Publications.

  8. Hadley Wickham (2014). Advanced R. Chapman and Hall/CRC.

  9. Max Kuhn and Kjell Johnson (2013). Applied Predictive Modeling. Springer.

  10. Paul Teetor (2011). R Cookbook. O’Reilly Media.