Целью этого проекта был анализ данных бразильского интернет-магазина Olist с целью получения ответов на вопросы бизнеса. Используемые здесь данные были получены от Kaggle.

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

Что касается этого проекта, нам нужно было ответить на 4 бизнес-вопроса, проанализировав записи заказов Olist, в том числе:

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

Бизнес-процесс

Olist объединяет малые предприятия со всей Бразилии, эти продавцы могут продавать свою продукцию через магазин Olist и доставлять ее напрямую клиентам, используя партнеров Olist по логистике. После того, как покупатель покупает товар в Olist Store, продавец получает уведомление о необходимости выполнить этот заказ. Как только клиент получает продукт или приближается предполагаемая дата доставки, клиент получает по электронной почте опрос об удовлетворенности, в котором он может сделать заметку об опыте покупки и написать некоторые комментарии.

Глядя на базу данных, были таблицы, см. Ниже диаграмму отношений сущностей.

Объединение данных

#Merging Datasets
#Orders
orders=orders.merge(order_payments,on='order_id',how='left')
orders=orders.merge(order_items,on='order_id',how='outer')
orders=orders.merge(customers,on='customer_id',how='outer')
orders=orders.merge(sellers,on='seller_id',how='outer')
#products
products=products.merge(product_category,on='product_category_name',how='outer')
#Merge the two datasets into one
orders=orders.merge(products,on='product_id',how = 'left')
#Percentage in Missing values
round(orders.isnull().sum()/orders.notnull().sum()*100,2)
order_id                         0.00
customer_id                      0.00
order_status                     0.00
order_purchase_timestamp         0.00
order_approved_at                0.15
order_delivered_carrier_date     1.78
order_delivered_customer_date    2.95
order_estimated_delivery_date    0.00
payment_sequential               0.00
payment_type                     0.00
payment_installments             0.00
payment_value                    0.00
order_item_id                    0.71
product_id                       0.71
seller_id                        0.71
shipping_limit_date              0.71
price                            0.71
freight_value                    0.71
customer_unique_id               0.00
customer_zip_code_prefix         0.00
customer_city                    0.00
customer_state                   0.00
seller_zip_code_prefix           0.71
seller_city                      0.71
seller_state                     0.71
product_category_name            2.18
product_name_lenght              2.18
product_description_lenght       2.18
product_photos_qty               2.18
product_weight_g                 0.72
product_length_cm                0.72
product_height_cm                0.72
product_width_cm                 0.72
product_category_name_english    2.20

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

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

Очистка данных

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

Обработка пропущенных значений.

Когда мы смотрим на наши два набора данных (продукты и заказы), мы обнаруживаем, что процент пропущенных значений минимален (наиболее 2,18%), что в нашем случае для категориальных значений мы заменим нулевые значения режимом столбца (наиболее часто имя), а что касается числовых значений, мы будем использовать среднее значение столбца.

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

#Replacing missing values within numerical column values from orders table
def nan_most_frequent_value(DataFrame,ColName):
    #using .mean() - gives the mean value of the column 
    mean_value=DataFrame[ColName].mean()
    #Replace the nan values with the mean value 
    DataFrame[ColName]=DataFrame[ColName]
    DataFrame[ColName].fillna(mean_value,inplace=True)
    
for Columns in ['payment_sequential','payment_installments','payment_value','price','freight_value',
                'seller_zip_code_prefix','product_name_lenght','product_description_lenght','product_photos_qty','product_weight_g',
                'product_length_cm','product_height_cm','product_width_cm']:
    nan_most_frequent_value(orders,Columns)
def nan_most_frequent_category(DataFrame,ColName):
    #using .mode()[0] - gives first category name
    most_frequent_category = DataFrame[ColName].mode()[0]
    #Replace the nan values with most occured category
    DataFrame[ColName]=DataFrame[ColName]
    DataFrame[ColName].fillna(most_frequent_category,inplace=True)
    
for Columns in ['product_category_name','product_category_name_english','payment_type','seller_city','seller_state']:
    nan_most_frequent_category(orders,Columns)
orders.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 117604 entries, 0 to 118433
Data columns (total 34 columns):

Разработка функций

Далее мы разобьем наш набор данных на создание новых столбцов со значениями только даты и времени.

#Viewing our dataset information 
orders_cleaned.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 117604 entries, 0 to 117603
Data columns (total 62 columns):

После обработки пропущенных значений и разработки функций мы получаем 62 столбца и 117604 записи.

