brunch

You can make anything
by writing

C.S.Lewis

by 첨물 May 23. 2021

빅분기 실기연습(9)

R프로그램_작업형 제1유형 문제


오늘은 빅데이터 분석기사 사이트에 나와있는 작업형 제1유형 예제 문제는 아래 사이트를 참고하면서 풀어보았다. 시험은 이런 문제 3개가 나온다고 되어 있다. 

 

https://www.datamanim.com/dataset/03_dataq/main_p1_r.html




mtcars 데이터는 R에서 바로 읽히는데, 사이트에는 csv 파일이 첨부되어 있으니, 실제 시험장에서는 read.csv 명령어로 읽어서 실행하도록 되어 있을 것 같다.


그럼 먼저 데이터 읽기. 다운로드 폴더를 작업 폴더로 지정한 후 read.csv 함수로 읽기


setwd("C:/myRproject")

mtcars<- read.csv("mtcars.csv",row.names=1)

head(mtcars)

> head(mtcars)

                   mpg cyl disp  hp drat    wt  qsec vs am gear carb

Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4

Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4

Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1

Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1

Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2


Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1



첫 번째 문제는 데이터 전처리 중 하나로 정규화에 관한 문제이다. 데이터 값을 0~1 사이 값으로 만드는 문제. 일단 scale 함수를 쓰지 않고 만들어보자.

0.5보다 큰 값의 개수를 구하는 것은 length(which()) 를 썼지만, sum()을 써도 된다.


qsec<-mtcars$qsec

max<-max(qsec)

min<-min(qsec)

df<-(qsec - min)/(max-min)

length(which(df>0.5))

> length(which(df>0.5))

[1] 9

> sum(df>0.5)

[1] 9


이걸 한번에 해 주는 함수가 scale 함수

#df<-scale(mtcars_qsec)



다음 데이터 표준화에 관한 것이다. 표준화란 평균을 0, 표준편차를 1로 만드는 작업이다.  위에서 정규화로 만든 변수를 가지고 표준화를 하도록 하겠다.

        


mean<-mean(df)

sd<-sd(df)

s_df<-(df-mean)/sd

max(s_df)

min(s_df)

> max(s_df)

[1] 2.826755

> min(s_df)


[1] -1.87401



먼저 wt를 boxplot으로 그려보자.


wt<-mtcars$wt

boxplot(wt)

위 점으로 두 개가 찍힌 것이 이상치이다. 그 정의는 아래와 같다. 사분위편차는  IQR 함수를 사용한다. 위 그래프를 보면 높은 이상치만 있으므로 3 사분위 값을 summary() 함수에서 구한 후 계산한다.

낮은 이상치 : 제1사분위수 - 1.5 * 사분위편차 보다 작은 값

높은 이상치 : 제3사분위수 + 1.5 * 사분위편차 보다 높은 값


직접 구해보니, 아래와 같이 세 점이 나왔다.


> summary(wt)

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.

  1.513   2.581   3.325   3.217   3.610   5.424 


outlier<-wt[which(wt>summary(wt)[5]+1.5*IQR(wt))]

outlier

> outlier

[1] 5.250 5.424 5.345



지난번에 쓴 공분산에 관한 문제이다. cor() 함수를 사용한다. mpg가 가장 앞에 있는 열이므로, 그걸 제외하고 구한다. 내림차순 정렬은 sort(변수, decreasing = T) 를 사용한다.


mcor=cor(mtcars)[-1,1]

sort<-as.data.frame(sort(mcor, decreasing=T))

sort

> sort

     sort(mcor, decreasing = T)

drat                  0.6811719

vs                    0.6640389

am                    0.5998324

gear                  0.4802848

qsec                  0.4186840

carb                 -0.5509251

hp                   -0.7761684

disp                 -0.8475514

cyl                  -0.8521620

wt                   -0.8676594


이걸 지난번 corrplot으로 그려보면 좀 더 시각적으로 알 수 있다.


install.packages("corrplot")

library(corrplot)

corrplot(mcor)

가장 왼쪽 mpg와 상관성이 가장 높은 (파란색)은 drat, vs, am gear 등이다.


정규화는 scale() 함수를, PCA(주성분 분석)은 prcomp() 함수를 이용한다.

mpg를 제외하려면 첫 번째 열을 제외해야 하니, mtcars[, -1] 표현한다. 아래 데이터를 보면 누적 설명 분산량이 92%를 넘기려면 PC1, PC2, PC3, PC4 이상이 되어야 한다. 



df<-mtcars[,-1]

df_scale<-scale(df)

summary(prcomp(df_scale))

> summary(prcomp(df_scale))

Importance of components:

                         PC1   PC2     PC3     PC4

Standard deviation     2.400 1.628 0.77280 0.51914

Proportion of Variance 0.576 0.265 0.05972 0.02695

Cumulative Proportion  0.576 0.841 0.90071 0.92766

                           PC5     PC6     PC7     PC8

Standard deviation     0.47143 0.45839 0.36458 0.28405

Proportion of Variance 0.02223 0.02101 0.01329 0.00807

Cumulative Proportion  0.94988 0.97089 0.98419 0.99226

                           PC9    PC10

Standard deviation     0.23163 0.15426

Proportion of Variance 0.00537 0.00238


Cumulative Proportion  0.99762 1.00000




이건 특정 열에 있는 값을 space 를 중심으로 나눈 후, 한쪽을 취해서 새로운 열로 만드는 예제이다.

먼저 mtcars의 index를 보자. Mazda 가 업체명이고, Mazda RX4 Wag가 모델명이다. 이 둘이 space로 분리되어 있다. 


rownames(mtcars)

> rownames(mtcars)

 [1] "Mazda RX4"           "Mazda RX4 Wag"      

 [3] "Datsun 710"          "Hornet 4 Drive"     

 [5] "Hornet Sportabout"   "Valiant"            

 [7] "Duster 360"          "Merc 240D"          

 [9] "Merc 230"            "Merc 280"           

[11] "Merc 280C"           "Merc 450SE"         

[13] "Merc 450SL"          "Merc 450SLC"        

[15] "Cadillac Fleetwood"  "Lincoln Continental"

[17] "Chrysler Imperial"   "Fiat 128"           

[19] "Honda Civic"         "Toyota Corolla"     

[21] "Toyota Corona"       "Dodge Challenger"   

[23] "AMC Javelin"         "Camaro Z28"         

[25] "Pontiac Firebird"    "Fiat X1-9"          

[27] "Porsche 914-2"       "Lotus Europa"       

[29] "Ford Pantera L"      "Ferrari Dino"       

[31] "Maserati Bora"       "Volvo 142E" 


sapply(데이터 셋, 함수) 형식으로 사용한다. 문자열을 나누는 것이므로 strsplit() 함수를 쓴다.

brand<-sapply(strsplit(rownames(mtcars)," "),`[`,1)

여기서 '[' ,1로 표현하면 위 업체명, 모델명 중 업체명만을 하나의 열로 만든다는 것.


brand<-sapply(strsplit(rownames(mtcars)," "),`[`,1)

brand

> brand

 [1] "Mazda"    "Mazda"    "Datsun"   "Hornet"  

 [5] "Hornet"   "Valiant"  "Duster"   "Merc"    

 [9] "Merc"     "Merc"     "Merc"     "Merc"    

[13] "Merc"     "Merc"     "Cadillac" "Lincoln" 

[17] "Chrysler" "Fiat"     "Honda"    "Toyota"  

[21] "Toyota"   "Dodge"    "AMC"      "Camaro"  

[25] "Pontiac"  "Fiat"     "Porsche"  "Lotus"   


[29] "Ford"     "Ferrari"  "Maserati" "Volvo"   


이걸 mtcars 맨 끝열에 추가하면 되므로, 

mtcars<-cbind(mtcars,brand)




다음은 ggplot으로 그래프로 그리는 것이다.

위에서 뽑은 PC1, PC2를 이용하여 산점도를 그림.

먼저 주성분 분석을 prcomp를 통해 진행한 후, mtcars 데이터 셋에 두 개의 열로 추가한다.

그리고 x축은 PC1, y축은 PC2로 하되, 색은 각 brand 명으로 지정하여 산점도로 그린다. 


pca2<-prcomp(mtcars[,-12], scale=T)

pca2$x[,1:2]

mtcars<-cbind(mtcars,pca2$x[,1:2])

library(ggplot2)

ggplot(mtcars,aes(x=PC1, y=PC2, color=brand))+geom_point()+labs(color="brand")



작업유형 1은 총 3문제가 나온다.

데이터 전처리와 그래프 그리는 것 까지, 기초적인 문법 연습하는 것이 필요하구나.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari