Исходный размер 698x1024

Семья ищет комфортное жилье при помощи навыка программирования

PROTECT STATUS: not protected

Для финального проекта по курсу «Программирование для креативных индустрий‎» я выбрала данные по водоемам с общественными пространствами с официального портала мэра Москвы, потому что наличие подобных мест благотворно влияет на жизнь людей, и я решила проанализировать ситуацию в своем городе.

Процесс работы и ее результат я решила презентовать в формате некой истории, сопровождаемой рядом изображений, сгенерированных в Midjourney

История

Исходный размер 896x1344

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

Семья решила, что для них принципиально наличие водоема поблизости с их будущим домом. Поэтому отец составил диаграмму, показывающую количество водоемов на административный округ.

Первый график

Он использовал следующий код: import matplotlib.pyplot as plt

Данные из таблицы

административные_округа = [ «Центральный», «Северный», «Восточный», «Западный», «Южный», «Юго-Восточный», «Юго-Западный», «Северо-Западный», «Северо-Восточный», «Зеленоградский», «Троицкий», «Новомосковский» ]

количество_водоемов = [10, 7, 13, 13, 14, 6, 15, 22, 11, 7, 3, 2]

Настройка размера графика

plt.figure (figsize=(12, 6))

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

plt.bar (административные_округа, количество_водоемов, color='skyblue', edgecolor='black')

Настройка заголовка и меток

plt.title ('Количество водоёмов по административным округам', fontsize=16, fontweight='bold') plt.xlabel ('Административный округ', fontsize=12) plt.ylabel ('Количество водоёмов', fontsize=12)

Поворот подписей по оси X для удобства чтения

plt.xticks (rotation=45, ha='right', fontsize=10)

Автоматическая подгонка макета

plt.tight_layout ()

Отображение графика

plt.show ()

Исходный размер 1170x570

Второй график

Исходный размер 1024x1024

Семья подумала и решила, что им предпочтительно жить в не густонаселённом округе, так как там спокойней. Отец составил диаграмму корреляции населения и водоемов.

import matplotlib.pyplot as plt import numpy as np from scipy import stats

Данные из таблицы

округа = [ «Центральный», «Северный», «Западный», «Южный», «Юго-Восточный», «Юго-Западный», «Северо-Западный», «Северо-Восточный», «Зеленоградский», «Троицкий», «Новомосковский», «Восточный» ]

количество_водоемов = [10, 7, 13, 14, 6, 15, 22, 11, 7, 3, 2, 13] население = [779352, 1186128, 1395986, 1791187, 1431746, 1446432, 1011387, 1432571, 250173, 130315, 275508, 1524265]

Рассчитываем коэффициент корреляции

correlation = np.corrcoef (население, количество_водоемов)[0, 1]

Настройка размера графика

fig, (ax1, ax2) = plt.subplots (1, 2, figsize=(16, 6))

Левая панель: scatter plot с подписями

for i, округ in enumerate (округа): ax1.scatter (население[i], количество_водоемов[i], s=100, alpha=0.7, edgecolors='black') ax1.annotate (округ, (население[i], количество_водоемов[i]), xytext=(5, 5), textcoords='offset points', fontsize=9)

Линия регрессии

