地理情報

ケッペンの気候区分の判定とPythonでの実装

高校地理でも取り上げられるケッペンの気候区分は、気温と降水量から気候を分類できる気候区分です。
このページでは、気温と降水量から気候帯と気候区を判定する方法(分類基準)とPyhtonでの実装について紹介します。

ケッペンの気候区分とは

ケッペンの気候区分の定義に基づいた気候の分布。ケッペンの気候区分では、気温と降水量を指標として世界各地の気候を5つの気候帯と14の気候区に分類している。出典:Wikimedia Commons, ©Peel, M. C., Finlayson, B. L., and McMahon, T. A.
(University of Melbourne), CC BY-SA 3.0, 2021/2/8閲覧

ケッペンの気候区分とは、気温と降水量に基づいて世界の気候を5つの気候帯に分類したものです。
ドイツのケッペン(Wladimir Peter Köppen, 1846-1940)が1884年に提唱しました。
気温降水量のという計測が容易な2つの気候要素から気候を分類できる簡便さと各地域の景観を反映した分類であることから、現在でも広く使用されています。
高校地理でも登場する気候区分であり、分布が極端に狭い高地地中海性気候を除く各気候区分を学習します。

気候帯と気候区分の判定

ケッペンの気候区分では、世界各地の気候を大きく5つの気候帯に分類し、それぞれの気候帯の中でさらに2-4種類の気候区に分類する2層構造になっています。
この項目では、気候帯と気候区の定義(判定基準)についてまとめます。

乾燥限界の計算

はじめに、乾燥帯の判定に使用する乾燥限界について解説します。
乾燥限界とは、年降水量が年蒸発量が同じになる降水量であり、乾燥気候と湿潤気候の境界値です。
降水量が乾燥限界を下回ると、降水量よりも蒸発散量の方が大きくなり地表の水が不足して樹木が生育できなくなります。

季節によって気温が異なるため、いつ雨が降るかによって蒸発散量が変わります。
そのため、夏と冬のどちらに乾燥するかによって乾燥限界の計算式が変わってきます。

計算式には簡略化したものと厳密な定義があります。

簡略化した計算式

簡略化した乾燥のパターンの分類の定義は以下の通りです。

夏季乾燥型(s):夏の最少雨月降水量 × 3 ≦  冬の最多雨月降水量
冬季乾燥型(w):冬の最少雨月降水量×10 ≦ 夏の最多雨月降水量
年中湿潤型(f):上記どちらでもない場合

厳密な定義

厳密な分類の定義は以下の通りです。
夏季半年間(北半球では4-9月)の合計降水量 $ r_s $、年降水量 $ r $ とすると、年降水量に占める夏季降水量の割合 $ r_s / r $ の値によって計算します。

夏季乾燥型(s):70%以上
年中湿潤(f):30%以上70%未満
冬季乾燥型(w):30%未満

乾燥限界の算出

以上のように簡略または厳密に分類した乾燥のパターンごとに乾燥限界 $ r_b $の計算式が異なります。
年平均気温 $ t $ を使って計算します。

夏季乾燥型(s):$ r_b = 20 t $
年中湿潤(f):$ r_b = 20 ( t + 7 ) $
冬季乾燥型(w):$ r_b = 20 ( t + 14 ) $

以上のように算出した乾燥限界 $ r_b $ を基準として、年降水量 $ r $ が乾燥限界を下回る場合には乾燥帯と判定します。
実装パートでは厳密な計算方法を使用して乾燥限界を計算します。

気候帯の判定

次に気候帯の分類について解説します。
下の表はケッペンの気候区分による気候帯の判定基準をまとめたものです(気候帯の詳細についてはこちらのページで解説)

表 ケッペンによる気候帯の分類

気候帯 樹木の生育 降水量 最寒月平均気温 最暖月平均気温
熱帯(A) 乾燥限界以上 18℃以上 ---
乾燥帯(B) 乾燥限界未満 --- ---
温帯(C) 乾燥限界以上 18℃~-3℃ 10℃以上
亜寒帯(冷帯、D) 乾燥限界以上 -3℃未満 10℃以上
寒帯(E) --- --- 10℃未満

気候帯の分類では、以下の順番に判定します。
①寒帯の判定
②乾燥帯の判定
③熱帯の判定
④温帯と亜寒帯の判定

