どこにでもいる30代SEの学習ブログ

主にプログラミング関連の学習内容。読んだ本の感想や株式投資についても書いてます。

【政府統計】大企業のほうが退職一時金と企業年金の両方を設けている [e-Stat(政府統計): 民間企業退職給付調査(2)]

f:id:predora005:20210222233348j:plain
*1

前回に引き続き「民間企業の勤務条件制度等調査(民間企業退職給付調査)」の2016年次データを紹介します。

predora005.hatenablog.com

わかったこと

わかったことは次の通りです。

  • 9割以上の企業が退職給付制度を設けている
  • 退職一時金を設けている企業が8割で、企業年金を設けている企業は5割
  • 大企業になるほど、退職一時金と企業年金の両方を設けている割合が高くなる
  • 退職一時金のうち、大企業のほとんどは社内準備だが、中小企業だと中小企業退職金共済の割合が増える
  • 勤続年数が増えるほど、退職一時金は多くもらえる
  • 定年前退職(早期退職や希望退職)の優遇制度を設けている企業は少ない

[2] 退職一時金・企業年金制度の状況

[2-1] 退職給付制度の普及状況

f:id:predora005:20210221193228p:plain

9割以上の企業が退職給付制度を設けています。もっとも割合の少ない50人〜99人の企業でも87%は退職給付制度があります。

f:id:predora005:20210221193243p:plain

退職給付制度の内訳は、企業規模によって大きく異なります。大企業ほど退職一時金と企業年金の併用が多く、中小企業ほど退職一時金のみの割合が多いです。

f:id:predora005:20210212211048p:plain

[2-2] 企業年金導入時の原資の状況

f:id:predora005:20210221193339p:plain

私の理解不足で内容がはっきりとは理解できていません。恐らく、企業年金を導入した場合のみに該当する話で、その原資が何かの話です。退職一時金から充当する場合が最も多く、企業年金用に別途原資を拠出する割合は少ないということだと思います。

f:id:predora005:20210212223905p:plain

[2-3] 退職給付債務(PBO)計算上の割引率の状況

割引率については以下のサイトの説明が分かりやすかったです。

割引率|退職給付会計|EY新日本有限責任監査法人

割引率とは、将来の価値を現在の価値に直すために用いる率のことをいいます。利回りを考慮すれば現在の通貨の価値と将来の通貨の価値とでは価値が違うために、将来の通貨の価値を現在の通貨の価値に換算するために用いる率のことを指します。

f:id:predora005:20210221193542p:plain

500人未満の企業では、退職給付債務を設定していない企業が多数派です。一方、500人以上の企業では設定している場合の方が多いです。

f:id:predora005:20210212231601p:plain

設定している場合の割引率は、1.0%未満の場合が多いです。割引率は債券の利回りを参考にするとされています。米国債 10年の利回りが1%くらいなので、あまりに割引率が高いと、本当に大丈夫なんだろうかと心配になってしまいますね。

f:id:predora005:20210221193605p:plain

f:id:predora005:20210212231752p:plain

[2-4] 退職給付制度がない理由の状況

f:id:predora005:20210221193704p:plain

f:id:predora005:20210212233023p:plain

[2-5] 退職一時金制度の種類と算定方式の状況

f:id:predora005:20210221193912p:plain

退職一時金制度のある企業が8割です。

f:id:predora005:20210212235049p:plain

退職一時金制度の内訳は、社内準備が多いです。ただし、中小企業の場合は中小企業退職金共済を利用する割合が増えています。社内準備と併用、もしくは、共済のみの割合が増えるようです。

f:id:predora005:20210221193933p:plain

f:id:predora005:20210212235107p:plain

[2-6] 退職一時金(社内準備)における算定方式別、退職事由別、勤続年数別平均累積支給率の状況

f:id:predora005:20210221194232p:plain

基本給を基礎とする場合、退職一時金は一般的に以下の式で計算されます。

(退職一時金) = (退職時の基本給) × (支給率)

仮に、勤続35年で定年を迎えたとき、基本給が30万円なら、30×62.4=1,872万円を退職金として受け取れます。そこから税金が引かれます。

f:id:predora005:20210213001435p:plain

別テーブル方式の場合は、基本給ではなく勤続年数に応じた基準額がベースとなります。勤続年数に応じて、支給率が増えるのは基本給と変わりません。

f:id:predora005:20210221194247p:plain

f:id:predora005:20210213001453p:plain

[2-7] 定年前退職者の退職一時金優遇制度の状況

f:id:predora005:20210221194408p:plain

定年前退職(早期退職や希望退職をすべて含めたもの)の優遇制度については、社員1,000人以上の企業では40%に存在するものの、100人未満の企業では5%に満たないです。

f:id:predora005:20210213003508p:plain

[2-8] 早期退職優遇制度及び希望退職制度の退職一時金の割増率の状況

早期退職の優遇については、年齢が高く定年に近い方が割増率は低いです。勤続年数が高くなるにつれて貰える退職一時金が増えるため、割増率が低くなっているのでしょう。

f:id:predora005:20210221194615p:plain

f:id:predora005:20210221194619p:plain

f:id:predora005:20210221194622p:plain

f:id:predora005:20210213010513p:plain

希望退職制度については、ブランクとなっている箇所が多いです。希望退職制度を設けている企業は少ないのかもしれません。

f:id:predora005:20210213010703p:plain

終わりに

勤続年数が長いほど退職金が多くもらえることなど、今回は一般的な認識を裏付けるデータでした。

次回も引き続き、退職金や企業年金について見ていきます。

predora005.hatenablog.com

出典

*1:3D Animation Production CompanyによるPixabayからの画像

【政府統計】中小企業ほど定年後の再雇用率が高い [e-Stat(政府統計): 民間企業退職給付調査(1)]

f:id:predora005:20210222233348j:plain
*1

以前、e-Stat(政府統計の総合窓口)で様々な統計データが見れることを紹介しました。

predora005.hatenablog.com

今回は「民間企業の勤務条件制度等調査(民間企業退職給付調査)」の2016年次のデータから得られた情報や考察を紹介していきます。

わかったこと

わかったことは次の通りです。

  • 大企業ほど定年年齢60歳の割合が多い
  • 8割以上の企業は、定年制の変更予定が無い
  • 96%以上の企業は継続雇用制度があり、そのうち87%以上は再雇用である
  • 中小企業ほど定年後の再雇用率が高い
  • 再雇用のうちフルタイム再雇用の割合が9割以上

前提条件

民間企業の勤務条件制度等調査とは

民間企業の勤務条件制度等調査は、国家公務員の勤務条件検討のための基礎資料を得ることを目的とした調査で、民間企業を対象とし毎年実施されます。
この調査では、民間企業における労働時間、休業・休暇、福利厚生、退職管理及び災害補償法定外給付等の諸制度を調査し、その結果をとりまとめの上提供しています。

民間企業の勤務条件制度等調査 | 政府統計の総合窓口

調査対象

調査対象は「常勤の従業員数が50人以上の企業」が対象です。そのため、小規模事業者は含まれません。就業者数のおよそ4分の1は含まれないと考えて良いでしょう。

また、全企業を調査したわけではなく、層化無作為抽出された企業が対象です。標本企業7,355社のうち有効な回答のあった4,493社について集計が行われています。

平成28年民間企業の勤務条件制度等調査(民間企業退職給付調査)

調査時期

2016年10月1日〜11月30日です。4年半前の調査なので、当時と現在とでは若干異なっているかも知れません。

[1] 定年制と定年退職者の継続雇用の状況

[1-1] 定年制の状況

f:id:predora005:20210221192242p:plain

大企業ほど定年年齢が低く、中小企業になるほど高くなる傾向にあります。

f:id:predora005:20210212171021p:plain

[1-2] 定年制の今後の変更予定の状況

f:id:predora005:20210221192454p:plain

2016年時点のデータですが、定年年齢の引き上げ等の変更を検討していない企業が8割です。

f:id:predora005:20210212172022p:plain

[1-3] 継続雇用制度の状況

f:id:predora005:20210221192650p:plain

96%以上の企業は継続雇用制度があります。

f:id:predora005:20210221192702p:plain

継続雇用制度の内訳はほとんどが再雇用制度です。中小企業になるほど勤務延長制度の内訳が増えています。

f:id:predora005:20210212183732p:plain

再雇用と勤務延長の違いは、人事院の用語解説によると次の通りです。

「再雇用制度」とは、定年年齢に到達した従業員を一旦退職させた後、再び雇用することをいい、雇用形態の名称、身分上の取扱い等(常勤、非常勤、嘱託等)は問わない。
「勤務延長制度」とは、定年年齢に到達した従業員を、退職させることなく、引き続き常勤の従業員として雇用することをいう。
「特殊関係」とは、高年齢者等の雇用の安定等に関する法律(昭和46年法律第68号)第9条第2項において、継続雇用制度に含まれるものとされているものいう。

[1-4] 再雇用者の割合の状況

f:id:predora005:20210221192842p:plain

社員数の多い企業の方が定年退職者が多いのは当然の結果ですね。ただ、次のグラフを見ると、社員数だけが要因ではありませんでした。

f:id:predora005:20210221192857p:plain

中小企業の方が、定年後に再雇用となる割合が高いことが分かります。中小企業の方が収入が低い傾向にありますから、年金受給が始まる65歳までは労働を続けるというのは納得できます。

f:id:predora005:20210212191106p:plain

[1-5] フルタイム再雇用者の割合の状況

