PCA 降维分析

发布时间 2023-10-18 21:03:19作者: 天使不设防

数据来源:

这篇博客中借用下,百度云网页端居然可以直接下载文件了,稀奇

数据已经分享在百度云:客户年消费数据
密码:lehv
该份数据中包含客户id和客户6种商品的年消费额,共有440个样本

分析过程:

用python和R做个简单的PCA分析,顺便比较下结果是不是一致

numpy计算结果:
import numpy as np
import pandas as pd
data=pd.read_excel("客户年消费数据.xlsx")
data.head()

看一眼数据前几行:
image

#缺失检查
print(data.isnull().sum())

features = data[['Fresh', 'Milk', 'Grocery', 'Frozen', 'Detergents_Paper', 'Delicatessen']]
# 计算每一列的平均值及标准差
meandata = np.mean(features, axis=0) 
stddata = np.std(features, axis=0)
# 均值归一化
features = (features - meandata) / stddata    

# 求协方差矩阵
cov = np.cov(features.transpose()) # np.cov(features.T)

# 求解特征值和特征向量
eigVals, eigVectors = np.linalg.eig(cov) 
print('前两个主成分包含的信息百分比:{:.2%}'.format(np.sum(eigVals[:2])/np.sum(eigVals)))

# 选择前两个特征向量数据用于作图
pca_mat = eigVectors[:,:2]
pca_data = np.dot(features , pca_mat)
pca_data = pd.DataFrame(pca_data, columns=['pca1', 'pca2'])

结果:前两个主成分包含的信息百分比:72.46%

scikit-learn计算结果:
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
import pandas as pd

# 读取数据
data=pd.read_excel("客户年消费数据.xlsx")
features = data[['Fresh', 'Milk', 'Grocery', 'Frozen', 'Detergents_Paper', 'Delicatessen']]

# 数据标准化
scaler = StandardScaler()
features_std = scaler.fit_transform(features)
# PCA计算
pca = PCA()
pca.fit(features_std)

# 获取主成分
principal_components = pca.transform(features_std)

# 创建一个新的数据框来存储主成分
principal_df = pd.DataFrame(data=principal_components, columns=['PC1', 'PC2', 'PC3', 'PC4','PC5','PC6'])

# 输出主成分的方差解释比例
explained_variance_ratio = pca.explained_variance_ratio_
print("主成分的方差解释比例:", explained_variance_ratio)

# 输出特征向量的解释方差
explained_variance = pca.explained_variance_
print("特征向量的解释方差:", explained_variance)

# 输出特征向量的累计方差解释比例
cumulative_explained_variance_ratio = np.cumsum(explained_variance_ratio)
print("特征向量的累计方差解释比例:", cumulative_explained_variance_ratio)

结果:
可以看到和numpy计算结果一样的,前两个PC解释率都是72.46%
image

R语言计算结果:
library(openxlsx)
data<-read.xlsx("客户年消费数据.xlsx")

# 去掉ID列 
df<-data[,-1]

# 数据归一化
df_scale<-scale(df)
# 计算协方差矩阵
df_cov<-cov(df_scale)

# 计算特征值和特征向量
value<-eigen(cor(df_scale))$value
#vec<-value<-eigen(cor(df_scale))$vectors

# 主成分方差解释比例
ratio<-v/sum(v)

ratio结果: 0.44082893 0.28376400 0.12334413 0.09395504 0.04761272 0.01049519

# 累计解释率
cumsum(v2)
累计解释率:0.4408289 0.7245929 0.8479371 0.9418921 0.9895048 1.0000000

输出结果和python结果一致