Trabajo final:

Programacion en lenguaje estadistico

Guevara Ponce Victor Manuel

Integrantes:

Manipulacion de Data Frame

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

Módulos y Librerías:

Para poder hacer uso de ciertas librerías, primero debemos descargar los paquetes usando la función install.package() y para poder manejarlos, llamaremos a la librería con la función library().

A continuación mencionaremos algunas librerías principales en R.

  • readxl: Permite leer archivos importados en formato excel con extensión xlsx. y xls.

  • dplyr y tidyr : Proporciona funciones para manipulación, transformación y organización de datos (dataframe).

  • ggplot2: Permite organizar gráficos estadísticos como histogramas, diagrama de barras, gráficos de dispersión, gráfico de cajas, entre otros.

  • tidyverse: Un conjunto de paquetes que incluye dplyr, ggplot2, tidyr y otros, diseñados para facilitar el flujo de trabajo del análisis de datos.

#Instalaremos el paquete “tidyverse” y “readxl”
install.packages("tidyverse", dependencies=TRUE, repos='http://cran.rstudio.com/')
## Installing package into 'C:/Users/Danie/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'tidyverse' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\Danie\AppData\Local\Temp\RtmpG4fyma\downloaded_packages
install.packages("readxl", dependencies=TRUE, repos='http://cran.rstudio.com/')
## Installing package into 'C:/Users/Danie/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'readxl' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\Danie\AppData\Local\Temp\RtmpG4fyma\downloaded_packages
#Ahora llamaremos a estas librerías para poder usarlas más adelante
library("tidyverse")
## Warning: package 'tidyverse' was built under R version 4.3.2
## Warning: package 'ggplot2' was built under R version 4.3.2
## Warning: package 'tidyr' was built under R version 4.3.2
## Warning: package 'readr' was built under R version 4.3.2
## Warning: package 'purrr' was built under R version 4.3.2
## Warning: package 'dplyr' was built under R version 4.3.2
## Warning: package 'stringr' was built under R version 4.3.2
## Warning: package 'forcats' was built under R version 4.3.2
## Warning: package 'lubridate' was built under R version 4.3.2
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.3     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.4.4     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.0
## ✔ purrr     1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library("readxl")
## Warning: package 'readxl' was built under R version 4.3.2
library("dplyr")
library("ggplot2")

Funciones:

Al llamar a ciertas librerías, tenemos acceso a algunas funciones (códigos) que se usan para desempeñar tareas específicas, como obtener ciertas medidas estadísticas de un conjunto de datos, crear matrices, tablas, gráficos, entre otros.

Algunas de las funciones son:

  • mean(): Calcula la media de un conjunto de datos.

  • sd(): Calcula la desviación estándar de un conjunto de datos.

  • sum(): Calcula la suma de un conjunto de datos. min(), max(): Encuentran el valor mínimo y máximo en un conjunto de datos.

  • view(): Para ver una data importada o una data propia de R

  • length(): Calcula la longitud de un vector o una lista.

  • table(): Crea una tabla de frecuencias o una tabla de contingencia.

  • plot(): Crea gráficos básicos.

  • hist(): Crea un histograma.

A lo largo del documento estaremos mencionando más funciones.

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

Dataframe:

Son estructuras de dos dimensiones (fila:sujeto y columna:variable) que permiten almacenar y manipular conjuntos de datos heterogéneos, esto quiere decir que pueden ser de carácter entero, numérico, factor, cadena de texto, lógico, o NULL a la vez

Podemos crear dataframe con la función data.frame()

Ejemplo:

#Podemos crear una data de manera directa

data.frame(c("Lady","Daniel", "Estefano"), c(19, 19, 20), c("Voley", "Salsa", "Calistenia"))
##   c..Lady....Daniel....Estefano.. c.19..19..20.
## 1                            Lady            19
## 2                          Daniel            19
## 3                        Estefano            20
##   c..Voley....Salsa....Calistenia..
## 1                             Voley
## 2                             Salsa
## 3                        Calistenia
#También podemos crear vectores, o listas y luego unirlas con la función 
nombre <- c("Lady","Daniel", "Estefano") 
edad <-c(19, 19, 20) 
hobby <-c("Voley", "Salsa", "Calistenia") 
datos1 <-data.frame(nombre, edad, hobby) 
datos1
##     nombre edad      hobby
## 1     Lady   19      Voley
## 2   Daniel   19      Salsa
## 3 Estefano   20 Calistenia

Manipulación e introducción al análisis de datos:

Una vez que tenemos el data frame, podemos usar algunas funciones que mencionaremos para manipular los datos

  • head(): Para ver las primeras filas que conforman nuestra data
head(datos1)
##     nombre edad      hobby
## 1     Lady   19      Voley
## 2   Daniel   19      Salsa
## 3 Estefano   20 Calistenia
  • str(): Para obtener información sobre las columnas
str(datos1)
## 'data.frame':    3 obs. of  3 variables:
##  $ nombre: chr  "Lady" "Daniel" "Estefano"
##  $ edad  : num  19 19 20
##  $ hobby : chr  "Voley" "Salsa" "Calistenia"
  • subset() o nombredeladata#columna: Se usa para seleccionar columnas específicas
subset(datos1, datos1$edad<20) 
##   nombre edad hobby
## 1   Lady   19 Voley
## 2 Daniel   19 Salsa
subset(datos1, datos1$hobby=="salsa")
## [1] nombre edad   hobby 
## <0 rows> (or 0-length row.names)

nombredeladata&nuevacolumna: Para agregar una nueva columna a un DataFrame

