Original size 1240x1750

Анализ данных о продажах шоколада

PROTECT STATUS: not protected
The project is taking part in the competition

ОПИСАНИЕ

Меня интересует кондитерский рынок, в частности сегмент шоколада: какие бренды и виды продукции лидируют, какие факторы влияют на потребительский спрос, как меняются вкусы и тренды с течением времени. Крупнейшие розничные сети и маркетинговые агентства регулярно публикуют агрегированные данные о продажах. На платформе Kaggle я нашла датасет, содержащий детализированную информацию о продажах шоколадной продукции за последние пять лет. Мой анализ был сосредоточен на выявлении закономерностей и драйверов спроса. Мне было интересно ответить на несколько вопросов. Как содержание какао коррелирует с ценовым сегментом и объемом продаж? Влияет ли наличие конкретных начинок на популярность продукта в разных регионах? Каковы явные сезонные пики спроса (например, перед праздниками)? Прослеживается ли тренд на увеличение доли премиального или органического шоколада?

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

Подготовка датасета и настройка оформления

import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from matplotlib import rcParams import matplotlib.font_manager as fm

Chernobyl Chemical Radiation Analysis & EDA

font_path = '/content/ofont.ru_Spletnik.ttf' font_prop = fm.FontProperties (fname=font_path) rcParams['font.family'] = font_prop.get_name ()

Запросом в Chat GPT была сгенерирована палитра для визуализации, которая бы олицетворяла шоколад

