Отгрузка задержана | Ошибка транзакции | Нет в наличии

Эпоха шоппинга, переосмысленная с помощью технологий, существует уже десять лет. Одним щелчком мыши вещи доставляются к вашему порогу. Компании начали зарабатывать миллиарды долларов, просто размещая объявления и побуждая пользователей КУПИТЬ. История не заканчивается зарабатыванием миллиардов долларов, но связана с риском и шансами индустрии электронной коммерции. В этом блоге мы увидим, как шансы и риски можно контролировать или избегать, используя концепции анализа данных и применение его инструментов. Мои предыдущие блоги были сужены до текущих тем пандемии и их последствий с использованием анализа данных.

Если говорить, в частности, о текущем блоге, то он довольно сильно отличается от моих предыдущих работ. Этот конкретный блог будет посвящен набору данных, полученному для анонимной компании электронной коммерции, которая поставляет несколько продуктов в различные регионы мира. Данные получены за период 4 года (с 2015 по 2018 год). Хотя компания, как правило, получает больше прибыли, у нее также были проблемы с доставкой посылок, мошенническими заказами, транзакционными вопросами и различными другими мелкими проблемами. В связи с этим в этом блоге будет рассмотрена проблема, связанная с доставкой посылок и мошенническими заказами.

Вот краткое описание набора данных.

Цель состоит в том, чтобы превратить данные в информацию, а информацию — в понимание.

Исследование данных

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

Как сказано в кратком описании, компания занимается доставкой различной продукции по всему миру. Есть около пяти различных рынков. На графике слева показаны продажи на каждом из рынков, можно сделать вывод, что на европейском рынке были самые высокие продажи, а на африканском рынке зафиксированы самые низкие продажи. Рынок Латинской Америки (Южная Америка) и рынок Азиатско-Тихоокеанского региона показали умеренно хорошие результаты, чем остальные. Чтобы лучше понять транзакции на каждом рынке, необходимо увидеть продажи в каждом регионе. На графике ниже показаны продажи в каждом регионе.

В регионе Центральной Азии зарегистрированы самые низкие продажи, а в регионе Западной Европы - самые высокие продажи. На Рисунке 1 видно, что на европейском рынке было больше всего продаж, таким образом дополняя друг друга. Необходимо выяснить причину наименьшего показателя с точки зрения доставки и статуса заказа, а также регион с самыми высокими продажами также необходимо исследовать с точки зрения транзакций и мошенничества. Кроме того, также можно увидеть, что продажи в африканском регионе также были низкими, но, как сообщается, в Азиатско-Тихоокеанском регионе продажи были лучше, чем в нескольких регионах Латинской Америки.

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

Приведенный выше график построен между средними продажами и категорией продукта. В соответствии с текущей тенденцией, в категории компьютеров зафиксирован самый высокий уровень продаж, а в категории компакт-дисков — самый низкий средний показатель продаж по сравнению с другими категориями. Между компьютерами и остальной категорией наблюдается резкое падение продаж. Также можно сделать вывод, что распродажи носят сезонный характер; таким образом, на поведение покупателей в отношении покупок влияет множество факторов, и исследование этого вопроса может быть подробно описано далее.

Что касается рисунка 3, можно определить и изучить средний объем продаж в каждой категории. График слева сужен до рисунка 3, чтобы изучить 10 самых продаваемых категорий. В топ-10 продаваемых товаров входят как сезонные, так и несезонные товары, что больше говорит о поведении покупателей и тенденциях продаж.

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

Компания несет убытки, связанные с сезонными и несезонными факторами. Тем не менее, наше внимание сузилось до предположения, что компания несет убытки либо из-за несвоевременных поставок, либо из-за мошеннических транзакций. На графике слева перечислены 10 самых убыточных категорий продуктов и суммы, потерянные из-за этого. Бутсы, как правило, сообщают о самых высоких потерях и дополняют результаты рисунка 4; категория электроники говорит о низких потерях. Большинство спортивных товаров понесли убытки. Необходимо провести детальное расследование причин. В последней части блога модели Машинное обучение используются для расследования и прогнозирования просроченных поставок и случаев мошенничества.

Теперь, чтобы более подробно остановиться на проблеме мошеннических заказов, основное средство, с помощью которого это может произойти, — это платежи. Итак, давайте разберемся, какой способ оплаты предпочитают клиенты.

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

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

На приведенном выше графике показан предпочтительный способ оплаты клиентами из разных регионов. Дебет является наиболее распространенным способом оплаты клиентами по всему миру. Установлено, что особенно в Центральной Америке и Западной Европе платежи посредством дебета и перевода предпочтительнее других. В то время как в Центральной Азии установлено, что в равной степени предпочтение отдается наличным деньгам и переводам. Приведенная выше оценка будет полезна при обнаружении мошеннических транзакций.