f:id:predora005:20210221193004p:plain

再雇用者のうちフルタイムの割合がかなり多いです。1,000人以上の企業ですと割合は減っていますが、7割以上の企業は100%フルタイム再雇用です。

f:id:predora005:20210212192824p:plain

[1-6] 再雇用者の勤務形態別人数割合の状況

f:id:predora005:20210221193050p:plain

大企業の方がフルタイム再雇用の割合が多いのは意外でした。一つ前のデータでは、大企業の100%フルタイム再雇用が少なかったです。しかし、よく考えれば、定年退職者の数が多いため、100%フルタイム再雇用は成立しにくいのでした。

f:id:predora005:20210212203647p:plain

終わりに

従業員数50人以上の企業が対象なので、日本の実態を正確に表しているとは言えません。自営業の方なども含まれないわけですし。

ただ、裾野を広げすぎると収拾がつかなくなるのも理解は出来ます。前提条件を踏まえた上で、引き続きe-Statのデータを見ていきます。

次回は、退職金や企業年金について見ていきます。

predora005.hatenablog.com

出典

*1:3D Animation Production CompanyによるPixabayからの画像

pandas-datareaderでTOPIX500銘柄の株価上昇率を算出

f:id:predora005:20210201003956j:plain
<pandas-datareaderでTOPIX500銘柄の株価上昇率を算出>*1

前回はpandas-datareaderで米国株の株価を取得しました。

predora005.hatenablog.com

今回は、東証一部上場銘柄の株価を取得し、業種ごとの株価変動を可視化しました。

f:id:predora005:20210211200716p:plain

[1] 東証上場銘柄を取得する

[1-1] JPX(日本取引所グループ)から取得

東証上場銘柄の一覧は、JPX(日本取引所グループ)のページから取得します。

その他統計資料 | 日本取引所グループ

中身は次のようなデータになっています。

f:id:predora005:20210211133201p:plain

[1-2] CSVに変換して読み込み

ExcelCSV形式に保存したのち、PythonからpandasのDataFrameとして読み込みます。

import pandas as pd

tse_list = pd.read_csv('data_j.csv', header=0)

[2] TOPIX500銘柄の業種ごとの株価上昇率を算出

東証上場銘柄のうち、TOPIX500銘柄にターゲットを絞ります。ちなみに、全銘柄だと4,086銘柄あります*2

[2-1] TOPIX500銘柄のデータを抽出

'市場・商品区分'で東証一部上場銘柄を抽出します。次に、'規模区分'でTOPIX500銘柄を抽出します。

# TOPIX500の銘柄を抽出する
tse1 = tse_list[tse_list['市場・商品区分'] == '市場第一部(内国株)']
topix500 = tse1[(tse1['規模区分'] == 'TOPIX Core30') | 
                (tse1['規模区分'] == 'TOPIX Large70') |
                (tse1['規模区分'] == 'TOPIX Mid400')]

いったん東証一部上場銘柄を抽出していますが、省略してTOPIX500銘柄を抽出することも可能です。

なお、TOPIXについては、下記ページに詳しく載っています。

TOPIX(東証株価指数) | 日本取引所グループ

[2-2] 業種ごとの銘柄数を確認

業種ごとの銘柄数を確認すると、電気機器の49銘柄が最多です。

# 33業種コード,33業種区分ごとの銘柄数を算出
category_count = topix500.groupby(['33業種コード','33業種区分']).size()
print(category_count)
# 33業種コード  33業種区分    
# 1050        鉱業              1
# 2050        建設業            20
# 3050        食料品            28
# 3100        繊維製品           5
# 3150        パルプ・紙          3
# 3200        化学              46
# 3250        医薬品            22
# 3300        石油・石炭製品       3
# 3350        ゴム製品           4
# 3400        ガラス・土石製品      8
# 3450        鉄鋼              7
# 3500        非鉄金属           7
# 3550        金属製品           6
# 3600        機械              32
# 3650        電気機器           49
# 3700        輸送用機器         20
# 3750        精密機器           10
# 3800        その他製品          10
# 4050        電気・ガス業         13
# 50          水産・農林業         2
# 5050        陸運業             24
# 5100        海運業             2
# 5150        空運業             2
# 5200        倉庫・運輸関連業      2
# 5250        情報・通信業         32
# 6050        卸売業             23
# 6100        小売業             33
# 7050        銀行業             26
# 7100        証券、商品先物取引業  5
# 7150        保険業             6
# 7200        その他金融業        9
# 8050        不動産業           12
# 9050        サービス業          25
# dtype: int64

[2-3] 各銘柄の株価上昇率を計算

ここでは、2020/11/2〜2021/2/5の株価上昇率を計算します。

[2-3-1] 業種コード・業種区分を抽出

まずは、業種コード・業種区分を抽出します。

# 33業種コード,33業種区分を抽出
industry_category = topix500.groupby(['33業種コード','33業種区分']).groups.keys()
print(industry_category)
# dict_keys([('1050', '鉱業'), ('2050', '建設業'), ('3050', '食料品'), 
# ('3100', '繊維製品'), ('3150', 'パルプ・紙'), ('3200', '化学'), 
# ('3250', '医薬品'), ('3300', '石油・石炭製品'), ('3350', 'ゴム製品'), 
# ('3400', 'ガラス・土石製品'), ('3450', '鉄鋼'), ('3500', '非鉄金属'), 
# ('3550', '金属製品'), ('3600', '機械'), ('3650', '電気機器'), 
# ('3700', '輸送用機器'), ('3750', '精密機器'), ('3800', 'その他製品'), 
# ('4050', '電気・ガス業'), ('50', '水産・農林業'), ('5050', '陸運業'), 
# ('5100', '海運業'), ('5150', '空運業'), ('5200', '倉庫・運輸関連業'), 
# ('5250', '情報・通信業'), ('6050', '卸売業'), ('6100', '小売業'), 
# ('7050', '銀行業'), ('7100', '証券、商品先物取引業'), ('7150', '保険業'), 
# ('7200', 'その他金融業'), ('8050', '不動産業'), ('9050', 'サービス業')])

[2-3-2] 業種ごとに株価を取得

抽出した、業種コード・業種区分ごとに株価を取得します。期間は3ヶ月分よりも長く取得したいのですが、Stooqの株価取得には制限があります。具体的な基準は分かりませんが、一定回数か容量を超えると空のDataFrameが返ってくるので、3ヶ月分に留めています。

# 2020/11/2〜2021/2/5の株価を取得する
base_date = datetime.datetime(2020, 1, 6)
end_date=datetime.datetime(2021, 2, 5)

# 業種単位の株価上昇率格納用のDataFrameを用意する
category_df = None

# 業種ごとに変動率を計算する
for category in industry_category:
    
    category_code = category[0]     # 33業種コード
    category_class = category[1]    # 33業種区分
    
    # 指定した業種の銘柄を抽出
    brands = topix500[topix500['33業種区分'] == category_class]
    
    # 銘柄コードの末尾に.JPを付加する
    symbols = []
    for code in brands['コード']:
        symbols.append('{0:d}.JP'.format(code))

    # 指定銘柄コードの株価を取得する
    stock_price = web.DataReader(symbols, 'stooq', start=base_date, end=end_date)
    print(stock_price)
    # Attributes   Close                 ...  Volume                  ...   
    # Symbols    1414.JP 1721.JP 1801.JP ... 1883.JP  1893.JP 1911.JP ...   
    # Date                               ...                          ...   
    # 2021-02-05  4600.0  3315.0  3545.0 ...  262000   877200  476600 ...   
    # 2021-02-04  4630.0  3245.0  3510.0 ...  304100   864200  547700 ...   
    # ...            ...     ...     ... ...     ...      ...     ... ...   
    # 2020-11-04  5200.0  2789.0  3325.0 ...   85900  1494600  520500 ...   
    # 2020-11-02  5130.0  2678.0  3280.0 ...  140500   647000  409200 ...   

TOPIX500銘柄すべての株価を一度に取得し、業種単位に分割することも可能と思われます。しかし、一度に大量のデータは扱いたくないので、業種単位で取得しています。

[2-3-3] 各銘柄の株価上昇率を計算

株価を取得した銘柄ごとに株価の上昇率を計算します。計算結果はディショクナリにいったん格納し、最後にDataFrameに変換します。

    # 銘柄ごとに上昇率を計算し、ディショクナリに格納する
    dict = {}
    for symbol in symbols:
        
        # 基準日付からの上昇率を計算する
        base_date_str = base_date.strftime('%04Y-%02m-%02d')
        base_price = stock_price.loc[base_date_str][('Close',symbol)]
        increase_rate = stock_price[('Close',symbol)] / base_price.iloc[0]
        
        # ディクショナリに格納する
        dict[symbol] = increase_rate
        
    # ディクショナリからDataFrame作成
    df = pd.DataFrame(dict)

[2-4] 業種ごとの平均値, 標準偏差を算出

