#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

1. Primer punto

¿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"
)

analisis por volumen de ventas

# 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

Respuesta del primer punto:

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.

2. Segundo punto

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

3. Tercer punto

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:

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

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

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

4.Cuarto punto

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:

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

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

5. Punto

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)

descomposición

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)