—Вводная часть: 1. Обоснование выбора данных и их источник 2. Виды графиков —Этапы работы: 1. Обработка данных 1.1 Итоговые графики: a. Анализ данных b. Код c. Графики 2. Нейросети 3. Стилистика 4. Статистические методы
ВВОДНАЯ ЧАСТЬ
Практические причины выбора
Содержит около 54 000 строк и 10 признаков (вес, размеры, огранка, цвет, чистота, цена), этого достаточно и для описательной статистики, и для моделей, но ещё не «big data».
Есть и числовые, и порядковые категориальные признаки, поэтому на одном датасете можно показать гистограммы, boxplot, scatterplot, heatmap, кодирование категорий, корреляции и простые модели.
Связь между признаками интуитивна: вес и размеры влияют на цену, огранка–цвет–чистота дают «премию к стоимости», что удобно объяснять на графиках и в отчёте.
Источник: https://www.kaggle.com
Виды графиков
Гистограммы (hist / histplot) Точечные диаграммы (scatterplot) Ящиковые диаграммы (boxplot) Тепловая карта (heatmap)
ОБРАБОТКА ДАННЫХ
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns
#Загрузка данных df = pd.read_csv ('diamonds.csv')
#Просмотр первых строк print (df.head ()) #Основная информация о датасете print (df.info ()) #Описание числовых столбцов print (df.describe ())
Гистограммы распределения числовых признаков
df.hist (figsize=(12, 8)) plt.show ()
На этом наборе гистограмм видно, как распределены все числовые признаки датасета о бриллиантах, и по ним уже можно сделать несколько важных выводов. Характер распределений carat: распределение смещено вправо (правый «хвост») — много мелких бриллиантов и мало крупных; то есть маленькие по весу встречаются значительно чаще крупных. price: сильное смещение вправо — большинство бриллиантов относительно недорогие, а очень дорогие встречаются редко; это типичное распределение с длинным хвостом для цен. x, y, z: основная масса значений сосредоточена в узком диапазоне, но виден небольшой хвост и редкие экстремальные значения, которые могут быть выбросами и требуют проверки. depth и table: распределения довольно компактные и близки к «колоколу», значения сосредоточены вокруг типичных для ювелирных камней диапазонов, что говорит о стандартизованных пропорциях огранки. Выводы для анализа Наличие сильного смещения распределений carat и price говорит о том, что для моделирования (например, регрессии) может понадобиться лог-преобразование этих признаков, чтобы уменьшить влияние «длинного хвоста». Узкие распределения depth и table показывают, что эти параметры варьируются меньше, чем размер и цена, и могут давать более слабый вклад в объяснение цены по сравнению с весом и линейными размерами. Возможные выбросы по x, y, z (очень большие или близкие к нулю значения) стоит дополнительно проверить и, при необходимости, удалить или обработать, чтобы они не искажали корреляции и модели.
График зависимости цены от карат
plt.figure (figsize=(8, 6)) sns.scatterplot (data=df, x='carat', y='price') plt.title ('Зависимость цены от карат') plt.show ()
На графике видно явную положительную связь между весом бриллианта в каратах и его ценой: чем больше carat, тем выше price, хотя разброс цен для одного и того же веса довольно велик. Что показывает график Общая тенденция: точки образуют восходящее «облако» — при увеличении карата цена в среднем растёт, и для крупных камней (больше 2 карат) цены могут достигать максимальных значений на графике. Нелинейность роста: рост цены с увеличением веса выглядит нелинейным — при переходе от малых каратам к крупным стоимость растёт быстрее, особенно после примерно 1 карата, что соответствует реальному рынку бриллиантов. Большой разброс: для одного и того же значения carat цена может сильно отличаться; это значит, что на цену влияют и другие факторы (огранка, цвет, чистота, пропорции), поэтому вес — важный, но не единственный определяющий признак. Выводы для дальнейшего анализа Вес бриллианта является сильным предиктором цены, но модель прогнозирования должна обязательно учитывать и категориальные признаки (cut, color, clarity), чтобы объяснить разброс точек по вертикали.
Имеет смысл проверить корреляцию между carat и price, а также протестировать модели с лог-преобразованием признаков (например, log(«price») и log(«carat»)), чтобы лучше описать нелинейную зависимость.
Корреляция характеристик бриллиантов
import matplotlib.pyplot as plt import seaborn as sns #Выбор стиля sns.set_style («darkgrid») # или «whitegrid», «dark», «white», «ticks» sns.set_palette («husl») # или «viridis», «Set2», «coolwarm» #Увеличение шрифта sns.set (font_scale=1.2) #Пример корреляционной матрицы в оригинальном стиле df_numeric = df.select_dtypes (include=['number']) plt.figure (figsize=(10, 8)) heatmap = sns.heatmap (df_numeric.corr (), annot=True, cmap='coolwarm', center=0) heatmap.set_title ('Корреляция характеристик бриллиантов', fontdict={'fontsize': 16}, pad=12) plt.show ()
Корреляционная матрица показывает, какие числовые характеристики бриллиантов сильнее всего связаны друг с другом и с ценой. Связь с ценой Сильная положительная корреляция с ценой у признаков carat (0.92), x (0.88), y (0.87), z (0.86): чем больше вес и физические размеры бриллианта, тем выше его цена; вес — один из ключевых факторов цены. Слабая связь с ценой у depth (≈0) и table (0.13): пропорции огранки почти не влияют на цену в сравнении с весом и размерами, или их влияние опосредовано через другие признаки. Взаимосвязь признаков между собой Между carat и линейными размерами x, y, z очень высокая корреляция (0.95–0.98), что логично: более тяжёлые камни физически больше. x, y, z тоже сильно коррелируют между собой (0.95–0.97), то есть камни, как правило, увеличиваются пропорционально по всем измерениям, что говорит о стандартизованной геометрии огранки. Между depth и table есть умеренно отрицательная корреляция (-0.3): при увеличении глубины камня площадь столовой грани часто уменьшается, что отражает геометрию огранки. Выводы для моделирования Для предсказания цены наиболее информативны carat и размеры x, y, z, но между ними есть сильная мультиколлинеарность, поэтому в модели стоит либо оставить только часть из них (например, только carat), либо использовать регуляризацию. Признаки depth и table дают мало информации о цене и могут иметь низкий вклад в модели, их полезность стоит проверять отдельно (например, через важность признаков в деревьях решений).
Зависимость цены от веса и качества огранки
plt.figure (figsize=(10, 6)) sns.scatterplot (data=df, x='carat', y='price', hue='cut', palette='Set2', alpha=0.7) plt.title ('Зависимость цены от веса и качества огранки', fontsize=16) plt.xlabel ('Вес (carat)', fontsize=12) plt.ylabel ('Цена', fontsize=12) plt.legend (title='Огранка') plt.show ()
График показывает, как на цену одновременно влияют вес бриллианта и качество огранки. Зависимость цены от веса Сохраняется сильная положительная зависимость: с ростом carat цена в среднем увеличивается, особенно заметен скачок после примерно 1 карата, где появляются самые дорогие камни. При малом весе (до 1 карата) разброс цен относительно небольшой, при весе 1–2 карата и выше разброс сильно увеличивается, что указывает на вклад других характеристик, в том числе огранки. Роль качества огранки Точки разных категорий cut (Ideal, Premium, Very Good, Good, Fair) перекрываются, но видно, что при одинаковом весе более качественная огранка чаще встречается в более дорогой части диапазона цен. Для больших каратов (около 1–2 и выше) бриллианты с огранкой Ideal и Premium в среднем дороже, чем камни того же веса с огранкой Fair или Good, то есть огранка добавляет к цене премию поверх эффекта веса. Выводы Вес остаётся главным фактором, определяющим уровень цены, но качество огранки даёт заметную вертикальную «стратификацию» точек: при одном и том же весе лучшие по огранке камни, как правило, дороже. Для дальнейшего анализа стоит строить отдельные модели или графики по группам огранки, а также добавить в визуализации цвет и чистоту, чтобы объяснить оставшийся разброс цен.
Распределение цен по цвету и чистоте
#Распределение цен по качеству огранки (cut) plt.figure (figsize=(10, 6)) sns.boxplot (data=df, x='color', y='price', palette='husl') plt.title ('Распределение цен по цвету', fontsize=16) plt.xlabel ('Цвет', fontsize=12) plt.ylabel ('Цена', fontsize=12) plt.xticks (rotation=45) plt.show ()
plt.figure (figsize=(10, 6)) sns.boxplot (data=df, x='clarity', y='price', palette='husl') plt.title ('Распределение цен по чистоте', fontsize=16) plt.xlabel ('Чистота', fontsize=12) plt.ylabel ('Цена', fontsize=12) plt.xticks (rotation=45) plt.show ()
Графики показывают, как цвет и чистота влияют на распределение цен, причём влияние этих факторов заметно, но слабее, чем у веса. Цена в зависимости от цвета Медианные цены по цветам отличаются, но не монотонно: для некоторых «хуже» по цвету категорий (например, J, I) медиана выше, чем у более «чистых» D–F, что говорит о сильном влиянии других факторов (веса, огранки) и того, что более желтый камень может быть крупнее и дороже. Разброс цен и количество выбросов (очень дорогих камней) примерно сопоставимы между цветами, поэтому цвет сам по себе не гарантирует высокую цену, а лишь немного сдвигает распределение. Цена в зависимости от чистоты Для более высокой чистоты (от SI2 к IF) медиана цены в целом растёт, но тоже не строго монотонно: категории VS1–VVS2 и IF тяготеют к более высоким ценам, однако в «низких» категориях SI1–SI2 тоже встречаются очень дорогие экземпляры, что снова указывает на влияние веса и огранки. Разброс внутри каждой категории очень большой: диапазон цен перекрывается между всеми уровнями чистоты, поэтому чистота влияет на цену, но не определяет её однозначно. Общие выводы И цвет, и чистота вносят вклад в формирование цены, но эффект выражен слабее и более «шумно», чем у веса: внутри каждой категории виден огромный вертикальный разброс. Для моделирования цены имеет смысл учитывать цвет и чистоту как дополнительные признаки, но ожидать от них умеренной объясняющей способности и обязательно сочетать их с весом, размерами и огранкой.
Распределение цен на брилианты
#Настройка стиля sns.set_style («darkgrid») sns.set_palette («husl») sns.set (font_scale=1.2)
#Построение гистограммы с KDE plt.figure (figsize=(10, 6)) sns.histplot (df['price'], kde=True, bins=50, color='skyblue') plt.title ('Распределение цен на бриллианты', fontsize=16) plt.xlabel ('Цена', fontsize=12) plt.ylabel ('Частота', fontsize=12) plt.show ()
График показывает сильно асимметричное распределение цен: большинство бриллиантов стоят относительно недорого, а очень дорогие встречаются редко. Форма распределения Распределение однопиковое с ярко выраженным правым «хвостом»: максимум частоты приходится примерно на диапазон 500–2000 условных единиц, далее частота быстро падает, но хвост тянется до максимальных цен около 18000–19000. Кривая KDE повторяет эту форму: плотность высока в области невысоких цен и постепенно стремится к нулю при росте цены, что говорит о типичной для цен правосторонней асимметрии. Выводы для анализа Средняя цена будет заметно выше медианы, потому что на неё «тянут» немногочисленные, но очень дорогие камни; для описания типичного уровня цен лучше смотреть на медиану и квартильные интервалы, а не только на среднее. Для статистического моделирования и регрессии полезно рассмотреть логарифм цены log(«price»), чтобы сделать распределение ближе к нормальному, уменьшить влияние крайних значений и улучшить качество моделей.
Нейросеть: https://www.perplexity.ai
СТАТИСТИЧЕСКИЕ МЕТОДЫ
Глобальные настройки стиля Использование sns.set_style («darkgrid») — единый фон с сеткой для всех графиков, что облегчает чтение значений и создаёт общий визуальный стиль.
Задание цветовой палитры sns.set_palette («husl») и palette='Set2' для отдельных графиков — согласованные мягкие цвета вместо стандартных, что улучшает восприятие и различимость категорий.
Увеличение масштаба шрифта sns.set (font_scale=1.2) — подписи и заголовки лучше читаются на всех визуализациях.
Оформление отдельных графиков Задание размеров фигур plt.figure (figsize=(10, 6)), figsize=(12, 8) — графики не «сжаты», их удобно смотреть в отчёте и презентации.
Информативные заголовки и подписи осей: plt.title (…), plt.xlabel (…), plt.ylabel (…) с указанием сущности и единиц измерения (например, «Вес (carat)», «Цена»).
Настройка легенды plt.legend (title='Огранка') — понятные подписи категорий на scatterplot по огранке.
Использование прозрачности alpha=0.7 на точечных диаграммах для уменьшения визуального шума при большом количестве точек.
Стилизация аналитических графиков Тепловая карта корреляций с cmap='coolwarm', annot=True и выравниванием по нулю center=0 — наглядное выделение сильных положительных и отрицательных связей.
Boxplot с единой палитрой palette='husl' по цвету, чистоте и огранке — сравнение категорий выглядит единообразно и легко читается.
ОПИСАНИЕ ПРИМЕНЕНИЯ ГЕНЕРАТИВНОЙ МОДЕЛИ
В процессе работы была использована нейросеть Perplexity. Модель использовалась для генерации общего текста и предложений решений ошибок.
ссылка на модель: https://www.perplexity.ai



