Целью этого проекта был анализ данных бразильского интернет-магазина Olist с целью получения ответов на вопросы бизнеса. Используемые здесь данные были получены от Kaggle.
Когда дело доходит до аналитиков данных или ученых, их роли в основном направлены на то, чтобы помочь бизнесу разобраться в своих данных и помочь либо в увеличении доходов (новые возможности роста), ни в снижении потерь (эффективности), ни в обнаружении мошенничества, среди прочего.
Что касается этого проекта, нам нужно было ответить на 4 бизнес-вопроса, проанализировав записи заказов Olist, в том числе:
- Какой месяц был лучшим для продаж? Сколько было заработано в этом месяце?
- В каком городе было больше всего продаж?
- Порекомендуйте наиболее подходящее время для показа рекламы, чтобы максимизировать вероятность того, что клиенты купят продукты?
- Какие товары продаются больше всего? Как вы думаете, почему он продается больше всего?
Бизнес-процесс
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 соответственно.
Обзор:
- Глядя на выручку, 2018 год зафиксировал самые высокие продажи с доходом более 8 миллионов, за ним следуют 2017 год с продажами 7,2 миллиона и 2016 год с наименьшим объемом продаж 48 296,38 (продажи, зарегистрированные с сентября, не отражают полный год). Наибольший доход приходит во 2-м квартале года, за которым следуют 1-й и 3-й кварталы.
- Большинство заказов поступило из города Сан-Паулу, который является самым густонаселенным в Бразилии (10 миллионов человек). Это показывает, что чем больше населен город, тем больше заказов, возможно, здесь можно установить больше точек доставки и даже искать больше рынков в других городах.
- Рекламу целесообразнее размещать днем и вечером, так как на сайт больше посещаемости.
- Категория продукта «Кровать для ванной» является наиболее продаваемым продуктом, особенно.
Далее мы будем использовать SQL для исследовательского анализа данных и Tableau для визуализации в качестве продолжения этого, найдите его здесь.
Комментарии, предложения очень приветствуются.