数据科学 案例11 变量压缩(代码)

13 变量压缩

from sklearn.model_selection import train_test_split
import sklearn.tree as tree
import sklearn.ensemble as ensemble
import pandas as pd
import sklearn.metrics as metrics
from sklearn.model_selection import GridSearchCV #网格搜索  
import matplotlib.pyplot as plt

13.1 贷款应用

X1 品格:指客户的名誉;
X2 能力:指客户的偿还能力;
X3 资本:指客户的财务实力和财务状况;
X4 担保:指对申请贷款项担保的覆盖程度;
X5 环境:指外部经济、政策环境对客户的影响

一、主成分分析

1、数据导入
import pandas as pd
model_data = pd.read_csv(r'.\data\Loan_aply.csv',encoding='gbk')
model_data.head()
IDX1X2X3X4X5
0176.581.576.075.871.7
1270.673.067.668.178.5
2390.787.391.081.580.0
3477.573.670.969.874.8
4585.668.570.062.276.5
data = model_data.loc[ :,'X1':]
data.head()
X1X2X3X4X5
076.581.576.075.871.7
170.673.067.668.178.5
290.787.391.081.580.0
377.573.670.969.874.8
485.668.570.062.276.5
2、查看相关系数矩阵,判定做变量降维的必要性(非必须)
corr_matrix = data.corr(method='pearson')
corr_matrix
#可以看出变量之间有相关性
X1X2X3X4X5
X11.0000000.7266550.8253420.6763140.685563
X20.7266551.0000000.9290800.9383820.841413
X30.8253420.9290801.0000000.8834570.733482
X40.6763140.9383820.8834571.0000000.762563
X50.6855630.8414130.7334820.7625631.000000
3、做主成分之前,进行中心标准化
from sklearn import preprocessing
data = preprocessing.scale(data)
data
array([[-0.26099897,  0.63617414,  0.19936295,  0.37986418, -0.44786189],
       [-0.82713645, -0.24452296, -0.69140767, -0.42813421,  0.46669092],
       [ 1.10156919,  1.23712039,  1.79002477,  0.97799286,  0.66843051],
       [-0.16504347, -0.1823561 , -0.34146207, -0.24974496, -0.0309334 ],
       [ 0.61219612, -0.71077436, -0.43690178, -1.04724986,  0.1977048 ],
       [ 0.55462281,  0.39786786,  0.65535267,  1.28230394,  0.1977048 ],
       [ 1.41822235,  1.93131692,  1.41887034,  1.81747171,  2.28234725],
       [ 0.51624061, -0.87655264, -0.56415473, -0.77441924, -1.16067512],
       [-2.06496245, -1.55002689, -1.77305771, -1.19415866, -1.3489654 ],
       [-0.88470975, -0.63824637, -0.25662677, -0.76392575, -0.82444246]])
4、使用sklearn的主成分分析,用于判断保留主成分的数量
from sklearn.decomposition import PCA
'''
   说明:1、第一次的n_components参数应该设的大一点
   说明:2、观察explained_variance_ratio_和explained_variance_的取值变化,
   建议explained_variance_ratio_累积大于0.85,explained_variance_需要保留的
   最后一个主成分大于0.8,
   
'''
pca=PCA(n_components=3)
pca.fit(data)
print(pca.explained_variance_)#建议保留1个主成分 (主成分的值>1)
print(pca.explained_variance_ratio_)#建议保留1个主成分(主成分的占比0.8-0.9)
[4.67909448 0.42595504 0.33051612]
[0.84223701 0.07667191 0.0594929 ]
pca = PCA(n_components=1).fit(data) #综上,1个主成分
newdata=pca.fit_transform(data)
citi10_pca=model_data.join(pd.DataFrame(newdata))
citi10_pca
IDX1X2X3X4X50
0176.581.576.075.871.70.267437
1270.673.067.668.178.5-0.775172
2390.787.391.081.580.02.603684
3477.573.670.969.874.8-0.440204
4585.668.570.062.276.5-0.678219
5685.079.280.384.476.51.389937
6794.094.087.589.592.03.960102
7884.666.968.864.866.4-1.310850
8957.760.457.460.865.0-3.530640
91070.069.271.764.968.9-1.486076
'''通过主成分在每个变量上的权重的绝对值大小,确定每个主成分的代表性
'''
pd.DataFrame(pca.components_).T

