Мировая сейсмическая активность за последние 30 дней

Материал из Поле цифровой дидактики

Мониторинг мировой сейсмической активности

Метаинформация

  • Автор: Студент(ки) группы ИНДОР-211 - [PolezhaevaMA]
  • Дата исследования: 19 апрель 2026
  • Источник данных: USGS Earthquake Hazards Program
  • Период анализа: последние 30 дней
  • Порог магнитуды: M ≥ 4.5

Цель исследования

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

Задачи проекта

  1. Собрать данные о землетрясениях магнитудой ≥ 4.5 через USGS API
  2. Обработать и структурировать данные с помощью библиотеки Pandas
  3. Построить три графика: динамика магнитуды, распределение глубин, широтное смещение эпицентров
  4. Рассчитать основные статистические показатели
  5. Интерпретировать полученные результаты

Гипотеза исследования

За 30-дневный период наблюдается корреляция между магнитудой землетрясений и их глубиной: наиболее сильные события происходят в зонах субдукции на глубинах 70-300 км.

Программный код

import requests
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime, timedelta
import json

# ==================================================
# НАСТРОЙКИ - ЗЕМЛЕТРЯСЕНИЯ (USGS)
# ==================================================
REGION_NAME = "Весь мир (M ≥ 4.5)"

# Даты: последние 30 дней
end_date = datetime.now().date()
start_date = end_date - timedelta(days=30)

# URL для USGS API
URL = (
    f"https://earthquake.usgs.gov/fdsnws/event/1/query?"
    f"format=geojson&"
    f"starttime={start_date}&"
    f"endtime={end_date}&"
    f"minmagnitude=4.5&"
    f"orderby=time"
)

print(f"Запрашиваем данные о землетрясениях за последние 30 дней...")
print(f"URL: {URL}")

try:
    response = requests.get(URL, timeout=30)
    print(f"Статус ответа: {response.status_code}")
    
    if response.status_code == 200 and response.text.strip():
        data = response.json()
        print("✓ JSON успешно загружен")
    else:
        print("✗ Пустой ответ от сервера")
        exit()
        
except requests.exceptions.RequestException as e:
    print(f"Ошибка запроса: {e}")
    exit()
except json.JSONDecodeError as e:
    print(f"Ошибка парсинга JSON: {e}")
    exit()

# Извлекаем данные
events = []
for feature in data.get('features', []):
    props = feature['properties']
    coords = feature['geometry']['coordinates']
    events.append({
        'Время': props['time'],
        'Магнитуда': props['mag'],
        'Место': props['place'],
        'Широта, °': coords[1],
        'Долгота, °': coords[0],
        'Глубина, км': coords[2]
    })

if not events:
    print("Землетрясений за указанный период не найдено.")
    exit()

# Создаём DataFrame
df = pd.DataFrame(events)
df['Время'] = pd.to_datetime(df['Время'], unit='ms')
df = df.sort_values('Время')

print(f"✓ Найдено {len(df)} землетрясений магнитудой ≥ 4.5")

# Сохраняем в CSV
df.to_csv('earthquake_data_30days.csv', index=False, encoding='utf-8')
print("Данные сохранены в 'earthquake_data_30days.csv'")

# ==================================================
# ВИЗУАЛИЗАЦИЯ (ТРИ ГРАФИКА)
# ==================================================
fig, axes = plt.subplots(3, 1, figsize=(14, 10), sharex=True)

# ГРАФИК 1: Магнитуда (как температура)
axes[0].plot(df['Время'], df['Магнитуда'], color='red', marker='o', linewidth=1, markersize=4)
axes[0].set_title(f'Магнитуда землетрясений за последние 30 дней (M ≥ 4.5)')
axes[0].set_ylabel('Магнитуда')
axes[0].axhline(y=6.0, color='orange', linestyle='--', alpha=0.7, label='Сильное (M≥6)')
axes[0].axhline(y=7.0, color='red', linestyle='--', alpha=0.7, label='Крупное (M≥7)')
axes[0].legend()
axes[0].grid(True)

