[R을 활용한 분류분석]



1. 개요


IRIS 데이터에 R을 활용한 분류분석


R을 활용한 분류분석을 위해 IRIS데이터를 활용하여 보겠습니다. IRIS데이터는 세 가지 종류의  붓꽃으로 분류된 데이터입니다. 붓꽃들은 Iris setosa, Iris virginica, Iris versicolor입니다.  이 데이터는 붓꽃에 따라 꽃받침인 sepal의 길이, 너비, 그리고 꽃잎인 petal의 길이와 너비 값을 기록한 데이터입니다. 이 붓꽃들은 꽃받침과 꽃잎의 비율로 품종을 구분하기 때문에 연구 끝에  데이터를 추출한 것으로 150개의 레코드로 구성되어 있습니다. 데이터 정보가 영어로 되어 있기  때문에 각 데이터가 어떤 것을 나타내는지를 먼저 확인하겠습니다. Sepal Length는 꽃받침의 길이를  나타내며 Sepal Width는 꽃받침의 너비를 나타냅니다. Petal Length는 꽃잎의 길이를 나타내고  Petal Width는 꽃잎의 너비를 나타냅니다.  그리고 Species는 꽃의 종류를 말하며 setosa, virginica, versicolor의 3종류로 구분됩니다. 





2. 수행


Party Packgae  우리는 party package를 사용할 것인데요. party package는 R에서 제공하는 분류분석 패키지 중  하나입니다. ctree를 이용하여 의사결정 트리를 생성합니다. party package는 사용하기 편하다는 큰  장점이 있으나 단점도 있는데요. 먼저 좌우로 분실이 분류되는데 분실값을 잘 처리하지 못합니다.  그리고 tree에 투입된 데이터가 표시되지 않거나 predict가 실패하는 경우, 명목 변수의 테스트   데이터가 train과 다르게 처리됩니다. 이를 주의하며 다루어야겠습니다.






R에서 party package를 실행하기 전에 iris 데이터에 대한 통계 값을 산출할 수 있는 것이 summary   함수입니다. 이를 사용하면 Sepal.Length 변수의 최소 값은 4.3이고, 평균인 Mean은 5.843이며  최대 값인 Maxs가 7.9임을 알 수 있습니다. 동일하게 다른 변수들에 대해서도 확인할 수 있죠.  또한 setosa, versicolor, virginica 3종의 iris가 각각 50개씩 있는 것도 알 수 있습니다.





Party Package의 ctree를 이용한 분류분석


먼저 data(iris)는  사용할 데이터를 지정해서 로딩한다는 것입니다. 그리고 2번 박스를 보시죠. 먼저 nrow(iris)가  있는데요. nrow( )함수는 행렬에서 행 개수를 파악할 경우 사용합니다. ind → sample(2,nrow(iris),  replace=TRUE, prob=c(0.7,0.3))라는 것은 ind 변수에 1과 2값을 할당하여 이 범위에서 iris테이블의  행의 개수만큼 70%, 30%로 샘플 데이터셋트를 구성하겠다는 것입니다. 이는 학습 데이터와 테스트 데이터를 구분하기 위한 것인데요. 학습 데이터란 모델개발을 위해 학습할 데이터이고, 테스트  데이터는 학습을 통해 만든 모델을 검증하는 데이터입니다. 

trainData ← iris[ind==1,]와 testData ← iris[ind==2,]로 iris 전체 데이터 중에서 ind에 따라 학습 데이터와 테스트 데이터를 구분합니다. 

myFormula ← Species ~ Sepal.Length + Sepal.Width +  Petal.Length + Petal.Width 라는 것은 모델링에 타겟변수와 타겟을 분류하는데 사용할 변수들을  공식으로 정의한 것입니다. 변수가 많거나, 이미 모델링을 위한 데이터를 선별해서 작성한 경우 “~”처럼 표현해서 모든 변수를 투입합니다. 


