- 개요
북극 진동 패턴을 구하기 위해 자료 처리를 했으니 이제 북극 진동 패턴을 구해봐야겠죠.
EOF 분석을 한 후 여기서 나온 시계열을 다시 hgtAno에 regression하여 regression map을 구해야 합니다.
저번에 구한 hgtAno 변수부터 시작합니다.
- EOF 분석 이론
EOF는 Empirical Orthgonal Function으로 직역하면 경험직교함수입니다.
자세히 설명하기에는 포스트를 하나 새로 쓸 정도로 분량이 많아서 대략적으로만 설명합니다.
대기과학에서 EOF 분석을 사용하는 이유는 특정 지역에서 가장 변동성이 큰 패턴, 다른 말로는 가장 설명을 잘하는 (explainable) 공간 패턴을 찾고, 그 공간 패턴이 어떤 식으로 변하는지(공간 패턴의 시계열) 확인하고자 함입니다.
이 때 시계열을 그냥 시계열이라 부르지 않고 PC 시계열 (Princial Component time series)라고 합니다.
hgtAno처럼 [시간, 위도, 경도]의 차원을 가지는 배열에 EOF 분석을 적용하면
시간에 대한 변동성이 큰 순서대로 공간(위도, 경도) 패턴이 나오고 각각 공간 패턴의 시계열을 얻을 수 있습니다.
hgtAno의 위도는 20도 이상이므로 북반구 중위도에서 가장 변동성이 큰 패턴을 찾겠다는 것이고
이를 찾은 과학자들이 이 패턴을 북극 진동 패턴이라고 명명한 것입니다.
참고로 태평양 적도 지역의 월평균 해수면 온도 변수에 EOF 분석을 적용하면 가장 변동성이 큰 패턴으로 엘니뇨/라니냐 패턴이 나옵니다.
이론적인 설명은 여기까지 하고 이제 코딩을 해보죠.
- EOF 분석 코딩
파이썬에서 EOF 분석을 하기위해 eofs 라이브러리를 설치합시다.
pip install eofs
그냥 eofs 라이브러리에 적당한 입력 변수를 넣어주면 분석은 끝나기 때문에 EOF 분석이 어렵지는 않습니다.
전 area_weighting을 자료 처리 단계에서 했지만 사실 eofs 함수 내에서도 가능합니다.
import numpy as np
from eofs.standard import Eof
solver = Eof(hgtAnoWgt)
eof1 = solver.eofsAsCovariance(neofs=1) # neofs=1, 첫 번째 공간 패턴만 반환,
# eofsAsCovariance >>> Covariance matrix로 EOF 분석 수행 (표준편차로도 가능)
pc1 = solver.pcs(npcs=1, pcscaling=1) # npcs=1, 첫 번째 pc 시계열만 반환
"""
첫 째만 반환해서 차원이 [시간, 1]이므로 1을 없애주기 위해 squeeze() 적용하여
배열의 차원을 [시간]으로 만듦
"""
eof1 = eof1.squeeze()
pc1 = pc1.squeeze()
pc 시계열(pc1)과 hgtAno 간 공간 상관계수 패턴 생성을 합시다.
이 패턴이 북극 진동 패턴입니다.
from sklearn.linear_model import LinearRegression
loadingMap = np.zeros((nlat, nlon))
for ilat in range(nlat):
for ilon in range(nlon):
# 각 격자의 시계열 (hgtAno[:, lat, lon])과 pc1의 선형 회귀 수행
y = hgtAno[:, ilat, ilon] # 각 격자의 시계열
X = pc1.reshape(-1, 1) # pc1을 2D 배열로 변환 (독립 변수)
# 회귀 모델 생성 및 학습
model = LinearRegression()
model.fit(X, y)
# 회귀 계수 저장
loadingMap[ilat, ilon] = model.coef_[0] # 각 격자의 회귀 계수
북극 진동 패턴을 loadingMap에 저장했으니 간단히 그려봅시다.
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature
fig, ax = plt.subplots(figsize=(10, 8), subplot_kw={
'projection': ccrs.NorthPolarStereo() # 북극에서 바라보는 projection
})
contourf = ax.contourf(lon, lat, loadingMap, transform=ccrs.PlateCarree())
cbar = fig.colorbar(contourf, ax=ax, orientation='vertical')
대충 그리긴 했지만 loadingMap 변수의 공간분포는 NOAA에서 제공하는 북극 진동 패턴과 거의 똑같습니다.
다음 포스트에서는 NOAA에서 제공하는 북극 진동 패턴과 비슷하게 그림을 그려보겠습니다.
'대기과학 > 프로그래밍' 카테고리의 다른 글
[python, html/css] 안개 속보 화면 만들기: 1. 흐름 및 계획 (0) | 2024.12.03 |
---|---|
[python] 북극 진동 (Arctic Oscillation) 패턴 계산 & 그리기 4: 북극 진동 패턴 예쁘게 그리기 (1) | 2024.11.20 |
[python] 북극 진동 (Arctic Oscillation) 패턴 계산 & 그리기 2: 자료 수집과 처리 (3) | 2024.11.15 |
[python] 북극 진동 (Arctic Oscillation) 패턴 계산 & 그리기 1: 목표 설정 (1) | 2024.11.14 |
[python] 북극 진동 (Arctic Oscillation) 패턴 계산 & 그리기 0: 프롤로그 (1) | 2024.11.13 |