業種ごとの株価上昇率について、平均値と標準偏差を計算します。計算結果はDataFrameに追加していきます。

    # 業種内銘柄の上昇率の平均値を計算する
    mean = df.mean(axis='columns')
    std = df.std(axis='columns')
    
    # DataFrameに業種単位の上昇率と、上昇率の標準偏差を格納する
    if category_df is None:
        category_df = pd.concat([mean, std], axis=1)
        category_df.columns = pd.MultiIndex.from_tuples(
            [(category_class, '上昇率'), (category_class, '標準偏差')])
    else:
        category_df[(category_class, '上昇率')] = mean
        category_df[(category_class, '標準偏差')] = std
    
    print(category_df)
    #             鉱業              建設業          
    #             上昇率    標準偏差  上昇率     標準偏差
    # Date                                         
    # 2021-02-05  1.308617  NaN     1.170162  0.130083
    # 2021-02-04  1.274549  NaN     1.157672  0.130904
    # ...         ...       ...     ...       ...
    # 2020-11-04  1.054108  NaN     1.007299  0.013290
    # 2020-11-02  1.000000  NaN     1.000000  0.000000
    # 
    # [65 rows x 4 columns]

鉱業はTOPIX500銘柄が「国際石油開発帝石」しかないため、標準偏差が計算できずNaNとなっています。複数銘柄ある場合には標準偏差が計算されます。

[2-5] 折れ線グラフで株価上昇率を可視化

まずは、業種ごとに株価上昇率を折れ線グラフで可視化します。2020年11月〜2021年2月は、バイデン大統領の当選や金融緩和の継続もあり、全体的に株価が上昇していました。

f:id:predora005:20210211200716p:plain

import matplotlib.pyplot as plt
import matplotlib.dates as mdates

# 上昇率のみを抽出し、業種の数を取得する
increase_rate_df = category_df.loc[:, pd.IndexSlice[:, '上昇率']]
industry_num = len(increase_rate_df.columns)

# rows, colsを決定し、Figureを取得
rows, cols = (6, 6)
fig = plt.figure(figsize=(20, 16))

# 上昇率の最大値と最小値を取得
min_y = increase_rate_df.min().min()
max_y = increase_rate_df.max().max()

# 業種ごとに折れ線グラフを表示する
for i in range(industry_num):
    
    # Axesを取得
    ax = fig.add_subplot(rows, cols, i+1)
    
    # 銘柄名
    category_name = increase_rate_df.columns[i][0]
    
    # 上昇率を取得
    increate_rate = increase_rate_df.loc[:, pd.IndexSlice[category_name, '上昇率']]
    
    # 折れ線グラフを表示
    x = increase_rate_df.index
    y = increate_rate
    ax.plot(x, y, label=category_name)
    
    # 目盛り線を表示
    ax.grid(color='gray', linestyle='--', linewidth=0.5)
    
    # X軸の目盛り位置を設定
    ax.xaxis.set_major_locator(mdates.MonthLocator())
    
    # Y軸の範囲を設定
    ax.set_ylim(min_y, max_y) 
    
    # グラフのタイトルを追加
    ax.set_title(category_name)
    
# 不要な余白を削る
plt.tight_layout()

# グラフを表示
fig.show()

[2-6] 棒グラフで株価上昇率を可視化

次は上昇率を棒グラフで可視化します。

f:id:predora005:20210211200803p:plain

棒グラフを表示する前に、一度DataFrameを作成し直しています。これは、上昇率でソートするためです。元のDataFrameはMultiIndexになっており、そのままの形ではソートが難しかったためです。

# 最新日付を取得する
latest_date = category_df.index.max()
latest_date_str = latest_date.strftime('%04Y-%02m-%02d')

# 最新日付の上昇率, 標準偏差を抽出する
increase_rate = category_df.loc[latest_date_str, pd.IndexSlice[:, '上昇率']]
std = category_df.loc[latest_date_str, pd.IndexSlice[:, '標準偏差']]

# 業種名をリストで取得
categories= [col[0] for col in increase_rate.columns]

# 上昇率と標準偏差を列にもつDataFrameを作成し、上昇率で降順ソートする
df = pd.DataFrame({'上昇率': increase_rate.values[0], '標準偏差': std.values[0]}, 
                    index=categories)
df = df.sort_values('上昇率', ascending=False)
print(df)
#              上昇率      標準偏差
# 海運業        1.329285   0.148943
# 電気機器      1.313898   0.194788
# 非鉄金属      1.312967   0.141995
# 鉱業          1.308617  NaN
# 石油・石炭製品  1.291704   0.1598
# ...(以下略)...

barhで可視化します。xerrを使用して、標準偏差をエラーバーとして表示しています。

# 図と座標軸を取得
fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(1,1,1)

# 棒グラフに表示するデータを準備
x = np.arange(len(categories))
y = df['上昇率']
yerr = df['標準偏差']
label = df.index

# 棒グラフ表示
ax.barh(x, y, xerr=yerr, tick_label=label)

# 目盛り線を表示
ax.grid(axis='x', color='gray', linestyle='--', linewidth=0.5)

# 不要な余白を削る
plt.tight_layout()

# グラフを表示
fig.show()

[3] TOPIX500銘柄の銘柄ごとの株価上昇率を算出

[3-1] 銘柄ごとの株価上昇率を算出

業種ごとの平均値, 標準偏差を算出したのと同様の方法で行います。pandas-datareaderによる株価取得は業種単位で行い、そののち銘柄ごとの株価上昇率を計算します。

# 33業種コード,33業種区分を抽出
industry_category = topix500.groupby(['33業種コード','33業種区分']).groups.keys()

# 銘柄単位の株価上昇率格納用のディクショナリを用意する
brand_dict = {}
brand_count = 0

# 業種ごとに変動率を計算する
for category in industry_category:
    
    category_code = category[0]     # 33業種コード
    category_class = category[1]    # 33業種区分
    
    # 指定した業種の銘柄を抽出
    brands = topix500[topix500['33業種区分'] == category_class]
    
    # 銘柄コードの末尾に.JPを付加する
    symbols = []
    for code in brands['コード']:
        symbols.append('{0:d}.JP'.format(code))
        
    # 指定銘柄コードの株価を取得する
    stock_price = web.DataReader(symbols, 'stooq', start=base_date)
    
    # 銘柄ごとに上昇率を計算し、ディショクナリに格納する
    dict = {}
    for symbol in symbols:
        
        # 銘柄ごとに上昇率を計算し、ディショクナリに格納する
        # 基準日付からの上昇率を計算する
        base_date_str = base_date.strftime('%04Y-%02m-%02d')
        base_price = stock_price.loc[base_date_str][('Close',symbol)]
        increase_rate = stock_price[('Close',symbol)] / base_price.iloc[0]
        
        # ディクショナリに格納する
        dict[symbol] = increase_rate
        
    # ディクショナリからDataFrame作成
    df = pd.DataFrame(dict)
    
    # 最新日付を取得する
    latest_date = stock_price.index.max()
    latest_date_str = latest_date.strftime('%04Y-%02m-%02d')
    
    # 銘柄単位の株価上昇率をディクショナリに格納する
    for i, symbol in enumerate(symbols):
        
        code = brands['コード'].iloc[i]
        name = brands['銘柄名'].iloc[i]
        increase_rate = df.loc[latest_date_str, symbol].iloc[0]
        
        # '33業種コード','33業種区分', 'コード', '銘柄名', '上昇率'])
        brand_dict[brand_count] = [category_code, category_class, code, name, increase_rate]
        brand_count += 1
        
# 銘柄単位の株価上昇率を格納したDataFrameを作成する
brand_df = pd.DataFrame.from_dict(
                brand_dict, orient="index", 
                columns=['33業種コード','33業種区分', 'コード', '銘柄名', '上昇率'])

業種ごとの株価上昇率は日単位で算出していましたが、銘柄については最新日付の株価上昇率のみとしています。

[3-2] 株価上昇率と上位10, 下位10銘柄を確認

[3-2-1] 上位10銘柄

まずは上位10銘柄を確認します。

# 上昇率で降順ソート
df_sorted = brand_df.sort_values('上昇率', ascending=False)

# 上位銘柄を抽出
df_top = df_sorted.head(10)

電気機器・輸送用機器銘柄の上昇が目立ちます。

33業種区分 銘柄名 上昇率
電気機器 コニカミノルタ 1.854610
電気機器 シャープ 1.839968
電気機器 ジーエス・ユアサ コーポレーション 1.838553
輸送用機器 川崎重工業 1.784906
輸送用機器 マツダ 1.675393
情報・通信業 コナミホールディングス 1.661905
その他金融業 東京センチュリー 1.648956
輸送用機器 日産自動車 1.634646
輸送用機器 ヤマハ発動機 1.589777
機械 IHI 1.581

[3-2-2] 下位10銘柄

次に下位10銘柄を確認します。

# 上昇率で昇順ソート
df_sorted = brand_df.sort_values('上昇率', ascending=True)

# 下位銘柄を抽出
df_bottom = df_sorted.head(10)

銀行業が多めであり、最大で17%弱の減少です。2020年11月〜2021年2月は、TOPIXが17%近く上昇していることもあってか、極端に大きな下落にはなっていませんでした。

33業種区分 銘柄名 上昇率
銀行業 滋賀銀行 0.835329
銀行業 九州フィナンシャルグループ 0.857708
繊維製品 ゴールドウイン 0.859155
情報・通信業 光通信 0.867015
サービス業 ベネッセホールディングス 0.871878
食料品 東洋水産 0.872659
小売業 ウエルシアホールディングス 0.874092
銀行業 山口フィナンシャルグループ 0.886364
食料品 カゴメ 0.888743
銀行業 中国銀行 0.894793

終わりに

pandas-datareaderでTOPIX500銘柄の株価を取得し、業種ごとの株価上昇率を可視化しました。以前にスクレイピングで株価を取得しましたが、pandas-datareaderの方が簡単に株価を取得できました。

