09:データ分析の進め方(分析目的・データの収集と加工、バイナリデータの取り扱い) これまで扱ってきたのデータはアスキー形式データ。 ここからはバイナリデータを取り扱う。 バイナリについてはここをクリック。 全球海面温度(※)データを使って上昇トレンドを調べる ※データサイエンスには関係ないけど、どうでもいいようで、案外どうでもよくない話。 本講義で使うデータは、衛星観測で得られた「Sea Surface Temperature(略してSST )」であり、学会や気象庁のページでも「海面水温」と呼ばれるものです。 しかし、同じ衛星プロダクトのLand Surface Temperatureは、「地表面温度」と呼ばれ、英語の綴りから考えてもSST は本来「海面温度」と呼称するべきであろう、と衛星観測関連シンポジウムの懇親会でJAXA/EORCの研究者Kさんから指摘され、今に至ります。 ちなみに前東北大教授の花輪先生は、塩分という言葉にすでに濃度の意味が含まれているので「塩分濃度」はおかしいと指摘されています。頼まれてもいないのに本学で私は「塩分濃度」撲滅運動を行ってきましたが、海面水温という用語に疑問を持たなかった自分を恥じています。 というわけで、今後はSSTを海面温度と呼称します。 定義を正しく理解すること、用語を正しく使うことの大切さを考えるきっかけになればと思い、自戒の念をこめてここに書いておきます。 9回目以降ではNOAAが配布するOISST ver2を用いる。 OISSTとはOptimum Interpolation Sea Surface Temperatureの略。 つまり最適内挿法で構築された海面温度のデータセットである。 1982年の図は以下のようになる。 ![]() ~GMTスクリプト(上の図を書くには)~ gmt begin OISST1982 gmt xyz2grd 1982-sst.bin -R0.5/359.5/-89.5/89.5 -I1 -ZTLf -Gsst -di-999 gmt makecpt -Chaxby -T-2/30/1 -N gmt grdimage sst -R0.5/359.5/-89.5/89.5 -JR16c gmt coast -B+t"1982 OISST" -B -Gwhite gmt colorbar -DjTR+o0c+w3c/0.4c -Bx -By+loC -I -F+gwhite+p1p gmt end show ※このスクリプトは以降の課題提出で使うので理解しておくこと。 海面温度の上昇トレンド ![]() From : Sea surface temperature from OISST : ICDC : Universität Hamburg (uni-hamburg.de) 上の図は全球の海面温度(高解像度)のトレンドを示した例(ハンブルグ大学)である。 OISSTデータで同様の計算結果が得られる。 ただし、ここで配布するデータは1度格子(ファイルサイズを小さくしたもの)なので、 上の図と全く同じ値にはならない。 全球海面温度の上昇トレンドの計算 9回目は各月の全球平均海面温度を計算し、最小二乗法を用いて上昇トレンドを計算する。 なお、そのままでは値が小さいので「10年で何度上がるか」という値にすること。 (1)データの準備 今回使用するデータはOISSTの月平均海面温度データである。 ファイル数は494個なので、サブフォルダに解凍するほうがよい。 OISSTデータ(DLすること):Zip形式なので各自、DL後に解凍すること。 陸マスクデータ ファイルリスト:ファイル名をフルパスで記述したもの。 (2)データの読み込み このデータセットは1度×1度の格子データである。 1982年以降のデータが存在するので、DOループとOPEN文を使ってデータを読む。 今回は3次元データ(緯度、経度、時間)を扱う。 複数の2次元データを一気に読むことはできないので、 各ファイルを読み込み、変数dummyに一度格納してから、 3次元配列の変数sst3dに再格納する。 xvarは時間軸のための変数。 c234567--------------------------------- character*120 ifl(494) integer num integer*1 lmask(360,180) ! land mask real dummy(360,180),msst real sst3d(360,180,494),xvar(494) real sst1d(494),sst1d2(482) real slope,offset C--------------------------------------- C read the list of FILENAME C and make time axis C--------------------------------------- open(10,file="list.txt") read(10,*) num do k=1,num read(10,'(a120)') ifl(k) write(*,'(a120)') ifl(k) xvar(k)=k enddo close(10) C--------------------------------------- C read SST files and make 3-D dataset C--------------------------------------- do k=1,num open(15,file=ifl(k),form='unformatted', & access="direct",status="old",recl=360*180*4) read(15,rec=1) dummy do j=1,180 do i=1,360 sst3d(i,j,k)=dummy(i,j) enddo enddo close(15) enddo C--------------------- C read LAND MASK C--------------------- open(20,file='lmask.bin',form='unformatted', & access="direct",status="old",recl=360*180) read(20,rec=1) lmask close(20) (3)全球の平均海面温度の計算 陸マスクデータ(0は陸、1は海)を使って、陸域を無視しつつ、各年の平均海面温度を計算する。 平均海面温度の時系列sst1dを作成。 (4)上昇トレンドの計算(最小二乗法) 説明変数をxvar、従属変数をsst1dとして、最小二乗法により線形回帰式を求める。 得られた傾きslopeは月ごとの増減トレンドを示すので、120をかけて10年での増加率を得る。 以下はサンプルコード c234567--------------------------------- ! estimate LONGTERM-TREND of GLOBAL MEAN SST character*120 ifl(494) integer num integer*1 lmask(360,180) ! land mask real dummy(360,180),msst real sst3d(360,180,494),xvar(494) real sst1d(494),sst1d2(482) real sst1df(494),sst1d2f(482) real slope,offset C--------------------------------------- C read the list of FILENAME C and make time axis C--------------------------------------- open(10,file="list.txt") read(10,*) num do k=1,num read(10,'(a120)') ifl(k) write(*,'(a120)') ifl(k) xvar(k)=k enddo close(10) C--------------------------------------- C read SST files and make 3-D dataset C--------------------------------------- do k=1,num open(15,file=ifl(k),form='unformatted', & access="direct",status="old",recl=360*180*4) read(15,rec=1) dummy do j=1,180 do i=1,360 sst3d(i,j,k)=dummy(i,j) enddo enddo close(15) enddo C--------------------- C read LAND MASK C--------------------- open(20,file='lmask.bin',form='unformatted', & access="direct",status="old",recl=360*180) read(20,rec=1) lmask close(20) C---------------------------- C cal mean SST from 1982 to 2022 ! sst1d: timeseries of Global-mean SST C---------------------------- do k=1,num sst1d(k)=0 icount=0 !do j=1,180 do j=30,150 do i=1,360 if(変数lmaskが1のとき)then sst1d(k)=sst1d(k)+sst3d(i,j,k) icount=icount+1 endif enddo enddo sst1d(k)=sst1d(k)/real(icount) write(*,*) k,sst1d(k) enddo msst=0; icount2=0 do k=1,num msst=msst+sst1d(k) icount2=icount2+1 enddo msst=msst/real(icount2) write(*,*)"msst=",msst C---------------------------- C Least-square fitting (1-D) C X: xvar , Y:sst1d C---------------------------- B=0; C=0; D=0; E=0; do k=1,num B=B+ C=C+ D=D+ E=E+ enddo slope= offset= ! Global SST trend degreeC/yr write(*,200) slope*120 200 format('Global-mean SST trend =',f12.4," degC/decade") write(*,201) offset 201 format('OFFSET =',f12.4," degC") C------------------------------ C Build SST timeseries based on results above C------------------------------ do k=1,num sst1df(k)=xvar(k)*slope+offset enddo C---------------------------- C OUTPUT-->write ascii file C---------------------------- decim=1./24.!(365/12/2/365) decim2=decim*2 yr=1981 mo=12 open(80,file='GlobalmeanSST.txt') open(81,file='GlobalmeanSST2.txt') do k=1,num date=yr+decim+decim2*(mo-1) write(80,100) date,sst1d(k) write(81,100) date,sst1df(k) mo=mo+1 if(mo.eq.13)then mo=1 yr=yr+1 endif enddo close(80) close(81) 100 format(2f10.4) C---------------------------- C 13-month running mean C---------------------------- do k=7,488 stmp=0 do i=1,13 stmp=stmp+sst1d(k+i-7) enddo sst1d2(k-6)=stmp/13.0 enddo msst2=0 do k=1,482 msst2=msst2+sst1d2(k) enddo msst2=msst2/482.0 C---------------------------- !Least-square applied to 13-mon running mean C---------------------------- B=0; C=0; D=0; E=0; do k=1,482 B=B+ C=C+ D=D+ E=E+ enddo slope2= offset2= ! Global SST trend degreeC/yr write(*,202) slope2*120 202 format('Global-mean SST trend(13mon) =',f12.4," degC/decade") C------------------------------ C Build SST timeseries based on results above C------------------------------ do k=1,482 sst1d2f(k)=xvar(k)*slope2+offset2 enddo C---------------------------- C OUTPUT-->write ascii file C---------------------------- yr=1982 mo=6 open(82,file='GlobalmeanSSTlp13.txt') open(83,file='GlobalmeanSSTlp132.txt') do k=1,482 date=yr+decim+decim2*(mo-1) write(82,100) date,sst1d2(k) write(83,100) date,sst1d2f(k) mo=mo+1 if(mo.eq.13)then mo=1 yr=yr+1 endif enddo close(82) close(83) stop !<-- we nned this, as always end GMTでプロットする。 gmt begin SSTtimeseries gmt set FONT_HEADING 18p gmt basemap -R1981.9/2023.1/18.2/19.5 -JX15c/10c -Bxag5+l"Year" -Byag0.5+l"Global Mean SST(degC)" gmt plot GlobalmeanSST.txt -R1981.9/2023.1/18.2/19.5 -W0.2p -Bxag5 -Byag0.5 -BWSne -lGlobal_Mean_SST gmt plot GlobalmeanSST.txt -Sc0.1c -Gwhite -W0.2p,black gmt plot GlobalmeanSSTlp13.txt -W1.6p,green -Bxag5 -Byag0.5 -BWSne -lGlobal_Mean_SST_lp13 gmt plot GlobalmeanSST2.txt -W1.6p,red -lSST_Trend gmt plot GlobalmeanSSTlp132.txt -W0.8p,blue -lSST_Trend_lp13 gmt legend -DjTL+o0.5c -F+gwhite+pthicker --FONT_ANNOT_PRIMARY=11p,Helvetica-Bold gmt end show ![]() |