Análisis del aguacate

Cargar librerías

Se cargan todas las librerías que previamente se instalaron con la función install.packages().

library(readr) # Para importar datos tipo texto
library(dplyr) # Para transformar extraer datos
library(ggplot2) # Para gragficos
library(lubridate) # Para tratar datos tipo fecha

Cargar datos

# Cargar desde una url de internet
datos_aguacate = read.csv("https://raw.githubusercontent.com/rpizarrog/Ciencia-de-los-Datos-Descriptivo-Predictivo/refs/heads/main/datos/avocado.csv")

head(datos_aguacate, 10) # Los 10 primeros registros
##    X       Date AveragePrice Total.Volume   X4046     X4225  X4770 Total.Bags
## 1  0 27/12/2015         1.33     64236.62 1036.74  54454.85  48.16    8696.87
## 2  1 20/12/2015         1.35     54876.98  674.28  44638.81  58.33    9505.56
## 3  2 13/12/2015         0.93    118220.22  794.70 109149.67 130.50    8145.35
## 4  3 06/12/2015         1.08     78992.15 1132.00  71976.41  72.58    5811.16
## 5  4 29/11/2015         1.28     51039.60  941.48  43838.39  75.78    6183.95
## 6  5 22/11/2015         1.26     55979.78 1184.27  48067.99  43.61    6683.91
## 7  6 15/11/2015         0.99     83453.76 1368.92  73672.72  93.26    8318.86
## 8  7 08/11/2015         0.98    109428.33  703.75 101815.36  80.00    6829.22
## 9  8 01/11/2015         1.02     99811.42 1022.15  87315.57  85.34   11388.36
## 10 9 25/10/2015         1.07     74338.76  842.40  64757.44 113.00    8625.92
##    Small.Bags Large.Bags XLarge.Bags         type year region
## 1     8603.62      93.25           0 conventional 2015 Albany
## 2     9408.07      97.49           0 conventional 2015 Albany
## 3     8042.21     103.14           0 conventional 2015 Albany
## 4     5677.40     133.76           0 conventional 2015 Albany
## 5     5986.26     197.69           0 conventional 2015 Albany
## 6     6556.47     127.44           0 conventional 2015 Albany
## 7     8196.81     122.05           0 conventional 2015 Albany
## 8     6266.85     562.37           0 conventional 2015 Albany
## 9    11104.53     283.83           0 conventional 2015 Albany
## 10    8061.47     564.45           0 conventional 2015 Albany
tail(datos_aguacate, 10) # Los ultimos 10 registros
##        X       Date AveragePrice Total.Volume   X4046   X4225  X4770 Total.Bags
## 18240  2 11/03/2018         1.56     22128.42 2162.67 3194.25   8.93   16762.57
## 18241  3 04/03/2018         1.54     17393.30 1832.24 1905.57   0.00   13655.49
## 18242  4 25/02/2018         1.57     18421.24 1974.26 2482.65   0.00   13964.33
## 18243  5 18/02/2018         1.56     17597.12 1892.05 1928.36   0.00   13776.71
## 18244  6 11/02/2018         1.57     15986.17 1924.28 1368.32   0.00   12693.57
## 18245  7 04/02/2018         1.63     17074.83 2046.96 1529.20   0.00   13498.67
## 18246  8 28/01/2018         1.71     13888.04 1191.70 3431.50   0.00    9264.84
## 18247  9 21/01/2018         1.87     13766.76 1191.92 2452.79 727.94    9394.11
## 18248 10 14/01/2018         1.93     16205.22 1527.63 2981.04 727.01   10969.54
## 18249 11 07/01/2018         1.62     17489.58 2894.77 2356.13 224.53   12014.15
##       Small.Bags Large.Bags XLarge.Bags    type year           region
## 18240   16510.32     252.25           0 organic 2018 WestTexNewMexico
## 18241   13401.93     253.56           0 organic 2018 WestTexNewMexico
## 18242   13698.27     266.06           0 organic 2018 WestTexNewMexico
## 18243   13553.53     223.18           0 organic 2018 WestTexNewMexico
## 18244   12437.35     256.22           0 organic 2018 WestTexNewMexico
## 18245   13066.82     431.85           0 organic 2018 WestTexNewMexico
## 18246    8940.04     324.80           0 organic 2018 WestTexNewMexico
## 18247    9351.80      42.31           0 organic 2018 WestTexNewMexico
## 18248   10919.54      50.00           0 organic 2018 WestTexNewMexico
## 18249   11988.14      26.01           0 organic 2018 WestTexNewMexico

Preparar datos

Las variables de interés son: Date, AveragePrice, type y region. Se van a seleccionar solo estas variables en un nuevo conjunto de datos llamado datos.

Se utiliza la función colnames() para identidicar las variables del conjunto de datos.

Luego la instrucción función select() para proyectar o seleccionar las columnas adecuadas y dejar todo en el conjunto de datos llamado datos.

