Исходный размер 2480x3500

Статистический анализ сортов цветов

Мне очень нравятся цветы!!!

Тема цветов была выбрана благодаря личному интересу к флористике и эстетике природы. Мне было интересно взглянуть на них не только с эстетической, но и с аналитической стороны — выявить закономерности, скрытые в данных: какие климатические зоны наиболее богаты разнообразием цветов, какие из них чаще используются в парфюмерии, как связаны высота и продолжительность жизни растения. Этот проект позволил совместить любовь к природе с интересом к анализу данных.

big
Исходный размер 1344x768

Цветы сопровождают человека всегда: от букетов на первом свидании до торжественных церемоний. Мы привыкли видеть в них красоту, но за каждым цветком стоит своя история — где он родился, как долго живёт, используют ли его в парфюмерии или медицине.

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

С помощью четырёх типов визуализации — столбчатых и круговых диаграмм, точечных графиков и тепловых карт — я попытаюсь найти закономерности в мире флоры и ответить на вопросы: какие цветы доминируют в промышленности, где находится главный «цветочный» регион планеты и существует ли связь между количеством лепестков и высотой растения.

Исходный размер 1344x768

Для визуализации данных я планирую использовать следующие типы графиков: • Тепловая карта • Столбчатая диаграмма • Круговая диаграмма • Точечный график (scatter plots)

Визуальное оформление

Графики оформлены в природном и наглядном стиле, соответствующем тематике цветов.

Исходный размер 2187x410

Загрузка данных

Для работы я импортировала библиотеки: pandas для работы с данными, matplotlib.pyplot для построения графиков, и загрузила основной файл из датасета. Также, для тепловой карты, использовалась библиотека matplotlib.colors.