if len (население) > 1: slope, intercept, r_value, p_value, std_err = stats.linregress (население, количество_водоемов) x_line = np.array ([min (население), max (население)]) y_line = intercept + slope * x_line ax1.plot (x_line, y_line, color='red', linewidth=2, linestyle='--') ax1.set_xlabel ('Население округа', fontsize=12) ax1.set_ylabel ('Количество водоёмов', fontsize=12) ax1.set_title (f’Диаграмма рассеяния\nКорреляция: {correlation:.3f}', fontsize=14) ax1.grid (True, alpha=0.3)

Правая панель: таблица с данными для справки

table_data = [] for i in range (len (округа)): table_data.append ([округа[i], f"{население[i]:, }», количество_водоемов[i]])

Создаем таблицу

ax2.axis ('tight') ax2.axis ('off') table = ax2.table (cellText=table_data, colLabels=['Округ', 'Население', 'Водоёмы'], cellLoc='center', loc='center', colWidths=[0.3, 0.3, 0.2])

Стилизация таблицы

table.auto_set_font_size (False) table.set_fontsize (9) table.scale (1.2, 1.5)

Заголовок для таблицы

ax2.set_title ('Данные по округам', fontsize=14, pad=20)

plt.suptitle ('Анализ зависимости количества водоёмов от населения административных округов', fontsize=16, fontweight='bold', y=1.02) plt.tight_layout () plt.show ()

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

print (f"Коэффициент корреляции между населением и количеством водоёмов: {correlation:.3f}») if correlation > 0: print («Положительная корреляция: чем больше населения, тем больше водоёмов.») elif correlation < 0: print («Отрицательная корреляция: чем больше населения, тем меньше водоёмов.») else: print («Корреляция отсутствует.»)

Исходный размер 1280x487

Третий график

Исходный размер 1024x1024
Исходный размер 1344x896

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

import matplotlib.pyplot as plt

Данные из таблицы

округа = [ «Центральный», «Северный», «Восточный», «Западный», «Южный», «Юго-Восточный», «Юго-Западный», «Северо-Западный», «Северо-Восточный», «Зеленоградский», «Троицкий», «Новомосковский» ]

общее_количество = [10, 7, 13, 13, 14, 6, 15, 22, 11, 7, 3, 2] с_зоной_купания = [0, 3, 1, 1, 0, 0, 1, 2, 0, 3, 0, 0]

Настройка размера графика

fig, ax = plt.subplots (figsize=(14, 7))

Создание двух наборов столбцов с наложением

x_pos = range (len (округа))

Первый набор столбцов (все водоёмы) — прозрачный и шире

bars1 = ax.bar (x_pos, общее_количество, width=0.8, alpha=0.6, label='Все водоёмы', color='lightblue', edgecolor='black')

Второй набор столбцов (с зоной купания) — непрозрачный и уже

bars2 = ax.bar (x_pos, с_зоной_купания, width=0.5, label='С зоной для купания', color='salmon', edgecolor='black')

Настройка осей и заголовка

ax.set_xlabel ('Административный округ', fontsize=12) ax.set_ylabel ('Количество водоёмов', fontsize=12) ax.set_title ('Количество водоёмов по административным округам', fontsize=16, fontweight='bold') ax.set_xticks (x_pos) ax.set_xticklabels (округа, rotation=45, ha='right', fontsize=10) ax.legend ()

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

for i, (total, with_swim) in enumerate (zip (общее_количество, с_зоной_купания)): if total > 0: ax.text (i, total + 0.1, f'{total}', ha='center', va='bottom', fontsize=9) if with_swim > 0: ax.text (i, with_swim + 0.1, f'{with_swim}', ha='center', va='bottom', fontsize=9, fontweight='bold', color='darkred')

Автоматическая подгонка макета

plt.tight_layout () plt.show ()

Исходный размер 1280x625

Четвертый график

Мама хочет, чтобы рядом с водоемом также были места для культурного отдыха. Папа составил следующий код:

Исходный размер 896x1344

import matplotlib.pyplot as plt import numpy as np

Данные из таблицы (исключаем строку «всего»)

округа = [ «Центральный», «Северный», «Западный», «Южный», «Юго-Восточный», «Юго-Западный», «Северо-Западный», «Северо-Восточный», «Зеленоградский», «Троицкий», «Новомосковский», «Восточный» ]

всего_водоемов = [10, 7, 13, 14, 6, 15, 22, 11, 7, 3, 2, 13] с_купанием = [0, 3, 1, 0, 0, 1, 2, 0, 3, 0, 0, 1] без_купания = [9, 4, 2, 1, 4, 2, 3, 7, 4, 1, 0, 9] массовый_отдых = [1, 0, 10, 13, 2, 14, 17, 4, 0, 2, 2, 3] # Исправлено название переменной

Проверка: с_купанием + без_купания + массовый_отдых = всего_водоемов

for i in range (len (округа)): if с_купанием[i] + без_купания[i] + массовый_отдых[i] ≠ всего_водоемов[i]: print (f"Несоответствие в {округа[i]}: {с_купанием[i]}+{без_купания[i]}+{массовый_отдых[i]} ≠ {всего_водоемов[i]}»)

Настройка размера графика

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

Позиции для столбцов

x = np.arange (len (округа)) ширина = 0.6

Создание stacked bar chart

p1 = ax.bar (x, с_купанием, ширина, label='С купанием', color='#FF6B6B', edgecolor='black') p2 = ax.bar (x, без_купания, ширина, bottom=с_купанием, label='Без купания', color='#4ECDC4', edgecolor='black') p3 = ax.bar (x, массовый_отдых, ширина, bottom=np.array (с_купанием) + np.array (без_купания), # Исправлено название переменной label='Места массового отдыха', color='#45B7D1', edgecolor='black')

Настройка осей и заголовка

ax.set_xlabel ('Административный округ', fontsize=12, fontweight='bold') ax.set_ylabel ('Количество объектов', fontsize=12, fontweight='bold') ax.set_title ('Распределение водоёмов по категориям по административным округам', fontsize=16, fontweight='bold', pad=20) ax.set_xticks (x) ax.set_xticklabels (округа, rotation=45, ha='right', fontsize=10) ax.legend (loc='upper right')

Добавление подписей для каждого сегмента

def add_labels (bars, bottoms=None): for i, bar in enumerate (bars): height = bar.get_height () if height > 0: # Добавляем только ненулевые значения if bottoms is not None: y = bottoms[i] + height/2 else: y = height/2 ax.text (bar.get_x () + bar.get_width ()/2, y, f'{int (height)}', ha='center', va='center', fontsize=8, color='white' if height > max (всего_водоемов)/4 else 'black', fontweight='bold')

Добавление подписей для каждого сегмента

add_labels (p1) add_labels (p2, с_купанием) add_labels (p3, np.array (с_купанием) + np.array (без_купания))

Добавление общего количества над столбцами

for i, total in enumerate (всего_водоемов): ax.text (i, total + 0.5, f'{total}', ha='center', va='bottom', fontsize=10, fontweight='bold', color='#2C3E50')

Добавление сетки

ax.yaxis.grid (True, alpha=0.3, linestyle='--')

Автоматическая подгонка макета

plt.tight_layout () plt.show ()

Исходный размер 1280x626
Исходный размер 1024x1024

У семьи получилось найти дом мечты, как же хорошо, что папа программист. Сын хорошо закончил школу и поступил в хороший вуз в Москве.

Таблицы, используемые в работе

Промпты к картинкам

  1. anime fanart illustration, slice of life scene, cozy domestic atmosphere masculine and attractive man with strong presence, similar to Toji Fushiguro, dark hair, sharp features, muscular but relaxed, sitting at a computer desk, coding, casual home clothes his wife sitting nearby, beautiful and calm, long hair, elegant but simple look, drinking coffee, warm and supportive energy their son, around 14 years old, handsome teenage boy, relaxed and creative, sitting nearby, drawing in a sketchbook soft lighting, warm color palette, clean anime lineart, flat shading, subtle grain, nostalgic anime aesthetic, wholesome family moment, japanese illustration style, fanart feeling, pinterest anime mood no photorealism, no 3d render
  2. those two characters together hugging and smiling
  3. illustrated landscape in anime / editorial illustration style, peaceful and inviting atmosphere a beautiful scenic body of water, a calm lake or pond with gentle reflections, surrounded by greenery soft trees, grass, and walking paths around the water near the water there is a small children’s playground, simple and cozy, with a few kids playing nearby stands a cultural building, a small museum or gallery, modern but warm architecture the place feels like a public space where people relax, walk, and spend time together warm natural daylight, soft summer lighting, pleasant color palette clean lineart, flat shading, slightly painterly feel slice of life mood, calm urban nature, wholesome and friendly vibes japanese illustration / pinterest aesthetic no photorealism, no 3d render 4.generate a teenage boy who is about 15 years old and is dressed as a skater and nettspend
  1. A serene urban pond next to a public space like a museum, surrounded by lush greenery and well-maintained paths, benches, and art installations, soft natural lighting, realistic reflections on the water, vertical format, detailed environment, cinematic composition
  2. those two characters together hugging and smiling

Используемые ресурсы и описание применения генеративных моделей

Midjourney: https://www.midjourney.com/imagine — для создания картинок Chat GPT-5 mini https://platform.openai.com/docs/models/gpt-5-mini — для корректировки промпта для Миджорни (я вводила своими словами текст промпта, а нейросеть ее грамотно организовывала) DeepSeek https://www.deepseek.com/en — для корректировки и проверки написания кодов, написанных для проекта (проверку проходили все коды, которые представлены в проекте) https://pythononlinecompiler.ru/ — для создания графиков

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