0
00.413490
10.472893
20.465599
30.454653
40.426504
  • 下面为了理解主成分如何运算:
由citi10_pca的‘0’标签列可知,6行按主成分打分为3.96。
3.96如何得到?
  • 1、首先打印出出主成分计算公式右端的系数。x = pd.DataFrame(pca.components_).T
  • 2、提取主成分的X值,选取主成分打分最高的data[6]
  • 3、按照公式计算,data[6].dot(x.values)

主成分到底是什么?

把原始信息的方差(即信息)反映到主成分上(每个主成分两两之间是正交的)。选取前n个能反映大部分信息的主成分。就好比把一个具有一定相关性的空间点,建立一个三维坐标系,发现数据在某一维上的变化(即方差)不大(譬如几乎落在xy平面上),那么数据就可以简化到二维平面xy上。

#由于主成分只选取一个,所以,只有一个主成分的系数
x = pd.DataFrame(pca.components_).T
x.values
array([[0.41348998],
       [0.47289329],
       [0.46559941],
       [0.45465337],
       [0.42650378]])
data[6]
array([1.41822235, 1.93131692, 1.41887034, 1.81747171, 2.28234725])
data[6].dot(x.values)
array([3.96010211])

13.2 经济发展

X1	GDP
X2	人均GDP
X3	工业增加值
X4	第三产业增加值
X5	固定资产投资
X6	基本建设投资
X7	社会消费品零售总额
X8	海关出口总额
X9	地方财政收入

一、主成分分析

1、数据导入
import pandas as pd
import os
model_data = pd.read_csv(r'.\data\cities_10.csv',encoding='gbk')
model_data.head()
AREAX1X2X3X4X5X6X7X8X9
0辽宁5458.2130001376.22258.41315.9529.02258.4123.7399.7
1山东10550.0116433502.53851.02288.71070.73181.9211.1610.2
2河北6076.690471406.72092.61161.6597.11968.345.9302.3
3天津2022.622068822.8960.0703.7361.9941.4115.7171.8
4江苏10636.3143973536.33967.22320.01141.33215.8384.7643.7
data = model_data.loc[ :,'X1':]
data.head()
X1X2X3X4X5X6X7X8X9
05458.2130001376.22258.41315.9529.02258.4123.7399.7
110550.0116433502.53851.02288.71070.73181.9211.1610.2
26076.690471406.72092.61161.6597.11968.345.9302.3
32022.622068822.8960.0703.7361.9941.4115.7171.8
410636.3143973536.33967.22320.01141.33215.8384.7643.7
2、查看相关系数矩阵,判定做变量降维的必要性(非必须)
corr_matrix = data.corr(method='pearson')
corr_matrix
#可以看出变量之间有相关性
X1X2X3X4X5X6X7X8X9
X11.000000-0.0942920.9665060.9792380.9229840.9216800.9411480.6374580.825568
X2-0.0942921.0000000.1127260.0741670.2140520.093483-0.0427760.0811950.273145
X30.9665060.1127261.0000000.9853730.9631590.9391940.9351960.7047140.898016
X40.9792380.0741670.9853731.0000000.9728620.9397200.9622670.7138900.913364
X50.9229840.2140520.9631590.9728621.0000000.9713370.9371090.7167220.934549
X60.9216800.0934830.9391940.9397200.9713371.0000000.8971270.6242940.848004
X70.941148-0.0427760.9351960.9622670.9371090.8971271.0000000.8362720.928692
X80.6374580.0811950.7047140.7138900.7167220.6242940.8362721.0000000.881528
X90.8255680.2731450.8980160.9133640.9345490.8480040.9286920.8815281.000000
3、做主成分之前,进行中心标准化
from sklearn import preprocessing
data = preprocessing.scale(data)
4、使用sklearn的主成分分析,用于判断保留主成分的数量
from sklearn.decomposition import PCA
'''
   说明:1、第一次的n_components参数应该设的大一点
   说明:2、观察explained_variance_ratio_和explained_variance_的取值变化,
   建议explained_variance_ratio_累积大于0.85,explained_variance_需要保留的
   最后一个主成分大于0.8,
   
'''
pca=PCA(n_components=3)
pca.fit(data)
print(pca.explained_variance_)#建议保留2个主成分 (主成分的值>1)
print(pca.explained_variance_ratio_)#建议保留2个主成分(主成分的占比0.8-0.9)
[8.01129553 1.22149318 0.60792399]
[0.80112955 0.12214932 0.0607924 ]
'''通过主成分在每个变量上的权重的绝对值大小,确定每个主成分的代表性
'''
pd.DataFrame(pca.components_).T
#第一个主成分在第2个变量权重低,其余均高 
#第二个主成分在第2个变量权重高,其余均低
012
00.353682-0.212192-0.247627
10.0405550.942778-0.127315
20.364148-0.009845-0.183606
30.367584-0.045377-0.154498
40.3659170.095213-0.165382
50.352119-0.023027-0.315878
60.364419-0.1352410.150223
70.2975650.0480470.802794
80.3554050.1838300.265924

