『R语言&Python』建模前的准备:连续型与离散型变量探索,离散型变量转为虚拟变量

在建立模型之前,我们常要先对数据的类型作出判断,连续型数据可以不做处理,而离散型数据则可能需要转为虚拟变量。下文使用R语言中的经典数据集 m t c a r s mtcarsmtcars 进行演示

P y t h o n : Python:Python:

数据集内的数据如下(复制粘贴即可):

# python
mpg = [21.0, 21.0, 22.8, 21.4, 18.7, 18.1, 14.3, 24.4, 22.8, 19.2, 17.8, 16.4, 17.3, 15.2, 10.4, 10.4, 14.7, 32.4, 30.4, 33.9, 21.5, 15.5, 15.2, 13.3, 19.2, 27.3, 26.0, 30.4, 15.8, 19.7, 15.0, 21.4]
disp = [160.0, 160.0, 108.0, 258.0, 360.0, 225.0, 360.0, 146.7, 140.8, 167.6, 167.6, 275.8, 275.8, 275.8, 472.0, 460.0, 440.0, 78.7, 75.7, 71.1, 120.1, 318.0, 304.0, 350.0, 400.0, 79.0, 120.3, 95.1, 351.0, 145.0, 301.0, 121.0]
hp = [110, 110, 93, 110, 175, 105, 245, 62, 95, 123, 123, 180, 180, 180, 205, 215, 230, 66, 52, 65, 97, 150, 150, 245, 175, 66, 91, 113, 264, 175, 335, 109]
drat = [3.9, 3.9, 3.85, 3.08, 3.15, 2.76, 3.21, 3.69, 3.92, 3.92, 3.92, 3.07, 3.07, 3.07, 2.93, 3.0, 3.23, 4.08, 4.93, 4.22, 3.7, 2.76, 3.15, 3.73, 3.08, 4.08, 4.43, 3.77, 4.22, 3.62, 3.54, 4.11]
wt = [2.62, 2.875, 2.32, 3.215, 3.44, 3.46, 3.57, 3.19, 3.15, 3.44, 3.44, 4.07, 3.73, 3.78, 5.25, 5.4239999999999995, 5.345, 2.2, 1.615, 1.835, 2.465, 3.52, 3.435, 3.84, 3.845, 1.935, 2.14, 1.5130000000000001, 3.17, 2.77, 3.57, 2.78]
qsec = [16.46, 17.02, 18.61, 19.44, 17.02, 20.22, 15.84, 20.0, 22.9, 18.3, 18.9, 17.4, 17.6, 18.0, 17.98, 17.82, 17.42, 19.47, 18.52, 19.9, 20.01, 16.87, 17.3, 15.41, 17.05, 18.9, 16.7, 16.9, 14.5, 15.5, 14.6, 18.6]
vs = ['V-shaped', 'V-shaped', 'straight', 'straight', 'V-shaped', 'straight', 'V-shaped', 'straight', 'straight', 'straight', 'straight', 'V-shaped', 'V-shaped', 'V-shaped', 'V-shaped', 'V-shaped', 'V-shaped', 'straight', 'straight', 'straight', 'straight', 'V-shaped', 'V-shaped', 'V-shaped', 'V-shaped', 'straight', 'V-shaped', 'straight', 'V-shaped', 'V-shaped', 'V-shaped', 'straight']
am = ['manual', 'manual', 'manual', 'automati', 'automati', 'automati', 'automati', 'automati', 'automati', 'automati', 'automati', 'automati', 'automati', 'automati', 'automati', 'automati', 'automati', 'manual', 'manual', 'manual', 'automati', 'automati', 'automati', 'automati', 'automati', 'manual', 'manual', 'manual', 'manual', 'manual', 'manual', 'manual']

import pandas as pd
name = [mpg, disp, hp, drat, wt, qsec, vs, am]
data = pd.DataFrame()
for i in name:
    i = pd.DataFrame(i)
    data = pd.concat([data, i], axis = 1)

data.columns = ['mpg', 'disp', 'hp', 'drat', 'wt', 'qsec', 'vs', 'am']   
print(data)
print(data.dtypes)

运行结果:
在这里插入图片描述

不难发现:m t c a r s mtcarsmtcars 数据集中的 v s vsvsa m amam 都是离散型的,当把数据导入数据框后,p a n d a s pandaspandas 就自动帮我们识别好了数据框内各列数据的类型:离散型数据的数据类型是 o b j e c t objectobject ,而连续型数据的数据类型则是 i n t intint 或者 f l o a t floatfloat根据这点,我们很容易就能分辨离散型与连续型数据

def classify(dataframe):
	# 创建空列表准备存放列名
    continuous_variables = [] # 存放连续型变量
    categorical_variables = [] # 存放离散型变量
    #遍历并判断各列数据类型
    for i in dataframe.columns:
        if data[i] .dtypes == object:
            categorical_variables.append(i)
        else:
            continuous_variables.append(i)
    return continuous_variables, categorical_variables
            
continuous_variables, categorical_variables = classify(data)
print(continuous_variables)
print(categorical_variables)

运行结果:
在这里插入图片描述

当然,若我们很了解数据框内的所有数据,并明确的知道要使用离散型变量进行建模,那么可以直接将它们变为虚拟变量:

def convert_dummy(dataframe):
    import numpy as np
    import pandas as pd
    col = [i for i in dataframe.columns]
    drop_col = []
    for i in col:
        if dataframe[i].dtypes == 'object':
            dummy = pd.get_dummies(dataframe[i], drop_first=True)
            dataframe = pd.concat([dataframe, dummy], axis = 1)
            drop_col.append(i)
    dataframe = dataframe.drop(drop_col, axis=1)
    return dataframe

data = convert_dummy(data)
print(data)

运行结果:

在这里插入图片描述

?:为了避免多重共线性,使用函数get_dummies()时要添加参数 drop_first=True 来删除每个虚拟变量的第一列

R : R:R:

R RR 语言中变量类型一般分为 f a c t o r factorfactor, n u m e r i c numericnumeric , i n t e g e r integerinteger ,而离散型变量对应的就是 f a c t o r factorfactor ,据此作出判断即可。由于 R RR 语言中的 r e t u r n returnreturn 不支持返回多变量,因此这里只展示提取离散型变量的做法

classify = function(data){
  categorical_variables = c() # 存放离散型变量
  for (i in names(data)){
    if (class(data[[i]]) == 'factor'){
      categorical_variables = c(categorical_variables, i)
    }
  }
  return(categorical_variables)
}
classify(data)

?:当使用数据集进行建模前,R的内置函数会自动将离散型变量转为虚拟变量、并删除某一列来消除多重共线性,然后开始建模,所以无需人为地转换虚拟变量,只需要用as.factor()将某变量标记为离散型即可


版权声明:本文为m0_47149835原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。