mutate(): Para agregar columna de datos

datos1$ingreso <-c(1200, 1500, 2000) 

datos1
##     nombre edad      hobby ingreso
## 1     Lady   19      Voley    1200
## 2   Daniel   19      Salsa    1500
## 3 Estefano   20 Calistenia    2000
datos1<- mutate(datos1, ahorro=ingreso-1000) 
datos1
##     nombre edad      hobby ingreso ahorro
## 1     Lady   19      Voley    1200    200
## 2   Daniel   19      Salsa    1500    500
## 3 Estefano   20 Calistenia    2000   1000

mean(nombredataf$ columna): Se usa para calcular la media de una columna específica

mean(datos1$ ahorro) 
## [1] 566.6667
#lo mismo para calcular la suma: sum()

summary(): Resúmen estadístico de la data

summary(datos1)
##     nombre               edad          hobby              ingreso    
##  Length:3           Min.   :19.00   Length:3           Min.   :1200  
##  Class :character   1st Qu.:19.00   Class :character   1st Qu.:1350  
##  Mode  :character   Median :19.00   Mode  :character   Median :1500  
##                     Mean   :19.33                      Mean   :1567  
##                     3rd Qu.:19.50                      3rd Qu.:1750  
##                     Max.   :20.00                      Max.   :2000  
##      ahorro      
##  Min.   : 200.0  
##  1st Qu.: 350.0  
##  Median : 500.0  
##  Mean   : 566.7  
##  3rd Qu.: 750.0  
##  Max.   :1000.0

summarise(): Se usa para obtener resúmenes específicos

summarise(datos1, mean(ingreso), median(ahorro))
##   mean(ingreso) median(ahorro)
## 1      1566.667            500

filter(): Se usa para filtrar filas que cumplen ciertos requisitos

ganadores<-filter(datos1, ahorro>=500) 
ganadores
##     nombre edad      hobby ingreso ahorro
## 1   Daniel   19      Salsa    1500    500
## 2 Estefano   20 Calistenia    2000   1000

Flujo del proceso de análisis de datos.

  1. Lo primero se deber hacer es cargar los datos en RStudio. Estos pueden ser importados desde archivos en diferentes formatos como CSV, Excel, bases de datos, etc. Puedes utilizar funciones como read.csv(), read_spss(), read_excel(), read.table(), dependiendo del formato de tus datos.

  2. Una vez que los datos están cargados, debemos explorarlos para conocer su estructura y sus características. Se pueden usar funciones como head(), summary(), str(), View() para visualizar las primeras filas, el resumen estadístico, la estructura de los datos y ver los datos en una tabla, respectivamente.

  3. Luego de conocer la data, debemos limpiar y preparar el contenido, para esto se tiene que identificar y tratar los datos faltantes, duplicados o inconsistentes. Se pueden usar las funciones is.na(), duplicated(), complete.cases() para identificar datos faltantes, duplicados o filas incompletas. Luego, puedes eliminar o imputar los valores faltantes, eliminar duplicados y realizar transformaciones de datos si es necesario.

  4. Manipulación y transformación de los datos: Aquí es donde puedes realizar operaciones de manipulación de datos, como filtrar filas, seleccionar columnas, crear nuevas variables, unir o dividir conjuntos de datos, utilizando funciones del paquete dplyr como filter(), select(), mutate(), join(), entre otros.

  5. Análisis de los datos: En esta etapa, puedes realizar diferentes análisis en tus datos según tus objetivos. Puedes calcular estadísticas descriptivas, realizar pruebas de hipótesis, ajustar modelos estadísticos, utilizar técnicas de aprendizaje automático, entre otras cosas. R cuenta con una amplia gama de paquetes y funciones para realizar análisis avanzados.

  6. Visualización de los resultados: Una vez que hayas realizado el análisis, es importante visualizar los resultados para comunicar tus hallazgos de manera efectiva. Utiliza funciones y paquetes como ggplot2, plotly o ggvis para crear gráficos y visualizaciones interactivas que resalten los aspectos clave de tus datos y análisis.

  7. Presentación y comunicación de los resultados: Finalmente, deberás presentar tus resultados de manera clara y concisa. Puedes utilizar herramientas como R Markdown para crear informes o presentaciones dinámicas que combinen texto, código y visualizaciones.

Importación de datos (ejemplificar para diversos tipos de archivos)

Para poder importar diferentes tipos de datos, instalaremos el paquete “haven” y llamaremos a la librería readxl

install.packages("haven", dependencies=TRUE, repos='http://cran.rstudio.com/')
## Installing package into 'C:/Users/Danie/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## 
##   There is a binary version available but the source version is later:
##       binary source needs_compilation
## haven  2.5.3  2.5.4              TRUE
## 
##   Binaries will be installed
## package 'haven' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\Danie\AppData\Local\Temp\RtmpG4fyma\downloaded_packages
library("haven")
## Warning: package 'haven' was built under R version 4.3.2
library("readxl")
  1. Podemos importar datos descargados que tenemos en el ordenador

1.1. En la barra de RStudio, encontraremos la opción “file” seleccionamos la opción “Import Dataset” y elegimos el tipo de formato en el que está nuestro archivo

