栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

数据预处理相关Demo(缺失值、均值方差标准化、极差法归一化、主成分分析)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据预处理相关Demo(缺失值、均值方差标准化、极差法归一化、主成分分析)

1 缺失值处理 1.1 pandas中利用fillna()函数

通过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
abcd
02.0kl4.07.0
12.0kl6.09.0
2NaNkl5.0NaN
35.0NaNNaN9.0
46.0kl6.08.0

填充固定值

df.fillna(99) #所有空值填充为99
abcd
02.0kl4.07.0
12.0kl6.09.0
299.0kl5.099.0
35.09999.09.0
46.0kl6.08.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
0123
01.02.03.04.0
14.05.06.0NaN
25.06.07.08.0
39.04.0NaN8.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.52061.91350.12260.0
1天津12048.15309.4893.71824.4
2河北6263.23970.0257.51428.6
3山西5204.42729.9149.01999.1
4内蒙古2448.96215.7452.62491.7
5辽宁5071.25635.5257.61916.4
6吉林2363.17558.9231.81969.1
7黑龙江2430.56425.9572.72402.6
8上海18947.91387.9859.64325.0
9江苏8731.75283.1606.02984.8
10浙江14204.35621.9661.82378.1
11安徽4291.44596.1186.72646.2
12福建6785.25821.5255.72136.9
13江西4954.74692.3204.42286.4
14山东5569.16266.6358.71759.7
15河南4228.04643.2168.02657.6
16湖北4023.05534.0158.63009.3
17湖南4946.24138.6143.12702.5
18广东7255.33883.6365.83007.5
19广西2848.14759.2149.22603.0
20海南4764.95315.7139.11623.1
21重庆3965.64150.1295.83137.3
22四川3737.64525.2268.52671.8
23贵州3211.03115.867.11696.3
24云南2553.95043.7152.21270.1
25西藏2204.95237.9148.71502.3
26陕西3916.03057.9159.02263.6
27甘肃2125.03261.4128.41942.0
28青海2464.33197.0325.22677.8
29宁夏3906.13937.5291.81716.3
30新疆2527.15642.0222.81791.3
3.2 主成分相关概念

找出几个综合变量来代替原来众多的变量,使得这些综合变量尽可能地代表原来变量信息且彼此互不相关。

  • 特征向量(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​=li1​X1​+li2​X2​+⋯+lip​Xp​
注,最终生成的主成分Yi的个数≤X的个数,通过不同贡献率的限定可能得到不同的主成分个数。

3.3 案例应用

1、 生成协方差矩阵,判断变量之间的相关性

# 导入上方图表
X=data.iloc[:,1:] # 地区文字数据剔除
X.head() #显示前5行
工资性收入经营净收入财产净收入转移净收入
016637.52061.91350.12260.0
112048.15309.4893.71824.4
26263.23970.0257.51428.6
35204.42729.9149.01999.1
42448.96215.7452.62491.7
# 生成协方差矩阵
X.corr()
工资性收入经营净收入财产净收入转移净收入
工资性收入1.000000-0.3889970.8266830.401917
经营净收入-0.3889971.000000-0.205737-0.314542
财产净收入0.826683-0.2057371.0000000.297458
转移净收入0.401917-0.3145420.2974581.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
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1026967.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号