#Install ggplot
# install.packages("ggplot2") # libreria grafica
#install.packages("tidyverse")
# Importar librerías
library("readr")
library("ggplot2")
library("tidyverse")
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ stringr 1.5.1
## ✔ forcats 1.0.0 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.1
## ✔ 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
Importar datos
# Importar librerías
avocado_prices <- read_csv("data/avocado-updated-2020.csv",show_col_types = FALSE)
View(avocado_prices)
Tamaño del dataset
dim(avocado_prices)
## [1] 33045 13
¿De qué tipo de variables se compone mi base de datos? Realice un análisis exploratorio de las variables numéricas (media, varianza, diagrama de cajas, etc) ¿Qué conclusiones se pueden extraer de la muestra de datos?
Resumen de estadisticas de dataset
summary(avocado_prices)
## date average_price total_volume 4046
## Min. :2015-01-04 Min. :0.44 Min. : 85 Min. : 0
## 1st Qu.:2016-06-19 1st Qu.:1.10 1st Qu.: 15119 1st Qu.: 767
## Median :2017-12-10 Median :1.35 Median : 129117 Median : 10995
## Mean :2017-12-12 Mean :1.38 Mean : 968400 Mean : 302391
## 3rd Qu.:2019-06-16 3rd Qu.:1.62 3rd Qu.: 505828 3rd Qu.: 119022
## Max. :2020-11-29 Max. :3.25 Max. :63716144 Max. :22743616
## 4225 4770 total_bags small_bags
## Min. : 0 Min. : 0.0 Min. : 0 Min. : 0
## 1st Qu.: 2712 1st Qu.: 0.0 1st Qu.: 9122 1st Qu.: 6479
## Median : 23436 Median : 178.1 Median : 53222 Median : 36877
## Mean : 279769 Mean : 21482.6 Mean : 364673 Mean : 250198
## 3rd Qu.: 135239 3rd Qu.: 5096.5 3rd Qu.: 174431 3rd Qu.: 120662
## Max. :20470573 Max. :2546439.1 Max. :31689189 Max. :20550407
## large_bags xlarge_bags type year
## Min. : 0 Min. : 0.0 Length:33045 Min. :2015
## 1st Qu.: 466 1st Qu.: 0.0 Class :character 1st Qu.:2016
## Median : 6376 Median : 0.0 Mode :character Median :2017
## Mean : 106733 Mean : 7742.6 Mean :2017
## 3rd Qu.: 40417 3rd Qu.: 804.4 3rd Qu.:2019
## Max. :13327601 Max. :1403184.0 Max. :2020
## geography
## Length:33045
## Class :character
## Mode :character
##
##
##
Tipo de variables
# El operador ' :: ' se utiliza para llamar funciones, sin importar librerías
dplyr::glimpse(avocado_prices)
## Rows: 33,045
## Columns: 13
## $ date <date> 2015-01-04, 2015-01-04, 2015-01-04, 2015-01-04, 2015-01…
## $ average_price <dbl> 1.22, 1.79, 1.00, 1.76, 1.08, 1.29, 1.01, 1.64, 1.02, 1.…
## $ total_volume <dbl> 40873.28, 1373.95, 435021.49, 3846.69, 788025.06, 19137.…
## $ `4046` <dbl> 2819.50, 57.42, 364302.39, 1500.15, 53987.31, 8040.64, 4…
## $ `4225` <dbl> 28287.42, 153.88, 23821.16, 938.35, 552906.04, 6557.47, …
## $ `4770` <dbl> 49.90, 0.00, 82.15, 0.00, 39995.03, 657.48, 2752.35, 0.0…
## $ total_bags <dbl> 9716.46, 1162.65, 46815.79, 1408.19, 141136.68, 3881.69,…
## $ small_bags <dbl> 9186.93, 1162.65, 16707.15, 1071.35, 137146.07, 3881.69,…
## $ large_bags <dbl> 529.53, 0.00, 30108.64, 336.84, 3990.61, 0.00, 1691.32, …
## $ xlarge_bags <dbl> 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.…
## $ type <chr> "conventional", "organic", "conventional", "organic", "c…
## $ year <dbl> 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 20…
## $ geography <chr> "Albany", "Albany", "Atlanta", "Atlanta", "Baltimore/Was…
Valores nulos
colSums(is.na(avocado_prices))
## date average_price total_volume 4046 4225
## 0 0 0 0 0
## 4770 total_bags small_bags large_bags xlarge_bags
## 0 0 0 0 0
## type year geography
## 0 0 0
Análisis grafico del data set
# Configurar el layout para 2 filas y 2 columnas
par(mfrow = c(2,2 ))
# Box Promedio
boxplot(avocado_prices$average_price, main = "Promedio del precio",
horizontal = TRUE)
# Box Promedio
boxplot(avocado_prices$total_volume, main = "Volumen total",
horizontal = TRUE)
# barplot años vs volumen vendido
# Ordear datos
summary_volumen <- avocado_prices %>%
mutate(year = format(date, "%Y")) %>%
group_by(year) %>%
summarise(total_volume = sum(total_volume, na.rm = TRUE))
# Crear grafica
barplot(height = summary_volumen$total_volume,
names.arg =summary_volumen$year,
main = "Total volumen de aguacates por año"
)
# Por formato de venta
small_bags <- sum(avocado_prices$small_bags)
large_bags <- sum(avocado_prices$large_bags)
xlarge_bags <- sum(avocado_prices$xlarge_bags)
#Crear data frame
bag_sales <- c(small_bags, large_bags, xlarge_bags)
bag_names <- c("Small Bags", "Large Bags", "XLarge Bags")
# Crear la gráfica de barras
barplot(height = bag_sales, names.arg = bag_names,main = "Ventas totales
por Tipo"
)
# Crear tabla de volumen total por geografía, excluyendo 'Total U.S.'
city_volumen <- avocado_prices %>%
filter(geography != "Total U.S.") %>%
group_by(geography) %>%
summarise(total_volume = sum(total_volume, na.rm = TRUE)) %>%
arrange(desc(total_volume)) # Ordenar de mayor a menor
# Crear el gráfico de barras
barplot(city_volumen$total_volume,
names.arg = city_volumen$geography,
las = 2, # Rotar etiquetas del eje X para mejor visualización
col = "steelblue",
main = "Volumen Total de Aguacates por Ciudad (Ordenado)",
cex.names = 0.7) # Ajustar tamaño de las etiquetas si es necesario
## analisis por promedio de precios
# Crear tabla de precio promedio por geografía, excluyendo 'Total U.S.'
city_price <- avocado_prices %>%
filter(geography != "Total U.S.") %>%
group_by(geography) %>%
summarise(average_price = mean(average_price, na.rm = TRUE)) %>%
arrange(desc(average_price)) # Ordenar de mayor a menor
# Crear el gráfico de barras
barplot(city_price$average_price,
names.arg = city_price$geography,
las = 2, # Rotar etiquetas del eje X para mejor visualización
col = "steelblue",
main = "Precio Promedio de Aguacates por Ciudad (Ordenado)",
cex.names = 0.7) # Ajustar tamaño de las etiquetas si es necesario
El data set está formado por 13 variables y 33.045 registros o filas, no posee datos nulos.
date:, es una variable en formato “date” o fecha, para el análisis.
average_price: Variable con fomrato “dbl” o decimal, el valor minimo de es de 0.44, el de maximo 3.25, su promedio es de 1.38 y su medinana de 1.35, analizando la grafica de caja y bigites se aprecia que contiene datos atípicos positivos, revelando que hay años en los que el precio supero el promedio por mucho.
total_volume: Variable con fomrato “dbl” o decimal, cuyo valor minimo es 85, promedio de 968400, mediana de 129117 y un valor maximo de 63716144, esta variable contiene una gran cantidad de datos atipicos, se observa que cada año incrementa su volumen de venta.
small_bags,large_bags,xlarge_bags: Formato de venta, el formato más vendido es Small Bags, el segundo es large_bags y en el último lugarxlarge_bag, esto indicando que los clientes tienen a hacer compras pequeñas.
total_volume: Las 3 ciudades que tienen un mayor volumen de ventas son west, califirnia y Northeast, así mismo Hartford/Springfield y New York son las ciudades con un precio promedio mayor.
Extraiga de la base de datos el precio de venta (la variable) de los aguacates orgánicos vendidos en Albany y de Boston.
# Crear copia de los datos
copia_df <- avocado_prices
crear data frame con las variables seleccionadas
Albany_Boston <- subset(avocado_prices, type == "organic" & geography %in% c("Albany", "Boston")) %>% select(type, geography, average_price)
# mostrar la dimención del data set
dim(Albany_Boston)
## [1] 612 3
Como paso previo al modelado, calcule la covarianza y la matriz de correlación de del precio de los aguacates orgánicos, convencionales y su volumen de ventas. ¿Qué conclusiones se pueden extraer?
#crear copia, a fin de transfromar la data
copia_df = avocado_prices
Codificar datos 0 = organic, 1 = conventional
copia_df$type <- ifelse(avocado_prices$type == "organic", 0, 1)
cov(copia_df$total_volume, copia_df$average_price)
## [1] -275813.1
cov(copia_df$total_volume, copia_df$type)
## [1] 452343.2
Crear matriz de correlación
# Seleccionar las variables necesarias para el análisis
selected_data <- copia_df[, c("average_price", "type", "total_volume")]
# Calcular matriz
matriz <- cor(selected_data, method = "pearson")
#Redondear valores
matriz_round <- round(matriz, digits = 1)
matriz_round
## average_price type total_volume
## average_price 1.0 -0.6 -0.2
## type -0.6 1.0 0.2
## total_volume -0.2 0.2 1.0
Respuesta:
El análisis de covarianza no indica que hay una relación negativa entre el volumen total y el precio de venta, por otro lado hay una relación positiva cuando el tipo de aguacate es conventional.
La matriz de correlación nos indica que hay una relación negativa del 20% entre entre el volumen total y el precio, indicando que al aumentar el valor de venta disminuye la venta total.
La matriz de correlación nos indica que hay una relación positiva del 20% entre entre el volumen cuando el tipo de aguacate es conventional, indicando que los clientes tienen compararlo.
Determine la posible relación existente entre dichos precios y su volumen de ventas. Si tomáramos logaritmos, ¿Cómo sería dicha relación?
## llamar librerías
library(MASS)
##
## Adjuntando el paquete: 'MASS'
## The following object is masked from 'package:dplyr':
##
## select
library(tidyverse)
library(ggpubr)
library(car)
## Cargando paquete requerido: carData
##
## Adjuntando el paquete: 'car'
## The following object is masked from 'package:dplyr':
##
## recode
## The following object is masked from 'package:purrr':
##
## some
library(lmtest)
## Cargando paquete requerido: zoo
##
## Adjuntando el paquete: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
library(sandwich)
Primer modelo
model= lm(copia_df$average_price~ copia_df$total_volume)
summary(model)
##
## Call:
## lm(formula = copia_df$average_price ~ copia_df$total_volume)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.95605 -0.27571 -0.03504 0.23300 1.85310
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.397e+00 2.110e-03 662.19 <2e-16 ***
## copia_df$total_volume -1.782e-08 5.207e-10 -34.22 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.3724 on 33043 degrees of freedom
## Multiple R-squared: 0.03422, Adjusted R-squared: 0.03419
## F-statistic: 1171 on 1 and 33043 DF, p-value: < 2.2e-16
Modelo logaritmico
model= lm( log(copia_df$average_price)~ copia_df$total_volume)
summary(model)
##
## Call:
## lm(formula = log(copia_df$average_price) ~ copia_df$total_volume)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.11759 -0.18536 0.01151 0.19129 0.88141
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.975e-01 1.535e-03 193.79 <2e-16 ***
## copia_df$total_volume -1.342e-08 3.788e-10 -35.41 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.271 on 33043 degrees of freedom
## Multiple R-squared: 0.03657, Adjusted R-squared: 0.03654
## F-statistic: 1254 on 1 and 33043 DF, p-value: < 2.2e-16
Respuesta:
En el primero modelo se observa una relación negativa entre average_price y total_volume, donde la variable independiente y el incercepto son significatos, teniendo en cuenta sus P_value, el modelo explica el fenomeno en un 03,41% (R_cuadeado = 0.03419 ).
El segundo modelo, el cual tiene una transformación logarítmica, al igual que el primero modelo, todos sus P_values son significativos, este tiene un mayor ajuste contando con un R_cuadrado de 3,654%.
Realice una predicción de precio de venta de los aguacates orgánicos vendidos en Albany a 3 meses.
# Cargar librería
library(forecast)
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
##
## Adjuntando el paquete: 'forecast'
## The following object is masked from 'package:ggpubr':
##
## gghistogram
library(tseries) #Para series de tiempo
library(ggplot2) #Para hacer gráficos
filtral data
# Ordenar las fechas del data set
Albany <- copia_df[copia_df$geography =="Albany",]
Dar formato a la data
precio_Albany <- ts(Albany$average_price, star= c(2015,01,04), frequency = 52)
# Dibujar serie
plot(precio_Albany)
Para ello se utilizaa el comando decompose
plot(decompose(precio_Albany))
Crear modelo
Modelo <- auto.arima(precio_Albany)
Hacer prediccoón con el modelo entrenado anteriormente
prediccion <- forecast(Modelo, 3)
prediccion$mean
## Time Series:
## Start = c(2026, 41)
## End = c(2026, 43)
## Frequency = 52
## [1] 0.9288717 1.5492443 0.8644969
Plotear el resultado
plot(prediccion)