日々のつれづれ

不惑をむかえ戸惑いを隠せない男性の独り言

モザイクプロットを活用したクロス集計の可視化

モザイクプロットとは

モザイクプロットは、データの分布や変数間の関係性を視覚的に表現するグラフの一種です。データを行と列のセルに分割し、各セルの面積を値の大きさに応じて調整することで、データの全体像を一目で把握できるようになっています。このグラフは、複雑なデータ構造を簡潔に表現することができるため、データ分析の初期段階で有効活用されます。

グラフの見方

モザイクプロットでは、各セルの面積が値の大きさを表しています。大きなセルは値が大きいことを、小さなセルは値が小さいことを示しています。

利用できる状況

モザイクプロットは、主に以下のような状況で活用されます:

  • 複数の変数間の関係性を一度に確認したい場合
  • データの全体的な分布傾向を把握したい場合
  • 2 つの変数間の相関関係を把握したい場合

これらの状況では、モザイクプロットが有効な可視化手段となります。データの構造が複雑な場合でも、一目で全体像を把握できるため、分析の初期段階で活用されることが多いです。

デモデータを使った作図

では、実際にデモデータを使ってモザイクプロットを作成してみましょう。

データの準備

まずは、サンプルデータを用意します。今回は、ある企業の従業員データとして、従業員の性別、年齢、所属部門の情報が含むデータを作成します。

set.seed(123)
# データの準備
dat <- data.frame(
  "DEPT." = sample(
    c("Sales", "General Affairs", "Development"),
    size = 20, replace = TRUE, prob=c(3,1,6)/10
  ),
  "SEX" = sample(c("M", "F"), size = 20, replace = TRUE, prob=c(1,4)/5),
  "AGE" = sample(25:30, size = 20, replace = TRUE)
)

knitr::kable(dat)

クロス集計表の作成

このとき、部門ごとの男女構成を集計します。クロス集計表は、行と列の変数の組み合わせによる度数を表したものです。

tbl = table(dat[,1:2])
knitr::kable(tbl)
F M
Development 10 2
General Affairs 2 1
Sales 4 1

この集計表を視覚的な理解を助けるグラフがモザイクプロットです。

モザイクプロットの作成

上記のデータを使って、モザイクプロットを作成します。モザイクプロットは、クロス集計表の情報を視覚的に表現したグラフです。各セルの面積が値の大きさを表します。 つまり、人数が一番多い Development の Female の面積が一番大きく、人数が一番少ない General Affair の Male と Sales の Male の面積が小さくなります。

X 軸の幅が各水準の合計比率を表していて、

$$Developmentの幅 : General Affairの幅 : Salesの幅 = Developmentの人数 : General Affairの人数 : Salesの人数$$

になります。

# モザイクプロットの作成
mosaicplot(x = tbl)

このように、モザイクプロットを使うことで、従業員の性別と部門の関係性を一目で把握することができました。このグラフを見ることで、例えば開発部門には男性が多く、総務部門には女性が多いといった傾向を簡単に読み取ることができます。

plot.tableの機能(補足)

モザイクプロットはtable(x)に対するグラフになるので、R ではplot.table(x)でも作図できます。

plot(x=tbl) # 引数がtableオブジェクトであれば、plotはplot.tableとして機能する

Python の例(補足)

Python では、pandaspd.crosstab関数を使ってクロス集計表を作成し、statsmodels.graphics.mosaicplot.mosaic関数を使ってモザイクプロットを描画することができます。

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import statsmodels.api as sm
from statsmodels.graphics.mosaicplot import mosaic

# 乱数シードの設定
np.random.seed(123)

# データの準備
dept_choices = ["Sales", "General Affairs", "Development"]
dept_probs = [0.3, 0.1, 0.6]
sex_choices = ["M", "F"]
sex_probs = [0.2, 0.8]
age_range = range(25, 31)

dept = np.random.choice(dept_choices, size=20, p=dept_probs)
sex = np.random.choice(sex_choices, size=20, p=sex_probs)
age = np.random.choice(age_range, size=20)

df = pd.DataFrame({"DEPT.": dept, "SEX": sex, "AGE": age})

# クロス集計表の作成と表示
tbl = pd.crosstab(df["SEX"], df["DEPT."])
print("\nクロス集計表:")
print(tbl)

# モザイクプロットの描画
plt.figure(figsize=(8, 6))
mosaic(df, ['DEPT.', 'SEX'], title='Gender composition in each department')
plt.show()

pythonのモザイクプロットはデフォルトで色分けになります。このようにセルを色分けすると、データの傾向をより視覚的に表現できます。

例えば、赤色のセルは値が高く、青色のセルは値が低いといった具合にすると、グラフはより直感的な表現になります。