見出し画像

1-2 中央値を含む階級 〜 貯蓄高のヒストグラムはロングテール

今回の統計トピック


度数分布表、ヒストグラム、二期比較の折れ線グラフを作成します!
度数分布表と中央値・四分位数の関係も探ります。

公式問題集の準備

「公式問題集」の問題を利用します。お手元に公式問題集をご用意ください。
公式問題集が無い場合もご安心ください!
「知る」「実践する」の章で、のんびり統計をお楽しみください!

問題を解く


📘公式問題集のカテゴリ

1変数記述統計の分野
問2 中央値を含む階級(勤労者世帯における貯蓄額)

試験実施年月
統計検定2級 2019年6月 問1(回答番号2)

問題

公式問題集をご参照ください。

解き方

相対度数分布表は、データの個数の割合を一定間隔の「階級」に層別して、小さい順に並べて表現する表です
データの個数=世帯数の割合は、度数分布表の各階級の度数を全度数=全世帯数の合計で割った割合と同じ意味です。
相対度数分布表の縦合計は合計が1、または、100%になります。

中央値は、データを小さい順に並べたときに、ちょうど真ん中に位置するデータのことです。
相対度数分布表のように割合を0~100%の順に並べる場合には、50%に当たるデータが中央値です。
この問題では、累積して50%が含まれる階級を見つけます。
「累積相対度数が50%を含む階級」とも言えます。

問題の相対度数分布表の相対度数を小さい順に足し算(累積)します。
これは累積相対度数を計算することと同じ意味合いになります。
Aまで:13.2
Bまで:13.2+7.2=20.4
Cまで:20.4+7.0=27.4
Dまで:27.4+6.1=33.5
Eまで:33.5+5.6=39.1
Fまで:39.1+5.5=44.6
Gまで:44.6+4.5=49.1
Hまで:49.1+4.2=53.3
Hの累積相対度数が50%=中央値を含んでいます。

解答

①(H)です。

難易度 やさしい

・知識:度数分布表、中央値
・計算力:電卓(低)
・時間目安:1分

知る


おしながき

公式問題集の問題に接近してみましょう!
ここでは「2022年7~9月期の2人以上の勤労者世帯における貯蓄現在高データ」を利用します。

【出典記載】
出典:「家計調査」(総務省統計局)
【コンテンツ編集・加工の記載】
記事の記載にあたっては、「家計調査」(総務省統計局)を加工して作成しています。

このデータは階級別に度数(世帯数)をカウント済みです。
今回は度数分布表、中央値・四分位数、ヒストグラム、折れ線グラフに取り組みます。

データイメージ

度数分布表

📕公式テキスト:1.2.1 ヒストグラムの作成(6ページ)、1.2.2 その他の図表の作成(10ページ~)

度数分布表は「1変数」を要約記述する表です。
次の図は度数分布表のサンプルです。
列名が青色セルの列は基データの値、黄色セルの列は計算式等で求めています。

度数分布表サンプル

この度数分布表は、貯蓄現在高が100万円未満の世帯数、100万円以上~200万円未満の世帯数といった一定の範囲(階級)に層別して、世帯数をカウントしたものです。

中央値・四分位数
788,285世帯を貯蓄現在高の少ない順に並べて、25%、50%、75%の位置にある世帯の貯蓄現在高をそれぞれ、第1四分位数第2四分位数第3四分位数といいます。
特に真ん中になる第2四分位数は中央値ともいいます。
上の度数分布表では「累積相対度数」を見ることで、四分位数の含まれる階級が分かります。
・第1四分位数(25%点):300~400万円
・第2四分位数(50%点):900~1000万円
・第3四分位数(75%点):2000~2500万円

階級の幅に注目します。途中で幅が変わっています。
・1000万円未満:100万円間隔
・1000万円から2000万円未満:200万円間隔
・2000万円から3000万円未満:500万円間隔
・3000万円から4000万円未満:1000万円間隔
ヒストグラムで表すときに、この幅の違いが問題になる可能性があります。

ヒストグラム

📕公式テキスト:1.2.1 ヒストグラムの作成(6ページ~)

「ヒストグラム」は度数分布表と表裏一体のグラフです。
上の度数分布表の階級・度数をそのままヒストグラムにすると、次のようになります。

ヒストグラムサンプル

x軸(横軸)に階級(貯蓄現在高)、y軸(縦軸)に度数(世帯数)をプロットします。

いっけん、全体的にまんべんなく分布しているように見えます。
しかも貯蓄現在高4000万円以上の世帯数が最も多いように見えます。
肌感覚的になにか違和感を覚えます。。。