С точки зрения B и C (от бизнеса к покупателю) большинство мошенничества происходит через способ оплаты. Таким образом, оценка количества транзакций и предполагаемых случаев мошенничества может быть связана с прогнозированием потенциальных случаев мошенничества.

Теперь давайте углубимся в дела о мошенничестве. Во-первых, давайте посмотрим на регионы.

На приведенном выше графике показано количество зарегистрированных случаев мошенничества в каждом регионе, а на этом графике указано фактическое количество зарегистрированных случаев мошенничества (доступно в наборе данных). Регион Западной Европы сообщает о самом высоком уровне мошенничества, за которым следует Центральная Америка. В наименьшей степени Канада, Центральная Африка и Центральная Азия сообщили о самом низком уровне мошенничества. Сравнивая это с рисунком 2, регионы с наибольшим количеством мошенничества такие же, как регионы с наибольшим количеством продаж, но количество продаж намного выше, чем случаев мошенничества. Напротив, Центральная Африка, регион с самыми низкими продажами, сообщает о случаях мошенничества с несколько большим числом, чем в Центральной Азии (наиболее умеренные случаи мошенничества).

Во-вторых, теперь сужая его до категорий продуктов,

На этом графике слева показаны категории продуктов с наибольшим количеством случаев мошенничества. Если сравнить этот конкретный график с рисунком 5, то он почти такой же, поскольку мошенничество напрямую влияет на потерю доходов. Причины мошенничества выходят за рамки обсуждения, но прогнозирование случаев мошенничества может дать преимущество в увеличении прибыли от продаж.

Теперь давайте рассмотрим еще одну важную проблему, с которой столкнулась компания. Своевременность — это то, что предпочитает клиент, и это было бы одним из основных УТП любой компании электронной коммерции. Поэтому любая проблема с доставкой должна решаться в максимальном приоритете.

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

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

«Доставили ли они клиенту вовремя?»

Чтобы ответить на вышеуказанный вопрос, давайте узнаем больше о статусе доставки.

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

Статус «поздняя доставка» также может зависеть от региона заказа и наличия товара.

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

Из набора данных были определены 10 регионов с наибольшим количеством заказов с задержкой доставки, и построен график. Центральная Америка и регион Западной Европы сообщили о наибольшем количестве просроченных поставок с небольшой разницей между ними.

Теперь оценивая продукты,

Статус поздней доставки продуктов может выглядеть примерно так, как показано на рисунке 9. Тем не менее, при более детальном рассмотрении подсчетов можно увидеть, что доставка ботинок и мужской обуви сообщила о самом высоком статусе поздней доставки с небольшой разницей между их, а электроника с минимумом. Таким образом, наличие продукта также влияет на статус доставки.

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

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

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

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

Моделирование данных

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

Перекрестная проверка — статистический метод, используемый для оценки производительности модели машинного обучения. Мы будем использовать метод перекрестной проверки в K-кратном размере для повторной выборки модели с относительно меньшим набором данных для проверки и повышения производительности модели.

Как заявил Сунил Рэй в своей статье «Улучшите производительность модели с помощью перекрестной проверки», метод перекрестной проверки в k-кратном размере разбивает данный набор данных на k-кратное, а модель строится на k-1-кратном . Затем эффективность модели оценивается в k-й раз. Среднее значение k-записанных ошибок служит для оценки показателя производительности модели. (блог)

Выбор правильного значения k имеет значение для эффективной оценки модели, и компромисс здесь следующий:

Чем меньше значение k, тем выше смещение и ниже дисперсия.

Чем больше значение k, тем ниже систематическая ошибка и выше дисперсия.

Согласно Хасти и Тибширани, One-Standard-Errorиспользуется при перекрестной проверке, чтобы выбрать наиболее экономную модель, ошибка которой составляет не более одной стандартной ошибки. выше ошибки лучшей модели.

Экономичная модель — простейшая модель, которая может объяснить данные только с необходимыми и наименьшими допущениями и переменными, но с большими объяснительными возможностями. (блог)

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

В качестве моделей машинного обучения используются дерево решений и случайный лес. Основная причина выбора именно этих моделей заключается в том, что они хорошо работают с непрерывными и категориальными переменными, а также могут автоматически обрабатывать отсутствующие переменные. В приведенных выше моделях отсутствует необходимость настройки конкретных параметров по сравнению с SVM (Support Vector Machine), поскольку в наборе данных имеется большое количество точек данных как с категориальными, так и с непрерывными переменными, случайный лес и дерево решений работают хорошо, по сравнению к другим моделям, таким как SVM, KNN и логистическая регрессия.

