Skip to content
Gallery
CV Evelina Muratova
Share
Explore
Портфолио

icon picker
Python Data Analyst

Кейс. Анализ факторов влияния на один из ключевых показателей (своевременность доставки товаров) транспортной компании с применением методов ML.
Цель: Выявить взаимосвязи факторов, влияющих на своевременность доставки товаров. Построить целевую оптимизированную модель данных, которая будет заложена в основу оптимизации процессов.
Задачи: 1. Построение визуализации основных кросс-факторов с целью упрощения их интерпретации и визуального отражения закономерностей. 2. Решение задачи классификации для показателей транспортного процесса с целью определения влияющих факторов.
Построение описательной статистики
image.png
Графическая интерпретация соотношения значений по каждому признаку:
image.png


1.Очевидно, что задержки с доставкой товаров имеются: почти 60% от общего объема.
2.Соотношение способов доставки. Чаще всего использовалась морская перевозка 68% отправок. Этот способ доставки так же имеет наименьший показатель своевременности, чем авиа или доставки наземным транспортом. Очевидно, что по большей части это связано в целом со спецификой морских перевозок. Необходимо исследовать процессы и данные отдельно по морскому сервису компании.
3.Покупательская аудитория распределена:
1)Производители 48%
2)Торговые компании и предприниматели 44%
3)Посредники 8%
5.Склады F и D обрабатывают более 60% отгрузок.
8.Клиентская аудитория относительно лояльна к низкокачественному сервису: около 40% совершают заказы 4 и больше раз, около 36% покупают услуги трижды. Необходимо проанализировать NPS, отток/приток клиентов.

image.png
image.png

image.png
Из трех категорий товаров, определенных заказчиком, большее количество перевозок в категории средней важности. Из 7000 отправок в этой категории почти 3000 доставлены с опозданием. Наиболее важные заказы доставляются с задержкой еще чаще, чем менее важные – почти 50%. Около 70% заказов категории наименьшей важности доставляются вовремя.
В категории заказов среднего уровня значимости на морские перевозки – самый низкокачественный сервис - приходится почти 80% заказов

image.png
Распределение целевого показателя по пяти складским блокам. Прямая взаимосвязь с распределением общего объема отгрузок по складам.
image.png
Корреляция между количеством обращений в службу поддержки и своевременностью доставки.
По заказам с нарушением сроков обычно делается от 3 до 5 звонков. Служба поддержки может быть перегружена, как следствие – дополнительные операционные расходы.

Общая корреляционная зависимость между признаками
image.png

Судя по тепловой матрице, наблюдается взаимосвязь:
1)чем дороже товар, тем беспокойнее клиент => низкий уровень NPS.
2)чем больше задержка с доставкой, тем выше скидка => снижение операционной прибыли или дополнительные издержки.
Таким образом, при нарушении сроков доставки компания не только теряет репутацию на рынке, но и терпит дополнительные убытки, предоставляя скидки в качестве компенсации за некачественный сервис.
При доставке товаров с высокой стоимостью уровень риска потери клиента значительно выше.
Чтобы выяснить, каким образом низкий уровень своевременности доставки влияет на отток клиентов и финансовые показатели компании, необходимо запросить дополнительные данные у заказчика.



Код Python для проведенного анализа (с комментариями).
# -*- coding: utf-8 -*-
Created on Thu Apr 27 15:59:31 2023
@author: Muratova
# Визуализаторы
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_palette('PuBuGn') #выбираем цветовую схему
sns.set_style('whitegrid') #и фон
# Кодирование и нормализация данных
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import VotingClassifier
from sklearn.svm import SVC
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import LabelEncoder
import pickle
# Оценочные метрики
from sklearn.metrics import accuracy_score, f1_score, recall_score, precision_score, confusion_matrix
from sklearn.metrics import accuracy_score, recall_score, precision_score, f1_score

# Загрузка данных
df = pd.read_csv('Train.csv', sep = ',')
pd.set_option('display.max_rows', 20)
print(df)
# print(df.Type.unique())
print(df['Reached.on.Time_Y.N'].value_counts())
# Обработка данных
print(df.columns) # наименов-я столбцов
print(df.shape) # увидим кол-во строк и столбцов датасета
print(df.info()) # выводим информацию о представленных данных
# смотрим пропуски
print(df.isnull().sum()) # метод isnull проверяет все столбцы на наличие и кол-во пропусков в них
print(df.duplicated().sum())# смотрим дубликаты
print(df.describe())# смотрим статистические данные
# и кол-во уникальных значений для каждой переменной
print(df.nunique(axis=0))
# посмотрим отдельно на целевую переменную
risk_counts = df['Reached.on.Time_Y.N'].value_counts()
plt.pie(risk_counts.values, labels=risk_counts.index, autopct='%1.1f%%')
plt.title('Соблюдение срков доставки')
plt.show()
# смотрим корреляционную зависимость между числовыми признаками
mask = np.triu(np.ones_like(df.corr().round(2), dtype=bool))
f,ax=plt.subplots(figsize = (10,5))
plt.title('Матрица корелляции числовых признаков')
sns.heatmap(df.corr().round(2), mask = mask, annot=True, linewidth=0.5, cmap='PuBuGn')
# plt.show()
# выведем в графике соотношение всех значений по каждому признаку
columns = ['Warehouse_block', 'Mode_of_Shipment', 'Customer_care_calls', 'Customer_rating',
'Prior_purchases', 'Product_importance', 'Gender', 'Reached.on.Time_Y.N']
plt.figure(figsize=(15,40))
for i, col in enumerate(columns):
axes = plt.subplot(8, 3, i + 1)
df[col].value_counts().plot.pie(autopct='%.2f', textprops={'fontsize':18}, cmap='PuBuGn')
plt.title(col, fontsize=18)
plt.tight_layout()
plt.show()
# Очевидно, что задержки с доставкой товаров имеются: почти 60%
# При этом покупатели относительно лояльны к такому сервису: около 35% совершают покупки 4
# и больше раз, около 35% покупают трижды.
# уберем признаки, не имеющие значения в контексте задачи
df.drop(['ID', 'Gender'], axis=1, inplace=True)
print(df.info()) # выводим информацию о представленных данных
print(df.describe())# смотрим статистические данные
# смотрим на соотношение способов доставки. Чаще всего использовалась морская перевозка - >7000 отправок.
# этот способ доставки так же имеет наименьший показатель своевременности, чем авиа или доставки наземным транспортом.
# Можно предположить, что это связано в целом со спецификой морских перевозок: большими расстояниями и
# более длительными сроками, количеством звеньев в транспортной цепи.
grouped = df.groupby(['Mode_of_Shipment', 'Reached.on.Time_Y.N']).size().unstack()
grouped.plot(kind='bar', stacked=True)
plt.xlabel('Способ доставки')
plt.ylabel('Количество')
plt.title('Количество отправок и соблюдение срков доставки по видам транспорта')
# plt.show()
# любопытно, что наиболее важные категории товаров, определенные заказчиком по неизвестному нам признаку
# доставляются чаще с задержкой, чем менее важные
plt.figure(figsize = (12, 6))
sns.countplot(x = 'Product_importance', hue = 'Reached.on.Time_Y.N', data = df, palette='PuBuGn')
plt.show()
# корреляция между количеством обращений в службу поддержки и своевременностью доставки.
# Очевидно, что по заказам с нарушением сроков обычно делается от 3 до 5 звонков. Загруженная служба
# поддержки - это тоже операционные расходы
plt.figure(figsize = (12, 6))
sns.countplot(x = 'Customer_care_calls', hue = 'Reached.on.Time_Y.N', data = df, palette='PuBuGn')
plt.xlabel('Звонки')
plt.ylabel('Количество')
plt.title('Количество обращений в службу поддержки. 1 - заказы с задержкой')
plt.show()
# взаимосвязь двух численных признаков
sns.jointplot(x='Warehouse_block', y='Reached.on.Time_Y.N', data=df, kind='scatter');
plt.title('Корреляция распределительных центров и задержек по доставке')
plt.show()
Want to print your doc?
This is not the way.
Try clicking the ⋯ next to your doc name or using a keyboard shortcut (
CtrlP
) instead.