(обложка проекта создана при помощи нейросети Ai Leonardo)
Концепция
В современном мире все больше людей ведут здоровый образ жизни. Один из способов заботы о здоровье — отказ от общественного транспорта или автомобиля в пользу пешеходных или велосипедных прогулок как метода достижения точки интереса и поддержания спортивной формы. Мне было интересно проанализировать насколько людям в столице удобно передвигаться по городу при помощи велосипеда, есть ли возможность оставить свой личный транспорт в том или ином месте.
База данных
В качестве data set' а я использовала данные с сайта http://data.mos.ru/ — портал открытых данных Правительства Москвы. База данных об учреждениях досуга и отдыха, ЖКХ, здравоохранения, образования и т. д., а также приложения для мобильных устройств на основе этих данных. Получить доступ к использования данных с этого портала можно с помощью API портала открытых данных.
Инфографика
Общий код для графиков
Установка библиотек ! pip install pandas matplotlib seaborn
Импорт библиотек import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from matplotlib import font_manager as fm # Для работы с пользовательскими шрифтами
Загрузка шрифта font_path = «/content/TT Neoris Trial Regular.ttf» custom_font = fm.FontProperties (fname=font_path)
Загрузка данных df = pd.read_csv ('/content/data-916-23.12.2024.csv')
Распределение велосипедных парковок по Административным округам Москвы
Пояснение
Чтобы понять, в каком Административном округе Москвы наиболее удобно или неудобно оставить велосипед, я составила столбчатую диаграмму
код для графика
Просмотр первых строк данных print (df.head ())
Подсчет количества парковок в каждом административном округе admarea_counts = df['AdmArea'].value_counts ()
Вывод данных для визуализации print (admarea_counts)
Настройка стиля sns.set_style («whitegrid»)
Создание bar plot plt.figure (figsize=(10, 6)) sns.barplot (x=admarea_counts.index, y=admarea_counts.values, palette='Blues')
Применение шрифта plt.title ( 'Распределение велосипедных парковок по административным округам', fontsize=16, fontproperties=custom_font Примение шрифта к заголовку ) plt.xlabel ('Административный округ', fontsize=14, fontproperties=custom_font) Шрифт для оси X plt.ylabel ('Количество парковок', fontsize=14, fontproperties=custom_font) Шрифт для оси Y
Применение шрифта к подписям на оси X for label in plt.gca ().get_xticklabels (): label.set_fontproperties (custom_font)
Применение шрифта к подписям на оси Y for label in plt.gca ().get_yticklabels (): label.set_fontproperties (custom_font)
Применение шрифта к аннотациям (если они есть) for text in plt.gca ().texts: text.set_fontproperties (custom_font)
plt.xticks (rotation=45) Поворот подписей по оси X plt.tight_layout () Автоматическая настройка layout plt.show ()
Распределение велосипедных парковок по районам Москвы (Топ 5)
Пояснение
Далее я сократила площадь поиска парковки до районов, чтобы жители столицы могли рассчитать, в каком конкретно месте больше всего парковок для велосипеда
код для графика
Просмотр первых строк данных print (df.head ())
Подсчет количества парковок в каждом районе district_counts = df['District'].value_counts ()
Выбор топ-5 районов top_districts = district_counts.head (5)
Остальные районы в категорию «Другие» other_districts = pd.Series ([district_counts[5:].sum ()], index=['Другие'])
Объединение топ-5 районов и категории «Другие» top_districts = pd.concat ([top_districts, other_districts])
Вывод данных для pie-chart print (top_districts)
Настройка стиля sns.set_style («whitegrid»)
Создание pie-chart plt.figure (figsize=(8, 8)) plt.pie ( top_districts, labels=top_districts.index, autopct='%1.1f%%', startangle=140, colors=sns.color_palette ('Blues', len (top_districts))
textprops={'fontproperties': custom_font} Примение шрифта ) plt.title ( 'Распределение велосипедных парковок по районам (Топ-5)', fontsize=16, fontproperties=custom_font Примение шрифта к заголовку ) plt.show ()
Соотношение адресного ориентира и района
Пояснение
С помощью Python я высчитала среднее количество парковок, чтобы велосипедисты могли рассчитать, где им будет удобнее оставить транспортное средство
код для графика
Просмотр первых строк данных print (df.head ())
Преобразование столбца Capacity в число df['Capacity'] = pd.to_numeric (df['Capacity'], errors='coerce')
если Capacity не удалось преобразовать в число df = df.dropna (subset=['Capacity'])
Вычисление среднего, максимального и минимального количества мест mean_capacity = df['Capacity'].mean () max_capacity = df['Capacity'].max () min_capacity = df['Capacity'].min ()
Создание DataFrame для визуализации data = pd.DataFrame ({ 'Metric': ['Среднее', 'Максимум', 'Минимум'], 'Capacity': [mean_capacity, max_capacity, min_capacity] })
Вывод данных для визуализации print (data)
Настройка стиля sns.set_style («whitegrid»)
Создание bar plot plt.figure (figsize=(8, 5)) sns.barplot (x='Capacity', y='Metric', data=data, palette='Blues')
Применение шрифта plt.title ( 'Среднее, максимальное и минимальное количество мест', fontsize=16, fontproperties=custom_font Примение шрифта к заголовку ) plt.xlabel ('Количество мест', fontsize=14, fontproperties=custom_font) Шрифт для оси X plt.ylabel ('Метрика', fontsize=14, fontproperties=custom_font)
plt.ylabel ('Метрика', fontsize=14, fontproperties=custom_font) Шрифт для оси Y
Применение шрифта к подписям на оси X for label in plt.gca ().get_xticklabels (): label.set_fontproperties (custom_font)
Применение шрифта к подписям на оси Y for label in plt.gca ().get_yticklabels (): label.set_fontproperties (custom_font)
plt.tight_layout () Автоматическая настройка layout plt.show ()
Соотношение Адресного ориентира и Района
Пояснение
Также в данных о велосипедных парковках Москвы указаны ориентиры, по которым велосипедистам будет удобнее найти парковку, однако не все они так близки к ориентиру. Для этого я сделала точечную диаграмму для первых 100 срок в таблице, в которой показано насколько близок ориентир к району
код для графика
plt.rcParams['font.size'] = 6 Размер шрифта для всех элементов
Визуализация данных с использованием оттенков синего plt.figure (figsize=(12, 8)) sns.scatterplot (data=df_short, x='Address', y='District', hue='District', palette='Blues', s=100) plt.title ('Соотношение Адресного ориентира и Района (первые 100 строк)', fontsize=12) Размер шрифта для заголовка plt.xlabel ('Адресный ориентир', fontsize=10) Размер шрифта для оси X plt.ylabel ('Район', fontsize=10) Размер шрифта для оси Y plt.xticks (rotation=90) Поворот подписей по оси X plt.tight_layout () Автоматическая настройка layout для предотвращения наложения текста plt.show ()
Соотношение количества велосипедных парковок на район
Пояснение
Приведенный ниже график описывает количество мест парковки велосипедов на район
код для графика
Преобразуем столбец 'Capacity' в числовой тип данных df['Capacity'] = pd.to_numeric (df['Capacity'], errors='coerce')
Задаем порог для количества мест capacity_threshold = 10 # Например, оставляем только районы с Capacity > 10
Фильтр df_filtered = df[df['Capacity'] > capacity_threshold]
Проверяем, есть ли данные после фильтрации if df_filtered.empty: print («Нет данных, удовлетворяющих условию фильтрации. Попробуйте уменьшить порог capacity_threshold.») else: # Группировка данных по отфильтрованным районам и количеству мест heatmap_data = df_filtered.groupby (['District', 'Capacity']).size ().unstack (fill_value=0)
Проверяем, есть ли данные после группировки
if heatmap_data.empty:
print («Нет данных для построения графика. Проверьте исходные данные.»)
else:
Визуализация в виде тепловой карты
plt.figure (figsize=(12, 8))
sns.heatmap (
heatmap_data,
cmap='Blues',
annot=True,
fmt='d',
linewidths=0.5,
annot_kws={'size': 8, 'va': 'center', 'ha': 'center', 'fontproperties': custom_font} Применяем шрифт к аннотациям
)
plt.title ( f’Соотношение Количества мест и Района (Capacity > {capacity_threshold})', fontsize=14, fontproperties=custom_font Примение шрифт к заголовку ) plt.xlabel ('Количество мест', fontsize=12, fontproperties=custom_font) Шрифт для оси X plt.ylabel ('Район', fontsize=12, fontproperties=custom_font) Шрифт для оси Y
Применение шрифта к подписям на оси X
for label in plt.gca ().get_xticklabels ():
label.set_fontproperties (custom_font)
Применение шрифта к подписям на оси Y
for label in plt.gca ().get_yticklabels ():
label.set_fontproperties (custom_font)
plt.tight_layout ()
plt.show ()
Уточнение данных широты
Пояснение
И последний график для продвинутых велопутешественников, который уточняет данные по широте в которой находится парковка относительно данных центра
код для графика
plt.xlabel ( 'Долгота (Longitude_WGS84)', fontsize=14, fontproperties=custom_font Применение шрифта к подписи оси X ) plt.ylabel ( 'Долгота центра (longitude_center)', fontsize=14, fontproperties=custom_font # Применение шрифта к подписи оси Y )
Применение шрифта к подписям на оси X for label in plt.gca ().get_xticklabels (): label.set_fontproperties (custom_font)
Применение шрифта к подписям на оси Y for label in plt.gca ().get_yticklabels (): label.set_fontproperties (custom_font)
plt.grid (True) # Добавление сетки plt.tight_layout () # Автоматическая настройка layout plt.show ()
Все данные, использованные в проекте



