1 Integrantes del Grupo

  1. Jair Alejandro Castro Albrecht
  2. Matías Fabián Torres Cabanillas

2 Manipulación de DataFrame

La manipulación de dataframes desempeña un papel fundamental en el análisis de datos y la exploración de información. En el ambiente de R, los dataframes son estructuras que permiten organizar datos de manera eficaz. Este proceso de manipulación se enfoca en la transformación, limpieza y exploración de datos para extraer la información deseada.

Dentro del mundo referente a la manipulación de dataframe existe una gran diversidad de fubcionalidades, dentro de estas se encuentran, el filtrado de datos, la manipulación de variables, la limpieza de datos, el cálculo de estadísticas descriptivas, la preparación de datos para modelos estadísticos y de Machine Learning, etc.

2.1 Funciones, Módulos y Librerías Principales en R

  • Funciones En el ámbito de la programación, las funciones pertenecen a un bloque de código que efectua cualquier tipo de operación. Estas son útiles para guardar condensar operaciones básicas en un solo código reutilizable, normalmente el nombre de cada función lleva un nombre que describa lo que hace ella misma (Como ejemplo “mean”,“len”, etc). En Rstudio, las funciones se caracterizan por llevar un nombre corto y que da una idea directa de su labor. Los elementos que van dentro de la función tienen el nombre de parámetros o argumentos. Cabe resaltar que el mismo Rstudio te da una serie de gran cantidad de funciones que vienen de manera predeterminada junto al programa.

  • Funciones integradas a R Rstudio es un entorno que brinda al consumidor ciertas funciones que pueden ayudar al programador a encontrar una gran cantidad de soluciones a diferentes órdenes deseadas. Podemos realizar operaciones básicas como suma, resta,etc. También tenemos funciones personalizadas para vectores, funciones de texto, funciones lógicas, funciones de gráficos, funciones de dataframe y más que procederemos a ver con los siguientes ejemplos.

Operaciones básicas como suma, resta, multiplicación, división, etc.

a <- 5 + 3
b <- 14 - 4
c <- 13 * 325
d <- 480 / 4
a
## [1] 8
b
## [1] 10
c
## [1] 4225
d
## [1] 120

Funciones matemáticas como potencia, raíz, valor absoluto, etc.

e <- sqrt(49)
f <- 3^5
g <- abs(-46)
e
## [1] 7
f
## [1] 243
g
## [1] 46

Funciones personalizadas para vectores, donde se puede contar la cantidad de elementos, o diversas descripciones estadísticas

vect <- c(1, 2, 3, 4, 5)
len <- length(vect)
len
## [1] 5
suma <- sum(vect)
suma
## [1] 15
mediavec <- mean(vect)
mediavec
## [1] 3

Funciones de texto donde tenemos una gran diversidad como convertir la letra de minúsculas a mayúsculas o concatenar texto.

nombre <- "Jair"
apellido <- "Castro Albrecht"
nombrecompleto <- paste(nombre,apellido)
nombrecompleto
## [1] "Jair Castro Albrecht"
mayusculas <- toupper(nombrecompleto)
mayusculas
## [1] "JAIR CASTRO ALBRECHT"

Funciones lógica donde se tratan operadores lógicos como <,>,==, and, etc.

x <- 5
y <- 10
mayor <- x > y
mayor
## [1] FALSE
igual <- x == y
igual
## [1] FALSE
and <- (x < 10) & (y > 5)
and
## [1] TRUE

También funciones estadísticas como la desviación estandar, los cuartiles, la varianza, media, etc.

vec <- c(1, 2, 3, 4, 5)
desviacion <- sd(vec)
desviacion
## [1] 1.581139
cuantil <- quantile(vec, c(0.25, 0.75))
cuantil
## 25% 75% 
##   2   4

Tambien hay funciones para crear y trabajar con dataframe.

df <- data.frame(
  nombre = c("Jair", "Matías", "Maquera"),
  edad = c(18, 20, 30)
)
head(df)
##    nombre edad
## 1    Jair   18
## 2  Matías   20
## 3 Maquera   30

Tambien hay funciones de control de flujo donde se trabajan con if, else, else if,for, etc.