二、因子分析

  • 因子分析的概念很多,作为刚入门的人,我们可以认为因子分析是主成分分析的延续
1、调用因子分析包
from fa_kit import FactorAnalysis
from fa_kit import plotting as fa_plotting
fa = FactorAnalysis.load_data_samples(
        data,
        preproc_demean=True,
        preproc_scale=True
        )
fa.extract_components()
2、设定提取主成分的方式。
  • 默认为“broken_stick”方法,建议使用“top_n”法
fa.find_comps_to_retain(method='top_n',num_keep=2)
array([0, 1], dtype=int64)
3、通过最大方差法进行因子旋转
pd.DataFrame(fa.comps["rot"])#查看因子权重
fa.rotate_components(method='varimax')
fa_plotting.graph_summary(fa)
# - 说明:可以通过第三张图观看每个因子在每个变量上的权重,权重越高,代表性越强

在这里插入图片描述

4、获取因子得分

#到目前还没有与PCA中fit_transform类似的函数,因此只能手工计算因子以下是矩阵相乘的方式计算因子:因子=原始数据(n*k)权重矩阵(knum_keep)

import numpy as np
fas = pd.DataFrame(fa.comps["rot"])
data = pd.DataFrame(data)#注意data数据需要标准化
fa_score = pd.DataFrame(np.dot(data, fas))
fa_score
01
0-1.174241-0.364178
12.095775-0.654819
2-1.399899-0.870629
3-3.2651850.698849
42.386557-0.337666
50.1639012.802894
61.2090120.048116
7-2.084500-0.322173
85.5017590.105138
9-3.433179-1.105531

三、根据因子得分进行数据分析

a=fa_score.rename(columns={0: "Gross", 1: "Avg"})
citi10_fa=model_data.join(a)
citi10_fa.head()
AREAX1X2X3X4X5X6X7X8X9GrossAvg
0辽宁5458.2130001376.22258.41315.9529.02258.4123.7399.7-1.174241-0.364178
1山东10550.0116433502.53851.02288.71070.73181.9211.1610.22.095775-0.654819
2河北6076.690471406.72092.61161.6597.11968.345.9302.3-1.399899-0.870629
3天津2022.622068822.8960.0703.7361.9941.4115.7171.8-3.2651850.698849
4江苏10636.3143973536.33967.22320.01141.33215.8384.7643.72.386557-0.337666
citi10_fa.to_csv(".\data\citi10_fa.csv")
#如遇中文显示问题可加入以下代码
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题

import matplotlib.pyplot as plt
x=citi10_fa['Gross']
y=citi10_fa['Avg']
label=citi10_fa['AREA']
plt.scatter(x, y)
for a,b,l in zip(x,y,label):
    plt.text(a, b+0.1, '%s.' % l, ha='center', va= 'bottom',fontsize=14)