colnames(datos_aguacate) # nombres de columnas
##  [1] "X"            "Date"         "AveragePrice" "Total.Volume" "X4046"       
##  [6] "X4225"        "X4770"        "Total.Bags"   "Small.Bags"   "Large.Bags"  
## [11] "XLarge.Bags"  "type"         "year"         "region"
datos <- select(datos_aguacate, Date, AveragePrice, type, region) # Seleccionar

colnames(datos) <- c("fecha", "precio", "tipo", "region") # Modificar nombres de columnas


head(datos)
##        fecha precio         tipo region
## 1 27/12/2015   1.33 conventional Albany
## 2 20/12/2015   1.35 conventional Albany
## 3 13/12/2015   0.93 conventional Albany
## 4 06/12/2015   1.08 conventional Albany
## 5 29/11/2015   1.28 conventional Albany
## 6 22/11/2015   1.26 conventional Albany

Preguntas de investigación

¿Cuáles son los estadísticos de la variable precio, media, moda, mediana y los cuartiles?. Descriptivo Texto.

El símbolo de pesos seguido del conjunto de datos identifica a una variable a columna de los datos, ejemplo datos$precio. La función mean() calcula la media aritmética de precio. La función sd() calcula la desviación estándar de precio. La función round() redondea a ciertas posiciones decimales.

summary(datos$precio)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.440   1.100   1.370   1.406   1.660   3.250
media_precio = mean(datos$precio)
ds_precio = sd(datos$precio)
paste("La media de precio es: ", round(media_precio, 2))
## [1] "La media de precio es:  1.41"
paste("La desviación estandar  de precio es: ", round(ds_precio, 2))
## [1] "La desviación estandar  de precio es:  0.4"

Visualmente con la función hist() se presenta la distribución de los datos mediante un histograma. La función hist() no requiere librería y forma parte de funciones de paquetes base de R, no requiere instalar nada.

hist(datos$precio, 
     main = "Precio de aguacate",
     sub = paste("Me =", round(media_precio, 2), "; ds =", round(ds_precio, 2)),
     xlab = "Precios", 
     ylab = "Frecuencia", 
     freq = FALSE) # Importante: freq = FALSE para usar densidad
# Agregar la línea de densidad
lines(density(datos$precio, na.rm = TRUE), col = "red", lwd = 2)

Visualmente con la función ggplot() y sus distintas alternativas y complementos, si requiere librería y es precisamente “ggplot2” previamente instalada y cargada para este documento markdwown. * geom_density() pone la curva de densidad * geom_vline() pone linea vertical en la intercepcióxintercep del eje de las x.

# Calcular el binwidth para 10 cortes
cortes <- (max(datos$precio, na.rm = TRUE) - min(datos$precio, na.rm = TRUE)) / 10

# Crear el histograma con ggplot2
ggplot(datos, aes(x = precio)) +
    geom_histogram(aes(y = ..density..), binwidth = cortes, fill = "skyblue", color = "black", alpha = 0.7) + # Histograma con densidad
  geom_density(color = "red", size = 1) + # Línea de densidad
  geom_vline(aes(xintercept = media_precio, color = "Media"), linetype = "dashed", size = 1) + # Línea de la media
  geom_vline(aes(xintercept = media_precio + ds_precio, color = "Media + SD"), linetype = "dotted", linewidth = 1) + # Media + Desviación estándar
  geom_vline(aes(xintercept = media_precio - ds_precio, color = "Media - SD"), linetype = "dotted", size = 1) + # Media - Desviación estándar
  scale_color_manual(
    values = c("Media" = "green", "Media + SD" = "blue", "Media - SD" = "blue"),
    name = "Leyenda",
    labels = c(
      paste("Media =", round(media_precio, 2)),
      paste("Media + SD =", round(media_precio + ds_precio, 2)),
      paste("Media - SD =", round(media_precio - ds_precio, 2))
    )
  ) +
  labs(
    title = "Precio de aguacate",
    x = "Precio",
    y = "Frecuencia"
  ) +
  theme_minimal() # Tema limpio

Otros estadísticos calculados el valor mínimo, máximo, mediana, y cuartiles con finciones particualres: max(), min(), median(), quantile() respectivamente.

mediana_precio = median(datos$precio)
q1_precio = quantile(datos$precio, 0.25)
q2_precio = quantile(datos$precio, 0.50)
q3_precio = quantile(datos$precio, 0.75)
max_precio = max(datos$precio)
min_precio = min(datos$precio)
RI_precio = q3_precio - q1_precio
paste("Me=", round(media_precio, 2), "; ds=", round(ds_precio, 2), "; Mediana=", mediana_precio, "; q1=", q1_precio, "; q2=", q2_precio, "; q3=", q3_precio, "; Mín", min_precio, "; Máx", max_precio, "; RI=", RI_precio)
## [1] "Me= 1.41 ; ds= 0.4 ; Mediana= 1.37 ; q1= 1.1 ; q2= 1.37 ; q3= 1.66 ; Mín 0.44 ; Máx 3.25 ; RI= 0.56"

Se puede observar visualmente los valores de los cuartiles mediante un gráfico boxplot.

