Введение
Для анализа использован набор данных о женской одежде и отзывах покупателей из онлайн-магазина. Источником является сайт Kaggle. Набор содержит 23486 отзывов и 10 переменных, каждая строка соответствует одному отзыву и включает информацию о вещи, возрасте покупателя, заголовке и тексте отзыва, рейтинге, рекомендации, числе положительных откликов и категориальных признаках, описывающих тип и отдел одежды.
Набор данных интересен тем, что позволяет изучить предпочтения покупателей по возрасту и категориям одежды, выявить зависимость рейтинга от длины отзывов, а также применять многомерный анализ и визуализацию на реальных коммерческих данных.
Цель анализа
Цель анализа заключается в выявлении возрастных предпочтений покупателей, определении категорий с высоким и низким рейтингом, изучении характера и длины отзывов, а также формулировании рекомендаций по маркетингу и ассортименту.
Для анализа были использованы разные типы графиков: Столбчатые диаграммы для распределения рейтингов, горизонтальные столбчатые диаграммы для среднего рейтинга по категориям, гистограмма с кривой плотности для распределения возраста, диаграмма размаха для длины отзывов по рейтингу и возрасту, тепловая карта для среднего рейтинга по категориям и возрастным группам. Такой подход позволяет наглядно сравнивать категории и выявлять зависимости.
Обработка данных
Данные были обработаны поэтапно. Сначала импортированы библиотеки для работы с таблицами и визуализацией, затем загружен файл CSV и проверено его содержимое. Пропуски в заголовках и текстах отзывов заполнены пустыми строками, числовые столбцы приведены к целым, рассчитана длина каждого отзыва. Это позволило строить корректные графики и анализировать зависимости:
coding: utf-8
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from matplotlib import rcParams
Загрузка CSV
df = pd.read_csv("/content/WomensClothingdata.csv") df.head()
Очистка и подготовка данных
df["Title"] = df["Title"].fillna("") df["Review Text"] = df["Review Text"].fillna("") df["Rating"] = df["Rating"].astype(int) df["Positive Feedback Count"] = df["Positive Feedback Count"].astype(int) df["Age"] = df["Age"].astype(int) df["review_length"] = df["Review Text"].apply(len)
Стилизация графиков
Графики оформлены с использованием нестандартных цветовых палитр Seaborn и шрифта DejaVu Sans. Заголовки выделены жирным, градиенты и контрастные границы помогают акцентировать внимание на ключевых данных. Такой стиль делает графики более информативными и приятными для восприятия:
rcParams['font.family'] = 'DejaVu Sans'
custom_palette = sns.color_palette("pastel") sns.set_theme(style="whitegrid", palette=custom_palette)
plt.rcParams["figure.figsize"] = (12, 6)
Распределение рейтингов и средний рейтинг по категориям
Столбчатые диаграммы позволяют увидеть, какие оценки преобладают и какие категории получают высокие или низкие средние рейтинги. С помощью группировки данных groupby и визуализации через seaborn построены графики распределения рейтингов и среднего рейтинга по категориям:
Распределение рейтингов (столбчатая диаграмма):
counts = df["Rating"].value_counts().sort_index() colors = sns.color_palette("rocket", len(counts))
counts.plot(kind="bar", color=colors, edgecolor='black') plt.title("Распределение рейтингов", fontsize=16, fontweight='bold') plt.xlabel("Рейтинг", fontsize=12) plt.ylabel("Количество отзывов", fontsize=12) plt.show()
Средний рейтинг по категории одежды:
rating_by_class = df.groupby("Class Name")["Rating"].mean().sort_values() colors = sns.color_palette("mako", len(rating_by_class))
rating_by_class.plot(kind="barh", color=colors, edgecolor='black') plt.title("Средний рейтинг по типу одежды", fontsize=16, fontweight='bold') plt.xlabel("Средний рейтинг", fontsize=12) plt.ylabel("Тип одежды", fontsize=12) plt.show()
Результаты показали, что большинство отзывов положительные (4–5). Лидеры — Casual bottoms, Layering, Jeans, а аутсайдеры — Trend, Chemises, Dresses.
Распределение возраста покупателей
Чтобы изучить возрастной состав аудитории, построили гистограмму с кривой плотности:
Возраст покупателей (гистограмма + KDE)
sns.histplot(df['Age'], bins=20, kde=True, color="#FF6F61", edgecolor="black") plt.title("Распределение возраста покупателей", fontsize=16, fontweight='bold') plt.xlabel("Возраст", fontsize=12) plt.ylabel("Количество отзывов", fontsize=12) plt.show()
Здесь bins=20 делит возраст на интервалы, kde=True строит кривую плотности, а цвет выбран для наглядности.
Результат показал, что основная аудитория — 30–50 лет с пиком на 35–40, после 60 лет количество отзывов резко падает.
Длина отзывов по рейтингу и возрастным группам
График показывает распределение длины отзывов в зависимости от рейтинга и возраста покупателей:
plt.figure(figsize=(12,6)) sns.boxplot(x='Rating', y='review_length', hue=pd.cut(df['Age'], bins=[18,30,40,50,60,70]), data=df, palette="viridis") plt.title("Длина отзывов по рейтингу и возрастным группам", fontsize=16, fontweight='bold') plt.xlabel("Рейтинг", fontsize=12) plt.ylabel("Длина отзыва (символы)", fontsize=12) plt.legend(title='Возрастная группа') plt.show()
Молодые покупатели (18–30) оставляют более короткие отзывы, независимо от рейтинга. Группа 30–50 лет пишет отзывы средней длины, с небольшой тенденцией к увеличению длины при росте рейтинга.
Пожилые покупатели (60–70) создают наиболее длинные отзывы для товаров с высокими оценками, что отражает внимание к качеству товара и более детальный разбор его особенностей.
Средний рейтинг по категории и возрастной группе
Тепловая карта построена на основе сводной таблицы средних рейтингов по категориям одежды и возрастным группам с помощью pivot_table и sns.heatmap.
Создаем возрастные группы: df['Age_group'] = pd.cut(df['Age'], bins=[18,30,40,50,60,70], labels=['18-30','31-40','41-50','51-60','61-70'])
Средний рейтинг: pivot_rating = df.pivot_table(index='Class Name', columns='Age_group', values='Rating', aggfunc='mean')
plt.figure(figsize=(14,8)) sns.heatmap(pivot_rating, annot=True, fmt=".2f", cmap='YlGnBu', cbar_kws={'label': 'Средний рейтинг'}) plt.title("Средний рейтинг по типу одежды и возрастной группе", fontsize=16, fontweight='bold') plt.ylabel("Class Name") plt.xlabel("Возрастная группа") plt.show()
Покупатели 18–30 лет лидируют по оценкам повседневных брюк (4.50) и нижнего белья (4.50), клиенты 61–70 лет предпочитают многослойную одежду (4.78) и домашний стиль (4.30). Пляжная одежда плавно понижается в рейтинге с 4.34 (18–30) до 3.71 (61–70), что, вероятно, связано с изменением образа жизни и потребностей.




