1. Introdução
Problema. Quando ouvimos falar de um terremoto, a primeira pergunta costuma ser “qual foi a magnitude?”. Mas magnitude mede a energia liberada, não o que acontece com as pessoas. Um M7 no meio do oceano pode passar despercebido, enquanto um M5,5 perto de uma grande cidade pode ser devastador.
Pergunta central. Magnitude é um bom indicador do risco para as pessoas? Ou a localização (zona tectônica, profundidade, densidade populacional) pesa mais?
Por que importa. Órgãos de defesa civil, seguradoras e governos precisam priorizar recursos. Entender quais eventos expõem mais gente, e não apenas quais são mais fortes, ajuda a direcionar alertas e preparação.
Abordagem. Usamos 10.000 eventos sísmicos do catálogo do USGS, limpamos e organizamos os dados, extraímos informações de campos de texto, identificamos o país de cada evento e cruzamos com dados de população (raster global do GPW/SEDAC) para estimar quantas pessoas vivem ao redor de cada epicentro. Depois comparamos magnitude, profundidade, zona tectônica e população exposta.
Para quem. Analistas de risco, gestores públicos e qualquer pessoa interessada em entender por que alguns terremotos são mais perigosos que outros.
2. Pacotes requeridos
library(tidyverse) # manipulação (dplyr, tidyr), gráficos (ggplot2), leitura (readr), strings (stringr)
library(lubridate) # conversão e extração de datas
library(janitor) # padronização de nomes de colunas (clean_names)
library(sf) # dados espaciais vetoriais (pontos, países)
library(rnaturalearth) # mapa de países (polígonos)
library(terra) # raster de população e cálculo de população em buffers
library(geodata) # download do raster de população global (GPW)
library(WDI) # indicadores do Banco Mundial (população e PIB por país)
library(plotly) # gráficos interativos
library(DT) # tabelas interativas
library(leaflet) # mapa interativo
library(kableExtra) # tabelas formatadas
library(tidytext) # mineração de texto
library(ggridges) # gráficos de densidade por grupo
library(scales) # formatação de eixos (vírgulas, notação)
3. Preparação dos dados
3.1 Fonte e contexto
Os dados vêm do Kaggle (Global
Earthquakes Seismic Telemetry), que reúne 10.000 eventos com
magnitude entre 4,5 e 7,8. Os campos de medição (tempo, coordenadas,
profundidade, magnitude, estações etc.) seguem o formato do catálogo do
USGS.
Colunas como magnitude_severity_class,
focal_depth_regime, tsunami_hazard_potential,
tectonic_boundary_zone, evidence_span,
cot_rationale e confidence_score são anotações
adicionadas depois à medição original.
Peculiaridades:
timeestá em milissegundos desde 1970 (época Unix), não em data legível.placeé texto livre (“45 km SW of Cidade, País”), com formatos diferentes para eventos no mar.- As variáveis de qualidade da medição (
nst,gap,dmin,rms) vêm preenchidas em todos os eventos, ou seja, não há valores ausentes para tratar. - As classes de severidade são muito desbalanceadas (94% moderados).
eq_raw <- read_csv("~/Downloads/archive/global_earthquakes_seismic.csv")
dim(eq_raw)
## [1] 10000 25
3.2 Limpeza e transformação
A tabela abaixo mostra as primeiras linhas das colunas que mais
precisam de ajuste: time (número gigante, não é uma data),
place (texto livre) e as colunas de texto
mag_type, net e status, que podem
misturar maiúsculas e minúsculas.
# Função auxiliar para tabelas compactas
tabela <- function(df, cap) {
df |>
kbl(caption = cap) |>
kable_styling(bootstrap_options = c("striped", "condensed"), full_width = FALSE, font_size = 12)
}
# Cópia só com nomes padronizados, para comparar antes/depois
eq_raw_l <- clean_names(eq_raw)
eq_raw_l |>
dplyr::select(type, time, place, mag_type, net, status, tsunami) |>
head(5) |>
mutate(time = format(time, scientific = FALSE)) |>
tabela("ANTES: primeiras linhas dos dados brutos (colunas a ajustar)")
| type | time | place | mag_type | net | status | tsunami |
|---|---|---|---|---|---|---|
| earthquake | 1791884908205 | 71 km SW of Tambolaka, Indonesia | mb | us | reviewed | 0 |
| earthquake | 1791884472899 | 9 km NE of Boshkengash, Tajikistan | mb | us | reviewed | 0 |
| earthquake | 1791880708325 | southern Mid-Atlantic Ridge | mb | us | reviewed | 0 |
| earthquake | 1791873544944 | 14 km WNW of Río Grande, Panama | mb | us | reviewed | 0 |
| earthquake | 1791871284155 | 124 km N of Pagudpud, Philippines | mb | us | reviewed | 0 |
As etapas de limpeza são:
- Padronizar nomes das colunas
(
clean_names), por exemplomagTypeviramag_type. - Filtrar apenas
type == "earthquake", para não misturar outros tipos de evento. - Converter
timede milissegundos (época Unix) para data e hora, e extrair ano, mês e hora. - Padronizar o texto de
mag_type,statusenetpara minúsculas. - Converter para fator as classes de severidade e de profundidade, com a ordem correta dos níveis.
- Separar
placeem distância, direção, local e região (regex). - Unir ano e mês em uma chave
ano_mes.
eq <- eq_raw_l |>
filter(type == "earthquake") |> # mantém só terremotos
mutate(
datetime = as_datetime(time / 1000), # ms -> data/hora UTC
ano = year(datetime), mes = month(datetime, label = TRUE), hora = hour(datetime),
across(c(mag_type, status, net), str_to_lower), # padroniza texto
mag_class = factor(magnitude_severity_class,
levels = c("moderate", "strong", "major", "great_catastrophic")),
depth_regime = factor(focal_depth_regime,
levels = c("shallow_crustal", "intermediate_subduction", "deep_mantle_slab")),
tsunami = as.logical(tsunami)
) |>
# SEPARAR: place em distância, direção, local e região
tidyr::extract(place, into = c("dist_km", "direcao", "local", "regiao"),
regex = "^(\\d+)\\s*km\\s+([NSEW]{1,3})\\s+of\\s+(.*?),\\s*(.*)$",
remove = FALSE, convert = TRUE) |>
# UNIR: chave ano-mês
unite("ano_mes", ano, mes, sep = "-", remove = FALSE)
Veja o resultado nas mesmas linhas de antes, agora com as novas colunas geradas:
eq |>
dplyr::select(datetime, place, dist_km, direcao, local, regiao, ano_mes, mag_type, net, status, tsunami) |>
head(6) |>
tabela("")
| datetime | place | dist_km | direcao | local | regiao | ano_mes | mag_type | net | status | tsunami |
|---|---|---|---|---|---|---|---|---|---|---|
| 2026-10-13 09:48:28 | 71 km SW of Tambolaka, Indonesia | 71 | SW | Tambolaka | Indonesia | 2026-out | mb | us | reviewed | FALSE |
| 2026-10-13 09:41:12 | 9 km NE of Boshkengash, Tajikistan | 9 | NE | Boshkengash | Tajikistan | 2026-out | mb | us | reviewed | FALSE |
| 2026-10-13 08:38:28 | southern Mid-Atlantic Ridge | NA | NA | NA | NA | 2026-out | mb | us | reviewed | FALSE |
| 2026-10-13 06:39:04 | 14 km WNW of Río Grande, Panama | 14 | WNW | Río Grande | Panama | 2026-out | mb | us | reviewed | FALSE |
| 2026-10-13 06:01:24 | 124 km N of Pagudpud, Philippines | 124 | N | Pagudpud | Philippines | 2026-out | mb | us | reviewed | FALSE |
| 2026-10-13 05:44:46 | central Mid-Atlantic Ridge | NA | NA | NA | NA | 2026-out | mww | us | reviewed | FALSE |
Os eventos cujo place não segue o padrão “N km DIREÇÃO
of Local, Região” (por exemplo, “Mid-Atlantic Ridge”) ficam com
NA nas colunas separadas, o que é esperado.
3.3 Identificando o país de cada evento
Usamos as coordenadas, que são mais confiáveis que o texto de
place. Eventos no mar são atribuídos ao país mais
próximo.
sf_use_s2(FALSE) # evita problemas de geometria no join (aproximação plana)
paises <- ne_countries(scale = "medium", returnclass = "sf") |>
dplyr::select(iso3 = adm0_a3, pais = name)
eq_sf <- st_as_sf(eq, coords = c("longitude", "latitude"), crs = 4326, remove = FALSE)
eq_sf$pais_idx <- st_nearest_feature(eq_sf, paises)
eq_sf$iso3 <- paises$iso3[eq_sf$pais_idx]
eq_sf$pais <- paises$pais[eq_sf$pais_idx]
Duas colunas novas foram criadas: pais e
iso3 (código de 3 letras, usado para cruzar com o Banco
Mundial). Uma amostra de eventos mostra como o texto original de
place se compara ao país atribuído, e a segunda tabela
mostra os países com mais eventos.
set.seed(42)
eq_sf |>
st_drop_geometry() |>
dplyr::select(place, latitude, longitude, pais, iso3) |>
slice_sample(n = 8) |>
tabela("Amostra de eventos com o país atribuído pelas coordenadas")
| place | latitude | longitude | pais | iso3 |
|---|---|---|---|---|
| 22 km SW of Balangonan, Philippines | 5.4191 | 125.2280 | Philippines | PHL |
| 77 km SW of Basco, Philippines | 19.9722 | 121.4333 | Philippines | PHL |
| 93 km SSW of Hihifo, Tonga | -16.7618 | -174.0509 | Tonga | TON |
| 83 km NNE of Labuan Bajo, Indonesia | -7.8376 | 120.2645 | Indonesia | IDN |
| 75 km SW of San Juan, Peru | -15.9117 | -75.5832 | Peru | PER |
| 74 km ESE of Kokopo, Papua New Guinea | -4.7152 | 152.8329 | Papua New Guinea | PNG |
| Izu Islands, Japan region | 30.3738 | 138.5037 | Japan | JPN |
| 107 km W of Ternate, Indonesia | 0.7935 | 126.4196 | Indonesia | IDN |
eq_sf |>
st_drop_geometry() |>
count(pais, sort = TRUE, name = "eventos") |>
head(8) |>
tabela("Países com mais eventos")
| pais | eventos |
|---|---|
| Russia | 1697 |
| Indonesia | 1342 |
| Philippines | 794 |
| Japan | 723 |
| Tonga | 476 |
| Papua New Guinea | 353 |
| Fiji | 325 |
| S. Geo. and the Is. | 306 |
3.4 Mesclando com dados externos
(a) Indicadores por país (Banco Mundial). Baixamos
população total e PIB per capita de 2020 para cada país e juntamos pela
coluna iso3.
wdi <- WDI(country = "all", indicator = c(pop_pais = "SP.POP.TOTL", pib_pc = "NY.GDP.PCAP.CD"),
start = 2020, end = 2020) |>
dplyr::select(iso3 = iso3c, pop_pais, pib_pc)
eq_sf <- eq_sf |> left_join(wdi, by = "iso3")
eq_sf |>
st_drop_geometry() |>
distinct(pais, iso3, pop_pais, pib_pc) |>
slice_sample(n = 8) |>
mutate(pop_pais = comma(pop_pais), pib_pc = comma(round(pib_pc))) |>
tabela("Amostra de países após o merge com o Banco Mundial (2020)")
| pais | iso3 | pop_pais | pib_pc |
|---|---|---|---|
| St. Vin. and Gren. | VCT | 103,526 | 8,351 |
| Saint Helena | SHN | NA | NA |
| Turkey | TUR | 83,384,680 | 8,798 |
| Pitcairn Is. | PCN | NA | NA |
| Portugal | PRT | 10,297,081 | 22,299 |
| Bolivia | BOL | 11,816,299 | 3,581 |
| Jamaica | JAM | 2,830,739 | 5,299 |
| Madagascar | MDG | 28,953,556 | 451 |
Após o merge, 788 eventos ficaram sem indicador do Banco Mundial (território sem código correspondente ou sem dado em 2020).
(b) População exposta ao redor do epicentro. Estimamos quantas pessoas vivem em um raio que cresce com a magnitude (15 km para M4,5, dobrando a cada unidade de magnitude). É uma heurística simples de “área sentida”, e não um modelo físico de dano.
tibble(Magnitude = c(4.5, 5.5, 6.5, 7.5)) |>
mutate(`Raio considerado (km)` = calc_raio_km(Magnitude)) |>
tabela("Raio de exposição por magnitude")
| Magnitude | Raio considerado (km) |
|---|---|
| 4.5 | 15 |
| 5.5 | 30 |
| 6.5 | 60 |
| 7.5 | 120 |
3.5 Conjunto final e resumo
pop <- eq_final$pop_exposta
fmt <- function(x, acc = 1) number(x, accuracy = acc, big.mark = ".", decimal.mark = ",")
tribble(
~Indicador, ~Valor,
"Eventos", fmt(nrow(eq_final)),
"Período", paste(min(as_date(eq_final$datetime)), "a", max(as_date(eq_final$datetime))),
"Magnitude média", fmt(mean(eq_final$mag), 0.01),
"Profundidade mediana (km)", fmt(median(eq_final$depth), 0.1),
"Países (mais próximo do epicentro)", fmt(n_distinct(eq_final$pais)),
"Eventos sem população no raio estimado", percent(mean(pop == 0), accuracy = 0.1, decimal.mark = ","),
"Eventos fora da área coberta pelo raster", fmt(sum(eq_final$pop_sem_dado)),
"População exposta: mediana (só eventos com população)", fmt(median(pop[pop > 0])),
"População exposta: média", fmt(mean(pop)),
"População exposta: máximo", fmt(max(pop))
) |>
tabela("Resumo do conjunto de dados limpo")
| Indicador | Valor |
|---|---|
| Eventos | 9.998 |
| Período | 2025-07-30 a 2026-10-13 |
| Magnitude média | 4,81 |
| Profundidade mediana (km) | 11,0 |
| Países (mais próximo do epicentro) | 114 |
| Eventos sem população no raio estimado | 69,6% |
| Eventos fora da área coberta pelo raster | 6.899 |
| População exposta: mediana (só eventos com população) | 634 |
| População exposta: média | 1.739 |
| População exposta: máximo | 1.082.322 |
O conjunto final tem 9998 eventos em 114 países. A mediana de população exposta é 0 porque 69,6% dos eventos ocorreram em locais sem população dentro do raio estimado, principalmente oceanos e fossas oceânicas. Considerando só os eventos que atingem alguma população, a mediana sobe para 634, e a média geral (1.739) é puxada por poucos eventos que atingem milhões de pessoas.
A tabela abaixo mostra uma amostra do conjunto final, com as principais variáveis usadas nas análises:
set.seed(2026)
eq_final |>
dplyr::select(datetime, mag, depth, mag_class, tectonic_boundary_zone, pais, tsunami, pop_exposta) |>
slice_sample(n = 10) |>
mutate(datetime = format(datetime, "%Y-%m-%d %H:%M"),
pop_exposta = comma(round(pop_exposta))) |>
tabela("Conjunto final: amostra de 10 eventos")
| datetime | mag | depth | mag_class | tectonic_boundary_zone | pais | tsunami | pop_exposta |
|---|---|---|---|---|---|---|---|
| 2026-04-28 03:49 | 5.0 | 70.800 | moderate | ring_of_fire_pacific | Costa Rica | FALSE | 83,193 |
| 2025-08-14 20:51 | 4.5 | 220.519 | moderate | ring_of_fire_pacific | New Zealand | FALSE | 0 |
| 2026-07-04 12:42 | 5.0 | 10.000 | moderate | mid_ocean_ridge_divergent | Greenland | FALSE | 0 |
| 2026-05-02 14:15 | 4.6 | 61.513 | moderate | ring_of_fire_pacific | Papua New Guinea | FALSE | 703 |
| 2026-07-31 08:31 | 4.9 | 10.000 | moderate | ring_of_fire_pacific | Indonesia | FALSE | 0 |
| 2025-10-30 10:22 | 4.9 | 25.110 | moderate | ring_of_fire_pacific | Russia | FALSE | 0 |
| 2026-10-07 02:49 | 4.8 | 10.000 | moderate | ring_of_fire_pacific | New Caledonia | FALSE | 0 |
| 2026-02-11 04:07 | 4.7 | 10.000 | moderate | ring_of_fire_pacific | Russia | FALSE | 0 |
| 2026-09-26 01:10 | 5.3 | 10.000 | moderate | ring_of_fire_pacific | New Caledonia | FALSE | 0 |
| 2025-12-09 05:44 | 4.5 | 35.000 | moderate | ring_of_fire_pacific | Solomon Is. | FALSE | 0 |
4. Análise exploratória
4.1 Poucos eventos grandes, muitos pequenos
p <- eq_final |>
count(mag_round = round(mag, 1)) |>
ggplot(aes(mag_round, n)) +
geom_col(fill = "#c0392b") +
scale_y_log10(labels = comma) +
labs(title = "Cada degrau de magnitude é muito mais raro",
subtitle = "Escala logarítmica no eixo y (relação de Gutenberg-Richter)",
x = "Magnitude", y = "Número de eventos (log)")
ggplotly(p)
4.2 Onde e a que profundidade acontecem
mundo <- ne_countries(returnclass = "sf")
ggplot() +
geom_sf(data = mundo, fill = "grey95", color = "grey80") +
geom_point(data = eq_final, aes(longitude, latitude, color = tectonic_boundary_zone),
size = 0.6, alpha = 0.6) +
labs(title = "O Anel de Fogo do Pacífico concentra a maior parte dos eventos",
color = "Zona tectônica") +
theme_minimal()
ggplot(eq_final, aes(depth, tectonic_boundary_zone, fill = tectonic_boundary_zone)) +
geom_density_ridges(alpha = 0.7, show.legend = FALSE) +
labs(title = "Eventos profundos concentram-se em zonas de subducção",
x = "Profundidade (km)", y = NULL) +
theme_minimal()
# FORMATO LARGO: contagem de eventos por zona e classe de magnitude
eq_final |>
count(tectonic_boundary_zone, mag_class) |>
pivot_wider(names_from = mag_class, values_from = n, values_fill = 0) |>
kbl(caption = "Eventos por zona tectônica e classe de magnitude") |>
kable_styling(full_width = FALSE)
| tectonic_boundary_zone | moderate | strong | major | great_catastrophic |
|---|---|---|---|---|
| alpide_himalayan_belt | 640 | 28 | 0 | 0 |
| intraplate_stable | 310 | 22 | 2 | 2 |
| mid_ocean_ridge_divergent | 571 | 31 | 4 | 0 |
| ring_of_fire_pacific | 7880 | 466 | 35 | 7 |
4.3 Magnitude não é perigo: a população muda tudo
p2 <- eq_final |>
ggplot(aes(mag, pop_exposta, color = tectonic_boundary_zone,
text = paste0(title, "<br>Pop. exposta: ", comma(pop_exposta)))) +
geom_point(alpha = 0.4) +
scale_y_log10(labels = comma) +
labs(title = "Eventos de mesma magnitude expõem populações muito diferentes",
x = "Magnitude", y = "População exposta (log)", color = "Zona")
ggplotly(p2, tooltip = "text")
4.4 Os eventos mais fortes não são os mais perigosos
top_mag <- eq_final |> slice_max(mag, n = 10, with_ties = FALSE) |>
dplyr::select(title, mag, pais, pop_exposta)
top_pop <- eq_final |> slice_max(pop_exposta, n = 10, with_ties = FALSE) |>
dplyr::select(title, mag, pais, pop_exposta)
top_mag |> mutate(pop_exposta = comma(pop_exposta)) |>
kbl(caption = "Top 10 por magnitude") |> kable_styling(full_width = FALSE)
| title | mag | pais | pop_exposta |
|---|---|---|---|
| M 7.8 - 66 km NNW of Ende, Indonesia | 7.8 | Indonesia | 108,927 |
| M 7.8 - 25 km SW of Kablalan, Philippines | 7.8 | Philippines | 260,570 |
| M 7.8 - 140 km E of Petropavlovsk-Kamchatsky, Russia | 7.8 | Russia | 17,598 |
| M 7.7 - 12 km WSW of Pitaloza Arriba, Panama | 7.7 | Panama | 42,127 |
| M 7.6 - 2025 Aomori Prefecture, Japan Earthquake | 7.6 | Japan | 65,323 |
| M 7.6 - Drake Passage | 7.6 | Antarctica | 0 |
| M 7.5 - 20 km W of Catia La Mar, Venezuela | 7.5 | Venezuela | 486,092 |
| M 7.5 - 158 km W of Neiafu, Tonga | 7.5 | Tonga | 332 |
| M 7.5 - 2025 Southern Drake Passage Earthquake | 7.5 | Antarctica | 0 |
| M 7.4 - 4 km SSW of San José del Palmar, Colombia | 7.4 | Colombia | 205,143 |
top_pop |> mutate(pop_exposta = comma(pop_exposta)) |>
kbl(caption = "Top 10 por população exposta") |> kable_styling(full_width = FALSE)
| title | mag | pais | pop_exposta |
|---|---|---|---|
| M 5.4 - 14 km ESE of Tungi, Bangladesh | 5.4 | Bangladesh | 1,082,322 |
| M 5.8 - 3 km E of Fujishiro, Japan | 5.8 | Japan | 510,053 |
| M 7.5 - 20 km W of Catia La Mar, Venezuela | 7.5 | Venezuela | 486,092 |
| M 6.9 - 9 km WNW of Pematangsiantar, Indonesia | 6.9 | Indonesia | 291,258 |
| M 6.9 - 8 km ESE of Calape, Philippines | 6.9 | Philippines | 278,577 |
| M 7.8 - 25 km SW of Kablalan, Philippines | 7.8 | Philippines | 260,570 |
| M 4.6 - 5 km SSW of Shiroi, Japan | 4.6 | Japan | 234,364 |
| M 6.6 - 29 km ESE of Yilan, Taiwan | 6.6 | Taiwan | 229,343 |
| M 7.2 - 20 km E of San Felipe, Venezuela | 7.2 | Venezuela | 228,953 |
| M 4.6 - 4 km E of Honchō, Japan | 4.6 | Japan | 227,852 |
top_leaf <- eq_final |> slice_max(pop_exposta, n = 300, with_ties = FALSE)
pal <- colorNumeric("YlOrRd", top_leaf$mag)
leaflet(top_leaf) |>
addTiles() |>
addCircleMarkers(~longitude, ~latitude, radius = ~log_pop * 1.5, color = ~pal(mag),
fillOpacity = 0.6, stroke = FALSE,
popup = ~paste0(title, "<br>Mag: ", mag, "<br>Pop. exposta: ", comma(pop_exposta))) |>
addLegend("bottomright", pal = pal, values = ~mag, title = "Magnitude")
4.5 Países: onde o risco se acumula
eq_final |>
group_by(pais) |>
summarise(eventos = n(), mag_max = max(mag),
pop_exposta_total = sum(pop_exposta),
pib_pc = first(pib_pc), .groups = "drop") |>
arrange(desc(pop_exposta_total)) |>
datatable(caption = "Países por população exposta acumulada", rownames = FALSE) |>
formatRound("pop_exposta_total", digits = 0, mark = ".")
4.6 Tsunami: o que diferencia os alertas?
eq_final |>
group_by(tsunami) |>
summarise(n = n(), mag_mediana = median(mag), prof_mediana = median(depth), .groups = "drop") |>
kbl(caption = "Eventos com e sem alerta de tsunami") |> kable_styling(full_width = FALSE)
| tsunami | n | mag_mediana | prof_mediana |
|---|---|---|---|
| FALSE | 9914 | 4.7 | 11 |
| TRUE | 84 | 5.7 | 13 |
# Modelo simples (opcional): o que prediz o alerta?
modelo <- glm(tsunami ~ mag + depth, data = eq_final, family = binomial)
summary(modelo)$coefficients |> round(3) |> kbl() |> kable_styling(full_width = FALSE)
| Estimate | Std. Error | z value | Pr(>|z|) | |
|---|---|---|---|---|
| (Intercept) | -17.784 | 0.879 | -20.226 | 0.000 |
| mag | 2.568 | 0.158 | 16.244 | 0.000 |
| depth | -0.005 | 0.002 | -2.039 | 0.041 |
4.7 Qualidade das medições (formato longo)
# FORMATO LONGO: várias métricas de qualidade em uma só coluna
eq_final |>
dplyr::select(status, nst, gap, rms) |>
pivot_longer(c(nst, gap, rms), names_to = "metrica", values_to = "valor") |>
filter(!is.na(valor)) |>
ggplot(aes(status, valor, fill = status)) +
geom_boxplot(show.legend = FALSE) +
facet_wrap(~ metrica, scales = "free_y") +
labs(title = "Qualidade da localização: eventos revisados vs. automáticos",
x = NULL, y = NULL)
4.8 O que dizem as anotações de texto
eq_final |>
dplyr::select(mag_class, cot_rationale) |>
unnest_tokens(palavra, cot_rationale) |>
anti_join(stop_words, by = c("palavra" = "word")) |>
filter(!str_detect(palavra, "^[0-9.]+$")) |>
count(mag_class, palavra) |>
group_by(mag_class) |>
slice_max(n, n = 8, with_ties = FALSE) |>
ggplot(aes(reorder_within(palavra, n, mag_class), n, fill = mag_class)) +
geom_col(show.legend = FALSE) +
scale_x_reordered() +
coord_flip() +
facet_wrap(~ mag_class, scales = "free") +
labs(title = "Palavras mais frequentes nas justificativas, por classe", x = NULL, y = "Frequência")
5. Conclusões
Problema. Investigamos se a magnitude é um bom indicador do impacto potencial de terremotos sobre pessoas.
Abordagem. Limpamos e organizamos 10.000 eventos, separamos campos de texto, criamos variáveis, identificamos países e cruzamos com população (GPW) e indicadores do Banco Mundial.
Principais descobertas.
- …
- …
- …
Limitações e próximos passos.
- A população exposta usa um raio heurístico e um raster de 2020, aplicado a eventos de qualquer ano.
- Mede exposição, não mortes ou danos. Cruzar com EM-DAT ou USGS PAGER seria um próximo passo.
- Eventos no mar foram atribuídos ao país mais próximo.