predora005.hatenablog.com

ただ、取得できるデータ数が限られるという利用制限があります。一度取得したデータを保存しておく等の工夫は必要だとは感じました。過去データはpandas-datareaderで取得・保存しておいて、最新の株価はスクレイピングで取得するのがよいのかもしれません。

*1:StockSnapによるPixabayからの画像

*2:2021/2/8時点

pandas-datareaderのインストール手順と米国株の株価取得方法

f:id:predora005:20210201003956j:plain
<pandas-datareaderで米国株の株価取得>*1

「pandas-datareader」で株価を取得します。以前、日本株の株価をスクレイピングで取得しましたが、「pandas-datareader」の方がより簡単に取得できました。

バンガード S&P500 ETF (VOO)の株価を取得し、グラフ表示するまでの手順を紹介します。

f:id:predora005:20210201003119p:plain

[1] インストール

[1-1] pipでインストール

公式の手順に従ってインストールします。pipコマンドでインストールが可能です。

pip3 install pandas-datareader

最新版をインストールする場合は、GitHubからダウンロードしインストールします。

pip3 install git+https://github.com/pydata/pandas-datareader.git

[1-2] 動作確認

正常に動作するか確認します。

import pandas_datareader as pdr

# 米国国債10年を5年分取得
gs10 = pdr.get_data_fred('GS10')
print(gs10)
#             GS10
# DATE            
# 2016-03-01  1.89
# 2016-04-01  1.81
#   ...(途中省略)...
# 2020-11-01  0.87
# 2020-12-01  0.93

ダウ平均株価が正常に取得できました。

[2] データソースを決める

[2-1] 使用可能なデータソースを確認する

pandas-datareaderでは複数のデータソースから、株価や為替の情報が取得できます。取得できる情報は下記リンクに掲載されています。

Remote Data Access — pandas-datareader 0.9.0rc1+2.g427f658 documentation

ユーザ登録しAPIキーの取得が必要なデータソースもあります。今回はAPIキー無しで株価が取得可能な「Stooq」を選択しました。

[2-2] Stooqでデータを取得してみる

公式に載っている、Stooqでダウ平均を取得するソースコードを実行してみます。

import pandas_datareader.data as web

# ダウ平均をSqooqで取得
f = web.DataReader('^DJI', 'stooq')
print(f.head())
#                 Open      High       Low     Close     Volume
# Date                                                         
# 2021-01-29  30553.91  30553.91  29856.30  29982.62  638488708
# 2021-01-28  30377.19  30951.41  30377.19  30603.36  528513252
# 2021-01-27  30893.78  30893.78  30206.91  30303.17  655432794
# 2021-01-26  30968.55  31121.42  30921.71  30937.04  441398941
# 2021-01-25  30989.85  30989.85  30564.06  30960.00  532855231

ダウ平均株価が正常に取得できました。

[3] 株価を取得する

[3-1] VOOの株価取得

バンガード S&P500 ETF (VOO)の株価を取得してみます。

import datetime

# バンガード S&P500 ETF (VOO)の2020年以降の株価を取得
voo = web.DataReader(
    'VOO', 'stooq', 
    start=datetime.datetime(2020, 1, 1)
)
print(voo)
#               Open      High     Low   Close   Volume
# Date                                                 
# 2021-01-29  345.31  346.2200  338.57  340.18  5803647
# 2021-01-28  345.97  351.0707  345.58  347.13  3432188
#   ...(途中省略)...
# 2020-01-03  291.08  293.1900  290.90  292.08  3294270
# 2020-01-02  293.12  294.2600  292.18  294.23  3194572
# 
# [272 rows x 5 columns]

DataReaderのAPI仕様は下記URLで参照できます。pandas_datareader.data.DataReaderはラッパーになっています。stooqを指定するとStooqDailyReaderが実際には使われます。

Stooq.com — pandas-datareader 0.9.0rc1+2.g427f658 documentation

[3-2] 株価をグラフ表示

取得したVOOの株価をmatplotlibでグラフ表示します。

import matplotlib.pyplot as plt

# 図と座標軸を取得
fig = plt.figure()
ax = fig.add_subplot(1,1,1)

# 折れ線グラフをセット
ax.plot(voo.index, voo['Close'], label='VOO')
ax.grid(axis='y', color='gray', ls=':')
ax.legend()

# 折れ線グラフを表示
fig.show()

f:id:predora005:20210201003119p:plain

終わりに

驚くべきほど簡単に株価が取得できました。取得した時点でDataFrameになっているのが最大のメリットですね。

しかも、株価だけでなく国債利回りやダウ平均、為替まで取得できるので、本当に無料で良いのかなと思ってしまうほどです。

*1:StockSnapによるPixabayからの画像

【政府統計】pythonによる政府統計e-StatのAPI機能の使い方

f:id:predora005:20210107001006p:plain
*1

政府統計の総合窓口(e-Stat)」の統計データは、APIで取得可能です。ユーザ登録(無料)を行えば、誰でもAPIを利用できます。

Pythonを使って、API経由で人口動態のデータを取得し、matplotlibでグラフ表示しました。

f:id:predora005:20210131100819p:plain

[1] ユーザ登録

利用ガイドにしたがって、ユーザ登録します。メールアドレスを入力し仮登録します。

f:id:predora005:20210127185110p:plain

仮登録後メールに記載されているURLにアクセスし、本登録を行います。

利用する機能で「API機能」「地図で見る統計」をチェックします。チェックを外す理由は特に無いでしょう。

f:id:predora005:20210127185232p:plain

パスワードを入力するか、ソーシャルアカウント連携を行えば本登録完了です。

f:id:predora005:20210127185259p:plain

[2] アプリケーションIDの取得

ユーザ登録が終わったら、マイページからアプリケーションIDを取得します。

f:id:predora005:20210128212911p:plain

f:id:predora005:20210128212934p:plain

名称、URL、概要を入力します。以下は公式の引用です。

