Programación básica

Sesión #03: - EDA

Autor/a

Anghely Perez y Juan Adarraga

Fecha de publicación

27 de marzo de 2023

library(ggplot2)
Warning: package 'ggplot2' was built under R version 4.3.3
library(readxl)
Warning: package 'readxl' was built under R version 4.3.3
library(corrplot)
Warning: package 'corrplot' was built under R version 4.3.3
corrplot 0.92 loaded
library(dplyr)
Warning: package 'dplyr' was built under R version 4.3.3

Attaching package: 'dplyr'
The following objects are masked from 'package:stats':

    filter, lag
The following objects are masked from 'package:base':

    intersect, setdiff, setequal, union

PREPARACIÓN DE NUESTRO ENTORNO

1. Carga de datos

El primer paso es cargar el conjunto de datos en R Studio. Esto se puede hacer utilizando funciones como read.csv() para archivos CSV, read_excel() para archivos de Excel, o read.table() para archivos de texto.

1.1. Data sets RAISIN

setwd("C:/Users/Anghely/Desktop/taller1")
rs<-read_excel("Raisin_Dataset.xlsx")

2. Visualización de los datos

Una vez cargados los datos, es importante realizar una visualización inicial para comprender la distribución de las variables y detectar posibles patrones o tendencias. Esto se puede hacer utilizando funciones de visualización como hist(), plot(), boxplot(), barplot(), entre otras.

HISTOGRAMA

var_relev <- c("Area", "Perimeter", "Extent")

par(mfrow=c(1,3)) # Dividir el área de la gráfica en 1 fila y 2 columnas
for (variable in var_relev) {
  hist(rs[[variable]], main=variable, col.main="maroon", xlab=variable, col="hotpink1", border="magenta4", fg="orange")
}

BOXPLOT

par(mfrow=c(1,3)) # Dividir el área de la gráfica en 1 fila y 2 columnas
for (variable in var_relev) {
  boxplot(rs[[variable]], main=variable,col.main="darkblue",col="aquamarine", border="navyblue", fg="orange",horizontal=TRUE)
}

3. Resumen estadístico

Calcular estadísticas descriptivas básicas para cada variable es esencial para comprender la naturaleza de los datos. Esto incluye medidas como la media, la mediana, la desviación estándar, el mínimo, el máximo y los cuartiles. La función summary() proporciona un resumen estadístico rápido de todas las variables.

summary(rs)
      Area        MajorAxisLength MinorAxisLength  Eccentricity   
 Min.   : 25387   Min.   :225.6   Min.   :143.7   Min.   :0.3487  
 1st Qu.: 59348   1st Qu.:345.4   1st Qu.:219.1   1st Qu.:0.7418  
 Median : 78902   Median :407.8   Median :247.8   Median :0.7988  
 Mean   : 87804   Mean   :430.9   Mean   :254.5   Mean   :0.7815  
 3rd Qu.:105028   3rd Qu.:494.2   3rd Qu.:279.9   3rd Qu.:0.8426  
 Max.   :235047   Max.   :997.3   Max.   :492.3   Max.   :0.9621  
   ConvexArea         Extent         Perimeter         Class          
 Min.   : 26139   Min.   :0.3799   Min.   : 619.1   Length:900        
 1st Qu.: 61513   1st Qu.:0.6709   1st Qu.: 966.4   Class :character  
 Median : 81651   Median :0.7074   Median :1119.5   Mode  :character  
 Mean   : 91186   Mean   :0.6995   Mean   :1165.9                     
 3rd Qu.:108376   3rd Qu.:0.7350   3rd Qu.:1308.4                     
 Max.   :278217   Max.   :0.8355   Max.   :2697.8                     
glimpse(rs)
Rows: 900
Columns: 8
$ Area            <dbl> 87524, 75166, 90856, 45928, 79408, 49242, 42492, 60952…
$ MajorAxisLength <dbl> 442.2460, 406.6907, 442.2670, 286.5406, 352.1908, 318.…
$ MinorAxisLength <dbl> 253.2912, 243.0324, 266.3283, 208.7600, 290.8275, 200.…
$ Eccentricity    <dbl> 0.8197384, 0.8018052, 0.7983536, 0.6849892, 0.5640113,…
$ ConvexArea      <dbl> 90546, 78789, 93717, 47336, 81463, 51368, 43904, 62329…
$ Extent          <dbl> 0.7586506, 0.6841296, 0.6376128, 0.6995994, 0.7927719,…
$ Perimeter       <dbl> 1184.040, 1121.786, 1208.575, 844.162, 1073.251, 881.8…
$ Class           <chr> "Kecimen", "Kecimen", "Kecimen", "Kecimen", "Kecimen",…