x <- 5
y <- 10
if (x > y) {
  print("x es mayor que y")
} else {
  print("y es mayor que x")
}
## [1] "y es mayor que x"
for (i in 1:5) {
  print(i)
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
  • Módulos Un módulo es un repertorio de definiciones, variables y funciones que pueden ser importadas para ser usadas en cualquier otro programa.

La ventja principal que podemos encontrar al momento de usar los módulos es que es mucho más sencillo poder compartir componentes con otros programadores; además que, hace que un programa pueda ser organizado en varias secciones lógicas

  • Librerías Las librerías son compilados de códigos que poseen una amplia variedad de funcionalidades. El directorio donde se almacenan los paquetes se llama biblioteca. Por defecto, Rstudio viene con una cantidad prestablecida de paquetes. Otros están disponibles para descargar, ahora procederé a explicar como hacerlo.
  1. Escribimos este código para descargarlo.
  2. install.packages(“dplyr”)
  3. Cuando ya está descargado, procedemos a cargar la biblioteca.
  4. library(dplyr)
  • Librerías principales en Rstudio En Rstudio, las librerías son un conjunto de funciones personalizadas que van más allá de la suficiencia de R. Existen diversas librerías que se llegan a especializar en cada ámbito deseado, como el análisis estadístico de datos, gráficos detallados, manipulación de datos. Estas facilitan cualquier tipo de proceso de desarrollo. Entre las librerías más significativas están
  1. Dplyr Este paquete representa un pilar esencial en el ecosistema de R para el manejo eficiente de datos en dataframes. Su conjunto de verbos intuitivos simplifica la selección y manipulación de datos, permitiendo a los analistas centrarse en la lógica analítica en lugar de la complejidad operativa. La capacidad de añadir nuevas variables con ´mutate´ y la facilidad de construir pipelines con el operador ´%>%´ fomentan un código claro y legible, facilitando el flujo de trabajo analítico y mejorando la comprensión del código.

Este paquete se destaca por su versatilidad en la selección de filas y columnas, lo que resulta crucial en el análisis exploratorio de datos. La eficiencia de dplyr, incluso en conjuntos de datos extensos, convierte a esta librería en una elección fundamental para quienes buscan una manipulación de datos poderosa y eficiente en R.

  1. Ggplot2 Ggplot2 es una potente librería en R diseñada específicamente para la creación de gráficos y visualizaciones de datos. Su enfoque principal es ofrecer una sintaxis declarativa que simplifica la construcción de gráficos complejos a partir de dataframes. Una de las características distintivas de ggplot2 es su capacidad para crear visualizaciones estéticamente agradables con un código conciso.

Con ggplot2, los usuarios pueden construir gráficos utilizando capas, donde cada capa representa un componente específico de la visualización. La función ggplot() establece el marco general, y las capas adicionales, como geom_point() para puntos o geom_line() para líneas, se agregan para definir cómo se representarán los datos. La facilidad para personalizar detalles estéticos, como colores y etiquetas, contribuye a la flexibilidad y versatilidad de ggplot2.

Además, ggplot2 permite la creación de gráficos estadísticos complejos mediante funciones como facet_grid() para la generación de gráficos facetados y stat_smooth() para la incorporación de líneas de ajuste. Esta capacidad para representar datos de manera efectiva y expresiva ha convertido a ggplot2 en una herramienta esencial para profesionales que buscan comunicar eficazmente patrones y tendencias a través de visualizaciones impactantes.

  1. tidyr

Tidyr, una librería complementaria a dplyr en el ecosistema tidyverse de R, está diseñada para facilitar la manipulación y organización de datos, especialmente en el contexto de dataframes. Su función principal es simplificar las transformaciones entre formatos de datos ancho y largo, ofreciendo una serie de verbos específicos que mejoran la estructura y limpieza de los conjuntos de datos.

La función gather() de tidyr permite llevar datos de formato ancho a largo, una operación esencial en situaciones donde las variables están distribuidas en columnas. Por otro lado, spread() realiza la operación opuesta, convirtiendo datos de formato largo a ancho. Estos verbos, combinados con la capacidad de renombrar y eliminar variables con rename() y select(), respectivamente, facilitan la creación de conjuntos de datos más organizados y adaptados a las necesidades analíticas.

Tidyr, al trabajar en armonía con dplyr y otras librerías del tidyverse, contribuye a la creación de flujos de trabajo de manipulación de datos más eficientes y coherentes en R, permitiendo a los usuarios preparar sus datos de manera óptima para análisis y visualización.

  1. shiny

Shiny es una librería en R que revoluciona la forma en que los usuarios interactúan con sus datos al permitir la creación de aplicaciones web interactivas de manera sencilla. Su funcionalidad principal se centra en transformar análisis y visualizaciones estáticas en experiencias dinámicas y accesibles a través de interfaces web. Shiny facilita la construcción de aplicaciones sin requerir conocimientos extensos de desarrollo web.

Con Shiny, los usuarios pueden crear paneles de control interactivos, gráficos actualizables en tiempo real y aplicaciones personalizadas sin tener que salir del entorno R. La capacidad de incorporar widgets, como deslizadores, botones y cuadros de texto, permite a los usuarios ajustar parámetros y observar instantáneamente cómo estos cambios afectan a los resultados. Esto hace que Shiny sea invaluable para la comunicación efectiva de resultados y hallazgos a audiencias no técnicas.

Además, Shiny se integra armoniosamente con otras librerías de R, como ggplot2 y dplyr, lo que facilita la incorporación de análisis avanzados y visualizaciones complejas en aplicaciones web. En resumen, Shiny ofrece una puerta de entrada accesible para transformar análisis de datos en experiencias interactivas y compartibles, abriendo nuevas posibilidades para la difusión y comprensión de la información.

2.2 DataFrame, Manipulación e Introducción al Análisis de Datos

  • DataFrame: Los dataframe, representan información representada en filas y columnas. Esto es muy importante en el análisis de datos estadísticamente hablando. Los componentes pertenecientes a estos, pueden ser vectores, matrices, factores o hasta otros dataframes. Los dataframes se pueden crear de manera particular, recolectando datos o importando de bases de datos, por ahora solo lo crearemos, más adelante mostraré como importar.
nombres <- c("Jair", "Matias", "Daniel", "Maquera", "Garrido", "Felupo", "Lady", "Moon", "Andrew", "Alexis")
notas <- c(85, 92, 78, 94, 88, 76, 90, 82, 96, 89)
genero <- c("Masculino", "Masculino", "Masculino", "Masculino", "Masculino", "Masculino", "Femenino", "Femenino", "Masculino", "Masculino")
dfya <- data.frame(Nombres = nombres, Notas = notas, Genero = genero)
dfya
##    Nombres Notas    Genero
## 1     Jair    85 Masculino
## 2   Matias    92 Masculino
## 3   Daniel    78 Masculino
## 4  Maquera    94 Masculino
## 5  Garrido    88 Masculino
## 6   Felupo    76 Masculino
## 7     Lady    90  Femenino
## 8     Moon    82  Femenino
## 9   Andrew    96 Masculino
## 10  Alexis    89 Masculino
  • Manipulación de datos de un dataframe Cuando tenemos un dataframe, existen infinidad de funciones que podrán modificar, seleccionar columnas, recolección de datos, discriminar variables, etc. Veremos una serie de ejemplos a continuación.
listadiscriminada <- split(dfya, dfya$Genero)
listadiscriminada
## $Femenino
##   Nombres Notas   Genero
## 7    Lady    90 Femenino
## 8    Moon    82 Femenino
## 
## $Masculino
##    Nombres Notas    Genero
## 1     Jair    85 Masculino
## 2   Matias    92 Masculino
## 3   Daniel    78 Masculino
## 4  Maquera    94 Masculino
## 5  Garrido    88 Masculino
## 6   Felupo    76 Masculino
## 9   Andrew    96 Masculino
## 10  Alexis    89 Masculino
filacombinada <- rbind(nombres,genero)
filacombinada
##         [,1]        [,2]        [,3]        [,4]        [,5]        [,6]       
## nombres "Jair"      "Matias"    "Daniel"    "Maquera"   "Garrido"   "Felupo"   
## genero  "Masculino" "Masculino" "Masculino" "Masculino" "Masculino" "Masculino"
##         [,7]       [,8]       [,9]        [,10]      
## nombres "Lady"     "Moon"     "Andrew"    "Alexis"   
## genero  "Femenino" "Femenino" "Masculino" "Masculino"
columnacombinada<-cbind(nombres,genero)
columnacombinada
##       nombres   genero     
##  [1,] "Jair"    "Masculino"
##  [2,] "Matias"  "Masculino"
##  [3,] "Daniel"  "Masculino"
##  [4,] "Maquera" "Masculino"
##  [5,] "Garrido" "Masculino"
##  [6,] "Felupo"  "Masculino"
##  [7,] "Lady"    "Femenino" 
##  [8,] "Moon"    "Femenino" 
##  [9,] "Andrew"  "Masculino"
## [10,] "Alexis"  "Masculino"
  • Introducción al análisis de datos Como breve introducción, el análisis de datos es un proceso donde se inspecciona y modelan datos con la misión de extraer una información deseada, ya sean datos, encuestas, presupuestos, etc. Esta área abarca una gran cantidad de métodos y puede llegar a servir a distintas ramas, como la estadística, la informática, la ingeniería, la economía, el marketing, etc. Cabe resaltar que más adelante con la importanción de base de datos, trabajaremos más a fondo, de manera ejemplificada lo que es el análisis de datos

2.3 Flujo del Proceso de Análisis de Datos

El proceso en el análisis de datos sigue una secuencia coherente desde la definición de objetivos hasta la iteración y mejora constante. Inicia con la adquisición de datos, seguida de la exploración, depuración y análisis estadístico. Se puede aplicar la modelización predictiva, y los resultados se presentan a través de visualizaciones efectivas. La interpretación de los resultados y la toma de decisiones informadas cierran el ciclo, destacando la importancia de la documentación y la iteración en este procedimiento dinámico y adaptable.

2.4 Importación de Datos

Dentro del entorno de trabajo, tenemos la opción de importar datasets que ya tenemos debidamente descargados. En este caso veremos como hacerlo de manera manual. Con texto cuando ya tengamos un dataset descargado.

Antes de nada, cabe resaltar que para la importanción de datos, hay un par de librerías en específico que son fundamentales para el desarrollo eficaz de estre proceso. Estoy hablando de readr y readxl. Uno permite la lectura de datos rectangulares como csv, mientras que el otro directamente archivos excel. En este caso descargaremos de kaggle una base de datos para más adelante desarrollarlo. El link del kaggle descargado es https://www.kaggle.com/datasets/santiagovolpi/los-100-clubes-de-futbol-mejor-valuados-del-mundo

a <- read.csv("C:/Users/jairc/OneDrive/Escritorio/DATASETS/most_valuable_teams (1).csv")
head(a)
##                  Club    Competition  Age Squad_size Market_value
## 1     Manchester City Premier League 27.2         23      €1.05bn
## 2 Paris Saint-Germain        Ligue 1 26.1         35     €997.75m
## 3   Manchester United Premier League 28.0         28     €937.25m
## 4          Chelsea FC Premier League 26.8         27     €882.50m
## 5        Liverpool FC Premier League 27.0         27     €879.50m
## 6       Bayern Munich     Bundesliga 25.9         26     €852.90m
##   Market_value_of_players MV_Top_18_players Share_of_MV
## 1                 €45.75m          €988.00m      93.9 %
## 2                 €28.51m          €889.00m      89.1 %
## 3                 €33.47m          €850.00m      90.7 %
## 4                 €32.69m          €816.00m      92.5 %
## 5                 €32.57m          €810.50m      92.2 %
## 6                 €32.80m          €819.90m      96.1 %

Ahora importaré de manera manual una base de datos en spss, sin código usando la ventana de herramientas. El link de la base de datos es https://proyectos.inei.gob.pe/microdatos/Consulta_por_Encuesta.asp

library(haven)
## Warning: package 'haven' was built under R version 4.3.2
b <- read_spss("C:/Users/jairc/OneDrive/Escritorio/DATASETS/V_ENL2022_100_600_P501.sav")
b
## # A tibble: 21,767 × 78
##    CONG  NSELV HOGAR TOT_HOGAR CCDD  NOMBREDD CCPP  NOMBREPP      CCDI  NOMBREDI
##    <chr> <chr> <dbl>     <dbl> <chr> <chr>    <chr> <chr>         <chr> <chr>   
##  1 00002 0012      1         1 24    TUMBES   02    CONTRALMIRAN… 01    ZORRITOS
##  2 00002 0080      1         1 24    TUMBES   02    CONTRALMIRAN… 01    ZORRITOS
##  3 00002 0119      1         1 24    TUMBES   02    CONTRALMIRAN… 01    ZORRITOS
##  4 00002 0146      1         1 24    TUMBES   02    CONTRALMIRAN… 01    ZORRITOS
##  5 00002 0203      1         1 24    TUMBES   02    CONTRALMIRAN… 01    ZORRITOS
##  6 00002 0222      1         1 24    TUMBES   02    CONTRALMIRAN… 01    ZORRITOS
##  7 00002 0252      1         1 24    TUMBES   02    CONTRALMIRAN… 01    ZORRITOS
##  8 00002 0277      1         1 24    TUMBES   02    CONTRALMIRAN… 01    ZORRITOS
##  9 00010 0003      1         1 24    TUMBES   02    CONTRALMIRAN… 01    ZORRITOS
## 10 00010 0030      1         1 24    TUMBES   02    CONTRALMIRAN… 01    ZORRITOS
## # ℹ 21,757 more rows
## # ℹ 68 more variables: UBIGEO <chr>, VIVIENDA <chr>, DOMINIO <dbl+lbl>,
## #   ESTRATO <dbl+lbl>, PER <dbl>, P101 <dbl+lbl>, P102 <dbl+lbl>,
## #   P103 <dbl+lbl>, P104 <dbl+lbl>, P105 <dbl>, P106 <dbl+lbl>,
## #   P108_1 <dbl+lbl>, P108_2 <dbl+lbl>, P108_3 <dbl+lbl>, P108_4 <dbl+lbl>,
## #   P108_5 <dbl+lbl>, P108_6 <dbl+lbl>, P109_1 <dbl+lbl>, P109_2 <dbl+lbl>,
## #   P109_3 <dbl+lbl>, P109_4 <dbl+lbl>, P109_5 <dbl+lbl>, P109_6 <dbl+lbl>, …

3 Manejo de Datos

3.1 Identificación y Manejo de Datos Missing

La identificación y manejo de datos faltantes, conocidos como “missing data” en inglés, se refieren al proceso de reconocer, analizar y tratar los valores ausentes o desconocidos dentro de un conjunto de datos. Estos valores faltantes pueden surgir por diversas razones, como errores de entrada, fallas en la medición, o simplemente porque la información no está disponible.

3.1.1 Identificación de datos faltantes

3.1.1.1 Cargar conjunto de datos

Supongamos que tienes un conjunto de datos en formato CSV y deseas cargarlo en R. Puedes usar la función read.csv() y luego verificar los valores faltantes.

datos <- read.csv("C:/Users/jairc/OneDrive/Escritorio/DATASETS/ufc-fighters-statistics (1).csv")
head(datos)
##                    name                 nickname       wins     losses
## 1          Rex Richards                          -0.5717426 -0.7291651
## 2          Luana Santos                          -0.6783976 -0.9250680
## 3    Cortavious Romious Are You Not Entertained? -0.5717426 -0.7291651
## 4           Danny Silva                  El Puma -0.4650876 -0.9250680
## 5         Angel Pacheco                          -0.5717426 -0.7291651
## 6 Charalampos Grigoriou                Ferocious -0.4650876 -0.5332622
##        draws  height_cm weight_in_kg   reach_in_cm   stance date_of_birth
## 1 -0.3213415  1.9513045    2.3795679  1.757895e-16                       
## 2 -0.3213415 -1.1918309   -1.1504868 -1.493353e+00 Orthodox    2000-04-16
## 3 -0.3213415 -1.7633101   -0.8986577 -1.167028e+00 Southpaw    1994-01-06
## 4 -0.3213415  0.2368670   -0.6462727 -5.143771e-01   Switch    1997-01-30
## 5 -0.3213415 -0.6203517   -0.6462727 -5.143771e-01 Orthodox    1992-01-13
## 6 -0.3213415 -0.9060913   -0.8986577 -1.493353e+00 Orthodox    1992-03-31
##   significant_strikes_landed_per_minute significant_striking_accuracy
## 1                              7.616951                     1.1000246
## 2                              7.341481                     1.1980394
## 3                              6.029241                    -0.2231751
## 4                              5.588489                     1.3940690
## 5                              5.353087                     0.2178915
## 6                              5.287976                     1.4430764
##   significant_strikes_absorbed_per_minute significant_strike_defence
## 1                               0.7519509                 1.31399576
## 2                               1.1835172                 1.13481501
## 3                               6.1553022                -0.07465501
## 4                               3.5027479                 0.73165834
## 5                               3.6676554                -0.34342613
## 6                               0.2993325                 0.91083908
##   average_takedowns_landed_per_15_minutes takedown_accuracy takedown_defense
## 1                              -0.6463722        -0.9153491       -1.1322854
## 2                              -0.6463722        -0.9153491        1.7698695
## 3                              -0.6463722        -0.9153491       -1.1322854
## 4                               0.3890349         1.3820159        1.7698695
## 5                              -0.6463722        -0.9153491       -0.1745743
## 6                              -0.6463722        -0.9153491       -1.1322854
##   average_submissions_attempted_per_15_minutes reach_in_cm_mediana
## 1                                     7.616951        1.757895e-16
## 2                                     7.341481       -1.493353e+00
## 3                                     6.029241       -1.167028e+00
## 4                                     5.588489       -5.143771e-01
## 5                                     5.353087       -5.143771e-01
## 6                                     5.287976       -1.493353e+00
# Reemplaza 'ruta/a/tu/dataset.csv' con la ruta de tu conjunto de datos CSV
datos <- read.csv("C:/Users/jairc/OneDrive/Escritorio/DATASETS/ufc-fighters-statistics (1).csv")

# Verificar los valores faltantes en todo el conjunto de datos
print(sum(is.na(datos)))  # Muestra la cantidad total de valores faltantes en el conjunto de datos
## [1] 384

3.1.1.2 Eliminar filas con valores faltantes

A veces, eliminar filas con datos faltantes puede ser una opción si las filas con datos faltantes son pocas en comparación con el tamaño total del conjunto de datos.

# Eliminar filas con valores faltantes
datos_sin_na <- na.omit(datos)
head(datos_sin_na)
##                    name                 nickname       wins     losses
## 1          Rex Richards                          -0.5717426 -0.7291651
## 2          Luana Santos                          -0.6783976 -0.9250680
## 3    Cortavious Romious Are You Not Entertained? -0.5717426 -0.7291651
## 4           Danny Silva                  El Puma -0.4650876 -0.9250680
## 5         Angel Pacheco                          -0.5717426 -0.7291651
## 6 Charalampos Grigoriou                Ferocious -0.4650876 -0.5332622
##        draws  height_cm weight_in_kg   reach_in_cm   stance date_of_birth
## 1 -0.3213415  1.9513045    2.3795679  1.757895e-16                       
## 2 -0.3213415 -1.1918309   -1.1504868 -1.493353e+00 Orthodox    2000-04-16
## 3 -0.3213415 -1.7633101   -0.8986577 -1.167028e+00 Southpaw    1994-01-06
## 4 -0.3213415  0.2368670   -0.6462727 -5.143771e-01   Switch    1997-01-30
## 5 -0.3213415 -0.6203517   -0.6462727 -5.143771e-01 Orthodox    1992-01-13
## 6 -0.3213415 -0.9060913   -0.8986577 -1.493353e+00 Orthodox    1992-03-31
##   significant_strikes_landed_per_minute significant_striking_accuracy
## 1                              7.616951                     1.1000246
## 2                              7.341481                     1.1980394
## 3                              6.029241                    -0.2231751
## 4                              5.588489                     1.3940690
## 5                              5.353087                     0.2178915
## 6                              5.287976                     1.4430764
##   significant_strikes_absorbed_per_minute significant_strike_defence
## 1                               0.7519509                 1.31399576
## 2                               1.1835172                 1.13481501
## 3                               6.1553022                -0.07465501
## 4                               3.5027479                 0.73165834
## 5                               3.6676554                -0.34342613
## 6                               0.2993325                 0.91083908
##   average_takedowns_landed_per_15_minutes takedown_accuracy takedown_defense
## 1                              -0.6463722        -0.9153491       -1.1322854
## 2                              -0.6463722        -0.9153491        1.7698695
## 3                              -0.6463722        -0.9153491       -1.1322854
## 4                               0.3890349         1.3820159        1.7698695
## 5                              -0.6463722        -0.9153491       -0.1745743
## 6                              -0.6463722        -0.9153491       -1.1322854
##   average_submissions_attempted_per_15_minutes reach_in_cm_mediana
## 1                                     7.616951        1.757895e-16
## 2                                     7.341481       -1.493353e+00
## 3                                     6.029241       -1.167028e+00
## 4                                     5.588489       -5.143771e-01
## 5                                     5.353087       -5.143771e-01
## 6                                     5.287976       -1.493353e+00

3.1.1.3 Imputación de valores faltantes

La imputación implica reemplazar los valores faltantes con algún valor estimado, como la media, la mediana o un valor predicho.

# Imputación usando la media de la columna
datos$reach_in_cm <- ifelse(is.na(datos$reach_in_cm), mean(datos$reach_in_cm, na.rm = TRUE), datos$reach_in_cm)
# Imputación usando la mediana de la columna
datos$reach_in_cm_mediana <- ifelse(is.na(datos$reach_in_cm), median(datos$reach_in_cm, na.rm = TRUE), datos$reach_in_cm)
head(datos)
##                    name                 nickname       wins     losses
## 1          Rex Richards                          -0.5717426 -0.7291651
## 2          Luana Santos                          -0.6783976 -0.9250680
## 3    Cortavious Romious Are You Not Entertained? -0.5717426 -0.7291651
## 4           Danny Silva                  El Puma -0.4650876 -0.9250680
## 5         Angel Pacheco                          -0.5717426 -0.7291651
## 6 Charalampos Grigoriou                Ferocious -0.4650876 -0.5332622
##        draws  height_cm weight_in_kg   reach_in_cm   stance date_of_birth
## 1 -0.3213415  1.9513045    2.3795679  1.757895e-16                       
## 2 -0.3213415 -1.1918309   -1.1504868 -1.493353e+00 Orthodox    2000-04-16
## 3 -0.3213415 -1.7633101   -0.8986577 -1.167028e+00 Southpaw    1994-01-06
## 4 -0.3213415  0.2368670   -0.6462727 -5.143771e-01   Switch    1997-01-30
## 5 -0.3213415 -0.6203517   -0.6462727 -5.143771e-01 Orthodox    1992-01-13
## 6 -0.3213415 -0.9060913   -0.8986577 -1.493353e+00 Orthodox    1992-03-31
##   significant_strikes_landed_per_minute significant_striking_accuracy
## 1                              7.616951                     1.1000246
## 2                              7.341481                     1.1980394
## 3                              6.029241                    -0.2231751
## 4                              5.588489                     1.3940690
## 5                              5.353087                     0.2178915
## 6                              5.287976                     1.4430764
##   significant_strikes_absorbed_per_minute significant_strike_defence
## 1                               0.7519509                 1.31399576
## 2                               1.1835172                 1.13481501
## 3                               6.1553022                -0.07465501
## 4                               3.5027479                 0.73165834
## 5                               3.6676554                -0.34342613
## 6                               0.2993325                 0.91083908
##   average_takedowns_landed_per_15_minutes takedown_accuracy takedown_defense
## 1                              -0.6463722        -0.9153491       -1.1322854
## 2                              -0.6463722        -0.9153491        1.7698695
## 3                              -0.6463722        -0.9153491       -1.1322854
## 4                               0.3890349         1.3820159        1.7698695
## 5                              -0.6463722        -0.9153491       -0.1745743
## 6                              -0.6463722        -0.9153491       -1.1322854
##   average_submissions_attempted_per_15_minutes reach_in_cm_mediana
## 1                                     7.616951        1.757895e-16
## 2                                     7.341481       -1.493353e+00
## 3                                     6.029241       -1.167028e+00
## 4                                     5.588489       -5.143771e-01
## 5                                     5.353087       -5.143771e-01
## 6                                     5.287976       -1.493353e+00

3.2 Identificación y Manejo de Datos Outlier e Inconsistentes

  • Identificación de outliers en una columna específica

queremos identificar outliers en la columna llamada ‘significant_striking_accuracy’:

# Tenemos una columna 'datos$significant_striking_accuracy'
columna_outliers <- datos$significant_striking_accuracy

# Calcular el rango intercuartílico (IQR) ignorando los valores faltantes
Q1 <- quantile(columna_outliers, 0.25, na.rm = TRUE)
Q3 <- quantile(columna_outliers, 0.75, na.rm = TRUE)
IQR_valor <- Q3 - Q1

# Definir los límites para identificar outliers
umbral_inferior <- Q1 - 1.5 * IQR_valor
umbral_superior <- Q3 + 1.5 * IQR_valor

# Identificar outliers
outliers <- columna_outliers[columna_outliers < umbral_inferior | columna_outliers > umbral_superior]

print(outliers)
##  [1] 3.158335 2.521239 2.472232 2.766276 3.158335 2.325210 2.325210 2.423224
##  [9] 2.423224 3.158335 3.158335 3.158335 2.521239 3.158335 3.158335 3.158335
## [17] 3.158335 3.158335 3.158335 3.158335 3.158335 3.158335 2.325210 3.158335
## [25] 3.158335 3.158335 3.158335
  • Eliminar outliers del conjunto de datos
# Eliminar outliers del conjunto de datos
datos_limpio <- datos[!(columna_outliers %in% outliers), ]
  • Mostrar el nuevo conjunto de datos sin outliers
# Mostrar el nuevo conjunto de datos sin outliers
head(datos_limpio)
##                    name                 nickname       wins     losses
## 1          Rex Richards                          -0.5717426 -0.7291651
## 2          Luana Santos                          -0.6783976 -0.9250680
## 3    Cortavious Romious Are You Not Entertained? -0.5717426 -0.7291651
## 4           Danny Silva                  El Puma -0.4650876 -0.9250680
## 5         Angel Pacheco                          -0.5717426 -0.7291651
## 6 Charalampos Grigoriou                Ferocious -0.4650876 -0.5332622
##        draws  height_cm weight_in_kg   reach_in_cm   stance date_of_birth
## 1 -0.3213415  1.9513045    2.3795679  1.757895e-16                       
## 2 -0.3213415 -1.1918309   -1.1504868 -1.493353e+00 Orthodox    2000-04-16
## 3 -0.3213415 -1.7633101   -0.8986577 -1.167028e+00 Southpaw    1994-01-06
## 4 -0.3213415  0.2368670   -0.6462727 -5.143771e-01   Switch    1997-01-30
## 5 -0.3213415 -0.6203517   -0.6462727 -5.143771e-01 Orthodox    1992-01-13
## 6 -0.3213415 -0.9060913   -0.8986577 -1.493353e+00 Orthodox    1992-03-31
##   significant_strikes_landed_per_minute significant_striking_accuracy
## 1                              7.616951                     1.1000246
## 2                              7.341481                     1.1980394
## 3                              6.029241                    -0.2231751
## 4                              5.588489                     1.3940690
## 5                              5.353087                     0.2178915
## 6                              5.287976                     1.4430764
##   significant_strikes_absorbed_per_minute significant_strike_defence
## 1                               0.7519509                 1.31399576
## 2                               1.1835172                 1.13481501
## 3                               6.1553022                -0.07465501
## 4                               3.5027479                 0.73165834
## 5                               3.6676554                -0.34342613
## 6                               0.2993325                 0.91083908
##   average_takedowns_landed_per_15_minutes takedown_accuracy takedown_defense
## 1                              -0.6463722        -0.9153491       -1.1322854
## 2                              -0.6463722        -0.9153491        1.7698695
## 3                              -0.6463722        -0.9153491       -1.1322854
## 4                               0.3890349         1.3820159        1.7698695
## 5                              -0.6463722        -0.9153491       -0.1745743
## 6                              -0.6463722        -0.9153491       -1.1322854
##   average_submissions_attempted_per_15_minutes reach_in_cm_mediana
## 1                                     7.616951        1.757895e-16
## 2                                     7.341481       -1.493353e+00
## 3                                     6.029241       -1.167028e+00
## 4                                     5.588489       -5.143771e-01
## 5                                     5.353087       -5.143771e-01
## 6                                     5.287976       -1.493353e+00

3.3 Limpieza de Datos y Preparación de Datos

  • Identificación de valores faltantes:
# Verificar los valores faltantes en todo el conjunto de datos
print(sum(is.na(datos)))  # Muestra la cantidad total de valores faltantes en el conjunto de datos
## [1] 384
# Eliminar filas con valores faltantes
datos_sin_na <- na.omit(datos)
  • Estandarización de datos numéricos:
# Seleccionar columnas numéricas
columnas_numericas <- sapply(datos, is.numeric)

# Estandarizar columnas numéricas (restar la media y dividir por la desviación estándar)
datos[columnas_numericas] <- scale(datos[columnas_numericas])
head(datos)
##                    name                 nickname       wins     losses
## 1          Rex Richards                          -0.5717426 -0.7291651
## 2          Luana Santos                          -0.6783976 -0.9250680
## 3    Cortavious Romious Are You Not Entertained? -0.5717426 -0.7291651
## 4           Danny Silva                  El Puma -0.4650876 -0.9250680
## 5         Angel Pacheco                          -0.5717426 -0.7291651
## 6 Charalampos Grigoriou                Ferocious -0.4650876 -0.5332622
##        draws  height_cm weight_in_kg   reach_in_cm   stance date_of_birth
## 1 -0.3213415  1.9513045    2.3795679  1.757351e-16                       
## 2 -0.3213415 -1.1918309   -1.1504868 -1.493353e+00 Orthodox    2000-04-16
## 3 -0.3213415 -1.7633101   -0.8986577 -1.167028e+00 Southpaw    1994-01-06
## 4 -0.3213415  0.2368670   -0.6462727 -5.143771e-01   Switch    1997-01-30
## 5 -0.3213415 -0.6203517   -0.6462727 -5.143771e-01 Orthodox    1992-01-13
## 6 -0.3213415 -0.9060913   -0.8986577 -1.493353e+00 Orthodox    1992-03-31
##   significant_strikes_landed_per_minute significant_striking_accuracy
## 1                              7.616951                     1.1000246
## 2                              7.341481                     1.1980394
## 3                              6.029241                    -0.2231751
## 4                              5.588489                     1.3940690
## 5                              5.353087                     0.2178915
## 6                              5.287976                     1.4430764
##   significant_strikes_absorbed_per_minute significant_strike_defence
## 1                               0.7519509                 1.31399576
## 2                               1.1835172                 1.13481501
## 3                               6.1553022                -0.07465501
## 4                               3.5027479                 0.73165834
## 5                               3.6676554                -0.34342613
## 6                               0.2993325                 0.91083908
##   average_takedowns_landed_per_15_minutes takedown_accuracy takedown_defense
## 1                              -0.6463722        -0.9153491       -1.1322854
## 2                              -0.6463722        -0.9153491        1.7698695
## 3                              -0.6463722        -0.9153491       -1.1322854
## 4                               0.3890349         1.3820159        1.7698695
## 5                              -0.6463722        -0.9153491       -0.1745743
## 6                              -0.6463722        -0.9153491       -1.1322854
##   average_submissions_attempted_per_15_minutes reach_in_cm_mediana
## 1                                     7.616951        1.757351e-16
## 2                                     7.341481       -1.493353e+00
## 3                                     6.029241       -1.167028e+00
## 4                                     5.588489       -5.143771e-01
## 5                                     5.353087       -5.143771e-01
## 6                                     5.287976       -1.493353e+00
  • Guardar el dataset limpio:
# Guardar el dataset limpio en un nuevo archivo CSV
write.csv(datos, "C:/Users/jairc/OneDrive/Escritorio/DATASETS/ufc-fighters-statistics (1).csv", row.names = FALSE)

4 Visualización de Datos

4.1 Visualización de Datos Univariados

4.1.1 Histograma:

Un histograma es una representación gráfica de la distribución de una variable numérica. Divide los datos en intervalos y muestra la frecuencia (o densidad) de los valores en cada intervalo mediante barras. Es útil para entender la forma y la dispersión de una distribución de datos, permitiendo identificar patrones como la simetría, la asimetría, la concentración de valores, y los valores atípicos.

# Supongamos que queremos visualizar la distribución de la columna 'variable_a_analizar'
hist(datos$significant_strikes_absorbed_per_minute
, main = "Histograma de significant_strikes_absorbed_per_minute
", xlab = "Valores", ylab = "Frecuencia")

4.1.2 Gráfico de Densidad:

El gráfico de densidad es una representación visual suave de la distribución de una variable numérica. Muestra la estimación de la densidad de probabilidad de los datos. Es similar al histograma pero suavizado, lo que hace que sea útil para identificar patrones en la forma de la distribución de los datos, como la simetría, la multimodalidad y las áreas de alta densidad.

# Gráfico de densidad para la misma variable 'significant_strikes_absorbed_per_minute'
plot(density(datos$significant_strikes_absorbed_per_minute), main = "Gráfico de Densidad de significant_strikes_absorbed_per_minute", xlab = "Valores", ylab = "Densidad")

4.1.3 Gráfico de Caja (Boxplot):

El gráfico de caja es una representación gráfica que muestra la distribución de una variable numérica mediante cuartiles. Muestra la mediana, los cuartiles, y los posibles valores atípicos. Es útil para identificar la posición central de los datos, la dispersión, así como la presencia de valores atípicos o la asimetría en la distribución.

# Gráfico de caja para la misma variable 'wins'
boxplot(datos$wins, main = "Gráfico de Caja de wins", ylab = "Valores")

4.1.4 Gráfico de Barras (para variables categóricas):

El gráfico de barras representa la frecuencia o el recuento de valores de una variable categórica. Muestra cada categoría en el eje x y su frecuencia en el eje y, con barras rectangulares. Es útil para comparar la frecuencia de diferentes categorías y entender la distribución de una variable categórica.

# Gráfico de barras para la distribución de esta variable ´stance´
barplot(table(datos$stance), main = "Gráfico de Barras de stance", xlab = "Categorías", ylab = "Frecuencia")

4.2 Visualización de Datos Bivariados

4.2.1 Gráfico de Dispersión:

Un gráfico de dispersión muestra la relación entre dos variables numéricas. Cada punto en el gráfico representa una observación con valores para ambas variables, lo que permite identificar patrones visuales de asociación, tendencia, dispersión y posibles valores atípicos.

# Supongamos que queremos visualizar la relación entre 'variable_x' y 'variable_y'
plot(datos$wins, datos$losses, 
     main = "Gráfico de Dispersión",
     xlab = "wins X", ylab = "losses Y")

4.2.2 Gráfico de Líneas:

Un gráfico de líneas muestra la relación entre dos variables numéricas utilizando líneas conectando puntos de datos ordenados. Es útil para representar cambios y tendencias en una variable a lo largo de la otra variable.

# Supongamos que queremos visualizar la tendencia de 'variable_y' en función de 'variable_x'
plot(datos$wins, datos$losses, 
     type = "l", 
     main = "Gráfico de Líneas",
     xlab = "wins X", ylab = "losses Y")

4.2.3 Gráfico de Barras Agrupadas o Apiladas:

Un gráfico de barras muestra la comparación entre dos variables categóricas o una variable categórica frente a una numérica. Puede ser agrupado o apilado, representando la relación entre las variables categóricas y la frecuencia o suma de la variable numérica.

# Supongamos que queremos comparar la frecuencia de 'variable_y' para diferentes categorías de 'variable_categorica'
barplot(table(datos$stance, datos$wins), 
        main = "Gráfico de Barras",
        xlab = "stance", ylab = "wins Y")

4.3 Visualización de Datos Multivariados

4.3.1 Gráfico de dispersión (para datos bivariados):

# Supongamos que queremos visualizar la relación entre dos variables 'wins' y 'losses'
plot(datos$wins, datos$losses, 
     main = "Gráfico de Dispersión", 
     xlab = "wins", ylab = "losses")

4.3.2 Matriz de dispersión (para datos multivariados):

# Calcular la matriz de dispersión
matriz_dispersión <- cor(datos[c('wins', 'losses', 'takedown_defense')])

# Mostrar la matriz de dispersión en la consola
print(matriz_dispersión)
##                       wins     losses takedown_defense
## wins             1.0000000 0.62580317       0.24023286
## losses           0.6258032 1.00000000       0.05553998
## takedown_defense 0.2402329 0.05553998       1.00000000

4.3.3 Gráfico de correlación (mapa de calor):

Usamos corrplot

# Convertir las variables a numéricas si no lo están
sipi <- as.numeric(datos$wins)
nopi <- as.numeric(datos$losses)

# Crear una matriz con ambas variables
matriz_datos <- cbind(sipi, nopi)

# Calcular la matriz de correlación
matriz_correlacion <- cor(matriz_datos)

# Gráfico de calor para visualizar la matriz de correlación
library(corrplot)  # Asegúrate de cargar la librería corrplot
## Warning: package 'corrplot' was built under R version 4.3.2
## corrplot 0.92 loaded
corrplot(matriz_correlacion, method = "color")

4.4 Visualización de Datos Avanzados (Imágenes)

Usamos la librería oro.nifti

library(oro.nifti)
## Warning: package 'oro.nifti' was built under R version 4.3.2
## oro.nifti 0.11.4
ruta_imagen <- "C:/Users/jairc/OneDrive/Escritorio/DATASETS/1-004.nii"
imagen_nifti <- readNIfTI(ruta_imagen)

# Visualizar una sección de la imagen
slice <- 1
imagen_slice <- imagen_nifti[,,slice]

# Utilizar la función 'image' para mostrar la imagen
image(imagen_slice, col = gray.colors(256), main = "Imagen Médica")

4.4.1 Visualización 3D con rgl:

rgl es una librería potente para gráficos en 3D interactivos en R. Permite representar gráficos tridimensionales y escenas interactivas.

# Cargar los datos
library(rgl)
## Warning: package 'rgl' was built under R version 4.3.2
datos <- read.csv("C:/Users/jairc/OneDrive/Escritorio/DATASETS/ufc-fighters-statistics (1).csv")

# Supongamos que 'x', 'y' y 'z' son columnas numéricas de tu dataset
plot3d(datos$wins, datos$wins, datos$significant_strikes_landed_per_minute, col = "blue", size = 2)

4.4.2 Gráficos 3D Interactivos con plotly:

plotly es una librería que permite crear gráficos interactivos en R, incluyendo visualizaciones 3D.

# Cargar los datos
library(plotly)
## Warning: package 'plotly' was built under R version 4.3.2
## Loading required package: ggplot2
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:oro.nifti':
## 
##     slice
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
datos <- read.csv("C:/Users/jairc/OneDrive/Escritorio/DATASETS/ufc-fighters-statistics (1).csv")

# Supongamos que 'x', 'y' y 'z' son columnas numéricas de tu dataset
fig <- plot_ly(
  data = datos,
  x = ~wins,
  y = ~losses,
  z = ~significant_strikes_landed_per_minute,
  type = "scatter3d",
  mode = "markers",
  marker = list(size = 5)
)

fig

5 Manipulación de Datos No Estructurados - Texto

Los datos no estructurados, carecen de una organización, son datos que llegan sin procesar, y están formados por fotos, videos, audios, etc. Como no tienen una organización para que se pueda ordenar de manera adecuada, por lo que no se podría poner en una tabla ni en una base de datos. Es un conglomerado masivo y desorganizado que no llega a tener valor hasta que se identifiquen de manera organizada. En el caso del texto, R facilita la extracción de la informacion adecuada. Para imágenes y audio se necesitan bibliotecas como magick e imager o turner # Conclusiones

  • La capacidad de manipular DataFrames en R establece un cimiento robusto para la ejecución eficaz de análisis de datos, capacitando a los usuarios para explorar, transformar y adecuar datos de manera eficiente antes de adentrarse en análisis más complejos.

  • En el contexto de R, la administración de datos implica enfrentarse a valores faltantes, outliers e incongruencias, lo que desempeña un papel crucial en la mejora de la calidad de los resultados analíticos. Este procedimiento resulta fundamental para asegurar la integridad y confiabilidad de los datos previo a la realización de análisis más sofisticados.

  • La visualización de datos en R es crucial para representar patrones y relaciones en conjuntos de datos, facilitando la interpretación y comunicación efectiva de la información. Este enfoque mejora la comprensión intuitiva de datos univariados y bivariados, así como matrices de correlación, proporcionando una herramienta esencial en el análisis de datos.

#Referencias

Wickham, H., & Grolemund, G. (2017). R for Data Science. O’Reilly Media. R Core Team (2021). R: A language and environment for statistical computing. R Foundation for Statistical Computing.

Zuur, A., Ieno, E. N., & Meesters, E. (2009). A Beginner’s Guide to R. Springer Science & Business Media. Fox, J., & Weisberg, S. (2019). An R Companion to Applied Regression. Sage.

Wickham, H. (2019). Advanced R. CRC Press. Peng, R. D. (2015). Exploratory Data Analysis with R. Springer. Visualización de datos:

Wickham, H. (2016). ggplot2: Elegant Graphics for Data Analysis. Springer. Kabacoff, R. I. (2011). R in Action: Data Analysis and Graphics with R. Manning Publications.

Chang, W. (2013). R Graphics Cookbook. O’Reilly Media. Murrell, P. (2005). R Graphics. CRC Press.

Sarkar, D. (2008). Lattice: Multivariate Data Visualization with R. Springer. Friendly, M., & Kwan, E. (2018). Data Visualization with R: 100 Examples. CRC Press.

Sievert, C. (2020). Interactive web-based data visualization with R, plotly, and shiny. CRC Press. Chang, W. (2018). R Graphics Cookbook: Practical Recipes for Visualizing Data. O’Reilly Media.