はじめに寒帯の判定を行います。
最暖月平均気温が10℃未満の場合、寒帯と判定します。
年降水量は考慮しません(乾燥帯よりも寒帯の判定を優先)。
寒帯は気温が低すぎて樹木が生育できない無樹木気候です。

次に乾燥帯の判定を行います。
乾燥帯の判定では、年降水量が乾燥限界を下回る場合を乾燥帯と判定します。
乾燥限界とは、年降水量が年蒸発量が同じになる降水量であり、乾燥気候と湿潤気候の境界値です。
降水量が乾燥限界を下回ると、降水量よりも蒸発散量の方が大きくなり地表の水が不足して樹木が生育できなくなります(無樹木気候)。
乾燥限界については次の項目で解説します。

寒帯でも乾燥帯でもない場合は樹木気候とよばれる樹木が生育できる気候になります。
樹木気候に分類される熱帯、温帯、亜寒帯(冷帯)の3つは最寒月平均気温によって以下のように分類されます。

<最寒月平均気温に基づく判定>
18℃以上:熱帯
-3℃以上18℃未満:温帯
-3℃未満:亜寒帯(冷帯)

なお、高山帯はケッペンの気候区分には含まれず、のちにトレワーサによって追加された区分であるため、ここでは取り上げません。

気候区の判定

気候帯を判定した後にさらに詳細な気候区に分類します。
気候帯ごとに気候区の数や分類基準は異なります。
このページに記載すると冗長になるため、詳細についてはこちらのページを参照して下さい。

実装

ここからは気温と降水量から気候区分を判定するコードの実装について解説します。

気候区分の判定に使用する月平均気温と月降水量のデータは次のサイトから取得しました。
世界の天候データツール(ClimatView 月統計値) 気象庁 2024/3/9閲覧

このサイトでは、世界各地の都市(観測地点)について、月平均気温と月降水量を掲載しています。
1991年から2020年までの30年間の平均から算出した平年値を利用します(2024/3/9現在)。

上記サイトから取得したファイルから必要箇所のみを取得・出力した以下のようなテーブルデータを入力として使用します。

ファイル名:01_気象情報平年値_タイ_バンコク_13N_100E_3m.csv

表 気候区分判定用情報(バンコク)

月平均気温平年値 月平均降水量平年値
1 27.6 24.2
2 28.7 19.4
3 29.8 53.6
4 30.8 92.7
5 30.5 215.4
6 29.8 209.9
7 29.3 182.9
8 29.1 212
9 28.7 343.6
10 28.5 304
11 28.4 46.5
12 27.4 13.5

実装では、入力として上記テーブルデータをpandas.dataframeとして読み込みます(変数 df)。
変数 lat は文字列型の緯度情報であり、乾燥限界を算出する際に観測地点が北半球と南半球のどちらに位置するかを判定するために使用します。
北半球であれば、lat='36N' のようにNが含まれ、南半球であれば lat='15S' のようにSが文字列として含まれることを前提として処理しています。

関数ではdf, latを入力として、該当する気候区の名称(変数 kubun)を文字列で返します。

判定の流れは次の通りです。

1.乾燥限界となる降水量の算出(2-①で使用)
①北半球と南半球の判定
②年降水量に占める夏季降水量の割合を産出
③いつ乾燥するかで分類(冬季乾燥・年中一定・夏季乾燥)
④乾燥限界となる降水量の算出

2.気候帯の判定
①寒帯の判定(最暖月平均気温が10℃未満か)
②乾燥帯の判定(年降水量が乾燥限界未満か)
③熱帯の判定(最暖月平均気温が18℃以上か)
④温帯と亜寒帯の判定(最寒月平均気温-3℃未満であれば亜寒帯、-3℃以上であれば温帯)

3.気候区の判定
2で判定した気候帯ごとに気候区を分類

最後にPythonのコードは以下の通りです。

