[python] 북극 진동 (Arctic Oscillation) 패턴 계산 & 그리기 3: 북극 진동 패턴 구하기

2024. 11. 18. 10:23·대기과학/프로그래밍

- 개요

북극 진동 패턴을 구하기 위해 자료 처리를 했으니 이제 북극 진동 패턴을 구해봐야겠죠.

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에서 제공하는 북극 진동 패턴 비교

 

대충 그리긴 했지만 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
'대기과학/프로그래밍' 카테고리의 다른 글
  • [python, html/css] 안개 속보 화면 만들기: 1. 흐름 및 계획
  • [python] 북극 진동 (Arctic Oscillation) 패턴 계산 & 그리기 4: 북극 진동 패턴 예쁘게 그리기
  • [python] 북극 진동 (Arctic Oscillation) 패턴 계산 & 그리기 2: 자료 수집과 처리
  • [python] 북극 진동 (Arctic Oscillation) 패턴 계산 & 그리기 1: 목표 설정
레까
레까
  • 레까
    데이터 조아
    레까
  • 전체
    오늘
    어제
    • 전체 (87) N
      • 대기과학 (45)
        • 프로그래밍 (42)
        • 개념 (2)
        • 칼럼 (1)
      • 여러가지 데이터 (5)
        • 프로그래밍 & 분석 (5)
      • 프로그래밍 (16) N
        • 파이썬 (8)
        • 시각화 (7) N
        • 유용 (1)
      • 프로젝트 (17)
        • 기계학습 기반 서울 기온 예측 (9)
        • 사과게임 매크로 만들기 (4)
        • 버스 한 번으로 특정 지역에 갈 수 있는 지역 찾.. (4)
      • 데이터리안 SQL 공부 (3)
      • 주제별 링크 모음 (1)
      • 백업 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
레까
[python] 북극 진동 (Arctic Oscillation) 패턴 계산 & 그리기 3: 북극 진동 패턴 구하기
상단으로

티스토리툴바