python中的统计因子分析
Prince是一个进行因子分析的库。这包括多种方法,包括主成分分析(PCA)和对应分析(CA)。我们的目标是为每个算法提供一个高效的实现以及一个scikit学习api。
目录
安装
:警告:prince只与python 3兼容
:snake:虽然这不是一项要求,但强烈建议您使用蟒蛇。
通过PYPI
>>> pip install prince # doctest: +SKIP
通过Github获取最新开发版本
>>> pip install git+https://github.com/MaxHalford/Prince # doctest: +SKIP
除了水蟒身上常见的嫌疑犯(sklearn
,pandas
,matplotlib
)之外,普林斯没有任何额外的依赖关系。
用法
importnumpyasnp;np.random.set_state(42)# This is for doctests reproducibility
指南
prince提供的每个估计器扩展了scikit learn的transformermixin。这意味着每一个估计或者实现一个fit
和一个transform
方法,使它们在转换管道中可用。fit
方法实际上是返回行主成分的row_principal_components
方法的别名。但是,您也可以使用列主体组件来访问列主体组件
Hood Prince使用随机版本的SVD。这比使用更常见的完整方法要快得多。然而,结果可能有一个小的内在随机性。对于大多数应用程序,这并不重要,您不必担心它。但是,如果您想要可重复的结果,则应设置random_state
参数。
SVD的随机版本是一种迭代方法。由于prince的每个算法都使用svd,所以它们都有一个n_iter
参数来控制用于计算svd的迭代次数。一方面,数值越高,结果就越精确。另一方面,增加n_iter
会增加计算时间。一般来说,该算法收敛速度非常快,因此建议使用低n_iter
(这是默认行为)。
根据您的情况,您应该使用每种方法:
- 所有变量都是数字:使用主成分分析(
prince.pca
) - 您有一个列联表:使用对应关系分析(
prince.ca
) - 您有两个以上的变量,它们都是分类的:使用多对应分析(
prince.mca
) - 有一组分类变量或数值变量:使用多因素分析(
prince.mfa
) - 你有分类变量和数值变量:使用混合数据的因子分析(
prince.famd
)
下一小节将概述每个方法以及用法信息。如果您想深入研究,下面的论文将对因子分析领域进行一个很好的概述:
- 主成分分析教程
- 通信分析理论
- 寻找随机结构:构造近似矩阵分解的概率算法
- 多对应分析的计算,代码位于r
- 奇异值分解教程
- 多因素分析
主成分分析(PCA)
如果使用pca,则假定数据帧由连续的数值变量组成。在本例中,我们将使用虹膜花数据集。
>>>importpandasaspd>>>importprince>>>fromsklearnimportdatasets>>>X,y=datasets.load_iris(return_X_y=True)>>>X=pd.DataFrame(data=X,columns=['Sepal length','Sepal width','Petal length','Petal width'])>>>y=pd.Series(y).map({0:'Setosa',1:'Versicolor',2:'Virginica'})>>>X.head()SepallengthSepalwidthPetallengthPetalwidth05.13.51.40.214.93.01.40.224.73.21.30.234.63.11.50.245.03.61.40.2
pca
类实现scikit learn的fit
/transform
api。在调用fit
方法之前,必须在初始化时传递参数。
>>>pca=prince.PCA(...n_components=2,...n_iter=3,...rescale_with_mean=True,...rescale_with_std=True,...copy=True,...check_input=True,...engine='auto',...random_state=42...)>>>pca=pca.fit(X)
可用参数为:
n_components
:计算的组件数。如果你想做一个图表,你只需要两个。n_iter
:用于计算svd的迭代次数用"平均值"重新缩放:是否减除每列的平均值
用std重新缩放:是否用标准偏差除以每一列n
复制
:如果false
则计算将就地完成,这可能对输入数据产生副作用引擎
:要使用的SVD引擎(应该是['auto','fbpca','sklearn']
之一)随机状态
:控制SVD结果的随机性。
一旦pca
被拟合,它就可以用来提取行主坐标,如下所示:
>>>pca.transform(X).head()# Same as pca.row_coordinates(X).head()010-2.2647030.4800271-2.080961-0.6741342-2.364229-0.3419083-2.299384-0.5973954-2.3898420.646835
每一列代表一个主组件,而每一行代表原始数据集中的一行。您可以使用绘图行坐标显示这些投影
方法:
>>>ax=pca.plot_row_coordinates(...X,...ax=None,...figsize=(6,6),...x_component=0,...y_component=1,...labels=None,...color_labels=y,...ellipse_outline=False,...ellipse_fill=True,...show_points=True...)>>>ax.get_figure().savefig('images/pca_row_coordinates.svg')< div >
每一个主成分解释了分布的部分基础。您可以使用访问explained\u Inertia属性来查看访问量:
>>>pca.explained_inertia_# doctest: +ELLIPSIS[0.729624...,0.228507...]
所解释的惯量表示每个主分量贡献的惯量的百分比。如果n_components
属性等于原始数据集中的列数,则其总和为1。所解释的惯量是用奇异值分解得到的特征值除以总惯量得到的,这两个特征值都是可以得到的。
>>>pca.eigenvalues_# doctest: +ELLIPSIS[437.774672...,137.104570...]>>>pca.total_inertia_# doctest: +ELLIPSIS600.0...>>>pca.explained_inertia_[0.729624...,0.228507...]
您还可以获得原始变量和主成分之间的相关性。
>>> pip install prince # doctest: +SKIP
0
您可能还想知道每个观察对每个主成分的贡献有多大。这可以通过row\u contributions
方法来完成。
>>> pip install prince # doctest: +SKIP
1
您还可以使用逆变换方法将行投影转换回其原始空间。
>>> pip install prince # doctest: +SKIP
2
对应分析(CA)
当您要分析列联表时,应该使用对应关系分析。换句话说,你想分析两个分类变量之间的依赖关系。下面的例子来自于本教科书的17.2.3节。它显示不同头发和眼睛颜色之间出现的次数。
>>> pip install prince # doctest: +SKIP
3
与p ca
类不同,ca
只公开scikit learn的fit
方法。
>>> pip install prince # doctest: +SKIP
4
参数和方法与pca
类提出的参数和方法重叠。
>>> pip install prince # doctest: +SKIP
5
您可以使用plot_coordinates
方法绘制两组主坐标。
>>> pip install prince # doctest: +SKIP
6
< div >与pca类似,您可以访问每个主分量的惯量贡献、特征值和总惯量。
>>> pip install prince # doctest: +SKIP
7
多重对应分析(MCA)
多对应分析(mca)是对应分析(ca)的扩展。当有两个以上的分类变量时,应该使用它。这个想法很简单,就是计算一个数据集的热编码版本并对其应用ca。作为一个例子,我们将使用从uci数据集网站获取的气球数据集。
>>> pip install prince # doctest: +SKIP
8
mca还实现了fit
和transform
方法。
>>> pip install prince # doctest: +SKIP
9
与ca
类一样,mca
类也有plot_coordinates
方法。
>>> pip install git+https://github.com/MaxHalford/Prince # doctest: +SKIP
0
< div >特征值和惯量值也可访问。
>>> pip install git+https://github.com/MaxHalford/Prince # doctest: +SKIP
1
多因素分析(MFA)
多因素分析(mfa)是用来当你有一组变量。实际上,它在每个组上建立一个PCA——或者一个MCA,这取决于组变量的类型。然后,它根据所谓的部分pca(mcas)的结果构造一个全局pca。以下示例中使用的数据集来自本文。在数据集中,三位专家对六种不同的葡萄酒发表了自己的看法。每种葡萄酒的每种观点都被记录为一个变量。因此,我们希望考虑每个专家的不同意见,同时对每种葡萄酒进行全球概述。MFA非常适合这种情况。
首先,让我们复制论文中使用的数据。
>>> pip install git+https://github.com/MaxHalford/Prince # doctest: +SKIP
2
这些组作为字典传递给mfa
类。
>>> pip install git+https://github.com/MaxHalford/Prince # doctest: +SKIP
3
现在我们可以安装一个mfa
>>> pip install git+https://github.com/MaxHalford/Prince # doctest: +SKIP
4
mfa
继承自pca
类,这意味着您可以访问它的所有方法和属性。行坐标
方法将返回每种葡萄酒的全局坐标。
>>> pip install git+https://github.com/MaxHalford/Prince # doctest: +SKIP
5
就像pca
一样,您可以使用plot_row_coordinates
方法绘制行坐标。
>>> pip install git+https://github.com/MaxHalford/Prince # doctest: +SKIP
6
< div >还可以获取每个组中的行坐标。partial_row_coordinates
方法返回一个pandas.dataframe
其中的列集是一个pandas.multiindex
。索引的第一级对应于每个指定的组,而嵌套的级别表示每个组中的坐标。
>>> pip install git+https://github.com/MaxHalford/Prince # doctest: +SKIP
7
例如,您可以使用plot_partial_row_coordinates
方法可视化部分行坐标。
>>> pip install git+https://github.com/MaxHalford/Prince # doctest: +SKIP
8
< div >像往常一样,您可以访问惯性信息。
>>> pip install git+https://github.com/MaxHalford/Prince # doctest: +SKIP
9
您还可以通过部分因子分析属性访问有关每个部分因子分析的信息。
importnumpyasnp;np.random.set_state(42)# This is for doctests reproducibility0
行贡献
方法将为您提供每行相对于每个组件的惯性贡献。
importnumpyasnp;np.random.set_state(42)# This is for doctests reproducibility1
column_correlations
方法将返回原始变量和组件之间的相关性。
importnumpyasnp;np.random.set_state(42)# This is for doctests reproducibility2
混合数据的因子分析(famd)
一个描述在路上。此部分为空,因为我必须对文档进行一些重构。
importnumpyasnp;np.random.set_state(42)# This is for doctests reproducibility3
现在我们可以安装一个famd
importnumpyasnp;np.random.set_state(42)# This is for doctests reproducibility4
famd
继承自mfa
类,这意味着您可以访问它的所有方法和属性。行坐标
方法将返回每种葡萄酒的全局坐标。
importnumpyasnp;np.random.set_state(42)# This is for doctests reproducibility5
就像mfa
一样,您可以使用plot\u row\u coordinates
方法绘制行坐标。
importnumpyasnp;np.random.set_state(42)# This is for doctests reproducibility6 < div >
加速
默认情况下,prince
使用sklearn
的随机svd实现(在引擎盖下用于truncatedsvd
)。Prince的目标之一是使使用不同的SVD后端成为可能。目前唯一受支持的后端是Facebook的随机svd实现称为fbpca。您可以通过将引擎
参数设置为'fbpca'
:
importnumpyasnp;np.random.set_state(42)# This is for doctests reproducibility7
如果您使用的是水蟒,那么您应该可以通过运行pip install fbpca
,无需任何痛苦地安装fbpca
。
许可证
麻省理工学院的执照。有关详细信息,请参见许可文件。