iris_ctree ← ctree(myFormula, data=trainData)는  ctree를 이용해서 학습 데이터를 해당공식에 맞는 모델로 만들어 iris_ctree에 저장한 것입니다.

6번 박스의 언어는 학습 데이터에 따른 모델의 성과를 확인하기 위해 예측된 데이터가 원래 학습  데이터에 있는 Species와 어떻게 차이가 있는지 확인합니다. 




좌측은 예측값이고 상단은 실제값입니다.  따라서 vesicolor라고 예측한 것 36개 중에 실제로 vericolor는 34개이고 2개는 virginica입니다.   전체적으로 보면 원래값으로 제대로 예측했음을 알 수 있습니다.


print(iris_ctree)를 입력하면 학습 데이터로 개발된 모델의 산출물이 텍스트 형식으로 표현됩니다.  다음과 같이 조건문으로 표시됩니다.




plot(iris_ctree)를 입력하면 개발된 모델을 그래프로 표현합니다. 어떤 변수가 크게 분류를 하고, 어떤 조건인 경우에 어떠한 class가 주로 존재하는지를 구조적으로 파악할 수 있습니다. 4개의 끝난  노드를 갖는 tree로 표현되었습니다.





plot함수에 타입을 심플로 주면 개발된 모델을 심플하게 그래프로 표현합니다.
testPred ← predict(iris_ctree, newdata=testData)는 개발된 모델을 이용해서 테스트 데이터에 적용해  최종 검증을 합니다. 




그리고 table(testPred, testData$Species)테스트 데이터의 정확도를  분석합니다. 
다음은 그 결과입니다. 








[R을 활용한 군집분석]



1. 개요


IRIS 데이터에 R을 활용한 분류분석


IRIS 데이터인 (iris.arff)에서 IRIS 종류를 의미하는 class 속성을 제거하고 4가지 속성을 기준으로  군집분석을 해볼 텐데요. 꽃받침의 길이와 너비 그리고 꽃잎의 길이와 너비가 4가지 속성입니다.  이 값을 기준으로 150개의 데이터를 클러스터링 하는 군집분석을 수행해보도록 하겠습니다.



2. 수행


K-평균(K-Means) 군집분석


K-평균(K-Means) 군집분석을 진행해보도록 하겠습니다. 먼저 data(iris)로 사용할 데이터를  지정해서 로딩합니다. 그리고 newiris<-iris를 입력하여 iris 데이터를 newiris로 복사합니다.  이는 K-평균(K-means) 분석을 위함입니다. newiris$Species <-NULL은 복사한 데이터의 Species에  NULL값을 주는 것입니다. NULL은 아무 가치 없는 이라는 의미를 가진 형용사인데요. 프로그래밍  언어에서 초기값을 만드는 역할을 합니다. 이 전체명령어는 복사한 데이터를 세분화 했을 때 세분  집단이 Species를 잘 분류해 주었는지를 알고자 Species에 NULL값으로 초기화 하는 것입니다. 

kc <-kmeans(newiris,3)는 Species가 3개가 있으므로 일단 이러한 아이디어를 갖고 최적의 값이  3개라는 사전지식 하에 시도해본다는 것입니다. kc는 결과를 도출합니다. 다음 결과를 보시죠.

이 결과값은 3개 집단의 size와 각 집단의 변수들의 평균값, 각 데이터가 어느 cluster에 속할지에  대한 값을 보여줍니다.




plot(newiris[c("Sepal.Length","Sepal.Width")], col=kc$cluster)에서 col=kc$cluster이라는 것은  kc변수의 cluster 값마다 다른 color를 적용한다는 것입니다. 즉, Sepal의 width와 length color를  다르게 하여 K-평균 결과를 나타냅니다. 7번 박스 언어 중 pch(  )는 plotting character의 약어로  위치 표식을 하는 함수입니다. 


