1 缺失值处理
1.1 pandas中利用fillna()函数
通过fillna()方法,可以去掉数据集中的空值(nan值)。
# 数据生成import pandas as pdimport numpy as npdata={'a':[2,2,np.nan,5,6],'b':['kl','kl','kl',np.nan,'kl'],'c':[4,6,5,np.nan,6],'d':[7,9,np.nan,9,8]}df=pd.DataFrame(data)df
填充固定值
df.fillna(99) #所有空值填充为99
其他填充方式
df.fillna('str') # 填充字符串df.fillna({'a':0,'b':1}) #部分列填充固定值
更多填充方式可以参考文档(jupyter lab中,可以按shift+tab键)。
1.2 利用Imputer创建填充对象
# 数据import pandas as pdimport numpy as npc=np.array([[1,2,3,4],[4,5,6,np.nan],[5,6,7,8],[9,4,np.nan,8]]) #数组cC=pd.DataFrame(c) C
from sklearn.impute import SimpleImputer #导入相关模块imp=SimpleImputer(missing_values=np.nan,strategy='median')filled_C=imp.fit_transform(C)pd.DataFrame(filled_C) #填充的值是每列的中位数# 其他strategy:均值(mean)、中位数(median)、最频繁值(most_frequent)
2 数据规范化
2.1 均值-方差标准化
变量或指标数据减去其均值再除以标准差得到新的数据。
X∗=x−mean(x)std(x)X^*=\frac{x-mean(x)}{std(x)} X∗=std(x)x−mean(x)
from sklearn.preprocessing import StandardScaler #导入均值方差规范化模块scaler=StandardScaler()scaler.fit_transform(data)
这种方式处理数据,满足(μ,σ)的正态分布,注意这里并不是把数据限定在(-1,1)内的归一化操作。
2.2 极差归一化
变量或者指标数据减去其最小值,再除以最大值与最小值之差,得到新的数据范围在[0,1]
X∗=x−min(x)max(x)−min(x)X^*=\frac{x-min(x)}{max(x)-min(x)} X∗=max(x)−min(x)x−min(x)
from sklearn.preprocessing import MinMaxScaler #导入极差规范化模块scaler=MinMaxScaler()scaler.fit_transform(data)
3 主成分分析
多指标之间存在相关性的情况下,可能会影响到模型的分析效果。通过主成分分析可以将众多变量转换为少数几个互不相关的综合变量。
这是一种数据降维方法。从投影角度来看,主成分分析找到能使投影后的数据方差最大的投影方向,尽量保持原始数据的差异性。
3.1 数据展示
《农村居民人均可支配收入情况》数据可自行复制保存为csv文件导入,
3.2 主成分相关概念
找出几个综合变量来代替原来众多的变量,使得这些综合变量尽可能地代表原来变量信息且彼此互不相关。
特征向量(li1,li2…lip)特征值主成分方差百分比(贡献率):通过累计贡献率的设置,可以筛选出不同数量的主成分。
第i个主成分表示形式如下:
Yi=li1X1+li2X2+⋯+lipXpY_i=l_{i1}X_1+l_{i2}X_2+\cdots+l_{ip}X_p Yi=li1X1+li2X2+⋯+lipXp
注,最终生成的主成分Yi的个数≤X的个数,通过不同贡献率的限定可能得到不同的主成分个数。
3.3 案例应用
1、 生成协方差矩阵,判断变量之间的相关性
# 导入上方图表X=data.iloc[:,1:] # 地区文字数据剔除X.head() #显示前5行
# 生成协方差矩阵X.corr()
通过上表可以发现,工资性收入与财产净收入相关程度很高。
2、 主成分分析
# 数据规范化from sklearn.preprocessing import StandardScalerscaler=StandardScaler()X=scaler.fit_transform(X)X# 输出'''array([[ 2.62267702, -1.90653048, 3.65623472, -0.05290328],[ 1.52887926, 0.51994204, 2.00731096, -0.75273157],[ 0.15015642, -0.48083311, -0.29121072, -1.38861779],[-0.10218878, -1.40741312, -0.68320947, -0.47206122],[-0.75891073, 1.1971128 , 0.41366444, 0.31934239],[-0.13393451, 0.76359799, -0.29084943, -0.60492578],[-0.77935956, 2.2724, -0.38406204, -0.52025876],[-0.76329603, 1.35417039, 0.84757273, 0.1761957 ],[ 3.17331769, -2.41013094, 1.88411135, 3.26469409],'''
# PCAfrom sklearn.decomposition import PCApca=PCA(n_components=0.95) # 设置累计贡献率pca.fit_transform(X)# 输出'''array([[ 4.33588394, 1.2871025 , 1.68836853],[ 1.53736203, 2.12655221, 0.56027639],[-0.46694468, 0.18931331, 1.38413422],[-0.10431271, -1.123358 , 1.17241467],[-0.55472192, 0.67855307, -1.03614749],[-0.7860694 , 0.60996214, -0.01608431],[-1.74256785, 1.33152775, -1.02791134],[-0.43551643, 1.06930104, -0.9947622 ],[ 5.26192283, -1.30032837, -0.65586678],[ 1.26240024, 0.53263985, -1.0411674 ],[ 1.66736332, 1.59956567, -0.2701487 ],[-0.25754205, -0.62850484, -0.50489853],------------后面省略'''
通过主成分分析之后,原先的4个指标变量变成3个。
tzxl=ponents_tzxl # 特征向量# 输出'''array([[ 0.61009369, -0.38007555, 0.55610546, 0.41722294],[ 0.27066909, 0.68308081, 0.50755251, -0.45003255],[ 0.11152189, -0.60400387, 0.05543569, -0.78719062]'''
后续我们计算第一个主成分,就是用原先指标变量的数据乘上数组第一行[ 0.68846266, -0.34535834, 0.53950046, 0.3401265 ](即第一个特征向量)
tzz=pca.explained_variance_tzz # 特征值# 输出'''array([2.34641356, 0.93022743, 0.70345946])'''
gxl=pca.explained_variance_ratio_gxl #解释变量贡献率# 输出'''array([0.5676807 , 0.22505502, 0.1701918 ])'''
3 验证
数据规范化后的第一行为[ 2.62267702, -1.90653048, 3.65623472, -0.05290328]
特征向量:[ 0.61009369, -0.38007555, 0.55610546, 0.41722294]
设pca之后的第一个主成分为Y00,下面进行验证。
Y00=sum(X[0]*tzxl[0])# 输出Y00:4.3358839429206855
4 基于主成分进行综合评分排名
from sklearn.preprocessing import StandardScalerfrom sklearn.decomposition import PCAfrom pandas as pd# 规范化scaler=StandardScaler()X=scaler.fit_transform(X)# pcapca=PCA(n_components=0.95) # 设置累计贡献率Y=pca.fit_transform(X)tzxl=ponents_ tzz=pca.explained_variance_gxl=pca.explained_variance_ratio_# 构建综合评分,选取Pca之后的每一列数据X贡献率F=Y[:,0]*gxl[0]+Y[:,1]*gxl[1]+Y[:,1]*gxl[1]df=pd.Series(F,index=data['地区'])df.sort_values(ascending=False)