対応分析のひながた
[記事の概要]
目的:
記事では、Googleの生成AIであるGeminiを利用して作成された対応分析用のひな形(Rスクリプト)が紹介されています。
データ構造:
元となるクロス表の列(表側)に原因、行(表頭)に結果を配置したデータを想定しています。
Rスクリプト:
以下のパッケージを使用しています。
FactoMineR
factoextra
ca
ggplot2
グラフの種類:
記事では、主に2種類のグラフが作成されています 。
Rowprincipal (非対称マップ): 因果関係(行が原因)の解釈に適しており、FactoMineR::CA()とfactoextra::fviz_ca_biplot()を使用して作成されます。
Symbiplot (対称バイプロット): 全体の相互関係の解釈に適しており、ca::ca()とca::plot()を使用して作成されます。
むかしハンス・ザイゼルの『数字で語る』(木村定・安田三郎訳、東洋経済新報社発行)という本を読んだことがある。その中に、「パーセントを計算する方向」ということが丁寧に説明してあった——新曜社発行の最新の版には出てこないかもしれない。その本には「説明図式」という考え方も出てきた。調査票を構成する質問群は、それに従って作成されなければならないという趣旨であったと思う。
「因果的分析」ということが目指されるならば、統計的分析に持ち込む変数は、何が非説明変数で、何が説明変数であるかが前もって想定されているはずだ。
Geminiを利用して対応分析用のひながたを作成してみた。基本的に、元になるクロス表において列(表側)に原因、行(表頭)に結果を配置したデータを想定した。ggplot2におけるthemeの設定は、mac OSで実行する場合を念頭に置いているので、他のOSを利用している場合には削除する必要があるかもしれない。
なお、以下においてrowprincipal (非対称マップ)を作成しているが、それは、データを転置しないでcolprincipalを設定したものと基本的には同じになることはもちろんである(補足)。データを転置すべきかどうかであるが、以下のスクリプトで生成されたデータについて言えば、対応分析用でなく一般的なクロス表であれば、転置せず、表頭(列変数)に原因(説明変数)に置くことが望ましいと思う。
# ----------------------------------------------------
# 必要なパッケージのインストールと読み込み
# ----------------------------------------------------
# まだインストールしていない場合は、以下の行のコメントを外して実行してください
# install.packages("FactoMineR")
# install.packages("factoextra")
# install.packages("ca")
library(FactoMineR)
library(factoextra)
library(ca)
library(ggplot2) # ggplot2はfactoextraで使用します
# ----------------------------------------------------
# データセット
# ----------------------------------------------------
data <- data.frame(
group_A = c(30, 10, 5, 2),
group_B = c(15, 25, 10, 5),
group_C = c(5, 10, 20, 15)
)
rownames(data) <- c("item_1", "item_2", "item_3", "item_4")
# 転置(クロス表の転置をおこない表側(ひょうそく)に「原因」が配置されるようにする)
(data <- t(data))
# ----------------------------------------------------
# グラフ1: rowprincipal (非対称マップ)
# ----------------------------------------------------
# 因果関係(行が原因)を解釈するのに適しています
# FactoMineR::CA()で分析を実行
res.ca_facto <- CA(data, graph = FALSE)
# factoextra::fviz_ca_biplot()でグラフを作成
fviz_ca_biplot(res.ca_facto,
map = "rowprincipal",
repel = TRUE) +
labs(title = "Rowprincipal (Asymmetric Map)") +
theme_minimal(base_family="HiraKakuProN-W3") +
theme(plot.title = element_text(hjust = 0.5))
# repel は、テキストラベルの重なりを防ぐためのオプション
# ----------------------------------------------------
# グラフ2: symbiplot (対称バイプロット)
# ----------------------------------------------------
# 全体の相互関係を解釈するのに適しています
# ca::ca()で分析を実行
res.ca_greenacre <- ca(data)
# ca::plot()でグラフを作成
# こちらはbase R graphicsを使用するため、ggplot2のテーマは適用されません
plot(res.ca_greenacre,
map = "symbiplot",
main = "Symbiplot (Symmetric Biplot)")
Asymmetric MapとSymmetric Biplotの例
➔北九州市長選挙出口調査の年代別得票率を対応分析によって再分析
[補足]
以下のグラフ(Colprincipal)は、基本的には最初のもの(Rowpincipal)と同じであるが、少し違う所がある(記号と色など)。列変数が三角の記号と赤色で示されている。rowprincipal (非対称マップ)は、データを転置しないでcolprincipalを設定したものと基本的には同じものであるが、その違い(記号と色の違い)に注意すべき。

「f. 統計言語R」カテゴリの記事
- 2種類のグラフ:参院選2025年福岡の市町村別の政党得票数(比例代表)及び候補者得票数(選挙区)の対応分析(2025.12.22)
- 地域や政党のクラスタリング(参院選2025年福岡のデータの対応分析に基づく)(2025.12.20)
- CAのあとにクラスタリングをするというオプションがRコマンダーにあった。(2025.12.18)
- [資料]参院選2025年データ(政党得票数と候補者得票数、政党の得票数と相対得票率) (2025.12.16)