import pandas as pd import matplotlib.pyplot as plt import seaborn as sns df = pd.read_csv ( 'flowers.csv',

Круговая диаграмма

Исходный размер 1114x624

Была построена круговая диаграмма соотношения цветов, используемых как срезочные, и не используемых в этом качестве. Для построения круговой диаграммы необходимо было отфильтровать данные по столбцу cut flowers, после чего нужно было посчитать количество цветов со значением 1 (используются как срезочные) и 0 (не используются как срезочные).

На круговой диаграмме представлено соотношение цветов, которые используются как срезочные (cut flowers = 1), и тех, которые не применяются в этом качестве (cut flowers = 0). Для визуализации данных была использована пользовательская цветовая палитра и настроен стиль текста.

from io import StringIO

Загрузка данных в pandas

df = pd.read_csv (StringIO (data))

Просмотр данных

print («✅ Данные загружены!») print (f"\n📊 Размер данных: {df.shape[0]} строк, {df.shape[1]} столбцов») print (f"\n📋 Названия столбцов:») print (df.columns.tolist ())

print («\n🔍 Первые 5 строк:») print (df.head ())

print («\n📈 Информация о данных:») print (df.info ())

Круговая диаграмма для cut flowers

cut_flowers_counts = df['cut flowers'].value_counts () cut_flowers_counts.index = cut_flowers_counts.index.map ({1: 'Используются как срезочные', 0: 'Не используются как срезочные'})

Цветовая палитра

colors = [«

69BE28», »

FEC2C8»]

Настройка стиля

plt.rcParams.update ({ 'font.size': 14, 'font.weight': 'bold', 'text.color': 'black' })

Построение диаграммы

plt.figure (figsize=(7, 7)) plt.pie (cut_flowers_counts, labels=cut_flowers_counts.index, autopct='%1.1f%%', colors=colors, startangle=90, wedgeprops={'edgecolor': 'black', 'linewidth': 1}, textprops={'color': 'black'})

plt.title («Соотношение цветов, используемых как срезочные», fontsize=14, fontweight='bold') plt.axis ('equal') plt.tight_layout () plt.show ()

Статистика

print (f"\n📊 Статистика:») print (f"Всего цветов: {len (df)}») print (f"Срезочные цветы: {cut_flowers_counts['Используются как срезочные']} ({cut_flowers_counts['Используются как срезочные']/len (df)*100:.1f}%)») print (f"Не срезочные: {cut_flowers_counts['Не используются как срезочные']} ({cut_flowers_counts['Не используются как срезочные']/len (df)*100:.1f}%)»)

Точечный график

Исходный размер 855x518

Благодаря этому точечному графику мы увидели, как связаны продолжительность жизни цветов и их высота. А также различия в этих показателях между цветами разных оттенков.

После фильтрации цветов, которые используются в парфюмерии (perfumes = 1), от остальных видов, я приступила к построению графика. На нём каждая точка представляет отдельный цветок, а цвет точки соответствует его окрасу.

from io import StringIO

Загрузка данных

df = pd.read_csv (StringIO (data))

Фильтруем данные — оставляем только цветы, которые используются в парфюмерии (perfumes = 1)

df_perfume = df[df['perfumes'] == 1]

Проверяем, есть ли данные

if not df_perfume.empty:

# Преобразуем строковые диапазоны в числовые значения (берем среднее)
def convert_height (height_str):
    if '-' in str (height_str):
        low, high = height_str.split ('-')
        return (float (low) \+ float (high)) / 2
    return float (height_str)

df_perfume['height (cm)_numeric'] = df_perfume['height (cm)'].apply (convert_height)

# Преобразуем longevity в числовые значения
def convert_longevity (longevity_str):
    if '-' in str (longevity_str):
        low, high = longevity_str.split ('-')
        return (float (low) \+ float (high)) / 2
    return float (longevity_str)

df_perfume['longevity (years)_numeric'] = df_perfume['longevity (years)'].apply (convert_longevity)

# Цветовая палитра
colors = [«<h3>69BE28», »</h3>FEC2C8», «<h3>FFF6B3», »</h3>9F01D2», «#AEF0FF»]

# Создаем словарь цветов для разных оттенков
unique_colors = df_perfume['color'].unique ()
color_map = {color: colors[i % len (colors)] for i, color in enumerate (unique_colors)}

# Строим точечный график с помощью matplotlib
plt.figure (figsize=(12, 8))

for color_type in unique_colors:
    subset = df_perfume[df_perfume['color'] == color_type]
    plt.scatter (subset['height (cm)_numeric'],
               subset['longevity (years)_numeric'],
               c=color_map[color_type],
               label=color_type,
               s=100,
               alpha=0.8,
               edgecolor='black')

Улучшаем внешний вид

plt.grid (True, linestyle='--', alpha=0.7)
plt.legend (title="Цвет», bbox_to_anchor=(1.05, 1), loc='upper left')
plt.tight_layout ()

# Отображаем график
plt.show ()

# Выводим статистику
print (f"\n📊 Статистика:»)
print (f"Всего цветов, используемых в парфюмерии: {len (df_perfume)}»)
print (f"Средняя высота: {df_perfume['height (cm)_numeric'].mean ():.1f} см»)
print (f"Средняя продолжительность жизни: {df_perfume['longevity (years)_numeric'].mean ():.1f} лет»)
print (f"\n🌸 Цвета:»)
print (df_perfume['color'].value_counts ())

else: print («⚠️ В данных нет цветов, используемых в парфюмерии (perfumes = 1)»)

Для понимания графика, я сделала подписи к осям Х и Y.

Заголовок и подписи

plt.title («Зависимость продолжительности жизни от высоты цветов, используемых в парфюмерии 🌸»,
          fontsize=16, fontweight='bold')
plt.xlabel («Высота (см)», fontsize=14)
plt.ylabel («Продолжительность жизни (годы)», fontsize=14)

Тепловая карта

Исходный размер 1133x806

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

from io import StringIO

Загрузка данных

df = pd.read_csv (StringIO (data))

1. Выбираем топ-5 самых популярных климатических зон

top_5_climates = df['climate'].value_counts ().head (5).index.tolist ()

2. Фильтруем DataFrame по этим климатическим зонам

df_top = df[df['climate'].isin (top_5_climates)].copy ()

3. Создаем столбец с текстовым обозначением использования в парфюмерии

df_top['perfumes_text'] = df_top['perfumes'].map ({1: 'Используется в парфюмерии', 0: 'Не используется'})

4. Строим сводную таблицу: климат → использование в парфюмерии → количество цветов

pivot_df = df_top.groupby (['climate', 'perfumes_text']).size ().unstack (fill_value=0)

5. Сортируем строки (климатические зоны) по популярности

pivot_df = pivot_df.loc[pivot_df.sum (axis=1).sort_values (ascending=False).index]

6. Создаем тепловую карту с помощью matplotlib (без seaborn)

fig, ax = plt.subplots (figsize=(10, 8))

Цветовая карта (от зеленого к розовому)

colors = [«

69BE28», »

FEC2C8», «

FFF6B3», »

9F01D2», «#AEF0FF»]

Создаем цветовую карту для тепловой карты

cmap = plt.cm.colors.ListedColormap (colors[: len (pivot_df.columns)])

Рисуем тепловую карту

im = ax.imshow (pivot_df.values, cmap=cmap, aspect='auto')

Настройка осей

ax.set_xticks (np.arange (len (pivot_df.columns))) ax.set_yticks (np.arange (len (pivot_df.index))) ax.set_xticklabels (pivot_df.columns, rotation=15, ha='right') ax.set_yticklabels (pivot_df.index)

Добавляем значения в ячейки

for i in range (len (pivot_df.index)): for j in range (len (pivot_df.columns)): text = ax.text (j, i, pivot_df.values[i, j], ha="center», va="center», color="black», fontweight='bold')

Настройка внешнего вида

ax.set_xlabel («Использование в парфюмерии», fontsize=12) ax.set_ylabel («Климатическая зона», fontsize=12) ax.set_title («Распределение использования в парфюмерии по климатическим зонам», fontsize=14, fontweight='bold')

Добавляем рамки между ячейками

for i in range (len (pivot_df.index) + 1): ax.axhline (i — 0.5, color='white', linewidth=2) for j in range (len (pivot_df.columns) + 1): ax.axvline (j — 0.5, color='white', linewidth=2)

plt.tight_layout () plt.show ()

Выводим статистику

print («\n📊 Статистика:») print (f"Всего цветов в выборке: {len (df_top)}») print (f"\nТоп-5 климатических зон:») for i, climate in enumerate (top_5_climates, 1): count = df[df['climate'] == climate].shape[0] print (f"{i}. {climate}: {count} цветов»)

print (f"\nРаспределение по климатическим зонам:») print (pivot_df)

Столбчатая диаграмма

Исходный размер 1159x686

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

from io import StringIO

Загрузка данных

df = pd.read_csv (StringIO (data))

ВАША ЦВЕТОВАЯ ПАЛИТРА (все 5 цветов)

my_colors = [«

69BE28», »

FEC2C8», «

FFF6B3», »

9F01D2», «#AEF0FF»]

Подсчёт количества цветов по климатическим зонам

climate_counts = df['climate'].value_counts ()

Определяем топ-5 климатических зон

top_5_climates = climate_counts.head (5)

Стиль оформления

plt.style.use ('default') plt.rcParams.update ({ 'text.color': 'black', 'axes.labelcolor': 'black', 'xtick.color': 'black', 'ytick.color': 'black', 'font.size': 12, 'axes.titleweight': 'bold', 'axes.labelweight': 'bold' })

Создание горизонтального барчарта

plt.figure (figsize=(10, 6)) bars = plt.barh ( y=top_5_climates.index, width=top_5_climates.values, color=my_colors[: len (top_5_climates)], edgecolor='black', linewidth=1 )

Добавление значений на столбцы

for i, (climate, count) in enumerate (top_5_climates.items ()): plt.text (count + 0.5, i, str (count), color='black', va='center', fontsize=11, fontweight='bold')

Заголовок и подписи

plt.title («Топ-5 климатических зон по количеству цветов», fontsize=16, pad=20, fontweight='bold') plt.xlabel («Количество цветов», fontsize=14, fontweight='bold') plt.ylabel («Климатическая зона», fontsize=14, fontweight='bold')

Добавляем сетку

plt.grid (axis='x', linestyle='--', alpha=0.7, color='gray')

Убираем лишние рамки

plt.gca ().spines['top'].set_visible (False) plt.gca ().spines['right'].set_visible (False)

plt.tight_layout () plt.show ()

Выводим статистику

print («\n📊 Статистика:») print (f"Всего цветов в базе: {len (df)}») print (f"\nТоп-5 климатических зон:») for i, (climate, count) in enumerate (top_5_climates.items (), 1): percentage = (count / len (df)) * 100 print (f"{i}. {climate}: {count} цветов ({percentage:.1f}%)»)

print (f"\nПолный список климатических зон:») print (climate_counts)

Заключение

В ходе работы был проведён анализ датафрейма, содержащего информацию о различных видах цветов: их высоте, продолжительности жизни, климатических зонах произрастания, использовании в парфюмерии и других характеристиках. На основе полученных результатов были построены графики и диаграммы, позволяющие наглядно представить выявленные закономерности.

Описание применения генеративной модели

В ходе работы над проектом использовались следующие нейросети:

Работа с генеративной моделью велась в интерактивном режиме через веб-интерфейс. Пользователем формулировались текстовые запросы (промпты), на основе которых модель генерировала код Python, объяснения и текстовые описания. При необходимости выполнителя уточнял запросы, корректировал сгенерированный код и интегрировал его в общую структуру проекта.

Генеративная модель использовалась для решения следующих задач: Создание скриптов для загрузки данных из CSV-файла в pandas, преобразования строковых диапазонов (например, «60-150») в числовые значения, группировки данных и построения визуализаций Генерация структурированных ответов на вопросы о статистических методах, стилизации графиков и источниках вдохновения

Создание кода для чтения CSV-файла с цветами в pandas: «Напиши код на Python для загрузки CSV в pandas, где данные содержат информацию о цветах: название, высота, продолжительность жизни, климат, использование в парфюмерии» Создание круговых, точечных диаграмм, тепловых карт и барчартов: «Создай круговую диаграмму для столбца cut flowers с цветовой палитрой

69BE28,

FEC2C8,

FFF6B3,

9F01D2, #AEF0FF» / «Построй точечный график зависимости продолжительности жизни от высоты цветов, используемых в парфюмерии» Исправление проблем с установкой библиотек, предупреждений pandas: «Как исправить SettingWithCopyWarning в pandas при создании нового столбца в отфильтрованном DataFrame?» / «Как установить seaborn в Colab?»

Обоснование использования Применение генеративной модели позволило:

Сократить время разработки — автоматизация рутинных задач по написанию кода

Повысить качество кода — использование современных практик и рекомендаций pandas

Упростить процесс обучения — получение пояснений к сложным конструкциям

Обеспечить единообразие стиля — генерация кода с соблюдением единого стиля оформления

Блокноты

Статистический анализ сортов цветов
Проект создан 01.04.2026
Мы используем файлы cookies для улучшения работы сайта НИУ ВШЭ и большего удобства его использования. Более подробную...
Показать больше