K_DM Book
用語集
対象者 標準
対象者別の入口 →

対象者の設定はこのブラウザの中にだけ保存されます。

言語 JA

人口ピラミッド型でユーザー層の偏りを確認

中級

06.7.18

人口ピラミッド型でユーザー層の偏りを確認

最終更新 2020-09-23 読了時間 2 分
まとめ
人口ピラミッドは、年齢帯を縦に並べ、2 つのグループ(典型的には男女)の人数を中央の 0 から左右に伸びる横棒で描いて、年齢ごとの人数の差を左右の長さの違いとして見せる図です。2 本の棒を上下に並べるグループ化棒グラフより、同じ行で左右を見比べるだけで偏りが分かります。matplotlib では ax.barh(age_groups, male) と ax.barh(age_groups, -female) のように片方の値に負号を付けて描き、set_xticks で負の目盛りラベルを正の数字に書き換えれば完成します。読み終えると、30〜34 歳で女性 3,500 人が男性 3,300 人を上回る唯一の年齢帯を左右の長さから読み取り、A/B テストの属性分布比較などに同じ形を使えるようになります。

直感 #

会員 4 万人の年齢帯別の人数を男女で比べたいとき、男性の棒と女性の棒を年齢帯ごとに上下に並べると、14 本の棒を目で往復することになります。人口ピラミッドは中央に縦線を引き、男性を右へ、女性を左へ伸ばします。同じ年齢帯の行で左右の棒の長さを見比べるだけで、男女どちらが多いかと差の大きさ(この例では最大 200 人)が分かります。全体の形がピラミッド(下が広い)なら若い層が多い、逆三角形なら高齢層が多い、と人口構成の特徴も一目で読めます。この例では 18〜24 歳が最も多く、年齢が上がるほど減る典型的なピラミッド型です。

Python で描く #

次のコードは 7 つの年齢帯の男女の人数を用意し、男性を正、女性を負の値として barh で描いたうえで、負の目盛りを正の表示に書き換え、各棒の先に人数を添え、中央に 0 の縦線を引きます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import numpy as np
import matplotlib.pyplot as plt

age_groups = ["18-24", "25-29", "30-34", "35-39", "40-44", "45-49", "50-54"]
male = np.array([4200, 3800, 3300, 2700, 2200, 1600, 1200])
female = np.array([4000, 3600, 3500, 2900, 2400, 1700, 1300])

fig, ax = plt.subplots(figsize=(6, 4.8))
ax.barh(age_groups, male, color="#38bdf8", label="男性")
ax.barh(age_groups, -female, color="#f472b6", label="女性")

ax.set_xlabel("ユーザー数")
ax.set_title("年齢帯別の会員数(人口ピラミッド)")
ax.set_xlim(-4500, 4500)
ax.set_xticks([-4000, -2000, 0, 2000, 4000], labels=["4000", "2000", "0", "2000", "4000"])
ax.legend(loc="upper right")

for idx, (m_val, f_val) in enumerate(zip(male, female)):
    ax.text(m_val + 80, idx, f"{m_val}", va="center")
    ax.text(-f_val - 280, idx, f"{f_val}", va="center")

ax.axvline(0, color="#0f172a", linewidth=1)
ax.spines[["right", "top"]].set_visible(False)
ax.grid(axis="x", alpha=0.2)

fig.tight_layout()

plt.show()

年齢レンジ別の偏りが一目瞭然になりますの図

実行結果の読み方 #

右の水色が男性、左のピンクが女性で、同じ行の左右の長さを比べます。18〜24 歳は男性 4,200・女性 4,000 と男性がやや多く、30〜34 歳だけは女性 3,500 が男性 3,300 を上回っており、左の棒が右より長い唯一の行です。全体の形は下(若い層)が広く上(50〜54 歳)が狭いピラミッド型で、会員が若年層に偏っていることが読めます。棒の先の数値ラベルがあるので、200 人程度の差も見落としません。

使いどころと落とし穴 #

人口ピラミッドは、男女や「対照群と処置群」のように 2 グループの年齢帯別(または階層別)の分布を比べる場面に特化した図です。3 グループ以上を比べたいなら左右に振り分けられないので、積み上げ棒グラフやグループごとにパネルを分けたファセット棒グラフに切り替えます。左右で xlim の幅が違うと同じ人数でも長さが変わって比率を誤読するため、必ず set_xlim(-4500, 4500) のように対称に固定してください。年齢区分の幅が「18〜24(7 歳)」と「25〜29(5 歳)」のように不揃いだと、幅の広い区分が無条件に多く見えるので、比較が目的なら区分幅を揃えるか、1 歳あたりの人数に換算してから描きます。