Еще одна основная причина выбора модели дерева решений заключается в том, что ее легко вычислить и интерпретировать, а данные не нужно нормализовать для запуска этой модели. Random Forest хорошо работает для любого заданного типа данных. Модель случайного леса уменьшает переоснащение, несмотря на создание большего количества деревьев для анализа на серверной части, она также снижает дисперсию и, таким образом, повышает точность. Они также используют методы ансамблевого обучения, которые помогают вычислять более точные и стабильные модели. Модели дерева решений отстают от Random Forest с точки зрения перелова, и единственная проблема, связанная со случайным лесом, заключается в том, что ему требуется больше вычислительной мощности и времени. Между случайным лесом и деревом решений модели случайного леса более точно предсказывают выходные данные.

Набор данных был разделен в соотношении 70–30, где 70% данных используются для обучения, а оставшиеся 30% данных используются для тестирования.

Любые данные могут быть смоделированы в соответствии с типом переменной набора данных.

Для прогнозирования поздних родов использовались следующие предикторы.

modelld = rep(0, 4)
modelld[1] <- "Delivery_status ~ Days_for_shipping_real"
modelld[2] <- "Delivery_status ~ Days_for_shipping_real + Days_for_shipment_scheduled "
modelld[3] <- "Delivery_status ~ Days_for_shipping_real + Days_for_shipment_scheduled + Late_delivery_risk "
modelld[4] <- "Delivery_status ~ Days_for_shipping_real + Days_for_shipment_scheduled + Late_delivery_risk + Shipping_mode"

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

modelfd = rep(0, 4)
modelfd[1] <- "Order_status ~ Order_item_total"
modelfd[2] <- "Order_status ~ Order_item_total+Sales_per_customer "
modelfd[3] <- "Order_status ~ Order_item_total + Sales_per_customer + Product_price "
modelfd[4] <- "Order_status ~ Order_item_total + Sales_per_customer + Product_price + Product_card_id "

Чтобы понять взаимосвязь между каждой из переменных-предикторов, строится график удара ggpair,

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

Предикторы выбираются после их корреляции с зависимой переменной (y).

Прогнозы с использованием Random Forest — поздняя доставка

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

График ошибок для вышеуказанных моделей:

Получена следующая точность:
modelld[1] = 0,971467
modelld[2] = 0,971901
modelld[3] = 0,974172
modelld[4] = 0,974629

Таким образом, по мере увеличения сложности модели точность увеличивается.

Таким образом, можно сделать вывод, что точность прогнозирования статуса поздних родов с помощью комплекса определенной модели оценивается в 97,46 %, а modelld[4] является наиболее эффективной моделью.

График одной стандартной ошибки для приведенной выше модели,

По мере увеличения сложности модели точность также увеличивается, и при использовании одного правила стандартной ошибки следующей наиболее эффективной моделью будет modelld[1] с точностью 97,14%.

Прогнозы с использованием дерева решений — поздняя доставка

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

График ошибок для вышеуказанных моделей,

Получена следующая точность:
modelld[1] = 0,971082
modelld[2] = 0,973806
modelld[3] = 0,974279
modelld[4] = 0,974084

Здесь тенденция увеличения сложности не проявляется, так как есть небольшая разница в точности между modelld[3] и modelld[4].

Таким образом, можно сделать вывод, что точность прогнозирования статуса поздней доставки оценивается в 97,42 %, а модель modelld[3] является наиболее эффективной моделью.

График одной стандартной ошибки для приведенной выше модели,

Теперь, согласно одному правилу стандартной ошибки, по графику можно определить, что следующей наиболее эффективной моделью после modelld[3] является modelld[1] с точностью 97,1%.

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

Прогнозы с использованием Random Forest – потенциально мошеннические

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

График ошибок для вышеуказанных моделей:

Получена следующая точность:
modelfd[1] = 0,961504
modelfd[2] = 0,965472
modelfd[3] = 0,967199
modelfd[4] = 0,967208

Здесь по мере увеличения сложности точность становится лучше, и существует незначительная разница между modelfd[3] и modelfd[4] с точки зрения прогнозирования точности.

Таким образом, можно сделать вывод, что точность прогнозирования статуса потенциального мошенничества оценивается в 96,72 %, а модель modelld[4] является наиболее эффективной моделью.

График одной стандартной ошибки для приведенной выше модели,

По мере увеличения сложности модели повышается и точность. Поскольку ни одна простая модель не подпадает под стандартное отклонение правила одной стандартной ошибки, наиболее эффективной моделью является modelld[4], ] с точностью 96,72%.

Теперь, учитывая вышеприведенные результаты прогнозирования поздних доставок с помощью моделей "Случайный лес" и "Дерево решений", можно сделать вывод, что модель "Случайный лес" дает более точные прогнозы, чем модель "Дерево решений". Точность прогнозирования поздней доставки для сложной модели с использованием Random Forest составляет 97,46 %, тогда как в случае Decision Tree оценивается в 97,42 %, несмотря на меньшие вариации, можно сделать вывод, что модель Random Forest предсказывает более точно, чем модель Random Forest. другая модель. При прогнозировании потенциального мошенничества видно, что учитывалась только модель случайного леса (причина указана выше). Точность прогнозирования потенциального мошенничества оценивается в 96,72%.

