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 ()

Заключение

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

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

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

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