install.packages("imager", dependencies=TRUE, repos='http://cran.rstudio.com/')
## Installing package into 'C:/Users/Danie/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'imager' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\Danie\AppData\Local\Temp\RtmpG4fyma\downloaded_packages
library(imager)
## Warning: package 'imager' was built under R version 4.3.2
## Loading required package: magrittr
## 
## Attaching package: 'magrittr'
## The following object is masked from 'package:purrr':
## 
##     set_names
## The following object is masked from 'package:tidyr':
## 
##     extract
## 
## Attaching package: 'imager'
## The following object is masked from 'package:magrittr':
## 
##     add
## The following object is masked from 'package:stringr':
## 
##     boundary
## The following object is masked from 'package:dplyr':
## 
##     where
## The following object is masked from 'package:tidyr':
## 
##     fill
## The following objects are masked from 'package:stats':
## 
##     convolve, spectrum
## The following object is masked from 'package:graphics':
## 
##     frame
## The following object is masked from 'package:base':
## 
##     save.image
imagen <- load.image("C:\\Users\\Danie\\OneDrive\\Escritorio\\WhatsApp Image 2023-12-01 at 4.49.00 PM.png")

plot(imagen, axes = FALSE)

Nos aparecerá una ventana, en la cual debemos que buscar nuestro archivo dandole click en la opción “browse”, y una vez cargados los datos, nos aparecerá una opción para ver el código, la dirección y el nombre con el que se guardará el archivo, este último se puede modificar antes de copiar el código y cargarlo en el R

install.packages("imager", dependencies=TRUE, repos='http://cran.rstudio.com/')
## Warning: package 'imager' is in use and will not be installed
library(imager)
imagen <- load.image("C:\\Users\\Danie\\OneDrive\\Escritorio\\WhatsApp Image 2023-12-01 at 4.49.28 PM.png")

plot(imagen, axes = FALSE)

1.2 Si ya conocemos la dirección de nuestra data, podemos usar las siguientes funciones para importarlo:

Importar datos de excel en formato .xlsx

data_excel<-read_excel(“dirección/de/la/data..xlsx”)

Importar archivos de tipo SPSS

data_spss<- read_sav(“dirección/de/la/data..sav”)

Importar archivos de tipo STATA

data_STATA<- read_dta(“dirección/de/la/data.dta”)

Importar data con archivo csv, este se caracteriza por tener columnas separadas por comas o punto y comas

data_csv-> read.csv(dirección/ruta_archivo.csv, sep = “;”) data_csv-> read.csv(dirección/ruta_archivo.csv, sep = “,”)

  1. Importar datos desde un sitio web

Para usar una data de internet usamos la función:

read.tipodearchivo(“direcciónurl”)

#Descargaremos un archivo .sav del sitio https://users.stat.ufl.edu/~aa/smss/data/SPSS/ y descargaremos read_spss(“CEP_sep-oct_2017.sav”)

Manejo de datos

Identificación y manejo de datos missing,

Identificación y manejo de datos missing:

La pérdida de datos conlleva a la pérdida de información y esta tiene efectos perjudiciales como limitar la capacidad para convertir o visualizar datos, aumentan la probabilidad de error tipo II (incapacidad de rechazar una hipótesis nula falsa), además los datos faltantes reducen la representatividad de las muestras, y distorsionan la validez de los ensayos científicos y conllevan a conclusiones no válidas

Identificación de datos missing ó datos ausentes:

Usaremos la función is.na() para identificar los valores ausentes en un vector.

# Identificar valores faltantes en un vector
pago <- c(10, 10, NA, 20, NA,15, 12)
nombre<-c("Juan", "Lady", "Daniel", "Joce","Fernando", "Veines", "Natsu")
acuerdo<-c("si","si",NA,"si",NA, "si", "si")

is.na(pago) #FALSO si en la fila hay datos ausentes (NA) 
## [1] FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE
datos2<-data.frame(pago, nombre, acuerdo)
is.na(datos2) #Nos dará como resultado una matriz en la que se nos colocará FALSO si hay datos missing
##       pago nombre acuerdo
## [1,] FALSE  FALSE   FALSE
## [2,] FALSE  FALSE   FALSE
## [3,]  TRUE  FALSE    TRUE
## [4,] FALSE  FALSE   FALSE
## [5,]  TRUE  FALSE    TRUE
## [6,] FALSE  FALSE   FALSE
## [7,] FALSE  FALSE   FALSE

También podemos usarla función complete.cases() para identificar las filas que contienen valores faltantes en un dataframe

complete.cases(datos2) #Nos dará como resultado una fila en la que se nos colocará FALSO si hay datos missing en cada columna
## [1]  TRUE  TRUE FALSE  TRUE FALSE  TRUE  TRUE

Manejo de datos faltantes:

Para eliminar las filas que contienen valores faltantes podemos usar la función na.omit().

#Para saber cómo se vería la data sin los datos missing
na.omit(datos2)
##   pago nombre acuerdo
## 1   10   Juan      si
## 2   10   Lady      si
## 4   20   Joce      si
## 6   15 Veines      si
## 7   12  Natsu      si
#Si deseamos guardar estos datos en la misma data que tenemos 
datos2<-na.omit(datos2)

Puedes utilizar diferentes métodos para imputar valores faltantes en tus datos, como la media, la mediana o un valor constante con na.rm (na indica. “no asignado”, rm significa “remove”)

# Imputar la media en un vector con valores faltantes
mean(pago, na.rm = TRUE)
## [1] 13.4

Valoración de datos perdidos:

La tolerancia de datos perdidos suele ser un 5% para grandes volúmenes de datos. Si el porcentaje es mucho mayor tal vez se deba omitir esa propiedad. O en su defecto considerar realizar imputación de datos.