Правило одной стандартной ошибки используется для определения следующей наиболее эффективной простой модели. При прогнозировании поздней доставки с помощью Random Forest видно, что простейшая модель кажется следующей лучшей моделью для прогнозирования поздней доставки, но в случае прогнозирования мошенничества с использованием Random Forest лучшей моделью кажется сложная модель.

Вывод

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

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

Чтобы найти решение для основной проблемы (поздняя доставка), необходимо провести подробный анализ причины проблемы. Распространенными причинами задержки поставок с точки зрения BB (Business to Business) могут быть отсутствие запасов на складах, задержка доставки продукции от поставщика поставщику, наличие запасов, но на другом складе, а также быть востребованным в программном обеспечении для управления запасами. С точки зрения B-C (Business to Customer) это может быть полностью связано с партнером по доставке или частично с наличием запасов и партнером по доставке.

Как аналитик данных, компания рекомендует следующее:

Необходимо оптимизировать процесс закупок, чтобы на складе была готовая продукция для удовлетворения потребностей клиентов; таким образом, должен был быть выполнен надлежащий план закупок по количеству заказа и спросу (сезонному и несезонному). Компании также необходимо поработать над логистической частью, чтобы вовремя доставлять грузы своему клиенту, тем самым избегая задержек доставки. Компания также может предпочесть вертикальную интеграцию своих процессов, чтобы оптимизировать рабочий процесс. Модель машинного обучения, разработанная для прогнозирования поздних поставок, хорошо справляется с прогнозированием их с точностью 97,46%, поэтому сотрудник может инициировать заказ с более быстрыми вариантами доставки, чтобы избежать задержки, партнер 3PL (3rd Party Logistic) также может оптимизировать маршруты соответственно. Чтобы предотвратить потенциальные мошеннические случаи, компания может использовать модель машинного обучения, построенную для их прогнозирования с точностью 96,72%, для блокировки транзакций, которые могут быть мошенническими.

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

Давайте улучшим работу отрасли, чтобы удовлетворить требования B-B и B-C

**Приведенные выше результаты относятся к этому конкретному набору данных.

Цель состоит в том, чтобы превратить данные в информацию, а информацию — в идеи. — Carly Fiorina

Приложение

RFM-анализ

Отсылка к статье Усаи Диего о сегментации и изучении клиентов и статье Aravind Hebbali об анализе RFM

RFM расшифровывается как Recency, Frequiency, Monetary values.

Это метрики, которые используются для определения поведения клиентов и их взаимодействия с продуктом или компанией. Данные остаются открытыми для выполнения RFM-анализа, чтобы классифицировать клиентов в соответствии с их стоимостью покупки и датой их последней покупки. Это поможет определить их взаимодействие с компанией и тем самым увеличить клиентскую базу и ценность компании. Это также оказывает прямое влияние на конечный результат получения дохода, а также с точки зрения очистки складских запасов (чтобы избежать накладных расходов на складах).

Код

library(tidyverse)
library(ggplot2)
library(gganimate)
library(dplyr)
library(ggcorrplot)
library(corrplot)
library(ggpubr)
library(party)
library(data.table)
library(mltools)
library(randomForest)
library(matrixStats)
library(caret)
library(e1071)
library(ROCR)
library(pROC)
library(klaR)
library(caTools)
#Loading datasets
library(readr)
project <- read_csv("Desktop/Project/Data/project.csv")
View(project)
numdata <- select_if(project,is.numeric)
View(numdata)
attach(project)
pdata<- read_csv("../input/dataco-smart-supply-chain-for-big-data-analysis/DataCoSupplyChainDataset.csv")
head(pdata,1)
#Datavisulations
#Market Vs Sales
project%>% dplyr::select(Market,Sales) %>%
  group_by(Market)%>% 
  summarise(sales = sum(Sales))%>%
  arrange(desc(sales))%>%
  ggplot(aes(x =reorder( Market,-sales),y =sales,fill = Market)) + 
  geom_bar(stat = "identity")+
  labs(x = "Market", y = "Sales", title = " Markert Vs Sales")+ 
  theme_minimal()
 
#Region Vs Sales
project%>% dplyr::select(`Order Region`,Sales) %>%
  group_by(`Order Region`)%>% 
  summarise(sales = sum(Sales))%>%
  arrange(desc(sales))%>%
