R Markdown

El presente trabajo es un análisis EDA de la base datos a4_iris.csv Se establece el directorio de trabajo, las librerías a utilizar y conjunto de datos.

# Establecer directorio de trabajo
setwd("C:/OSCAR/RESPALDO CESAR/OSCAR/CURSOS/R DGTIC OCT 2025/a3")
getwd()
## [1] "C:/OSCAR/RESPALDO CESAR/OSCAR/CURSOS/R DGTIC OCT 2025/a3"
# Paquetes a utilizar

library("tidyverse")
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.1     ✔ stringr   1.5.2
## ✔ ggplot2   4.0.0     ✔ tibble    3.3.0
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.1.0     
## ── 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("stringr")
library("dplyr")
library("forcats")
library("janitor")
## 
## Adjuntando el paquete: 'janitor'
## 
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
library("lubridate")
library("graphics")
library("ggplot2")

# Se utilizará el archivo a4_iris.csv para el análisis
# Para leer archivos externos, importacion de datos
data_iris <- read.csv("C:/OSCAR/RESPALDO CESAR/OSCAR/CURSOS/R DGTIC OCT 2025/a3/a4_iris.csv", header=TRUE, sep=",")

Se utilizó clean_names para cambiar el punto por un guión bajo en el nombre de las variables. Se realiza la inspección inicial de nuestro dataset: Se tienen 5 variables, 4 tipo numérico y una tipo cadena. Se revisa si hay datos ausentes NA, no se encontraron datos faltantes. Con la función duplicated se encontró una fila repetida (143). Dada la naturaleza de los datos se considera que no es un error de captura y se mantiene en el dataset.

data_iris <- clean_names(data_iris)
str(data_iris)
## 'data.frame':    150 obs. of  5 variables:
##  $ sepal_length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ sepal_width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ petal_length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ petal_width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##  $ variety     : chr  "Setosa" "Setosa" "Setosa" "Setosa" ...
names(data_iris)
## [1] "sepal_length" "sepal_width"  "petal_length" "petal_width"  "variety"
# Se usa  is.na() para evaluar la presencia de valores ausentes, no se encuentran ausencias
# is.na(data_iris)

# Para detectar datos duplicados usamos duplicated, hay un dato duplicado que corresponde al registro 143
# duplicated(data_iris)

data_iris[duplicated(data_iris), ]
##     sepal_length sepal_width petal_length petal_width   variety
## 143          5.8         2.7          5.1         1.9 Virginica

Se realiza el análisis numérico de manera global y considerando las variedades por separado.

# Se usa la funcion summary para obtener las estadísticas básicas sin discriminar por la variedad
summary(data_iris)
##   sepal_length    sepal_width     petal_length    petal_width   
##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
##  Median :5.800   Median :3.000   Median :4.350   Median :1.300  
##  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
##    variety         
##  Length:150        
##  Class :character  
##  Mode  :character  
##                    
##                    
## 
# Se hacen agrupaciones por especie (variety) para calcular las medias, minimos y maximos respectiva
data_iris %>%
  group_by(variety) %>%
  summarise(
    sep_len_media = mean(sepal_length),
    sep_wid_media = mean(sepal_width),
    pet_len_media = mean(petal_length),
    pet_wid_media = mean(petal_width)
  ) %>%
  arrange(variety)
## # A tibble: 3 × 5
##   variety    sep_len_media sep_wid_media pet_len_media pet_wid_media
##   <chr>              <dbl>         <dbl>         <dbl>         <dbl>
## 1 Setosa              5.01          3.43          1.46         0.246
## 2 Versicolor          5.94          2.77          4.26         1.33 
## 3 Virginica           6.59          2.97          5.55         2.03
data_iris %>%
  group_by(variety) %>%
  summarise(
    sep_len_min = min(sepal_length),
    sep_wid_min = min(sepal_width),
    pet_len_min = min(petal_length),
    pet_wid_min = min(petal_width)
  ) %>%
  arrange(variety)
## # A tibble: 3 × 5
##   variety    sep_len_min sep_wid_min pet_len_min pet_wid_min
##   <chr>            <dbl>       <dbl>       <dbl>       <dbl>
## 1 Setosa             4.3         2.3         1           0.1
## 2 Versicolor         4.9         2           3           1  
## 3 Virginica          4.9         2.2         4.5         1.4
data_iris %>%
  group_by(variety) %>%
  summarise(
    sep_len_max = max(sepal_length),
    sep_wid_max = max(sepal_width),
    pet_len_max = max(petal_length),
    pet_wid_max = max(petal_width)
  ) %>%
  arrange(variety)
