モザイクプロットとは
モザイクプロットは、データの分布や変数間の関係性を視覚的に表現するグラフの一種です。データを行と列のセルに分割し、各セルの面積を値の大きさに応じて調整することで、データの全体像を一目で把握できるようになっています。このグラフは、複雑なデータ構造を簡潔に表現することができるため、データ分析の初期段階で有効活用されます。
グラフの見方
モザイクプロットでは、各セルの面積が値の大きさを表しています。大きなセルは値が大きいことを、小さなセルは値が小さいことを示しています。
利用できる状況
モザイクプロットは、主に以下のような状況で活用されます:
- 複数の変数間の関係性を一度に確認したい場合
- データの全体的な分布傾向を把握したい場合
- 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 では、pandas
のpd.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のモザイクプロットはデフォルトで色分けになります。このようにセルを色分けすると、データの傾向をより視覚的に表現できます。
例えば、赤色のセルは値が高く、青色のセルは値が低いといった具合にすると、グラフはより直感的な表現になります。