ggplot(aes(x = reorder(`Order Region`,-sales),y = sales, fill = `Order Region`))+
         geom_bar(stat = "identity")+
         labs(x = "Order Region", y = "Sales", title = " Order Region Vs Sales")+ 
         coord_flip()+
         theme_minimal()
#Mean Sales
project%>% dplyr::select(`Category Name`,Sales) %>%
  group_by(`Category Name`)%>% 
  summarise(sales = mean(Sales))%>%
  arrange(desc(sales))%>%
ggplot() +geom_bar(aes(x = reorder(`Category Name`,-sales), y = sales),stat = "identity")+
  labs(x = "Categories", y =" Average sales", title = "Category Vs Average sales")+
  theme_minimal()+
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
#Mean Price
project%>% dplyr::select(`Category Name`,`Product Price`) %>%
  group_by(`Category Name`)%>% 
  summarise(sales = mean(`Product Price`))%>%
  arrange(desc(sales))%>%
ggplot() +geom_bar(aes(x = reorder(`Category Name`,-sales) , y = sales),stat = "identity")+
  theme_minimal()+
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
 
#Payment 
project$Type <- as.factor(project$Type)
project%>% dplyr::select(Type) %>%
  group_by(Type)%>%
  count(n = n())%>%
  ggplot() + 
  geom_bar(aes(x = reorder(Type,-n), y=n ,fill = Type),stat = "identity")+
  labs(x = "Mode of Payment", y = "Number of Users", title = "Preferred Mode of Payment")+
  theme_minimal()
#Payment and region
project$`Order Region` <- as.factor(project$`Order Region`)
project%>% dplyr::select(`Order Region`,Type) %>%
  group_by(`Order Region`,Type)%>% 
  count(n = n())%>%
  ggplot() +
  geom_bar(aes(x = reorder(`Order Region`,-n),y = n, fill = Type),position = position_dodge(width = 0.9),stat = "Identity")+
  labs(x = "Order Region", y = "No. of Orders", title = "Preferred mode of payment in each region")+
  theme_minimal()+
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
#Top 10 Sales
v<-project %>% dplyr::select(`Category Name`,`Product Price`) %>%
  group_by(`Category Name`)%>% 
  summarise(sales = mean(`Product Price`))%>%
  arrange(desc(sales))
v%>% dplyr::top_n(10)%>%
  ggplot() + 
  geom_bar(aes(x = reorder(`Category Name`,-sales), y = sales,fill =  `Category Name`),show.legend = FALSE,stat = "identity")+
  labs(x = "Categories", y = "Average Sales", title = "Top 10 Categories")+
  theme_minimal()+
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
#Top 10 Loss
l<-project%>% dplyr::select(`Benefit per order`,`Category Name`)%>%
  group_by(`Category Name`)%>%
  filter(`Benefit per order` <= '0')%>%
  summarise(count = n())%>%
  arrange(desc(count))
l%>% dplyr::top_n(10)%>%
  ggplot()+
  geom_bar(aes(x = reorder(`Category Name`,-count), y = count, fill = `Category Name`),show.legend = FALSE,stat = "identity")+
  labs(x = "Categories", y = "Losses", title = "Top 10 categories causing loss")+
  theme_minimal()+
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
#Fraud Vs Products
u<-project%>% dplyr::select(`Order Status`,`Category Name`)%>%
  group_by(`Category Name`)%>%
  filter(`Order Status` == "SUSPECTED_FRAUD")%>%
  summarise(count = n())%>%
  arrange(desc(count))
u%>% dplyr::top_n(10)%>%
  ggplot()+
  geom_bar(aes(x = reorder(`Category Name`,-count), y = count, fill = `Category Name`),show.legend = FALSE,stat = "identity")+
  labs(x = "Categories", y = "No. of Fraudulents", title = "Top 10 categories vulnerable to fraudulent")+
  theme_minimal()+
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
#Fraud and Region
m<- group_by(project, `Order Region`) %>% filter(`Order Status` == "SUSPECTED_FRAUD") %>%
  summarise(count = n()) %>%
  arrange(desc(count))
ggplot(data = m) + 
  geom_bar(aes(x = reorder(`Order Region`, -count), y = count,fill = `Order Region`),show.legend = FALSE,stat = "identity")+ 
  geom_label(aes(x = `Order Region`, y = count,label= count), size=4,vjust = -0.1)+
  labs(x = "Order Regions", y = "No. of frauds reported",title = "Order region Vs No. of Fraud cases")+
  theme_minimal()+
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
  
#Delivery Status
 w<-group_by(project,`Delivery Status`)%>%
  summarise(count = n())%>%
  arrange(desc(count))
  ggplot(data = w) + 
  geom_bar(aes( x = reorder(`Delivery Status`,-count),y = count, fill = `Delivery Status`),stat = "identity")+
  labs(x = "Delivery Status", y = "Counts",title = "Delivery status estimation")+
  theme_minimal()