chocolate_palette = ['

6B4423', '

8B4513', '

A0522D', '

D2691E', '#F4A460'] sns.set_palette (sns.color_palette (chocolate_palette)) sns.set_style («dark») plt.rcParams.update ({ 'axes.facecolor': '#F5DEB3', 'figure.facecolor': '#F5DEB3', 'axes.edgecolor': '#6B4423', 'xtick.color': '#8B4513', 'ytick.color': '#8B4513', 'axes.labelcolor': '#6B4423', 'text.color': '#6B4423', 'axes.titlecolor': '#6B4423', 'legend.labelcolor': '#6B4423', 'grid.color': '#D2B48C', 'grid.alpha': 0.5 })

Original size 640x174

Топ-5 стран по выручке от продаж шоколада, топ-10 продуктов по продажам, лучшие продавцы по обьему продаж

Original size 1790x590

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

import pandas as pd import matplotlib.pyplot as plt import seaborn as sns

df = pd.read_csv ('Chocolate Sales.csv') df['Amount'] = df['Amount'].str.replace ('$', '').str.replace (', ', '').astype (float) df['Month'] = pd.to_datetime (df['Date'], format='%d-%b-%y').dt.month

fig, axes = plt.subplots (1, 3, figsize=(18, 6))

top_countries = df.groupby ('Country')['Amount'].sum ().nlargest (5) axes[0].bar (top_countries.index, top_countries.values, color='#8B4513') axes[0].set_title ('Топ-5 стран по выручке') axes[0].set_ylabel ('Выручка ($)') axes[0].tick_params (axis='x', rotation=45)

top_products = df.groupby ('Product')['Amount'].sum ().nlargest (10) axes[1].barh (top_products.index, top_products.values, color='#D2691E') axes[1].set_title ('Топ-10 продуктов по продажам') axes[1].set_xlabel ('Выручка ($)')

top_sellers = df.groupby ('Sales Person')['Amount'].sum ().nlargest (10) axes[2].bar (range (len (top_sellers)), top_sellers.values, color='#A0522D') axes[2].set_title ('Лучшие продавцы по объёму продаж') axes[2].set_ylabel ('Выручка ($)') axes[2].set_xticks (range (len (top_sellers))) axes[2].set_xticklabels (top_sellers.index, rotation=90)

plt.tight_layout () plt.show ()

Динамика ежемесячных продаж

Original size 1189x590

import pandas as pd import matplotlib.pyplot as plt

df = pd.read_csv ('Chocolate Sales.csv') df['Amount'] = df['Amount'].str.replace ('$', '').str.replace (', ', '').astype (float) df['Date'] = pd.to_datetime (df['Date'], format='%d-%b-%y') df['Month'] = df['Date'].dt.month df['Month_Name'] = df['Date'].dt.strftime ('%b')

monthly_sales = df.groupby (['Month', 'Month_Name'])['Amount'].sum ().reset_index () monthly_sales = monthly_sales.sort_values ('Month')

plt.figure (figsize=(12, 6)) plt.plot (monthly_sales['Month_Name'], monthly_sales['Amount'], marker='o', linewidth=2, color='#8B4513', markersize=8) plt.fill_between (monthly_sales['Month_Name'], monthly_sales['Amount'], alpha=0.3, color='#D2691E') plt.title ('Динамика ежемесячных продаж шоколада', fontsize=14) plt.xlabel ('Месяц') plt.ylabel ('Выручка ($)') plt.grid (True, alpha=0.3) plt.tight_layout () plt.show ()

Распределение спроса по типам шоколада

Original size 989x590

import pandas as pd import matplotlib.pyplot as plt

df = pd.read_csv ('Chocolate Sales.csv') df['Amount'] = df['Amount'].str.replace ('$', '').str.replace (', ', '').astype (float)

chocolate_types = { 'Dark': ['Dark', '85%', '70%', '50%', '99%'], 'Milk': ['Milk', 'White'], 'Filled': ['Peanut', 'Caramel', 'Orange', 'Raspberry', 'Mint', 'Almond', 'Honey', 'Organic'], 'Other': ['Spicy', 'Baker', 'Drinking', 'Smooth', 'Eclairs', 'After'] }

def categorize_chocolate (product): product_lower = product.lower () for type_key, keywords in chocolate_types.items (): for keyword in keywords: if keyword.lower () in product_lower: return type_key return 'Other'

df['Chocolate_Type'] = df['Product'].apply (categorize_chocolate) type_distribution = df.groupby ('Chocolate_Type')['Amount'].sum ()

plt.figure (figsize=(10, 6)) plt.pie (type_distribution.values, labels=type_distribution.index, autopct='%1.1f%%', startangle=90, colors=['

8B4513', '

D2691E', '

A0522D', '

CD853F']) plt.title ('Распределение выручки по типам шоколада', fontsize=14) plt.axis ('equal') plt.tight_layout () plt.show ()

Средняя цена продукта vs Популярность

Original size 1141x790

import pandas as pd import matplotlib.pyplot as plt

df = pd.read_csv ('Chocolate Sales.csv') df['Amount'] = df['Amount'].str.replace ('$', '').str.replace (', ', '').astype (float)

product_stats = df.groupby ('Product').agg ({ 'Amount': 'sum', 'Boxes Shipped': 'sum' }).reset_index () product_stats['Price per Box'] = product_stats['Amount'] / product_stats['Boxes Shipped'] product_stats['Popularity'] = product_stats['Boxes Shipped']

plt.figure (figsize=(12, 8)) scatter = plt.scatter (product_stats['Price per Box'], product_stats['Popularity'], s=product_stats['Amount']/500, alpha=0.7, c=product_stats['Amount'], cmap='YlOrBr')

plt.colorbar (scatter, label='Общая выручка ($)') plt.xlabel ('Средняя цена за коробку ($)') plt.ylabel ('Популярность (кол-во коробок)') plt.title ('Средняя цена продукта vs Популярность', fontsize=14) plt.grid (True, alpha=0.3) plt.tight_layout () plt.show ()

Заключение

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

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

Применение генеративной модели

Обращения для помощи с генерацией инструкций и рекомендацией по улучшению кода

We use cookies to improve the operation of the website and to enhance its usability. More detailed information on the use of cookies can be fo...
Show more