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)
Как видно из графика, максимальная средняя цена на авокадо наблюдалась в 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)