4. Tratamiento de valores faltantes

Identificar y manejar los valores faltantes es crucial para evitar sesgos en el análisis. Se pueden utilizar funciones como is.na() para identificar los valores faltantes y luego decidir si eliminarlos, imputarlos o manejarlos de alguna otra manera.

# Verificar si hay datos faltantes en cada columna
missing_values <- colSums(is.na(rs))

# Contar el total de datos faltantes
total_missing <- sum(is.na(rs))

# Mostrar el número de datos faltantes por columna
print(missing_values)
           Area MajorAxisLength MinorAxisLength    Eccentricity      ConvexArea 
              0               0               0               0               0 
         Extent       Perimeter           Class 
              0               0               0 
# Mostrar el total de datos faltantes
print(total_missing)
[1] 0

5. Exploración de relaciones entre variables

Analizar las relaciones entre las diferentes variables puede revelar patrones interesantes y ayudar a generar hipótesis para investigar más a fondo. Esto se puede hacer mediante el cálculo de correlaciones utilizando cor() y mediante la creación de gráficos de dispersión utilizando plot() o ggplot2.

#transformar rs en un valor numerico
rs_numeric<-rs[sapply(rs, is.numeric)]

# Calcular la matriz de correlación
correlation_matrix2 <- cor(rs_numeric)

# Imprimir la matriz de correlación
print(correlation_matrix2)
                       Area MajorAxisLength MinorAxisLength Eccentricity
Area             1.00000000       0.9327744       0.9066499    0.3361066
MajorAxisLength  0.93277443       1.0000000       0.7280302    0.5836084
MinorAxisLength  0.90664987       0.7280302       1.0000000   -0.0276835
Eccentricity     0.33610660       0.5836084      -0.0276835    1.0000000
ConvexArea       0.99591967       0.9450309       0.8956513    0.3482103
Extent          -0.01349934      -0.2038656       0.1453215   -0.3610615
Perimeter        0.96135172       0.9779780       0.8274170    0.4478452
                 ConvexArea      Extent  Perimeter
Area             0.99591967 -0.01349934  0.9613517
MajorAxisLength  0.94503093 -0.20386556  0.9779780
MinorAxisLength  0.89565132  0.14532153  0.8274170
Eccentricity     0.34821030 -0.36106149  0.4478452
ConvexArea       1.00000000 -0.05480247  0.9766122
Extent          -0.05480247  1.00000000 -0.1734489
Perimeter        0.97661223 -0.17344893  1.0000000

HEATMAP

heatmap(cor(rs_numeric), col=cm.colors(256), symm = TRUE)

pairs(rs_numeric, col=rainbow(7))

# Crear gráficos de dispersión para las relaciones entre las variables
# Puedes personalizar esto según tus necesidades y seleccionar las variables que deseas comparar
scatter_plots <- ggplot(rs, aes(x = Area, y = Perimeter)) +
  geom_point() +
  labs(x = "Area",
       y = "Perimeter") +
  ggtitle("Relación entre el Area y Perimeter")


# Mostrar los gráficos de dispersión
print(scatter_plots)

6. Identificación de valores atípicos

Los valores atípicos pueden influir significativamente en los resultados del análisis y deben ser identificados y tratados adecuadamente. Se pueden utilizar gráficos de caja (boxplot()) o técnicas estadísticas como el rango intercuartílico para identificar valores atípicos potenciales.

# Supongamos que queremos detectar valores atípicos en la variable "medv" (valor medio de las viviendas)

# Calcular el rango intercuartílico (IQR)
Q1 <- quantile(rs$Area, 0.25)
Q3 <- quantile(rs$Area, 0.75)
IQR_valor <- Q3 - Q1

# Definir los límites superior e inferior para identificar valores atípicos
limite_inferior <- Q1 - 1.5 * IQR_valor
limite_superior <- Q3 + 1.5 * IQR_valor

# Identificar valores atípicos
valores_atipicos <- rs$Area[rs$Area < limite_inferior | rs$Area > limite_superior]

# Imprimir los valores atípicos
print(valores_atipicos)
 [1] 180898 184784 195383 177264 189637 210923 182160 208264 188651 202118
[11] 177206 193032 204864 178334 193558 206720 205497 177916 199015 193818
[21] 194864 192815 178692 206689 182823 182788 222915 204226 182122 175247
[31] 195281 175946 181926 223075 235047 181126 189069 225043 179668 218459
[41] 187391