じつは、階級の幅が一定になっていないことが、この違和感の原因です。
・1000万円未満:100万円間隔【1倍】
・1000万円から2000万円未満:200万円間隔【2倍】
・2000万円から3000万円未満:500万円間隔【5倍】
・3000万円から4000万円未満:1000万円間隔【10倍】

階級の幅を100万円に揃えれば、誤解を防ぐことができそうです。
次の階級の世帯数をそれぞれ単純平均して補正します。
・1000万円から2000万円未満:200万円間隔【2分の1】
・2000万円から3000万円未満:500万円間隔【5分の1】
・3000万円から4000万円未満:1000万円間隔【10分の1】
なお、4000万円以上は便宜上、4000万円から6000万円まで20等分しました。

補正後のヒストグラムは次のようになります。

ヒストグラム(階級補正):2022年7~9月期

左に偏っていて右に裾が長いグラフです。
ちょうど真ん中の世帯の貯蓄現在高は917万円
かなり高額な感じもしますし、老後に必要とされる貯蓄額にはまだ遠そうな感じもします。
貯蓄のインフレ対策は大丈夫だろうか、なんて思ったりもします。

📕公式テキストの9ページに2014年の「二人以上の世帯の貯蓄」ヒストグラムが記載されています。ぜひご覧ください。

2期比較

公式問題集掲載の2015年と2022年を比較してみましょう。
折れ線グラフを並べてみます。

2比較(階級補正)

貯蓄現在高100万円未満の勤労者世帯(2人以上)の割合がかなり減ったように見えます。
世帯当たりの貯蓄が増加したのでしょうか?
正常な経済下で貯蓄額が増加したのならば、喜ばしいことに感じます。
将来の不安が貯蓄性向を上昇させた、貯蓄額の少ない層が非勤労者世帯/1人世帯になった、などの要因が影響しているのであれば、どうでしょうか。

実践する


度数分布表、ヒストグラム、折れ線グラフを作成してみよう

「2022年7~9月期の2人以上の勤労者世帯における貯蓄現在高データ」は政府統計の総合窓口「e-Stat」で公開されています。

総務省統計局の「家計調査」で作成される統計データです。
なんと「全国約9千世帯を対象として」毎月調査しているとのこと。
標本調査ですね!

次のリンクで2022年7~9月期データのダウンロードサイトを開くことができます。

家計調査 / 貯蓄・負債編 二人以上の世帯 詳細結果表
統計データはEXCELファイルにまとまっています。

統計データイメージ

CSVファイルのダウンロード
こちらのリンクから整形後のCSVファイルをダウンロードできます。
Pythonサンプルファイルを利用する方は、このCSVファイルをダウンロードしてください。

電卓・手作業で作成してみよう!

上述の方法でデータを取得して、電卓やそろばんをはじいて、手作業で度数集計表、ヒストグラム、折れ線グラフを書いてみましょう!
一番記憶に残る方法ですし、試験本番の電卓作業のトレーニングにもなります。

EXCELで作成してみよう!

データ数が多い場合、やはり手作業では非効率になります。
パソコンを利用して、手早く作表できるようになれば、実務活用がしやすくなるでしょう。

ヒストグラム

既に階級と度数が集計済みですので、あとはグラフを作成するだけです!
ヒストグラムを例にしてEXCELのグラフ作成の操作を辿ってみましょう。

■グラフの選択

EXCEL:グラフの選択

①表データの階級と度数を範囲指定します。
 セルが離れている場合は「Ctrl」ボタンを押しながら範囲指定します。
②メニューの挿入を選択します。
③リボンの「グラフ」の右隅の矢印ボタンを選択します。
④「グラフの挿入」画面が開きます。「すべてのグラフ」タブを選択します。
⑤縦棒を選択します。

■グラフのカスタマイズ
棒グラフ棒の隙間を狭くしてヒストグラムのように見せます。

EXCEL:グラフのカスタマイズ

①グラフの棒の部分をダブルクリックします。
②「データ系列の書式設定」のグラフのボタンを選択肢します。
 「要素の間隔」を調整します。値が小さいほど棒の幅が広がり、ヒストグラムのように見えるようになります。

EXCELサンプルファイルのダウンロード
こちらのリンクからEXCELサンプルファイルをダウンロードできます。


Pythonで作成してみよう!

プログラムコードを読んで、データを流したりデータを変えてみたりして、データを追いかけることで、作表ロジックを把握する方法も効果的でしょう。
サンプルコードを揃えておけば、類似する作表作業を自動化して素早く結果を得ることができます。

今回は階級補正の自動化に取り組んでみましょう。

①ライブラリのインポート
主にpandasを使用します。

import pandas as pd
from matplotlib import pyplot as plt
plt.rcParams['font.family'] = 'MS Gothic'

