Загрузка библиотек

library(tidyverse)
library(readxl) # считывание данных в формате Excel
library(stringr) # операции со строками
library(lubridate)
avocado <- read_excel('avocado.xlsx') # подключение книги Excel
#head(avocado) # вывод небольшой части данных в начале таблицы, чтобы проконтролировать результат загрузки

Преобразование даты в нужный формат

avocado$date <- ymd(avocado$date)
str(avocado$date)
##  Date[1:18249], format: "2015-01-04" "2015-01-04" "2015-01-04" "2015-01-04" "2015-01-04" ...
avocado_complete <- 
  filter(avocado, region != "TotalUS" )

Набор данных

Набор данных avocado.xlsx содержит данные с сайта Hass Avocado Board о еженедельных объемах продаж и ценах на авокадо сорта “Хасс” за период с января 2015 года по март 2018 года в США.

Описание столбцов набора данных:
- date - дата наблюдения;
- average_price - средняя цена за штуку авокадо;
- total_volume - общий объем продаж авокадо;
- plu4046 - объем продаж авокадо с кодом продукта 4046;
- plu4225 - объем продаж авокадо с кодом продукта 4225;
- plu4770 - объем продаж авокадо с кодом продукта 4770;
- total_bags - объем продаж авокадо в упаковках;
- small_bags - объем продаж авокадо в маленьких упаковках;
- large_bags - объем продаж авокадо в больших упаковках;
- xlarge_bags - объем продаж авокадо в очень больших упаковках;
- type - тип авокадо;
- year - год;
- region - регион продажи.


Анализ сезонности

Любой товар подвергается влиянию сезонности. В течение года может изменяться цена товара, а также спрос на него. Насколько сильно это затрагивает авокадо?

Изменение средней цены на авокадо в зависимости от сезона

Максимально высокая цена наблюдается в сентябре (на органическое авокадо) и октябре (на обычное)

while (!is.null(dev.list()))  dev.off()
a <- ggplot(data = avocado_complete, mapping = aes(x = month(date), fill = factor(type), y = average_price))+
  stat_summary(fun.y = 'mean', geom = 'bar', position = 'dodge')+
  geom_smooth(fullrange = TRUE, se = FALSE)
print(a)
## `geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'

Изменение спроса на авокадо в зависимости от сезона

Максимальный спрос в феврале.

while (!is.null(dev.list()))  dev.off()
b <- ggplot(data = avocado_complete, mapping = aes(x = month(date), y = total_volume, color = type))+
  geom_line(alpha = 0.7) 
print(b)


Изучение закономерностей на протяжении 4х лет

Изменение средней цены на авокадо в зависимости от года продажи

Как видно из графика, максимальная средняя цена на авокадо наблюдалась в 2017 году. Однако данные за 2018 год не являются полными, дополнение которых в дальнейшем может повлиять на выводы. Более того, стоимость и разброс цен на органический тип больше, чем на обычный.

Не повлияло ли постепенное увеличение средней цены 2017 года на объемы продаж?

while (!is.null(dev.list()))  dev.off()
c <- ggplot(data = avocado_complete) +
  geom_boxplot(mapping = aes(x = year, fill = factor(type), y = average_price))
print(c)

Изменение объемов продаж авокадо в зависимости от года

Из графика видно, что в 2017 году наблюдался легкий спад спроса на продукцию. К 2018 году ситуация изменилась значительно, на что могло повлиять большое количество факторов (в том числе и снижение стоимости). Несмотря на это, потребление органического авокадо растет с каждым годом. Изменилось ли потребление в процентном соотношении?

while (!is.null(dev.list()))  dev.off()
d <- ggplot(data = avocado_complete, mapping = aes(x = year, fill = factor(type), y = total_volume))+
  stat_summary(fun.y = 'mean', geom = 'bar', position = 'dodge')
print(d)

Процентное соотношение спроса на тип авокадо

Спрос на органическое авокадо увеличивался и в относительном соотношении с обычным.