7. Transformación de variables

En algunos casos, puede ser útil transformar las variables para cumplir con ciertas suposiciones de los modelos estadísticos o para mejorar la interpretación de los resultados. Esto puede incluir transformaciones logarítmicas, cuadráticas o de otro tipo.

rs_num3<-data.frame(rs$Area, rs$MajorAxisLength, rs$MinorAxisLength, rs$Eccentricity, rs$ConvexArea, rs$Extent, rs$Perimeter)

par(mar = c(3, 3, 1, 1)) # Organizar las gráficas en un arreglo de 4x4
for (i in 1:ncol(rs_num3)) {
  hist(rs_num3[,i], main = colnames(rs_num3)[i], xlab = "", col="aquamarine", border="purple")
}

# Aplicar una transformación logarítmica a la variable Area
rs_num3$log_rs.Area <- log(rs_num3$rs.Area)

# Crear el histograma de Area
hist(rs_num3$log_rs.Area, 
     main = "Histograma de log (rs.Area)", 
     xlab = "log(Area)",
     ylab = "Frecuencia",
     col = "pink",
     border = "purple")

8. Análisis multivariable

Explorar las relaciones entre múltiples variables a la vez es fundamental para comprender la complejidad de los datos. Esto se puede hacer mediante técnicas como el análisis de componentes principales (PCA) o mediante la visualización de múltiples variables en un solo gráfico utilizando técnicas como el mapeo de calor o los gráficos de pares.

#install.packages("reshape2")
library(reshape2)
Warning: package 'reshape2' was built under R version 4.3.3
# Calcular la matriz de correlación para el conjunto de datos Boston
correlation_matrix <- cor(rs_numeric)

# Crear un gráfico de mapa de calor utilizando ggplot2
ggplot(data = melt(correlation_matrix), aes(x = Var1, y = Var2, fill = value)) +
  geom_tile(color = "white") +
  scale_fill_gradient2(low = "blue", high = "red", mid = "white", 
                       midpoint = 0, limit = c(-1,1), space = "Lab",
                       name="Correlation") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) +
  coord_fixed()

Análisis de Componentes Principales (PCA)}

# Cargar el paquete necesitado para PCA

library(stats)
 
# Seleccionar las variables numéricas relevantes para PCA

vars_pca <- subset(rs_num3, select = c("rs.Area", "rs.MajorAxisLength", "rs.MinorAxisLength", "rs.Eccentricity", "rs.ConvexArea", "rs.Extent", "rs.Perimeter"))
 
# Realizar PCA

pca_result <- prcomp(vars_pca, scale. = TRUE)
 
# Resumen del PCA

summary(pca_result)
Importance of components:
                          PC1    PC2     PC3     PC4     PC5     PC6     PC7
Standard deviation     2.1982 1.2055 0.79275 0.23838 0.14768 0.08019 0.03179
Proportion of Variance 0.6903 0.2076 0.08978 0.00812 0.00312 0.00092 0.00014
Cumulative Proportion  0.6903 0.8979 0.98770 0.99582 0.99894 0.99986 1.00000

Standard deviations: Estos valores representan las desviaciones estándar de los componentes principales. Son la raíz cuadrada de los valores propios, que indican la cantidad de variación explicada por cada componente principal. Cuanto mayor sea la desviación estándar, más importante es el componente.

Proportion of Variance: Esta columna muestra la proporción de varianza explicada por cada componente principal. Cuanto mayor sea este valor, más variabilidad de los datos explica el componente correspondiente. Por ejemplo, un valor del 0.30 indica que el componente explica el 30% de la variabilidad en los datos.

Cumulative Proportion: Esta columna indica la proporción acumulativa de varianza explicada por los componentes principales. Es útil para determinar cuántos componentes principales son necesarios para explicar una cantidad significativa de variabilidad en los datos. Por ejemplo, si el valor es 0.80, significa que los primeros componentes principales explican el 80% de la variabilidad total en los datos.

# Obtener los componentes principales
pcs <- pca_result$rotation

NOTA: Los componentes principales se encuentran listados en el resumen del PCA en orden descendente de importancia, es decir, el primer componente principal es el que explica la mayor parte de la variabilidad en los datos, seguido por el segundo componente principal, y así sucesivamente. Por lo tanto, para determinar cuáles son los componentes principales, simplemente observamos la primera columna del resumen, que muestra las desviaciones estándar de los componentes principales. Los componentes principales se enumeran de arriba hacia abajo en función de su importancia, con el primer componente principal en la parte superior y el último en la parte inferior.