Исходный размер 853x1280

Анализ археологических находок на реконструируемых улицах Москвы

PROTECT STATUS: not protected

Введение

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

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

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

Цветовое оформление

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

Типы графиков

Столбчатая диаграмма Линейная диаграмма Круговая диаграмма Гистограмма

Начало работы

При работе с датой я использовала Google Colab. Я добавила строку «df.info ()», чтобы понять, сколько строк в таблице, сколько столбцов, как называются столбцы и что лежит в каждом столбце — текст, числа или даты. Также я перевела строку DateOfDiscovery из типа object (текст) в формат даты и выделила год.

df[«DateOfDiscovery»] = pd.to_datetime (df[«DateOfDiscovery»], errors="coerce») df[«Year»] = df[«DateOfDiscovery»].dt.year

df[[«DateOfDiscovery», «Year»]].head ()

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

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

СТОЛБЧАТАЯ ДИАГРАММА: каково было предназначение находки: предмет быта, монеты, часть декора и т. д.

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

Для данной диаграммы я сначала создала функцию классификации:

def classify_finding (text): text = str (text).lower ()

if any (word in text for word in [«монет», «деньг», «копейк», «рубл»]):
    return «Монеты»
elif any (word in text for word in [«посуда», «горш», «чаш», «бутыл», «сосуд»]):
    return «Предметы быта»
elif any (word in text for word in [«декор», «лепнин», «орнамент», «фрагмент»]):
    return «Элементы декора»
elif any (word in text for word in [«оруж», «наконечник», «меч»]):
    return «Оружие»
else:
    return «Прочее»

После этого я создала новую колонку «Тип находки».

df[«FindingType»] = df[«DescriptionOfFinding»].apply (classify_finding)

df[«FindingType»].value_counts ()

Создав новую колонку, я смогла приступить к составлению графика:

type_counts = df[«FindingType»].value_counts ()

plt.figure (figsize=(9,5)) type_counts.plot (kind="bar»)

plt.title («Распределение находок по типам») plt.xlabel («Тип находки») plt.ylabel («Количество») plt.xticks (rotation=30, ha="right») plt.tight_layout () plt.show ()

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

КРУГОВАЯ ДИАГРАММА: на каком расстоянии от центра Москвы были найдены артефакты

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

Сначала я выполнила импорт и проверку колонки:

import pandas as pd import matplotlib.pyplot as plt import math import re

df[«geodata_center»].head (5)

Потом извлекла координаты из geodata_center:

def parse_two_numbers (x): if pd.isna (x): return (None, None) s = str (x) nums = re.findall (r"-? \d+.\d+», s) # ищем числа вида 37.62 и 55.75 if len (nums) < 2: return (None, None)

a = float (nums[0])
b = float (nums[1])

# Москва: широта ~55, долгота ~37
# если первое похоже на долготу, а второе на широту -&gt; (lat=b, lon=a)
if 30 &lt;= a &lt;= 45 and 50 &lt;= b &lt;= 60:
    lon, lat = a, b
# если наоборот
elif 50 &lt;= a &lt;= 60 and 30 &lt;= b &lt;= 45:
    lat, lon = a, b
else:
    # если не уверены — оставим как есть (потом проверим)
    lon, lat = a, b

return (lat, lon)

df[[«Lat», «Lon»]] = df[«geodata_center»].apply (lambda x: pd.Series (parse_two_numbers (x))) df[[«geodata_center», «Lat», «Lon»]].head (10)

Считываю расстояние от центра Москвы:

CENTER_LAT = 55.7522 CENTER_LON = 37.6156

def haversine_km (lat1, lon1, lat2, lon2): R = 6371.0 phi1, phi2 = math.radians (lat1), math.radians (lat2) dphi = math.radians (lat2 — lat1) dlambda = math.radians (lon2 — lon1) a = math.sin (dphi/2)2 + math.cos (phi1)*math.cos (phi2)*math.sin (dlambda/2)2 return 2 * R * math.atan2(math.sqrt (a), math.sqrt (1 — a))

df[«Dist_km»] = df.apply ( lambda r: haversine_km (r[«Lat»], r[«Lon»], CENTER_LAT, CENTER_LON) if pd.notna (r[«Lat»]) and pd.notna (r[«Lon»]) else pd.NA, axis=1 )

df[«Dist_km»].describe ()

Делю расстояние на группы и кольца:

valid = df[df[«Dist_km»].notna ()].copy ()

bins = [0, 2, 5, 10, 15, 25, 50, 10_000] labels = [«0–2 км», «2–5 км», «5–10 км», «10–15 км», «15–25 км», «25–50 км», «50+ км»]

valid[«Dist_group»] = pd.cut (valid[«Dist_km»], bins=bins, labels=labels, include_lowest=True)

valid[«Dist_group»].value_counts ().sort_index ()

Выполнив все подготовительные действия строю круговую диаграмму:

import matplotlib.pyplot as plt

counts = df[«Dist_group»].value_counts ().sort_index ()

plt.figure (figsize=(8,8)) counts.plot (kind="pie», autopct="%1.1f%%», startangle=90) plt.title («Находки по расстоянию от центра Москвы») plt.ylabel (»») plt.tight_layout () plt.show ()

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

ЛИНЕЙНАЯ ДИАГРАММА: количество находок по годам

Для этого графика я взяла данные о дате нахождения артефактов, указанной в формате день/месяц/год.

by_year = df[«Year»].value_counts ().sort_index ()

plt.figure (figsize=(9,4)) by_year.plot (kind="line», marker="o») plt.title («Количество находок по годам») plt.xlabel («Год») plt.ylabel («Количество») plt.grid (True, alpha=0.3) plt.tight_layout () plt.show ()

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

ГИСТОГРАММА: количество находок по месяцам

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

df[«Month»] = df[«DateOfDiscovery»].dt.month by_month = df[«Month»].value_counts ().sort_index ()

plt.figure (figsize=(9,4)) by_month.plot (kind="bar») plt.title («Количество находок по месяцам») plt.xlabel («Месяц») plt.ylabel («Количество») plt.xticks (rotation=0) plt.tight_layout () plt.show ()

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

Итог

В результате обработки данных был сформирован итоговый датасет, на основе которого были построены графики. Он включает исходные поля и дополнительные признаки, полученные в ходе анализа (год обнаружения, тип находки, географическая группировка и расстояние от центра города). Итоговый датасет был сохранён в формате CSV для дальнейшего использования и воспроизводимости анализа.

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

Инструменты

Для данного проекта использовались данные с сайта: http://data.mos.ru/ Исходный датасет: Археологические находки на реконструируемых улицах | Портал открытых данных Правительства Москвы

Для визуального оформления проекта использовались нейросети: Chat GPT https://chatgpt.comChatGPT Gemeni https://gemini.google.comGemini

Для подбора референсов использовалось приложение: Pinterest https://ru.pinterest.comПинтерест

Исходный размер 1280x400
Анализ археологических находок на реконструируемых улицах Москвы
Проект создан 05.02.2026