plt.show()

在这里插入图片描述

四、变量筛选(Var_Select函数)
#以下是变量选择的完整函数
#以下是变量选择的完整函数
#基于SparsePCA的算法还不是很稳定,尤其是当数据本身保留几个变量都处于模棱两个的时候,
#该算法并不能达到人为调整的效果。而且并不能保证每次保留的变量是一致的(原因1、SparsePCA:本身就具有随机性;2、脚本中也随机抽样的),
#只能保证保留的变量是不相关的
#其特点只是比较省人力,可以自动化运行

def Var_Select(orgdata, k, alphaMax=10, alphastep=0.2):
    """
    orgdata-需要信息压缩的数据框
    k-预期最大需要保留的最大变量个数,实际保留数量不能多于这个数值
    alphaMax-SparsePCA算法惩罚项的最大值,一般要到5才会取得比较理想的结果
    alphastep-SparsePCA算法惩罚项递增的步长
    """
    #step1:当数据量过大时,为了减少不必要的耗时
    if orgdata.iloc[:,1].count()>5000:
        data = orgdata.sample(5000)
    else:
        data = orgdata
   #step2:引入所需要的包,并且对数据进行标准化
    from sklearn import preprocessing
    import pandas as pd
    import numpy as np
    from sklearn.decomposition import SparsePCA
    #from functools import reduce
    data = preprocessing.scale(data)
    n_components = k
    #pca_n = list()
    #step3:进行SparsePCA计算,选择合适的惩罚项alpha,当恰巧每个原始变量只在一个主成分上有权重时,停止循环
    for i in np.arange(0.1, alphaMax, alphastep):
        pca_model = SparsePCA(n_components=n_components, alpha=i)
        pca_model.fit(data)
        pca = pd.DataFrame(pca_model.components_).T
        n = data.shape[1] - sum(sum(np.array(pca != 0)))####计算系数不为0的数量
        if n == 0:
            global best_alpha
            best_alpha = i
            break        
    #step4:根据上一步得到的惩罚项的取值,估计SparsePCA,并得到稀疏主成分得分
    pca_model = SparsePCA(n_components=n_components, alpha=best_alpha)
    pca_model.fit(data)
    pca = pd.DataFrame(pca_model.components_).T
    data = pd.DataFrame(data)
    score = pd.DataFrame(pca_model.fit_transform(data))
    #step6:计算原始变量与主成分之间的1-R方值
    r = []
    R_square = []
    for xk in range(data.shape[1]):  # xk输入变量个数
        for paj in range(n_components):  # paj主成分个数
            r.append(abs(np.corrcoef(data.iloc[:, xk], score.iloc[:, paj])[0, 1]))
            r_max1 = max(r)
            r.remove(r_max1)
            r.append(-2)
            r_max2 = max(r)
            R_square.append((1 - r_max1 ** 2) / (1 - r_max2 ** 2))

    R_square = abs(pd.DataFrame(np.array(R_square).reshape((data.shape[1], n_components))))
    var_list = []
    #print(R_square)
   #step7:每个主成分中,选出原始变量的1-R方值最小的。
    for i in range(n_components):
        vmin = R_square[i].min()
        #print(R_square[i])
        #print(vmin)
        #print(R_square[R_square[i] == min][i])
        var_list.append(R_square[R_square[i] == vmin][i].index)
    
    news_ids =[]
    for id in var_list:
        if id not in news_ids:
            news_ids.append(id)
    print(news_ids)
    data_vc = orgdata.iloc[:, np.array(news_ids).reshape(len(news_ids))]
    return data_vc