즉, points(kc$centers[,c("Sepal.Length","Sepal.Width")],  col=1:3,pch=8,cex=2)는 3개 클러스터의 중심점을 위치 표식 정수 8번이 가리키는 심볼 함수를  사용하여 디폴트 포인트보다 2배 포인트로 표시하겠다는 것입니다. 변수가 Sepal.Length와 Sepal.Width 2개로 제한되어 일부 집단이 겹쳐지는 것으로 나타나지만 전체적으로 집단이 다른 색으로 구분됨을 알 수 있습니다.








[R을 활용한 연관분석]


1. 개요


R은 arules library를 사용하여 연관분석을 수행합니다. arules는 Apriori 알고리즘을 이용하여  연관규칙을 분석하는데 아직 arules 패키지를 R에 설치하지 않았다면 install.packages("arules")를  이용하여 설치합니다. 그리고 연관분석을 위해 트랜잭션 데이터가 반드시 필요한데요. ID라고 즉, Item으로 구성된 Data라고도 부릅니다. 이는 상점에서 고객의 주문이나 판매, 은행에서 고객의  입금이나 출금 등과 같은 외부 거래를 기록하기 위해 단말기 등에서 생성하여 컴퓨터 시스템으로  전송하는 데이터라는 것을 알아두세요.




2. 수행


그럼 DVD 대여 거래 정보 데이터를 이용하여 연관분석을 해보겠습니다 DVD 대여 거래 정보는  rattle 패키지에서 제공하는 데이터를 활용할 것입니다. DVD 대여 거래 정보를 가지는 dvdtrans.csv  파일을 다운 받아 작업디렉토리에 이동시키고 dvd ← read.csv("dvdtrans.csv", header = TRUE,   as.is = TRUE) > dvd를 치면 다음과 같은 결과화면이 나옵니다. 



자, 결과를 살펴봅시다. 10개의 DVD 대여 거래에서 어떤 DVD가 대여되었는지를 보여주고 있습니다. 

첫 번째 열은 거래 번호, 두 번째 열은 대여된 DVD 물품 정보를 보여줍니다. 예를 들어 첫째에서  다섯째 행까지는 1번 거래에서 다음과 같은 5개의 DVD가 동시에 대여되었음을 보여주고 있습니다.




데이터변환 - 트랜스잭션 클래스로 변환


다음은 데이터를 트랜스잭션 클래스로 변환해 보겠습니다. arules 패키지를 이용하여 연관규칙을  분석하기 위해서는 arules 패키지가 사용하는 데이터 형태로 변화해주어야 하기 때문입니다. 

> dvd.list ← split(dvd$Item, dvd$ID)를 입력하면 DVD 물품별의 기록이 하나의 레코드로 된 구조를  거래 ID별로의 기록이 하나의 레코드로 된 구조로 변환합니다. 이렇게 변환하기 위해 split 함수를  이용하는데요. split 함수는 첫 번째 인수로 주어진 벡터의 데이터를 두 번째 인수로 주어진 벡터의  요인별로 데이터를 구분하여 list를 생성해 줍니다. 





결과화면을 보면 거래 ID에 따라 대여된 DVD 물품을 개별적 벡터로 분할하여  보여주고 있습니다.





arules 패키지를 이용한 작업


지금부터의 작업은 arules 패키지를 이용하여야 합니다. ibrary(arules)로 arules 패키지를  적재합니다. 그리고 dvd.trans ← as(dvd.list, "transactions")으로 arules에서 사용하는  트랜스잭션 클래스로 데이터를 변환해 줍니다. 이는 as(  ) 함수를 이용한 것인데요. as(  ) 함수를  이용하면 해당 데이터 구조를 정해진 클래스 데이터로 변환할 수 있습니다. 이는 데이터를 변환  결과인데요. 거래 정보가 10개의 거래와 총 10개의 물품으로 구성된 데이터임을 보여줍니다.





연관규칙의 생성