#Delivery status and market
ds<- group_by(project, Market,`Delivery Status`)%>%
  summarise(count = n())%>%
  arrange(desc(count))
ggplot(data = ds) +
  geom_bar(aes(x = reorder(Market,-count), y = count, fill = `Delivery Status`),position = position_dodge(width = 0.9),stat = "identity")+
  labs(x = "Markets", y = "Counts",title = "Delivery status in each market")+
  theme_minimal()
#Late deliveries and Region
dr<-project%>% dplyr::select(`Order Region`,`Delivery Status`)%>%
  group_by(`Order Region`)%>%
  filter(`Delivery Status` == "Late delivery")%>%
  summarise(count = n())%>%
  arrange(desc(count))
dr%>% dplyr::top_n(10)%>%
  ggplot()+
  geom_bar(aes(x = reorder(`Order Region`,-count), y = count, fill = `Order Region`),show.legend = FALSE,stat = "identity")+
  labs(x = "Order Regions", y = "No. of late deliveries", title = "Top 10 regions with late deliveries")+
  theme_minimal()+
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
#Late deliveries and products
dp<-project%>% dplyr::select(`Category Name`,`Delivery Status`)%>%
  group_by(`Category Name`)%>%
  filter(`Delivery Status` == "Late delivery")%>%
  summarise(count = n())%>%
  arrange(desc(count))
dp%>% dplyr::top_n(10)%>%
  ggplot()+
  geom_bar(aes(x = reorder(`Category Name`,-count), y = count, fill = `Category Name`),show.legend = FALSE,stat = "identity")+
  labs(x = "Categories", y = "No. of late deliveries", title = "Top 10 categories with late deliveries")+
  theme_minimal()+
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
#Order status counts
m<- group_by(project, Type,`Order Status`) %>% 
  summarise(count = n()) %>%
  arrange(desc(count))
ggplot(data = m) + 
  geom_bar(aes(x = reorder(`Order Status`, -count), y = count,fill = Type),show.legend = FALSE,stat = "identity")+ 
  labs(x = "Order Status", y = "Counts",title = "Counts of order status")+
  theme_minimal()+
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
#Regression
head(numdata)
model = lm(data = numdata, Sales ~ `Product Price`)
ggplot(data = numdata,aes(y = Sales, x = `Product Price`))+
  geom_point()+
  geom_smooth(method = "lm",formula = y~poly(x,2), se = FALSE)+ xlim(0,500) + ylim(0,500)+
  labs(title = "Regression Plot for Product Price Vs Sales")
summary(model)
#Models
attach(pdata)
head(pdata,1)
new <- data.frame(pdata$Type, pdata$'Order Status', pdata$'Product Price', pdata$'Order Item Total', pdata$'Product Card Id', 
                  pdata$'Late_delivery_risk' ,pdata$'Sales per customer',
                  pdata$'Delivery Status', pdata$'Shipping Mode', 
                  pdata$'Days for shipping (real)',pdata$'Days for shipment (scheduled)')
ggpairs(new)
#Numeric converison
new$pdata.Type <- as.numeric(new$pdata.Type)
new$pdata..Order.Status. <- as.numeric(new$pdata..Order.Status.)
#Redefining
new$pdata..Order.Status.[(new$pdata..Order.Status.)<9]<-0
new$pdata..Order.Status.[(new$pdata..Order.Status.)==9]<-1
#Renaming
data<-data.frame("Type" = new$pdata.Type,
                 "Order_status" = new$pdata..Order.Status.,
                 "Product_price" = new$pdata..Product.Price.,
                 "Order_item_total"= new$pdata..Order.Item.Total.,
                 "Product_card_id"= new$pdata..Product.Card.Id.,
                 "Late_delivery_risk" = new$pdata.Late_delivery_risk,
                 "Sales_per_customer" = new$pdata..Sales.per.customer. ,
                 "Delivery_status") = new$pdata.Delivery.Status , 
                 "Days_for_shipping_real" = new$pdata.Days.for.shipping..(real). ,
                  "Days_for_shipment_scheduled" = new$.Days.for.shipment..(scheduled). ,
                  "Shipping_mode" = new$Shipping.Mode. )