model_data = pd.read_csv(r".\data\cities_10.csv",encoding='gbk')
model_data.head()
data = model_data.loc[ :,'X1':]
data.head()
X1X2X3X4X5X6X7X8X9
05458.2130001376.22258.41315.9529.02258.4123.7399.7
110550.0116433502.53851.02288.71070.73181.9211.1610.2
26076.690471406.72092.61161.6597.11968.345.9302.3
32022.622068822.8960.0703.7361.9941.4115.7171.8
410636.3143973536.33967.22320.01141.33215.8384.7643.7
Varseled_data=Var_Select(data,k=2)
Varseled_data.head()
[Int64Index([3], dtype='int64'), Int64Index([1], dtype='int64')]
X4X2
02258.413000
13851.011643
22092.69047
3960.022068
43967.214397

13.3 银行交易

CNT_TBM 柜台交易次数	
CNT_ATM ATM机交易次数
CNT_POS POS机交易次数	
CNT_CSC 有偿服务次数

一、主成分分析

1、数据导入
import pandas as pd
model_data = pd.read_csv(r'.\data\profile_bank.csv',encoding='gbk')
model_data.head()
data = model_data.loc[:,'CNT_TBM':'CNT_CSC']
data.head()
CNT_TBMCNT_ATMCNT_POSCNT_CSC
034339
14417518
2122263236
342361
4201522
2、查看相关系数矩阵,判定做变量降维的必要性(非必须)
corr_matrix = data.corr(method='pearson')
corr_matrix
CNT_TBMCNT_ATMCNT_POSCNT_CSC
CNT_TBM1.0000000.0556480.0836240.198835
CNT_ATM0.0556481.0000000.3411610.242106
CNT_POS0.0836240.3411611.0000000.234055
CNT_CSC0.1988350.2421060.2340551.000000
3、做主成分之前,进行中心标准化
from sklearn import preprocessing
data = preprocessing.scale(data)
pd.DataFrame(data).head()
0123
0-0.337476-0.791125-0.4303760.190946
1-0.238617-0.119856-0.3339150.933000
20.5324870.3116750.9683112.417108
3-0.258389-0.791125-0.285684-0.468657
4-0.475880-0.215751-0.478607-0.386207
4、使用sklearn的主成分分析,用于判断保留主成分的数量
from sklearn.decomposition import PCA
'''说明:1、第一次的n_components参数应该设的大一点
   说明:2、观察explained_variance_ratio_和explained_variance_的取值变化,建议explained_variance_ratio_累积大于0.85,explained_variance_需要保留的最后一个主成分大于0.8,
'''
pca=PCA(n_components=4)
pca.fit(data)
print(pca.explained_variance_)#建议保留2个主成分
print(pca.explained_variance_ratio_)#建议保留3个主成分
[1.60786876 1.00252275 0.7339482  0.65570029]
[0.40196317 0.25062818 0.18348521 0.16392343]
pca=PCA(n_components=3).fit(data)#综上,2个主成分
newdata=pca.fit_transform(data)
'''通过主成分在每个变量上的权重的绝对值大小,确定每个主成分的代表性
'''
pd.DataFrame(pca.components_).T
#第一个主成分在第3个变量权重差不多高 
#第二个主成分在第1个变量权重高,其余均低
#第三个主成分在第4个变量权重高,其余均低
012
00.3030200.8342450.445132
10.555131-0.3775660.135542
20.559520-0.3154860.386716
30.5356730.248894-0.796201

二、因子分析

#因子分析的概念很多,作为刚入门的人,我们可以认为因子分析是主成分分析的延续

1、建模
from fa_kit import FactorAnalysis
from fa_kit import plotting as fa_plotting
fa = FactorAnalysis.load_data_samples(
            data,
            preproc_demean=True,
            preproc_scale=True
            )
fa.extract_components()
2、设定提取主成分的方式。
  • 默认为“broken_stick”方法,建议使用“top_n”法
fa.find_comps_to_retain(method='top_n',num_keep=3)
array([0, 1, 2], dtype=int64)
3、通过最大方差法进行因子旋转
  • 说明:可以通过第三张图观看每个因子在每个变量上的权重,权重越高,代表性越强
pd.DataFrame(fa.comps["rot"]) #查看因子权重
fa.rotate_components(method='varimax')
fa_plotting.graph_summary(fa)