#Para esto usaremos la dataset airquality que está instalado en R
View(airquality)
#Calcularemos el porcentaje de datos missing en cada columna
colSums(is.na(airquality)) #Nos dará como resultado, la suma de datos faltantes en cada columna
##   Ozone Solar.R    Wind    Temp   Month     Day 
##      37       7       0       0       0       0
# determinación del porcentaje de valores perdidos respecto del total de datos
# para cada columna
porcentajeMiss <- function(x) {sum(is.na(x)) / length(x)*100}
# por columna
apply(airquality, 2, porcentajeMiss)
##     Ozone   Solar.R      Wind      Temp     Month       Day 
## 24.183007  4.575163  0.000000  0.000000  0.000000  0.000000

El resultado de los datos missing indica que Oxone tiene más de un 5% de datos ausentes, por lo tanto debería eliminar las filas con datos ausentes ó simplemente no se debería tomar en cuenta para mediciones que se hagan a la data.

datos3<-na.omit(airquality)
apply(airquality, 2, porcentajeMiss)
##     Ozone   Solar.R      Wind      Temp     Month       Day 
## 24.183007  4.575163  0.000000  0.000000  0.000000  0.000000

Identificación y manejo de datos outlier e inconsistentes.

Identificación y manejo de datos outliers e inconsistentes:

Los outliers son anomalías.

Identificación de datos outliers

Diagramas de caja y bigotes:

  • Con la función boxplot() podemos visualizar los datos outliers o las anomalías (que son los puntos que están más allá de los bigotes) y según la cantidad y ubicación respecto a los extremos, podemos identificar si estas son significativas.

  • Transformación de datos: En algunos casos, en lugar de eliminar los outliers, puedes optar por transformar tus datos. Por ejemplo, puedes aplicar una transformación logarítmica o una transformación de raíz cuadrada.

boxplot(airquality$Ozone)

#Podemos ver que sí hay datos atípicos

Podemos usar el comando $out para saber cuáles son los valores atípicos

caja<-boxplot(airquality$Ozone)

caja$out
## [1] 135 168

Podemos eliminar los datos outliers para tener una data sin valores atípicos

datos4<-airquality[!(airquality$Ozone %in% caja$out),]
#Comprobamos que desaparecieron los valores atípicos con un gráfico de cajas
boxplot(datos4$Ozone)

Nos da para reducir la influencia de los outliers en tus análisis. Identificación de datos inconsistentes:

Análisis exploratorio de datos:

Puedes utilizar técnicas de análisis exploratorio de datos para identificar inconsistencias en tus datos. Esto puede incluir la detección de valores extremos, valores duplicados o valores que no cumplen con ciertas reglas o restricciones. Limpieza de datos: Una vez identificadas las inconsistencias, puedes llevar a cabo la limpieza de datos utilizando funciones: - na.omit() para eliminar filas con datos faltantes

  • replace() para reemplazar valores incorrectos

  • complete.cases() para identificar filas completas sin datos faltantes.

Limpieza de datos y preparación de datos.

Limpieza de datos y preparación de datos:

Luego de cargar datos, debemos identificar y manejar valores ausentes Después tenemos que eliminar las filas o columnas con valores ausentes utilizando las funciones na.omit() o complete.cases(), o puedes reemplazar los valores ausentes con funciones como na.mean() o na.median() del paquete “impute”.

Tratar con valores atípicos:

Utiliza técnicas de detección de valores atípicos como el rango intercuartílico (IQR) o el método de la desviación estándar para identificar y manejar los valores atípicos en tus datos. Puedes eliminar las filas con valores atípicos o reemplazarlos por valores más representativos.

Podemos aplicar transformaciones a tus variables, como logaritmos, raíces cuadradas o funciones de escala, para normalizar la distribución de los datos o reducir la asimetría.

Crear variables derivadas, esto puede ayudarte a calcular métricas adicionales o agrupar tus datos de manera más significativa.

Reestructurar y combinar datos:

Utiliza funciones como reshape(), melt(), cast() o merge() para reestructurar y combinar tus datos según las necesidades de tu análisis. Esto puede incluir la agregación de datos, la fusión de conjuntos de datos o la transposición de formatos amplios a largos y viceversa.

Una vez que hayamos limpiado y preparado tus datos, puedes guardarlos en un nuevo archivo para futuros análisis o para compartirlos con otros.

Visualización de datos

datosPacientes=read.csv("C:\\Users\\Danie\\Downloads\\datospacientes (1).csv")
View(datosPacientes)

Para reproducir los gráficos, instalá y cargá los siguientes paquetes:

library(ggplot2)
library(tidyverse)
library(scales) # Para incluir porcentajes en un eje
## 
## Attaching package: 'scales'
## The following object is masked from 'package:purrr':
## 
##     discard
## The following object is masked from 'package:readr':
## 
##     col_factor
library(treemapify) # para el gráfico de rectángulos
## Warning: package 'treemapify' was built under R version 4.3.2

Visualización de datos univariados.

Gráficos univariados: Son aquellos gráficos que se utilizan para mostrar la distribución de una única variable.

Variables categoricas

Usualmente, este tipo de variables se visualiza con gráficos de barras o de sectores. Si bien su uso es menos frecuente, también pueden utilizarse gráficos de rectángulos o treemap.

Grafico de Barras:

ggplot(data = datosPacientes, aes(x = edad)) +
  geom_bar()

En el eje x podemos ver las distintas categorías de la variable “edad” y en el eje y un conteo de cuántas veces aparece cada categoría en la base de datos, es decir, cuántos participantes pertenecen a cada categoría. Ese conteo se hace automáticamente, solo necesitamos indicar la variable categórica que nos interesa.

Tambien podemos graficar el porcentaje