이제 연관규칙을 생성해볼 텐데요. 연관규칙은 arules 패키지가 제공하는 apriori() 함수를 이용하여  생성합니다. apriori() 함수는 최소 지지도에 의해 가지치기를 하는 알고리즘을 이용하며 출력  결과를 통해 알고리즘에서 사용한 매개변수의 값을 보여줍니다. > dvd.rules ← apriori(dvd.trans)는  변환한 데이터에 apriori() 함수를 이용하여 연관 규칙을 생성하라는 것입니다.  그 결과 화면을 보시죠. 



apriori() 함수는 출력 결과를 통해 알고리즘에서 사용한 매개변수의 값을 보여줍니다.  우리는 호출 시 별도의 매개변수 설정이 없었으므로 디폴트 값에 의해 규칙이 생성되었습니다.  디폴트 값이란 프로그램에서 사용자가 값을 지정하지 않아도 컴퓨터 시스템 자체에서 저절로 주어지는   값인데요. 주요 매개변수의 의미와 디폴트 값을 알아보겠습니다. confidence는 규칙의 최소  신뢰도 라는 의미로 0.8이라는 디폴트 값을 가집니다. smax는 규칙의 최대 지지도를 의미하며 1을  디폴트 값으로 가집니다. support는 규칙의 최소 지지도로 0.1을 디폴트 값으로 가집니다. minlen은  규칙에 포함되는 최소 물품수로 1을 디폴트 값으로 가지며 maxlen은 규칙에 포함되는 최대 물품수로  10을 디폴트 값으로 가집니다. 



연관규칙의 결과 요약정보

연관규칙의 결과를 요약한 정보를 확인하겠습니다. 이는 summary(  ) 함수를 이용할 겁니다. summary(  ) 함수는 연관규칙 분석결과에 대한 요약 정보를 출력하는 함수이기 때문입니다. 

> summary(dvd.rules)는 생성된 연관규칙 결과데이터를 요약하라는 것입니다. 결과 화면을 보시죠






총 77개의 연관규칙이 발견되었고, 이 중 물품이 2개 관련된 연관규칙은 12개, 3개 관련된 규칙은  36개, 4개 관련된 규칙은 24개, 5개 관련된 규칙은 5개임을 알 수 있습니다. 또한 규칙에 포함된  물품 수에 대한 최소, 최대 및 사분위수 정보도 확인할 수 있고, 발견된 규칙에 대한 지지도,  신뢰도, 향상도(lift)에 대한 최소, 최대 및 사분위수 정보와 함께 분석에 사용된 데이터와  매개변수에 대한 정보도 함께 제시하고 있습니다.





발견된 연관규칙 확인


발견된 연관규칙의 결과를 확인하려고 할 때 inspect(  ) 함수를 이용합니다. inspect (  ) 함수는  배열의 내용을 알기 쉬운 형식으로 하여 출력하는 함수입니다. > inspect(dvd.rules)는 생성된  연관규칙 결과데이터를 보기 좋게 정렬합니다. 결과 화면을 보시죠. 





발견된 77개의 연관규칙을 확인할 수 있는데 우리는 그 일부분만 보겠습니다. 총 10개의 거래를  가지고 연관규칙을 분석하였으므로 한 거래에서만 물품들이 같이 대여되었어도 지지도가 0.1이 됨을  알 수 있습니다. 결과에서 제시된 많은 연관규칙이 한 거래에서만 나타난 지지도 0.1인 규칙임을  볼 수 있습니다.


좀 더 유용한 연관규칙 을 확인하고 싶다면 

> dvd.rules ← apriori(dvd.trans, parameter = list (support = 0.2, confidence = 0.6))를 적용합니다. 최소 지지도를 0.2 이상 가지고 신뢰도를  0.6으로 낮추어 실행하는 것입니다. 그러면 총 15개의 연관규칙을 발견할 수 있습니다.