# 関数定義:気候区の判定
def get_kubun(df, lat):
    # 気温と降水量から気候区分を判定
    # 必要情報の取得
    max_temp = df['月平均気温平年値'].max()
    min_temp = df['月平均気温平年値'].min()
    ave_temp = df['月平均気温平年値'].mean()

    # max_rain = df['月平均降水量平年値'].max()
    min_rain = df['月平均降水量平年値'].min()
    ave_rain = df['月平均降水量平年値'].mean()

    # 乾燥限界の計算

    # 夏の月の判定
    # 北半球と南半球では夏に相当する月が異なる
    if ('N' in lat):
        # 北半球
        sm_list = [4,5,6,7,8,9]
    elif('S' in lat):
        # 南半球
        sm_list = [1,2,3,10,11,12]
    else:
        raise ValueError('緯度の表記にNまたはSが存在しません。')
    df_sm = df[df['月'].isin(sm_list)]
    rain_year = df['月平均降水量平年値'].sum()
    rain_sm = df_sm['月平均降水量平年値'].sum()

    # 年降水量に占める夏季降水量の割合ごとにパターン分類
    ratio = rain_sm/rain_year

    if (ratio>=0.7):
        # 冬季乾燥
        dry_pattern = 'w'
    elif (ratio>0.3):
        # 年中同程度
        dry_pattern = 'f'
    elif(ratio>0):
        # 夏季乾燥
        dry_pattern = 's'
    else:
        raise ValueError('年降水量に占める夏季降水量の割合ratioが不正値です。')
    
    # パターンごとに乾燥限界の判定
    if (dry_pattern=='s'):
        r = 20*ave_temp
    elif (dry_pattern=='f'):
        r = 20*(ave_temp + 7)
    elif (dry_pattern=='w'):
        r = 20*(ave_temp + 14)
    else:
        raise ValueError('乾燥限界の判定パターンdry_patternが不正値です。')

    # 気候帯の判定
    if (max_temp<10):
        # 最暖月平均気温が10℃未満
        zone = 'E' # 寒帯
    elif (r>rain_year):
        # 年平均降水量が乾燥限界未満
        zone = 'B' # 乾燥帯
    elif (max_temp<10):
        # 最暖月平均気温が10℃未満
        zone = 'E' # 寒帯
    elif (min_temp>=18):
        # 最寒月平均気温18℃以上
        zone = 'A' # 熱帯
    elif (min_temp>=-3):
        # 最寒月平均気温18℃未満-3℃以上
        zone = 'C' # 温帯
    elif (min_temp<-3):
        # 最寒月平均気温-3℃未満
        zone = 'D' # 亜寒帯(冷帯)
    else:
        raise ValueError('気候帯の判定に失敗しました。')
    
    # 気候区分の判定
    if (zone=='A'):
        # 熱帯
        if (min_rain>=60):
            kubun = 'Af' # 熱帯雨林気候
        elif (min_rain>(100-0.4*ave_rain)):
            kubun = 'Am' # 熱帯モンスーン気候
        else:
            kubun = 'As' # サバナ気候
    elif (zone=='B'):
        # 乾燥帯
        if (0.5*r>rain_year):
            kubun = 'BW' # 砂漠気候
        else:
            kubun = 'BS' # ステップ気候
    elif (zone=='C'):
        # 温帯
        if (dry_pattern=='s')&(min_rain<30):
            kubun = 'Cs' # 地中海性気候
        elif (dry_pattern=='w'):
            kubun = 'Cw' # 温暖冬季少雨気候
        elif (max_temp>=22):
            kubun = 'Cfa' # 温暖湿潤気候
        else:
            kubun = 'Cfb' # 西岸海洋性気候
    elif (zone=='D'):
        # 亜寒帯(冷帯)
        if (dry_pattern=='s')&(min_rain<30):
            kubun = 'Ds' # 高地地中海性気候
        elif (dry_pattern=='w'):
            kubun = 'Dw' # 亜寒帯冬季少雨気候
        else:
            kubun = 'Df' # 亜寒帯湿潤気候
    elif (zone=='E'):
        # 寒帯
        if (max_temp>=0):
            kubun = 'ET' # ツンドラ気候
        else:
            kubun = 'EF' # 氷雪気候
    
    return kubun

参考文献

ケッペンの気候区分 ウィキペディア 2024/3/16閲覧
乾燥限界(かんそうげんかい)とは? コトバンク 改訂新版 世界大百科事典、日本大百科全書(ニッポニカ) 2024/3/16閲覧
帝国書院編集部「新詳地理資料 COMPLETE 2023」帝国書院(2023)
世界の天候データツール(ClimatView 月統計値) 気象庁 2024/3/9閲覧

-地理情報
-, ,