datosPacientes %>% 
  count(edad) %>% 
  mutate(prop = n/sum(n)) %>% 
  ggplot(aes(x = edad, y = prop)) +
  geom_bar(stat = "identity") +
  scale_y_continuous(labels = scales::percent) 

Gráfico de sectores:

En el gráfico de sectores, el círculo completo representa el total de las observaciones y cada segmento, la proporción o porcentaje de observaciones que pertenecen a una categoría particular.

datosPacientes %>% 
  count(edad) %>% 
  mutate(porcentaje = round(n/sum(n)*100), 1) %>% 
  ggplot(mapping = aes(factor(1), y = porcentaje, fill = edad)) +
  geom_bar(stat = "identity") +
  coord_polar(theta = "y") +
  theme_void()+
  geom_text(aes(label = paste(porcentaje,"%", sep = "")),
            position = position_stack(vjust = 0.5))

Gráficos de rectángulos (treemap):

El gráfico de rectángulos (treemap) es equivalente al de sectores, cada rectángulo representa la proporción de participantes que pertenece a una categoría determinada.

Si bien es poco usado, tiene dos ventajas sobre el gráfico anterior: visualmente, es más sencillo discriminar el tamaño de rectángulos que de triángulos y permite incluir un mayor número de categorías.

datosPacientes %>% 
  count(edad) %>% 
  ggplot(mapping = aes(fill = edad, area = n, label = edad)) +
  geom_treemap() + 
  geom_treemap_text(place = "centre") +
  theme(legend.position = "none")

Variables cuantitativas

Para explorar la distribución de los datos en variables cuantitativas, se recurre principalmente a herramientas visuales como los histogramas y los gráficos de densidad.

A continuación, procederemos a representar visualmente la distribución de la edad que tuvieron los fallecidos.

Histograma:

ggplot(data = datosPacientes, mapping = aes(x = edad)) +
  geom_histogram(color = "red", binwidth = 20) 

El gráfico muestra los valores numéricos agrupados en intervalos o “bins” de igual ancho. Cada intervalo se grafica como una barra, y su altura corresponde a la cantidad de observaciones que caen dentro de ese intervalo.

Podemos ver que la edad mas comun entre los fallecidos más frecuentes se encuentran entre 50 y 70 años (la barra más alta).

ggplot(data = datosPacientes, mapping = aes(x = presion)) +
  geom_histogram(color = "blue", binwidth = 50)

Curvas de densidad:

Un gráfico de densidad busca mostrar la distribución de probabilidades que subyace a los datos. Se toma el rango total de valores, no los intervalos.

ggplot(data = datosPacientes, mapping = aes(x = edad)) +
  geom_density(fill = "purple") 

Las curvas de densidad se normalizan de manera que el área bajo la curva sea igual a uno, representando así el 100% de las observaciones. Esta normalización puede generar cierta confusión en la escala del eje y, ya que depende de las unidades del eje x. En el contexto de este gráfico, el eje y toma valores entre 0 y 0.01.

Aunque esta escala no facilita la visualización directa de la cantidad o el porcentaje de participantes dentro de un rango específico, tiene la ventaja de ofrecer una representación más precisa de la forma de la distribución, sin estar influenciada por el número de intervalos o bins utilizados.

Boxplots:

De manera similar a los histogramas o los gráficos de densidad, los boxplots proporcionan una representación visual de la distribución de una variable cuantitativa. Su utilidad radica en la capacidad para visualizar la simetría de la distribución y la dispersión de los datos en torno a una medida central.

Aunque no son tan comúnmente empleados como los histogramas o gráficos de densidad al describir exclusivamente una variable cuantitativa, los boxplots resultan extremadamente útiles cuando se desea comparar la distribución entre diferentes grupos.

ggplot(data = datosPacientes, mapping = aes(x = edad)) +
  geom_boxplot() +
  ylim(-1, 1) +
  xlim(20, 100)

Visualización de datos bivariados

Son aquellos gráficos que se utilizan para mostrar la asociación entre dos variables.

Asociación entre dos variables categóricas

¿Se asocia el sexo al resultado final del estudio?

Gráfico de barras agrupadas

ggplot(data = datosPacientes, aes(x = edad, fill = ecivil)) +
  geom_bar(position = "dodge")

Es equivalente al gráfico de barras univariado, pero con barras y colores adicionales en función de una segunda variable categórica.

Gráfico de barras segmentadas

ggplot(data = datosPacientes, aes(x = edad, fill = ecivil)) +
  geom_bar(position = "fill") 

En los gráficos de barras segmentadas una barra suma el 100% de las observaciones de una de las categorías.

A diferencia del gráfico de barras agrupadas, permite comparar como se distribuyen los valores de la variable resultado en cada categoría de la variable suma.

Asociación entre una variable categórica y una cuantitativa

¿Se asocia el resultado con la edad?

Histogramas y gráficos de densidad agrupados

ggplot(data = datosPacientes, aes(x = edad, fill = ecivil)) +
  geom_histogram(binwidth = 20, color = "green")

Esto puede resultar más claro en un gráfico de densidad, ya que no depende de la cantidad de observaciones.

ggplot(data = datosPacientes, aes(x = edad, fill = ecivil)) +
  geom_density(alpha = 0.5, color = "darkblue")

Boxplots

Al igual que con los gráficos anteriores, se puede observar que la distribución es similar en los tres grupos. Este gráfico es más útil para visualizar si las medias o medianas difieren entre los grupos.

ggplot(data = datosPacientes, aes(x = ecivil, y = edad)) +
  geom_boxplot()