Исследовательский анализ данных и визуализация

Общее количество заказов за год

orders_cleaned['order_purchase_year'].value_counts()
2018    63677
2017    53539
2016      388
Name: order_purchase_year, dtype: int64

Глядя на все заказы, приобретенные в интернет-магазине, в 2018 году было зарегистрировано наибольшее количество заказов, составляющее 54,1% всех заказов, за ним следовали 45,5% в 2017 году и, наконец, 0,3% в 2016 году.

Упорядочивать покупки по их статусу

Сравнивая заказы за разные годы, мы обнаруживаем, что большинство доставленных заказов в 2018 году превышало 60 000, а в 2017 году — чуть выше 50 000, в то время как наименьший статус заказа был одобрен.

1. Какой месяц был лучшим для продаж? Сколько было заработано в этом месяце?

#The year and month by total order revenue
orders_delivered=orders_cleaned[orders_cleaned['order_status']=="delivered"]
orders_delivered.groupby(['order_purchase_year','order_purchase_month'])['total_order_revenue'].sum().sort_values(ascending = False)
order_purchase_year  order_purchase_month
2017                 11                      1194873.72
2018                 4                       1171614.31
                     5                       1170957.30
                     3                       1168529.57
                     1                       1120930.48
                     7                       1064092.09
                     6                       1063999.32
                     8                       1020236.21
                     2                       1005497.71
2017                 12                       874067.75
                     10                       785306.52
                     9                        743524.69
                     8                        675267.54
                     5                        610553.02
                     7                        606902.69
                     6                        513583.24
                     3                        440064.65
                     4                        413855.41
                     2                        285260.50
                     1                        136749.42
2016                 10                        48133.30
                     9                           143.46
                     12                           19.62
Name: total_order_revenue, dtype: float64

Глядя на доход, мы обнаруживаем, что в 2016 году в октябре был самый высокий доход - 48 133. Когда дело дошло до 2017 года, в ноябре был зарегистрирован самый высокий доход в размере 1 194 738,89, в то время как в 2018 году в апреле был зафиксирован самый высокий доход в размере 1 171 614,31, а в мае доход составил 1 170 957,30.

Ноябрь 2017 года оказался месяцем с самым высоким доходом от розничных онлайн-заказов.

2. В каком городе было больше всего продаж?

#Which city had the most sales based on sucessful order delivery
orders_delivered=orders_cleaned[orders_cleaned['order_status']=="delivered"]
round(orders_delivered['customer_city'].value_counts()[:10]/orders_delivered['customer_city'].value_counts().sum()*100,2)
sao paulo                15.79
rio de janeiro            6.91
belo horizonte            2.77
brasilia                  2.09
curitiba                  1.55
campinas                  1.48
porto alegre              1.40
salvador                  1.28
guarulhos                 1.19
sao bernardo do campo     0.95
Name: customer_city, dtype: float64

Глядя на 10 лучших городов с самыми высокими продажами, можно сказать, что клиент успешно доставил свой заказ. Сан-Паулу лидировал с 18 163 всеми покупками заказов, за ним следует Рио-де-Жанейро с 7950, за ним следует Белу-Оризонти с 3188, Бразилия с 2405, Куритиба. в 1785 г., Кампинас в 1707 г., Порту-Алегри в 1615 г., Сальвадор в 1473 г., Гуарульюс в 1364 г. и Сан-Бернардо-ду-Кампо в 1093 г.

Looking at the city's population as per their order purchase (**Hint for Total Addressable Market**)  
Name                   2022 Population 
Sao Paulo               10,021,295
Rio de Janeiro            6,023,699
Salvador                2,711,840
Belo Horizonte            2,373,224
Brasilia                2,207,718
Curitiba                1,718,421
Guarulhos                1,169,577
Campinas                1,031,554
Sao Bernardo do Campo    743,372

Источник: https://worldpopulationreview.com/countries/cities/brazil

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

orders_delivered['order_purchase_time'].value_counts()[:10]
20:26:31    64
14:56:45    40
12:05:10    27
14:55:43    27
16:34:27    27
23:39:26    25
12:28:58    24
12:00:04    23
16:24:51    23
15:30:41    23
Name: order_purchase_time, dtype: int64
             18:19:25             9.09                   20

Чтобы узнать лучшее время для рекламы, нам нужно выяснить это на основе успешно доставленных заказов. То есть вечером в 20:26, следующее лучшее время - днем ​​в 14:56 и в 12:05, 16:34 и 14:55, что составляет 3 лучших времени для рекламы на сайте.

