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

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

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

Общая информация

  • Авторы: Студентки группы - PolezhaevaMA, Самира Мохаммад
  • Дата исследования: 15 апрель 2026
  • Источник данных: USGS Earthquake Hazards Program
  • Период анализа: последние 30 дней

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

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

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

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

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

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. Динамика магнитуды

Динамика магнитуды за последние 30 дней

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

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

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

Глубина очага землетрясения

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

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

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

Широта эпицентра

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

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

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

Показатель Значение
Всего землетрясений (M ≥ 4.5) 549
Максимальная магнитуда 7.5 М
Средняя магнитуда 4.86 М
Максимальная глубина 650 км
Минимальная глубина 6 км

Выводы

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

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

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

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

Используемые технологии

Компонент Технология Назначение
API USGS FDSN Web Service Получение данных о землетрясениях в реальном времени
Язык программирования Python Основной язык разработки
HTTP-запросы Requests Отправка запросов к API и получение ответов
Обработка данных Pandas Структурирование, фильтрация и анализ данных
Визуализация Matplotlib Построение графиков магнитуды, глубины и широты
Работа с JSON json Парсинг ответов API
Работа с данными datetime Вычисление временных интервалов
Формат хранения CSV Сохранение результатов для дальнейшего анализа

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