Gráficos de violín

Este gráfico es una combinación de un boxplot y bigotes y un gráfico de densidad superpuesto.

ggplot(data = datosPacientes, aes(x = ecivil, y = edad)) +
  geom_violin() +
  geom_boxplot(width = .5)

Gráficos de medias con barra de error

Este gráfico presenta la media de una variable numérica asociada a cada valor de una variable categórica, acompañada de una medida de dispersión que puede ser el error estándar o la desviación estándar.

datosPacientes %>% 
  group_by(ecivil) %>% 
  summarise(Edad_declarada_media = mean(edad),
            es = sd(edad)/sqrt(n())) %>% 
  ggplot(mapping = aes(x = ecivil, y = Edad_declarada_media)) +
  geom_point() +
  geom_errorbar(aes(ymin = Edad_declarada_media - es,
                    ymax = Edad_declarada_media + es),
                width = .1)

Asociación entre dos variables cuantitativas

Gráfico de dispersión

Este gráfico representa a cada observación como un punto. Este punto se ubica en base a los valores que la observación toma en dos variables cuantitativas, una ubicada en el eje x y otra en el eje y.

ggplot(data = datosPacientes, 
       mapping = aes(x = edad, y = presion)) +
  geom_point()

Cuando hay una relación entre las variables, anticipamos observar lo siguiente: - a medida que los valores de una variable aumentan, también lo hacen los de la otra (relación positiva); - cuando los valores de una variable disminuyen, los de la otra tienden a aumentar (relación negativa)y sera constante cuando es recto

En esta situación, esta asociación no es inmediatamente evidente visualmente. Podemos incluir una línea de tendencia para facilitar la interpretación.

ggplot(data = datosPacientes, 
       mapping = aes(x = edad, y = presion)) +
  geom_point() +
  geom_smooth(method = "lm")
## `geom_smooth()` using formula = 'y ~ x'

La recta de tendencia sugiere que existe una asociación constante entre las variables.

Visualización de datos bivariados multivariados.

Exploramos las técnicas de visualización de datos bivariados y multivariados utilizando el lenguaje de programación R. La visualización efectiva es esencial para comprender las relaciones entre variables y descubrir patrones complejos en conjuntos de datos multidimensionales.

install.packages("ggplot2", dependencies=TRUE, repos='http://cran.rstudio.com/')
## Warning: package 'ggplot2' is in use and will not be installed
install.packages("corrplot", dependencies=TRUE, repos='http://cran.rstudio.com/')
## Installing package into 'C:/Users/Danie/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'corrplot' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\Danie\AppData\Local\Temp\RtmpG4fyma\downloaded_packages
library(ggplot2)
library(corrplot)
## Warning: package 'corrplot' was built under R version 4.3.2
## corrplot 0.92 loaded

Gráficos de Dispersión

Utilizaremos gráficos de dispersión para explorar las relaciones entre pares de variables clave en tu conjunto de datos.

pairs(datosPacientes[, c("edad", "presion", "sensib")], main = "Matriz de Gráficos de Dispersión")

Diagramas de Puntos y Gráficos Específicos

Personaliza gráficos específicos utilizando ggplot2 para investigar detalladamente relaciones particulares.

ggplot(datosPacientes, aes(x = edad, y = presion)) +
  geom_point() +
  labs(title = "Diagrama de Puntos entre edad y presion")

Exploración Multivariada

Matriz de Correlación

Calcula y visualiza la matriz de correlación para evaluar la relación lineal entre todas las variables.

columnas_numericas <- datosPacientes[, 1:5]

matriz_correlacion <- cor(columnas_numericas)
corrplot(matriz_correlacion, method = "circle", tl.cex = 0.7, tl.col = "black", tl.srt = 45, addCoef.col = "black",
         title = "Matriz de Correlación")

Grafico de dispersion en 3D

install.packages("scatterplot3d", dependencies=TRUE, repos='http://cran.rstudio.com/')
## Installing package into 'C:/Users/Danie/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'scatterplot3d' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\Danie\AppData\Local\Temp\RtmpG4fyma\downloaded_packages
library(scatterplot3d)

scatterplot3d(datosPacientes$edad,datosPacientes$presion,datosPacientes$sensib, main="Gráfico de Dispersión en 3D", 
              xlab="Eje X", ylab="Eje Y", zlab="Eje Z",
              color="blue", pch=19)

Visualización de datos avanzados (imágenes)

La visualización de datos va más allá de los gráficos tradicionales y abarca la exploración de datos complejos, como imágenes, exploraremos herramientas y paquetes específicos para visualizar datos de imágenes y discutiremos cómo personalizar y optimizar estas visualizaciones para obtener información valiosa.

Visualización de Imágenes

Visualización Básica

Iniciamos con una visualización básica de tus imágenes.

install.packages("imager", dependencies=TRUE, repos='http://cran.rstudio.com/')
## Warning: package 'imager' is in use and will not be installed
library(imager)
imagen1 <- load.image("C:\\Users\\Danie\\Downloads\\soltero.png")
imagen2 <- load.image("C:\\Users\\Danie\\Downloads\\adulto.png")

par(mfrow = c(1, 2))
plot(imagen1, main = "C:\\Users\\Danie\\Downloads\\soltero.png")
plot(imagen2, main = "C:\\Users\\Danie\\Downloads\\adulto.png")

par(mfrow = c(1, 1))

Visualización con ggplot2

Utiliza ggplot2 para una visualización más flexible.

df_imagen1 <- as.data.frame(imagen1)
df_imagen2 <- as.data.frame(imagen2)