Se utiliza la función boxplot() que no requiere librería ya que forma parte de funciones de paquetes base de R

Luego con la función ggplot que si requiere la librería boxplot2 se hace un boxplot mas elaborado.

boxplot(datos$precio, 
        main = "Precio de aguacate",
     sub = paste("Me=", round(media_precio, 2), "; ds=", round(ds_precio, 2), "; Mediana=", mediana_precio, "; q1=", q1_precio, "; q2=", q2_precio, "; q3=", q3_precio, "; Mín", min_precio, "; Máx", max_precio, "; RI=", RI_precio),
     xlab = "Precios", 
     ylab = "Frecuencia")

¿Se observan valores atípicos muy lejanos de la distribución?, ¿cuáles son?:

# Límite inferior
limite_inferior <- q1_precio - (1.5 * RI_precio)
limite_superior <- q3_precio + (1.5 * RI_precio)

# Identificar valores atípicos inferiores
atipicos_inferiores <- datos$precio[datos$precio < limite_inferior]

# Identificar valores atípicos superiores
atipicos_superiores <- datos$precio[datos$precio > limite_superior]

# Mostrar resultados

print("Valores atípicos inferiores")
## [1] "Valores atípicos inferiores"
print (atipicos_inferiores)
## numeric(0)
print("Valores atípicos superiores")
## [1] "Valores atípicos superiores"
print (atipicos_superiores)
##   [1] 2.58 2.79 2.66 2.59 2.74 2.79 2.73 2.73 2.77 2.71 2.73 2.72 2.76 2.75 2.58
##  [16] 2.54 2.67 2.68 2.57 2.76 2.85 3.03 2.91 2.65 2.62 2.62 2.55 2.52 2.61 2.54
##  [31] 2.65 2.82 2.51 2.74 2.73 2.56 2.57 2.67 2.67 2.88 2.94 2.99 3.12 3.25 2.93
##  [46] 2.72 2.64 2.73 2.89 2.51 2.57 2.93 2.79 2.83 2.55 2.75 2.56 2.54 2.59 2.59
##  [61] 2.59 2.62 2.78 2.79 2.64 2.65 2.63 2.71 2.75 2.62 2.55 2.57 2.57 2.54 2.51
##  [76] 2.54 2.67 2.82 2.55 2.77 2.80 2.82 2.83 2.50 2.53 2.58 2.73 2.62 2.67 2.67
##  [91] 2.61 2.62 2.50 2.67 2.62 2.58 2.51 2.60 2.57 2.55 2.99 2.57 2.58 2.59 2.64
## [106] 2.62 2.81 2.59 3.05 2.87 2.65 2.83 2.71 2.85 2.86 2.81 2.83 2.84 2.84 2.85
## [121] 2.57 2.53 2.85 3.00 2.92 2.89 2.97 3.04 2.65 2.51 2.55 2.63 2.61 2.76 2.73
## [136] 2.50 2.52 2.50 2.57 3.00 2.93 2.57 2.59 2.66 2.76 2.77 2.72 2.73 2.65 2.64
## [151] 2.54 2.58 2.56 2.59 2.54 2.59 2.83 2.88 2.90 2.92 2.52 2.58 2.59 2.70 2.70
## [166] 2.58 2.54 2.69 2.80 2.86 2.83 2.86 2.87 2.89 2.96 2.87 2.65 2.58 2.60 2.61
## [181] 2.61 2.65 2.54 2.55 2.74 2.88 2.95 2.94 2.86 2.93 2.84 2.76 2.55 2.66 2.55
## [196] 2.56 2.50 2.71 2.69 2.81 2.84 2.64 2.70 3.17 2.56 2.61 2.52 2.51 2.50
n_cuantos_atipicos <- length(c(atipicos_inferiores, atipicos_superiores))
paste("Hay ", n_cuantos_atipicos, " valores atípicos outliers en los precios unitarios")
## [1] "Hay  209  valores atípicos outliers en los precios unitarios"
print ("Que hacer con estos valores, hay que mencionarlo en el análisis")
## [1] "Que hacer con estos valores, hay que mencionarlo en el análisis"

¿Cuál tipo de aguacate se consume mas Orgánico o el Convencional?. Frecuencias Descriptivo Tabla y visual

¿Hay relación del precio con respecto a la region. Descriptivo. Visual Barra apilada

¿Cuál región come o compra mas?. Barra por la frecuencia

Interpretación

El valor estadístico de la media del precio del aguacate es de aproximadamente 1.40 con una desviación estándar de 0.4.

El 68% de los datos con respecto al precio del aguacate están distribuidos entre un valor monetario de 1 y 1.81 que es el rango de la media \(\pm\) la desviación estándar. (\(\sigma \pm \mu\)).

El valor de la mediana del precio unitario de aguacate es de 1.37 con valores de cuartiles de 1.1, 1.37 y 1.66; el rango intercuartílico es de 0.56.

Hay 209 valores atípicos (outliers) en los precios unitarios lo que provoca un sesgo a la derecha de la distribución.