アプリケーションID取得時に入力する名称、URL、概要は後から変更しても構いません。また、URLについては、公開サイトで利用しない場合は、ローカルアドレス(「http://test.localhost/」等)を入力してください。

URLは公開サイトで利用しないので、ガイド通りのURLとしました。名称と概要は適当です。

f:id:predora005:20210128213035p:plain

[発行]ボタンを押すと、appId欄にアプリケーションIDが表示されます。

f:id:predora005:20210128213050p:plain

[3] 取得できるデータと統計表IDを確認する

e-Statの全てのデータがAPIで取得できるわけではありません。それでも数多くのデータが取得可能です。

また、APIで特定のデータにアクセスするには「統計表ID」が必要です。統計表IDは各データでユニークなIDです。ブラウザで取得したいデータの統計表IDを確認します。

[3-1] ブラウザで確認する方がAPIより楽

API機能でも確認できるのですが、結論としてはブラウザ「データベース | 統計データを探す | 政府統計の総合窓口」から確認する方が早いです。

データの数が1万を軽く超える数あるので、APIで取得しても見るのが大変です。

[3-2] ブラウザで統計表IDを確認する

ブラウザからデータベース | 統計データを探す | 政府統計の総合窓口にアクセスします。今回は分野から「人口・世帯」を選択し、最新の「人口動態調査」を探していきました。

f:id:predora005:20210130150401p:plain

f:id:predora005:20210130150407p:plain f:id:predora005:20210130150413p:plain f:id:predora005:20210130150417p:plain

最下層まで辿っていくと、[DB]と[API]が表示されます。[API]を押したら目的は達せられるのですが、いったん[DB]を選択してデータの中身を確認します。

f:id:predora005:20210130150422p:plain

データの中身が確認できたので、[API]を選択します。

f:id:predora005:20210130150428p:plain

API機能でアクセスするためのURLが表示されます。statsDataIdの後ろの数字が「統計表ID」です。appId(アプリケーションID)は空欄になっています。APIを使用する際は取得した自身のIDをセットします。

f:id:predora005:20210130150435p:plain

また、ファイル形式はXML,JSON,CSVのいずれかが選択できます。ファイル形式を変更すると、URLも自動的に変更してくれます。

appId=の後ろに取得したアプリケーションIDをコピーし、ブラウザでアクセスします。すると、データがXML形式で表示されました。

f:id:predora005:20210130150438p:plain

[4] メタ情報を取得する

「統計表ID」を用いてメタ情報を取得します。メタ情報は公式のAPI仕様によると次の通りです。

指定した統計表IDに対応するメタ情報(表章事項、分類事項、地域事項等)を取得します。

先程の人口動態調査ですと、行(年度:2018年, 2017年...)と列(出生率, 死亡数...)が取得できます。

[4-1] ブラウザで取得

まずは、ブラウザで確認します。下記URLをブラウザに入力します。

https://api.e-stat.go.jp/rest/3.0/app/getMetaInfo?appId={アプリケーションID}&statsDataId=0003411561&explanationGetFlg=N

f:id:predora005:20210130212013p:plain f:id:predora005:20210130212018p:plain

[4-2] Pythonで取得

Pythonで取得する際は、JSON形式で取得します。ブラウザではXML形式で取得しましたが、PythonではJSON形式の方が扱いやすいからです。

import requests

app_id = {アプリケーションID}
stats_data_id = 0003411561 # 年次別にみた人口動態総覧

# メタ情報取得のURL
url = 'https://api.e-stat.go.jp/rest/3.0/app/json/getMetaInfo?'
url += 'appId={0:s}&'.format(app_id) 
url += 'statsDataId={0:s}&'.format(stats_data_id)
url += 'explanationGetFlg=N&'   # 解説情報有無:無し

# メタ情報取得
json = requests.get(url).json()
print(json)
# {'GET_META_INFO': {'RESULT': {'STATUS': 0, 'ERROR_MSG': '正常に終了しました。', 'DATE': '2021-01-30T21:26:13.043+09:00'}, 
# 'PARAMETER': {'LANG': 'J', 'STATS_DATA_ID': '0003411561', 'EXPLANATION_GET_FLG': 'N', 'DATA_FORMAT': 'J'}, 
# 'METADATA_INF': {'TABLE_INF': ...(省略)...
# 'CLASS_INF': {'CLASS_OBJ': [{'@id': 'cat01', '@name': '人口動態総覧', 
# 'CLASS': [{'@code': '00110', '@name': '出生数', '@level': '1', '@unit': '人'}, ...(省略)...

取得したJSONから、行と列の情報を抽出します。

# メタ情報から各表のCLASS(行や列)を抽出
class_objs = json['GET_META_INFO']['METADATA_INF']['CLASS_INF']['CLASS_OBJ']
print(class_objs)
# [ {'@id': 'cat01', '@name': '人口動態総覧', 
#   'CLASS': [{'@code': '00110', '@name': '出生数', '@level': '1', '@unit': '人'}, ...(省略)...
#   {'@id': 'time', '@name': '時間軸(年次)', 
#   'CLASS': [{'@code': '2018000000', '@name': '2018年', '@level': '1'}, ...(省略)...

[5] 統計データの取得

APIの統計データ取得を用いて、データの中身(値)を取得します。

[5-1] ブラウザで確認

まずはブラウザで、どのようなデータ構造になっているのか確認します。

https://api.e-stat.go.jp/rest/3.0/app/getMetaInfo?appId={アプリケーションID}&explanationGetFlg=N

f:id:predora005:20210130224945p:plain

VALUEタグの中に値が格納されており、属性に何のデータかが示されています。属性はメタ情報と対応しています。「cat01」は「人口動態総覧」のカテゴリを示しており、「00110」は人口動態総覧のうち「出生数」であることを示しています。

[5-2] Pythonで確認

メタ情報の際と同様にJSON形式で取得します。

app_id = {アプリケーションID}
stats_data_id = 0003411561 # 年次別にみた人口動態総覧

# 統計データ取得のURL
url = 'https://api.e-stat.go.jp/rest/3.0/app/json/getStatsData?'
url += 'appId={0:s}&'.format(app_id) 
url += 'statsDataId={0:s}&'.format(stats_data_id)
url += 'metaGetFlg=N&'          # メタ情報有無
url += 'explanationGetFlg=N&'   # 解説情報有無
url += 'annotationGetFlg=N&'    # 注釈情報有無

# 統計データ取得
json = requests.get(url).json()

# 統計データからデータ部取得
values = json['GET_STATS_DATA']['STATISTICAL_DATA']['DATA_INF']['VALUE']

# jsonからDataFrameを作成
df = pd.DataFrame(values)
print(df)
#      @cat01       @time @unit        $
# 0     00110  2018000000     人   918400
# 1     00110  2017000000     人   946146
# 2     00110  2016000000     人   977242
# 3     00110  2015000000     人  1005721
# 4     00110  2014000000     人  1003609
# ...     ...         ...   ...      ...
# 3154  00430  1903000000  人口千対     1.44
# 3155  00430  1902000000  人口千対     1.43
# 3156  00430  1901000000  人口千対     1.43
# 3157  00430  1900000000  人口千対     1.46
# 3158  00430  1899000000  人口千対     1.53
# 
# [3159 rows x 4 columns]

JSON形式で取得したデータは、後で扱いやすいようにDataFrameに変換しました。

[5-3] IDやCODEを意味のわかる内容に置き換える

これは必須ではありませんが、データの可読性のためにやりました。

DataFrameの列名'@cat01', '@time'を一目見ただけだと意味が理解づらいですし、値も'00110'や'2018000000'となっており分かりづらいです。メタ情報を用いて、意味の分かる内容に置き換えます。

# 統計データのカテゴリ要素をID(数字の羅列)から、意味がわかる名称に変更する
for class_obj in meta_info:

    # メタ情報の「@id」の先頭に'@'を付与'した文字列が、
    # 統計データの列名と対応している
    column_name = '@' + class_obj['@id']
    
    # 統計データの列名を「@code」から「@name」に置換するディクショナリを作成
    id_to_name_dict = {}
    for obj in class_obj['CLASS']:
        id_to_name_dict[obj['@code']] = obj['@name']
    
    # ディクショナリを用いて、指定した列の要素を置換 
    df[column_name] = df[column_name].replace(id_to_name_dict)

# 統計データの列名を変換するためのディクショナリを作成
col_replace_dict = {'@unit': '単位', '$': '値'}
for class_obj in meta_info:
    org_col = '@' + class_obj['@id']
    new_col = class_obj['@name']
    col_replace_dict[org_col] = new_col

# ディクショナリに従って、列名を置換する
new_columns = []
for col in stats_data:
    if col in col_replace_dict:
        new_columns.append(col_replace_dict[col])
    else:
        new_columns.append(col)
        
df.columns = new_columns
print(df)
#      人口動態総覧 時間軸(年次)    単位        値
# 0       出生数   2018年     人   918400
# 1       出生数   2017年     人   946146
# 2       出生数   2016年     人   977242
# 3       出生数   2015年     人  1005721
# 4       出生数   2014年     人  1003609
# ...     ...     ...   ...      ...
# 3154    離婚率   1903年  人口千対     1.44
# 3155    離婚率   1902年  人口千対     1.43
# 3156    離婚率   1901年  人口千対     1.43
# 3157    離婚率   1900年  人口千対     1.46
# 3158    離婚率   1899年  人口千対     1.53
# 
# [3159 rows x 4 columns]

[6] matplotlibでグラフ表示

APIで取得した「年次別にみた人口動態総覧」のデータを、matplotlibでグラフ表示します。

[6-1] 数値に変換する

年が文字列になっているので、整数値に変換します。変換値は「年度」という新しい列に格納します。

# 時間軸(年次)を整数に変換
df['年度'] = df['時間軸(年次)'].map(lambda year: int(year.replace('年','')))

次は「値」列について、有効値以外をNaNに変換します。例えば、戦前には調査していなかったデータなどは"…"といった値が格納されています。NaNに変換後、列のデータタイプをfloat64に変換します。

import numpy as np

# 有効値以外をNaNに置換する
df['値'] = df['値'].replace(['***', '-', '.', '…'], np.nan)
df['値'] = df['値'].astype(np.float64)

[6-2] 出生率と死亡率を表示

出生率と死亡率をDataFrameから取り出し、折れ線グラフで表示します。

import matplotlib.pyplot as plt

# 出生率と死亡率を取得する
birth_rate = df[df['人口動態総覧'] == '出生率']
mortality_rate = df[df['人口動態総覧'] == '死亡率']

# 図と座標軸を取得
fig = plt.figure()
ax = fig.add_subplot(1,1,1)

# 折れ線グラフをセット
ax.plot(birth_rate['年度'], birth_rate['値'], label='出生率(人口千対)')
ax.plot(mortality_rate['年度'], mortality_rate['値'], label='死亡率(人口千対)')

# Y軸の範囲設定
ymax = max([ birth_rate['値'].max(), mortality_rate['値'].max() ])
ax.set_ylim([0, ymax])

# 凡例表示
ax.legend()

# 折れ線グラフを表示
fig.show()

2005年ごろを境に死亡率が出生率を上回り、人口が減少していることが分かります。

f:id:predora005:20210131100755p:plain

[6-3] 自然増減率を第二軸に追加

第二軸に自然増減率を第二軸に追加します。自然増減率が0以下になると、人口が減少することを意味します。

# 自然増減率を取得する
natutal_id_rate = df[df['人口動態総覧'] == '自然増減率']

# 自然増減率を第二軸にプロット
ax2 = ax.twinx()
ax2.plot(natutal_id_rate['年度'], natutal_id_rate['値'], 'C2', ls=':', label='自然増減率(人口千対)')
ax2.set_ylabel('自然増減率(人口千対)')
ax2.grid(axis='y', color='gray', ls=':')

出生率と死亡率が交わるタイミングと、自然増減率が0になるタイミングが一致しています。

f:id:predora005:20210131100819p:plain

終わりに

そこまで大きな苦労はなく、APIで統計データを取得できました。今後、他のデータと組み合わせたり、色々と有効活用できそうです。

[付録1] APIで統計表情報取得

個人的には、APIではなくブラウザで確認する方をオススメします。

[付1-1] ブラウザで試しに確認

ブラウザで次のURLを直接入力して確認します。

API機能のうち「統計表情報取得」を使用して確認します。

https://api.e-stat.go.jp/rest/3.0/app/getStatsList?appId={アプリケーションID}&limit=2

  • limit=2では、取得するデータを2データまでに限定します。

上記URLにアクセスすると、次の結果が得られます。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<GET_STATS_LIST xsi:noNamespaceSchemaLocation="https://api.e-stat.go.jp/rest/3.0/schema/GetStatsList.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <RESULT>
        <STATUS>0</STATUS>
        <ERROR_MSG>正常に終了しました。</ERROR_MSG>
        <DATE>2021-01-27T22:44:59.685+09:00</DATE>
    </RESULT>
    <PARAMETER>
        <LANG>J</LANG>
        <DATA_FORMAT>X</DATA_FORMAT>
        <LIMIT>1</LIMIT>
    </PARAMETER>
    <DATALIST_INF>
        <NUMBER>183998</NUMBER>
        <RESULT_INF>
            <FROM_NUMBER>1</FROM_NUMBER>
            <TO_NUMBER>1</TO_NUMBER>
            <NEXT_KEY>2</NEXT_KEY>
        </RESULT_INF>
        <TABLE_INF id="0003288322">
            <STAT_NAME code="00020111">民間企業の勤務条件制度等調査</STAT_NAME>
            <GOV_ORG code="00020">人事院</GOV_ORG>
            <STATISTICS_NAME>民間企業の勤務条件制度等調査(民間企業退職給付調査) 統計表 1 定年制と定年退職者の継続雇用の状況</STATISTICS_NAME>
            <TITLE no="1">(推計値) 定年制の状況</TITLE>
            <CYCLE>年次</CYCLE>
            <SURVEY_DATE>201601-201612</SURVEY_DATE>
            <OPEN_DATE>2019-03-20</OPEN_DATE>
            <SMALL_AREA>0</SMALL_AREA>
            <COLLECT_AREA>該当なし</COLLECT_AREA>
            <MAIN_CATEGORY code="03">労働・賃金</MAIN_CATEGORY>
            <SUB_CATEGORY code="02">賃金・労働条件</SUB_CATEGORY>
            <OVERALL_TOTAL_NUMBER>25</OVERALL_TOTAL_NUMBER>
            <UPDATED_DATE>2019-03-30</UPDATED_DATE>
            <STATISTICS_NAME_SPEC>
                <TABULATION_CATEGORY>民間企業の勤務条件制度等調査(民間企業退職給付調査)</TABULATION_CATEGORY>
                <TABULATION_SUB_CATEGORY1>統計表</TABULATION_SUB_CATEGORY1>
                <TABULATION_SUB_CATEGORY2>1 定年制と定年退職者の継続雇用の状況</TABULATION_SUB_CATEGORY2>
            </STATISTICS_NAME_SPEC>
            <DESCRIPTION/>
            <TITLE_SPEC>
                <TABLE_CATEGORY>(推計値)</TABLE_CATEGORY>
                <TABLE_NAME>定年制の状況</TABLE_NAME>
                <TABLE_EXPLANATION>1 事務・技術関係職種の従業員がいる企業41,314社について集計した。2 「定年年齢」内の数値は定年制がある企業を100とした場合の割合を示す。</TABLE_EXPLANATION>
            </TITLE_SPEC>
        </TABLE_INF>
        <TABLE_INF id="0003288323">
            ...(省略)...
        </TABLE_INF>
    </DATALIST_INF>
</GET_STATS_LIST>

[付1-2] Pythonで取得

Pythonで取得する際は、json形式で取得します。

# coding: utf-8

import sys
import requests

# エントリーポイント
if __name__ == '__main__':
    
    # コマンドライン引数からアプリケーションID取得
    if len(sys.argv) < 2:
        print('Usage:')
        print('  python3 {0:s} [appId]'.format(sys.argv[0]))
        sys.exit(1)
    app_id = sys.argv[1]
    
    # 統計表情報取得のURL
    url = 'https://api.e-stat.go.jp/rest/3.0/app/json/getStatsList?'
    url += 'appId={0:s}&'.format(app_id)
    url += 'limit=2'

    # 統計表情報取得
    json = requests.get(url).json()
    print(json)
# {'GET_STATS_LIST': {'RESULT': 
# {'STATUS': 0, 'ERROR_MSG': '正常に終了しました。', 'DATE': '2021-01-27T22:52:49.687+09:00'}, 
# 'PARAMETER': {'LANG': 'J', 'DATA_FORMAT': 'J', 'LIMIT': 1}, 
# 'DATALIST_INF': {'NUMBER': 183998, 'RESULT_INF': ...(以下略)...

アプリケーションIDをソースに直打ちしたくないので、コマンドライン引数で指定しています。

[付1-3] pandasのDataFrame形式に変換

json形式のままだと見づらいので、pandasのDataFrame形式に変換します。いったんディクショナリのリストにした後、DataFrameに変換します。

import pandas as pd

# 統計表情報から各表のデータ部取得
datalist = json['GET_STATS_LIST']['DATALIST_INF']['TABLE_INF']

# ディクショナリ形式にし、pandasのDataFrameに変換
dict_list = []
for data in datalist:
    dict = {}

    # 統計表ID
    dict['id'] = data['@id']
    
    # 政府統計コードと統計名
    dict['stat_id'] = data['STAT_NAME']['@code']
    dict['stat_name'] = data['STAT_NAME']['$']
    
    #タイトル
    if '$' in data['TITLE']:
        dict['title'] = data['TITLE']['$']
    else:
        dict['title'] = data['TITLE']
    
    # 担当機関
    dict['gov_code'] = data['GOV_ORG']['@code']
    dict['gov_name'] = data['GOV_ORG']['$']
    
    # ディクショナリをリストに追加
    dict_list.append(dict)

df = pd.DataFrame(dict_list)
print(df)
#    id          stat_id   stat_name                 title                           gov_code  gov_name
# 0  0003288322  00020111  民間企業の勤務条件制度等調査  (推計値) 定年制の状況               00020     人事院
# 1  0003288323  00020111  民間企業の勤務条件制度等調査  (推計値) 定年制の今後の変更予定の状況  00020     人事院

[付1-4] CSVファイルに出力

URLのlimit=1000に変更して、1,000件の統計表情報を取得します。そして、取得したデータをCSVファイルに出力します。

df.to_csv('list.csv')

CSVファイルを確認すると、各データのIDやタイトルが確認できます。

id stat_id stat_name title gov_code gov_name
0003288322 00020111 民間企業の勤務条件制度等調査 (推計値) 定年制の状況 00020 人事院
... ... ... ... ...
0003354588 00100101 情報化社会と青少年に関する調査 親 Q6 [カード4] 携帯電話もPHSも使わない理由は何ですか。次の中から、あてはまるものをいくつでもあげてください。(M.A.) 家族の就労状況 00100 内閣府

データは1,000件だけでなく、まだまだ沢山あります。APIでキーワード検索等の絞り込みも行えますが、ブラウザで確認した方が楽です。

*1:200 DegreesによるPixabayからの画像

【政府統計】e-Statの使い方(政府の統計データを見る)

f:id:predora005:20210107001006p:plain
*1

政府統計の総合窓口(e-Stat)」は政府の統計データが閲覧できるサイトです。公式の利用ガイドには次のように書かれています。

政府統計の総合窓口(e-Stat)は、各府省が公表する統計データを一つにまとめ、統計データを検索したり、地図上に表示できるなどの、たくさんの便利な機能を備えた政府統計のポータルサイトです。

職種別の平均年収、人口ピラミッド、人口密度分布といったデータを閲覧できます。

f:id:predora005:20210105121141p:plain

f:id:predora005:20210105214843p:plain

f:id:predora005:20210105231621p:plain

数多くのデータがあり、様々な形式で表示したりダウンロードできます。今回はe-Statの使い方と、どのようなデータがあるのか概要をまとめました。

[1] 基本的な使い方

[1-1] データを探す

データの探し方は色々ありますが、まずは分野から探してみます。

f:id:predora005:20210104211147p:plain

分野は17種類に分かれています。皆さんが想像するような主要な統計データは一通り揃っています。今回は「労働・賃金」分野の「民間給与実態統計調査」を見てみます。

f:id:predora005:20210104211159p:plain

次の画面から「データベース」を選択し「年次」「2016年」と選択していくと、各統計表を選ぶ画面に進みます。

f:id:predora005:20210104213725p:plain

f:id:predora005:20210104214345p:plain

f:id:predora005:20210104214402p:plain

たくさんの統計表が並んでいます。その中から「給与所得者数・給与額・税額 業種別」の「DB」を選択します。

f:id:predora005:20210104211228p:plain

すると、表形式でデータが表示されます。

f:id:predora005:20210104211242p:plain

[1-2] データを絞る

列が多いので、表示する列を絞り込みます。[表示項目選択]を押して項目の選択を行っていきます。

f:id:predora005:20210104215516p:plain

まずは「1/3 表章項目」を「給与所得者数(年間月平均)」と「給与額(平均)」に絞ります。

f:id:predora005:20210104215530p:plain

「3/3 年」は「2016年」のみに絞ります。

f:id:predora005:20210104215541p:plain

これで少し見やすくなりました。

f:id:predora005:20210104215554p:plain

[1-3] グラフを表示する

[グラフ表示]を押すとグラフが表示されます。ただ、このままでは分かりにくいので表示する項目を変更します。

f:id:predora005:20210105105827p:plain

まずは「合計」を表示項目から外します。

f:id:predora005:20210105110022p:plain

次に給与額(平均)のチェックを外し「給与所得者数(年間月平均)」のみ表示するようにします。

f:id:predora005:20210105110217p:plain

これで少しは見やすくなりました。

f:id:predora005:20210105120516p:plain

次は棒グラフを縦向きに変更し、業種を基準軸にします。

f:id:predora005:20210105120554p:plain

これで見るに耐えうる表示になりました。製造業がもっとも人数が多く、電気・ガス・熱供給・水道業がもっとも少ないと分かります。文字が見切れているのは何とも出来ませんでした。

f:id:predora005:20210105120853p:plain

同じ要領で業種ごとの給与額を見てみます。

f:id:predora005:20210105121113p:plain

単位は千円です。電気・ガス・熱供給・水道業がもっとも給与が高く、800万円超えです。宿泊業・飲食サービス業がもっとも低く、150万くらいです。恐らく、パートの方も含んでいるのでしょう。

f:id:predora005:20210105121141p:plain

[2] 統計ダッシュボードを使う

次は[グラフ]をクリックして、統計ダッシュボードを使います。

f:id:predora005:20210105214815p:plain

統計ダッシュボードはe-Statとは別ページに飛びます。

f:id:predora005:20210105214831p:plain

人口ピラミッドを表示すると、いい感じに表示されます。調査をした時点を変えたり、都道府県別に表示したりもできます。

f:id:predora005:20210105214843p:plain

次は[地域の見える化]を選択し「世界と日本のすがた」を見てみます。

f:id:predora005:20210105215720p:plain

2020年の各国の人口が表示されました。表示する国を選ぶことは出来ないようです。

f:id:predora005:20210105215335p:plain

アニメーションを再生させて、時系列の変化を見ることもできます。

f:id:predora005:20210105215350p:plain

人口以外にも「完全失業率」「国内総生産」を見ることも可能です。

f:id:predora005:20210105215403p:plain

続いて「地域のレーダーチャート・ランキング」を見てみます。

f:id:predora005:20210105221908p:plain

デフォルトでは東京都のレーダーが表示されます。

f:id:predora005:20210105221943p:plain

表示する項目は変更できます。項目は40以上あります。

f:id:predora005:20210105222042p:plain

また、各項目についてランキングを表示することもできます。

f:id:predora005:20210105222057p:plain

[3] 時系列表を見る

今度は「時系列表」を見てみます。

f:id:predora005:20210105222537p:plain

分野と表示できる項目が表示されます。

f:id:predora005:20210105222544p:plain

項目を選択すると、時系列表が表示されました。

f:id:predora005:20210105222551p:plain

[4] 統計GISを使う

続いて[地図]をクリックし「地図で見る統計」を開きます。

f:id:predora005:20210105223849p:plain

中段の「地図で見る統計 (jSTAT MAP)」をクリックします。

f:id:predora005:20210105223855p:plain

地図が開きました。ここから色々な作業を行っていきます。

f:id:predora005:20210105223901p:plain

[4-1] 統計グラフ作成

右下の[統計図作成]をクリックするとメニューが表示されます。その中から[統計グラフ作成]を選択します。

f:id:predora005:20210105231555p:plain

ダイアログが表示されますので「調査名」「年」「集計単位」を選択していきます。

f:id:predora005:20210105231603p:plain

今回は「国勢調査」「2015年」「都道府県」を選択しました。その中からさらに「人口性比、密度」「密度(人口総数)」を選択し、[指標選択]をクリックします。

f:id:predora005:20210105231608p:plain

すると、下段に「密度(人口総数)」が追加されます。他のデータも追加できますが今回はこの状態で[次へ]をクリックします。

f:id:predora005:20210105231613p:plain

集計単位と集計範囲はそのままの状態で[集計開始]をクリックします。

f:id:predora005:20210105232717p:plain

無事、都道府県ごとに人口密度が色分けされました。

f:id:predora005:20210105231621p:plain

[4-2] プロット作成

次は地図上にプロットを作成します。

f:id:predora005:20210106214134p:plain

プロット作成には3パターンあります。[ジオコーディング], [緯度経度付きファイル]は事前準備が必要です。今回は何も準備していないので[地図クリック]を選びました。

f:id:predora005:20210106214143p:plain

プロットを作成するためにはグループが必要です。グループには複数のプロットを含むことができます。グループ名を「東京都の駅」とし、アイコンは「ピン型(青)」としました。

f:id:predora005:20210106214147p:plain

[決定]を押すと、地図が再び表示され、地図上をクリックするように促されます。

f:id:predora005:20210106214153p:plain

八王子駅立川駅を登録しました。プロットの作成はこれで終わりです。作成したプロットはこのあとの「エリア作成」で使います。

f:id:predora005:20210106214202p:plain

[4-3] エリア作成

先ほど作成したプロット(八王子駅立川駅)から徒歩15分圏内のエリアを作成します。

f:id:predora005:20210106221106p:plain

グループ名に「駅から15分圏内」を入力します。その他はデフォルトのままでも問題ありません。

f:id:predora005:20210106221116p:plain

次にエリアの作成方法から「到達圏」を洗濯します。

f:id:predora005:20210106221122p:plain

先ほど作成したプロットを使いたいので「到達権(プロットグループ指定)」を選択します。

f:id:predora005:20210106221127p:plain

プロットグループは先ほど作成したグループ「東京都の駅」を選択します。到達圏指定は「徒歩、時速4km、15分圏」に設定します。エリア作成範囲は「すべて」としました。

f:id:predora005:20210106221131p:plain

駅から15分圏内のエリアが、水色のワクで表示されました。

f:id:predora005:20210106221137p:plain

[4-4] 計測

続いては「計測」で距離と面積を計測します。

f:id:predora005:20210106224219p:plain

まずは、上野駅秋葉原駅の直線距離を計測します。距離計測を選択して、上野駅秋葉原駅をクリックすると「1.776km」と表示されました。

f:id:predora005:20210106224227p:plain

続いて、皇居の面積を計測します。面積計測を選択して、地道に皇居周りを選択していきます。結果「2.280km2」と表示されました。実際の面積は約2.3km2らしいので、実際と近い数値になっています。

f:id:predora005:20210106224236p:plain

[4-5] 選択

「選択」を使い、6-1で作成したグラフを選択します。今回はグラフ選択を使用しますが、プロットとエリアの選択も可能です。

f:id:predora005:20210106225843p:plain

宮城県を選択すると、宮城県の人口密度が表示されます。表示される内容は作成したグラフの内容によって変わります。人口密度のグラフを作成したので人口密度が表示されています。

f:id:predora005:20210106225849p:plain

新潟県と愛知県も選択すると、二県の人口密度が追加されました。

f:id:predora005:20210106225856p:plain

[5] 都道府県・市区町村のすがた

次は[地域]をクリックし「都道府県・市区町村のすがた」を見ていきます。

f:id:predora005:20210106234154p:plain

[データ表示]と[地域ランキング]とがありますが、[データ表示]の方を選択します。

f:id:predora005:20210106233918p:plain

すると次の画面が表示されるので、地域選択、表示項目選択の順に行っていきます。

f:id:predora005:20210106233923p:plain

地域区分は「都道府県」とし、北海道と東方地方の県を選択しました。

f:id:predora005:20210106233930p:plain

表示項目選択では、年齢3区分の人口を選択しました。その中から、各区分の総人口に占める割合を選択しました。

f:id:predora005:20210106233938p:plain

北海道・東北地方の、0〜14歳, 15〜64歳, 65歳以上の人口割合が表示されました。この中では秋田県がもっとも少子高齢化が進んでいます。

f:id:predora005:20210106233947p:plain

グラフ表示すると視覚的に表示できます。

f:id:predora005:20210106233953p:plain

グラフ表示は設定を以下のように変更しています。

f:id:predora005:20210106235024p:plain

データ表示については以上です。今度は「地域ランキング」を見てみます。

f:id:predora005:20210106235622p:plain

地域ランキングでは、公共スポーツ施設のランキングを確認しました。

f:id:predora005:20210106235628p:plain

意外なことに北海道が1位、東京都が2位、長野県が3位でした。人口の影響を受けてはいますが、それだけでは無いようです。

f:id:predora005:20210106235634p:plain

終わりに

e-Statの使い方を一通り確認しました。ここで紹介した統計データ以外にも、膨大なデータがe-Statには登録されています。

APIによるデータ取得も可能なので、様々なことに応用できそうです。

*1:200 DegreesによるPixabayからの画像

二輪車業界の株価予想(2020年12月)

f:id:predora005:20201228041731j:plain
<二輪車業界の株価予想(2020年12月)> *1

二輪車業界の株価予想をしました*2

ここでいう二輪車に自転車は含みません。バイクや原付のことと思ってください。

株式投資はくれぐれも自己責任でお願いします。

[1] 二輪車業界の主要プレイヤー

ホンダ、ヤマハ発動機、スズキ、川崎重工です。

2018年度の世界販売台数はホンダが2,023万台、売上は2兆1,000億円で世界第1位です。ヤマハ発動機の世界販売台数は第3位です*3

企業 売上 世界販売台数
ホンダ 2兆1,001億円 2,023万台
ヤマハ発動機 1兆221億円 537万台
スズキ 2,550億円 174万台
川崎重工 3,568億円 55万台

[2] 二輪車の需要

[2-1] 世界の需要

二輪市場は新興国が牽引しています。上から、インド、中国、インドネシアベトナムの順です。中国は自動車への以降期に入ったため減少すると見込まれています。市場全体で見れば、しばらくは緩やかな増加が見込まれます。

二輪車・バイク業界の動向・ランキング等を研究-業界動向サーチ

[2-2] 日本の需要

日本では減少の一途を辿っています。2013年と比べると、2020年は23%減です。かつては、原付第一種(最大30km/h)が販売台数の半分以上を占めていましたが激減しました。中型・大型二輪は原付ほどは減っていません。

2019年度二輪車市場動向調査について | JAMA

理由は原付に対する規制が厳しくなったことと、自転車に取って変わられていることです。電動アシスト付き自転車の売上は年々増えています。また、最近はロードバイクなどのスポーツ自転車も流行っていますね。

[3] 株価の推移

[3-1] 2020年の株価推移

コロナ禍で2月から3月にかけて大きく下落したものの、11月の大統領選挙後に大きく回復しています。通年で見ると年始と年末でほとんど変わっていません。 後述の通り、各社とも減収減益とは言え利益が出ることを受けてのことでしょう(川崎重工以外)。販売台数は回復の兆しを見せています。

f:id:predora005:20201226232406p:plain

[3-2] 2016年以降の株価推移

スズキ以外は減少傾向にあります。各社とも二輪車以外の事業も行っていますので、減少の要因は各社それぞれです。要因についてはこの後見ていきます。

f:id:predora005:20201226233827p:plain

[4] 各社の販売台数推移と内訳

[4-1] ホンダ

二輪事業は9割がアジアを占めています。もう1つの主力事業である、四輪事業においてもアジアが4割を占めており、アジアでの販売台数が重要であると分かります。

f:id:predora005:20201227090549p:plain

販売台数の推移を見ると、コロナ禍で2019年度と2020年度は減少しています。2016年から2018年度で見ると、二輪車の増加率が大きいことが分かります。

f:id:predora005:20201227092642p:plain

ライフクリエーション事業の販売台数は、パワープロダクツ(発電機、耕うん機、芝刈機、除雪機)などで構成されています。

[4-2] ヤマハ発動機

ヤマハ発動機アジアでの二輪車販売台数が8割以上を占めています。

ヤマハ発動機は、マリン事業が二輪車事業に継ぐ主力事業です。マリン事業は、ボートやウォータービークルの販売などを行っています。販売台数ではなく売上高の内訳ですが、こちらは北米が6割を占めています。

f:id:predora005:20201227135016p:plain

販売台数の推移を見ると、近年はやや減少傾向です。ヤマハ発動機の決算は12月なので、新型コロナウィルスの影響は含まれていません。

f:id:predora005:20201227135657p:plain

一方、マリン事業の方は二輪車事業と比較すると堅調です。ただ、2018年から2019年は横ばいなので、成長しているとは言えません。

f:id:predora005:20201227140422p:plain

[4-3] スズキ

スズキも二輪車の販売台数の8割はアジアが占めています。特に、インドでの売上が4割を占めている点が大きな特徴です。

f:id:predora005:20201227164848p:plain

スズキは、四輪事業が主力であり、二輪事業が売上や利益に占める割合は大きくありません(後述)。そのため、スズキの場合は四輪事業の成否が株価に大きく影響します。

販売台数の推移を見ると、コロナ禍の影響を受けています。コロナ以前(2015年度〜2018年度)は、四輪事業・二輪事業ともに販売台数を伸ばしています。

f:id:predora005:20201227165653p:plain

四輪事業はインドでの販売台数が大きく伸びており、日本での販売台数も順調に増えています。

f:id:predora005:20201227170052p:plain

[4-4] 川崎重工

川崎重工は販売台数の地域別内訳は無く、先進国・新興国で別れていました。内訳を見ると他の3社同様に、新興国の販売台数が大きな割合を占めています。

f:id:predora005:20201227193638p:plain

コロナ以前は販売台数が増加してましたが、2019年度はコロナ禍の影響で減少しています。

[5] 各社のセグメント別売上と利益

[5-1] ホンダ

ホンダの売上高の6割は四輪事業が占めています。一方、営業利益は内訳が年度ごとに異なっており、二輪車事業と金融サービス業が安定しています。

f:id:predora005:20201227104404p:plain

世界第1位の販売台数を誇る二輪車事業は、四輪事業と並ぶ利益を上げています。しかし、成長が鈍化していることや、為替影響などもあり年々利益率が低下していることが懸念点です。

[5-2] ヤマハ発動機

売上高の半分はランドモビリティ事業*4が占めており、ついでマリン事業となっています。一方、営業利益はマリン事業が半分を占めており、マリン事業の利益率が高いと分かります。

f:id:predora005:20201227171320p:plain

ヤマハ発動機の決算は12月のため、このデータはコロナ禍の影響を織り込んでいません。最新の決算資料を見ると、当然コロナ禍の影響はあり、2020年12月期は減収減益を見込んでいます。

2019年度実績を見ると、ランドモビリティ事業とマリン事業は減益ですが、これは為替の影響もあります。ロボティクス事業は市況悪化による減益ですが、2019年度実績は概ね前年度と横ばいと言えます。

[5-3] スズキ

スズキは四輪事業が売上高・営業利益ともに9割を占めています。コロナ禍の影響で2019年度は減収減益となっていますが、2018年までは販売台数が伸び続けており順調と言えます。

二輪事業はスズキの場合には売上高に占める割合は低く、利益もゼロに近いです。

f:id:predora005:20201227171916p:plain

スズキも当然新型コロナウィルスの影響を受けています。四輪車の販売台数は全ての地域で減少を見込んでいます。主戦場であるインド・アジアも大きな減少を見込んでいるため、今年度も減収減益も見込んでいます。

[5-4] 川崎重工

川崎重工の事業分野は他3社に比べて多岐に渡っています。その中でも航空宇宙システムが売上・営業利益のおよそ30%を占めていました。

しかし、コロナ禍の影響で航空業界が大打撃を受けていることから、2020年度見通しでは赤字予想となっています。

f:id:predora005:20201228012801p:plain

二輪車事業は、モーターサイクル&エンジンに含まれます。売上高・営業利益ともに2割程度を占めています。コロナ禍により、2019年度は減収減益、2020年度見通しも減収減益です。

その他の事業も減益の見通しとなっており、2020年度は赤字予想です。

まとめ

[6-1] ホンダ

ホンダは二輪車の販売台数で世界第1位です。世界の販売台数の約30%を占めています。四輪事業の規模も大きく、売上高の6割を占めています。また、金融サービス業の利益率が高く、毎年利益を出しています。

懸念点は成長の鈍化です。二輪車のインドでの販売台数は鈍化しており、インドや台湾メーカーも台頭してきています。

いずれ、インドは自動車への以降期に入ります。二輪車の販売台数は横ばいになり、四輪車の販売台数はより増えると予想されます。また、インド以外の新興国での二輪車の販売台数は増えるでしょう。

今後、インドや新興国二輪車と四輪車の販売台数を増やせるかが株価上昇のカギとなりそうです。私はコロナ禍の収束により、2016年〜2017年の株価水準に戻る可能性はあるものの、それ以上の上昇の可能性は低いと見込んでいます。

事業は二輪車・四輪車の2つが主力であり、金融サービス業もホンダ製品販売のリースや融資です。二輪車と四輪車の販売台数増加には限度があるため、大きな株価上昇は無いという予想です。

[6-2] ヤマハ発動機

ヤマハ発動機もホンダ同様にアジアでの二輪車販売台数の増加が重要です。

しかし、先進国を中心としたマリン事業が好調ですし、ロボティクス事業を持っています。今後のロボット需要増加の中で売上を伸ばすことができれば、株価上昇も期待できます。

[6-3] スズキ

4社の中で唯一、2016年1月基準で株価が上昇しているのがスズキです。四輪車事業が9割の会社ですが、その四輪車事業が好調です。新型コロナウィルスの影響もあり2019年度は減収減益です。しかし、新興国でなく日本国内の販売台数も伸びており、利益も出ていることから株価が大きく下がる心配は無さそうです。

電気自動車やシェアライドが普及し始めたときに対抗できるかどうかは疑問です。しかし、普及にはまだしばらく時間がかかりそうです。そのため、コロナ禍の収束により一定の水準まで株価が上昇し、数年間は安定すると予想しています。

[6-4] 川崎重工

川崎重工は、二輪車事業の規模は大きくないものの、多岐に渡る事業で利益を出してきました。1事業がマイナスでも他事業で補えていました。しかし、コロナ禍により稼ぎ頭であった航空宇宙システムが大きな減益(前年比-500億円以上)となり、今年度は赤字となりそうです。

f:id:predora005:20201228015920p:plain

また、気になる点は借入が増えていることです。自己資本比率は25%前後でしたが、20%近くまで低下する見通しです。

コロナ禍の影響はしばらく続きそうです。そのため、航空業界の回復にはしばらく時間がかかりそうです。航空宇宙システムの回復も遅れると想定されるため、会社全体の利益回復には時間がかかりそうです。

そのため、株価もしばらくは低調な状態が続くと予想されます。

終わりに

今回は二輪車業界の決算資料と株価を元に、今後の株価を予想してみました。

自分自身、二輪車業界に詳しいわけでもなく、二輪車に乗るわけでもありませんでした。なので、決算資料を見て業界のことが少しわかっただけでも収穫でした。

この予想が当たるのか外れるのか楽しみに待ちたいと思います。願わくば、コロナ禍が早く収束し、予想を裏切って各社の業績が回復して欲しいです。

参考資料

Honda | 投資家情報 | IR資料室 | 決算関連資料

決算・発表資料 - 株主・投資家情報 | ヤマハ発動機

投資家向け説明会|スズキ

決算説明資料 | IRライブラリ | 川崎重工業株式会社

*1:Free-PhotosによるPixabayからの画像

*2:2020年12月末の情報で予想しています

*3:日経業界地図 2020年版より

*4:二輪車、オフロードビークル電動アシスト自転車など