ggplot(df_imagen1, aes(x = x, y = y, fill = value)) +
  geom_tile() +
  scale_fill_gradientn(colours = terrain.colors(256)) +
  labs(title = "Visualización con ggplot2 - Imagen 1")

ggplot(df_imagen2, aes(x = x, y = y, fill = value)) +
  geom_tile() +
  scale_fill_gradientn(colours = terrain.colors(256)) +
  labs(title = "Visualización con ggplot2 - Imagen 2")

Procesamiento de Imágenes

Filtrado y Mejora

Aplicamos técnicas de procesamiento de imágenes para mejorar la visualización y hacemos una visualizacion en una escala de grises.

install.packages("png", dependencies=TRUE, repos='http://cran.rstudio.com/')
## Installing package into 'C:/Users/Danie/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'png' successfully unpacked and MD5 sums checked
## Warning: cannot remove prior installation of package 'png'
## Warning in file.copy(savedcopy, lib, recursive = TRUE): problema al copiar
## C:\Users\Danie\AppData\Local\R\win-library\4.3\00LOCK\png\libs\x64\png.dll a
## C:\Users\Danie\AppData\Local\R\win-library\4.3\png\libs\x64\png.dll: Permission
## denied
## Warning: restored 'png'
## 
## The downloaded binary packages are in
##  C:\Users\Danie\AppData\Local\Temp\RtmpG4fyma\downloaded_packages
library(png)
imagen <- readPNG("C:\\Users\\Danie\\Downloads\\soltero.png")

imagen_gris <- colMeans(imagen[,,1:3])

par(mfrow = c(1, 2))
plot(as.raster(imagen), main = "Imagen Original")
plot(as.raster(imagen_gris), main = "Imagen en Escala de Grises", col = gray.colors(001))

par(mfrow = c(1, 1))

Histograma de Intensidades

Visualizar el histograma de intensidades proporciona información sobre la distribución de valores de píxeles.

install.packages("png", dependencies=TRUE, repos='http://cran.rstudio.com/')
## Warning: package 'png' is in use and will not be installed
library(png)
imagen <- readPNG("C:\\Users\\Danie\\Downloads\\soltero.png")

imagen_gris1 <- colMeans(imagen[,,1:3])

hist(as.vector(imagen_gris1), col = "grey", main = "Histograma de Intensidades")

Manipulación de datos no estructurados - texto

La manipulación de datos no estructurados, en particular datos de texto, es una tarea crucial en análisis de datos.

Nos centraremos en librerías clave como stringr, tm, y tidyverse para realizar operaciones eficientes en datos de texto.

Librerías Utilizadas

install.packages("stringr", dependencies=TRUE, repos='http://cran.rstudio.com/')
## Warning: package 'stringr' is in use and will not be installed
install.packages("tm", dependencies=TRUE, repos='http://cran.rstudio.com/')
## Installing package into 'C:/Users/Danie/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## Warning: dependencies 'Rcampdf', 'Rgraphviz', 'Rpoppler',
## 'tm.lexicon.GeneralInquirer' are not available
## package 'tm' successfully unpacked and MD5 sums checked
## Warning: cannot remove prior installation of package 'tm'
## Warning in file.copy(savedcopy, lib, recursive = TRUE): problema al copiar
## C:\Users\Danie\AppData\Local\R\win-library\4.3\00LOCK\tm\libs\x64\tm.dll a
## C:\Users\Danie\AppData\Local\R\win-library\4.3\tm\libs\x64\tm.dll: Permission
## denied
## Warning: restored 'tm'
## 
## The downloaded binary packages are in
##  C:\Users\Danie\AppData\Local\Temp\RtmpG4fyma\downloaded_packages
install.packages("tidyverse", dependencies=TRUE, repos='http://cran.rstudio.com/')
## Warning: package 'tidyverse' is in use and will not be installed
library(stringr)
library(tm)
## Warning: package 'tm' was built under R version 4.3.2
## Loading required package: NLP
## 
## Attaching package: 'NLP'
## The following object is masked from 'package:ggplot2':
## 
##     annotate
library(tidyverse)

Lectura y Exploración de Datos de Texto

Comencemos leyendo un conjunto de datos de texto y explorándolo:

texto <- readLines("C:\\Users\\Danie\\Downloads\\datosPacientes1.txt")
## Warning in readLines("C:\\Users\\Danie\\Downloads\\datosPacientes1.txt"):
## incomplete final line found on 'C:\Users\Danie\Downloads\datosPacientes1.txt'
# Exploración inicial
head(texto)
## [1] "ID    sujeto    edad    presion    sensib     grupo   ecivil"
## [2] "     1         1       22    112            6.3C      C"     
## [3] "     2         2       22    109            6.8P      S"     
## [4] "     3         3       23    110             7C       C"     
## [5] "     4         4       24    121            7.1C      S"     
## [6] "     5         5       25    123            5.6P      C"

Limpieza de Texto con stringr

La librería stringr es útil para realizar operaciones de limpieza y manipulación de cadenas de texto:

texto_limpio <- str_replace_all(texto, "[^a-zA-Z]", " ")

texto_limpio <- tolower(texto_limpio)

