数据来源:
从这篇博客中借用下,百度云网页端居然可以直接下载文件了,稀奇
数据已经分享在百度云:客户年消费数据
密码:lehv
该份数据中包含客户id和客户6种商品的年消费额,共有440个样本
分析过程:
用python和R做个简单的PCA分析,顺便比较下结果是不是一致
numpy计算结果:
import numpy as np
import pandas as pd
data=pd.read_excel("客户年消费数据.xlsx")
data.head()
看一眼数据前几行:
#缺失检查
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%
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<-value/sum(value)
ratio结果: 0.44082893 0.28376400 0.12334413 0.09395504 0.04761272 0.01049519
# 累计解释率
cumsum(ratio)
累计解释率:0.4408289 0.7245929 0.8479371 0.9418921 0.9895048 1.0000000
输出结果和python结果一致
标签:分析,PCA,features,explained,降维,np,variance,pca,data From: https://www.cnblogs.com/mmtinfo/p/17773249.html