
Оглавление: — вводная — этапы работы — итоговые графики
Вводная часть
Для исследований были выбран датасет «Marketing Campaign», который содержит данные о маркетинговых кампаниях. Взят с сайта kaggle.com (https://www.kaggle.com/datasets/rodsaldanha/arketing-campaign)
Он включает информацию о клиентах, их покупках, доходах, реакции на рекламу и других метриках. У данного датасета 312 тысяч просмотров и 46,1 тысяч загрузок, так что, будучи продуктовым дизайнером, мне стало интересно его проанализировать.
Были выбраны несколько видов графиков для визуализации конкретных типов данных:
1. Гистограммы для распределения клиентов по возрасту
Почему: гистограмма идеально подходит для визуализации распределения числовых данных (например, года рождения). Она показывает, как данные группируются по диапазонам.
2. Столбчатые диаграммы для сравнения категорий
Почему: столбчатые диаграммы отлично подходят для сравнения категориальных данных (например, количество клиентов с разным семейным статусом или реакция на кампанию).
3. Box Plot для анализа распределений и выбросов
Почему: Box Plot позволяет визуализировать распределение данных, медиану, квантили и выбросы. Это полезно для сравнения доходов между разными группами (например, по уровню образования).
4. Scatter Plot для корреляций
Почему: Scatter Plot идеально подходит для визуализации взаимосвязи между двумя числовыми переменными (например, доход и траты).
Этапы работы
Шаг 1: Скачивание датасета
1. Загрузила файл с сайта: https://www.kaggle.com/datasets/rodsaldanha/arketing-campaign
2. Перенесла файл «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: Анализ данных
1. Распределение клиентов по возрасту
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 ()
2. Количество клиентов, отреагировавших на кампанию
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 ()
3. Средний доход по уровню образования
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 ()
4. Зависимость между количеством детей и реакцией на кампанию
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. Топ-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 ()
6. Корреляция между доходом и суммарными тратами
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 ()
7. Распределение клиентов по семейному положению
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 ()
Итоговые графики