Оглавление: — вводная — этапы работы — итоговые графики
Вводная часть
Для исследований были выбран датасет "Marketing Campaign", который содержит данные о маркетинговых кампаниях. Взят с сайта kaggle.com (https://www.kaggle.com/datasets/rodsaldanha/arketing-campaign)
Он включает информацию о клиентах, их покупках, доходах, реакции на рекламу и других метриках. У данного датасета 312 тысяч просмотров и 46,1 тысяч загрузок, так что, будучи продуктовым дизайнером, мне стало интересно его проанализировать.
Были выбраны несколько видов графиков для визуализации конкретных типов данных:
- Гистограммы для распределения клиентов по возрасту
Почему: гистограмма идеально подходит для визуализации распределения числовых данных (например, года рождения). Она показывает, как данные группируются по диапазонам.
- Столбчатые диаграммы для сравнения категорий
Почему: столбчатые диаграммы отлично подходят для сравнения категориальных данных (например, количество клиентов с разным семейным статусом или реакция на кампанию).
- Box Plot для анализа распределений и выбросов
Почему: Box Plot позволяет визуализировать распределение данных, медиану, квантили и выбросы. Это полезно для сравнения доходов между разными группами (например, по уровню образования).
- Scatter Plot для корреляций
Почему: Scatter Plot идеально подходит для визуализации взаимосвязи между двумя числовыми переменными (например, доход и траты).
Этапы работы
Шаг 1: Скачивание датасета
Загрузила файл с сайта: https://www.kaggle.com/datasets/rodsaldanha/arketing-campaign
Перенесла файл "marketing_campaign.csv" в папку "data" в папке проекта "Neural networks project"
Шаг 2: Установка необходимых библиотек
В терминале:
pip install pandas matplotlib seaborn
Шаг 3: Загрузка данных и предварительный анализ
Указываем путь к файлу, задаем разделитель и предварительно проверяем первые строки, информацию о данных и наличие пропущенных значений:
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns
file_path = '/Users/daryapivovarova/Downloads/Neural networks project/data/marketing_campaign.csv'
df = pd.read_csv(file_path, sep=';')
print(df.head())
print(df.info())
print(df.isnull().sum())
Шаг 4: Обработка пропущенных значений
Заполняем пропуски в столбце Income медианным значением, это поможет сохранить распределение данных:
df['Income'] = df['Income'].fillna(df['Income'].median())
print(df['Income'].isnull().sum()) # Должно быть 0
Шаг 5: Настройка стиля графиков
вдохновлялась этим референсом (слева) и собрала палитру цветов (справа)
import matplotlib.pyplot as plt import seaborn as sns
plt.rcParams['font.family'] = 'sans-serif' plt.rcParams['font.sans-serif'] = ['Helvetica'] plt.rcParams['font.weight'] = 'bold'
colors = ["#ED400E", "#EE6C99", "#F5BD02", "#456C4F", "#0499A5", "#1469B4", "#8B85B9"]
background_color = "#f8f8f2" plt.rcParams['axes.facecolor'] = background_color plt.rcParams['figure.facecolor'] = background_color
plt.rcParams['axes.titlesize'] = 16 plt.rcParams['axes.titleweight'] = 'bold' plt.rcParams['axes.labelsize'] = 10 plt.rcParams['xtick.labelsize'] = 10 plt.rcParams['ytick.labelsize'] = 10
Шаг 6: Анализ данных
- Распределение клиентов по возрасту
plt.figure(figsize=(10, 6)) sns.histplot(df['Year_Birth'], bins=30, color=colors[0]) plt.title("Distribution of Customers by Age", fontsize=16, fontweight='bold') plt.xlabel("Year of Birth", fontsize=10) plt.ylabel("Number of Customers", fontsize=10) plt.show()
- Количество клиентов, отреагировавших на кампанию
plt.figure(figsize=(8, 6)) response_counts = df['Response'].value_counts() sns.barplot(x=response_counts.index, y=response_counts.values, palette=colors[:2]) plt.title("Response to Marketing Campaign", fontsize=16, fontweight='bold') plt.xlabel("Response (1 = Yes, 0 = No)", fontsize=10) plt.ylabel("Number of Customers", fontsize=10) plt.show()
- Средний доход по уровню образования
plt.figure(figsize=(12, 6)) sns.boxplot(x='Education', y='Income', data=df, palette=colors) plt.title("Average Income by Education Level", fontsize=16, fontweight='bold') plt.xlabel("Education Level", fontsize=10) plt.ylabel("Income", fontsize=10) plt.xticks(rotation=45) plt.show()
- Зависимость между количеством детей и реакцией на кампанию
plt.figure(figsize=(10, 6)) sns.countplot(x='Kidhome', hue='Response', data=df, palette=colors[:2]) plt.title("Campaign Response by Number of Children", fontsize=16, fontweight='bold') plt.xlabel("Number of Children", fontsize=10) plt.ylabel("Number of Customers", fontsize=10) plt.legend(title="Response", labels=["No", "Yes"], fontsize=10) plt.show()
- Топ-5 продуктов, которые чаще всего покупают
product_columns = ['MntWines', 'MntFruits', 'MntMeatProducts', 'MntFishProducts', 'MntSweetProducts', 'MntGoldProds'] product_totals = df[product_columns].sum().sort_values(ascending=False)
plt.figure(figsize=(10, 6)) sns.barplot(x=product_totals.index, y=product_totals.values, palette=colors) plt.title("Top 5 Products by Sales Volume", fontsize=16, fontweight='bold') plt.xlabel("Product Category", fontsize=10) plt.ylabel("Total Purchases", fontsize=10) plt.xticks(rotation=45) plt.show()
- Корреляция между доходом и суммарными тратами
df['TotalSpent'] = df[product_columns].sum(axis=1)
plt.figure(figsize=(10, 6)) sns.scatterplot(x='Income', y='TotalSpent', data=df, color=colors[4]) plt.title("Correlation Between Income and Total Spending", fontsize=16, fontweight='bold') plt.xlabel("Income", fontsize=10) plt.ylabel("Total Spending", fontsize=10) plt.show()
- Распределение клиентов по семейному положению
plt.figure(figsize=(10, 6)) marital_counts = df['Marital_Status'].value_counts() sns.barplot(x=marital_counts.index, y=marital_counts.values, palette=colors) plt.title("Distribution of Customers by Marital Status", fontsize=16, fontweight='bold') plt.xlabel("Marital Status", fontsize=10) plt.ylabel("Number of Customers", fontsize=10) plt.xticks(rotation=45) plt.show()
Итоговые графики
Основная масса клиентов родилась в период с 1960 по 1980 год. Это указывает на то, что большая часть аудитории — люди в возрасте 40–60 лет. Молодежь и пожилые люди представлены в меньшей степени.
Большинство клиентов не отреагировали на маркетинговую кампанию. Только около 15–20% аудитории положительно откликнулась на кампанию. Низкая вовлеченность и недост. релевантность компании для ЦА.
Клиенты с высшим образованием имеют значительно более высокий средний доход по сравнению с теми, у кого образование на уровне Graduation или ниже. Прямая зависимость м/у уровнем образования и доходом.
Клиенты без детей чаще реагируют на маркетинговые кампании, чем те, у кого есть дети. Скорее всего клиенты с детьми менее активны в взаимодействии с рекламой из-за занятости или других приоритетов.
Наибольший объем продаж приходится на вина и мясные продукты. Эти категории значительно опережают остальные. Это говорит о том, что вина и мясные продукты являются самыми популярными среди клиентов.




