对应分析是一种多元统计分析方法,主要用于分析定性变量构成的列联表,揭示变量之间的关系。它通过将列联表中的数据转换为点的形式,在低维空间中表示出来,从而实现数据的可视化。这种方法特别适用于有多个类别的定性变量分析,可以揭示同一变量的不同类别之间的差异以及不同变量的类别之间的对应关系。
对应分析的基本思想是将联列表的行和列中各元素的比例结构转换为点的形式,以直观地展示在二维或三维空间中。这种方法的特点是能够将多个样品和变量同时展示在同一张图上,直观地显示样品的大类及其属性。
对应分析的应用领域非常广泛,主要包括市场细分、产品定位、地质研究以及计算机工程等。它通过视觉化的数据分析方法,能够将看似无关的数据在视觉上展示出联系。
接下来将用一个实例来演示对应分析的步骤实现。问题背景如下:
假设我们有一个关于不同年龄段(青年、中年、老年)和他们对不同类型电影(动作片、喜剧片、爱情片)偏好的列联表数据。
# 导入所需的库
import pandas as pd
import prince
# 创建示例数据
data = {
"动作片": [50, 40, 30],
"喜剧片": [30, 40, 10],
"爱情片": [20, 20, 60]
}
index = ["青年", "中年", "老年"]
df = pd.DataFrame(data, index=index)
df
则创建数据如下:
目的是解释不同年龄段和电影类型之间的关系。
Step1:计算主成分上的得分
# 实施对应分析
ca = prince.CA(n_components=2)
ca = ca.fit(df)
# 查看前两个主成分的分数
df_scores = ca.row_coordinates(df)
df_scores
这段代码使用了prince
库中的CorrAnalysis
(对应分析)类来执行对应分析。下面是对代码的逐行解释:
-
ca = prince.CA(n_components=2)
:- 这行代码创建了一个
CorrAnalysis
类的实例,也就是对应分析的对象,命名为ca
。 n_components=2
参数指定了降维后的维度数量,这里设置为2,意味着分析将把数据降到二维空间,以便在二维平面上进行可视化。
- 这行代码创建了一个
-
ca = ca.fit(df)
:- 这行代码对数据集
df
执行对应分析。df
是一个DataFrame,应包含用于分析的数据。 fit
方法用于计算对应分析,它将数据拟合到模型中,并计算行和列的坐标。
- 这行代码对数据集
-
df_scores = ca.row_coordinates(df)
:- 这行代码从对应分析的结果中提取了行坐标,也就是数据集中每个观测点(例如,每个消费者或产品)在新的因子空间中的位置。
row_coordinates
方法返回一个DataFrame,其中包含了每个观测点在前两个主成分上的得分,这些得分定义了它们在二维因子平面图上的位置。
通过使用对应分析,我们得到了前两个主成分(PC1,PC2):
结果解释:
在主成分分析(PCA)中,每个主成分上的得分反映了原始数据中的主要变化方向。这些得分可以是正的也可以是负的,具体含义如下:
正得分:表示该变量(或年龄段)在主成分上表现为正向变化,即随着主成分值的增加,该变量(或年龄段)的值也增加。
负得分:表示该变量(或年龄段)在主成分上表现为负向变化,即随着主成分值的增加,该变量(或年龄段)的值减少。
- PC1:这个主成分上的得分显示了不同年龄段在电影偏好上的主要差异。例如,老年群体在PC1上的得分较高,表明他们的电影偏好与青年和中年群体有显著差异。
- PC2:这个主成分上的得分显示了年龄段在第二个维度上的差异。虽然这些差异不如PC1上那么显著,但它们仍然提供了关于不同年龄段偏好的额外信息。
Step2:结果可视化
要将对应分析的结果可视化,我们可以使用散点图来展示不同年龄段在主成分上的得分。这样,我们可以直观地看到不同年龄段在电影偏好上的差异和相似性。
# 因子平面图的绘制
import matplotlib.pyplot as plt
# 使用之前通过对应分析得到的主成分得分
pc1 = df_scores[0]
pc2 = df_scores[1]
# 绘制图
plt.figure(figsize=(8, 6))
plt.scatter(pc1, pc2, color=['blue', 'green', 'red'])
# 添加标签和标题
plt.title('对应分析结果可视化')
plt.xlabel('主成分1 (PC1)')
plt.ylabel('主成分2 (PC2)')
plt.grid(True)
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)
# 添加每个数据点的标签,使用 .iloc 方法
for i, txt in enumerate(df_scores.index):
plt.annotate(txt, (pc1.iloc[i], pc2.iloc[i]), fontsize=12, ha='center')
# 显示图例
plt.legend(df_scores.index, fontsize=12)
# 显示图表
plt.show()
散点图如下:
通过散点图,我们可以直观地看到不同年龄段在两个主成分上的分布。每个点代表一个年龄段,横坐标和纵坐标分别对应主成分1(PC1)和主成分2(PC2)的得分。从图中可以观察到:
- 青年群体在PC1上的得分较低,而在PC2上的得分居中。
- 中年群体在两个主成分上的得分都较低。
- 老年群体在PC1上的得分较高,而在PC2上的得分接近于0。
这种可视化帮助我们理解不同年龄段在电影偏好上的差异。例如,老年群体在PC1上的高分表明他们的电影偏好与青年和中年群体有显著差异。
以上演示了通过Python实现对应分析和可视化,探究了一个关于不同年龄段(青年、中年、老年)和他们对不同类型电影(动作片、喜剧片、爱情片)偏好的列联表数据之间的关系。
点下关注,分享更多有关AI,数据分析和量化金融相关的实用教程和案例分析。