while (!is.null(dev.list()))  dev.off()
e <- ggplot(data = avocado_complete, mapping = aes(x = year, fill = factor(type), y = total_volume))+
  stat_summary(fun.y = 'mean', geom = 'bar', position = 'fill')+
  scale_y_continuous(labels = scales::percent) # процентный формат для оси
print(e)

Определение количества поступаемых в год заказов

Повлияло ли увеличение объемов продаж в 2018 на изменение количества постураемых заказов?

В данном случае мы видим, что объем продаж не сильно коррелирует с количеством обработанных заказов: в 2018 году наблюдается максимальное количество отгруженной продукции, но большими партиями. Следовательно, самих партий оказалось значительно меньше.

while (!is.null(dev.list()))  dev.off() 
f <- ggplot(data = avocado_complete, mapping = aes(x = fct_rev(fct_infreq(year)), fill = factor(type)))+
  geom_bar() +
  coord_flip()
print(f)

Изменение объема продажи в зависимости от средней цены

Существует ли зависимость между объемом партии и средней ценой?

Данный график иллюстрирует закономерность: чем больше общий объем проданной продукции, тем ниже средняя цена. Покупать оптом дешевле.

while (!is.null(dev.list()))  dev.off()
#avocado_complete1 <- 
# filter(avocado_complete, year == '2017')
g <- ggplot(data = avocado_complete, mapping = aes(x = average_price, y = total_volume, color = year))+
  geom_point(alpha = 0.4) + 
  geom_smooth(fullrange = TRUE, se = FALSE)
print(g)
## `geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'

Среднее количество авокадо в упаковке

С точки зрения логистики важно знать, сколько в среднем авокадо находится в одной упаковке. В посчитанной переменной наблюдается большой разброс данных. Это может означать, что у фирмы нет стандартов по формату отгрузки товара или что есть погрешности в данных. В любом случае, можно выделить эту область как зону для дальнейшего развития.

avocado_complete$mean_volume <- avocado_complete$total_volume/avocado_complete$total_bags # общий объем делить на общее количество упаковок
avocado_complete$mean_volume[1:10] # вывели значения первых десяти строк
##  [1]  4.020622  4.684323  6.898456  1.186937 13.735874 53.040007 13.847195
##  [8]  3.447951  2.905147  5.405486
# Верхняя граница - квантиль 99%
max_mean_volume <-
  quantile(avocado_complete$mean_volume, probs = 0.99, na.rm = TRUE)
max_mean_volume
##      99% 
## 45.10868

(максимальное значение превышает данное в 200 раз. Хотя отсекается лишь один процент)

avocado_complete2 <- 
  filter(avocado_complete, mean_volume <= max_mean_volume)
while (!is.null(dev.list()))  dev.off()
h <- ggplot(data = avocado_complete2) + 
  geom_histogram(mapping = aes(x = mean_volume), binwidth = 5)  +
  geom_vline(mapping = aes(xintercept = median(mean_volume)), show.legend = TRUE) +
  labs(color = NULL)
print(h)


Регионы

Общая ситуация по регионам. Перспективы.

В данном случае для наглядности следовало бы оргничить регионы до топ 10. Однако это не позволит увидить весь спектор регионов.

Из графика понятно, что отгрузка авокадо сильно разнится по географическому признаку. В качестве перспективных рынков можно рассматривать другие страны, так как большая часть штатов уже обслуживается компанией.

while (!is.null(dev.list()))  dev.off() 
i <- ggplot(data = avocado_complete, mapping = aes(x = fct_inorder(region), y = total_volume)) +
  geom_bar(stat = 'identity')+ 
     coord_flip()
print(i)

Доля Калифорнии от всех рынков.

while (!is.null(dev.list()))  dev.off() 

California <- ifelse((avocado_complete$region == "California"), "TRUE", "FASLE")

j <- ggplot(data = avocado_complete,mapping = aes(x="", y=total_volume, fill=California)) +
    geom_bar(width = 1, stat = "identity") +
    coord_polar("y", start=0) 
print(j)