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 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
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
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
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.