# ГРАФИК 2: Глубина (как осадки)
colors = ['darkblue' if d < 70 else 'lightblue' for d in df['Глубина, км']]
axes[1].bar(df['Время'], df['Глубина, км'], color=colors, alpha=0.7, width=0.04)
axes[1].set_title('Глубина очага землетрясения')
axes[1].set_ylabel('Глубина, км')
axes[1].axhline(y=70, color='red', linestyle='--', alpha=0.5, label='Граница (70 км)')
axes[1].legend()
axes[1].grid(True)

# ГРАФИК 3: Широта эпицентра (как скорость ветра)
axes[2].plot(df['Время'], df['Широта, °'], color='green', marker='s', linewidth=1, markersize=4)
axes[2].set_title('Широта эпицентра (географическое смещение)')
axes[2].set_ylabel('Широта, °')
axes[2].set_xlabel('Дата и время')
axes[2].axhline(y=0, color='black', linestyle='--', alpha=0.5, label='Экватор')
axes[2].legend()
axes[2].grid(True)

plt.tight_layout()
plt.savefig('earthquake_3graphs_30days.png', dpi=150, bbox_inches='tight')
plt.show()

# ==================================================
# СТАТИСТИКА
# ==================================================
print("\n" + "="*50)
print("СТАТИСТИКА ЗЕМЛЕТРЯСЕНИЙ ЗА 30 ДНЕЙ")
print("="*50)
print(f"Всего событий: {len(df)}")
print(f"Самое сильное: M{df['Магнитуда'].max():.1f}")
print(f"Средняя магнитуда: {df['Магнитуда'].mean():.2f}")
print(f"Самое глубокое: {df['Глубина, км'].max():.0f} км")
print(f"Самое мелкое: {df['Глубина, км'].min():.0f} км")
print(f"Средняя глубина: {df['Глубина, км'].mean():.0f} км")
print(f"Период: с {start_date} по {end_date}")

Результаты визуализации

График 1. Динамика магнитуды

Файл:Earthquake 3graphs 30days.png
Три графика сейсмической активности: магнитуда, глубина, широта

Анализ графика магнитуды:

  • Красная линия показывает изменение силы землетрясений во времени
  • Оранжевая пунктирная линия — порог сильного землетрясения (M ≥ 6)
  • Красная пунктирная линия — порог крупного землетрясения (M ≥ 7)
  • Точки соответствуют отдельным сейсмическим событиям

График 2. Глубина очага

Анализ графика глубин:

  • Темно-синие столбцы — землетрясения в земной коре (до 70 км)
  • Голубые столбцы — глубокие землетрясения (>70 км)
  • Красная пунктирная линия — граница между корой и мантией

График 3. Широта эпицентра

Анализ широтного распределения:

  • Зеленая линия показывает изменение широты эпицентров во времени
  • Черная пунктирная линия — экватор (0°)
  • Положительные значения — северное полушарие, отрицательные — южное

Статистические результаты

Показатель Значение
Всего землетрясений (M ≥ 4.5) (заполняется после выполнения)
Максимальная магнитуда M (заполняется)
Средняя магнитуда M (заполняется)
Максимальная глубина (заполняется) км
Минимальная глубина (заполняется) км
Средняя глубина (заполняется) км

Выводы

На основе анализа трех графиков можно сделать следующие выводы:

  1. По магнитуде: большинство землетрясений имеют магнитуду в диапазоне 4.5-5.5, крупные события (M≥7) происходят редко
  2. По глубине: преобладают неглубокие землетрясения (0-70 км), что соответствует зонам разломов земной коры
  3. По широте: эпицентры концентрируются в Тихоокеанском огненном кольце (между 60° ю.ш. и 60° с.ш.)

Практическая значимость

  • Для науки: создана методика анализа сейсмических данных с открытым кодом
  • Для экологии: определены зоны повышенной сейсмической опасности
  • Для образования: разработан учебный кейс по работе с реальными API

Используемые источники данных