texto_limpio
##  [1] "id    sujeto    edad    presion    sensib     grupo   ecivil"
##  [2] "                                               c      c"     
##  [3] "                                               p      s"     
##  [4] "                                              c       c"     
##  [5] "                                               c      s"     
##  [6] "                                               p      c"     
##  [7] "                                               c      c"     
##  [8] "                                               c      c"     
##  [9] "                                               c      s"     
## [10] "                                               c      s"     
## [11] "                                               p      s"     
## [12] "                                               c      s"     
## [13] "                                               c      c"     
## [14] "                                               p      s"     
## [15] "                                               c      c"     
## [16] "                                               c      c"     
## [17] "                                               p      s"     
## [18] "                                              c       c"     
## [19] "                                               c      c"     
## [20] "                                               c      c"     
## [21] "                                               c      c"     
## [22] "                                               c      c"     
## [23] "                                               c      c"     
## [24] "                                               p      s"     
## [25] "                                              c       c"     
## [26] "                                               p      s"     
## [27] "                                               c      c"     
## [28] "                                               p      s"     
## [29] "                                               c      c"     
## [30] "                                              p       s"     
## [31] "                                               c      c"     
## [32] "                                               p      s"     
## [33] "                                               c      c"     
## [34] "                                               c      c"     
## [35] "                                               c      c"     
## [36] "                                               p      s"     
## [37] "                                               c      s"     
## [38] "                                               p      s"     
## [39] "                                               p      s"     
## [40] "                                               c      c"     
## [41] "                                               p      s"     
## [42] "                                               c      c"

Procesamiento de Texto con tm

La librería tm es especialmente diseñada para el procesamiento de texto:

install.packages("SnowballC", dependencies=TRUE, repos='http://cran.rstudio.com/')
## Installing package into 'C:/Users/Danie/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'SnowballC' successfully unpacked and MD5 sums checked
## Warning: cannot remove prior installation of package 'SnowballC'
## Warning in file.copy(savedcopy, lib, recursive = TRUE): problema al copiar
## C:\Users\Danie\AppData\Local\R\win-library\4.3\00LOCK\SnowballC\libs\x64\SnowballC.dll
## a
## C:\Users\Danie\AppData\Local\R\win-library\4.3\SnowballC\libs\x64\SnowballC.dll:
## Permission denied
## Warning: restored 'SnowballC'
## 
## The downloaded binary packages are in
##  C:\Users\Danie\AppData\Local\Temp\RtmpG4fyma\downloaded_packages
library(SnowballC)

corpus <- Corpus(VectorSource(texto_limpio))

corpus <- tm_map(corpus, removeWords, stopwords("english"))
## Warning in tm_map.SimpleCorpus(corpus, removeWords, stopwords("english")):
## transformation drops documents
corpus <- tm_map(corpus, stemDocument)
## Warning in tm_map.SimpleCorpus(corpus, stemDocument): transformation drops
## documents

Análisis de Frecuencia de Palabras con tidyverse

Para realizar un análisis de frecuencia de palabras, podemos aprovechar la potencia de tidyverse:

# Crear un data frame de términos y frecuencias
frecuencia_palabras <- Corpus(VectorSource(texto_limpio)) %>%
  tm_map(removePunctuation) %>%
  tm_map(removeNumbers) %>%
  tm_map(tolower) %>%
  tm_map(removeWords, stopwords("english")) %>%
  tm_map(stemDocument) %>%
  TermDocumentMatrix() %>%
  as.matrix() %>%
  data.frame() %>%
  gather(key = "Palabra", value = "Frecuencia") %>%
  arrange(desc(Frecuencia))
## Warning in tm_map.SimpleCorpus(., removePunctuation): transformation drops
## documents
## Warning in tm_map.SimpleCorpus(., removeNumbers): transformation drops
## documents
## Warning in tm_map.SimpleCorpus(., tolower): transformation drops documents
## Warning in tm_map.SimpleCorpus(., removeWords, stopwords("english")):
## transformation drops documents
## Warning in tm_map.SimpleCorpus(., stemDocument): transformation drops documents
# Visualizar las 10 palabras más frecuentes
head(frecuencia_palabras, 10)
##    Palabra Frecuencia
## 1       X1          1
## 2       X1          1
## 3       X1          1
## 4       X1          1
## 5       X1          1
## 6       X1          1
## 7       X2          0
## 8       X2          0
## 9       X2          0
## 10      X2          0

Conclusiones

  • A lo largo del documento, hemos explorado diversas funciones en R que desempeñan un papel crucial en el análisis de datos. Estas funciones nos permiten realizar tareas fundamentales, como analizar, completar, filtrar y eliminar datos, con el objetivo de obtener estadísticas más limpias y precisas. A continuación, profundizaré en algunas de estas funciones clave y su relevancia en el proceso de mejora de estadísticas.

  • La visualización de datos bivariados y multivariados es esencial para comprender la estructura y las relaciones dentro de conjuntos de datos complejos. La combinación de gráficos de dispersión, diagramas de puntos, matrices de correlación y gráficos en 3D proporciona una perspectiva completa de la estructura y las interacciones en los datos.

  • La visualización avanzada de datos en R para imágenes ofrece una variedad de técnicas, desde análisis básicos de intensidad hasta procesamiento de imágenes y segmentación. La combinación de librerías como imager y ggplot2 permite explorar y comprender datos de imágenes de manera efectiva.

  • Al aplicar estas técnicas a tus propios conjuntos de datos, asegúrate de adaptar los códigos según la estructura y características específicas de tus imágenes. La visualización de datos de imágenes en R proporciona una perspectiva única y valiosa, permitiendo insights más allá de las técnicas de visualización tradicionales.

  • La manipulación de datos no estructurados, especialmente datos de texto, es esencial para extraer información significativa. Las librerías stringr, tm, y tidyverse proporcionan herramientas poderosas para limpiar, procesar y analizar datos de texto en R.