orders_delivered.groupby(['order_purchase_dow','order_purchase_time']['total_order_revenue'].value_counts().sort_values((ascending=False)[:10]
order_purchase_dow  order_purchase_time  total_order_revenue
Tuesday             20:26:31             36.20                  42
Saturday            14:56:45             102.87                 38
Wednesday           12:05:10             62.68                  26
                    16:34:27             439.72                 24
Saturday            12:28:58             37.05                  24
Thursday            23:39:26             212.70                 24
Friday              12:00:04             40.85                  22
Tuesday             00:22:18             36.94                  21
                    20:26:31             88.92                  21
Sunday
orders_delivered.groupby(['order_purchase_dow','order_purchase_time','product_category_name_english'])['total_order_revenue'].value_counts().sort_values(ascending=False)[:10]
order_purchase_dow  order_purchase_time  product_category_name_english  total_order_revenue
Tuesday             20:26:31             bed_bath_table                 36.20                  42
Saturday            14:56:45             office_furniture               102.87                 38
Wednesday           12:05:10             bed_bath_table                 62.68                  26
Saturday            12:28:58             computers_accessories          37.05                  24
Thursday            23:39:26             garden_tools                   212.70                 24
Wednesday           16:34:27             agro_industry_and_commerce     439.72                 24
Friday              12:00:04             electronics                    40.85                  22
Tuesday             20:26:31             housewares                     88.92                  21
                    00:22:18             sports_leisure                 36.94                  21
Thursday            15:30:41             computers_accessories          110.12                 20
Name: total_order_revenue, dtype: int64

Поскольку мы знаем лучшее время и день для следующей рекламы, мы определяем категорию продукта, которую лучше всего показывать в нашей рекламе. Лучший день и время для рекламы bed_bath_table на нашем веб-сайте — вечер вторника в 20:26, следующее лучшее время — вторник днем ​​в 12:05.

Когда дело доходит до офисной_мебели, лучший день и время — 14:56 субботы. Когда дело доходит до компьютеров_аксессуаров, лучшее время для их рекламы — в субботу днем ​​в 12:28 и в четверг днем ​​в 15:30. Садовые инструменты и электронику лучше всего рекламировать в четверг и пятницу в 23:39,12: 00 часов соответственно.

4. Какие продукты продаются больше всего? Как вы думаете, почему он продается больше всего?

#What products sold the most?Why do you think it sold the most?
orders_delivered=orders_cleaned[orders_cleaned['order_status']=="delivered"]
orders_delivered['product_category_name_english'].value_counts()[:10]
bed_bath_table           13301
health_beauty             9762
sports_leisure            8733
furniture_decor           8557
computers_accessories     7898
housewares                7172
watches_gifts             6065
telephony                 4603
garden_tools              4464
auto                      4284
Name: product_category_name_english, dtype: int64

При просмотре 10 самых покупаемых продуктов мы обнаруживаем, что категория bed_bath_table лидирует с общим количеством приобретенных продуктов 13301, за которыми следуют продукты категории Health_beauty с общим количеством 9762, sport_leisure было продано 8733 продуктов, Furniture_decor с 8557, компьютеры_аксессуары с 7898. ,предметы домашнего обихода на 7172,часы_подарки на 6065,телефония на 4603,садовые_инструменты имели в общей сложности 4464 проданных товара и автомобильную категорию на 4284 соответственно.

Обзор:

  1. Глядя на выручку, 2018 год зафиксировал самые высокие продажи с доходом более 8 миллионов, за ним следуют 2017 год с продажами 7,2 миллиона и 2016 год с наименьшим объемом продаж 48 296,38 (продажи, зарегистрированные с сентября, не отражают полный год). Наибольший доход приходит во 2-м квартале года, за которым следуют 1-й и 3-й кварталы.
  2. Большинство заказов поступило из города Сан-Паулу, который является самым густонаселенным в Бразилии (10 миллионов человек). Это показывает, что чем больше населен город, тем больше заказов, возможно, здесь можно установить больше точек доставки и даже искать больше рынков в других городах.
  3. Рекламу целесообразнее размещать днем ​​и вечером, так как на сайт больше посещаемости.
  4. Категория продукта «Кровать для ванной» является наиболее продаваемым продуктом, особенно.

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

Комментарии, предложения очень приветствуются.