#Test and Train split
set.seed(1234)
split<- sample(2,nrow(data),replace = TRUE, prob = c(0.7,0.3))
train <- data[split ==1,]
test <- data[split==2,]
#Modles
modelld = rep(0, 4)
modelld[1] <- "Delivery_status ~ Days_for_shipping_real"
modelld[2] <- "Delivery_status ~ Days_for_shipping_real + Days_for_shipment_scheduled "
modelld[3] <- "Delivery_Status ~ Days_for_shipping_real + Days_for_shipment_scheduled + Late_delivery_risk "
modelld[4] <- "Delivery_status ~ Days_for_shipping_real + Days_for_shipment_scheduled + Late_delivery_risk + Shipping_mode"
modelfd = rep(0, 4)
modelfd[1] <- "Order_status ~ Order_item_total"
modelfd[2] <- "Order_status ~ Order_item_total + Sales_per_customer "
modelfd[3] <- "Order_status ~ Order_item_total + Sales_per_customer + Product_price "
modelfd[4] <- "Order_status ~ Order_item_total + Sales_per_customer + Product_price + Product_card_id "
#Random Forest Late Delivery 
total.rfld = rep(0, 4)
i=1
for(i in 1:4)
{
RFLD <- train(eval(parse(text=paste(modelld[i]))), data=train, method='rf')
pred.rfld <- predict(RFLD, test)
cm= table(pred.rfld,as.factor(test$Delivery_status))
error.rfld= 1- (cm[1,1] + cm[2,2]) / (cm[1,1] + cm[2,2] + cm[1,2] + cm[2,1])
total.rfld[i]=total.rfld[i]+error.rfld
}
total.rfld
total.rfld=as.data.frame(total.rfld)
head(total.rfld,1)
rfld2<-total.rfld
rfld1=c(1,2,3,4)
df.rfld<-data.frame(rfld1,rfld2)
ggplot(df.rfld,aes(x=rfld1, y=total.rfld)) + 
  geom_line(position=position_dodge(0.9),size=1) +
  geom_point(position=position_dodge(0.9))+labs(x="Models",y="Error Rate",title ="Error Rate for Random forest - Late delivery prediction") +
  theme_minimal()
#Cross-validation RFLD                                                 
folds = createFolds(train$Delivery_status, k = 5)
ld.rf = lapply(folds, function(x) 
  {
  total.error = rep(0,4)
  avg.error = rep(0,4)
  i=1
  for(i in 1:4){
    train.fold = train[-x,]
    test.fold = train[x,]
    rfcv <- train(eval(parse(text=paste(modelld[i]))), data=train.fold, method='rf')
    y.predcv = predict(rfcv, newdata = test.fold[-3])
    cm = table(test_fold[,3], y.predcv)
    accuracy = (cm[1,1] + cm[2,2]) / (cm[1,1] + cm[2,2] + cm[1,2] + cm[2,1])
    error.rfcv= 1- (cm[1,1] + cm[2,2]) / (cm[1,1] + cm[2,2] + cm[1,2] + cm[2,1])
    total.error[i]= total.error[i]+error.rfcv
  }
  return(total.error)
})
ld.rf1=c(1,2,3,4)
ld.rf
ld.rf=as.data.frame(ld.rf)
ld.rf2=data.frame(ld.rf2 = rowMeans(ld.rf[,-1]))
ldcv<-ld.rf %>% mutate(STD = apply(.[(1:4)],1,sd))
ld.rf3<-ldcv$STD
ld.rf3
df.ldcv<-data.frame(ld.rf1,ld.rf2,ld.rf3)
ggplot(df.ldcv,aes(x=ld.rf1, y=ld.rf2)) + 
  geom_errorbar(aes(ymin=ld.rf2 - ld.rf3, ymax=ld.rf2 + ld.rf3), width=0.9, position=position_dodge(0.9),size=1) +
  geom_line(position=position_dodge(0.9),size=1) +
  geom_point(position=position_dodge(0.9))+labs(x="Models", y="Mean Error with 5 folds of CV",title ="One standard error for Random Forest - Late delivery prediction") +
  theme_minimal()
#Decision Tree Late Delivery
total.dtld = rep(0, 4)
i=1
for(i in 1:4)
{
  DTLD <- ctree(eval(parse(text=paste(modelld[i]))), data=train)
  pred.dtld <- predict(DTLD, test)
  cm= table(pred.dtld,as.factor(test$Delivery_status))
  error.dtld= 1- (cm[1,1] + cm[2,2]) / (cm[1,1] + cm[2,2] + cm[1,2] + cm[2,1])
  total.dtld[i]=total.dtld[i]+error.dtld
}
total.dtld
total.dtld=as.data.frame(total.dtld)
head(total.dtld,1)
dtld2<-total.dtld
dtld1=c(1,2,3,4)
df.dtld<-data.frame(dtld1,dtld2)
ggplot(df.dtld,aes(x=dtld1, y=total.dtld)) + 
  geom_line(position=position_dodge(0.9),size=1) +
  geom_point(position=position_dodge(0.9))+labs(x="Models",y="Error Rate",title ="Error Rate for Decision Tree - Late delivery prediction") +
  theme_minimal()
