59doit

[ R ] 변수제거 본문

통계기반 데이터분석

[ R ] 변수제거

yul_S2 2022. 12. 3. 12:06
반응형

주성분 분석

 

0에 가까운 분산을 가지는 변수 제거

분산이 0에 가까운 변수는 제거해도 큰 영향이 없음.

 

nearZeroVar()함수

  • 'saveMetrics=FALSE'속성: 예측변수의 컬럼위치에 해당하는 정수 벡터
  • 'saveMetrics=TRUE'속성: 컬럼을 가지는 데이터프레임
  • freqRatio: 가장 큰 공통값 대비 두번째 큰 공통값의 빈도의 비율
  • percentUnique: 데이터 전체로 부터 고유 데이터의 비율
  • zeroVar: 예측변수가 오직 한개의 특이값을 갖는지 여부에 대한 논리 벡터
  • nzv: 예측변수가 0에 가까운 분산예측 변수인지 여부에 대한 논리 벡터

 

 

ex) 

#1 패키지 설치 및 iris 데이터 불러오기

install.packages("caret")
library(caret) 
install.packages("mlbench")
library(mlbench) 

nearZeroVar(iris, saveMetrics=TRUE)
# freqRatio percentUnique zeroVar   nzv
# Sepal.Length  1.111111      23.33333   FALSE FALSE
# Sepal.Width   1.857143      15.33333   FALSE FALSE
# Petal.Length  1.000000      28.66667   FALSE FALSE
# Petal.Width   2.230769      14.66667   FALSE FALSE
# Species       1.000000       2.00000   FALSE FALSE

# iris 데이터

data(Soybean)
head(Soybean)
  • nearZeroVar 함수사용
  • 'saveMetrics=TRUE'속성: 컬럼을 가지는 데이터프레임
  • iris 0에 가까운 데이터 없음

 

#2 library(mlbench) 에 존재하는 Soybean 데이터 불러오기


data(Soybean)

head(Soybean)

nearZeroVar(Soybean, saveMetrics=TRUE)
#                        freqRatio percentUnique zeroVar   nzv
# Class             1.010989     2.7818448   FALSE FALSE
# date              1.137405     1.0248902   FALSE FALSE
# plant.stand       1.208191     0.2928258   FALSE FALSE
# precip            4.098214     0.4392387   FALSE FALSE
# temp              1.879397     0.4392387   FALSE FALSE
# hail              3.425197     0.2928258   FALSE FALSE
# crop.hist         1.004587     0.5856515   FALSE FALSE
# area.dam          1.213904     0.5856515   FALSE FALSE
# sever             1.651282     0.4392387   FALSE FALSE
# seed.tmt          1.373874     0.4392387   FALSE FALSE
# germ              1.103627     0.4392387   FALSE FALSE
# plant.growth      1.951327     0.2928258   FALSE FALSE
# leaves            7.870130     0.2928258   FALSE FALSE
# leaf.halo         1.547511     0.4392387   FALSE FALSE
# leaf.marg         1.615385     0.4392387   FALSE FALSE
# leaf.size         1.479638     0.4392387   FALSE FALSE
# leaf.shread       5.072917     0.2928258   FALSE FALSE
# leaf.malf        12.311111     0.2928258   FALSE FALSE
leaf.mild        26.750000     0.4392387   FALSE  TRUE
# stem              1.253378     0.2928258   FALSE FALSE
# lodging          12.380952     0.2928258   FALSE FALSE
# stem.cankers      1.984293     0.5856515   FALSE FALSE
# canker.lesion     1.807910     0.5856515   FALSE FALSE
# fruiting.bodies   4.548077     0.2928258   FALSE FALSE
# ext.decay         3.681481     0.4392387   FALSE FALSE
mycelium        106.500000     0.2928258   FALSE  TRUE
# int.discolor     13.204545     0.4392387   FALSE FALSE
# sclerotia        31.250000     0.2928258   FALSE  TRUE
# fruit.pods        3.130769     0.5856515   FALSE FALSE
# fruit.spots       3.450000     0.5856515   FALSE FALSE
# seed              4.139130     0.2928258   FALSE FALSE
# mold.growth       7.820896     0.2928258   FALSE FALSE
# seed.discolor     8.015625     0.2928258   FALSE FALSE
# seed.size         9.016949     0.2928258   FALSE FALSE
# shriveling       14.184211     0.2928258   FALSE FALSE
# roots             6.406977     0.4392387   FALSE FALSE
  • nearZeroVar 함수사용
  • 'saveMetrics=TRUE'속성: 컬럼을 가지는 데이터프레임
  • nzv = 'TRUE' 인 leaf.mild, mycelium, sclerotia 변수를 제거 해도 큰 영향이 없으므로 leaf.mild, mycelium, sclerotia 변수를 제거 한다.

 

 

상관관계가 높은 변수 제거

상관관계가 높은 컬럼을 제외

findCorrelation()함수

 

 

ex) 

#1 패키지 설치 및 Vehicle 데이터 불러오기

library(caret) 
library(mlbench)
data(Vehicle)
head(Vehicle)
# Comp Circ D.Circ Rad.Ra Pr.Axis.Ra Max.L.Ra Scat.Ra Elong Pr.Axis.Rect Max.L.Rect Sc.Var.Maxis
# 1   95   48     83    178         72       10     162    42           20        159          176
# 2   91   41     84    141         57        9     149    45           19        143          170
# 3  104   50    106    209         66       10     207    32           23        158          223
# 4   93   41     82    159         63        9     144    46           19        143          160
# 5   85   44     70    205        103       52     149    45           19        144          241
# 6  107   57    106    172         50        6     255    26           28        169          280
# Sc.Var.maxis Ra.Gyr Skew.Maxis Skew.maxis Kurt.maxis Kurt.Maxis Holl.Ra Class
# 1          379         184              70                   6               16            187       197    van
# 2          330         158              72                   9               14            189       199    van
# 3          635         220              73                 14                9             188       196    saab
# 4          309         127              63                   6              10             199       207    van
# 5          325         188            127                   9              11             180       183    bus
# 6          957         264             85                    5               9              181       183    bus

 

#2 상관관계 높은 열 선정

findCorrelation(cor(subset(Vehicle, select=-c(Class))))
# [1]  3  8 11  7  9  2
  • select=-c(Class) :  head(Vehicle) 보면 class 변수에만 문자형으로 되어있어서 상관관계 확인하는것과 관련없으므로 빼고 실행하기위함
  • findCorrelation 함수사용 하여 상관관계 높은 열을 추출한다.

 

#3 상관관계가 높은 열끼리 상관관계 확인

cor(subset(Vehicle, select=-c(Class))) [c(3,8,11,7,9,2), c(3,8,11,7,9,2)]
# D.Circ      Elong Sc.Var.Maxis    Scat.Ra Pr.Axis.Rect       Circ
# D.Circ        1.0000000 -0.9123072    0.8644323  0.9072801    0.8953261  0.7984920
# Elong        -0.9123072  1.0000000   -0.9383919 -0.9733853   -0.9505124 -0.8287548
# Sc.Var.Maxis  0.8644323 -0.9383919    1.0000000  0.9518621    0.9382664  0.8084963
# Scat.Ra       0.9072801 -0.9733853    0.9518621  1.0000000    0.9920883  0.8603671
# Pr.Axis.Rect  0.8953261 -0.9505124    0.9382664  0.9920883    1.0000000  0.8579253
# Circ          0.7984920 -0.8287548    0.8084963  0.8603671    0.8579253  1.0000000
  • #2에서의 결과바탕으로 높은 열끼리 상관관계를 확인한다

 

 

#4 상관관계 높은 열 제거

Cor_Vehicle <- Vehicle[,-c(2,3,7,8,11)]
findCorrelation(cor(subset(Cor_Vehicle, select=-c(Class))))
# [1] 5

 

 

#5 최종 결과 보기

head(Cor_Vehicle)
# Comp Rad.Ra Pr.Axis.Ra Max.L.Ra Pr.Axis.Rect
# 1   95    178         72       10           20
# 2   91    141         57        9           19
# 3  104    209         66       10           23
# 4   93    159         63        9           19
# 5   85    205        103       52           19
# 6  107    172         50        6           28
# Max.L.Rect Sc.Var.maxis Ra.Gyr Skew.Maxis Skew.maxis
# 1        159          379    184         70          6
# 2        143          330    158         72          9
# 3        158          635    220         73         14
# 4        143          309    127         63          6
# 5        144          325    188        127          9
# 6        169          957    264         85          5
# Kurt.maxis Kurt.Maxis Holl.Ra Class
# 1         16        187     197   van
# 2         14        189     199   van
# 3          9        188     196  saab
# 4         10        199     207   van
# 5         11        180     183   bus
# 6          9        181     183   bus

 

카이 제곱 검정을 통한 중요 변수 선발

 

 

*** install.packages("FSelector") 오류해결

install.packages("c:\\rJava_1.0-4.tar.gz",repos=NULL,type="source")

설치 후 관리자권한으로 R studio 다시 실행

 

ex) 

#1 패키지 설치 및 Vehicle 데이터 불러오기

install.packages("FSelector")
install.packages("c:\\rJava_1.0-4.tar.gz",repos=NULL,type="source")
library(FSelector)
library(mlbench)

data(Vehicle)

 

#2 카이 제곱 검정으로 변수들의 중요성 평가

cs <- chi.squared(Class ~., data=Vehicle)

 

#3 변수 중에서 중요한 5개 선별

cutoff.k(cs,5)

# [1] "Sc.Var.maxis" "Scat.Ra"      "Elong"        "Pr.Axis.Rect" "Sc.Var.Maxis"

 

 

 

반응형

'통계기반 데이터분석' 카테고리의 다른 글

[ R ] 군집분석 #1  (0) 2022.12.03
[ R ] 오분류표  (1) 2022.12.03
[ R ] 다차원척도법  (0) 2022.12.02
[ R ] 베이지안  (1) 2022.12.02
[ R ] install.packages 오류  (0) 2022.12.02
Comments