在这里插入图片描述

4、获取因子得分

#到目前还没有与PCA中fit_transform类似的函数,因此只能手工计算因子
#以下是矩阵相乘的方式计算因子:因子=原始数据(n*k)权重矩阵(knum_keep)

import numpy as np
fas = pd.DataFrame(fa.comps["rot"])
data = pd.DataFrame(data)      #注意data数据需要标准化
fa_score = pd.DataFrame(np.dot(data, fas))
fa_score.head()
012
0-0.852354-0.2949380.143935
1-0.333078-0.2443340.939343
20.9180670.5937872.349496
3-0.741847-0.210507-0.521592
4-0.499703-0.492714-0.367629
a=fa_score.rename(columns={0: "Gross", 1: "Avg"})
profile_bank_fa=model_data.join(a)
profile_bank_fa.head()
IDCNT_TBMCNT_ATMCNT_POSCNT_CSCCNT_TOTGrossAvg2
0413603433949-0.852354-0.2949380.143935
152094441751884-0.333078-0.2443340.939343
2573401222632362160.9180670.5937872.349496
3768854236152-0.741847-0.210507-0.521592
48915020152239-0.499703-0.492714-0.367629

三、变量筛选(Var_Select函数)

import pandas as pd
model_data = pd.read_csv(r".\data\profile_bank.csv")
data = model_data.loc[ :,'CNT_TBM':'CNT_CSC']
data.head()
CNT_TBMCNT_ATMCNT_POSCNT_CSC
034339
14417518
2122263236
342361
4201522
Varseled_data=Var_Select(data,k=3,alphaMax=10)
Varseled_data.head()
[Int64Index([2], dtype='int64'), Int64Index([0], dtype='int64'), Int64Index([3], dtype='int64')]
CNT_POSCNT_TBMCNT_CSC
03349
154418
23212236
36421
42202
##Varselect_bank_test
from VarSelec import Var_Select,Var_Select_auto
#Var_Select_auto(orgdata, alphaMax=100, alphastep=0.2,eig_csum_retio=0.95,eigVals_min=0.6)
#Var_Select(orgdata, k,alphaMin=0.1, alphaMax=200, alphastep=0.2)

import pandas as pd
model_data = pd.read_csv(r".\data\profile_bank.csv")
data = model_data.loc[ :,'CNT_TBM':'CNT_CSC']
Varseled_data=Var_Select(data,k=3)
Varseled_data.head()
[Int64Index([2], dtype='int64'), Int64Index([0], dtype='int64'), Int64Index([3], dtype='int64')]
CNT_POSCNT_TBMCNT_CSC
03349
154418
23212236
36421
42202
Varseled_Auto_data=Var_Select_auto(data)
Varseled_Auto_data.head()
[Int64Index([2], dtype='int64'), Int64Index([0], dtype='int64'), Int64Index([3], dtype='int64')]
CNT_POSCNT_TBMCNT_CSC
03349
154418
23212236
36421
42202

13.4 信用卡

  • Var_Select函数
import pandas as pd
model_data = pd.read_csv(r'./data/creditcard_exp.csv')
model_data.head()
data = model_data.loc[:,'gender':]
data.head()
genderAgeIncomeOwnrentSelfempldist_home_valdist_avg_incomeage2high_avgedu_class
014016.035151199.9315.93278916000.1023613
113215.847501049.8815.79631610240.0511842
21368.400000088.617.49000012960.9100001
314111.472851016.1011.27563216810.1972183
412813.4091510100.3913.3464747840.0626762
Varseled_data=Var_Select(data,k=5)
Varseled_data.head()
[Int64Index([2], dtype='int64'), Int64Index([1], dtype='int64'), Int64Index([8], dtype='int64'), Int64Index([5], dtype='int64'), Int64Index([4], dtype='int64')]
IncomeAgehigh_avgdist_home_valSelfempl
016.03515400.10236199.931
115.84750320.05118449.880
28.40000360.91000088.610
311.47285410.19721816.100
413.40915280.062676100.390
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

irober

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值