#Cross-validation DTLD                                                 
folds = createFolds(train$Delivery_status, k = 5)
dt.rf = lapply(folds, function(x) 
{
  total.error = rep(0,4)
  avg.error = rep(0,4)
  i=1
  for(i in 1:4){
    train.fold = train[-x,]
    test.fold = train[x,]
    dtcv <- ctree(eval(parse(text=paste(modelld[i]))), data=train.fold)
    y.predcv = predict(dtcv, newdata = test.fold[-3])
    cm = table(test_fold[,3], y.predcv)
    accuracy = (cm[1,1] + cm[2,2]) / (cm[1,1] + cm[2,2] + cm[1,2] + cm[2,1])
    error.dtcv= 1- (cm[1,1] + cm[2,2]) / (cm[1,1] + cm[2,2] + cm[1,2] + cm[2,1])
    total.error[i]= total.error[i]+error.dtcv
  }
  return(total.error)
})
ld.dt1=c(1,2,3,4)
ld.dt
ld.dt=as.data.frame(ld.dt)
ld.dt2=data.frame(ld.dt2 = rowMeans(ld.dt[,-1]))
ldcv<-ld.dt %>% mutate(STD = apply(.[(1:4)],1,sd))
ld.dt3<-ldcv$STD
ld.dt3
df.ldcv<-data.frame(ld.dt1,ld.dt2,ld.dt3)
ggplot(df.ldcv,aes(x=ld.dt1, y=ld.dt2)) + 
  geom_errorbar(aes(ymin=ld.dt2 - ld.dt3, ymax=ld.dt2 + ld.dt3), width=0.9, position=position_dodge(0.9),size=1) +
  geom_line(position=position_dodge(0.9),size=1) +
  geom_point(position=position_dodge(0.9))+labs(x="Models", y="Mean Error with 5 folds of CV",title ="One standard error for Decision Tree - Late delivery prediction") +
  theme_minimal()
#Random Forest Fraud Detection
total.rffd = rep(0, 4)
i=1
for(i in 1:4)
{
  RFFD <- train(eval(parse(text=paste(modelfd[i]))), data=train, method='rf')
  pred.rffd <- predict(RFFD, test)
  cm= table(pred.rffd,as.factor(test$Order_status))
  error.rffd= 1- (cm[1,1] + cm[2,2]) / (cm[1,1] + cm[2,2] + cm[1,2] + cm[2,1])
  total.rffd[i]=total.rffd[i]+error.rffd
}
total.rffd
total.rffd=as.data.frame(total.rffd)
head(total.rffd,1)
rffd2<-total.rffd
rffd1=c(1,2,3,4)
df.rffd<-data.frame(rffd1,rffd2)
ggplot(df.rffd,aes(x=rffd1, y=total.rffd)) + 
  geom_line(position=position_dodge(0.9),size=1) +
  geom_point(position=position_dodge(0.9))+labs(x="Models",y="Error Rate",title ="Error Rate for Random forest - Fraud prediction") +
  theme_minimal()
#Cross-validation RFFD                                                 
folds = createFolds(train$Order_status, k = 5)
fd.rf = lapply(folds, function(x) 
{
  total.error = rep(0,4)
  avg.error = rep(0,4)
  i=1
  for(i in 1:4){
    train.fold = train[-x,]
    test.fold = train[x,]
    rfcv <- train(eval(parse(text=paste(modelfd[i]))), data=train.fold, method='rf')
    y.predcv = predict(rfcv, newdata = test.fold[-3])
    cm = table(test_fold[,3], y.predcv)
    accuracy = (cm[1,1] + cm[2,2]) / (cm[1,1] + cm[2,2] + cm[1,2] + cm[2,1])
    error.rfcv= 1- (cm[1,1] + cm[2,2]) / (cm[1,1] + cm[2,2] + cm[1,2] + cm[2,1])
    total.error[i]= total.error[i]+error.rfcv
  }
  return(total.error)
})
fd.rf1=c(1,2,3,4)
fd.rf
fd.rf=as.data.frame(fd.rf)
fd.rf2=data.frame(fd.rf2 = rowMeans(fd.rf[,-1]))
fdcv<-fd.rf %>% mutate(STD = apply(.[(1:4)],1,sd))
fd.rf3<-fdcv$STD
fd.rf3
df.fdcv<-data.frame(fd.rf1,fd.rf2,fd.rf3)
ggplot(df.fdcv,aes(x=fd.rf1, y=fd.rf2)) + 
  geom_errorbar(aes(ymin=fd.rf2 - fd.rf3, ymax=fd.rf2 + fd.rf3), width=0.9, position=position_dodge(0.9),size=1) +
  geom_line(position=position_dodge(0.9),size=1) +
  geom_point(position=position_dodge(0.9))+labs(x="Models", y="Mean Error with 5 folds of CV",title ="One standard error for Random Forest - Fraud prediction") +
  theme_minimal()
#End of code

Скриншоты набора данных: