유클리드 거리 계산은 데이터간 유사도를 판단하는 기준으로 활용되며,

추후에 포스팅할 추천시스템에서도 활용된다.


간단히 설명하면 위와 같은 데이터 그룹안에 아래 화면처럼 새로운 신규 데이터가 들어오게 된다.




위 예시는 기존에 있던 데이터를 sweet와 crunchy 두 기준으로 fruit, vegetable, protein 그룹으로 구분한 것이다.


여기서 신규 진입한 데이터인 토마토가 어떤 그룹에 속할지 계산을 해야하는데, 이 때 우리는

유클리드 함수를 사용할 수 있다.



즉 x좌표는 x좌표끼리, y좌표는 y좌표끼리 뺸 후 제곱한것을 더하여, 이 값에 루트를 씌워주면 되는 것이다.




예를 들어, 토마토의 sweetness가 6이고, crunchiness 가 4이고, 이 때 green bean의 sweetness 가 3, crunchiness 가 7이라면

위와 같이 당도는 당도끼리, crunchiness 는 cruchiness 끼리 빼주면 되는 것이다.


이렇게 나온 값이 유클리드 거리이며, 이 거리가 작을수록 해당 데이터끼리 유사성을 가진다고 할 수 있다.




이렇게 다 계산을 해준후, 거리 순으로 정렬을 해보면 orange, grape, nuts, green bean 순으로 

Tomato와 유사도가 큰 것을 알 수 있다.











저번 시간에 이어서 KNN 구현을 마무리해자.


지금부터는 본격적으로 관련 라이브러리를 활용하여 완성을 할 것이다.


1
2
3
4
5
6
7
8
9
## Step.2 Training a model on the data ###
 
"class" 라이브러리 로드
install.packages("class")
library(class)
wbcd_test_pred<-knn(train=wbcd_train,
                    test=wbcd_test,
                    cl=wbcd_train_labels,
                    k=21)
cs


class 라이브러리의 knn 함수를 사용하여 KNN 알고리즘을 시행하게 된다. 


여기서 train은 위에서 나눈 학습 데이터, train은 검증 데이터, cl은 우리가 Target 변수로 하고 있는

Diagnosis 칼럼을 뜻하는데, 여기서 train_labels는 train data의 diagnosis 칼럼만 따로 추출해 놓은 것을 뜻한다. 


여기서 K는 전 포스팅 인트로에 설명하였던, 몇 개의 데이터를 계산에 포함시킬거냐에 관한 것이다.


보통 총 데이터셋의 제곱근의 값으로 계산하며, 여기서는 21로 지정하여 진행하도록 하겠다.



1
2
3
4
5
6
"gmodels" 라이브러리 로드
library(gmodels)
 
# 예측값과 실제값의 교차표 생성
CrossTable(x=wbcd_test_labels,y=wbcd_test_pred,prop.c=FALSE)
 #2개가 오분류 
cs


이렇게 생성한 예측값의 정확도를 확인해보기 위해서, gmodels 라이브러리의 크로스테이블을 사용한다. 



아래에서 확인할 수 있는 것처럼 약 98퍼센트의 예측 정확도를 보여주고 있다. 


이상으로 KNN알고리즘 구현을 마무리 할 수 있지만, 전 포스팅에서 진행하였던 최대최소 정규화 외에, 

다른 정규화 방법중 하나인 Z점수 표준화 공식을 간단히 설명하고 마무리하도록 하겠다.





공식은 X-평균 / 표준편차 이며, R에서는 아래와 같이 구현한다.


1
2
3
4
5
6
# 데이터 프레임를 z-score 표준화하기 위해 scale() 함수 사용
wbcd_z<-as.data.frame(scale(wbcd[-1]))
 
# 변환이 정확하게 적용되었는지 확인
summary(wbcd_z$area_mean)
  ## z는 평균이 0 
cs


R에서는 scale함수로 이를 간단하게 시행할 수 있으며, 아래처럼 summary 함수를 통해 성공적으로 변환이 되었는지

확인할 수 있다.


다른 과정은 동일하며 wbcd_n 자리에 wbcd_z를 넣어서 동일하게 진행하면 된다.





KNN알고리즘은 게으른 학습의 한 종류다. 


게으른 학습의 특징은 다음과 같은데, 


  • 모형을 미리 만들지 않는다

  • 새로운 데이터가 들어오면 그때부터 계산하기 시작함


으로 정리할 수 있다.

이를 KNN에 적용시켜보면 다음과 같다.

KNN은 새로운 데이터가 들어오면 K-nearest neighbor K개의 가까운 이웃들을 참고한다.

K가 2면 두 개를 찾고 3은 세 개를 찾는데 데이터에서 가까운 순서대로 찾게된다.


만약 가까운걸 찾앗는데 검은 것이 3개면 똑같이 검은색으로 분류

만약 가까운 것 세개중 두 개가 검은거면 다수결에 따라 검은색으로 분류

(실제로는 자신을 제외한 모든 데이터들과의 거리를 구하고 가까운 순서대로 정렬해서 K개를 바탕으로 한 다수결로 결과를 도출함)

 

이 거리를 어떻게 구하냐? 유클리드 거리 (다차원 공간에서 거리를 구하기 위한 방법)를 사용한다.


이 때 K가 커지면 커질수록 안정적으로 분류하는 모형을 만들수 있고(직선 형태)

K가 작으면 작을수록 세부적으로 분류할 수 있는 모형(곡선)을 만들 수 있다.


보통 K 선정은 훈련 데이터 개수에 제곱근을 씌운다움 1`부터 k까지 테스트해보고 제일 맞는거를 k로 선정해서 진행하게 된다.


이제 실습으로 들어가보자.



오늘은 UCI에서 제공하는 유방암 진단 관련 데이터를 사용할 것이다. 다운로드 링크는 아래와 같다.


 https://archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+(Diagnostic) 


타겟변수는 Diagnosis(진단)이며 M은 malignant(양성), B(benign(음성)) 을 뜻한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# CSV file import
wbcd<-read.csv("cancer.csv",stringsAsFactors = FALSE)
 
# wbcd 데이터 프레임의 구조
View(wbcd)
str(wbcd)
 
# id 속성 제거
wbcd<-wbcd[-1]
 
# 진단 테이블
table(wbcd$diagnosis)
##B는 양성 M는 음성 
 
# 팩터로서 진단 변수 변환
wbcd$diagnosis<-factor(wbcd$diagnosis, levels=c("B","M"),
                       labels=c("Benign","Malignant"))
                                                
cs


데이터셋에 대한 간단한 전처리를 진행한다.



1
2
3
# 세 속성에 대한 요약
summary(wbcd[c("radius_mean","area_mean","smoothness_mean")])
  #속성에 대한 관찰  - 편차가 크기때문에 정규화 필요 
cs

세 속성에 대해 탐색해보기로 한다. 아래에서 확인 할 수 있는 것처럼 변수내의 편차가 매우 크며,
따라서 정확한 분석을 위해 정규화를 진행하기로 한다. 



해보기로 한다. 아래에서 확인 할 수 있는 것처럼 변수내의 편차가 매우 크며,
따라서 정확한 분석을 위해 정규화를 진행하기로 한다. 



1
2
3
4
5
6
7
8
9
10
# 정규화 함수
normalize<-function(x){
  return ((x-min(x))/(max(x)-min(x)))
}
 
 
# wbcd 데이터 정규화
wbcd_n<-as.data.frame(lapply(wbcd[2:31],normalize))
  ##lapply는 리스트를 입력받아서 리스트의 각원소에 함수를 적용함 
  ## 즉 wbcd에 있는 모든 numeric data 정규화 한것 0 - 1 
cs

 

R에서 함수를 생성하는 방법은 위와 같으며, 정규화 함수를 생성한 후 

이를 wbcd 데이터에 적용시켜주고, 이를 wbcd_n변수에 담는다. 



1
2
3
4
5
6
7
8
9
10
11
# 훈련 데이터와 테스트 데이터 생성
wbcd_train<-wbcd_n[1:469,]
wbcd_test<-wbcd_n[470:569,]
 
 
# 훈련 데이터와 테스트 데이터에 대한 라벨 생성
wbcd 
wbcd_train_labels<-wbcd[1:469,1] ###,1 은 diagnosis 
wbcd_test_labels<-wbcd[470:569,1]
wbcd_train_labels
wbcd_test_labels 
cs


위와 같이 훈련데이터와 검증데이터를 분류하고 전처리를 끝낸다. 





부스팅은 앙상블 기법중 하나이다. 앙상블 기법은 모형 하나를 만드는 것이 아닌

여러 개의 모형을 만들어서 평균을 내서 예측을 하는 것이다.


예를 들어서 700명의 데이터 중에서 500명만 뽑아서 예측 작업을 한다면, 

복원추출을 사용하여 모델을 여러번 만들게 되면 각 셋마다 완벽히 중복되지 않는

여러 셋을 만들수 있는 것이다.


즉 앙상블 기법은 단독 모델로 예측하는 것이 아닌 여러 모델을 생성하여 예측을 하고

평균을 통해 이 결과를 예측하는 기법이다.


저번 포스팅에서 진행했던 실습을 이어서 해보자.


1
2
3
4
5
6
#10 trial 과 부스트드 결정 트리
credit_boost10<-C5.0(credit_train[-17],credit_train$default,
                     trials=10)
credit_boost10
summary(credit_boost10)
  #r=900개의 (10번) 시도중 3.4퍼 (31개) 만 오류남
cs


소스코드는 기존과 동일하지만, 달라진 점이 있다면 trials (시도)를 10으로

즉 10번 시도한 평균치를 바탕으로 모델을 생성한다.




summary(credit_boost10) 을 통해 확인해보면 

900번의 시도중 에러가 31개로 부스팅 시도 전보다 줄어든 것을 확인할 수 있다.



1
2
3
4
5
6
credit_boost_pred10<-predict(credit_boost10,credit_test)
 
CrossTable(credit_test$default,credit_boost_pred10,
           prop.chisq=FALSE,prop.c=FALSE,prop.r=FALSE,
           dnn=c("actual default""predict default"))
            #오차율이 23퍼센트로 줄어들었다 
cs

위에서 생성한 예측 모델을 활용하여 test 데이터를 예측한다.


이 결과를 CrossTable로 확인해보면 오차율이 23퍼센트로 감소했음을 확인할수있다.

해당 프로세스와 동일하게 부스팅을 100번으로 맞추고 시도해 보면

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
#100 trials 과 부스트드 결정 트리 
credit_boost100<-C5.0(credit_train[-17],credit_train$default,
                     trials=100)
credit_boost100
summary(credit_boost100)
  #900번 시도중 오차0 
 
credit_boost_pred100<-predict(credit_boost100,credit_test)
 
CrossTable(credit_test$default,credit_boost_pred100,
           prop.chisq=FALSE,prop.c=FALSE,prop.r=FALSE,
           dnn=c("actual default""predict default"))
          #오차율이 22퍼센트로 줄어들었다 
cs

이렇게 진행할 수 있으며, 크로스테이블을 활용하여 결과를 확인해 본다면
오차가 줄어든 것을 확인할 수 있다.

이처럼 부스팅 기법은 복원추출을 바탕으로 여러 모델을 만들어 그 평균치를 활용하기 때문에 기존에 1회 시도했을때의 예측보다 예측의 정확도가 높아지는 경향을 보인다.





의사결정트리는 데이터를 분류하는 모델중 하나인데, 특정 기준에 따라 데이터들이 분류되는 과정을 반복한다.

최종적인 목표는 각 노드들의 엔트로피 지수를 0으로, 즉 한 노드(공간)에 같은 특성을 가진 데이터들만 모이게 하는 것이다.


아래 그림을 보자.



해당 트리는 Income와 Lot size를 기준으로 데이터들을 동질한 집단으로 모으는 과정을 거쳤다. 

즉 선과 선으로 둘러쌓인 공간은 한 개의 노드와 마찬가지이며, 각 선들은 처음 그림에서의 분류 기준과 같은 것이다.


트리의 분류가 끝나게 되면 바로 위 그림처럼 특정 공간에는 같은(동질의)데이터만 오거나, 

오차율을 무시할 수 있을만큼 동질적인 수준의 데이터가 모이게 된다.


이제 코드와 함께 보자


credit.csv


저번 csv파일 입출력 포스팅에 썼던 은행 고객 데이터를 다시 사용한다.


우리가 예측해야하는 값은 17번째 열인 default 인데, 이 deault행은 해당 고객이 

"대출을 기간 내에 상환할 것인지"에 대해 Yes(상환) No(상환실패) 로 분류한 것이다. 


즉 1행부터 16행까지 다양한 변수들에 따라서 상환 여부를 예측하는 모델을 만들어야 한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#crdit data 를 이용한 은행 대출 확인#
# step1. prepare data set#
credit <- read.csv("credit.csv",stringsAsFactors = TRUE)
View(credit)
 
#대출지원자 특성 확인 
table(credit$checking_balance)
table(credit$savings_balance) #저축해놓은 자산 
 
#대출의 특성 확인
summary(credit$months_loan_duration) #대출기간 4-72달 
#평균적으로는 18개월 
summary(credit$amount) #대출액 총액 
 
#분류 액수 확인
table(credit$default) #협의한 기간 내 반납했는지 
cs


우선 csv를 읽어온 후, 간단히 몇가지 변수들에 대해 요약통계를 출력해본다.

그리고 마지막 table(칼럼) 명령어를 확인하여, 해당 칼럼내 변수들의 비율을 확인한다


즉 우리가 오늘 사용할 데이터는 상환 여부가 Yes 인 것이 700개, No 인 것이 300개가 있다는 것이다. 


1
2
3
4
5
6
7
8
9
10
11
12
#훈련과 테스트 데이터에 대한 무작위 샘플 생성
#예제와 같은 무작위 수열을 사용하기 위해 set.seed(); 사용
set.seed(12345)
credit_rand<- credit[order(runif(1000)),]
#1000개의 데이터를 난수로 섞겠다
 
#credit과 credit_rand를 비교
summary(credit$amount)
summary(credit_rand$amount)
head(credit$amount)
head(credit_rand$amount)
#순서는 바뀐거지만 내용은 안변함 
cs

set.seed(숫자) 명령어는 어떤 환경에서든 동일한 랜덤값을 가질 수 있도록 기준점을 설정해준다.

즉 set.seed 없이 runif명령어를 사용하여 순서를 섞게 된다면,

학교 실습실 컴퓨터에서 해당 명령어를 실행할 때와, 집 컴퓨터에서 해당 명령어를 실행할 때마다 랜덤으로 섞이는 데이터의 결과가 달라질 것이다.


어떤 환경에서 진행하건 "모델"은 동일한 모델이 나와야 하기 때문에 - 

즉 동일 환경에서 모델을 만들 수 있도록 하는 장치라고 생각하면 된다.


해당 명령어를 사용하고 요약통계를 확인하면 순서는 변했지만, 내용 자체는 변하지 않았음을

Head() 명령어와 summary() 명령어로 확인할 수 있다. 


1
2
3
4
5
6
7
8
 
#데이터 쪼개기 (학습 / 검증용) 
credit_train<-credit_rand[1:900,]
credit_test<-credit_rand[901:1000,]
 
#분류 변수의 비율 확인 - 트래이닝과 테스트 셋에 대한 비율 
prop.table(table(credit_train$default))
prop.table(table(credit_test$default))
cs

데이터를 학습용으로 900개, 검증용으로 100개로 나눈다.

이제 준비는 끝났고, 모델을 생성해보도록 하자.


1
2
3
4
5
6
7
8
9
10
11
12
13
#######################
##step2 모델 생성######
#######################
 
#가장 단순한 결정 트리 생성
#install.packages("C50")
library(C50)
#?C5.0
View(credit_train)
credit_model<-C5.0(credit_train[-17],credit_train$default)
#(17열을 빼고 모델을 생성한다 = 디폴트, 예측해야하는 값이기 때문)
#뒤에는 예측하고싶은 목표변수 = 디폴트값 
#x=샘플 900중 16개변수 가지고 예측 / 트리사이즈 67개 
cs

트리 생성은 C50 라이브러리를 사용한다. 없다면 설치하자.


라이브러리를 불러온 후, 모델을 생성하는데 모델 생성은 C5.0() 명령어를 사용한다.

명령어를 자세히 보면 C5.0(트레이닝 데이터 셋,타겟변수) 꼴로 넣어주면 된다


우리는 Train data를 가지고 모델을 만드는데, 여기서 17번째 열은 default, 

즉 우리가 예측을 해야하는 행이기 때문에 당연히 빼고 데이터셋을 넣어준다.

그리고 그 후에는 예측해야하는 타겟변수(train data의 default 열) 을 넣어준다.


이렇게 만든 모델은 credit_model 변수에 넣어준 후, 트리를 확인해본다.


1
2
3
4
#트리 상세하게 보려면
summary(credit_model)
#제일아래 보면 ㅍ요약표 있는데 에러가 13.9퍼 /
#즉 125개가 잘못 분류된거 900개중 
cs


트리 모델을 만들고 summary를 통해 이를 확인하면


이런 모양이 뜰 것이다,


위에서부터 설명하면, 900개의 데이터를 가지고 모델 생성을 하여, 76개 - 8.6%가 에러가 났으며

트리를 만드는데 각 변수의 사용 빈도(중요도)는 

checking_balance, credit_history ~ 순으로 나타난다.


참고로 트리에서 중요한 변수일수록 트리 모형 생성에서 부모 노드(최상위 노드)에 

가까운 분류 기준으로 위치한다. 


포스팅 첫번째 사진으로 예를 들면 outlook 이 가장 중요하고, 

humidity  windy는 그보다는 덜 중요한 변수라는 것.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
############################
#######3step 3 모델평가## ##
############################
credit_pred<-predict(credit_model,credit_test)
credit_pred
#크레딧 모델을 가지고 credit_test를 이용하여 테스트
 
 
#교차표 그리기 (예측과 실제)
library(gmodels)
CrossTable(credit_test$default,credit_pred,
           prop.chisq=FALSE,prop.c=FALSE,prop.r=FALSE,
           dnn=c("actual default""predict default"))
 
#검증용 data의 default값을 credit_pred(예측값) 과 비교해보겠다 
#73퍼의 정확도와 27퍼의 오차율
 
cs

이제 모델 평가를 해보겠다.


C5.0에서는 predict함수를 사용해 모델을 통한 예측값을 가지고 올 수 있다. 

predict(모델,예측하고싶은 데이터 셋) 을 넣어주면 된다


해당 예측의 정확도를 살펴보기 위해서 gmodels 라이브러리를 이용한

크로스테이블을 생성하겠다.




테이블을 보면 predict default 은 우리가 생상한 모델로 test set 의 default을 no 라고 예측,

actual default은 train set의 진짜 yes 와 no를 나타내고 있다.


즉 예측도 no이고 진짜도 no인가 58 / 예측 yes 진짜 yes 인것은 15로 

오늘 만든 모델의 정확도는 73%임을 알 수 있다.


다음 포스팅에는 부스팅을 통해 해당 정확도를 올릴 수 있는 방법을 알아보도록 하겠다.






R은 자바나 C와는 다르게 기존에 입력되어 있는 데이터 파일을 불러와서 분석하는 작업을 주로 수행한다. 

이 과정을 위해서는 csv 파일을 R에서 읽어올 수 있어야 (입력) 하며, R에서 처리한 파일을 저장(출력)할 수 있어야 하는데

이번 포스트에서는 해당 프로세스를 알아보도록 하겠다.


usedcars.csv


해당 파일을 워킹디렉토리에 넣고 아래 명령어를 실행한다. 

워킹 디렉토리는 setwd(원하는 디렉토리) 와 getwd()명령어로 세팅 및 확인이 가능하다.



1
2
3
#데이터 구조 살펴보기 
usedcars <-read.csv("usedcars.csv",stringsAsFactors = FALSE)
str(usedcars)
cs


우선 데이터 파일을 (csv파일) 읽어오려면, read.csv 명령어를 사용한다. 

불러온 csv를 "usedcars"라는 변수에 저장하겠다는 것이다.

str(usedcars)는 usedcars의 대략적인 데이터 구조를 살펴볼 수 있는 명령어이며 결과는 아래와 같다. 




왼쪽 달러사인($)과 함께 데이터 프레임에 소속된 변수명이 표시되고, 해당 변수에 속한 데이터들이 일정 부분 표시된다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#요약출력 
summary(usedcars)
summary(usedcars[c("price","mileage")])
summary(usedcars$price)
 
> summary(usedcars)
      year         model               price      
 Min.   :2000   Length:150         Min.   : 3800  
 1st Qu.:2008   Class :character   1st Qu.:10995  
 Median :2009   Mode  :character   Median :13592  
 Mean   :2009                      Mean   :12962  
 3rd Qu.:2010                      3rd Qu.:14904  
 Max.   :2012                      Max.   :21992  
    mileage          color           transmission      
 Min.   :  4867   Length:150         Length:150        
 1st Qu.: 27200   Class :character   Class :character  
 Median : 36385   Mode  :character   Mode  :character  
 Mean   : 44261                                        
 3rd Qu.: 55125                                        
 Max.   :151479                                        
> summary(usedcars[c("price","mileage")])
     price          mileage      
 Min.   : 3800   Min.   :  4867  
 1st Qu.:10995   1st Qu.: 27200  
 Median :13592   Median : 36385  
 Mean   :12962   Mean   : 44261  
 3rd Qu.:14904   3rd Qu.: 55125  
 Max.   :21992   Max.   :151479  
> summary(usedcars$price)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   3800   10995   13592   12962   14904   21992 
cs

다음은 가장 강력한 기초통계 함수라고 할 수 있는 summary()함수이다. 


summary 함수는 요청한 칼럼의 주요 값들을 표시해 주는데, 그 정보는 아래와 같다.

    • 최소값

    • 최대값

    • 1st quantile (25%에 해당하는 값)

    • 3rd quantile (75%에 해당하는 값)

    • 평균 

    • 중위값

호출법은 저번 포스팅의 데이터프레임 호출법과 동일하며 (같은 데이터프레임 형식이다) 
한 개 칼럼을 호출할수도 있고, 달러사인과 c("1","2") 형식으로 다중의 칼럼을 호출할 수 있다.


1
2
3
4
5
6
7
8
9
#사분위수 나타내기
range(usedcars$price) #최소 최대값 
diff(range(usedcars$price)) #range 값 차이 
IQR(usedcars$price) #q1, q3 차이 
quantile(usedcars$price) #요약계산을 위해서 사용 / 25퍼씩 요약이 어떻게 나오는지  
quantile(usedcars$price,prob=c(0.01,0.99))#내가 정확하게 알고자 하는 퍼센트 명시 
quantile(usedcars$price,seq(from =0to =1, by=0.20))
quantile(usedcars$price,seq(010.20)) #0부터 1까지 20퍼 단위로 움직  
 
cs

다음은 위에서 보여주는 Quantile(사분위수)에 관한 내용이다.
우선 사분위수에 대해서 간단하게 설명하기 위해 아래 그림을 참고하자 



간단하게 이야기하면, Quantile(사분위수)는 지나치게 범주에서 벗어나는 값들을 제외하고 핵심적인 범주의 데이터만

범위로 지정할 수 있는 방법중 하나이다. 


보통 말하는 IQR(Inter Quantile range)는 Q3~Q1 (전체 데이터 범주의 75%~25% 사이) 를 말하는 것이다.

여기서 1.5IQR이상이나 이하의 값들은 이상값 혹은 극단값이라고 불리게 된다


다시 R스튜디오로 돌아가서 실행 화면을 보자 




그냥 quantile명령어를 실행하면 0 25 50 75 100 순서로 다섯 가지 위치의 데이터 값을 보여준다.

여기서 위에서 설명한 IQR은 25%~75% 사이이며, 해당 IQR을 확인해보고 싶다면 위에 있는 것처럼 IQR명령어를,

총 범위를 보고싶으면 range()와 diff()를 함께 쓰면 된다. (range 는 범위 - diff는 그 범위의 차이. 그래서 diff가 반드시 밖으로 가야한다) 


그 외 원하는 범위를 설정하여 사분위수 함수를 응용할 수 있다. 


1
2
3
#csv파일 내보내기(저장) 
write.csv(usedcars)
write.csv(usedcars,"C:/set_your_directory")
cs

처리를 완료한 csv파일을 저장하고 싶다면 위와 같은 명령어를 활용할 수 있다.
디렉토리를 지정하지 않으면 기본 워킹 디렉토리에 저장되며, 두번째 라인처럼 수동으로 위치를 지정할 수 있다. 



R은 데이터 분석을 위한 언어로서 오픈소스 타입으로 다양한 패키지를 이용하여 여러 솔루션을 도출해낼수 있다. 

그 전 R에서 사용되는 데이터타입에 대한 간단한 정리를 통해 앞으로 진행할 분석에 활용할 예정이다.


R의 데이터 타입은 다음과 같이 정리할 수 있다

  • 백터: R의 최소단위의 데이터 타입으로서, 문자형 실수형 논리형 명목형의 네 가지 타입으로 나눠진다

  • 팩터: 명목형 범주형을 위한 일차원의 벡터 타입 

  • 리스트: 다양한 데이터 타입이 조합된 일차원의 데이터 타입 

  • Data Frame: 다양한 데이터 타입들이 조합된 이차원의 배열  

  • 매트릭스: (주로)수치형 데이터를 위한 이차원 배열 


글만 봐선 무슨소리인지 잘 이해가 안간다. 아래 코드와 함께 보자


1
2
3
4
# Scala
이름<-c("나래")
섭외인기<-c("75.8")
코메디언<-c(TRUE)
cs
우선 스칼라부터 알아보겠다. 스칼라는 한 개의 백터로 이루어진 데이터 타입으로 
각각 문자형, 문자형, 논리형의 벡터 한개가 들어가 있음을 알 수 있다.

1
2
3
4
#vector 
이름<-c("나래","지코","혁수")
섭외인기<-c(75.8,98.2,33.5)
코메디언<-c(TRUE,FALSE,TRUE)
cs

다음은 백터이다. 위에서 말한것과 같이 문자형, 숫자형, 논리형으로 구성되어 있다.

1
is(코메디언) # 타입 확인
cs
is(XX) 함수는 XX의 데이터 타입을 알아볼 수 있는 함수이다.
성별이라는 변수에 여 여 남을 담고 이를 팩터로 처리하였다.
여기서 레벨은 우선순위를 말하는 것으로 가나다 순서로 처리되어 남자가 여자보다 앞선것을 알 수 있다.

1
2
3
4
5
6
> #factor 순서
> 성별<-factor(c("여","남","남"),ordered = 1)
> 성별<-factor(c("여","남","남"),ordered=T)
> 성별
[1] 여 남 남
Levels: 남 < 여
cs
여기선 ordered=T (혹은 1)을 사용하여 "내가 순서대로 변수를 입력했음"을 알 수 있다. 
즉 위처럼 특별히 설정을 해주지 않으면 A..Z 혹은 가..하 순으로 우선순위를 부여하지만, ordered 를 사용하면 입력한 순서가 즉 우선순위가 되는 것이다. 


1
2
3
#facotr 혈액형 
혈액형 = factor(c("B","O","A"),
                levels=c("A","B","O"))
cs

귀찮다면 순서를 아무렇게 쓰고 마지막 levels 를 이용하여 다시 순서를 정해주면 된다. 

위 예시대로면 순서는 A>B>O 순으로 우선순위가 부여된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#list
박나래<-list(fullname=이름[1],
              섭외인기 = 섭외인기[1],
              코메디언 = 코메디언[1],
              성별=성별[1],
            혈액형 = 혈액형[1])
 
> 박나래[5]
$혈액형
[1] B
Levels: A B O
 
> 박나래$성
[1] 여
Levels: 남 < 여
 
박나래[c("성별",
       "섭외인기")] 
 
$성별
[1] 여
Levels: 남 < 여
 
$섭외인기
[175.8
cs

다음은 리스트에 관한 설명이다. 아까 이야기했던 것처럼 리스트는 여러 데이터 타입의 변수를 담을 수 있는 일차원의 공간이다. 


위 예시를 바탕으로 설명하면 이름의 "첫번째" 벡터를 fullname에 담아 리스트에 저장하고, 섭외인기의 "첫번째" 변수를 담고 그 이름을 섭외인기로 하여 리스트에 저장하고... 순서로 진행된다. 


아래 예시는 "박나래" 리스트의 다섯번째 항목을 출력하라는 것이다 (박나래[5]). 이 상황에서는 기존에 존재하던 혈액형 벡터의 첫번째 값인 B가 '혈액형'이라는 이름으로 리스트에 저장되었는데, 이 저장된 순서가 다섯번째니 혈액형이 출력이 되는 것이다. 


한편 리스트에 속한 변수 이름으로도 호출할 수 있다. 박나래$성별, 혹은 다수의 변수를 호출할 경우 박나래[c("호출할변수1","호출할변수2)]꼴로도 진행 가능하다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#data frame
사람들 <- data.frame(이름,섭외인기,코메디언,성별,혈액형)
 
사람들
 
//##결과 
 
  이름 섭외인기 코메디언 성별 혈액형
1 나래     75.8     TRUE   여      B
2 지코     98.2    FALSE   남      O
3 혁수     33.5     TRUE   남      A
 
 
View(사람들) // 새 창으로 출력 
 
>사람들[2,4]
[1] 남
Levels: 남 < 여
 
 
> 사람들[1,]
  이름 섭외인기 코메디언 성별 혈액형
1 나래     75.8     TRUE   여      B
 
> 사람들[1]
  이름
1 나래
2 지코
3 혁수
cs

다음은 데이터 프레임이다. 데이터 프레임은 다양한 타입의 변수를 모두 포함할 수 있는 이차원의 공간이다. 


위에서 선언한 이름, 섭외인기, 코메디언, 성별, 혈액형 변수를 한 개의 데이터프레임화 하여 "사람들"에 저장한다. 그 결과는 위와 같으며 만약 View(사람들) 을 할경우 새로운 창으로 볼 수 있다.


데이터 타입의 레코드는  * 데이터프레임이름[원하는행,원하는열] * 꼴로 검색할 수 있다. 

사람들[2,4]가 그 예시이다. 한편 사람들[1,]꼴로 행이나 열에 대한 부분을 비워두게 되면, 선택한 행(열)에 해당하는 모든 정보를 저장하겠다는 것이다. 


 

+ Recent posts