通过fillna()方法,可以去掉数据集中的空值(nan值)。
# 数据生成
import pandas as pd
import numpy as np
data={'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
| a | b | c | d | |
|---|---|---|---|---|
| 0 | 2.0 | kl | 4.0 | 7.0 |
| 1 | 2.0 | kl | 6.0 | 9.0 |
| 2 | NaN | kl | 5.0 | NaN |
| 3 | 5.0 | NaN | NaN | 9.0 |
| 4 | 6.0 | kl | 6.0 | 8.0 |
填充固定值
df.fillna(99) #所有空值填充为99
| a | b | c | d | |
|---|---|---|---|---|
| 0 | 2.0 | kl | 4.0 | 7.0 |
| 1 | 2.0 | kl | 6.0 | 9.0 |
| 2 | 99.0 | kl | 5.0 | 99.0 |
| 3 | 5.0 | 99 | 99.0 | 9.0 |
| 4 | 6.0 | kl | 6.0 | 8.0 |
其他填充方式
df.fillna('str') # 填充字符串
df.fillna({'a':0,'b':1}) #部分列填充固定值
更多填充方式可以参考文档(jupyter lab中,可以按shift+tab键)。
1.2 利用Imputer创建填充对象# 数据 import pandas as pd import numpy as np c=np.array([[1,2,3,4],[4,5,6,np.nan],[5,6,7,8],[9,4,np.nan,8]]) #数组c C=pd.DataFrame(c) C
| 0 | 1 | 2 | 3 | |
|---|---|---|---|---|
| 0 | 1.0 | 2.0 | 3.0 | 4.0 |
| 1 | 4.0 | 5.0 | 6.0 | NaN |
| 2 | 5.0 | 6.0 | 7.0 | 8.0 |
| 3 | 9.0 | 4.0 | NaN | 8.0 |
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
−
m
e
a
n
(
x
)
s
t
d
(
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
−
m
i
n
(
x
)
m
a
x
(
x
)
−
m
i
n
(
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 数据展示《2016年农村居民人均可支配收入情况》数据可自行复制保存为csv文件导入,
| 地区 | 工资性收入 | 经营净收入 | 财产净收入 | 转移净收入 | |
|---|---|---|---|---|---|
| 0 | 北京 | 16637.5 | 2061.9 | 1350.1 | 2260.0 |
| 1 | 天津 | 12048.1 | 5309.4 | 893.7 | 1824.4 |
| 2 | 河北 | 6263.2 | 3970.0 | 257.5 | 1428.6 |
| 3 | 山西 | 5204.4 | 2729.9 | 149.0 | 1999.1 |
| 4 | 内蒙古 | 2448.9 | 6215.7 | 452.6 | 2491.7 |
| 5 | 辽宁 | 5071.2 | 5635.5 | 257.6 | 1916.4 |
| 6 | 吉林 | 2363.1 | 7558.9 | 231.8 | 1969.1 |
| 7 | 黑龙江 | 2430.5 | 6425.9 | 572.7 | 2402.6 |
| 8 | 上海 | 18947.9 | 1387.9 | 859.6 | 4325.0 |
| 9 | 江苏 | 8731.7 | 5283.1 | 606.0 | 2984.8 |
| 10 | 浙江 | 14204.3 | 5621.9 | 661.8 | 2378.1 |
| 11 | 安徽 | 4291.4 | 4596.1 | 186.7 | 2646.2 |
| 12 | 福建 | 6785.2 | 5821.5 | 255.7 | 2136.9 |
| 13 | 江西 | 4954.7 | 4692.3 | 204.4 | 2286.4 |
| 14 | 山东 | 5569.1 | 6266.6 | 358.7 | 1759.7 |
| 15 | 河南 | 4228.0 | 4643.2 | 168.0 | 2657.6 |
| 16 | 湖北 | 4023.0 | 5534.0 | 158.6 | 3009.3 |
| 17 | 湖南 | 4946.2 | 4138.6 | 143.1 | 2702.5 |
| 18 | 广东 | 7255.3 | 3883.6 | 365.8 | 3007.5 |
| 19 | 广西 | 2848.1 | 4759.2 | 149.2 | 2603.0 |
| 20 | 海南 | 4764.9 | 5315.7 | 139.1 | 1623.1 |
| 21 | 重庆 | 3965.6 | 4150.1 | 295.8 | 3137.3 |
| 22 | 四川 | 3737.6 | 4525.2 | 268.5 | 2671.8 |
| 23 | 贵州 | 3211.0 | 3115.8 | 67.1 | 1696.3 |
| 24 | 云南 | 2553.9 | 5043.7 | 152.2 | 1270.1 |
| 25 | 西藏 | 2204.9 | 5237.9 | 148.7 | 1502.3 |
| 26 | 陕西 | 3916.0 | 3057.9 | 159.0 | 2263.6 |
| 27 | 甘肃 | 2125.0 | 3261.4 | 128.4 | 1942.0 |
| 28 | 青海 | 2464.3 | 3197.0 | 325.2 | 2677.8 |
| 29 | 宁夏 | 3906.1 | 3937.5 | 291.8 | 1716.3 |
| 30 | 新疆 | 2527.1 | 5642.0 | 222.8 | 1791.3 |
找出几个综合变量来代替原来众多的变量,使得这些综合变量尽可能地代表原来变量信息且彼此互不相关。
- 特征向量(li1,li2…lip)
- 特征值
- 主成分方差百分比(贡献率):通过累计贡献率的设置,可以筛选出不同数量的主成分。
第i个主成分表示形式如下:
Y
i
=
l
i
1
X
1
+
l
i
2
X
2
+
⋯
+
l
i
p
X
p
Y_i=l_{i1}X_1+l_{i2}X_2+cdots+l_{ip}X_p
Yi=li1X1+li2X2+⋯+lipXp
注,最终生成的主成分Yi的个数≤X的个数,通过不同贡献率的限定可能得到不同的主成分个数。
1、 生成协方差矩阵,判断变量之间的相关性
# 导入上方图表 X=data.iloc[:,1:] # 地区文字数据剔除 X.head() #显示前5行
| 工资性收入 | 经营净收入 | 财产净收入 | 转移净收入 | |
|---|---|---|---|---|
| 0 | 16637.5 | 2061.9 | 1350.1 | 2260.0 |
| 1 | 12048.1 | 5309.4 | 893.7 | 1824.4 |
| 2 | 6263.2 | 3970.0 | 257.5 | 1428.6 |
| 3 | 5204.4 | 2729.9 | 149.0 | 1999.1 |
| 4 | 2448.9 | 6215.7 | 452.6 | 2491.7 |
# 生成协方差矩阵 X.corr()
| 工资性收入 | 经营净收入 | 财产净收入 | 转移净收入 | |
|---|---|---|---|---|
| 工资性收入 | 1.000000 | -0.388997 | 0.826683 | 0.401917 |
| 经营净收入 | -0.388997 | 1.000000 | -0.205737 | -0.314542 |
| 财产净收入 | 0.826683 | -0.205737 | 1.000000 | 0.297458 |
| 转移净收入 | 0.401917 | -0.314542 | 0.297458 | 1.000000 |
通过上表可以发现,工资性收入与财产净收入相关程度很高。
2、 主成分分析
# 数据规范化
from sklearn.preprocessing import StandardScaler
scaler=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.20072724, -0.38406204, -0.52025876],
[-0.76329603, 1.35417039, 0.84757273, 0.1761957 ],
[ 3.17331769, -2.41013094, 1.88411135, 3.26469409],
'''
# PCA
from sklearn.decomposition import PCA
pca=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=pca.components_
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 StandardScaler from sklearn.decomposition import PCA from pandas as pd # 规范化 scaler=StandardScaler() X=scaler.fit_transform(X) # pca pca=PCA(n_components=0.95) # 设置累计贡献率 Y=pca.fit_transform(X) tzxl=pca.components_ 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)
| 地区 | 综合评分 |
|---|---|
| 北京 | 3.040735 |
| 上海 | 2.401801 |
| 天津 | 1.829913 |
| 浙江 | 1.666511 |
| 江苏 | 0.956387 |
| 黑龙江 | 0.234069 |
| 广东 | 0.224795 |
| 山东 | 0.117235 |
| 福建 | 0.040715 |
| 内蒙古 | -0.009481 |
| 辽宁 | -0.171686 |
| 河北 | -0.179864 |
| 重庆 | -0.254474 |
| 江西 | -0.333518 |
| 四川 | -0.333525 |
| 宁夏 | -0.361816 |
| 吉林 | -0.389888 |
| 安徽 | -0.429098 |
| 湖北 | -0.430027 |
| 青海 | -0.454803 |
| 河南 | -0.469080 |
| 湖南 | -0.469996 |
| 海南 | -0.476894 |
| 新疆 | -0.530416 |
| 山西 | -0.564851 |
| 陕西 | -0.651908 |
| 广西 | -0.655068 |
| 云南 | -0.735923 |
| 西藏 | -0.755649 |
| 甘肃 | -0.915676 |
| 贵州 | -0.938522 |