## # A tibble: 3 × 5
##   variety    sep_len_max sep_wid_max pet_len_max pet_wid_max
##   <chr>            <dbl>       <dbl>       <dbl>       <dbl>
## 1 Setosa             5.8         4.4         1.9         0.6
## 2 Versicolor         7           3.4         5.1         1.8
## 3 Virginica          7.9         3.8         6.9         2.5

Globalmente, se puede observar que el rango de la longitud del sépalo es de 3.6 cm y el rango del ancho es de 2.4, por lo que en general los sépalos son más largos que anchos; mismo caso en los pétalos, cuyo rango es de 5.9 para la longitud y 2.4 para el ancho, pero los pétalos son, en general más largos que anchos.

Considerando la variedad como factor, encontramos que Setosa presenta mayor uniformidad en sus mediciones lo que implica una clara separación de los otros dos tipos de Iris, donde tenemos valores máximos y mínimos menos separados entre las flores tipo Versicolor y Virginica.

A continuación se presentan las gráficas de barras, boxplot y de dispersión.

# Gráfica de barras. Numero de fLores por variedad
ggplot(data_iris, aes(variety, fill=variety))+
  geom_bar()+
  scale_fill_manual(
    values=c("#CEB5DE","#5E4896","#9911AA"))+
  labs(title = "Gráfica de barras",
       subtitle ="Número de flores por tipo",
       x = "Variedad",
       y = "Frecuencias absolutas",
       fill = "Variedad") +
  theme_classic()

# Con la funcion ggplot hacemos los graficos de boxplot para cada variable y revisar si se tienen valores extremos
ggplot(data_iris, aes(x =variety, y = sepal_length, fill = variety)) +
  geom_boxplot(alpha = 0.8) +
  scale_fill_manual(
    values=c("#CEB5DE","#5E4896","#9911AA"))+
  labs(title = "Diagrama de caja de las variedades de flores Iris: Sepalo",
       x = "Variedad",
       y = "Longitud Sepalo",
       fill = "Variedad") +
  theme_classic()

ggplot(data_iris, aes(x =variety, y = sepal_width, fill = variety)) +
  geom_boxplot(alpha = 0.8) +
  scale_fill_manual(
    values=c("#CEB5DE","#5E4896","#9911AA"))+
    labs(title = "Diagrama de caja de las variedades de flores Iris: Sepalo",
       x = "Variedad",
       y = "Ancho Sepalo",
       fill = "Variedad") +
  theme_classic()

ggplot(data_iris, aes(x =variety, y = petal_length, fill = variety)) +
  geom_boxplot(alpha = 0.8) +
  scale_fill_manual(
    values=c("#CEB5DE","#5E4896","#9911AA"))+
  labs(title = "Diagrama de caja de las variedades de flores Iris: Petalo",
       x = "Variedad",
       y = "Longitud Petalo",
       fill = "Variedad") +
  theme_classic()

ggplot(data_iris, aes(x =variety, y = petal_width, fill = variety)) +
  geom_boxplot(alpha = 0.8) +
  scale_fill_manual(
    values=c("#CEB5DE","#5E4896","#9911AA"))+
  labs(title = "Diagrama de caja de las variedades de flores Iris: Petalo",
       x = "Variedad",
       y = "Ancho Petalo",
       fill = "Variedad") +
  theme_classic()

# Gráfica de dispersión
ggplot(data_iris, aes(x = petal_length, y = petal_width, color = variety)) +
  geom_point(alpha = 0.6, size = 3, ) +
  scale_color_manual(
    values=c("red","green","blue"))+
  labs(title = "Longitud vs Ancho",
       subtitle = "Pétalo",
       x = "Longitud",
       y = "Ancho",
       color = "Variedad") +
  theme_classic()

ggplot(data_iris, aes(x = sepal_length, y = sepal_width, color = variety)) +
  geom_point(alpha = 0.6, size = 3) +
  scale_color_manual(
    values=c("red","green","blue"))+
  labs(title = "Longitud vs Ancho",
       subtitle = "Sépalo",
       x = "Longitud",
       y = "Ancho",
       color = "Variedad") +
  theme_classic()