②CSVファイルの読み込み
まず、上述のダウンロードリンクより、CSVファイルをダウンロードします。
その後、次のコードを実行して、CSVファイルをpandasのデータフレームに読み込みます。

datafile = './sample_data.csv' # CSVファイルの格納フォルダとファイル名を設定
df = pd.read_csv(datafile)
df.head()

③度数分布表の整形
pandasのデータフレームで度数分布表を整形します。
もっとスマートなコードにできるかもしれません。

  • 階級の下限・上限の設定(関数)

  • 階級の補正
    階級幅が100万円以外の階級のデータに対して、階級幅が100万円になるように階級の下限・上限を設定、度数を按分して行を分割

  • 階級値、累積度数、相対度数、累積相対度数を計算

df_freq = df.copy()
df_freq.insert(1, '階級下限', 0)
df_freq.insert(2, '階級上限', 0)
df_freq.insert(3, '階級値', 0)

# 階級(文字)を階級下限と階級上限に分割する関数
def sep_cls(freq_cls):
    if '~' in freq_cls:
        low, up  = [int(s) for s in freq_cls.replace('万円', '').split('~')]
    elif '未満' in freq_cls:
        low, up = 0, int(freq_cls.replace('万円', '').replace('未満', ''))
    else:
        low = int(freq_cls.replace('万円', '').replace('以上', ''))
        up = int(low + 2000)
    return [low, up]

# 階級下限、階級上限の設定
df_freq[['階級下限', '階級上限']] = df_freq['階級'].apply(sep_cls).tolist()

# 階級幅が100以外の場合、行の分割
list_tmp = []
for i in range(len(df_freq)):
    diff = int((df_freq.iloc[i, 2] - df_freq.iloc[i, 1]) / 100)
    if diff:
        for j in range(diff):
            row_tmp = [df_freq.iloc[i, 0],                  # 階級
                       df_freq.iloc[i, 1] + j * 100,        # 階級下限
                       df_freq.iloc[i, 1] + j * 100 + 100,  # 階級上限
                       df_freq.iloc[i, 3],                  # 階級値
                       df_freq.iloc[i, 4] / diff]           # 度数
            if j != diff-1:               # 途中行はリストに蓄積
                list_tmp.append(row_tmp)
            else:                         # 最終行はデータフレームを更新
                df_freq.iloc[i] = row_tmp
# データフレームとリストをマージ
df_freq = pd.concat([df_freq, pd.DataFrame(list_tmp, columns=df_freq.columns)],
                   axis=0, sort=False, ignore_index=True)
df_freq = df_freq.sort_values('階級下限')
df_freq.reset_index(inplace=True, drop=True)

# 階級値、累積度数、相対度数、累積相対度数を計算
df_freq['階級値'] = ((df_freq['階級下限'] + df_freq['階級上限']) / 2).astype(int)
df_freq['累積度数'] = df_freq['度数'].cumsum()
df_freq['相対度数'] = df_freq['度数'] / df_freq['度数'].sum()
df_freq['累積相対度数'] = df_freq['相対度数'].cumsum()

# 度数分布表の表示
display(df_freq)
度数分布表出力結果(抜粋)


④ヒストグラムの作成

度数分布表データフレームからpandasのplotを利用してヒストグラムを作成します。
下から2行目のコメントを外すと、ヒストグラムの画像ファイルを指定したフォルダに保存できます。

df_freq.plot.bar(
    figsize=(8, 4), fontsize=8, width=1, 
    color='royalblue', edgecolor='lightgray', linewidth=0.8,
    x='階級値', y='度数', title='ヒストグラム', 
    label='世帯数',
    xlabel='貯蓄現在高:万円(階級値)',
    ylabel='世帯数(度数)')
plt.xticks(rotation=50, fontsize=7)  # x軸目盛り:階級値を回転
plt.tight_layout()
# plt.savefig('./hist.png')          # ヒストグラム画像ファイルの保存
plt.show()
ヒストグラム出力結果

⑤(参考)度数分布表データフレームをCSVファイルに保存
次のコードで度数分布表データフレームをCSVファイルにして保存できます。
保存フォルダとファイル名を適宜変更してください。

df_freq.to_csv('./freq_df.csv', encoding='utf_8_sig')

Pythonサンプルファイルのダウンロード
こちらのリンクからJupyter Notebook形式のサンプルファイルをダウンロードできます。



おわりに

第2回を迎えることができました。
徐々に記事のかたちを整えていけたらと思っています。
ご要望やご感想がありましたら、コメントをしていただけると嬉しいです。
今後もよろしくお願いいたします。

最後までお読みいただきまして、ありがとうございました。


のんびり統計シリーズの記事

次の記事

前の記事

目次

この記事が気に入ったらサポートをしてみませんか?