Quiet Time

barplot( d[c(1:7),],names.arg=colnames(t(d)
주제 : 한국인 신체 데이터로 다양한 분석을 하고 시각화 해보자 !
엔트로피와 결정트리 그리기 
궁금증1 . 남자와 여자를 구분할 때 가장 큰 영향을 미치는 속성 무엇일까?

install.packages('FSelector')
library(FSelector)
install.packages("doBy")
library(doBy)

k<- read.csv('kbody3.csv',header=T)
k<- na.omit(k)
normalize <- function(x) {
 return((x - min(x)) / (max(x) - min(x)))
}
norm <- as.data.frame(lapply(k [,c(2:18)], normalize))
norm <- cbind(k [,c(1,19,20)], norm)
colnames(norm)

IG <- information.gain(gender~., norm[,-4]) #성별 컬럼을 뺀다. 
a<- data.frame(IG)
install.packages("doBy")
library(doBy)
d<-orderBy(~-attr_importance,a)
barplot( d[c(1:7),],names.arg=colnames(t(d))[c(1:7)])


결정트리를 그려보자 
tree1 <- rpart(gender~. , data= norm, control=rpart.control(minsplit=2) )

plot(tree1, compress = T , uniform = T , margin=0.1)

text(tree1, use.n = T , col = "blue")

궁금증2 . 나이에 가장 큰 영향을 미치는 컬럼이 키로 나왔다. 

이상하게 여겨져 키와 나이로 plot그래프를 그리니 
10대 이하 성장기인 연령의 키까지 포함되어 그래프가 아래와 같이 나오는것 같았다. 

20세 이상의 사람들만 추려서 나이에 가장 영향을 받는 속성 다시 뽑아보자 
e <- k[k$age >= 20 ,]
IG <- information.gain(age~., e) 
library(doBy)
d<-orderBy(~-attr_importance,a)
barplot( d[c(1:7),],names.arg=colnames(t(d))[c(1:7)])

20대 이상만 걸러내도 키가 가장 큰 영향을 미친다. 
plot으로 그려보면 



나이가 어려질 수록 평균키가 증가하는 경향을 볼 수 있다. 


IG <- information.gain(Basic_metabolism~., norm) #성별 컬럼을 뺀다. 
a<- data.frame(IG)
install.packages("doBy")
library(doBy)
d<-orderBy(~-attr_importance,a)
barplot( d[c(1:7),],names.arg=colnames(t(d))[c(1:7)])

기초 대사량과 관련이 깊은 속성은 ?


각 속성들로 남자와 여자를 구분하는 방법은 다양한 알고리즘으로 시도해보자 ! 
신경망, svm, knn  


신경망으로 !~
norm <- as.data.frame(norm)
quater3 <- sample(nrow(norm),round(0.75 * nrow(norm)))
k_train <- norm[quater3,]
nrow(k_train)
k_test <- norm[-quater3,]
nrow(k_test)

n <- colnames(k_train)

# energy_output ~ temperature + exhaust_vacuum + … 를 변수 f 에 집어넣기
f <- as.formula(paste("gender ~", paste(n[!n %in% "gender"], collapse = " + ")))

quater3 <- sample(nrow(norm),round(0.75 * nrow(norm)))
k_train <- norm[quater3,]
nrow(k_train)
k_test <- norm[-quater3,]
nrow(k_test)

model <- neuralnet(formula = f,  data = k_train, hidden= c(3,3))

model_results <- compute(model , k_test[-1])
predicted <- model_results$net.result
cor[predicted,k_test$gender]

model_results <- compute(model , k_test[-1])
predicted <- model_results$net.result

plot(model)


cor(predicted,k_test$gender)

 svm으로!
install.packages("kernlab")
library(kernlab)

ksvm <- ksvm(gender~ ., data = k_train, kernel = "rbfdot")
pred <- predict(ksvm , k_test)
agreement <- round(pred) == k_test $gender
table(agreement )

prop.table(table(agreement))




knn으로 ~
install.packages("class")
library(class)
pred <- knn(train = k_train, test = k_test, cl = k_train$gender, k=21)
library(gmodels)

CrossTable(x = k_test$gender, y = pred ,  prop.chisq=FALSE)


100% 분류! 






 

■ apriori 알고리즘
  1. apriori 알고리즘 이무엇인지?
  2. apriori 알고리즘 실습 1 ( 맥주와 기저귀)
  3. apriori 알고리즘 실습 2 (상가 건물 데이터)
  4. apriori 알고리즘 실습 3 ( 책 : 야채와 우유 데이터) 
■ 1.apriori 알고리즘이 무엇인지?

맥주와 기저귀와의 관계를 알아낸 대표적인 기계학습 방법

시리얼 ----------------> 우유 

쉽게 말해 이 규칙은 시리얼을 사면 우유도 함께 구매한다는 것을 알아내는 알고리즘 

  • apriori 알고리즘 공식(p312)
                count(x)  <- x 아이템의 거래건수
support(x) = ---------------
     ↑              N  <- 데이터베이스의 전체 거래 건수
아이템 x에 대한 지지도 
                              support(x,y)           
     confidence (x -> y) = ----------------
                              support(x) 

연관 관계의 계산은 아이템들의 출현 빈도를 이용하여 계산을 하게 된다.

신뢰도(기저귀 ---> 맥주) ? 항목 기저귀를 포함하는 건수에서 기저귀와 맥주를 모두
                         포함하는 건수의 비를 구한다.

     다시 말하면 ?
         
     아이템 기저귀가 출현될 때 또 다른 아이템 맥주가 포함되어있을 경우의 조건부 확률

지지도(우유 ---> 시리얼) : 우유와 시리얼을 동시에 구매할 확률
신뢰도(우유 ---> 시리얼) : 우유를 구매할때 시리얼도 같이 구매할 확률

예 : 90%의 사람이 시리얼 구매할 때 우유를 같이 구매한다.
     라는 연관 규칙을 발견하려 한다. 
 
  거래번호        구매물품          (p311)
     1          우유, 버터,시리얼
     2          우유, 시리얼
     3          우유, 빵
     4          버터, 맥주, 오징어

문제232. 전체 아이템에서 우유와 시리얼이 동시에 출현할 확률은? 
 
2/4 

문제233. 우유를 샀을때 시리얼 살 조건부 확률

2/3 

문제234. 이와는 반대로 시리얼을 샀을때 우유를 동시에 구매할 확률

100% 

이를 간단히 표현하면 다음과 같다 

우유 ---> 시리얼( 50%, 66%)
시리얼 --> 우유 (50%, 100%)

시리얼을 샀을때 우유를 사게되는 지지도는 50%이고 신뢰도는 100% 이다.

우리가 찾고자 하는 연관 규칙은 지지도와 신뢰도가 둘다 최소한도보다 
높은것이다. 

보통은 최소 지지도를 정하여 그 이하는 모두 버리고 그중에 신뢰도가 어느정도 높은것들만 가져오는 
방법을 쓴다. 

x와 y라는 항목의 조합의 수도 너무나도 다양하기 때문에 모든 경우의 수를 다 계산한다면 시간이 오래 걸린다.

최소 지지도 이상의 데이터를 찾는다 어떻게 하면 찾을 수 있는지 연습해보자 

       거래번호        아이템
          1          A C D
          2          B C E
          3          A B C E 
          4          B E 

문제235. 위으 각각의 아이템에 대해서 지지도를 산정해보시오! 
     원래 지지도는 "구매건수/전체구매건수" 로 계산 할 수 있지만
     여기서는 단순하게 아이템의 갯수로 처리하시오 

아이템   지지도 
  A     2          
  B     3
  C     3
  D     1
  E     3

문제236. 이것에 대해서 지지도가1이상인것만 추출하여 다시 정리하시오 

아이템   지지도 
  A     2          
  B     3
  C     3
  E     3

문제237. 이제 아이템들간의 연관규칙을 알아야하므로 다시 아이템들간의      
     조합으로 재구성하고 지지도를 다시 구하시오 

아이템 목록     지지도          거래번호   아이템 
A  B          1                   1    A C D
A  C          2                   2    B C E
A  E          1                   3    A B C E
B  C          2                   4    B E
B  E          3
C  E          2

그리고 지지도가 1인것은 제외한다.

아이템 목록     지지도
A  C          2
B  C          2
B  E          3
C  E          2 

문제238. 이제 각각의 아이템 목록에서 첫번째 아이템을 기준으로 
          동일한것을 찾아보시오!

B 가 발생하면 이 B에 대해서 각각의 두번재 키를 조합한다. 
B 에 대해서 C, E가 조합된다.

아이템 목록      지지도
B C E           2

             처음상태 -------------------------------------> 발견된 연관규칙 
       거래번호        아이템                             아이템 목록    지지도 
          1          A C D                              B C E           2
          2          B C E
          3          A B C E 
          4          B E 


문제239. 맥주와 기저귀 판매 목록 데이터를 가지고 
        기저귀를 사면 맥주를 산다라는 연관규칙을 발견하시오 !
 

 


x <- data.frame(

beer=c(0,1,1,1,0),

bread=c(1,1,0,1,1),

cola=c(0,0,1,0,1),

diapers=c(0,1,1,1,1),

eggs=c(0,1,0,0,0),

milk=c(1,0,1,1,1) )


install.packages("arules")
library(arules) 

trans <- as.matrix(x, "Transaction")
trans


rules1 <- apriori(trans, parameter = list(supp=0.2, conf=0.6, target="rules"))
rules1

inspect(sort(rules1))


                            지지도  신뢰도
5  {beer}    => {diapers}     0.6  1.0000000 1.2500000
6  {diapers} => {beer}        0.6  0.7500000 1.2500000
7  {milk}    => {bread}       0.6  0.7500000 0.9375000
8  {bread}   => {milk}        0.6  0.7500000 0.9375000

문제240. 건물 상가에 서로 연관이 있는 업종은 무엇인가?
          (병원 ---> 약국) data 게시판에 건물 상가 데이터 
 
install.packages("arules")
library(arules)

build<- read.csv('building.csv', header= T)

build[is.na(build)]<- 0
build <- build[-1]
trans <- as.matrix(build, "Transaction")

rules1 <- apriori(trans, parameter = list(supp=0.2, conf=0.6, target="rules"))
rules1
inspect(sort(rules1))

   lhs                 rhs              support confidence     lift
1  {일반음식점}     => {패밀리레스토랑}    0.40  1.0000000 2.222222
2  {패밀리레스토랑} => {일반음식점}        0.40  0.8888889 2.222222
3  {약국}           => {휴대폰매장}        0.25  1.0000000 3.333333
4  {휴대폰매장}     => {약국}              0.25  0.8333333 3.333333
5  {약국}           => {병원}              0.25  1.0000000 3.333333
6  {병원}           => {약국}              0.25  0.8333333 3.333333
7  {휴대폰매장}     => {병원}              0.25  0.8333333 2.777778

결론 :  일반 음식점과 패밀리 레스토랑이 같은 건물에 있는 경향이 높고 약국과 병원, 휴대폰 판매점이 같은 건물에 있는 경향이 있다.

문제241. 보습학원이 있는 건물에는 어떤 업종의 매장이 있는지 알아내시오 (연관이 높은지 알아내시오 ) 

30 {보습학원,    은행}       => {카페}              0.20  1.0000000 4.000000
31 {카페,    보습학원}       => {은행}              0.20  1.0000000 5.000000

보습학원 있으면 아주 높은 확률로 그 건물에 은행이나 카페가 있네여 ! 

  1. apriori 알고리즘 실습 3 (책: 야채와 우유 데이터 ) 
[ 경원형 발표 ]
groceries <- read.transactions("groceries.csv",sep=",")

groceries


summary(groceries)
# 9835행은 저장된 거래와 169개 열은 사람들의 장바구니에 있을 수 있는 169개 제품에 대한 속성이다.
# 매트릭스의 각 칸은 거래에서 구매한 제품이면 1, 그렇지 않으면 0이 된다.
# 밀도값 0.02609146은 매트릭스에서 0이 아닌 칸의 비율을 뜻한다.
# 9835 * 169 = 1,662,115개가 매트릭스에 있기 때문에 상점의 영업시간동안
# 총 1662115 * 0.02609146 = 43,367개의 제품이 거래됏음을 계산 할 수 있다.
# 평균 한번의 거래에서 43367 / 9835 = 4.409개의 다른 제품이 구매됏다.
# whole milk 의 2513 / 9835 = 0.2555이기 때문에 거래의 25.6%에서 whole milk가 나타난다.
# whole milk 말고도 나머지도 일반적인 제품이다.
# element (itemset/transaction) length distribution를 보면
# 2159 거래는 하나의 제품을 포함하고 있고 1개 거래가 32개 제품을 포함한다.
# mean이 4.409로 43367 / 9835 = 4.409 이 계산과 맞아 떨어진다.

# 희소 매트릭스의 내용을 보기 위해 벡터 연산의 조합과 inspect() 함수를 사용한다.

# 첫 5개의 거래를 볼수 있다.
# csv 파일과 같다
inspect(groceries[1:5])

# itemFrequency() 함수는 제품이 포함한 거래의 비율을 볼 수 있게 한다.
# 예를 들어 식료품 데이터 3개 제품에 대해 지지도 레벨(support level)을 볼 수 있다.
itemFrequency(groceries[,1:3])

# 데이터에서 적어도 0.1(10%)의 지지도 이상인 8개 제품을 보여준다.
itemFrequencyPlot(groceries , support=0.1)

# groceries 데이터에서 상위 20개 제품에 대한 다이어그램이다.
itemFrequencyPlot(groceries, topN=20)


image(groceries[1:5])

# 100개의 행과 169개의 열로 구성된 매트릭스 다이어그램을 생성한다.
image(sample(groceries,100))

## 3단계 : 데이터로 모델 훈련
apriori(groceries)

# 하루에 두번씩(약 60번) 구매되는 제품이라면 지지도 레벨을 계산하는데 쓸 수 있다.
# 총 9835에서 60은 0.006이기 때문에 지지도를 0.006으로 한다.
# 결과에 포함되기 위해서 적어도 25% 정확도의 규칙을 뜻하는 0.25인 신뢰도 경계 값으로 시작한다.
# 두 제품보다 적게 포함되는 규칙을 제거하기 위한 minlen을 2로 설정한다.
groceryrules <- apriori(groceries, parameter=list(support = 0.006, confidence=0.25, minlen=2))
# 463개의 연관 규칙을 포함하고 있다. 규칙이 사용할 만한지 결정하기 위해 좀 더 살펴봐야 한다.
groceryrules

## 4단계: 모델 성능 평가

# rule length distribution 이부분을 살펴보면
# 150개의 규칙이 2개의 제품을 갖고 있는 반면, 297개의 규칙은 3개, 16개의 규칙은 4개 제품을 가지고 있다
# 세번째 열인 리프트(lift)는 지금까지 고려하지 않은 메트릭이다. 다른 물품을 구매한 것을 고려해
# 전형적인 구매 비율과 상대적으로 물푸이 얼마나 구매됏는지 측정한다. 이는 다음 식으로 정의 된다.
#                confidence(X->Y)
# lift(X->Y) = -------------------
#                 support(Y)
# mining info 부분은 얼마나 규칙을 선택할 수 있는지 알려준다.
# 9835건의 거래를 포함한 groceries 데이터는 최소 지지도인 0.006과 최소 신뢰도인 0.25로 규칙을 만든것을 확인할 수 있다.
summary(groceryrules)

# lhs는 규칙을 작동시키기 위해 충족해야할 조건이고 rhs는 충족된 조건의 결과로 예상되는 값이다.
# 첫번째 규칙은 소비자가 potted plants(화분 식물)을 사면 whole milk(전유)도 산다는 의미이다
# 약 0.007의 지지도와 0.4의 신뢰도를 가지고 있고 이 규칙은 약 0.7%의 거래를 이룬다.
inspect(groceryrules[1:3])

## 5단계 : 모델 성능 향상
# 리프트 통계를 따르는  최상상의 5개 규칙은 다음과 같다.
# 리프트가 3.956477인 첫번째 규칙은 허브를 산 구매자는 일반적으로 근채류 구매가 4배에 가깝다고 나온다.
# 두번째 규칙은 딸기를 구매한 소비자는 일반 소비자보다 3배 더 많이 거품크림을 구매한다.
inspect(sort(groceryrules,by="lift")[1:5])

# subset() 함수는 거래,제품,규칙의 부분집합을 찾는 기법을 제공한다.
# 딸기 홍보광고를 만들기 위해서 딸기가 포함된 규칙을 저장한다.
berryrules <- subset(groceryrules,items %in% "berries")
inspect(berryrules)

# 장바구니 분석 결과를 공유하기 위해 write함수로 csv파일에 저장할 수 있다.
write(groceryrules, file="groceryrules.csv",sep=",", quote=TRUE, row.names=FALSE)

# 규칙을 데이터 프레임으로 변환하는것이 편리하다. as() 함수를 이용해서 만들수 있다.
groceryrules_df <- as(groceryrules, "data.frame")
# 수치가 가장 높은 순으로 정렬
install.packages("doBy")
library(doBy)
head(orderBy(~-lift,groceryrules_df))
head(orderBy(~-support,groceryrules_df))
head(orderBy(~-confidence,groceryrules_df))
str(groceryrules_df)




문제242. (점심시간 문제) 다음 데이터에서 가장 연관성이 높은 항목을 찾으시오

x <- data.frame(
  영화=c(0,1,1,1,0,1,1,1,0,1,1,1,1),
  오징어=c(1,0,1,1,1,1,0,0,0,1,0,0,1),
  맥주=c(0,0,1,0,1,0,0,0,1,1,0,0,1),
  음료=c(1,1,0,1,1,0,0,1,0,0,1,1,0),
  스낵=c(0,1,0,0,0,0,0,0,0,1,1,0,0),
  팝콘=c(0,1,1,1,1,1,1,1,0,1,1,0,1))

trans <- as.matrix(x, "Transaction")
trans


rules1 <- apriori(trans, parameter = list(supp=0.2, conf=0.6, target="rules"))
rules1

inspect(sort(rules1))


> inspect(sort(rules1))
   lhs         rhs        support confidence      lift
1  {}       => {영화}   0.7692308  0.7692308 1.0000000
2  {}       => {팝콘}   0.7692308  0.7692308 1.0000000
3  {영화}   => {팝콘}   0.6923077  0.9000000 1.1700000
4  {팝콘}   => {영화}   0.6923077  0.9000000 1.1700000
5  {오징어} => {팝콘}   0.4615385  0.8571429 1.1142857
6  {팝콘}   => {오징어} 0.4615385  0.6000000 1.1142857
7  {음료}   => {영화}   0.3846154  0.7142857 0.9285714




x <- data.frame(
  영화=c(0,1,1,1,0,1,1,1,0,1,1,1,1),
  오징어=c(1,0,1,1,1,1,0,0,0,1,0,0,1),
  맥주=c(0,0,1,0,1,0,0,0,1,1,0,0,1),
  음료=c(1,1,0,1,1,0,0,1,0,0,1,1,0),
  스낵=c(0,1,0,0,0,0,0,0,0,1,1,0,0),
  팝콘=c(0,1,1,1,1,1,1,1,0,1,1,0,1))

trans <- as.matrix(x, "Transaction")
trans
rules1 <- apriori(trans, parameter = list(supp=0.2, conf=0.6, target="rules"))
a <- as(rules1, "data.frame")
head(orderBy(~-lift,a))














 

▣ R 를 활용한 기계학습 7장. 블랙박스 기법 : 신경망과 서포트 벡터 머신 신경망 (p286)

■  서포트 벡터 머신이란(Support Vector Machine: SVM)?
서포트 벡터 머신이란 간단히 말해 이진 분류기이다. 
 SVM 목적은 초평면(hyperplane) 기준으로 한쪽 면으로 동일한 데이터가 놓이게 평평한 경계를 만드는 것이다.



 
  • 초평면 (hyperplane)?
SVM 보통 범주 값을 유사한 데이터들로 그룹짓기 위해 초평면(hyperplane )이라는 경계를 사용하는데

hyperplane은 n-1차원의 subspace를 의미하는 것이며, 3차원의 경우 hyperplane은 2차원의 면이 되고, 2차원의 경우는 hyperplane은 1차원의 선이된다








 ■  Kernel Tricks 기법: 선형분리가 불가능한 데이터나
비선형 data들을 차원 높여서 분리하는 방법

이렇게 1차원 데이터를 2차원으로 높이게 되면 분리가 가능하다.

그림을 보면 왼쪽 평면에 있는 sample들이 오른쪽과 같이 변형되었는데, 이것은 sample들이 있는 공간을 kernel 함수를 이용하여 공간을 3차원 공간으로 변형시켜주었기 때문이다. 그런 다음 3차원 공간에서 hyperplane을 이용하면 cancer와 normal 샘플들을 좀 더 쉽게 구별할 수 있게 된다.
 



 
왼쪽 그림에서는 대각선 방향의 직선이 최대 여백 초평면(Maximum Margin Hyperplane) 해당한다. 그리고 직선과 가장 가까운 분류에 속한 점들을 서포트 벡터 라고한다.























■  실습1 : 붓꽃 데이터 분류--- 1. Data set : 기본제공(iris)
data(iris)
install.packages("ggplot2")
library(ggplot2)
gplot(Petal.Length, Petal.Width, data=iris, color = Species) #실제 데이터를 확인
library(e1071)
s<-sample(150,100)       # 1 ~ 150 까지 중복되지 않는 랜덤수를 100개 생성
col<- c("Petal.Length", "Petal.Width", "Species")    # 컬럼명 지정 꽃잎 길이 , 꽃잎 폭, 종류
iris_train <- iris[s,col]      # 랜덤으로 뽑은 100개의 트레이닝 셋
iris_test <- iris[-s,col]       # 나머지 테스트 셋

# 리니어 커널방식으로 트레이닝 셋을 종류별로 모델링한다.
iris_svm <- svm(Species ~. , data=iris_train, cost=1,kernel ="linear")
plot(iris_svm, iris_train[,col])

# svm로 훈련된 모델과 테스트데이터로 결과예측
p<- predict(iris_svm,iris_test[,col],type="class")
plot(p)
table(p, iris_test[,3])
mean( p == iris_test[,3])







■  실습2 : 광학식 문자 인식 ---- 1. Data set : letterdata.csv
# 각 글자모양의 속성들을 수치화 한 데이터
# 데이터 읽기와 구조
letters <- read.csv("letterdata.csv")
str(letters)

# 훈련 데이터와 테스터 데이터 구분
letters_train <- letters[1:16000, ]
letters_test  <- letters[16001:20000, ]
## 3단계 : 데이터로 모델 훈련 ----
# 단순 선형 SVM을 훈련으로 시작
install.packages(“kernlab”)
library(kernlab)
letter_classifier <- ksvm(letter ~ ., data = letters_train, kernel = "vanilladot")
# 모델에 대한 기본 정보 확인
letter_classifier


## 4단계 : 모델 성능 평가 ----
# 테스트 데이터셋에 대한 예측
letter_predictions <- predict(letter_classifier, letters_test)

head(letter_predictions)

table(letter_predictions, letters_test$letter)

# 일치/불일치 예측을 표시하는 TRUE/FALSE 벡터 생성
agreement <- letter_predictions == letters_test$letter
table(agreement)
prop.table(table(agreement))

## 5단계 : 커널을 바꿔서 모델 성능을 향상시켜보자 ----
## 가우시안 RBF 커널을 사용
##  RBF ? 링크 -> [Radial Basis Function(방사 기저 함수)]
letter_classifier_rbf <- ksvm(letter ~ ., data = letters_train, kernel = "rbfdot")
letter_predictions_rbf <- predict(letter_classifier_rbf, letters_test)

agreement_rbf <- letter_predictions_rbf == letters_test$letter
table(agreement_rbf)
prop.table(table(agreement_rbf))
prop.table(table(agreement))


향상 됐음!

■  실습3 : 산불데이터 forestfires.csv
install.packages("dplyr")
install.packages("kernlab")
install.packages("ROCR")
install.packages("caret")
install.packages("e1071")
library(dplyr)
library(kernlab)
library(ROCR)
library(caret)
library(e1071)

mydata <- read.csv('forestfires.csv',header =T)
hist(mydata$area)
rug(mydata$area)

# area값들을 분석하기 쉽게 변경 log값을 씌워서 y컬럼으로 추가한다.
mydata <- mutate(mydata, y = log(area + 1))

normalise <- function(x) {  #정규화함수
  return((x - min(x)) / (max(x) - min(x))) }
 
#분석할 값들을 정규화한다.
mydata$temp <- normalise(mydata$temp)
mydata$rain <- normalise(mydata$rain)
mydata$RH <- normalise(mydata$RH)
mydata$wind <- normalise(mydata$wind)

#산불 넓이가 5헥타르 이상인 것을 large 아니면 small로 놓고 분석한다.
mydata$size <- factor(ifelse(mydata$y< 2, 1, 0),
                       labels = c("large", "small"))
#tail(mydata[, c("size", "area")]) 
train <- sample(x = nrow(mydata), size = 400, replace = FALSE)
# 각 커널 방식 비교
# polydot커널 방식으로 svm
m.poly <- ksvm(size ~ temp + RH + wind + rain,
          data = mydata[train, ],
          kernel = "polydot", C = 1)

pred <- predict(m.poly, newdata = mydata[-train, ], type = "response")
 
table(pred, mydata[-train, "size"])
mean(pred == mydata[-train, "size"])


# tanhdot 커널 방식으로 svm
m.tan <- ksvm(size ~ temp + RH + wind + rain,
          data = mydata[train, ],
          kernel = "tanhdot", C = 1)

pred <- predict(m.tan, newdata = mydata[-train, ], type = "response")
 
table(pred, mydata[-train, "size"])
mean(pred == mydata[-train, "size"])


# rbfdot 커널 방식으로 svm
m.rad <- ksvm(size ~ temp + RH + wind + rain,
          data = mydata[train, ],
          kernel = "rbfdot", C = 1)
pred <- predict(m.rad, newdata = mydata[-train, ], type = "response")
 
table(pred, mydata[-train, "size"])
mean(pred == mydata[-train, "size"])

  • 머신러닝 종류 3가지
  • 1. 지도학습 {입력값, 정답}
    • 분류 : knn, 나이브베이즈, 결정트리, svm
    • 회귀 : 선형회귀, 신경망

  • 2. 비지도학습 {입력값}

               :k-means 
     정답이 없으니 해법을 배우지 못하고 데이터의 형태를 가지고 
     유형을 나눠보는 것

  • 3. 강화학습 {입력값, 출력값, 출력에 대한 보상 }
               : 핑퐁 , 틱텍토


■ 9장. 목차
  1. k-means 란?
  2. k-means 실습1 ( 국영수 점수를 가지고 학생 분류)
  3. k-means 실습2 ( 쇼셜 미디어에 같은 성향을 갖는 사람들을 분류)
                    --> 책 실습 예제 


■ 1. k-means란? 
 각 문서들 속에 들어있는 데이터 분석을 통해 유사하거나 관계가 높은 항목끼리의 집합(클러스터)를 만들고 싶을때 
사용하는 알고리즘
  1. (처음 중심값 선택) 랜덤하게 중심값 (centroid)를 선태갛ㄴ다.
  2. (클러스터 할당) k 개의 중심값과 각 개별 데이터간의 거리를 측정한다. 가장 가까운 클러스터에 해당 데이터를 assign한다. 
  3. (새 중심값 선택) 클러스터 마다 새로운 중심값을 계산한다. 
  4. (범위 확인) 선택된 중심값이 변화가 어느정도 없다면 멈춘다. 

■ 데이터 수에 따른 적당한 k 값 계산 

     k = sqrt(n/2)
■ k-means 의 한계점 
  1. k 값 입력 파라미터를 직접 지정해줘야 한다. 
  2. 이상치(outlier) 에 민감하다 

 




■ 기본예제1 
1. 기본 데이터 셋을 만든다.
 
c <- c(3,4,1,5,7,9,5,4,6,8,4,5,9,8,7,8,6,7,2,1)
row <- c("A", "B","C","D","E","F","G","H","I","J")
col <- c("X","Y")
data <- matrix(c, nrow=10, ncol=2,byrow=TRUE, dimnames=list(row,col))
data


2.위에서 만든 데이터 셋으로 plot 그래프를 그린다

plot(data)




km <- kmeans( data, 2) 
km$cluster
cbind(data, km$cluster)

> km$cluster
A B C D E F G H I J
1 1 2 1 2 1 2 2 2 1
> cbind(data, km$cluster)
  X Y
A 3 4 1
B 1 5 1
C 7 9 2
D 5 4 1
E 6 8 2
F 4 5 1
G 9 8 2
H 7 8 2
I 6 7 2
J 2 1 1
>

km$centers

> km$centers
  X   Y
1 3 3.8
2 7 8.0

3. km 파라미터 값들을 가지고 다시한번 시각화 하시오 !

plot(round(km$center) , col= km$center, pch = 22 , bg = "dark blue", xlim=range(0:10), ylim=range(0:10) )


 

4. 원래 데이터를 위의 그래프에 합쳐서 출력합시다.

plot(round(km$center) , col= km$center, pch = 22 , bg = "dark blue", xlim=range(0:10), ylim=range(0:10) )
par(new=T) 

plot(data, col=km$cluster +1 , xlim = range(0:10), ylim=range(0:10))





머신러닝 음악 분류 

문제243. 영어와 수학 점수로 크게 4 그룹의 학생 집합으로 분류하시오 ! 
1. 영어, 수학 둘다 잘하는 학생들 
2. 영어, 수학 둘다 못하는 학생들 
3. 영어는 잘하는데 수학은 못하는 학생들
4. 수학은 잘하는데 영어는 못하는 학생들 

  
academy <- read.csv("academy.csv", stringsAsFactors= F, header = T)
academy <- academy[-1]
academy

academy2 <- academy[, c(2,3)]

plot(academy2)
km <- kmeans(academy2,4)
km

plot(round(km$center) , col= km$center, pch = 22, bg = "dark blue",
     xlim=range(0:100), ylim=range(0:100) )
par(new=T)
plot(academy2, col=km$cluster +1 , xlim = range(0:100), ylim=range(0:100))

음악도 이렇게 분류가 될듯 한데 ㅋㅋ : 잘해보셈 

문제244. 영어와 수학을 둘다 잘하는 학생들이 누구누구인가?
 


x<- cbind( academy, km$cluster)
> km
K-means clustering with 4 clusters of sizes 6, 18, 17, 11

Cluster means:
  수학점수평균 영어점수평균
1     47.83333     44.16667
2     83.72222     65.00000
3     87.17647     85.64706
4     59.81818     77.27273

Clustering vector:
 [1] 3 2 1 2 3 3 2 2 1 4 3 3 4 1 3 2 2 3 3 3 2 2 4 2 2 2 4 3 2 4 2 3 4 3 1 2 2 3 3 4 4 3 4 2 1 3 4 2 3 4 1 2

Within cluster sum of squares by cluster:
[1]  791.6667 1775.6111 1304.3529 1273.8182
 (between_SS / total_SS =  79.4 %)

Available components:

[1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss" "betweenss"    "size"
> x[km$cluster==3,]
   국어점수평균 수학점수평균 영어점수평균 과학점수평균 학업집중도 km$cluster
1            90           75           85           60         70          3
5            88           89           80           82         90          3
6            90           92           90           96        100          3
11           70           93           77           89         60          3
12           99           80           95           70         80          3
15           90           77           92           60         70          3
18           90           89           80           92         90          3
19           76           90           80           92         70          3
20           70           92           80           95         70          3
28           84           88           90           92         90          3
32           88           80           85           88         90          3
34           90           77           82           65         80          3
38           93           90           89           91         90          3
39           92           97           90           89         80          3
42           90           92           88           94         90          3
46           78           91           77           90         80          3
49           97           90           96           90         90          3
>




*10대의 sns 데이터

30000명의 10대 관심사를 가지고 5개의 그룹으로 나눈다

1. 데이터를 준비한다.
teens <- read.csv("snsdata.csv")

2. 성별에 결측 데이터가 있는지 확인

table(teens$gender)
table(teens$gender, useNA="ifany")

3. age의 이상치 제거
teens$age <- ifelse(teens$age >= 13 & teens$age <20, teens$age, NA)
summary(teens$age)

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's
  13.03   16.30   17.26   17.25   18.22   20.00    5523


4. 데이터 정제 (unknown인 성별값의 데이터를 1과 0으로 부여)

teens$female <- ifelse(teens$gender=="F" & !is.na(teens$gender),1,0)
teens$no_gender <- ifelse(is.na(teens$gender),1,0)
table(teens$gender, useNA="ifany")
table(teens$female, useNA="ifany")
table(teens$no_gender, useNA="ifany")


5. 집단별 평균나이

mean(teens$age)
mean(teens$age, na.rm=TRUE)


문제246. 졸업예정년도(gradyear), 졸업예정년도별 평균나이를 구하시오.
aggregate(data=teens, age~gradyear, mean, na.ram = TRUE)

  gradyear      age
1     2006 18.65586
2     2007 17.70617
3     2008 16.76770
4     2009 15.81957


6. 각 개인에 대한 예측된 나이 계산
     (나이의 결측값들은 기존 데이터로 대충 예상해서 채워넣는다)
ave_age <- ave(teens$age, teens$gradyear, FUN = function(x), mean(x,na.rm=TRUE))
ave_age
teens$age <- ifelse(is.na(teens$age), ave_age, teens$age)
summary(teens$age)

7. teens 데이터셋에서 관심사에 해당하는 컬럼들만 따로 interest 라는 변수에 담는다.

interests <- teens[5:40]


8. 위의 interests 데이터를 정규화한다.

interests_z <- as.data.frame(lapply(interests, scale))
interests_z

9. kmeans로 위의 관심사를 5개의 군집으로 분류하시오.

teens_clusters <- kmeans(interests_z,5)
teens$cluster <-teens_clusters$cluster

10. 처음 5개의 데이터만 확인

teens[1:5, c("cluster","gender","age","friends")]

aggregate(data=teens, age ~cluster, mean)

문제247. 군집별 여성의 비율이 어떻게 되는가?

aggregate(data=teens, female ~cluster, mean)

문제248. 군집별 친구수의 평균은 어떻게 되는가?

aggregate(data=teens, friends ~cluster, mean)




















 


























■ 7장 신경망과 서포트 벡터 머신
  • 머신러닝의 3가지 종류
    • 1.지도학습 : 
          -분류: knn, 나이브 베이즈, 결정트리
          -회귀: 선형회귀, 신경망, 서포트 벡터 머신
          2.비지도학습: k-means
          3.강화학습: 핑퐁, 틱텍토

■ 7장 신경망 목차
     1.신경망에 대한 이해
     2.신경망 구조
     3.신경망 실습 
          - 콘크리트 data
          - 보스톤 하우징 data
          - 무성이 발표 data ( 화력발전 데이터, 페이스북 데이터 ) 
     4.서포트 벡터 머신의 이해 
     5.서포트 벡터 머신 실습 
          - 필기체를 컴퓨터가 인식할수 있게 학습 
          - ?
          
■ 1. 신경망에 대한 이해 
          학습 데이터 
               ↓
          학습 규칙 --> 학습 데이터에서 모델을 찾아내는 기법 (신경망) 
               ↓     
     입력 데이터 --->       신경망   --->     결과
 (시멘트,물,강화제, ...)                   콘크리트 강도 
  다음 거리뷰(사진)                        번호판, 사람얼굴

    


          컴퓨터            vs           뇌 
            ↓                           ↓
정보를 메모리의 특정위치 저장          정보를 저장하는 공간이 따로 없다.
                                        ↓
                                  신경세포(뉴런)의 연결관계를 변경하는
                                  방식으로 저장한다.
                                        ↓
                                  신경세포는 그저 다른 신경세포에서 
                                  오는 신호를 받아 자신의 신호를 내보내는
                                  역할만 한다. 


 사람 : 뉴런수 (850억개) 
고양이 : 뉴런수 (10억개)
 쥐   : 뉴런수 (7천5백만개)
바퀴벌레 : 뉴런수 몇백만개 
하루살이 : 최신 최첨단 ANN보다 많다. 




인공 신경망
신경세포(뉴런)
노드
신경세포의 연결
연결 가중치

바이어스: -> 가중치와 함께 신경망의 정보를 저장하는데 관여하는 변수 
v = w1 * x1 + w2 * x2 + w3 * x3 +b
v = wx + b
w = [w1 w2 w3]
x = [x1 x2 x3] ^T

y = f(v)
활성함수 
1. 입력신호의 가중의 합을 구한다
2. 활성함수에 가중합을 입력해 얻은 값을 외부로 출력한다. 






입력층 : 들어오는 신호를 다음 노드에 전달하는 창구역할 
은닉층 : 신경망 외부에서는 이 노드에 직접 접근 할 수 없다. 
출력층 : 노드들의 출력이 신경망의 최종값이 된다. 


단층 신경망 : 입력층 --> 출력층 바로감

다층 신경망 : 

     얕은 신경망 : 입력층 --> 은닉층 -> 출력층
      
     심층 신경망 : 입력층 --> 은닉층 -> 출력층






※ 정규화 
  1. 표준정규분포: scale()
  2. 최대최소변환: normalize() 함수를 만들었음 : ( 0 ~ 1 ) 사이의 값

입력값과 출력 값은 정해져있고

가중치와 바이어스를 역전파로 찾아내는게 신경망 학습의 원리 

실제값과 오차를 구하는 함수 : 비용함수 


■ 신경망의 지도학습
    학습의 종류         학습 데이터
1.지도학습            {입력값, 정답}

     -1. 연습문제 하나를 현재의 지식으로 문제의 답을 구한다.
     -2. 정답과 비교한다.
     -3. 틀렸으면 잘못된 지식(가중치, 바이어스)을 교정한다.
     -4. 모든 문제에 대해서 1 ~ 3번 단계를 반복한다. (역전파)
     
2.비지도 학습         {입력값}

     정답이 없으니 해법을 배우지 못하고 문제의 구문이나 형태를 가지고     
     유형을 나눠보는것 

3.강화학습            {입력값, 출력값, 출력에 대한 점수}

■ 2. 신경망 실습 1 (콘크리트 데이터) 

분석 목적 : 건물의 내구성을 결정하는 콘크리트의 내구려겡 믿을만한 예측 모델 만들기

     입력 재료의 구성 목록을 고려해서 어떻게 입력 재료를 조합했을때 콘크리트의 강도가 높은지를 알아내고 시팓.

     입력값                  출력값
       ↓                      ↓
     콘크리트 재료들         콘크리트 강도 

 UCI의 머신러닝 DATA
1.mount of cement : 콘크리트의 총량
2.slag  : 시멘트
3.ash   : 회분 (시멘트)
4.water :  물
5.superplasticizer : 고성능 감수재(콘크리트 강도를 높이는 첨가제)
6.coarse aggregate : 굵은 자갈
7.fine aggregate : 잔 자갈
8.aging time      : 숙성시간

위의 데이터를 8 : 2 로 나눠서 8을 가지고 훈련을 시키고 모델을 만든다.

2를 가지고 검증을 한다.





##### 7장 : 신경망(Neural Network)과 서포트 벡터 머신(Support Vector Machines) -------------------

##### Part 1: 신경망 -------------------
## 예제 : 콘크리트의 강도 모델링  ----

## 2단계 : 데이터 준비와 살펴보기 ----
# 데이터 읽기와 구조 확인

concrete <- read.csv("concrete.csv")
str(concrete)


# 정규화 함수
normalize <- function(x) { 
  return((x - min(x)) / (max(x) - min(x)))
}


# 전체 데이터 프레임에 정규화 적용
concrete_norm <- as.data.frame(lapply(concrete, normalize))


# 0과1 사이에 범위 확인
summary(concrete_norm$strength)


# 본래 데이터의 최소값, 최대값 비교
summary(concrete$strength)


# 훈련과 테스트 데이터 생성
concrete_train <- concrete_norm[1:773, ]
concrete_test <- concrete_norm[774:1030, ]


## 3단계 : 데이터로 모델 훈련 ----
# neuralnet 모델 훈련
install.packages("neuralnet")
library(neuralnet)


# 하나의 은닉 뉴런에 대한 단순한 ANN
concrete_model <- neuralnet(formula = strength ~ cement + slag +
                              ash + water + superplastic + 
                              coarseagg + fineagg + age,
                              data = concrete_train)


# 망(network) 시각화
plot(concrete_model)


## 4단계 : 모델 성능 평가 ----


# 모델 결과
model_results <- compute(concrete_model, concrete_test[1:8])


# 강도값 예측
predicted_strength <- model_results$net.result


# 예측값과 실제값간의 상관 관계 확인
cor(predicted_strength, concrete_test$strength)


## 5단계 : 모델 성능 향상 ----
# 5개 은닉 뉴런인 복잡한 뉴런망

concrete_model2 <- neuralnet(strength ~ cement + slag +
                               ash + water + superplastic + 
                               coarseagg + fineagg + age,
                               data = concrete_train, hidden = 5)


# 망(network) 시각화
plot(concrete_model2)


# 결과 평가
model_results2 <- compute(concrete_model2, concrete_test[1:8])
predicted_strength2 <- model_results2$net.result
cor(predicted_strength2, concrete_test$strength)








보스톤 주택가격 데이터로 해보자 ! 




##### 7장 : 신경망(Neural Network)과 서포트 벡터 머신(Support Vector Machines) -------------------
##### Part 1: 신경망 -------------------
## 예제 : 콘크리트의 강도 모델링  ----
## 2단계 : 데이터 준비와 살펴보기 ----
# 데이터 읽기와 구조 확인
boston <- read.csv("boston.csv")
str(boston)


# 정규화 함수
normalize <- function(x) {
  return((x - min(x)) / (max(x) - min(x)))
}


# 전체 데이터 프레임에 정규화 적용
boston_norm <- as.data.frame(lapply(boston, normalize))


# 0과1 사이에 범위 확인
summary(boston_norm$MEDV)




# 훈련과 테스트 데이터 생성
boston_train <- boston_norm[1:773, ]
boston_test <- boston_norm[774:1030, ]


## 3단계 : 데이터로 모델 훈련 ----
# neuralnet 모델 훈련
install.packages("neuralnet")
library(neuralnet)

str(boston)
# 하나의 은닉 뉴런에 대한 단순한 ANN
boston_model <- neuralnet(formula = MEDV ~ 
                              data = boston_train)

# 망(network) 시각화
plot(boston_model)


## 4단계 : 모델 성능 평가 ----

# 모델 결과
model_results <- compute(boston_model, boston_test[1:8])

# 강도값 예측
predicted_strength <- model_results$net.result

# 예측값과 실제값간의 상관 관계 확인
cor(predicted_strength, boston_test$strength)


## 5단계 : 모델 성능 향상 ----
# 5개 은닉 뉴런인 복잡한 뉴런망
boston_model2 <- neuralnet(strength ~ cement + slag +
                               ash + water + superplastic +
                               coarseagg + fineagg + age,
                               data = boston_train, hidden = 5)


# 망(network) 시각화
plot(boston_model2)


# 결과 평가
model_results2 <- compute(boston_model2, boston_test[1:8])
predicted_strength2 <- model_results2$net.result
cor(predicted_strength2, boston_test$strength)





  1. R 기본 수업 
  2. R 을 활용한 기계학습
     *머신러닝의 종류 3가지
          1.지도학습
               분류 : KNN, 나이브베이즈, 결정트리, SVM
               회귀 : 회귀분석, 신경망
          2.비지도학습 : K-means
          3.강화학습 : 틱텍토, 핑퐁


서울아산병원 영상분석팀에 취업한 친구가 ...
     포트폴리오 : 틱텍토,오라클 database 
                    
■ 7장 . 신경망과 서포트 벡터 머신 




■ 7장 신경망 목차
     1.신경망에 대한 이해
     2.신경망 구조
     3.신경망 실습 
          - 콘크리트 data
          - 보스톤 하우징 data
          - 무성이 발표 data ( 화력발전 데이터, 페이스북 데이터 ) 
     4.서포트 벡터 머신의 이해 
     5.서포트 벡터 머신 실습 
          - 필기체를 컴퓨터가 인식할수 있게 학습 

■ 7.4 서포트 벡터 머신 

빨간색공과 파란색 공이 모여잇는데 이것을 하나의 끊이지 않는 직선으로 구분하고 싶다면?

무수히 많은 직성을 그을 수 있다. 

y = 2x + 3

d = w^t*x + w0 > 0 : 빨간색
d = w^t*x + w0 < 0 : 파란색





좌표축이 2개면 ? 경계선은 직선의 방적식

좌표축이 3개면 ? 경계면 

d = w^t*x + w0 <- 절편
w0 : 절편
d = 경계면까지의 거리

t== 가중치 벡터 
x == 공의 위치 벡터

경계선(면) 까지의 거리인 d의 부호만으로도 빨간색인지 파란색인지를 알 수 있다.

"공의 위치를 알려주는 위치 벡터가 x라고 한다며 ㄴ
x 의 위치가 경계면 (또는 경계선) 의 위에 있느냐 아래에 있느냐에 따라 d의 
부호가 바뀐다. "

d = w^t + w0



"2차원 평면과 두개의 데이터의 집합이 있다.
그리고 둘 사이의 경계를 주기를 원한다
우리는 이 경계의 넓이를 조절 할 수 있고 
이 경계선의 방향을 조절 할 수 있다. "

우리의 목표는 가능한 적당한 넓이의 경계선을 찾는것이고
그리고 데이터간의 경계를 유지시키는 것이다.


이 구분의 경계선의 직선의 방정식은

w^t      *      x      +      b = 0
↓               ↓             ↓ 
normal vector 공의 위치벡터     scalar vector (바이어스)

바이어스는 원점으로 부터의 변위를 제어한다
두 분리선에는 어느정도 margin을 각각 갖게 한다
우리는 normal vector의 각도를 변경함으로써 여유를 회전시킨다.
그리고 바이어스를 조정함으로써 저 경계선을 이동시킨다. 



1.set1.csv를 로드하고 plot 를 그래프로 본다

set1 <- read.csv("set1.csv", header = T , stringsAsFactors = F)
set1

plot(set1)

install.packages("MASS")
library(MASS)
density <- kde2d(set1$food, set1$book, n=400)
image(density, xlab = "food", ylab="book")



설명 : 가운데 평균점 근처에 모여있는 데이터가 보통 사람들의데이터이다.
이들을 분류하기 위하여 어떠한 방법을 쓸수 있는가 .

svm을 이용해서 분류를 해보자


  1. svm 으로 보통사람들(중산층)을 분류
install.packages("e1071")
library(e1071)

m1 <- svm(status ~ food + book + cul + cloth + travel, 
     type ="C-classification", data= set1)

m1 
  1. 이모델이 얼마나 정확한지 기존 훈련 데이터로 평가를 해본다.

predict(m1, set1)

cbind(set1, predict(m1, set1))

  1. 예측한 결과와 실제와의 차이
sum(set1$status != predict(m1, set1)) 

12

88%의 정확도를 가지고 있네여 !

문제228. (점심시간문제) 보스톤 하우징 데이터를 이용해서 
     svm테스트를 하는데 CAT. MEDV가 0과1 로 구분 되는데 
     SVM으로 0과 1의 정확도가 어떻게 나오는지 테스트하시오  !
boston_norm <- as.data.frame(lapply(boston, normalize))

m1 <- svm(CAT..MEDV~ .,  type ="C-classification", data= boston_norm )


cbind(boston_norm$CAT..MEDV+1,predict(m1, boston_norm ))

sum(boston_norm $CAT..MEDV  != predict(m1, boston_norm )) 



m1 <- svm(CAT..MEDV~ .,  type ="C-classification", data= boston_norm )

library(caret)

confusionMatrix(table(boston_norm $CAT..MEDV  , predict(m1,boston_norm )))


 
■ 서포트 벡터 머신 실습
  1. 중산층 분류 실습
  2. 필기체 분류 숫자 
  3. 필기체 분류 영어





install.packages("caret")

install.packages("doParallel")

install.packages("kernlab")

install.packages("ggplot2")

install.packages("lattice")

library(ggplot2)

library(lattice)

library(kernlab)

library(caret)

library(doParallel)


# Enable parallel processing.


cl <- makeCluster(detectCores())

registerDoParallel(cl)


# Load the MNIST digit recognition dataset into R

# http://yann.lecun.com/exdb/mnist/

# assume you have all 4 files and gunzip'd them

# creates train$n, train$x, train$y  and test$n, test$x, test$y

# e.g. train$x is a 60000 x 784 matrix, each row is one digit (28x28)

# call:  show_digit(train$x[5,])   to see a digit.

# brendan o'connor - gist.github.com/39760 - anyall.org


load_mnist <- function() {

  load_image_file <- function(filename) {

    ret = list()

    f = file(filename,'rb')

    readBin(f,'integer',n=1,size=4,endian='big')

    ret$n = readBin(f,'integer',n=1,size=4,endian='big')

    nrow = readBin(f,'integer',n=1,size=4,endian='big')

    ncol = readBin(f,'integer',n=1,size=4,endian='big')

    x = readBin(f,'integer',n=ret$n*nrow*ncol,size=1,signed=F)

    ret$x = matrix(x, ncol=nrow*ncol, byrow=T)

    close(f)

    ret

  }

  load_label_file <- function(filename) {

    f = file(filename,'rb')

    readBin(f,'integer',n=1,size=4,endian='big')

    n = readBin(f,'integer',n=1,size=4,endian='big')

    y = readBin(f,'integer',n=n,size=1,signed=F)

    close(f)

    y

  }

  train <<- load_image_file('train-images.idx3-ubyte')

  test <<- load_image_file('t10k-images.idx3-ubyte')

  

  train$y <<- load_label_file('train-labels.idx1-ubyte')

  test$y <<- load_label_file('t10k-labels.idx1-ubyte')  

}

#필기체의 글씨가 무엇인지 확인하는 함수 

show_digit <- function(arr784, col=gray(12:1/12), ...) {

  image(matrix(arr784, nrow=28)[,28:1], col=col, ...)

}


train <- data.frame()

test <- data.frame()


# Load data.


load_mnist()


# Normalize: X = (X - min) / (max - min) => X = (X - 0) / (255 - 0) => X = X / 255.

#나눠서 정규화 ㅎㅎ

train$x <- train$x / 255


# Setup training data with digit and pixel values with 60/40 split for train/cv.


inTrain = data.frame(y=train$y, train$x)

inTrain$y <- as.factor(inTrain$y)

trainIndex = createDataPartition(inTrain$y, p = 0.60,list=FALSE)

training = inTrain[trainIndex,]

cv = inTrain[-trainIndex,]
# cv 가 테스트 데이터얌 ㅎㅎ

# SVM. 95/94.


fit <- train(y ~ ., data = head(training, 1000), method = 'svmRadial', tuneGrid = data.frame(sigma=0.0107249, C=1))


results <- predict(fit, newdata = head(cv, 1000))
                         ↑
                         모델

results


confusionMatrix(results, head(cv$y, 1000))



show_digit(as.matrix(training[5,2:785]))


# Predict the digit.


predict(fit, newdata = training[5,])


# Check the actual answer for the digit.


training[5,1]




























 


 
 


R 5장. 결정트리

R(알) 2017. 9. 8. 19:27
■ 어제까지 배운 R 수업 복습
  1. R기본수업
  2. R머신러닝 
          - 머신러닝을 이해하기 위한 R 기본문법
          - knn
          - 나이브베이즈 
          - 결정트리 
          - 회귀 (단순,다중) 
          - 신경망
          - 서포트벡터 머신
          - ...

*머신러닝의 종류3가지중에 
1.지도학습: 
      분류: knn, 나이브 베이즈 
      회귀: 

2.비지도 학습
3.강화학습

   P(비아그라|스팸)*P(돈|스팸)*P(식료품|스팸)*P(주소삭제|스팸)*P(스팸)

문제199. 나이가 20대이고 성별이 여자이고 직업이 IT이고 미혼인 여자가 공포영화를 선택할 확률?

P(20대,여자,IT,미혼 | '공포영화' ) =

P(20대 |'공포영화' ) * P(여자 |'공포영화' ) * P(IT |'공포영화' ) * P(미혼|'공포영화' )

이렇게 계산하느게 naive bayes의 전부이다. 

nm <- naiveBayes(movie[1:5], movie$장르, laplace=0)
nm

문제200. 4장의 실습예제인 스팸과 햄 메일을 구분하는 실습을 진행해서 
     아래의 결과를 도출 하시오! 







sms csv파일이 잇는데 이파일은 text(메세지)와 라벨(type)로 구성된 데이터가 있다.
라벨은 ham, spam으로 구분되어있는 라벨이다
          ↓
데이터를 클린징 하는 작업 (데이터 정제 작업) 
          ↓
메일메세지를 단어별로 구분해서 메일별로 단어가 몇번 사용되었는지 빈도수를 표형태로 만든다. 
          ↓
훈련 데이터와 테스트 데이터로 데이터를 나누고 --> 워드 클라우드 그림 
          ↓
훈련 데이터로 나이브 베이즈 모델을 만든다.
          ↓
테스트 데이터로 위에서 만든 모델로 스팸인지 햄인지를 예측 
          ↓
예측을 잘 했는지 확인한다(crosstable) 








## 예제 : 스팸 SMS 메시지 제거 ----
## 2 단계 : 데이터 준비와 살펴보기  ----

# sms 데이터 프레임으로 sms 데이터 읽기
sms_raw <- read.csv("sms_spam.csv", stringsAsFactors = FALSE)

# sms 데이터 구조
str(sms_raw)

# 팩터로 spam/ham으로 변환
sms_raw$type <- factor(sms_raw$type)

# 변수형 확인
str(sms_raw$type)
table(sms_raw$type)

# 텍스트 마이닝(tm) 패키지를 사용하여 말뭉치 생성
install.packages("tm")
library(tm)
sms_corpus <- Corpus(VectorSource(sms_raw$text))

# sms 말뭉치 확인
print(sms_corpus)
inspect(sms_corpus[1:3])
# 로케일을 us(미국)으로 변경해주는 작업을 해줘야 한다. 
Sys.setlocale(category = "LC_ALL", locale = "us")

# tm_map() 사용하여 말뭉치 정리 ( 데이터 정제 작업) 

corpus_clean <- tm_map(sms_corpus, tolower)
# 설명 : 전부 소문자로 바꾸겠다.

corpus_clean <- tm_map(corpus_clean, removeNumbers)
# 설명 : 숫자를 다 제거하겠다.

corpus_clean <- tm_map(corpus_clean, removeWords, stopwords())
# 설명 : to, and, but, or 를 제거한다.

corpus_clean <- tm_map(corpus_clean, removePunctuation)
# 설명 : 마침표(.) 제거한다. 

corpus_clean <- tm_map(corpus_clean, stripWhitespace)
# 설명 : 공백을 제거한다.

# 말뭉치 정리 확인
inspect(sms_corpus[1:3])
inspect(corpus_clean[1:3])

# 문서-용어 희소 매트릭스 생성 ( 책 150페이지의 표와 같은 형태로 변환) 
sms_dtm <- DocumentTermMatrix(corpus_clean)
sms_dtm

# 훈련과 테스트 데이터셋 생성
sms_raw_train <- sms_raw[1:4169, ] # 원래 데이터 (훈련)
sms_raw_test  <- sms_raw[4170:5559, ] # 원래 데이터 (테스트)

sms_dtm_train <- sms_dtm[1:4169, ] # 정제후의 표현태 변경한 데이터(훈련)
sms_dtm_test  <- sms_dtm[4170:5559, ] # 정제후의 표형태 변경한 데이터(테스트) 

sms_corpus_train <- corpus_clean[1:4169] # 정제후의 데이터 (훈련)
sms_corpus_test  <- corpus_clean[4170:5559] # 정제후의 데이터 (테스트)

# 스팸 비율 확인
prop.table(table(sms_raw_train$type)) #훈련데이터의   스팸 : 80%  햄 : 20% 
prop.table(table(sms_raw_test$type))  #테스트데이터의 스팸 : 80%  햄 : 20%

# 단어 클라우드 시각화 (워드 클라우드로 햄의 단어가 무엇이고 
#                    스팸의 단어가 무엇인지 확인하는 작업) 
# R 을 2.15.3(2013-03-01) 로 설치하고 아래 패키지를 install 해야함
install.packages("Rcpp")
install.packages("wordcloud")



library(wordcloud)

wordcloud(sms_corpus_train, min.freq = 30, random.order = FALSE)

# 훈련 데이터를 스팸과 햄으로 구분
spam <- subset(sms_raw_train, type == "spam")
ham  <- subset(sms_raw_train, type == "ham")

wordcloud(spam$text, max.words = 40, scale = c(3, 0.5))
wordcloud(ham$text, max.words = 40, scale = c(3, 0.5))

# 빈번한 단어에 대한 속성 지시자
findFreqTerms(sms_dtm_train, 5) # 5개 이상사용된 단어만 다시 추출
sms_dict <- Dictionary(findFreqTerms(sms_dtm_train, 5))
sms_train <- DocumentTermMatrix(sms_corpus_train, list(dictionary = sms_dict))
sms_test  <- DocumentTermMatrix(sms_corpus_test, list(dictionary = sms_dict))

# 개수를 팩터로 변환 (라벨의 1과 0으로 변경하고 1과 0을 yes와 no로 변경하는 작업) 
convert_counts <- function(x) {
  x <- ifelse(x > 0, 1, 0)
  x <- factor(x, levels = c(0, 1), labels = c("No", "Yes"))
}

# apply() convert_counts()를 사용한 훈련/테스트 데이터 추출
sms_train <- apply(sms_train, MARGIN = 2, convert_counts)
sms_test  <- apply(sms_test, MARGIN = 2, convert_counts)

## 3 단계 : 데이터로 모델 훈련 ----
install.packages("e1071")
library(e1071)
sms_classifier <- naiveBayes(sms_train, sms_raw_train$type)
sms_classifier

## 4 단계 : 모델 성능 평가 ----
sms_test_pred <- predict(sms_classifier, sms_test)

install.packages("gmodels")
library(gmodels)
CrossTable(sms_test_pred, sms_raw_test$type,
           prop.chisq = FALSE, prop.t = FALSE, prop.r = FALSE,
           dnn = c('predicted', 'actual'))

## 5 단계 : 모델 성능 향상 ----
sms_classifier2 <- naiveBayes(sms_train, sms_raw_train$type, laplace = 1)
sms_test_pred2 <- predict(sms_classifier2, sms_test)
CrossTable(sms_test_pred2, sms_raw_test$type,
           prop.chisq = FALSE, prop.t = FALSE, prop.r = FALSE,
           dnn = c('predicted', 'actual'))



문제201. mushroom dataset을 활용한 나이브 베이즈 분석을 하시오 ! 



install.packages('rpart')
library(rpart)

tree1 <- rpart(mushroom[,1] ~. , data= mushroom[,-1] , control=rpart.control(minsplit=2) )

plot(tree1, compress = T , uniform = T , margin=0.1)

text(tree1, use.n = T , col = "blue")

□ 5장 . 결정트리 (p164)
  • 머신러닝의 종류 3가지
1.지도학습 : 
     - 분류 : knn, naivebayes, decision tree
     - 회귀 : 회귀(6장)

2.비지도학습
3.강화학습

■ 5장. 목차 
 1.결정트리란?
 2.엔트로피와 정보획득량
 3.결정트리 실습1(은행의 대출 위험 기업 확인) 
 4.결정트리 실습2(배드민턴 데이터와 자동차 평가)

■ 1.결정트리란?

 학습 데이터를 가지고 아래와 같은 트리구조의 학습 모델을 만들어서
 새로운 테스트 데이터에 대한 라벨을 예측하는 알고리즘

 그림 : 5장. 결정트리 이미지 첫번째  


■ 결정트리가 사용되는 곳?
 1.지원자에게 거절된 이유를 명시해야하는 신용등급 모델
      예 : 은행 대출, 회사 인사 채용

 2.변심이 심한 고객이나 고객 만족은 관리하는 부서와 광고부서에서 공유되어야 하는 시장조사
      예: 스킨샵 쿠폰반응

 3.연구 측정, 증상, 매우 드문 질병 진행 과정을 바탕으로한 질병 관찰 
     예: 지방간 

■ 결정트리의 장단점 
 - 장점: 1.모든 문제에 적합한 분류기
        2.결측치, factor, number를 잘 처리할 수 있다.
        3.가장 중요한 속성만 사용
        4.다른 복잡한 모델보다 높은 효율

 - 단점: 1.모델이 쉽게 오버피팅 되거나 언더피팅이 됨
        2.훈련데이터에 약간의 변경이 잇어도 결정트리에 큰 변화를 준다.


■ 최적의 구분 선택 (p170)
  결정트리를 만들때 가장 먼제 해야할 것은 컬럼(변수)들중 가장 중요한 
  컬럼(변수)를 찾는것 이다. 중요한 변수는 정보획득량이 가장 높은 변수를
  말한다.
               ↓
     정보획득량이 높은 변수를 알아내려면 뭘 먼저 알아야 하는가?
               ↓
     엔트로피(entrophy) 함수

■  엔트로피(entrophy) 함수(불확실성)

     "데이터의 불확실성이 얼마나 되는가 ? "

     이 값이 커지면 커질수록 불확실성이 커진다

 예: 1. 확률(p) ====> x 축
     2.엔트로피(불확실성) ----> y 축 (공식 : -p * log(p) ) 

> -0.60 * log2(0.60) - 0.40 * log2(0.40)
[1] 0.9709506
> curve(-x * log2(x) - (1 - x) * log2(1 - x), col="red", xlab = "x", ylab = "Entropy", lwd=4)


설명 : 부자거나(x축 1) 부자가 아니거나 (x축 0)이면 
       불확실성 (엔트로피) y 축이 0이다.

  • 결정트리를 구하려면 ?
          어떤 컬럼을 가장 먼저 물어볼것인가를 결정해야한ㄷ
          정보획득량이 높은 컬럼을 가장 먼저 물어보게해야한다.
      정보획득량 = 분할전 엔트로피 - 분할후 엔트로피

문제202. 아래의 데이터 프레임을 만드시오 ! 


x <- data.frame(
cust_name=c('SCOTT','SMITH','ALLEN','JONES','WARD'),
card_yn=c('Y','Y','N','Y','Y'),
review_yn=c('Y','Y','N','N','Y'),
before_buy_yn=c('Y','Y','Y','N','Y'),
buy_yn=c('Y','Y','N','Y','Y') )


문제203. 위의 구매 데이터의 정보 획득량을 구하시오 

install.packages("FSelector")
library(FSelector)

weights<- information.gain(buy_yn~.,x)
print(weights )
 



문제204. skin.csv를 내려받고 R로 로드한 후에 skin데이터셋 변수들의 
        정보획득량을 구하시오  ~

skin <- read.csv("skin.csv",header = T)
weights<- information.gain(cupon_react~.,skin )
print(weights )



문제205. 위의 정보를 가지고 결정트리를 그리시오 

install.packages('rpart')
library(rpart)

tree1 <- rpart(cupon_react~. , data= skin, control=rpart.control(minsplit=2) )

plot(tree1, compress = T , uniform = T , margin=0.1)

text(tree1, use.n = T , col = "blue")


문제206. 지방간 데이터의 정보획득량을 구하시오 

fatliver<- read.csv("fatliver2.csv",header =T)
weights<- information.gain(FATLIVER~.,fatliver)
print(weights)



tree1 <- rpart(FATLIVER ~. , data= fatliver , control=rpart.control(minsplit=2) )

plot(tree1, compress = T , uniform = T , margin=0.1)

text(tree1, use.n = T , col = "blue")


 




##### 5장 : 결정 트리와 규칙(Decision tree and Rules)을 사용한 분류 -------------------
#### Part 1: 결정 트리 -------------------
## 결정 트리 이해 ----
# 두 부분 분류의 엔트로피 계산
-0.60 * log2(0.60) - 0.40 * log2(0.40)
curve(-x * log2(x) - (1 - x) * log2(1 - x),
      col="red", xlab = "x", ylab = "Entropy", lwd=4)
## 예제 : 위험 은행 대출 식별 ----
## 2 단계 : 데이터 준비와 살펴보기 ----
credit <- read.csv("credit.csv")
str(credit)
# 지원자의 두 특성 확인
table(credit$checking_balance)
table(credit$savings_balance)
# 대출의 두 특성 확인
summary(credit$months_loan_duration)
summary(credit$amount)
# 분류 변수 확인
table(credit$default)
# 훈련과 테스트 데이터에 대한 무작위 샘플 생성
# 예제와 같은 무작위 수열을 사용하기 위해 set.seed 사용
set.seed(12345)
credit_rand <- credit[order(runif(1000)), ]
# credit과 credit_rand 데이터 프레임간 비교
summary(credit$amount)
summary(credit_rand$amount)
head(credit$amount)
head(credit_rand$amount)
# 데이터 프레임 나누기
credit_train <- credit_rand[1:900, ]
credit_test  <- credit_rand[901:1000, ]
# 분류 변수의 비율 확인
prop.table(table(credit_train$default))
prop.table(table(credit_test$default))
## 3 단계 : 데이터로 모델 훈련 ----
# 가장 단순한 결정 트리 생성
library(C50)
credit_model <- C5.0(credit_train[-17], credit_train$default)
# 트리 정보 출력
credit_model
# 트리에 대한 상세 정보 출력
summary(credit_model)
## 4 단계 : 모델 성능 평가 ----
# 테스트 데이터에 대한 예측 팩터 벡터 생성
credit_pred <- predict(credit_model, credit_test)
# 예측과 실제 분류의 교차표
library(gmodels)
CrossTable(credit_test$default, credit_pred,
           prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE,
           dnn = c('actual default', 'predicted default'))
## 5 단계 : 모델 성능 향상 ----
## 결정 트리의 정확성 부스팅
# 10 trials과 부스트드 결정 트리
credit_boost10 <- C5.0(credit_train[-17], credit_train$default,
                       trials = 10)
credit_boost10
summary(credit_boost10)
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', 'predicted default'))
# 100 trials과 부스트드 결정 트리
credit_boost100 <- C5.0(credit_train[-17], credit_train$default,
                        trials = 100)
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', 'predicted default'))
## 가중치 매트릭스 생성
# 가중 비용 매트릭스
error_cost <- matrix(c(0, 1, 4, 0), nrow = 2)
error_cost
# 트리에 비용 매트릭스 적용
credit_cost <- C5.0(credit_train[-17], credit_train$default,
                    costs = error_cost)
credit_cost_pred <- predict(credit_cost, credit_test)
CrossTable(credit_test$default, credit_cost_pred,
           prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE,
           dnn = c('actual default', 'predicted default'))
#### Part 2: 규칙 학습기 -------------------


> table(credit$checking_balance)

    < 0 DM   > 200 DM 1 - 200 DM    unknown
       274         63        269        394
> table(credit$savings_balance)

     < 100 DM     > 1000 DM  100 - 500 DM 500 - 1000 DM       unknown
          603            48           103            63           183

설명 : 대출 신청사의 에금계좌와 적금계좌의 예금정도를 확인해서 예금액이 많을 수록 대출이 안전하다고 가정할 수 있다.


> summary(credit$months_loan_duration)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
    4.0    12.0    18.0    20.9    24.0    72.0

설명 : 대출 기간이 짧게는 4달에서 기게는 72개월까지 분포가 됨

> summary(credit$amount)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
    250    1366    2320    3271    3972   18420 

설명 : 대출 금액은 독일돈으로 205 마르크 ~ 184020 마르크 
     100 마르크가 6~ 7만원 정도 한다

table(credit$default)
#분류 변수 확인 ( default 가 라벨인데 대출금 상환했는지 상환안했는지 ) 
table(credit$default)
no yes
700 300

설명 : 대출자가 협의한 반납기간 안에 대출금을 반납했는지 안했는지 나타냄.
      채무이행자가 300명 , 채무불이행자가 700명

set.seed(12345)
credit_rand <- credit[order(runif(1000)), ]

runif(10)
order(runif(1000))

설명 : runif(10)이라고 하면 0과 1사이의 10개의 숫자가 랜덤으로 출력된다.
order(runif(1000)) 라고 하면 무작위 숫자가 1000개가 출력된다. 
credit[order(runif(1000)),] 하면 행을 무작위로 섞어서 결과를 출력해준다.

서머리는 같지만 잘 섞였음 

#분류 변수의 비율 확인
       no       yes
0.7022222 0.2977778
> prop.table(table(credit_test$default))

  no  yes
0.68 0.32

위의 데이터에 결정트리 기계학습ㅇ르 하려는 목적?

  지금 채무 불이행자가 70% 가 되는데  이 채무 불이행자의 수치를 낮추는것이 (30%로 떨어짐) 이 기계학습의 목표이다.

## 3단계 : 데이터로 모델 훈련
# 가장 단수한 결정 트리 생성
install.packages("C50")
library(C50)
credit_model <- C5.0(credit_train[-17], credit_train$default)
                      

summary(credit_model)


Evaluation on training data (900 cases):

        Decision Tree
      ----------------
      Size      Errors

        66  125(13.9%)   <<

       (a)   (b)    <-classified as
      ----  ----
       609    23    (a): class no
       102   166    (b): class yes
설명: 13.9% 의 오차로 125개를 잘못 분류했다.
     23개는 실제값은 no이지만 yes로 잘못 분류했고 
     102개는 실제값은 yes이지만 no로 잘못분류했다. 

credit_pred <- predict(credit_model, credit_test)
cbind(credit_test, credit_pred)

CrossTable(credit_test$default, credit_pred,
           prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE,
           dnn = c('actual default', 'predicted default'))



               | predicted default
actual default |        no |       yes | Row Total |
---------------|-----------|-----------|-----------|
            no |        57 |        11 |        68 |
               |     0.570 |     0.110 |           |
---------------|-----------|-----------|-----------|
           yes |        16 |        16 |        32 |
               |     0.160 |     0.160 |           |
---------------|-----------|-----------|-----------|
  Column Total |        73 |        27 |       100 |
---------------|-----------|-----------|-----------|

57 + 16 = 73, 11 + 16 = 27
73% 는 정확히 예측 
27% 는 정확히 예측하지 못함 

## 5 단계 : 모델 성능 향상 ----
## 결정 트리의 정확성 부스팅
# 10 trials과 부스트드 결정 트리
credit_boost10 <- C5.0(credit_train[-17], credit_train$default,
                       trials = 10)
credit_boost10
summary(credit_boost10)

Evaluation on training data (900 cases):

Trial        Decision Tree
-----      ----------------
      Size      Errors

   0        66  125(13.9%)
   1        40  205(22.8%)
   2        46  196(21.8%)
   3        45  193(21.4%)
   4        68  163(18.1%)
   5        62  175(19.4%)
   6        56  186(20.7%)
   7        62  188(20.9%)
   8        66  156(17.3%)
   9        49  200(22.2%)
boost             31( 3.4%)   <<

       (a)   (b)    <-classified as
      ----  ----
       626     6    (a): class no
        25   243    (b): class yes

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', 'predicted default'))
# 100 trials과 부스트드 결정 트리
credit_boost100 <- C5.0(credit_train[-17], credit_train$default,
                        trials = 100)
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', 'predicted default'))


               | predicted default
actual default |        no |       yes | Row Total |
---------------|-----------|-----------|-----------|
            no |        61 |         7 |        68 |
               |     0.610 |     0.070 |           |
---------------|-----------|-----------|-----------|
           yes |        15 |        17 |        32 |
               |     0.150 |     0.170 |           |
---------------|-----------|-----------|-----------|
  Column Total |        76 |        24 |       100 |
---------------|-----------|-----------|-----------|

## 가중치 매트릭스 생성
# 가중 비용 매트릭스
error_cost <- matrix(c(0, 1, 4, 0), nrow = 2)
error_cost
# 트리에 비용 매트릭스 적용
credit_cost <- C5.0(credit_train[-17], credit_train$default,
                    costs = error_cost)
credit_cost_pred <- predict(credit_cost, credit_test)
CrossTable(credit_test$default, credit_cost_pred,
           prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE,
           dnn = c('actual default', 'predicted default'))
#### Part 2: 규칙 학습기 -------------------






badminton <- read.csv("badminton.csv",header=T)
install.packages("C50")
library(C50)
x <- badminton [1:4]
y <- badminton [,5]
model <- C5.0(x,y) 
model
summary(model)
plot(model)
p <- predict(model,x,type="class")
sum(p==y)/length(p)




문제207. **이가 첫번째로 발표한 차 평가에 관련한 결정트리 실습 코드에 
         예측하는 predict을 추가해서 실제 라벨과 예측 라벨의 
          차이를 한눈에 보여주는 CrossTable결과를 출력하시오 
car_evaluation <- read.csv("car_evaluation.csv",head=T)
head(car_evaluation)

install.packages("C50")
library(C50)
x <- car_evaluation[,2:7]
y <- car_evaluation[,1]     #기준이 되는 컬럼
model <- C50::C5.0(x,y)
model
summary(model)
plot(model)


또는


x <- car_evaluation[,2:7]
build_tree <- C5.0(car_evaluation$buyingprice~.,data=x)
summary(build_tree)
plot(build_tree)


p <- predict(model,x,type="class")
sum(p==y)/length(p)

CrossTable(car_evaluation[,1] ,p)

> CrossTable(car_evaluation[,1] ,p)
Error in CrossTable(car_evaluation[, 1], p) :
  함수 "CrossTable"를 찾을 수 없습니다
> library(gmodels)
경고메시지(들):
패키지 ‘gmodels’는 R 버전 3.4.1에서 작성되었습니다
> CrossTable(car_evaluation[,1] ,p)


   Cell Contents
|-------------------------|
|                       N |
| Chi-square contribution |
|           N / Row Total |
|           N / Col Total |
|         N / Table Total |
|-------------------------|


Total Observations in Table:  1728


                    | p
car_evaluation[, 1] |      high |       low |       med |     vhigh | Row Total |
--------------------|-----------|-----------|-----------|-----------|-----------|
               high |        46 |        13 |        49 |       324 |       432 |
                    |    16.480 |    29.484 |     0.146 |     1.528 |           |
                    |     0.106 |     0.030 |     0.113 |     0.750 |     0.250 |
                    |     0.451 |     0.062 |     0.237 |     0.268 |           |
                    |     0.027 |     0.008 |     0.028 |     0.188 |           |
--------------------|-----------|-----------|-----------|-----------|-----------|
                low |         0 |       121 |        53 |       258 |       432 |
                    |    25.500 |    90.461 |     0.030 |     6.546 |           |
                    |     0.000 |     0.280 |     0.123 |     0.597 |     0.250 |
                    |     0.000 |     0.579 |     0.256 |     0.213 |           |
                    |     0.000 |     0.070 |     0.031 |     0.149 |           |
--------------------|-----------|-----------|-----------|-----------|-----------|
                med |        10 |        75 |        79 |       268 |       432 |
                    |     9.422 |     9.906 |    14.349 |     3.935 |           |
                    |     0.023 |     0.174 |     0.183 |     0.620 |     0.250 |
                    |     0.098 |     0.359 |     0.382 |     0.221 |           |
                    |     0.006 |     0.043 |     0.046 |     0.155 |           |
--------------------|-----------|-----------|-----------|-----------|-----------|
              vhigh |        46 |         0 |        26 |       360 |       432 |
                    |    16.480 |    52.250 |    12.813 |    10.930 |           |
                    |     0.106 |     0.000 |     0.060 |     0.833 |     0.250 |
                    |     0.451 |     0.000 |     0.126 |     0.298 |           |
                    |     0.027 |     0.000 |     0.015 |     0.208 |           |
--------------------|-----------|-----------|-----------|-----------|-----------|
       Column Total |       102 |       209 |       207 |      1210 |      1728 |
                    |     0.059 |     0.121 |     0.120 |     0.700 |           |
--------------------|-----------|-----------|-----------|-----------|-----------|


내일 : 6장. 회귀분석 
      7장 .신경망 (앞부분 까지)






스킨데이터 트리 그리기 !
























 



























 



 


▦ 4장. 나이브 베이즈의 이해
□4장. 목차
     1.나이브 베이즈를 이해하기 위한 기본 통계개념
          - 1.1 확률로 인한 데이터 분류
          - 1.2 확률
          - 1.3 결합확률
          - 1.4 베이즈 이론과 조건부 확률
2.나이브 베이즈 알고리즘 
     - 2.1 나이브 베이즈 분류
     - 2.2 라플라스 추정기

3.나이브 베이즈 실습 예제 
     - 3.1 영화장르
     - 3.2 스팸메일 분류1 (다른 예제)
     - 3.3 스팸메일 분류2 (책)

  1. 나이브베이즈를 이해하기 위한 기본 통계개념 (p128)
-1.1 확률로 인한 데이터 분류
- 기상학자가 날시예보를 할대 일반적으로 '비올확률 70%'
라는 용어를 사용해 예측한다

이 70%는 과거의 사건 데이터를 사용한것인데 과거에 이런 경우 10번중 7번은 비가왔음을 의미하는것이다.
- 베이즈 기법 기반인 분류기는 분류되지 않은 데이터를 분류기가 분류할때 새로운 속성에 대한 가장 유사하나 범주를 예측하기위해 관찰된 확률을 사용하고 이 관찰된 확률은 훈련데이터에 의해 미리 계산되어진다

훈련데이터 -----> 관찰된 확률
실제데이터 -----> 관찰된 확률을 이용해 분류를한다.

무엇을 분류하는 것인가?

  1. 스팸 메일 분류
  2. 컴퓨터 네트워크에 침힙한 이상징후를 분류
  3. 관찰된 증상을 고려한 질병 관찰


스팸 vs 햄

2차 대전때 영국식당에 먹으렉 스팸밖에 없어서 스팸이라는 말을 끊임 없이 써서 희화된 단어 

□ 1.2확률 (p130)
- 사건 
     사건이란 ? 화창하거나 또는 비가 올 날씨 
               동전 던지기에서 동전의 앞면과 뒷면
               스팸 이메일과 햄 이메일이 같이 일어날 수 있는 결과 

1.독립사건 : 두 사건이 서로 전혀 연관되이 않는다면 그건 독립사건 ,동전던지기와 날씨
P(A ∩ B) = P(A) * P(B)
P(A | B) = P(A) B사건은 A에 영향을 주지 않는다. 
==  는 사건B가 일어날때 사건 A의 확률이라고 읽는다. 
P(A | B) = P(A)
== 는 사건A가 일어났을 때 사건 B의 확률

2.종속사건 : 
사건 A가 일어났을 경우와 일어나지 않았을 경우에 따라서
사건B가 일어날 확률이 다를때 B는 A의 종속사건
P(A ∩ B) = P(A) * P(B)
P(A ∩ B) = P(A) * P(A | B)
         = P(B) * P(B | A)
P(A | B) = P(A ∩ B) / P(B)
P(B | A) = P(A ∩ B) / P(A)
3.배반사건
P(A U B) = P(A) + P(B)

문제194. (점심시간문제) 스팸 메일일 확률이 20% 이고 햄 메일일 확률이 80%이면 
스팸이 아닐 확률은 얼마인가?

스팸일 확률 : P(스팸) = 0.2 
햄일 확률   : P(햄) = 0.8
P(~스팸) : 0.8

▩ 1.3 결합확률 
책 131 페이지에 나온것 처럼 일부사건이 흥미로운 사건과 함께 일어났다면 예측하기 위해 흥미로운 사건을 사용할 수 있을것이다. 
모든 메세지의 20% 는 스팸이고 모든 메세지의 5%는 비아그라가 들어있다.

P(스팸) 과 P(비아그라)가 함께 일어날 확률은 ? 

P(스팸 ∩ 비아그라) 로 추정한다 .
P(스팸 ∩ 비아그라) 를 계산하면 (점심시간문제) - 독립사건이라면 ? 
0.01 %

▩ 1.4 베이즈 이론과 조건부 확률 (종속사건) 

사건 B 가 일어날때 사건 A의 확률은 아래와 같이 표시한다. 
P(A | B) = P(A ∩ B) / P(B)

P(A ∩ B) = P(A) * P(B)
P(A ∩ B) = P(A) * P(A | B)
         = P(B) * P(B | A)

            P(A ∩ B)         P(B|A) *  P(B)
P(A | B) = ------------ = ------------------
              P(B)            P(B)

                  P(스팸 ∩ 비아그라)      P(비아그라|스팸) * P(스팸)
P(스팸|비아그라) = ------------------- = -------------------------
                     P(비아그라)                P(비아그라)

설명 : 비아그라가 메일 메세지에 있을 때 스팸일 확률은 ? 

 우도 ? 가능도 (Likelyhood) 

  사건에는 1. 셀 수 있는 사건 ( 가능도 = 확률 )
          예 : 주사위를 던져서 나올 수 있는 숫자 1,2,3,4,5,6
               숫자가 나올 확률이 1/6로 모두 같고 각각의 확률을 합하면 
               확률은 1이 된다. 

          2.연속사건 (가능도 !=  확률) 
          예 : 1에서 6사이의 숫자중에 랜덤으로 아무 숫자를 뽑는다고 할때
               정확히 5가 뽑힐 확률은 얼마인가?

               1
            -------  = 0  <---- 연속사건은 확률이 0으로 계산이 된다.
             무한대
               
               그래서 사건이 일어날 가능성을 비교하는게 불가능하며 
               가능도 (likelyhood)라는 개념을 적용해야 이를 비교할 수 있다.

            우도 * 사전확률
사후 확률 = ----------------- 
              주변우도

  • 내일 시험문제지롱!!!
      비아그라
우도  YES  NO      총합
스팸  4/20 16/20    20
 햄   1/80 79/80    80
     5/100 95/100  100
                  P(비아그라|스팸) * P(스팸)      0.2 * 0.2
P(스팸|비아그라) = -------------------------  =  --------- = 0.8
                    P(비아그라)                    0.05

비아그라가 메세지 단어에 포함되어있으면 스팸일 확률이 80%가 된다.


문제195. 미진누나가 올려준 실습예제1의 메일에서 비아그라가 메세지에 포함되어 있으면 스팸일 확률은 어떻게 되는가?
           

                  P(비아그라|스팸) * P(스팸)      2/3 * 0.3
P(스팸|비아그라) = -------------------------  =  ---------- = 0.5
                    P(비아그라)                     0.4

▩ 2. 나이브 베이즈 알고리즘 (p 135) 

나이브 베이즈 알고리즘은 분류를 위해 베이즈 이론을 사용하는 애플리케이션이다

이름 그대로 순진한 가정을 하는것으로 데이터의 모든 속성을 동등하게 중요하며 독립적이라고 가정한다

장점: 1. 단순하고 빠르며 매우 효과적이다.
     2.결측데이터가 있어도 잘 수행된다.
     3.예측에 대한 추정된 확률을 얻기쉽다. 

단점: 1.모든 속성을 동등하게 중요하고 독립적이라는 알려진 결함에 의존한다. 

▩2.1 나이브 베이즈 분류

이번에는 비아그라라는 단어 하나만 가지고 스팸과 햄을 구분하느 
확률을 구하는게 아니라 다른 단어들도 포함 시켜봅시다.

비아그라 = yes, 돈 = no, 식료품 = no, 주소삭제 = yes 

문제196. 비아그라와 주소삭제는 포함하고 돈과 식료품은 포함하지 않는 
        메세지가 스팸일 확률은 어떻게 되는가. 

¬ : not sign

P(스팸|비아그라 ∩ ¬돈 ∩ ¬식료품  ∩ 주소삭제)  = 


 P( 비아그라 ∩ ¬돈 ∩ ¬식료품  ∩ 주소삭제)  * P(스팸)
-------------------------------------------------
  P( 비아그라 ∩ ¬돈 ∩ ¬식료품  ∩ 주소삭제)
               
                 ↓                             

 P(A ∩ B) = P(A) * P(B) <------- 이 공식을 염두해두고 다시 정리하면 

                 ↓    
                    
   P(비아그라|스팸)*P(¬돈|스팸)*P(¬식료품|스팸)*P(주소삭제|스팸)*P(스팸)
-----------------------------------------------------------------
         P(비아그라) * P(¬돈) * P(¬식료품)  * P(주소삭제)



          비아그라(w1)      돈(w2)         식료품(w3)    주소삭제(w4)
  우도    Yes    No      Yes    No        Yes    No      Yes    No   
  스팸    4/20  16/20   10/20  10/20   0/20  20/20   12/20  8/20        20
  햄      1/80  79/80   14/80  66/80   8/80  71/80   23/80  57/80       80  
  총합  5/100  95/100  24/100 76/100 8/100  9/100 35/100 65/100   100 

스팸의 우도 : (4/20) * (10/20) * (20/20) * (12/20) * (20/100) = 0.012

햄의 우도 : (1/80) * (66/80) * (71/80) * (23/80) * (80/100) = 0.002

                  0.012
스팸일 확률 : ------------------ = 0.85
               0.012 + 0.002
                  0.002
햄일 확률 : ------------------- = 0.1429
               0.012 + 0.002


 위의 해당 단어들을 포함하고 포함하지 않은 메일이 스팸이 될 확률 85% 햄일 확률이 14.2%가 된다. 

 

비아그라(w1)   

돈(w2)    

식료품(w3)  

주소삭제(w4)


우도   
Yes   
No     
Yes   
No     
Yes   
No     
Yes   
No     

스팸   
4/20 
16/20 
10/20
10/20 
0/20 
20/20  
12/20 
8/20 
20
햄     
1/80
79/80
14/80
66/80
8/80 
71/80 
23/80
57/80
80
총합 
5/100 
95/100
24/100
76/100
8/100 
9/100
35/100
65/100  
100


   P(비아그라|스팸)P(¬돈|스팸)*P(¬식료품|스팸)*P(주소삭제|스팸)*P(스팸)
   P(비아그라|햄) P(¬돈|햄 ) *P(¬식료품|햄 ) *P(주소삭제|햄 )*P(햄 )

문제197. 미진누나가 만든 실습예제2 메일 데이터를 보면 비아그라와 쿠폰이라는
        단어가 포함되어 있는 메일 스팸이 될 확률은 어떻게 되는가? 
p(비아그라|스팸) * p(쿠폰|스팸) * p(스팸) = ?
(4/6) * (3/6)* (6/14) = 0.14

p(비아그라|햄) * p(쿠폰|햄) * p(햄) = ?
(3/8) * (1/8) * (8/14) = 0.026
                   0.14
스팸 확률 =  ----------------------- = 0.84
              0.14 + 0.026
   
              0.026
햄 확률 = ----------------- = 0.15
           0.14 + 0.026
결론 : 쿠폰과 비아그라가 메일 메세지에 포함되어있으면 스팸일 확률이 84% 이다. 



       


▩ 2.2 라플라스 추정기 (p139) 

이번에는 비아그라 , 주소삭제, 식료품, 돈이 메일 메세지에 다 포함되어 있다고 했을때 스팸일 확률을 구해보자 


          비아그라(w1)      돈(w2)         식료품(w3)    주소삭제(w4)
  우도    Yes    No      Yes    No        Yes    No      Yes    No   
  스팸    4/20  16/20   10/20  10/20   0/20  20/20   12/20  8/20        20
  햄      1/80  79/80   14/80  66/80   8/80  71/80   23/80  57/80       80  
  총합  5/100  95/100  24/100 76/100 8/100  9/100 35/100 65/100   100 

   P(비아그라|스팸)*P(돈|스팸)*P(식료품|스팸)*P(주소삭제|스팸)*P(스팸)
      4/20  *    10/20 *  0/20 * 12/20 * 20/100                  =0
  P(비아그라|햄 )P(돈|햄 )*P(식료품|햄 )*P(주소삭제|햄 )*P(햄 )
     1/80     *    14/80  *  8/80   *  23/80 *(80/100) =0.0005

                   0
스팸일 확률 : --------------- = 0
               0 + 0.0005
                0.0005
햄일 확률 : ---------------- = 1
               0 + 0.0005
식료품과 돈때문에 햄일 확률이 100% 되어 다른 증거까지 모두 무효로 만들어 버림 .ㅋ.,ㅡ.,


이를 해결하기위해 프랑스의 수학자 피에르 시몬 라플라스가 확률이 0 이 되지 않기 위해서 빈도표의 각 값에 작은 수를 추가했따

각각의 값에 1을 더했다. 



   P(비아그라|스팸)*P(돈|스팸)*P(식료품|스팸)*P(주소삭제|스팸)*P(스팸)
      5/24  *    11/24 *  1/24 * 13/24 * 20/100                  =0.0004
  P(비아그라|햄 )P(돈|햄 )*P(식료품|햄 )*P(주소삭제|햄 )*P(햄 )
     2/84     *    15/84  *  9/84   *  24/84 *(80/100) =0.0001


                  0.0004
스팸일 확률 : ------------------- = 0.8
             0.0004 + 0.0001
햄일 확률 :                      = 0.2

스팸일 확률이 80% 이며 햄일 확률이 20%임을 의미한다. 


쉬운예제 돌려보고 교재있는거 다음에 

▦ 나이브 베이즈 실습 1 (영화장르)

1.데이터 : 카페에 data 게시판 : 선호하는 영화장르 데이터
2.코드   : 아래 실습


movie <- read.csv ( 'movie.csv', header=T)

install.packages("e1071") # 오스트리아 수도 빈 비엔나 기술대학의 통계학과에서 개발함
library(e1071)
movie


 nm <- naiveBayes(movie[1:5],movie$장르 ,laplace=0)


> nm


Naive Bayes Classifier for Discrete Predictors

Call:
naiveBayes.default(x = movie[1:5], y = movie$장르, laplace = 0)

A-priori probabilities:
movie$장르
        SF       공포     로맨틱    로맨틱s       무협     스릴러       액션     코미디
0.12820513 0.12820513 0.20512821 0.02564103 0.12820513 0.12820513 0.12820513 0.12820513

Conditional probabilities:
          나이
movie$장르 10대 10대  20대 30대 40대
   SF       0.0   0.0  0.0  1.0  0.0
   공포     0.0   0.0  0.0  0.0  1.0
   로맨틱   0.5   0.0  0.5  0.0  0.0
   로맨틱s  0.0   0.0  1.0  0.0  0.0
   무협     0.2   0.0  0.2  0.2  0.4
   스릴러   0.0   0.0  0.0  1.0  0.0
   액션     0.2   0.8  0.0  0.0  0.0
   코미디   0.0   0.0  0.4  0.4  0.2

          성별
movie$장르  남  여
   SF      0.4 0.6
   공포    1.0 0.0
   로맨틱  0.0 1.0
   로맨틱s 0.0 1.0
   무협    1.0 0.0
   스릴러  1.0 0.0
   액션    1.0 0.0
   코미디  1.0 0.0

          직업
movie$장르    IT 디자이너  무직  언론  영업 자영업  학생 홍보/마케팅
   SF      1.000    0.000 0.000 0.000 0.000  0.000 0.000       0.000
   공포    0.000    0.000 0.000 0.000 0.200  0.400 0.000       0.400
   로맨틱  0.000    0.375 0.000 0.000 0.000  0.000 0.375       0.250
   로맨틱s 0.000    0.000 0.000 0.000 0.000  0.000 0.000       1.000
   무협    0.000    0.000 1.000 0.000 0.000  0.000 0.000       0.000
   스릴러  0.000    0.000 0.000 1.000 0.000  0.000 0.000       0.000
   액션    0.000    0.000 0.000 0.000 0.000  0.000 1.000       0.000
   코미디  0.000    0.000 0.000 0.000 0.400  0.000 0.400       0.200

          결혼여부
movie$장르    NO   YES
   SF      0.200 0.800
   공포    1.000 0.000
   로맨틱  0.625 0.375
   로맨틱s 0.000 1.000
   무협    1.000 0.000
   스릴러  0.400 0.600
   액션    1.000 0.000
   코미디  1.000 0.000

          이성친구
movie$장르    NO   YES
   SF      0.800 0.200
   공포    1.000 0.000
   로맨틱  0.375 0.625
   로맨틱s 1.000 0.000
   무협    1.000 0.000
   스릴러  0.600 0.400
   액션    1.000 0.000
   코미디  1.000 0.000

result <- predict(nm, movie[1:5])

cbind(movie, result)

sum(movie$장르 != result)

문제198. 오늘 아침에 쪽지시험으로본 zoo 데이터의 100번재 동무링 어떤 종류인지 조류(2)가 맞는지 나이브 베이즈로 확인해보시오 

나이브 베이즈 알고리즘 문제를 풀기 위해서 아래의 zoo2 를 전부 팩터화 하세요 ~

zoo2 <- read.csv("zoo2.csv", stringsAsFactors = FALSE)


zoo2$X1 <- as.factor(zoo2$X1)
zoo2$X0 <- as.factor(zoo2$X0)
zoo2$X0.1 <- as.factor(zoo2$X0.1)
zoo2$X1.1 <- as.factor(zoo2$X1.1)
zoo2$X0.2 <- as.factor(zoo2$X0.2)
zoo2$X0.3 <- as.factor(zoo2$X0.3)
zoo2$X1.2 <- as.factor(zoo2$X1.2)
zoo2$X1.3 <- as.factor(zoo2$X1.3)
zoo2$X1.4 <- as.factor(zoo2$X1.4)
zoo2$X1.5 <- as.factor(zoo2$X1.5)
zoo2$X0.4 <- as.factor(zoo2$X0.4)
zoo2$X0.5 <- as.factor(zoo2$X0.5)
zoo2$X0.6 <- as.factor(zoo2$X0.6)
zoo2$X0.7 <- as.factor(zoo2$X0.7)
zoo2$X1.6 <- as.factor(zoo2$X1.6)
zoo2$X1.7 <- as.factor(zoo2$X1.7)


str(zoo2)


 

 nm <- naiveBayes(zoo2[2:17] ,zoo2[,18] ,laplace=0)
result <- predict(nm, zoo2[2:17] )

cbind(zoo2 , result)

sum(na.omit(zoo2[-100,18])  != result[c(1:99)])

> sum(na.omit(zoo2[-100,18])  != result[c(1:99)])
[1] 22









 

■ 어제까지 배운 내용 R 내용 복습

  1. R 기본 문법 수업 : 1주일
  2. R 기계 학습 : 
          -2장 : 기계학습 책에 나오는 내용을 이해하기휘한 기본 문법과 함수 소개하는 내용
          -3장 : knn           
               -소개팅
               -과일
               -유방암
               -폐암
          -4장 : 나이브 베이즈
          -5장 : 결정트리
 
 
■ 3장. knn (최근접 이웃을 사용한 분류의 이해)
 
  • 머신러닝의 종류
  • 1.지도학습
    • -분류:knn
    • -회귀: 
  • 2.비지도학습
  • 3.강화학습
          
               
▦ 3장 목차 
  1. knn(k-Nearest Neighbors) 란 무엇인가?
  2. knn(k-Nearest Neighbors)이 필요한 이유?
  3. knn(k-Nearest Neighbors)의 분류의 이해 
  4. knn(k-Nearest Neighbors)의 분류 실습1( 소개팅 데이터 )
  5. knn(k-Nearest Neighbors)의 분류 실습2( 과일 데이터 )
  6. 적당한 k 값 선택
  7. knn(k-Nearest Neighbors)의 분류 실습3(유방암 데이터)
  8. knn(k-Nearest Neighbors)의 분류 실습4(붓꽃 데이터)
  9. knn(k-Nearest Neighbors)의 분류 실습5(폭력과 멜로 분류) 
  10. knn(k-Nearest Neighbors)의 분류 실습6(폐암 데이터) 

▦ 1. knn(k-Nearest Neighbors) 란 무엇인가? 
- 사회적인 관계 관찰해보면?
 대략적으로 비슷한 사람끼리 모이는 성질이 있다.
 비슷한 취향의 사람들끼리 모여서 동호회를 만들고
 비슷한 부류의 계층의 사람들끼리 친분을 맺기도 한다.

- 공간적인 관계를 관찰해보면?
가구점이 모이는 상가지역이 따로 형성이 되어 있거나 
한약방이 밀집되어 있는 지역이 따로 모여있는 경우가 많다.(제기동)

이런 특성을 가진 데이터를 겨냥해서 만들어진 알고리즘이 knn이다.

▦ 2. knn(k-Nearest Neighbors)이 필요한 이유?

- knn 이 왜 필요한지?
 "유방암 종양의 크기에 대한 데이터( 반지름 , 둘레, 면적등 ) 만 
  가지고 이 종양이 악성인지 양성인지를 미리 예측할 수 있다면 
  환자에 대한 치료 스케쥴에 큰 영향을 미칠 수 있다."

- 암 발견과 치료과정 : 
  1. 건강검진 -----> 2.초음파, 내시경 ----> 3.의심되는 종양

  ----> 4. 큰 병원에 가서 조직검사를 하라고 권고 받는다. 
  ----> 5. 3~4달 후의 예약을 잡아준다.

▦ knn(k-Nearest Neighbors)의 분류의 이해 

그림


물음표가 무슨 색일까? 

"어떤 라벨(사진속 물음표)을 정의할 때 그 데이터의 주변 반경안의 
 데이터들을 조사하여 다수결로 k 개 이상이면 가장 많은 라벨로 정의하는 것이다."

 그림을 보면 정체를 알 수 없는 ? 모양의 라벨이 있는데 
이것이 빨간색인지 파란색인지
k = 3으로 놓고 본다면 

A의 경우는 Red
B의 경우는 Blue

▦ 4.knn(k-Nearest Neighbors)의 분류실습1(소개팅 데이터)


A라는 여학생이 소개팅을 수천번하지는 않기 때문에 14번정도 했다고 가정하고
그 동안 만난 남학생들에 대한 라벨을 호감라벨로 만들어서 데이터를 정리함

이 데이터를 기주능로 새로 만나게 될 남학생에 대한 데이터로만 호감레벨을 예측해본다.

- 기계학습을 기동할대는 input 데이터를 알고리즘에 맞게 잘 정제하는 작업이 필요하다 .

  1. 표준화 : R 에서는 scale()이라는 함수를 통해서 
          -1 ~ 1 사이의 데이터로 변경한다. 
     ( 키는 cm 이고 몸무게는 kg니까 서로 데이터의 범위가 달라서 
       결과가 잘 날올리가 없지 ~ 그래서 scale함수로 키와 몸무게를 
       -1 ~ 1 사이의 데이터로 변경을 해주어요 ~ )
    ====> 표준화 

  1. 정규화 : 정규분포에 속하는 데이터로 정규화를 해줘야 한다. 
             평균 및 표준편차를 기반으로 데이터 조정: 
             데이터와 평균의 차이를 표준편차로 나눈다. 

               값 - 평균값
     정규화 : -------------
                표준편차 

  1. 훈련 데이터 like 데이터를 준비 

like <- read.csv('like.csv',stringAsFactor=T, header=T)

> like <- read.csv('like.csv',stringsAsFactors=T, header=T)
> colnames(like) <- c('talk','book','travel','school','tall','skin','muscle','label')



  1. 테스트 데이터를 만든다 ( 앞으로 ㅅㄱㅁ만나게 될 남학생의 데이터) 
test <- data.frame(talk=70, book=50, travel=30 , school=70, tall=70, skin=40, muscle=50)

test


test 데이터의 남학생이 1타입,2타입,3타입 인지를 알아내고자 한다. 
  1. knn을 돌리기 위한 패키지 설치 
install.packages("class")
library(class)

train <- like[,-8]
group <- like[,8]


> knnpred1 <- knn(train, test,group, k=3,prob=TRUE)
> knnpred1
[1] 3타입
attr(,"prob")
[1] 0.6666667
Levels: 1타입 2타입 3타입

문제187. k 값을 4로 하면 결과가 달라지는지 확인하시오 ~! 


안달라져

문제 188. (점심시간 문제) 나이, 월수입, 상품구매여부 3개읠 데이터를
갖는 데이터가 있다. (buy.csv) 이 데이터를 이용해서 나이가 44이고 월급이 400 만원인
사람이 상품을 구매할지 비구매할지를 knn 분류 알고리즘으로 분석하시오 !


나이와 월수입으로 상품 구매여부를 예측하는 데이터

buy <- read.csv("buy.csv", stringsAsFactors =F, header=T)
buy

   1. 나이와 월수입 데이터를 표준화 한다.

   buy$age <- scale(buy$나이)
   buy$pay <- scale(buy$월수입)

   2. 나이와 월수입 데이터를 정규화 한다.
                 값 - 평균값
   정규화 = --------------------------
                  표준편차

test<- data.frame(age=44, pay=400)
train <- buy[,c(4,5)]
lebels <- buy[,3]

test$age <- (test$age - mean(buy$나이) ) / sd(buy$나이) 

test$pay <- ( test$pay - mean(buy$월수입) ) / sd(buy$월수입)

  1. test (나이:44, 월급:400) 인 데이터를 KNN으로 돌려서 상품을 구매할지 안할지 출력하시오 

a<-knn(buy[,c(4,5)], test,buy[,3], k=3,prob=TRUE)







buy <- read.csv("buy.csv" , stringsAsFactors = F , header = T)
buy

buy$age <- scale(buy$나이)
buy$pay <- scale(buy$월수입)
buy

test <- data.frame(age=44 , pay=400)

train <- buy[,c(4,5)]
labels <- buy[,3]
train



test$age <- scale(test$age)
test$pay <- scale(test$pay)


library(class)

knnpred1 <- knn(train , test , labels , k=5 , prob=TRUE) 
knnpred2 <- knn(train , test , labels , k=6 , prob=TRUE) 
knnpred1;knnpred2


문제189. buy 데이터 프레임에 라벨이 없는 44세의 월급 400만원 데이터를 넣고 다시 scale함수를 돌려서 나이와 월급을 정규화 하고 훈련 데이터와 테스트 데이터를 나눠서 knn 함수로 테스트 데이터의 라벨을 알아내시오 . 

strip.white=T(공백을 제거해라 ) 

buy <- read.csv("buy.csv" , stringsAsFactors = F , header = T,strip.white=T )
buy<-rbind(buy,c(44,400,"")

buy$age <- scale(buy$나이)
buy$pay <- scale(buy$월수입)
train <- buy[c(1:20),c(4,5)]
labels <- na.omit(buy[c(1:20) ,3])
knn1 <- knn(train , buy[21,c(1:2)] , labels , k=5 , prob=TRUE)
knn1




buy <- read.csv("buy.csv" , stringsAsFactors = F , header = T,
                 strip.white=T)
buy2 <-  rbind( buy, c(44,400,""))
buy2$나이 <- as.integer(buy2$나이)
buy2$월수입 <- as.integer(buy2$월수입)
buy2$나이 <- scale(buy2$나이)
buy2$월수입 <- scale(buy2$월수입)
 
train <- buy2[1:20,c("나이","월수입")]
train_label <- buy2[1:20,"상품구매여부"]
test <- buy2[21,c("나이","월수입")]
library(class)
knnpred3 <- knn(train, test, train_label, k=5, prob=T)
knnpred3


▩ 5. knn(k-Nearest Neighbors)의 분류 실습2(과일 데이터) 
knn(k-Nearest Neighbors)은 한국어서 k 근접 이웃이라고 한다.
머신러닝의 분류에 쓰이는 대표적이면서 간단한 알고리즘이다.

사용되는곳: 얼굴인식, 개인영화 추천, 단백질 및 질병 추출을 위한 유전자 데이터 패턴 식별등에 활용이된다. 

문제190. 책 104쪽에 나오는 x축 단맛, y축 아삭거림에 대한 과일, 야채 단백질을 분류하는 그래프를 그리시오 

■ 책 103쪽에 나온 그래프를 그릴려면 ? 


#1. food 데이터 프레임을 만든다.


food <- data.frame(ingredient = c("apple", "bacon", "banana", "carrot",

 "celery", "cheese", "cucumber", "fish",

 "grape", "green bean", "lettuce",

 "nuts", "orange", "pear","shrimp"

 ),

 sweetness = c(10,1,10,7,3,1,2,3,8,3,1,3,7,10,2),

 crunchiness = c(9,4,1,10,10,1,8,1,5,7,9,6,3,7,3),

 class = c("Fruits","Proteins","Fruits","Vegetables",

 "Vegetables","Proteins","Vegetables",

 "Proteins","Fruits","Vegetables",

 "Vegetables","Proteins","Fruits",

 "Fruits","Proteins"))

food



#2.  토마토 데이터 만들기

tomato <- data.frame(ingredient = "tomato",

 sweetness = 6,

 crunchiness = 4)

tomato



#3.  ggplot2  그래프로 plot 그래프를 그린다.


install.packages("ggplot2")

library(ggplot2)


# par : 파라미터 지정 / pty : plot모형을 "square" 정사각형

par(pty="s")


# 그래프 그리기(version : ggplot)

#par:파라미터/xpd:모형옮기기/mar:여백설정(아래,왼쪽,위,오른쪽)


par(xpd=T, mar=par()$mar+c(0,0,0,15)) 


plot(food$sweetness,food$crunchiness,

 pch=as.integer(food$class),

 #pch=food$class, # pch는 모형 지정

 xlab = "sweetness", ylab = "crunchiness", 

 main = "What is tomato class?")


legend(10.5,10, # legend 위치 지정 

 c("Fruits", "Proteins", "Vegetables", "X"),

 pch=as.integer(food$class))


text(food$sweetness, food$crunchiness, 

 labels=food$ingredient, 

 pos = 3, # 글자위치position(1:below/2:left/3:above/4:right)

 offset = 0.3, # 좌표와 얼마나 띄어쓰기 할것인지

 cex = 0.7 ) # 문자크기



# 그래프 그리기(version : ggplot2)


ggplot(data=food,aes(x=sweetness,y=crunchiness))+

 labs(title="What is tomato class?")+ # 타이틀 명

 geom_point(aes(color=class, shape=class),size=6)+

 geom_text(aes(label=ingredient), # 라벨링 표시

 vjust=-1, # 수직으로 움직일 거리 (위는 -, 아래는 +)

 size = 5) # 문자크기

 



문제191. 토마토가 야채, 과일, 단백질 중에 어느 분류에 속하는지 knn알고리즘으로 알아내시오 

답 : 

install.packages("dplyr")
library(class)
library(dplyr)

tmt <- knn(select(food,sweetness,crunchiness),  select(tomato,sweetness,crunchiness),food$class,k=2)
tmt


토마토의 최근접 이웃을 구하기 위해서는 거리함수나 두 인스턴스 사이의 유사도를 측정하는 공식이 필요하다

거리를 계산하는데는 다양한 방법이 있는데 knn 은 유클리드 거리를 사용한다.

예 :  토마토와 green bean과의 거리

dist("pear","green bean") =  sqrt( (6-3)^2 + (4-7)^2 ) = 4.2

문제192. 토마도와 orange와의 유클리드 거리를 구하시오 

sqrt( (7-6)^2 + (3-4)^2) ) = 1.414214
 




▩ 6. 적당한 k 값 선택

 적당한 k 값을 선택해야 하는데 k 값이 너무 낮으면 오버피팅 하게된다

즉 훈련데이터로 인해 만든 모델이 훈련 데이터에만 맞고 다른 데이터를 
분류를 잘 못한다. 

k 값이 너무 높으면 언더피팅을 하게 된다. 

훈련 데이터 조차도 분류를 잘 못한다 . 

예: k 값에 따른 분류 시각화 작업 




■ 구현 코드 




install.packages("readr")

install.packages("ElemStatLearn")

install.packages("class")


library(readr)


#1.과적합에 대하여.

library(ElemStatLearn)

library(class)

x <- mixture.example$x

x

g <- mixture.example$y

g

xnew <- mixture.example$xnew

xnew

#k=1, 10 , 30 , 50 , 100, 1000 

#k값이 지나치게 작을 때: 분류 경계선이 너무 디테일 하다. : 과적합

#k값이 지나치게 클 때 분류 경계선이 너무 크다 : 부적합
#knn(train, test, cl, k =1, l = 0, prob = FALSE, use.all = TRUE)
mod1 <- knn(x, xnew, g, k=1, prob=TRUE)  

mod1

prob1 <- attr(mod1, "prob")

prob1

prob1 <- ifelse(mod1=="1", prob1, 1-prob1)

prob1

px1 <- mixture.example$px1

px2 <- mixture.example$px2

prob1 <- matrix(prob1, length(px1), length(px2))

par(mar=rep(2,4))

#윤곽선

contour(px1, px2, prob1, levels=0.5, 

        labels="", xlab="", ylab="", main= "k-nearest neighbour", axes=FALSE)

points(x, col=ifelse(g==1, "coral", "cornflowerblue"))

gd <- expand.grid(x=px1, y=px2)


#배경

points(gd, pch=".", cex=1.2, col=ifelse(prob1>0.5, "coral", "cornflowerblue"))

box()


▩ 7. knn (k-nearest neighbors) 


▩ 7. knn (k-nearest neighbors) 의 분류 실습1(유방암 데이터)

##### 3장 : 최근접 이웃(Nearest Neighbors)을 사용한 분류(Classification)  --------------------

## 예제 : 암 샘플 분류 ----
## 단계 2 : 데이터 준비와 살펴보기 ----

# CSV 파일 임포트
wbcd <- read.csv("wisc_bc_data.csv", stringsAsFactors = FALSE)

# wbcd 데이터 프레임의 구조
str(wbcd)
head(wbcd)
# id 속성 제거
wbcd <- wbcd[-1]

# 진단 테이블
table(wbcd$diagnosis)

# 팩터로서 진단 변수 변환
wbcd$diagnosis <- factor(wbcd$diagnosis, levels = c("B", "M"),
                         labels = c("Benign", "Malignant"))
head(wbcd)
# 진단 변수의 비율
round(prop.table(table(wbcd$diagnosis)) * 100, digits = 1)

# 세 속성에 대한 요약
summary(wbcd[c("radius_mean", "area_mean", "smoothness_mean")])

# 정규화 함수
normalize <- function(x) {
  return ((x - min(x)) / (max(x) - min(x)))
}

# 정규화 함수 테스트 - 결과는 일치함
normalize(c(1, 2, 3, 4, 5))
normalize(c(10, 20, 30, 40, 50))

# wbcd 데이터 정규화
wbcd_n <- as.data.frame(lapply(wbcd[2:31], normalize))

head(wbcd)
head(wbcd_n)

# 정규화가 잘 되었는지 확인 # 모든 컬럼의 값을 0~1 사이의 값으로 변경해줌
summary(wbcd_n$area_mean)
summary(wbcd_n$concavity_worst)

# 훈련 데이터와 테스트 데이터 생성 # 둘다 라벨이 없는 데이터 이다.
wbcd_train <- wbcd_n[1:469, ]
wbcd_test <- wbcd_n[470:569, ]


str(wbcd)
str(wbcd_train)

# 훈련 데이터와 테스트 데이터에 대한 라벨 생성

wbcd_train_labels <- wbcd[1:469, 1]
wbcd_test_labels <- wbcd[470:569, 1]

## 3단계 : 데이터로 모델 훈련 ----

# "class" 라이브러리 로드
library(class)

wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=21)

## 4 단계 : 모델 성능 평가 ----

# "gmodels" 라이브러리 로드
library(gmodels)

# 예측값과 실제값의 교차표 생성
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred,  prop.chisq=FALSE)


실제/모델      B(양성)      M(악성)
B(양성)       61(TN)      0(FP)
M(악성)        2(FN)     37(TP)

#
#
TRUE NEGATIVE 
FALSE POSITIVE
FALSE NEGATIVE
TRUE POSITIVE
## 5 단계 : 모델 성능 향상 ----

# 데이터 프레임를 z-score 표준화하기 위해 scale() 함수 사용
wbcd_z <- as.data.frame(scale(wbcd[-1]))

# 변환이 정확하게 적용되었는지 확인
summary(wbcd_z$area_mean)

# 훈련과 테스트 데이터셋 생성
wbcd_train <- wbcd_z[1:469, ]
wbcd_test <- wbcd_z[470:569, ]

# 변경한 데이터로 분류
wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test,
                      cl = wbcd_train_labels, k=21)

# 예측값과 실제값의 교차표 생성
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred,
           prop.chisq=FALSE)

# 다른 k 값으로 분류
wbcd_train <- wbcd_n[1:469, ]
wbcd_test <- wbcd_n[470:569, ]

wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=1)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)

wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=5)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)

wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=11)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)

wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=15)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)

wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=21)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)





wbcd <- read.csv("wisc_bc_data.csv", stringsAsFactors = FALSE)
> nrow(wbcd)
[1] 569

569 건의 유방암 환자 데이터를 둘로 나눈다.

 2/3  훈련 데이터 + 악성인지 양성인지를 구분하는 라벨
 1/3 테스트 데이터 + 악성인지 양성인지를 구분하는 라벨을 빼고 
                    훈련 데이터로 그 라벨을 알아내는 작업을 수행

 
knn (훈련 데이터 , 테스트 데이터 , 훈련 데이터 라벨, k=1) 


설명 : B (양성) : 357명 , M(악성) : 212명
wbcd$diagnosis <- factor(wbcd$diagnosis, levels = c("B", "M"), labels = c("Benign", "Malignant"))

설명 : B와 M 을 Benign, Malignant 철자로 변환해서 저장함 

정규화 하는 방법에는 2가지가 잇는데

1.표준정규분포 : scale() 함수를 사용한 변환

2.최대최소변환 : 책 115페이지 (아래 코드) 의 normalize 함수 
               (신경망에서 많이 사용됨) 


# wbcd 데이터 정규화
wbcd_n <- as.data.frame(lapply(wbcd[2:31], normalize))

head(wbcd)
head(wbcd_n)



문제193. 실제 테스트 데이터의 라벨 (wbcd_test_labels )와
          knn으로 예측한 라벨인(wbcd_test_pred) 를 비교해서 얼마나 일치했는지 확인하시오 ! 


data.table(wbcd_test_labels,wbcd_test_pred,mean(as.numeric(wbcd_test_labels ==wbcd_test_pred )),as.numeric(wbcd_test_labels ==wbcd_test_pred ) )




wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=7)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)



wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=13)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)



wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=21)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)



wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=23)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)



wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=31)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)



wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=29)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)



wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=6)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)

거짓부정은 예측값은 양성이지만 종양이 실제로는 악성이다
거짓긍정은 예측값은 악성이지만 종양이 실제로는 양성이다.

k값      거짓부정     거짓긍정
1           1          3
5           2          0
11          3          0
15          3          0
21          2          0
27          4          0

▦ 8. knn(k-Nearest Neighbors)의 분류실습4 ( 붓꽃데이터) 
data(iris)

head(iris)

문제194. 붓꽃의 종류가 몇가지가 있는지 출력하시오 
unique(iris$Species)

> unique(iris$Species)
[1] setosa     versicolor virginica
Levels: setosa versicolor virginica

nrow(iris)
150

▩ 9.knn(k-Nearest Neighbors)의 분류 실습5(폭력과 멜로 분류) 

문제195. 붓꽃의 데이터를 훈련데이터와 테스트 데이터로 나눠서
         knn 을 돌려서 테스트 데이터의 라벨을 예측하는 실습을 
         유방암 실습 코드를 가지고 구현하시오 !
          (오늘의 마지막 문제)


 

install.packages('class')

library(class)


install.packages('gmodels')

library(gmodels)


install.packages("scales")

library(scales




######[KNN] using algorithm######################################################

####movie data load

movie<-read.csv('movie.csv',header=F stringsAsFactors=F

colnames(movie)<-c("title","kick","kiss","genre")

movie$genre<-factor(movie$genrelevels= c('Romance','Action')) # covert genre column into a factor

summary(movie[c("kick",'kiss')]) # do not need to normalize


######data partition

movie_train<- movie[1:6,2:3]

movie_test<-movie[7,2:3

movie_train_label <- movie[1:6,4


######classification

movie_test_matrix <-rbind( movie_testmovie_testmovie_test,movie_test,movie_test,movie_test

movie_test_matrix

distances <- sqrt(apply((movie_test_matrix-movie_train)**2,1,sum))

sortedDistIndicies <- order(distances#rearrange disctances into ascending order ( index)

#distances[order(distances)] #sort by distances

#k <- readline(prompt('enter k value'))

classCount <- movie_train_label[sortedDistIndicies[c(1:3)]] 

classCount

sortedClassCount <-table(classCount)

sortedClassCount

movie_test_pred<-names(sortedClassCount[sortedClassCount==max(sortedClassCount)])

movie_test_pred


########plot graph

plot(movie[1:6,]$kick~movie[1:6,]$kissdata=movie[1:6,], col=alpha(c('red','blue'),0.7)[movie[1:6,]$genre], xlab='kiss count'ylab='kick count'main='movie data')

points(movie[7,]$kiss,movie[7,]$kickdata=movie[7,], pch=15cex=1.2col = 'orange')

legend('topright', c(levels(movie$genre), "test"), pch =c(1,1,15), col=c(alpha(c('red','blue'),0.7),'orange'), cex=0.9)



######using packages######################################################

### Data load

movie<-read.csv('/Users/misoni/Desktop/movie.csv',header=F stringsAsFactors=F)

colnames(movie)<-c("title","kick","kiss","genre")

movie$genre<-factor(movie$genrelevels= c('Romance','Action'))

summary(movie[c("kick",'kiss')])


##normalization

#normalize <-function(x) {

# return (  (x-min(x)) / (max(x)-min(x))  )

#}


####split data

movie_train <- movie[1:6,2:3

movie_test <- movie[7,2:3]

movie_train

movie_test


movie_train_label <- movie[1:6,4]

movie_test_label <- movie[7,4]

movie_test_label

####modeling

movie_test_pred <- knn(train=movie_traintest=movie_testcl=movie_train_labelk=3,prob=T)

movie_test_pred

table(movie_test_pred)


library(gmodels)

#CrossTable(x=movie_test_label, y=movie_test_pred)

#####################################################################






###########iris data#######################################################

########normalize data

str(iris)

table(iris$Species)

normalize<-function(x){

return ((x-min(x))/ (max(x)-min(x)))

}

iris_n <- as.data.frame(lapply(iris[1:4], normalize ))


#########split data

set.seed(1)

train <- round(0.7*dim(iris)[1])

train_index = sample(1:dim(iris)[1], trainreplace =F)

iris_train <- iris_n[train_index,]

iris_test <- iris_n[-train_index,]


iris_train_label <- iris[train_index,5]

iris_test_label  <- iris[-train_index,5]


iris_train_label

prop.table(table(iris_train_label))

prop.table(table(iris_test_label))



###

###########modeling

iris_test_pred <- knn(train=iris_traintest=iris_testcl=iris_train_labelk=3, prob=T)

table(iris_test_pred)














 CrossTable(iris_test_label,iris_test_pred)




   Cell Contents
|-------------------------|
|                       N |
| Chi-square contribution |
|           N / Row Total |
|           N / Col Total |
|         N / Table Total |
|-------------------------|


Total Observations in Table:  45


                | iris_test_pred
iris_test_label |     setosa | versicolor |  virginica |  Row Total |
----------------|------------|------------|------------|------------|
         setosa |         15 |          0 |          0 |         15 |
                |     20.000 |      5.000 |      5.000 |            |
                |      1.000 |      0.000 |      0.000 |      0.333 |
                |      1.000 |      0.000 |      0.000 |            |
                |      0.333 |      0.000 |      0.000 |            |
----------------|------------|------------|------------|------------|
     versicolor |          0 |         13 |          0 |         13 |
                |      4.333 |     17.333 |      4.333 |            |
                |      0.000 |      1.000 |      0.000 |      0.289 |
                |      0.000 |      0.867 |      0.000 |            |
                |      0.000 |      0.289 |      0.000 |            |
----------------|------------|------------|------------|------------|
      virginica |          0 |          2 |         15 |         17 |
                |      5.667 |      2.373 |     15.373 |            |
                |      0.000 |      0.118 |      0.882 |      0.378 |
                |      0.000 |      0.133 |      1.000 |            |
                |      0.000 |      0.044 |      0.333 |            |
----------------|------------|------------|------------|------------|
   Column Total |         15 |         15 |         15 |         45 |
                |      0.333 |      0.333 |      0.333 |            |
----------------|------------|------------|------------|------------|






















 

'R(알) ' 카테고리의 다른 글

R 5장. 결정트리  (0) 2017.09.08
R 4장. 나이브 베이즈의 이해활용한 기계학습4  (0) 2017.09.08
R 1장 R기본문법  (0) 2017.09.08
R 3장. knn (최근접 이웃을 사용한 분류의 이해)  (0) 2017.07.14
R 1장 R기본문법  (0) 2017.07.06

R 1장 R기본문법

R(알) 2017. 9. 8. 17:45
  R 책 : R을 이용한 기계학습

6월 22일 ~ 7월 13일 (3주) : R 수업 - 매일 쪽지시험 2개
7월 13일 ~ 8월  3일  (3주) : 딥러닝 - 개념을 잡는 문제
8월  3일  ~ 8월 23일 (3주) : 텐써플로우 + 개인 프로젝트 (포트폴리오)


목차 : 1장. 기계학습 이란?
         2장. 데이터 관리와 이해 --- R 기본문법
                    - R 기본 사용법
         3장. KNN 알고리즘
         4장. 나이브 베이즈 이론
 5장. 결정트리
 6장. 회귀 기법
 7장. 신경망
 8장. 연관 규칙
 9장. K-means
10장. 모델 성능 평가






         2장. 데이터 관리와 이해 --- R 기본문법

* R 스튜디오 설치

emp <- read.csv("emp.csv", header=TRUE)
emp


문제1. R을 왜 배워야하는가? pl/sql 과 비교하시오

SQL, PL/SQL, R, Hive SQL, Python

1. 딥러닝 개발 (파이썬을 아주 잘하고 + 딥러닝 이해)
2. 데이터 분석 (R, SQL)
3. 하둡



 create or replace procedure
     get_data(p_x out sys_refcursor)
     as
        l_query varchar2(400) :='select deptno ';

     begin
        for x in (select distinct job  from emp order by 1)
         loop

                l_query := l_query ||replace(', sum(decode(job,''$X'',sal)) as $X '
                        ,'$X',x.job );

       end loop;a

       l_query := l_query ||' from  emp group by deptno ';

        open p_x for l_query;

    end;

  /


 variable  x  refcursor;

 exec get_data(:x);

 print x;



R 스튜디오에서 실행하면?

attach(emp)
tapply(sal, list(job,deptno),sum)


            10   20   30   70
ANALYST     NA 6000   NA   NA
CLERK     1300 1900  950 3200
MANAGER   2450 2975 2850   NA
PRESIDENT 5000   NA   NA   NA
SALESMAN    NA   NA 5600   NA




   * R이란 무엇인가?


Ross ihaka가 1995년에 개발한 소프트웨어이고
데이터 분석을 위한 통계 및 그래픽스를 지원하는 자유 소프트웨어이다



   * R을 왜 사용해야하는가?

1. R is free
2. data 분석을 위해서 가장 많이 쓰는 통계 플랫폼
3. 복잡한 데이터를 다양한 그래프로 표현할 수 있다.
4. 분석을 위한 데이터를 쉽게 저장하고 조작할 수 있다.
5. 누구든지 유용한 패키지를 생성해서 공유할 수 있고 새로운 기능에 대한 전달이 빠르다
6. 어떠한 os에도 설치가 가능하다.
    심지어 아이폰에도 설치할 수 있다.



   * R의 자료구조


1. vector : 같은 데이터 타입을 갖는 1차원 배열 구조
2. matrix : 같은 데이터 타입을 갖는 2차원 배열 구조
3. array : 같은 데이터 타입을 갖는 다차원 배열 구조
4. data.frame : 각각의 데이터 타입을 갖는 컬럼으로 이루어진 2차원 배열구조(rdbms의 테이블과 유사함)
     예: 오라클      vs      R
          desc emp;      str(emp)

5. list : 서로 다른 데이터 구조(vector, data frame, matrix, array)



   * 기본 데이터 검색


문제2. emp 데이터 프레임에서 이름과 월급을 출력하시오!
> emp[ 행, 열 ]
> emp[  , c("ename", "sal") ]
               ↑
           combine

문제3. 월급이 3000인 사원들의 이름과 월급을 출력하시오.

emp[sal==3000,c("ename", "sal")]

문제4. 월급이 2000 이상인 사원들의 이름과 월급을 출력하시오.

emp[sal>=2000,c("ename", "sal")]

문제5. 직업이 SALESMAN이 아닌 사원들의 이름과 월급과 직업을 출력하시오.

emp[job!="SALESMAN",c("ename", "sal","job")]

문제6. 1981년 12월 11일에 입사한 사원들의 이름과 입사일을 출력하시오.

emp[hiredate =="1981-12-03",c("ename", "sal","hiredate")]



*연산자 총정리

1. 산술연산자 : * / + -
2. 비교 연산자 : >, <, >=, <=, ==, !=
3. 논리 연산자 : & : and (백터화된 연산)
                      && : and (백터화되지 않은 연산) - 산술 연산자
                         | : or (백터화된 연산)
                         || : or (백터화되지 않은 연산)
                         ! : not

예 : x <- c(1,2,3)
      ( x > c(1,1,1) & ( x < (3,3,3) )

예: x <- 1
( (x > -2) && (x <2) )




   * 연결 연산자

오라클 ------------- R
     ||          paste



문제7. 아래와 같이 결과를 출력하시오.

SQL : select ename || '의 직업은 ' || job
     from emp;

R : paste(emp$ename, ' 의 직업은 ', emp$job)

install.packages("data.table")
library(data.table)

data.table(paste(emp$ename, ' 의 직업은', emp$job))



   * 기타 비교 연산자


오라클 ---------------- R

1. in                         %in%
2. like                       grep
3. in null                    is.na
4. between .. and       emp$sal >= 1000 & emp$sal <= 300

문제8. 직업이 SALESMAN, ANALYST 인 사원들의 이름과 직업을 출력하시오

emp[ !emp$job %in% c("SALESMAN", "ANALYST"), c("ename", "job")]

문제9. 직업이 SALEMSMAN, ANALYST가 아닌 사원들의 이름과 직업을 출력하시오.

emp[ !emp$job %in% c("SALESMAN", "ANALYST"), c("ename", "job") ]


문제10. 부서번호가 10번, 20번인 사원들의 이름과 월급과 부서번호를 출력하시오.

emp[ emp$deptno %in% c(10,20), c("ename","sal","deptno") ]



문제11. 커미션이 null인 사원들의 이름과 월급과 커미션을 출력하시오.

emp[  is.na(emp$comm ) , c("ename","sal","comm") ]

설명 : 1. NULL (아무것도 없다) ---> is.null()
          2. NA (결손값) ---> in.na()
          3. NaN (비수치) ---> is.nan()
               ↓
          Not a Number

설명: NULL(아무것도 없다)를 활용하는 때 반복문으로 처리할 오브젝트의 초기값을 NULL로 설정

x <- NULL    # x를 NULL로 초기화
for (i in 1:10) x <- append(x, i*i)
x

(실행결과)
 [1]   1   4   9  16  25  36  49  64  81 100

문제12. 커미션이 NA가 아닌 사원들의 이름과 월급과 커미션을 출력하시오.

emp[!is.na(emp$comm), c("ename", "sal","comm")]


문제13. 월급이 1000에서 3000 사이가 아닌 사원들의 이름과 월급을 출력하시오.

emp[ !emp$sal >= 1000 | !emp$sal <= 3000 , c("ename", "sal")]
또는
emp[ emp$sal < 1000 | emp$sal > 3000 , c("ename", "sal")]

문제14. 이름의 첫번째 글자가 A로 시작하는 사원들의 이름과 월급을 출력하시오.
 emp[grep("^A.*", emp$ename), c("ename", "sal")]

설명:
^ : 첫번째
$ : 마지막
. : 한자리수
* : wild card(%)

문제15. 이름의 끝글자가 T로 끝나는 사원들의 이름과 월급을 출력하시오.

emp[grep("*T$", emp$ename), c("ename", "sal")]


문제16. 이름에 T를 포함하고 있는 사원들의 이름과 월급을 출력하시오.

emp[grep("T", emp$ename), c("ename", "sal")]
emp[grep("^.*T.*$", emp$ename), c("ename", "sal")]


문제17. 이름의 두번째 철자가 M인 사원들의 이름과 월급을 출력하시오.

emp[grep("^.M", emp$ename), c("ename","sal")]

(실행결과)
SMITH

emp[grep("^.M", emp$ename), c("ename","sal")]

(실행결과)
JAMES




   * 중복제거


오라클 --------------------- R
distinct                       unique

문제18. 부서번호를 출력하는데 중복제거해서 출력하시오

unique(emp$deptno)
data.table("부서번호"=unique(emp$deptno))



   * 정렬작업

오라클 ---------------------- R
order by                     - data frame 에서 order 옵션
                                 - data 정렬하는 패키지 doBy를 설치하고
                                   orderBy 함수를 사용


문제19. 이름과 월급을 출력하는데 월급이 높은 사원부터 출력하시오

emp[order(emp$sal, decreasing=T), c("ename", "sal")]



문제20. 이름과 입사일을 출력하는데 먼저 입사한 사원부터 출력하시오.

emp[order(emp$hiredate, decreasing=F), c("ename", "hiredate")]



문제21. 직업이 SALESMAN인 사원들의 이름과 월급과 직업을 출력하는데 월급이 높은 사원부터 출력하시오.



emp[ order(sal, decreasing=T) , c("ename","sal",'job')][emp[ order(sal, decreasing=T) , c("ename","sal",'job')]$job =="SALESMAN", c("ename","sal","job")]

■ R 에서 data를 정렬하는 방법 2가지
  1. data frame에 order 옵션을 사용하는 방법
  2. doBy 패키지를 설치하고 orderBy 함수를 사용하는 방법

install.packages("doBy")
library(doBy)
orderBy(~sal,emp[    , c("ename","sal") ]

   * R에서 data를 정렬하는 방법 2가지


1. data frame에 order 옵션을 사용하는 방법
2. doBy 패키지를 설치하고 orderBy 함수를 사용하는 방법

install.packages("doBy")
library(doBy)
orderBy(~sal, emp[, c("ename","sal")])  # 오름차순
orderBy(~-sal, emp[, c("ename","sal")]) # 내림차순


문제22. 직업이 ANALYST가 아닌 사원들의 이름과 월급과 직업을 출력하는데
          월급이 높은 사원부터 출력되게 하시오.

orderBy(~-sal, emp[emp$job !='ANALYST', c("ename","sal","job")])


문제23. 카페에서 범죄 발생요일(crime_day.csv)를 내려받고 일요일에 발생하는 범죄유형, 범죄건수를 출력하는데 범죄건수가 높은 것부터 출력하시오.

crime_day <- read.csv("crime_day.csv", header=TRUE)
crime_day

orderBy(~-CNT,crime_day[crime_day$DAY=='SUN', c("C_T","CNT")])


설명 :

* 현재 사용하고 있는 변수의 목록을 확인하려면?
ls()

* 변수를 지우고 싶을 때?

rm(x)


crime_loc <_ read.csv("crime_loc.csv",header=TRUE)
crime_loc
head(crime_loc)
str(crime_loc)

문제24. 카페에서 crime_loc.csv 를 내려받고 R에 로드한후에 살인이 일어나느 장소와 건수를 출력하는데 살인이 일어나느 건수가 높은것부터 출력하시오 !
mx <- crime_loc[범죄 =='살인',c("장소","건수")]
orderBy(~-건수,mx)

> mx <- crime_loc[범죄 =='살인',c("장소","건수")]
> orderBy(~-건수,mx)
            장소 건수
83            집  312
85          노상  280
82        아파트  242
108         기타  131
89          병원   87
88      숙박업소   43
90        사무실   40
86          상점   23
101     의료기관   19
91          공장   15
98        유원지   13
96          교통    9
94      역대합실    8
99          학교    8
103         산야    8
87      시장노점    5
문제25. 강도가 가장 많이 발생하는 장소는 어디인가?+


crime_loc <_ read.csv("crime_loc.csv",header=TRUE)
crime_loc
head(crime_loc)
str(crime_loc)


> mx <- crime_loc[범죄 =='강도',c("장소","건수")]
> orderBy(~-건수,mx)
            장소 건수
112         노상 1541
135         기타  552
110           집  528
113         상점  487
109       아파트  372
116         병원  275
115     숙박업소  262
117       사무실  128
125       유원지   55
126         학교   35
123         교통   33
128     의료기관   24
127     금융기관   23
118         공장   16

문제25. 강도가 가장 많이 발생하는 장소는 어디인가

mx <- crime_loc[범죄=='강도',c("장소","건수")]
mx2 <- orderBy(~-건수,mx)
mx2[2,1]

■ 함수
  1. 문자함수
  2. 숫자함수
  3. 날짜함수
  4. 변환함수
  5. 일반함수

■ 문자함수

     오라클       vs        R

     upper               toupper
     lower               tolower
     substr              substr
     replace             gsub

문제28. 이름과 직업을 출력하는데 소문자로 출력하시오


library(data.table)
data.table(

library(data.table)
data.table(이름= tolower(emp$ename),직업=tolower(emp$job))


       이름      직업
 1:  smith     clerk
 2:  allen  salesman
 3:   ward  salesman
 4:  jones   manager
 5: martin  salesman
 6:  blake   manager
 7:  clark   manager
 8:  scott   analyst
 9:   king president
10: turner  salesman
11:  adams     clerk
12:  james     clerk
13:   ford   analyst
14: miller     clerk
15:   jack     clerk

문제29. 아래와 같이 이름을 물어보게하고 이름을 입력하면 해당사원의 이름과 월급이
출력되는 R 코드를 작성하는데 이름을 소문자로 입력해도 출력되게하시오 (R 에서 함수 생성)

find_sal <- function() {

  response <- readline(prompt='이름이 뭐에요')
  x <- emp[emp$ename==response, c("ename","sal") ]
  print (x)
}
find_sal

 > find_sal <- function() {
+
+   response <- readline(prompt='your name?')
+   x <- emp[emp$ename==toupper(response), c("ename","sal") ]
+   print (x)
+ }
> find_sal()
your name?scott
  ename  sal
8 SCOTT 3000
>

문제30. 요일을 물어보게하고 요일을 입력하면 해당요일에 가장 많이 발생하는 범죄유형이 출력되게하시오


find_crime_day <- function() {

  response <- readline(prompt='day?')
  x <- crime_day[crime_day$DAY==toupper(response), c("C_C","CNT") ]
  x1 <- orderBy(~-CNT,x)
  print (x1[1,1])
}
find_crime_day()

day?fri
[1] 지능범죄
Levels: 강력범죄  지능범죄  폭력범죄  풍속범죄
> find_crime_day()
day?mon
[1] 지능범죄
Levels: 강력범죄  지능범죄  폭력범죄  풍속범죄
> find_crime_day()
day?tue
[1] 지능범죄
Levels: 강력범죄  지능범죄  폭력범죄  풍속범죄
>


문제31. 이름을 출력하고 그 이름 옆에 이름의 첫번째 철자부터 세번째 철자까지 출력되게하시오

data.table(emp$ename, substr(emp$ename,1,3) )

문제32. 이름의 두번째 철자가 M 인 사원들의 이름과 월급을 출력하는데 substr 함수를 사용해서 출력하시오 !

data.table(grep("^.M"emp$ename) , substr(emp$ename))



 emp[grep("^A.*",, c("ename", "sal")]

data.table(emp$ename,substr(emp$ename,1,3) , substr(emp$ename,2,3) )

substr (x, start, stop)

문제33. 이름, 월급을 출력하는데 월급을 출력할때 0을 * 로 출력하시오
(gsub 함수 사용)

설명: gsub('h', 'H' ,text)

     특정 text에서 소문자 h를 대문자 H로 변경해라 !

data.table(emp$ename , gsub('0'|'1'|'2' , '*' , emp$sal) )

문제34. 이름과 월급을 출력하는데 월급을 출력할때에 숫자 0,1,2를 * 로 출력하시오 !
data.table(emp$ename , gsub( '[0-2]', '*' , emp$sal) )

■ 숫자함수

     오라클       vs       R
  1. round                round
  2. trunc                trunc
  3.  mod                  %%
  4. power                2^3

문제35. 6의 9승을 출력하시오 !

> 6^9
[1] 10077696

문제36. 10을 3으로 나눈 나머지 값을 출력하시오

10%%3

문제37. 이름과 연봉을 출력하는데 연봉은 월급의 12를 곱해서 출력하고 컬럼명이 한글로 연봉을 출력되게 하시오

data.table (ename=emp$ename, '연봉' = emp$sal * 12 )

문제38. 위의 결과를 다시 출력하는데 round 함수를 써서 백의 자리에서 반올림되게하시오 !


data.table(ename=emp$ename, '연봉' = round(emp$sal * 12, -3))



round(122.5)    123
                122   --->  O

round(123.5)    123
                124  --->  O

※ 알의 특징 !!!!
     알은 짝수를 좋아해 !

※  R 의 trunc 의 특징

     소숫점 이후만 버린다.
     trunc는 소수점 이하면 가능하다 !!

문제39.  문제37번을 다시 출력하는데 백자리 이후를 다 버려서 출력하시오

trunc는 소수점만 가능하다

data.table (ename=emp$ename, '연봉' = trunc(emp$sal * 12 /1000) * 1000 )


■ 날짜 함수

     오라클      vs      R

     sysdate               Sys.Date()
     add_months            difftime
     months_between        사용자 정의함수
     last_day               사용자 정의함수
     next_day              사용자 정의함수

문제40. 오늘 날짜를 출력하시오

Sys.Date()

문제41. 이름, 입사한 날짜부터 오늘까지 총 몇일 근무했는지 출력하시오 !
     (힌트 : 오라클    vs    R   )
          to_data        as.Date

data.table(Sys.Date() - as.Date(emp$hiredate), emp$ename)


문제42. 이름 , 입사한 날짜부터 오늘까지 총 몇달 근무했는지 출력하시오


data.table( month(Sys.Date() ,emp$hiredate), emp$ename)


-SQL 

     select last_day(sysdate) from dual;

-R 
     install.packages("lubridate")
     library(lubridate)

     last_day <- fuction(x) {
     
          ceiling_date(x,"month") - days(1)
                              }
     last_day(Sys.Date()) 

문제44. last_day 함수처럼 first_day 함수를 만드시오 

first_day(Sys.Date())

2017-06-01

first_day <- function(x) {
  ceiling_date(x,"month") - months(1)
}
first_day (Sys.Date())

문제45. 아래의 SQL의 결과를 R로 구현하시오 

SQL : SELECT next_day( sysdate, '월요일') from dual;

R   : next_day(Sys.Date(), '월요일')

17/06/26


■ 변환함수 
  오라클 ------------------- R

to_char                as.character
to_number              as.integer
to_date                as.Date

                         format 함수

문제46. 이름, 입사한 요일을 출력하시오 ! 

data.table(emp$ename, format(as.Date(emp$hiredate), '%A') )




문제45. 아래의 sql의 결과를 R로 구현하시오 !
SQL : SELECT next_day(sysdate, '월요일')
      from dual;


next
















R : next_day( Sys.Date(), '월요일')

■ 일반함수 

     Oracle -------------- R

1.nvl 함수              is.na
2.decode 함수           ifelse
3.case   함수           ifelse

문제46. 이름,월급,등급을 출력하는데 월급이 1500 이상이면 등급을 A등급으로 출력하고 
          아니면 B로 출력하시오 ! 


 salfunc <- fuction(x) {
     
          ceiling_date(x,"month") - days(1)
                              }
     last_day(Sys.Date()) 


data.table(emp$ename, emp$sal, ifelse(emp$sal >= 1500 , 'A', 'B') )
문제50. 이름, 월급, 등급을 출력하는데 등급이 월급이 3000 이상이면 
       A를 출력하고 1500 이상이고 3000 보다 작으면 B를 출력하고 나머지 사원들은 
       C를 출력하시오 ! 

data.table(emp$ename, emp$sal, ifelse(emp$sal >= 3000 , 'A', ifelse(emp$sal >=1500,'B','C')) )

  format(as.Date(emp$hiredate),'%m') 달만
  format(as.Date(emp$hiredate),'%Y') 년만
  format(as.Date(emp$hiredate),'%d') 일만 나옴
문제51. 이름, 월급, 보너스를 출력하는데
      1980년도에 입사했으면 보너스 A를 출력하고
      1980년도에 입사했으면 보너스 B를 출력하고
      1980년도에 입사했으면 보너스 C를 출력하고 


data.table(emp$ename, emp$sal,
ifelse(format(as.Date(emp$hiredate),'%y') == 80 , 'A',
      ifelse(format(as.Date(emp$hiredate),'%y') == 81 , 'B',
             ifelse(format(as.Date(emp$hiredate),'%y') == 82 , 'C','D'))))

문제52. is.na 함수를 이용해서 커미션이 NA인 사원들의 이름과 커미션을 출력하시오  

data.table(is.na(emp$comm) , c('ename','comm')


■ 복수행 함수 ( = group 함수 ) 
     Oracle ---------------- R

  1. max                      max
  2. min                    min
  3. sum                    sum
  4. avg                    mean
  5. count                  length (세로)
                            table  (가로)

문제54. 최대월급을 출력하시ㅗㅇ 

max(emp$sal)
문제55. 직업, 직업별 최대월급을 출력하시오 

aggregate(sal~job, emp,max)
문제56. 부서번호를 뽑고 부서번호별 최대월급을 출력하는데 
          부서번호별 최대월급이 높은 것부터 출력하시ㅗㅇ 
a <- aggregate(sal~job, emp,max)


install.packages("doBy")
library(doBy)
aggregate(sal~job, emp,max)
a <- aggregate(sal~job, emp,max)

# 컬럼명 변경하는 방법 

names(a ) <- c("deptno","sumsal")
a


> a
        job  sal
1   ANALYST 3000
2     CLERK 3200
3   MANAGER 2975
4 PRESIDENT 5000
5  SALESMAN 1600
> names(a) <- c("deptno","sumsal")
> a
     deptno sumsal
1   ANALYST   3000
2     CLERK   3200
3   MANAGER   2975
4 PRESIDENT   5000
5  SALESMAN   1600
>

orderBy(~-sumsal,a)

> orderBy(~-sumsal,a)
     deptno sumsal
4 PRESIDENT   5000
2     CLERK   3200
1   ANALYST   3000
3   MANAGER   2975
5  SALESMAN   1600

문제57. 직업, 직업별 인원수를 출력하시오 
> aggregate(empno~job, emp, length)
        job empno
1   ANALYST     2
2     CLERK     5
3   MANAGER     3
4 PRESIDENT     1
5  SALESMAN     4

문제58. 위의 결과를 막대그래프로 그리시오 
x <- table(emp$job)

barplot(x, col=rainbow(5),main="직업별 인원수" density= 50)


문제59. (오늘의 마지막 문제 ) 입사한 년도(4자리), 입사한 년도별 토탈 월급을 출력하는데  그 결과를 막대그래프로
시각화 하시오 

emp[format(as.Date(emp$hiredate),'%y')

x <- table(format(as.Date(emp$hiredate),'%y'))
barplot(x, col=rainbow(4),main="Year",density= 50)


- 생각해야 할 문제 : months_betwenn 을 R로 구현 






6월 22일 ~ 7월 13일 : R 기본 문법 수업
                         +
                    R을 활용한 기계학습 책 (2장 ~ 10장) 
                    평가 : 1. 매일 쪽지 시험 ( 체크리스트)
                          2.데이터 시각화 (본인이 관심잇는 분석할데이터 평산시에 미리 수집) 

                              ↓
                         1.https://www.data.go.kr = 공공데이터 포탈 
                         2.데이터를 자체적으로 수집 

                         원지은 " 기사 갯수와 주식 거래량과의 상관 관계 "

분석할 데이터들을 수집하고 계셔라 





#정렬 orderBy
install.packages("doBy")
library(doBy)

     #데이터 테이블 표현
install.packages('data.table')
library(data.table)


 
mean == avg


세로 출력 : aggregate
가로 출력 : table ( R 책 2장 ) 

문제60. 직업, 직업별 평균월급을 가로, 세로로 출력하시오 ~ 


- 세로 : aggregate(sal~job,emp,mean)

> aggregate(sal~job,emp,mean)
        job      sal
1   ANALYST 3000.000
2     CLERK 1470.000
3   MANAGER 2758.333
4 PRESIDENT 5000.000
5  SALESMAN 1400.000
> table(emp,job)
소수점 안나오게 
a<-aggregate(sal~job,emp,mean)
a2 <- data.table('직업'=a$job,'월급'=trunc(a$sal))
a2

- 가로 :
 
tapply(emp$sal, emp$job, mean)
  ANALYST     CLERK   MANAGER PRESIDENT  SALESMAN
 3000.000  1470.000  2758.333  5000.000  1400.000


b<-tapply(emp$sal,emp$job,mean)

round(b)

문제62. 직업, 부서번호, 직업별 부서번호별 토탈월급을 출력하시오

tapply(emp$sal, list(emp$job, emp$deptno) ,sum)

5. list : 서로 다른 데이터 구조(vector, data frame, matrix, array)를 중첩

tapply(emp$sal, list(format(as.Date(emp$hiredate),'%Y'), emp$deptno) ,sum)
format(as.Date(emp$hiredate),'%Y')


문제63. 위의 결과중 na를 0으로 변경해서 출력하시오 !

x <- tapply(emp$sal, list(emp$job, emp$deptno) ,sum)
x[is.na(x) == T ] <- 0
X


문제64. 직업, 입사한 년도(4자리), 직업별 입사한 년도별 토탈월급을 출력하는데 NA대신에 0으로 출력되게 하시오 
attach(emp)
x<-tapply(emp$sal, list(job,format(as.Date(emp$hiredate),'%Y')),sum)
x[is.na(x)==T] <- 0
x

문제65.연도 구분하여  부서번호별 직업별 토탈 월급을 출력하시오 
답 : 
x<-tapply(emp$sal, list(deptno,job,format(as.Date(emp$hiredate),'%Y') ),sum)
x[is.na(x)==T] <- 0
x

문제66. 문제62번의 직업별 부서번호별 토탈웕브의 데이터를 막대그래프로 시각화 하시오 ! 
x<-tapply(emp$sal, list(format(as.Date(emp$hiredate),'%Y'), job) ,sum)
x[is.na(x)==T] <- 0

barplot(x,col=rainbow(7),legend=rownames(x),args.legend=list(x=10,y=8000))


> rownames(x)
[1] "1980" "1981" "1982" "1987"
> colnames(x)
[1] "ANALYST"   "CLERK"     "MANAGER"   "PRESIDENT" "SALESMAN"


로우 네임스 


barplot(x,col=rainbow(9),legend=rownames(x),args.legend=list(x=10,y=8000),beside=T)




문제67. 입사한 년도(4자리) , 직업, 입사한 년도 (4자리) 별 직업별 토탈월급을 막대 그래프로 시각화 하시오 ! 
직업 -> 세로 
입사년도 -> 가로 

x<-tapply(emp$sal, list(job,format(as.Date(emp$hiredate),'%Y')) ,sum)
x[is.na(x)==T] <- 0

barplot(x,col=rainbow(7),legend=rownames(x),args.legend=list(x=10,y=8000),beside=T)

문제68.직업과 직업별 토탈 월급을 원형(pie)그래프로 그리시오! 

x2<-tapply(emp$sal,emp$job,sum)
x2[is.na(x2)==T] <- 0
pie(x2, col=rainbow(5),desity=80)

문제69. 위의 그래프를 3d로 출력하시오 ! 

install.packages("plotrix")
library(plotrix)
pie3D(x2,explode = 0.1)


문제70. 위의 그래프에서 비율도 같이 출력하시오 ! 

install.packages("plotrix")
library(plotrix)
pie3D(x2,explode = 0.0653,labels=rownames(x2))


x <- aggregate(sal~job,emp,sum)
pct <- round(x$sal/sum(emp$sal) * 100,1)
pct

jobs <- rownames(x2)
lbls2 <- paste(jobs, ":",pct,"%")
lbls2
pie3D(x2,explode = 0.0653,labels=lbls2)

문제71. (점심시간 문제) 부서번호, 부서번호별 평균월급을 문제70과 같은 3D 파이 그래프로 시각화 하시오 
x<-aggregate(sal~deptno, emp, sum)
x
  deptno   sal
1     10  8750
2     20 10875
3     30  9400
4     70  3200


pct<-round(x$sal/sum(x$sal)*100,1)
pct
[1] 27.2 33.7 29.2  9.9

lbls<-x$deptno
lbls
[1] 10 20 30 70

lbls2<-paste(lbls,':',pct,'%')
lbls2
[1] "10 : 27.2 %" "20 : 33.7 %" "30 : 29.2 %" "70 : 9.9 %"

pie3D(x$sal, explode=0.2, labels=lbls2)



x2<-tapply(emp$sal, emp$deptno, sum)
x2
   10    20    30    70
 8750 10875  9400  3200

pct2<-round(x2/sum(x2)*100,1)
pct2
  10   20   30   70
27.2 33.7 29.2  9.9

lbls3<-rownames(x2)
lbls3
[1] "10" "20" "30" "70"

lbls4<-paste(lbls3,':',pct2,'%')
lbls4
[1] "10 : 27.2 %" "20 : 33.7 %" "30 : 29.2 %" "70 : 9.9 %"

pie3D(x2,explode=0.2, labels=lbls4)
위와 같은 결과











x <- aggregate(sal~deptno,emp,sum)
pct <- round(x$sal/sum(emp$sal) * 100,1)
pct

deptnos<- x$deptnodeptnos<- x$deptno
lbls2 <- paste(deptnos , ":",pct,"%")
lbls2
pie3D(x$sal,explode = 0.0653,labels=lbls2)

x <- aggregate(sal~deptno,emp,sum)
x
pct <- round(x$sal/sum(emp$sal) * 100,1)
pct

deptnos<- x$deptno
lbls2 <- paste(deptnos , ":",pct,"%")
lbls2
pie3D(x2,explode = 0.0653,labels=lbls2)


문제72. 서울시 물가 데이터 (price.csv)를 내려받고 price 라는 변수에 입력하시오 ! 


price <- read.csv("price.csv",header=TRUE)


문제73. tapply 함수를 이용해서 전통시장과 대형마트간의 물품별 가격 평균의 비교를 출력하시오 ! 
        대형마트        전통시장
고등어    720            500
무       100            120
          :               :

A_PRICE     가격
A_NAME       물품
M_TYPE_NAME   전통시장 / 대형마트 




attach(price)
q73<-tapply(A_PRICE,list(A_NAME,M_TYPE_NAME),mean)
q73[is.na(q73==T)] <- 0 
round(q73)


문제74. 위의 결과를 막대 그래프로 그리시오 

barplot(q73, main="서울시 물가 데이터", col=c("Gold","Moccasin"),beside=TRUE,horiz=TRUE)


■ 조인 

    오라클   ------------------   R

equijoin
non equi join                    merge
outer join
self join


emp.csv 외 기타 csv

dept <- read.csv ("dept.csv", header=T)

문제76. 이름과 월급과 부서위치와 부서번호를 출력하시오 !

merge(emp, dept, by="deptno")[ ,c("ename","sal","loc")]


문제77. 부서위치가 DALLAS인 사원들의 이름과 월급과 부서위치를 출력하시오 !

 
a<-merge(emp, dept, by="deptno")[,c("ename","sal","loc")]
a[a$loc=="DALLAS",c("ename","sal","loc")]


merge(emp, dept, by="deptno")[merge(emp, dept, by="deptno")[,c("ename","sal","loc")] $loc=="DALLAS",c("ename","sal","loc")]

문제78. 월급이 1200 이상이고 직업이 SALESMAN 인 사원들의 이름과 월급과 직업과 부서위치를 출력하시오 ! 

m <- merge(emp,dept,by='deptno')[ , c('ename','sal','job','loc')]
m[m$sal>=1200 & m$job =='SALESMAN',]


merge(emp[emp$sal >= 1200, c(emp$ename,emp$job,emp$deptno)], dept[,c(dept$loc,dept$deptno)], by="deptno")


문제79. 커미션이 na인 사원들의 이름과 부서위치와 커미션을 출력하시오 

m <- merge(emp,dept,by='deptno')[ , c('ename','loc','comm')]
m[is.na(m$comm) ,]


 문제80. 부서번호가 10,20 인사원들의 이름과 우러급과 부서위치 부서번호를 출력하시오
merge(emp[emp$deptno %in% c('10','20') ,] ,dept,by='deptno')[,c('ename','sal','loc','deptno')]
 



문제81. 이름과 부서위치를 출력하는데 오라클의 outer join과 같은 결과를 출력하시오 

SQL : 

select e.ename, d.loc
  from emp  e, dept d
 where e.deptno (+)= d.deptno;

R : 
merge (emp, dept, by="deptno", all.y=T) [ ,c("ename","loc")]

 

문제82. 아래의 SQL의 결과를 R로 구현하시오 

-SQL  :

SELECT e.ename, d.loc
from emp e, dept d
where e.deptno = d.deptno (+);

- R

merge (emp, dept, by="deptno", all.x=T) [ ,c("ename","loc")]


문제83. 아래의 SQL의 결과를 R로 구현하시오 ! 
- SQL : 
     SELECT e.ename, d.loc
     from emp e full outer join dept d 
     on (e.deptno = d.deptno) ;

- R :


merge (emp, dept, by="deptno", all.x=T) [ ,c("ename","loc")]

문제84. 이름과 자기 직속상사의 이름 ( 관리자 ) 를 출력하시오 !

- SQL :  select e.ename, m.ename
          from emp e, emp m
          where e.mgr = empno;

- R   :
merge (emp, emp, by.x="empno", by.y="empno") [ ,c("ename.x","ename.x")]


문제85. 자기의 직속상사보다 먼저 입사한 사원들의 이름을 출력하시오 

a<-merge (emp, emp, by.x="mgr", by.y="empno") [ ,c("ename.x","ename.y","hiredate.x" ,"hiredate.y")]
a
a[as.Date(a$hiredate.x) < as.Date(a$hiredate.y) ,]
 


문제86. 자기의 직속상사보다 더 많은 월급을 받는 사원들의 이름과 월급을 출력하시오 



SQL : select e.ename
        from emp e, emp m
       where e.mgr = m.ename and e.sal > m.sal;
 
a<-merge (emp, emp, by.x="mgr", by.y="empno") [ ,c("ename.x","ename.y","sal.x" ,"sal.y")]
a[a$sal.x > a$sal.y ,]


문제87. 사원이름, 직속상사의 이름을 가지고 시각화 하시오  ~!
     (사원테이블의 조직도를 그려라 )
install.package("igraph")
library(igraph)

a<- merge(emp,emp,by.x="mgr",by.y="empno") [ ,c('ename.x','ename.y')]
a
b <- graph.data.fram(a.directed=T)
plot(b)

문제88. 위의 그래프를 구글의 googleVis 를 이용해서 emp 테이블의 관계도를 그리시오 

install.packages("googleVis")
library(googleVis)

org <- gvisOrgChart(a, idvar="ename.y", parentvar="ename.x", option=list(width=600, height=250,size='middle',allowCollapse=T))
plot(org)


왕 대바기다!! 

문제89. 

x <- merge(emp,dept

aggregate(x$sal~x$loc,x,sum)
전처리 최적화 가져오기 => 파이썬 코드 

상속 객체 사용 




■ 조인을 R로 구현하는 방법

SQL ------------------------ R
JOIN 문법                    Merge

1.equi join
2.outer join
3.self join
4.non equi join

-SQL : select d.loc, sum(e.sal) 
        from emp e, dept d
          where e.deptno = d.deptno
          group by d.loc
-R :
a<-merge (emp, dept, by='deptno')
b<-tapply(a$sal, a$loc, sum)
b


c<-aggregate(a$sal~a$loc,a,sum)
c


문제90. aggregate 를 이용할때도  boston이 나오게하려면 어떻게 해야하는가
x <- merge(emp,dept,by='deptno',all=T)
x[is.na(x)==T] <-0
aggregate(x$sal~x$loc,x,sum)










문제91. 부서위치, 직업, 부서위치별 직업별 토탈월급을 출력하시오 ~

          ANALYST      CLARK     SLAESMAN      MANAGER      PRESIDENT
NEW YORK
DALLAS
CHICAHO
BOSTON
x <- merge(emp,dept,by='deptno',all=T)

c<- tapply(x$sal ,list(x$loc,x$job),sum)
c[is.na(c)==T] <-0
c



문제92. 부서위치, 입사한 년도 (4자리) , 부서위치별 입사한 년도별 평균월급을 아래와 같이 출력하시오 !
x<- merge(emp,dept,by='deptno',all.y=T)

c<-tapply(x$sal ,list(x$loc,format(as.Date(x$hiredate),'%Y')),mean)
c
c[is.na(c) == T]<- 0
c


문제93. 부서위치 ,입사한 요일 , 부서위치 별 입사한 요일별 인원수를 


x <- merge(emp,dept,by='deptno',all.y=T)

d<-tapply(x$sal ,list(x$loc,format(as.Date(x$hiredate), '%A') ),length)
d
d[is.na(d)==T] <- 0
d
문제94. 위의 결과를 월화수목으로 출력되게 하시오 

data.table(emp$ename ,format(as.Date(emp$hiredate), '%A'))

library(data.table)
x<-emp[order(format(as.Date(emp$hiredate),'%u')),c('ename','hiredate')]
x
x<-data.table(ename=x$ename, hireday=format(as.Date(x$hiredate),'%A'))
x

tapply(ename=x$ename, list(hireday,x$ename),length)
tapply(ename=x$ename, list(format(as.Date(x$hiredate),'%A') ,x$ename),length)
문제95. (점심시간 문제) 부서위치, 입사한 요일, 부서위치별 입사한 요일별 인원수를 막대 그래프로 시각화 하시오 ! 






문제96.근무지역별 총 월급 구글 바차트로 

install.packages("googleVis")
library(googleVis)

x<-merge(emp, dept, by="deptno", all=T)
x2<-aggregate(x$sal~x$loc,x,sum)
x3 <- data.table(x2)
x4 <- gvisBarChart(x3)
plot(x4)




문제97. 부서명 , 부서명별 평균 월급을 구글 막대 그래프로 그리시오 

x<-merge(emp, dept, by="deptno")
x2<-aggregate(x$sal~x$dname,x,mean)
x3 <- data.table(x2)
x4 <- gvisBarChart(x3)
plot(x4)


문제98. 지하철 1~4호선 승하차 승객수.csv 파일을 R 로 로드해서 line no 컬럼과 time 컬럼을 이용해서 
구글 모션차드를 생성하시오 !

line <- read.csv("1~4호선승하차승객수.csv",header=T)
line
t1 <- gvisMotionChart(line,idvar="line_no", timevar="time")

문제99. 지하철 5호선 8호선 그래프도 그리시오 


문제100. 부서위치, 입사한 년도, 부서위치별 입사한 년도별 토탈월급을 출력한 결과를 구글 파이 차트로 colum chart로 시각화하시오 


x <- merge(emp,dept,by='deptno',all.y=T)
c<-tapply(x$sal ,list(x$loc,format(as.Date(x$hiredate),'%Y')),sum)
c


■ 오라클  vs    R
 concat       cbind


x <- merge(emp,dept,by='deptno',all.y=T)
c <- tapply(x$sal ,list(x$loc,format(as.Date(x$hiredate),'%Y')),sum)
c[is.na(c) ==T] <- 0
c
x3 <- cbind(year=unique(format(as.Date(emp$hiredate),'%Y') ) , as.data.frame(c))
gx <- gvisColumnChart(x3)
plot(gx)

 




문제101. 부서번호, 직업 , 부서번호별 직업별 토탈월급을 구글 column Chart로 그리시오 

x <- merge(emp,dept,by='deptno',all.y=T)
c<-tapply(x$sal ,list(x$job,x$deptno),sum)
c[is.na(c) ==T] <- 0
c
x3 <- cbind(year=unique(emp$job ) , as.data.frame(c))
gx <- gvisColumnChart(x3)
plot(gx)


■ 집합 연산자

     오라클             vs           R

  1. union all                   rbind
  2. union                       rbind + unique
  3. intersect                   intersect
  4. minus                       setdiff


문제102. 아래의 SQL의 결과를 R로 구현하시오. 

- SQL :

select ename, sal, deptno 
  from emp
  where deptno in (10,20) 

union all

select ename, sal ,deptno 
  from emp 
  where deptno = 10;


- R : 

rbind ( emp[emp$deptno %in% c(10,20), c('ename','sal','deptno')],
        emp[emp$deptno == 10 , c("ename","sal","deptno")])


문제103. 부서번호, 부서번호별 토탈월급을 출력하고 맨 아래쪽에 
          전체 토탈월급을 출력하시오 ! 


rbind ( emp[emp$deptno %in% c(10,20), c('ename','sal','deptno')],
        aggregate(emp$sal,emp,sum) )


문제104. 아래의 SQL 의 결과를 R 로 구현하시오.

select ename, sal, deptno
from emp
where deptno in (10, 20)
union
select ename, sal, deptno
from emp
where deptno = 10;

   • union all 과는 다르게 중복이 제거된다.

x<-emp[emp$deptno %in% c(10,20),c('ename', 'sal', 'deptno')]
y<-emp[emp$deptno == 10,c('ename', 'sal', 'deptno')]
z<-rbind(x,y)
unique(rbind(x,y))
    ename  sal deptno
1   SMITH  800     20
4   JONES 2975     20
7   CLARK 2450     10
8   SCOTT 3000     20
9    KING 5000     10
11  ADAMS 1100     20
13   FORD 3000     20
14 MILLER 1300     10

--------------------------------------------------------------------------
문제105. 아래의 SQL 결과를 R 로 구현하시오.

SQL: 
select ename, sal, deptno
from emp
where deptno in (10,20)
minus
select ename, sal, deptno
from emp
where deptno = 10;

-R :
x <- setdiff (emp[emp$deptno %in% c(10,20), c('ename')],
                          emp[emp$deptno==10 ,c("ename")]
x <- setdiff (emp[emp$deptno %in% c(10,20),],emp[emp$deptno==10 ,])

x <- setdiff (emp[emp$deptno %in% c(10,20),],emp[emp$deptno==10 ,])
emp[ emp$ename %in% x, c('ename','sal','deptno') ]
> x
[1] "SMITH" "JONES" "SCOTT" "ADAMS" "FORD"


emp[ emp$ename %in% x, c('ename','sal','deptno') ]



c('ename','sal','deptno')


x <- setdiff (emp[emp$deptno %in% c(10,20),c('ename','sal','deptno') ] ,emp[emp$deptno==10 ,c('ename','sal','deptno') ])


문제106. 아래의 결과를 R로 구현하시오 !

- SQL : 

select ename, sal , deptno
  from emp 
 where deptno in (10,20)
intersect
select ename, sal ,deptno
  from emp
 where deptno = 10 ;

 
- R : 

x <- intersect( emp[emp$deptno %in% c(10,20),c('ename') ],
               emp[emp$deptno==10,c('ename')])

emp[ emp$ename %in% x, c('ename','sal','deptno') ]

■ 서브쿼리 

  • 오라클의 서브쿼리의 종류
1.single row subquery
2.multiple orw subquery
3.multiple column subquery

문제107. JONES의 월급보다 더 많은 월급을 받는 사원들의 이름과 월급을 출력하시오 ! 
- SQL :  
select ename, sal 
  from emp
 where sal > (select sal 
               from emp 
               where ename = 'JONES') ;


- R 

jonessal <- emp[emp$ename=='JONES',c("sal")]

emp[ emp$sal > jonessal , c('ename','sal') ]

문제108. 사원 테이블에서 가장 많은 월급을 받는 사원의 이름과 월급을 출력하시오!

y<-emp[emp$job == 'SALESMAN', c(max(emp$sal) )



emp[emp$sal == max(emp$sal) , c('ename','sal')]
문제109. 전국에서 등록금이 가장 비싼 학교이름과 등록금을 출력핫외

data 게시판에서 전국_대학별등록금통계_현황.csv 를 내려받고 
등록금이 가장 비싼학교를 보자 

univ[univ$등록금.A.B. == max(univ$등록금.A.B.) , c("학교명","등록금.A.B.")]


문제110. 집업이 SALESMAN인 사원들중에서의 최대월급보다 더 큰 월급을 
     받는 사원들의 이름과 월급을 출력하시오 ! 
 a<-emp[emp$job == 'SALESMAN', ]
 emp[emp$sal> max(a$sal) ,]
   empno ename       job  mgr   hiredate  sal comm deptno
4   7566 JONES   MANAGER 7839 1981-04-02 2975   NA     20
6   7698 BLAKE   MANAGER 7839 1981-05-01 2850   NA     30
7   7782 CLARK   MANAGER 7839 1981-06-09 2450   NA     10
8   7788 SCOTT   ANALYST 7566 1987-04-19 3000   NA     20
9   7839  KING PRESIDENT   NA 1981-11-17 5000   NA     10
13  7902  FORD   ANALYST 7566 1981-12-03 3000   NA     20
15  9292  JACK     CLERK 7782 1982-01-23 3200   NA     70

문제111. KING에게 보고하는 사원들의 이름과 월급을 출력하시오 ! 

- SQL :

select ename,sal
  from emp
 where mgr = ( select empno
                 from emp
               where ename='KING');

- R : 
     
king<- emp[emp$ename =='KING' , 'empno']
emp[emp$mgr == king, c('ename','sal')]

na.omit(emp[emp$mgr == king, c('ename','sal')])
      
al<- emp[emp$ename =='ALLEN' , 'hiredate']
emp[as.Date(emp$hiredate) > as.Date(al) , c('ename','hiredate')]


설명 : NA는 결손값, 데이터가 없다라는 뜻

문제112, 커미션이 300 인 사원들의 이름과 커미션을 출력하시오 ! 

na.omit(emp[emp$comm == 300, c('ename','comm')])




na.omit(emp[is.na(emp$comm)==T, c('ename','comm')])
문제113. 관리자인 사원들의 이름을 출력하시오 ! 
         (오늘의 마지막 문제)
- SQL : select ename
          from emp
         where empno in ( select mgr from emp);

- R :  
mgr<- emp [, 'mgr']
data.table[emp$empno %in% mgr , 'ename']

 data.table(emp[emp$empno %in% mgr , 'ename'])

data.table(emp[emp$empno %in% emp$mgr,"ename")] )


======================================================================================
6월 28일

 
■ R 수업복습 
     "R을  활용한 기계학습"

1.R기본문법
                    SQL        vs       R
     - 연산자 
     - 함수  :    1.단일행 함수
                 2.복수행 함수
     - 조인

     - 서브쿼리

     - R 함수 : PL/SQL 또는 파이썬의 함수 ----> 감정분석 함수 

     - 그래프 : 막대, 원형, Plot, 사분위수, 특수 그래프 
     
2.R을 활용한 기계학습 2장 - R 기본문법
3.R을 활용한 기계학습 3장 - knn
4.~ R을 활용한 기계학습 10장
5.R을 활용한 기계학습 1장 

취업지원센터 : 이력서 특강 ---> 개별 면담 2시 30분 ~ 3시 30분



■ 서브쿼리:

문제114. 관리자가 아닌 사원들의 이름을 출력하시오 
SQL : 
select ename 
  from emp 
  where empno not in (select mgr
                        from emp 
                        where mgr is not null) ;



data.table(emp[!emp$empno %in% emp$mgr,"ename"] )

문제115. 작년에 아파트에서 가장 많이 발생한 범죄 유형은 무엇인가? 

max_crime <- max(crime_loc[crime_loc['장소']=="아파트",c("건수")] )
crime_loc[crime_loc['건수']==max_crime, c("범죄")]
 
 max(orderBy(~-건수,cl[cl$장소=="학교",] ))

문제116. 학교에서 가장 많이 발생하는 범죄 유형은 무엇인가? 

max_crime <- max(crime_loc[crime_loc['장소']=="학교",c("건수")] )
crime_loc[crime_loc['건수']==max_crime, c("범죄")]
 

orderBy(~-건수,cl[cl$장소=="학교",] )

문제117. 강력범죄가 가장 많이 발생하는 요일은 언제인가?
cd <- read.csv("crime_day.csv",header=TRUE)
a<-cd[cd['C_C'] =='강력범죄' ,'CNT']
cd[cd$C_C =='강력범죄' & cd$CNT==max(a),'DAY']



b<-cd[cd['C_C'] =='강력범죄' ,]
orderBy(~-CNT,b )
 
■ 순위가 출력되게 R로 구현 

         오라클           vs           R
     dense_rank                     rank








문제118. 이름 ,월급, 월급에 대한 순위를 출력하시오 

data.table(emp$ename, emp$sal, rank(emp$sal, ties.method="min" ))
설명 :
ties.method="min" 은 오라클의 dense_rank와 같다
ties.method="first" 은 오라클의 rank 와 같다


문제119. 위의 결과를 다시 출력하는데 순위를 1위부터 정렬해서 출력하시오 ~ 
x<-data.table(emp$ename, emp$sal, rank(emp$sal, ties.method="min" ))
names(x) <- c("ename","sal","rnk")
orderBy(~rnk,x)

문제120. (점심시간문제) 병원에서 많이 발생하는 범죄유형, 건수, 순위를 출력하시오 ~
crime_loc <- read.csv("crime_loc.csv",header=TRUE)
cl <- crime_loc[crime_loc$장소 == '병원',]
x<-data.table(cl$범죄 ,cl$건수, rank(cl$건수 , ties.method="min" ))
orderBy(~rnk,x)



 crime_loc <- read.csv("crime_loc.csv",header=TRUE)
 cl <- crime_loc[crime_loc$장소 == '병원',]
 x<-data.table(cl$범죄 ,cl$건수, rank(-cl$건수 , ties.method="min" ))
 names(x) <- c("범죄 ","건수 ","rnk")
 orderBy(~rnk,x)


문제121. 카페에서 암 발생 데이터를 내려받고 R로 로드 한 후에 
          여자들이 많이 걸리는 암(환자수로 카운트)과 그 건수와 순위를 출력하시오 ~ 

cc2 <- read.csv("cancer2.csv",header = TRUE)
 w <- cc2[cc2$성별=='여자',c("성별","환자수")]
max_cnt=max( w[!is.na(w$환자수),'환자수'])

cc2[integer(cc2$환자수)==integer(max_cnt) & cc2$성별=='여자',]




orderBy(~-암상대생존율_5Y_PC,unique(cc2[cc2$성별=='여자'& is.na(cc2$환자수)==F,]))

orderBy(~암상대생존율_5Y_PC,unique(cc2[cc2$성별=='여자'& is.na(cc2$환자수)==F,]))




 w <- cc2[cc2$성별=='여자'& cc$암종,c("성별","환자수")]
max_cnt=max( w[!is.na(w$환자수),'환자수'])




문제122. 국가별 자살률 데이터를 내려받고 R로 로드한 후에 자살률이 가장 높은 나라가 어디인지 출력하시오 

suc <- read.csv("suicide.csv",header=T)
attach(suc)
max_cnt <- max(suc[, "NAME"])

suc[ suc$NAME==max_cnt,]



데이터 개발자
데이터 분석가 

7가지 전략
1.인맥 ㅠㅠ(유연수 선생님 사랑합니다 & 수강생 친구들 사랑합니다!!)
2.사이트 
3.자격증 
정보처리기사 
sqld
vca 
adsp
통신 금융 공공 (데이터가 많아 )
포트폴리오 화! 

rdb에 대해?
pythonpath 환경변수의 목적?
파이썬에서 지원되는 데이터 유형은?
전통적인 rdbms와 하둡사이의 기본적인 차이점? 


문제123. 카페에서 서울시 교통사고 발생 데이터를 내려받고 
R로 로드한 후에 교통사고가 가장 많이 발생하는 지역과 건수와 순위를 출력하시오 !

car<- read.csv("car_accident.csv",header=T)
     기준년도     지자체                        지점        발생건수.건.    사고유형
  1. 2009        서울    용산역 앞 용산 이-마트 가는길            6          고령자


a<-data.table(car$loc,car$loc_desc, car$cnt, rank(-car$cnt , ties.method="min" ))
names(a) <- c('지역','자세히','건수','등수')
a

orderBy(~등수,a)





q123 <-data.table('지역' = car_accident$자세히,'rnk'=car_accident$건수,'등수'=rank(-car_accident$건수.,ties.method = "first"))


orderBy(~등수,q123) 





q123 <-data.table('장소' = car_accident$지점,'건수'=car_accident$발생건수.건.,'순위'=rank(-car_accident$발생건수.건.,ties.method = "first"))


orderBy(~순위,q123) 







■ R 함수 생성하는 방법
*R 함수 생성 방법

함수명 <- function( 인수 또는 입력값 ){
              계산처리1
              계산처리2
          return (계산 결과 반환 ) 
                         }

문제124. 직업을 입력하면 해당 직업의 토탈월급이 출력되게하는 함수를 
         생성하시오 !

job_sumsal <- function(x) {
          
               sumsal <- sum( emp[emp$job == toupper(x),"sal"] )
               print (sumsal) 
                         }

문제125. 위의 스크립트를 수정해서 직업을 물어보게하고 직업을 입력하면 
          해당 직업의 토탈월급이 출력되게하시오 !
          (힌트 : readline(prompt='직업을 입력하세요 ~ ') )

job_sumsal()
          
     직업을 입력하세요 ~ salesman

     토탈월급이 5600 입니다.
setwd("D:\\data")
 emp <- read.csv("emp.csv",header=TRUE)
 price <- read.csv("price.csv",header=TRUE)
 dept <- read.csv("dept.csv",header=TRUE)

job_sumsal <- function(x) {
               x <- readline(prompt='직업을 입력하세요 ~')
               sumsal <- sum( emp[emp$job == toupper(x),"sal"] )
               print (paste('토탈월급이 ',sumsal, ' 입니다') )

                         }

job_sumsal()


문제126. 카페에서 감정 분석 함수 코드와 데이터를 내려받고 
          메이저리그 구단의 트윗글을 분석해서 그 트윗그링 긍정적인지 
          부정적인지를 확인하는 함수를 생성하시오 ! 

6. 감정분석 함수 in R |11. R 수업



 
install.packages("twitteR")           # R로 트위터의 글들을 스크롤링하는 패키지 
install.packages("plyr")               #시각화하려고 다운 받는 패키지들 
install.packages("stringr")          # 시각화 하려고 다운 받는 패키지
install.packages("ggplot2")          # 시각화 하려고 다운 받는 패키지

library(twitteR)    
library(ROAuth)       
library(plyr)             
library(stringr)          
library(ggplot2)        


#########################
# 3. Sentiment Function #
#########################

# library (plyr)
# library (stringr)

score.sentiment = function(sentences,       pos.words,       neg.words,       .progress='none')  
{                          #분석할 문장        긍정단어          부정단어          
  require(plyr)  
  require(stringr)      
  scores = laply(sentences, function(sentence, pos.words, neg.words) {  
    # clean up sentences with R's regex-driven global substitute, gsub():  
     #gsub 는 replace 함수에요 gsub를 이용해서 데이터 정제작업을 수행

    sentence = gsub('[[:punct:]]', '', sentence)      # 마침표 제외 
    sentence = gsub('[[:cntrl:]]', '', sentence)      # ^C 를 제외
    sentence = gsub('\\d+', '', sentence)             # 문자가 아닌것 (숫자들을 제외하겠다.)

    # and convert to lower case:  
    # 문장을 전부다 소문자로 변경

    sentence = tolower(sentence)  

    # split into words. str_split is in the stringr package 
    # 문장을 단어별로 쪼개는 작업

    word.list = str_split(sentence, '\\s+') 

    # sometimes a list() is one level of hierarchy too much  
    # 쪼갠 단어들을 unlist 함수로 변환

    words = unlist(word.list) 

    # compare our words to the dictionaries of positive & negative terms  
    # 쪼갠 단어들과 긍정단어 사전과 비교작업
    # 쪼갠 단어들과 부정단어 사전과 비교작업

    pos.matches = match(words, pos.words) 
    neg.matches = match(words, neg.words)  

    # match() returns the position of the matched term or NA  
    # we just want a TRUE/FALSE:  
    # 비교된 결과중에 NA 가 포함되어있는 데이터를 제외시킨다. 

    pos.matches = !is.na(pos.matches)  
    neg.matches = !is.na(neg.matches)  
    
    # and conveniently enough, TRUE/FALSE will be treated as 1/0 by sum():  
    # 긍정의 합계와 부정의 합계의 차이를 구한다. 

    score = sum(pos.matches) - sum(neg.matches)
    return(score)  
    
  }, pos.words, neg.words, .progress=.progress )  
  scores.df = data.frame(score=scores, text=sentences)  
  return(scores.df)  
}

#######################################
# 4. Scoring Tweets & Adding a column #
#######################################

# Load sentiment word lists
hu.liu.pos <- scan("positive-words.txt", what='character', comment.char=';')
hu.liu.neg <- scan("negative-words.txt", what='character', comment.char=';')

# Add words to list
pos.words <- c(hu.liu.pos, 'upgrade')                
neg.words <- c(hu.liu.neg, 'wtf', 'wait','waiting', 'epicfail', 'mechanical')  

# Import 3 csv
DatasetDodgers      <- read.csv("DodgersTweets.csv")
DatasetDodgers$text <- as.factor(DatasetDodgers$text)
DatasetRangers   <- read.csv("RangersTweets.csv")
DatasetRangers$text <- as.factor(DatasetRangers$text)
DatasetOrioles      <- read.csv("OriolesTweets.csv")
DatasetOrioles$text <- as.factor(DatasetOrioles$text)
 
# Score all tweets 
Dodgers.scores <- score.sentiment(DatasetDodgers$text, pos.words,neg.words, .progress='text')
Rangers.scores <- score.sentiment(DatasetRangers$text, pos.words,neg.words, .progress='text')
Orioles.scores <- score.sentiment(DatasetOrioles$text, pos.words,neg.words, .progress='text')
write.csv(Dodgers.scores,file='DodgersScores.csv',row.names=TRUE)
write.csv(Rangers.scores,file='RangersScores.csv',row.names=TRUE)
write.csv(Orioles.scores,file='OriolesScores.csv',row.names=TRUE)

Dodgers.scores$Team <- 'LA Dodgers'
Rangers.scores$Team <- 'Texas Rangers'
Orioles.scores$Team <- 'Baltimore Orioles'

##################
# 5. Visualizing # 
##################

hist(Dodgers.scores$score, col="bisque")
qplot(Dodgers.scores$score)

hist(Rangers.scores$score, col="bisque")
qplot(Rangers.scores$score)

hist(Orioles.scores$score, col="bisque")
qplot(Orioles.scores$score)


# Comparing 3 data sets
all.scores <- rbind(Rangers.scores, Dodgers.scores, Orioles.scores)
ggplot(data=all.scores) +                                           
  geom_bar(mapping=aes(x=score, fill=Team), binwidth=1) +
  facet_grid(Team~.) +                                              
  theme_bw() + 
  scale_fill_brewer()                                              

  


-*






막대그래프 
   - 그래프 : 막대, 원형, Plot, 사분위수, 특수 그래프
■ R 그래프 그리는 방법

  1. 막대 그래프 
  2. 원형 그래프 
  3. 라인(plot) 그래프 
  4. 특수 그래프 (지도 ,소리 시각화, 워드 클라우드) 
  5. 사분위수 그래프 ( 평균, 중앙값, 이상치) <--- 머신러닝 2장 

■ 1. 막대 그래프 

그래프 그리는 R 함수 ? barplot

문제127. emp 테이블의 월급으로 기본적이 막대 그래프를 그리시오 ! 

barplot(emp$sal) 

문제128. 위의 그래프의 제목을 Salary Bar Chart 라고 이름을 붙이시오 ! 

barplot(emp$sal, main="Salary Bar Chart",names.arg=emp$ename ) 


barplot(emp$sal, main="Salary Bar Chart",names.arg=emp$ename,ylab="Salary")

barplot(emp$sal, main="Salary Bar Chart",names.arg=emp$ename,ylab="Salary" ,col=rainbow(15))


문제131. 치킨집 년도별 창업건수를 막대 그래프로 시각화 하시오 ! 

create_cnt  <- read.csv("창업건수.csv", header=T)

drop_cnt <- read.csv("폐업건수.csv",header=T)

create_cnt
drop_cnt


barplot(create_cnt$치킨집, main="년도별 치킨집 창업건수",names.arg=create_cnt$X,ylab="창업건수" ,col=rainbow(15))




막대그래프는 1000 을 넘엇는데 y축이 1000밖에 안나온다 그래서 해결책 :


barplot(create_cnt$치킨집, main="년도별 치킨집 창업건수",names.arg=create_cnt$X,ylab="창업건수" ,col=rainbow(15),ylim=c(0,1500) )


문제132. 치킨집 년도별 창업 건수, 폐업건수를 막대 그래프로 시각화 하시오 ! 

barplot(rbind(create_cnt$치킨집,drop_cnt$치킨집), main="년도별 치킨집 창업건수",names.arg=create_cnt$X,ylab="창업건수" ,col=c("blue","red"),ylim=c(0,4000),beside=T )

문제133. (점심시간 문제 ) 위의 결과에서 legend를 이용해서 아래와 같이 결과를 출력하시오 




barplot(rbind(create_cnt$치킨집,drop_cnt$치킨집), main="년도별 치킨집 창업건수",names.arg=create_cnt$X,ylab="창업건수" ,col=c("blue","red"),ylim=c(0,4000),beside=T ,legend.text = c("창업", "폐업") )



■ R 그래프 그리는 방법

  1. 막대 그래프 
  2. 원형 그래프 
  3. 라인(plot) 그래프 
  4. 특수 그래프 (지도 ,소리 시각화, 워드 클라우드) 
  5. 사분위수 그래프 ( 평균, 중앙값, 이상치) <--- 머신러닝 2장 



  1. 원형(pie) 그래프!!

문제134. 사원 테이블의 월급으로 원형 그래프를 그리시오 

pie(emp$sal) 

문제135. 위의 그래프를 다시 출력하는데 누구의 월급인지가 명시되게 하시오 ! 

pie(emp$sal, main="Salary Pie Chart", labels=emp$ename, col=rainbow(15))


문제136. 위의 그래프에 월급의 비율을 붙여서 출력하시오 ! 

sal_labels <- round(emp$sal/sum(emp$sal) * 100, 1) 
sal_labels


sal_labels2 <- paste(emp$ename,sal_labels,"%")
sal_labels2


pie(emp$sal, main="Salary Pie Chart", labels=sal_labels2 , col=rainbow(15))



문제137. 2014년도의 각 업종별 창업 비율을 아래와 같이 원형 그래프로 그리시오 ! 


p <- read.csv("창업건수.csv")
a<- rbind(p[p$X==2014,c("미용실")], 
      p[p$X==2014,c("양식집")],
      p[p$X==2014,c("일식집")],
      p[p$X==2014,c("치킨집")],
      p[p$X==2014,c("커피음료")],
      p[p$X==2014,c("한식음식점")],
      p[p$X==2014,c("호프간이주점")]
      )

b<- data.frame("건수"=a , "업종"=c("미용실", "양식집","일식집", "치킨집","커피음료","한식음식집","호프간이주점"))
b2<-data.frame(b$건수, b$업종, "rank"=rank(-b$건수, ties.method = "min"))
b2[order(b2$rank),]
labels2 <- round(b2$b.건수 /sum(b2$b.건수 ) * 100, 1) 
labels3 <- paste(b2$b.업종,labels2 ,"%")
pie(b2$b.건수, main="Salary Pie Chart", labels=labels3 , col=rainbow(7))


선생님 코드

create_cnt  <- read.csv("창업건수.csv", header=T)

drop_cnt <- read.csv("폐업건수.csv",header=T)


x<- create_cnt[create_cnt$X=='2014',]
x



년도는 제끼고 싶을 ㄷ ㅐ

x2<- x[,(2:8)] #2번째 부터 7번재 컬럼까지 가져와라 ! 


cnt_labels <- round(x2/sum(x2) * 100, 1) 
cnt_labels


컬럼명만 뽑아 내고 싶을 때


cnt_labels
t(cnt_labels)


cnt_labels2  <- paste(colnames(cnt_labels),t(cnt_labels),"%")
cnt_labels2t


data.table(t(cnt_labels))


labels2 <- round(b2$b.건수 /sum(b2$b.건수 ) * 100, 1) 
labels3 <- paste(b2$b.업종,labels2 ,"%")
pie(b2$b.건수, main="Salary Pie Chart", labels=labels3 , col=rainbow(7))

x7 <- as.vector(t(cnt_labels))


pie(x7 , labels=cnt_labels2 , col=rainbow(7))

pie( t(cnt_labels) , labels=cnt_labels2 , col=rainbow(7))

문제138. 2013년도의 위의 원형 그래프를 그리


x<- create_cnt[create_cnt$X=='2013',]
x2<- x[,(2:8)] 
labels2 <- round(b2$b.건수 /sum(b2$b.건수 ) * 100, 1)
labels3 <- paste(b2$b.업종,labels2 ,"%")
pie( t(cnt_labels) , labels=cnt_labels2 , col=rainbow(7))


graphics.off()
par(mfrow=c(1,2), new=T)
par(mar=c(5,5,0,0))


x<- create_cnt[create_cnt$X=='2013',]
x2<- x[,(2:8)] 
x_labels <- round(x2 /sum(x2) * 100, 1)
x_labels2<- paste(colnames(x_labels),t(x_labels) ,"%")
x7 <- as.vector(t(x_labels ))
pie(x7 , labels=x_labels2 , main="2013년도 치킨집 창업", col=rainbow(7),density=90 )

zx<- create_cnt[create_cnt$X=='2014',]
zx2<- zx[,(2:8)] 
zx_labels <- round(zx2 /sum(zx2) * 100, 1)
zx_labels2<- paste(colnames(zx_labels ),t(zx_labels ) ,"%")
zx7 <- as.vector(t(zx_labels ))
pie(zx7 , labels=zx_labels2, main="2014년도 치킨집 창업", , col=rainbow(7),density=90 )

■ 3. 라인(plot) 그래프
문제139. 아래의 점(plot) 그래프를 그리시오 !

cars <- c(1,3,6,4,9)
cars

plot(cars)

문제140. 위의 그래프에 파란색 선을 그리시오  !
plot(cars, type="o", col="blue")

문제141. 차와 트럭의 팔린 댓수를 라인 그래프로 시각화 하시오 !

graphics.off()
cars<- c(1,3,6,4,9)
trucks <- c(2,5,4,5,12)
c<-c(1,2,3,4,5)
plot(cars,type="o", col="blue", ylim=c(0,12)) 

그래프 창 닫지 말고 바로 이어서

lines(trucks, type="o", pch=21, lty=3, col="red")
lines(c, type="o", pch=1, lty=1, col="purple")


문제132. 다시 위의 그래프 2개의 그래프를 아래의 순서대로 시각화 작업을 하시오  !

graphics.off()
cars <- c(1,3,6,4,9)
trucks <- c(2,5,4,5,12)

g_range<- range(0,cars,trucks)
g_range

plot(cars, type="o", col="blue", ylim=g_range, axes=FALSE, ann=FALSE)

     axes=FALSE ---> x 축 안나오게하라 !
     ann=FALSE  ---> x 축의 라벨도 안나오게 해라 ! 

axis(1, at=1:5, lab=c("Mon","Tue","Wed","Thu","Fri") )
     ↑
     x축을 의미 2는 y축
axis(2)

box()


lines(trucks, type="o", pch=22,lty=2,col="red")
                            ↑      ↑
                           네모    점선

 
 title(xlab="Days" , col.lab=rgb(0,0.5,0))

 title(xlab="Total" , col.lab=rgb(0,0.5,0))


legend(1, g_range[2], c("cars","trucks") , cex=0.8,
          col=c("blue","red"), pch=21:22, lty=1:2) 

pch=21 : 동그라미          lty = 1 : 직선
pch=22 : 네모              lty = 2 : 점선

cex = 0.8 : 글씨크기 

문제143. 년도별 치킨집 창업수와 카페 창업수를 라인 그래프로 그리시오 !



graphics.off()
d<- drop_cnt[,5]
c <- create_cnt[,5]
g_range<- range(0,d,c)
g_range
plot(d, type="o", col="blue", ylim=g_range, axes=FALSE, ann=FALSE)
axis(1, at=1:10, lab=c("2005" , "2006" , "2007" , "2008" , "2009" , "2010" , "2011" , "2012" , "2013" , "2014" ) )
title(main="치킨집 창업/폐업 현황",col.main="red", font.main=4)  


axis(2)

box()
lines(c, type="o", pch=22,lty=2,col="red")
       
 title(xlab="연도" , col.lab=rgb(0,0.5,0))
 title(ylab="점포수" , col.lab=rgb(0,0.5,0))
legend(1, g_range[2], c("폐업","창업") , cex=0.8, col=c("blue","red"), pch=21:22, lty=1:2) 




■ 특수 그래프 (소리를 시각화 ) 

소리를 시각화 하는것이 왜 중요한가? !

문제144. 지금 방금 들은 output.wav 파일을 시각화 하시오 ! 

install.packages('tuneR')
library(tuneR)

audio <- readWave("output.wav")
head(audio@left,100)


plot(head(audio@left,100))

sohot<- readWave("sohot.wav")
head(sohot@left,1000)
plot(head(sohot@left,100))

문제145. 원더걸스의 so hot을 시각화 하시오 ! 


문제146. 정상적인 심장박동 소리를 포함해서 비정상적인 심장 박동소리를 각각 시각화 하시오 

audio1<- readWave("normal.wav")
audio2<- readWave("ps.wav")
audio3<- readWave("mr.wav")
audio4<- readWave("ar.wav")

plot(audio1)

문제147. 위의 4개의 그래프를 하나의 화면에 동시에 출력될 수 있게 하시오 

graphics.off()
par(mfrow=c(2,2), new = T)
par(mar=c(1,1,1,1))

plot(audio1)
plot(audio2)
plot(audio3)
plot(audio4)

 
문제148. seewave 패키지를 다운받아 sohot을 실시간 시각화 하시오 !

install.packages("seewave")
library("seewave")
a <- readWave("output.wav")
play(a)

specs <- dynspec(a, f=8000, plot= FALSE)$amp

out <- apply(specs, f=8000, MARGIN=2, FUN = fbands, bands = 20, col = "orange", ylim=c(0,max(specs))) 

out


































 




 


 라인 (plot) 그래프의 배경을 변경하는 방법
  1. 태양(sun.jpg) 배경 사진을 다운 받는다.
  2. jpeg 패키지를 설치한다

graphics.off()
install.packages("jpeg")
library(jpeg)

  1. plot 그래프의 배경을 sun.jpg로 변경한다.

ima <- readJPEG("D:\\data\\sun.jpg")
plot(1:2,type='n',main="plotting over an image", xlab='x', ylab='y')

lim <- par()

rasterImage(ima,lim$usr[1],lim$usr[3],lim$usr[2],lim$usr[4])

grid()

lines(c(1,1.2,1.4,1.6,1.8,2.0), c(1,1.3,1.7,1.6,1.7,1.0), type="b", lwd=5, col='gold')



문제149. plot 그래프를 다시 그리는데 고야잉 사진 또는 개사진으로 변경해서 그리시오 !

■ 특수 그래프 (


install.packages("maps")
install.packages("mapproj")

library(maps)
library(mapproj)

map("world")
map("world,"china")


문제152. 구글 지도 그래프를 이요해서 서울지역의 지하철 2호선의 그래프를 시가고하 하시오 

서울지하철 2호선 위경도 정보.csv
서울지하철 3호선 위경도 정보.csv

install.packages("ggplot2")
 install.packages("ggmap")
 library(ggplot2)
 library(ggmap)
 loc <- read.csv("서울지하철2호선위경도정보.csv",header=T)
 center <- c(mean(loc$LON),mean(loc$LAT))
 kor <- get_map(center,zoom=11, maptype="roadmap")
install.packages("ggplot2")
 install.packages("ggmap")
 library(ggplot2)
 library(ggmap)
 loc <- read.csv("서울지하철2호선위경도정보.csv",header=T)
 center <- c(mean(loc$LON),mean(loc$LAT))
 kor <- get_map(center,zoom=11, maptype="roadmap")
 kor.map <- ggmap(kor) + geom_point(data=loc,aes(x=LON,y=LAT),size=3, alpha=0.7)
 kor.map + geom_text(data=loc, aes(x=LON,y=LAT+0.005,label=역명),size=3)


문제153. 서울지하철 3호선 위경도 정보를 가지고 지하철 3호선의 그래프를 시각화하시오  !


install.packages("ggplot2")
 install.packages("ggmap")
 library(ggplot2)
 library(ggmap)
 loc <- read.csv("서울지하철3호선역위경도정보.csv",header=T)
 center <- c(mean(loc$LON),mean(loc$LAT))
 kor <- get_map(center,zoom=11, maptype="roadmap")
install.packages("ggplot2")
 install.packages("ggmap")
 library(ggplot2)
 library(ggmap)
 loc <- read.csv("서울지하철3호선역위경도정보.csv",header=T)
 center <- c(mean(loc$LON),mean(loc$LAT))
 kor <- get_map(center,zoom=11, maptype="roadmap")
 kor.map <- ggmap(kor) + geom_point(data=loc,aes(x=LON,y=LAT),size=3, alpha=0.7)
 kor.map + geom_text(data=loc, aes(x=LON,y=LAT+0.005,label=역명),size=3)

■ 특수 그래프 ( 워드 클라우드) 



install.packages("KoNLP")
install.packages("wordcloud")
install.packages("plyr")
install.packages("data.table")


library("data.table") 
library(KoNLP)
library(wordcloud)
library(plyr)
library(RColorBrewer) 


niv <- readLines('NIV.txt')
#텍스트 파일에서 명사만 추출하는 작업
data2 <- sapply(niv,extractNoun,USE.NAMES = F) 
data3 <- unlist(data2)  
data3 <- Filter(function(x) {nchar(x) >= 2}, data3)
data3 <- gsub("\\d+", "", data3)
data3 <- gsub("\\(", "", data3)  
data3 <- gsub("\\)", "", data3)


write(unlist(data3), "NIV2.txt") 
data4 <- read.table("NIV2.txt") 
wordcount <- table(data4)   
wordcount  
palete <- brewer.pal(9, "Set1") 
wordcloud(names(wordcount), freq=wordcount, scale=c(5,1),rot.per = 0.1, min.freq=1,random.order=F, color=T, colors=palete)


문제154. (점심시간 문제) 영화대폰 해리포터와 마법사를 다운 받아서 워드 클라우드를 그리시오 ! 


install.packages("KoNLP")
install.packages("wordcloud")
install.packages("plyr")
install.packages("data.table")

library("data.table")
library(KoNLP)
library(wordcloud)
library(plyr)
library(RColorBrewer)

niv <- readLines('hp.txt')
#텍스트 파일에서 명사만 추출하는 작업
data2 <- sapply(niv,extractNoun,USE.NAMES = F)
data3 <- unlist(data2)
data3 <- Filter(function(x) {nchar(x) >= 2}, data3)
data3 <- gsub("\\d+", "", data3)
data3 <- gsub("\\(", "", data3)
data3 <- gsub("\\)", "", data3)

write(unlist(data3), "hp.txt")
data4 <- read.table("hp.txt")
wordcount <- table(data4)
wordcount
palete <- brewer.pal(9, "Set1")
wordcloud(names(wordcount), freq=wordcount, scale=c(5,1),rot.per = 0.1, min.freq=1,random.order=F, color=T, colors=palete)






■ 어제까지 배운 내용 R 내용 복습

  1. R 기본 문법 수업 : 1주일
  2. R 기계 학습 : 
          -2장 : 기계학습 책에 나오는 내용을 이해하기휘한 기본 문법과 함수 소개하는 내용
          -3장 : knn           
               -소개팅
               -과일
               -유방암
               -폐암
          -4장 : 나이브 베이즈
          -5장 : 결정트리
 
 
■ 3장. knn (최근접 이웃을 사용한 분류의 이해)
 
  • 머신러닝의 종류
  • 1.지도학습
    • -분류:knn
    • -회귀: 
  • 2.비지도학습
  • 3.강화학습
          
               
▦ 3장 목차 
  1. knn(k-Nearest Neighbors) 란 무엇인가?
  2. knn(k-Nearest Neighbors)이 필요한 이유?
  3. knn(k-Nearest Neighbors)의 분류의 이해 
  4. knn(k-Nearest Neighbors)의 분류 실습1( 소개팅 데이터 )
  5. knn(k-Nearest Neighbors)의 분류 실습2( 과일 데이터 )
  6. 적당한 k 값 선택
  7. knn(k-Nearest Neighbors)의 분류 실습3(유방암 데이터)
  8. knn(k-Nearest Neighbors)의 분류 실습4(붓꽃 데이터)
  9. knn(k-Nearest Neighbors)의 분류 실습5(폭력과 멜로 분류) 
  10. knn(k-Nearest Neighbors)의 분류 실습6(폐암 데이터) 

▦ 1. knn(k-Nearest Neighbors) 란 무엇인가? 
- 사회적인 관계 관찰해보면?
 대략적으로 비슷한 사람끼리 모이는 성질이 있다.
 비슷한 취향의 사람들끼리 모여서 동호회를 만들고
 비슷한 부류의 계층의 사람들끼리 친분을 맺기도 한다.

- 공간적인 관계를 관찰해보면?
가구점이 모이는 상가지역이 따로 형성이 되어 있거나 
한약방이 밀집되어 있는 지역이 따로 모여있는 경우가 많다.(제기동)

이런 특성을 가진 데이터를 겨냥해서 만들어진 알고리즘이 knn이다.

▦ 2. knn(k-Nearest Neighbors)이 필요한 이유?

- knn 이 왜 필요한지?
 "유방암 종양의 크기에 대한 데이터( 반지름 , 둘레, 면적등 ) 만 
  가지고 이 종양이 악성인지 양성인지를 미리 예측할 수 있다면 
  환자에 대한 치료 스케쥴에 큰 영향을 미칠 수 있다."

- 암 발견과 치료과정 : 
  1. 건강검진 -----> 2.초음파, 내시경 ----> 3.의심되는 종양

  ----> 4. 큰 병원에 가서 조직검사를 하라고 권고 받는다. 
  ----> 5. 3~4달 후의 예약을 잡아준다.

▦ knn(k-Nearest Neighbors)의 분류의 이해 

그림


물음표가 무슨 색일까? 

"어떤 라벨(사진속 물음표)을 정의할 때 그 데이터의 주변 반경안의 
 데이터들을 조사하여 다수결로 k 개 이상이면 가장 많은 라벨로 정의하는 것이다."

 그림을 보면 정체를 알 수 없는 ? 모양의 라벨이 있는데 
이것이 빨간색인지 파란색인지
k = 3으로 놓고 본다면 

A의 경우는 Red
B의 경우는 Blue

▦ 4.knn(k-Nearest Neighbors)의 분류실습1(소개팅 데이터)


A라는 여학생이 소개팅을 수천번하지는 않기 때문에 14번정도 했다고 가정하고
그 동안 만난 남학생들에 대한 라벨을 호감라벨로 만들어서 데이터를 정리함

이 데이터를 기주능로 새로 만나게 될 남학생에 대한 데이터로만 호감레벨을 예측해본다.

- 기계학습을 기동할대는 input 데이터를 알고리즘에 맞게 잘 정제하는 작업이 필요하다 .

  1. 표준화 : R 에서는 scale()이라는 함수를 통해서 
          -1 ~ 1 사이의 데이터로 변경한다. 
     ( 키는 cm 이고 몸무게는 kg니까 서로 데이터의 범위가 달라서 
       결과가 잘 날올리가 없지 ~ 그래서 scale함수로 키와 몸무게를 
       -1 ~ 1 사이의 데이터로 변경을 해주어요 ~ )
    ====> 표준화 

  1. 정규화 : 정규분포에 속하는 데이터로 정규화를 해줘야 한다. 
             평균 및 표준편차를 기반으로 데이터 조정: 
             데이터와 평균의 차이를 표준편차로 나눈다. 

               값 - 평균값
     정규화 : -------------
                표준편차 

  1. 훈련 데이터 like 데이터를 준비 

like <- read.csv('like.csv',stringAsFactor=T, header=T)

> like <- read.csv('like.csv',stringsAsFactors=T, header=T)
> colnames(like) <- c('talk','book','travel','school','tall','skin','muscle','label')



  1. 테스트 데이터를 만든다 ( 앞으로 ㅅㄱㅁ만나게 될 남학생의 데이터) 
test <- data.frame(talk=70, book=50, travel=30 , school=70, tall=70, skin=40, muscle=50)

test


test 데이터의 남학생이 1타입,2타입,3타입 인지를 알아내고자 한다. 
  1. knn을 돌리기 위한 패키지 설치 
install.packages("class")
library(class)

train <- like[,-8]
group <- like[,8]


> knnpred1 <- knn(train, test,group, k=3,prob=TRUE)
> knnpred1
[1] 3타입
attr(,"prob")
[1] 0.6666667
Levels: 1타입 2타입 3타입

문제187. k 값을 4로 하면 결과가 달라지는지 확인하시오 ~! 


안달라져

문제 188. (점심시간 문제) 나이, 월수입, 상품구매여부 3개읠 데이터를
갖는 데이터가 있다. (buy.csv) 이 데이터를 이용해서 나이가 44이고 월급이 400 만원인
사람이 상품을 구매할지 비구매할지를 knn 분류 알고리즘으로 분석하시오 !


나이와 월수입으로 상품 구매여부를 예측하는 데이터

buy <- read.csv("buy.csv", stringsAsFactors =F, header=T)
buy

   1. 나이와 월수입 데이터를 표준화 한다.

   buy$age <- scale(buy$나이)
   buy$pay <- scale(buy$월수입)

   2. 나이와 월수입 데이터를 정규화 한다.
                 값 - 평균값
   정규화 = --------------------------
                  표준편차

test<- data.frame(age=44, pay=400)
train <- buy[,c(4,5)]
lebels <- buy[,3]

test$age <- (test$age - mean(buy$나이) ) / sd(buy$나이) 

test$pay <- ( test$pay - mean(buy$월수입) ) / sd(buy$월수입)

  1. test (나이:44, 월급:400) 인 데이터를 KNN으로 돌려서 상품을 구매할지 안할지 출력하시오 

a<-knn(buy[,c(4,5)], test,buy[,3], k=3,prob=TRUE)







buy <- read.csv("buy.csv" , stringsAsFactors = F , header = T)
buy

buy$age <- scale(buy$나이)
buy$pay <- scale(buy$월수입)
buy

test <- data.frame(age=44 , pay=400)

train <- buy[,c(4,5)]
labels <- buy[,3]
train



test$age <- scale(test$age)
test$pay <- scale(test$pay)


library(class)

knnpred1 <- knn(train , test , labels , k=5 , prob=TRUE) 
knnpred2 <- knn(train , test , labels , k=6 , prob=TRUE) 
knnpred1;knnpred2


문제189. buy 데이터 프레임에 라벨이 없는 44세의 월급 400만원 데이터를 넣고 다시 scale함수를 돌려서 나이와 월급을 정규화 하고 훈련 데이터와 테스트 데이터를 나눠서 knn 함수로 테스트 데이터의 라벨을 알아내시오 . 

strip.white=T(공백을 제거해라 ) 

buy <- read.csv("buy.csv" , stringsAsFactors = F , header = T,strip.white=T )
buy<-rbind(buy,c(44,400,"")

buy$age <- scale(buy$나이)
buy$pay <- scale(buy$월수입)
train <- buy[c(1:20),c(4,5)]
labels <- na.omit(buy[c(1:20) ,3])
knn1 <- knn(train , buy[21,c(1:2)] , labels , k=5 , prob=TRUE)
knn1




buy <- read.csv("buy.csv" , stringsAsFactors = F , header = T,
                 strip.white=T)
buy2 <-  rbind( buy, c(44,400,""))
buy2$나이 <- as.integer(buy2$나이)
buy2$월수입 <- as.integer(buy2$월수입)
buy2$나이 <- scale(buy2$나이)
buy2$월수입 <- scale(buy2$월수입)
 
train <- buy2[1:20,c("나이","월수입")]
train_label <- buy2[1:20,"상품구매여부"]
test <- buy2[21,c("나이","월수입")]
library(class)
knnpred3 <- knn(train, test, train_label, k=5, prob=T)
knnpred3


▩ 5. knn(k-Nearest Neighbors)의 분류 실습2(과일 데이터) 
knn(k-Nearest Neighbors)은 한국어서 k 근접 이웃이라고 한다.
머신러닝의 분류에 쓰이는 대표적이면서 간단한 알고리즘이다.

사용되는곳: 얼굴인식, 개인영화 추천, 단백질 및 질병 추출을 위한 유전자 데이터 패턴 식별등에 활용이된다. 

문제190. 책 104쪽에 나오는 x축 단맛, y축 아삭거림에 대한 과일, 야채 단백질을 분류하는 그래프를 그리시오 

■ 책 103쪽에 나온 그래프를 그릴려면 ? 


#1. food 데이터 프레임을 만든다.


food <- data.frame(ingredient = c("apple", "bacon", "banana", "carrot",

 "celery", "cheese", "cucumber", "fish",

 "grape", "green bean", "lettuce",

 "nuts", "orange", "pear","shrimp"

 ),

 sweetness = c(10,1,10,7,3,1,2,3,8,3,1,3,7,10,2),

 crunchiness = c(9,4,1,10,10,1,8,1,5,7,9,6,3,7,3),

 class = c("Fruits","Proteins","Fruits","Vegetables",

 "Vegetables","Proteins","Vegetables",

 "Proteins","Fruits","Vegetables",

 "Vegetables","Proteins","Fruits",

 "Fruits","Proteins"))

food



#2.  토마토 데이터 만들기

tomato <- data.frame(ingredient = "tomato",

 sweetness = 6,

 crunchiness = 4)

tomato



#3.  ggplot2  그래프로 plot 그래프를 그린다.


install.packages("ggplot2")

library(ggplot2)


# par : 파라미터 지정 / pty : plot모형을 "square" 정사각형

par(pty="s")


# 그래프 그리기(version : ggplot)

#par:파라미터/xpd:모형옮기기/mar:여백설정(아래,왼쪽,위,오른쪽)


par(xpd=T, mar=par()$mar+c(0,0,0,15)) 


plot(food$sweetness,food$crunchiness,

 pch=as.integer(food$class),

 #pch=food$class, # pch는 모형 지정

 xlab = "sweetness", ylab = "crunchiness", 

 main = "What is tomato class?")


legend(10.5,10, # legend 위치 지정 

 c("Fruits", "Proteins", "Vegetables", "X"),

 pch=as.integer(food$class))


text(food$sweetness, food$crunchiness, 

 labels=food$ingredient, 

 pos = 3, # 글자위치position(1:below/2:left/3:above/4:right)

 offset = 0.3, # 좌표와 얼마나 띄어쓰기 할것인지

 cex = 0.7 ) # 문자크기



# 그래프 그리기(version : ggplot2)


ggplot(data=food,aes(x=sweetness,y=crunchiness))+

 labs(title="What is tomato class?")+ # 타이틀 명

 geom_point(aes(color=class, shape=class),size=6)+

 geom_text(aes(label=ingredient), # 라벨링 표시

 vjust=-1, # 수직으로 움직일 거리 (위는 -, 아래는 +)

 size = 5) # 문자크기

 



문제191. 토마토가 야채, 과일, 단백질 중에 어느 분류에 속하는지 knn알고리즘으로 알아내시오 

답 : 

install.packages("dplyr")
library(class)
library(dplyr)

tmt <- knn(select(food,sweetness,crunchiness),  select(tomato,sweetness,crunchiness),food$class,k=2)
tmt


토마토의 최근접 이웃을 구하기 위해서는 거리함수나 두 인스턴스 사이의 유사도를 측정하는 공식이 필요하다

거리를 계산하는데는 다양한 방법이 있는데 knn 은 유클리드 거리를 사용한다.

예 :  토마토와 green bean과의 거리

dist("pear","green bean") =  sqrt( (6-3)^2 + (4-7)^2 ) = 4.2

문제192. 토마도와 orange와의 유클리드 거리를 구하시오 

sqrt( (7-6)^2 + (3-4)^2) ) = 1.414214
 




▩ 6. 적당한 k 값 선택

 적당한 k 값을 선택해야 하는데 k 값이 너무 낮으면 오버피팅 하게된다

즉 훈련데이터로 인해 만든 모델이 훈련 데이터에만 맞고 다른 데이터를 
분류를 잘 못한다. 

k 값이 너무 높으면 언더피팅을 하게 된다. 

훈련 데이터 조차도 분류를 잘 못한다 . 

예: k 값에 따른 분류 시각화 작업 




■ 구현 코드 




install.packages("readr")

install.packages("ElemStatLearn")

install.packages("class")


library(readr)


#1.과적합에 대하여.

library(ElemStatLearn)

library(class)

x <- mixture.example$x

x

g <- mixture.example$y

g

xnew <- mixture.example$xnew

xnew

#k=1, 10 , 30 , 50 , 100, 1000 

#k값이 지나치게 작을 때: 분류 경계선이 너무 디테일 하다. : 과적합

#k값이 지나치게 클 때 분류 경계선이 너무 크다 : 부적합
#knn(train, test, cl, k =1, l = 0, prob = FALSE, use.all = TRUE)
mod1 <- knn(x, xnew, g, k=1, prob=TRUE)  

mod1

prob1 <- attr(mod1, "prob")

prob1

prob1 <- ifelse(mod1=="1", prob1, 1-prob1)

prob1

px1 <- mixture.example$px1

px2 <- mixture.example$px2

prob1 <- matrix(prob1, length(px1), length(px2))

par(mar=rep(2,4))

#윤곽선

contour(px1, px2, prob1, levels=0.5, 

        labels="", xlab="", ylab="", main= "k-nearest neighbour", axes=FALSE)

points(x, col=ifelse(g==1, "coral", "cornflowerblue"))

gd <- expand.grid(x=px1, y=px2)


#배경

points(gd, pch=".", cex=1.2, col=ifelse(prob1>0.5, "coral", "cornflowerblue"))

box()


▩ 7. knn (k-nearest neighbors) 


▩ 7. knn (k-nearest neighbors) 의 분류 실습1(유방암 데이터)

##### 3장 : 최근접 이웃(Nearest Neighbors)을 사용한 분류(Classification)  --------------------

## 예제 : 암 샘플 분류 ----
## 단계 2 : 데이터 준비와 살펴보기 ----

# CSV 파일 임포트
wbcd <- read.csv("wisc_bc_data.csv", stringsAsFactors = FALSE)

# wbcd 데이터 프레임의 구조
str(wbcd)
head(wbcd)
# id 속성 제거
wbcd <- wbcd[-1]

# 진단 테이블
table(wbcd$diagnosis)

# 팩터로서 진단 변수 변환
wbcd$diagnosis <- factor(wbcd$diagnosis, levels = c("B", "M"),
                         labels = c("Benign", "Malignant"))
head(wbcd)
# 진단 변수의 비율
round(prop.table(table(wbcd$diagnosis)) * 100, digits = 1)

# 세 속성에 대한 요약
summary(wbcd[c("radius_mean", "area_mean", "smoothness_mean")])

# 정규화 함수
normalize <- function(x) {
  return ((x - min(x)) / (max(x) - min(x)))
}

# 정규화 함수 테스트 - 결과는 일치함
normalize(c(1, 2, 3, 4, 5))
normalize(c(10, 20, 30, 40, 50))

# wbcd 데이터 정규화
wbcd_n <- as.data.frame(lapply(wbcd[2:31], normalize))

head(wbcd)
head(wbcd_n)

# 정규화가 잘 되었는지 확인 # 모든 컬럼의 값을 0~1 사이의 값으로 변경해줌
summary(wbcd_n$area_mean)
summary(wbcd_n$concavity_worst)

# 훈련 데이터와 테스트 데이터 생성 # 둘다 라벨이 없는 데이터 이다.
wbcd_train <- wbcd_n[1:469, ]
wbcd_test <- wbcd_n[470:569, ]


str(wbcd)
str(wbcd_train)

# 훈련 데이터와 테스트 데이터에 대한 라벨 생성

wbcd_train_labels <- wbcd[1:469, 1]
wbcd_test_labels <- wbcd[470:569, 1]

## 3단계 : 데이터로 모델 훈련 ----

# "class" 라이브러리 로드
library(class)

wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=21)

## 4 단계 : 모델 성능 평가 ----

# "gmodels" 라이브러리 로드
library(gmodels)

# 예측값과 실제값의 교차표 생성
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred,  prop.chisq=FALSE)


실제/모델      B(양성)      M(악성)
B(양성)       61(TN)      0(FP)
M(악성)        2(FN)     37(TP)

#
#
TRUE NEGATIVE 
FALSE POSITIVE
FALSE NEGATIVE
TRUE POSITIVE
## 5 단계 : 모델 성능 향상 ----

# 데이터 프레임를 z-score 표준화하기 위해 scale() 함수 사용
wbcd_z <- as.data.frame(scale(wbcd[-1]))

# 변환이 정확하게 적용되었는지 확인
summary(wbcd_z$area_mean)

# 훈련과 테스트 데이터셋 생성
wbcd_train <- wbcd_z[1:469, ]
wbcd_test <- wbcd_z[470:569, ]

# 변경한 데이터로 분류
wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test,
                      cl = wbcd_train_labels, k=21)

# 예측값과 실제값의 교차표 생성
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred,
           prop.chisq=FALSE)

# 다른 k 값으로 분류
wbcd_train <- wbcd_n[1:469, ]
wbcd_test <- wbcd_n[470:569, ]

wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=1)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)

wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=5)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)

wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=11)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)

wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=15)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)

wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=21)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)





wbcd <- read.csv("wisc_bc_data.csv", stringsAsFactors = FALSE)
> nrow(wbcd)
[1] 569

569 건의 유방암 환자 데이터를 둘로 나눈다.

 2/3  훈련 데이터 + 악성인지 양성인지를 구분하는 라벨
 1/3 테스트 데이터 + 악성인지 양성인지를 구분하는 라벨을 빼고 
                    훈련 데이터로 그 라벨을 알아내는 작업을 수행

 
knn (훈련 데이터 , 테스트 데이터 , 훈련 데이터 라벨, k=1) 


설명 : B (양성) : 357명 , M(악성) : 212명
wbcd$diagnosis <- factor(wbcd$diagnosis, levels = c("B", "M"), labels = c("Benign", "Malignant"))

설명 : B와 M 을 Benign, Malignant 철자로 변환해서 저장함 

정규화 하는 방법에는 2가지가 잇는데

1.표준정규분포 : scale() 함수를 사용한 변환

2.최대최소변환 : 책 115페이지 (아래 코드) 의 normalize 함수 
               (신경망에서 많이 사용됨) 


# wbcd 데이터 정규화
wbcd_n <- as.data.frame(lapply(wbcd[2:31], normalize))

head(wbcd)
head(wbcd_n)



문제193. 실제 테스트 데이터의 라벨 (wbcd_test_labels )와
          knn으로 예측한 라벨인(wbcd_test_pred) 를 비교해서 얼마나 일치했는지 확인하시오 ! 


data.table(wbcd_test_labels,wbcd_test_pred,mean(as.numeric(wbcd_test_labels ==wbcd_test_pred )),as.numeric(wbcd_test_labels ==wbcd_test_pred ) )




wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=7)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)



wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=13)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)



wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=21)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)



wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=23)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)



wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=31)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)



wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=29)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)



wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=6)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)

거짓부정은 예측값은 양성이지만 종양이 실제로는 악성이다
거짓긍정은 예측값은 악성이지만 종양이 실제로는 양성이다.

k값      거짓부정     거짓긍정
1           1          3
5           2          0
11          3          0
15          3          0
21          2          0
27          4          0

▦ 8. knn(k-Nearest Neighbors)의 분류실습4 ( 붓꽃데이터) 
data(iris)

head(iris)

문제194. 붓꽃의 종류가 몇가지가 있는지 출력하시오 
unique(iris$Species)

> unique(iris$Species)
[1] setosa     versicolor virginica
Levels: setosa versicolor virginica

nrow(iris)
150

▩ 9.knn(k-Nearest Neighbors)의 분류 실습5(폭력과 멜로 분류) 

문제195. 붓꽃의 데이터를 훈련데이터와 테스트 데이터로 나눠서
         knn 을 돌려서 테스트 데이터의 라벨을 예측하는 실습을 
         유방암 실습 코드를 가지고 구현하시오 !
          (오늘의 마지막 문제)


 

install.packages('class')

library(class)


install.packages('gmodels')

library(gmodels)


install.packages("scales")

library(scales




######[KNN] using algorithm######################################################

####movie data load

movie<-read.csv('movie.csv',header=F stringsAsFactors=F

colnames(movie)<-c("title","kick","kiss","genre")

movie$genre<-factor(movie$genrelevels= c('Romance','Action')) # covert genre column into a factor

summary(movie[c("kick",'kiss')]) # do not need to normalize


######data partition

movie_train<- movie[1:6,2:3]

movie_test<-movie[7,2:3

movie_train_label <- movie[1:6,4


######classification

movie_test_matrix <-rbind( movie_testmovie_testmovie_test,movie_test,movie_test,movie_test

movie_test_matrix

distances <- sqrt(apply((movie_test_matrix-movie_train)**2,1,sum))

sortedDistIndicies <- order(distances#rearrange disctances into ascending order ( index)

#distances[order(distances)] #sort by distances

#k <- readline(prompt('enter k value'))

classCount <- movie_train_label[sortedDistIndicies[c(1:3)]] 

classCount

sortedClassCount <-table(classCount)

sortedClassCount

movie_test_pred<-names(sortedClassCount[sortedClassCount==max(sortedClassCount)])

movie_test_pred


########plot graph

plot(movie[1:6,]$kick~movie[1:6,]$kissdata=movie[1:6,], col=alpha(c('red','blue'),0.7)[movie[1:6,]$genre], xlab='kiss count'ylab='kick count'main='movie data')

points(movie[7,]$kiss,movie[7,]$kickdata=movie[7,], pch=15cex=1.2col = 'orange')

legend('topright', c(levels(movie$genre), "test"), pch =c(1,1,15), col=c(alpha(c('red','blue'),0.7),'orange'), cex=0.9)



######using packages######################################################

### Data load

movie<-read.csv('/Users/misoni/Desktop/movie.csv',header=F stringsAsFactors=F)

colnames(movie)<-c("title","kick","kiss","genre")

movie$genre<-factor(movie$genrelevels= c('Romance','Action'))

summary(movie[c("kick",'kiss')])


##normalization

#normalize <-function(x) {

# return (  (x-min(x)) / (max(x)-min(x))  )

#}


####split data

movie_train <- movie[1:6,2:3

movie_test <- movie[7,2:3]

movie_train

movie_test


movie_train_label <- movie[1:6,4]

movie_test_label <- movie[7,4]

movie_test_label

####modeling

movie_test_pred <- knn(train=movie_traintest=movie_testcl=movie_train_labelk=3,prob=T)

movie_test_pred

table(movie_test_pred)


library(gmodels)

#CrossTable(x=movie_test_label, y=movie_test_pred)

#####################################################################






###########iris data#######################################################

########normalize data

str(iris)

table(iris$Species)

normalize<-function(x){

return ((x-min(x))/ (max(x)-min(x)))

}

iris_n <- as.data.frame(lapply(iris[1:4], normalize ))


#########split data

set.seed(1)

train <- round(0.7*dim(iris)[1])

train_index = sample(1:dim(iris)[1], trainreplace =F)

iris_train <- iris_n[train_index,]

iris_test <- iris_n[-train_index,]


iris_train_label <- iris[train_index,5]

iris_test_label  <- iris[-train_index,5]


iris_train_label

prop.table(table(iris_train_label))

prop.table(table(iris_test_label))



###

###########modeling

iris_test_pred <- knn(train=iris_traintest=iris_testcl=iris_train_labelk=3, prob=T)

table(iris_test_pred)














 CrossTable(iris_test_label,iris_test_pred)




   Cell Contents
|-------------------------|
|                       N |
| Chi-square contribution |
|           N / Row Total |
|           N / Col Total |
|         N / Table Total |
|-------------------------|


Total Observations in Table:  45


                | iris_test_pred
iris_test_label |     setosa | versicolor |  virginica |  Row Total |
----------------|------------|------------|------------|------------|
         setosa |         15 |          0 |          0 |         15 |
                |     20.000 |      5.000 |      5.000 |            |
                |      1.000 |      0.000 |      0.000 |      0.333 |
                |      1.000 |      0.000 |      0.000 |            |
                |      0.333 |      0.000 |      0.000 |            |
----------------|------------|------------|------------|------------|
     versicolor |          0 |         13 |          0 |         13 |
                |      4.333 |     17.333 |      4.333 |            |
                |      0.000 |      1.000 |      0.000 |      0.289 |
                |      0.000 |      0.867 |      0.000 |            |
                |      0.000 |      0.289 |      0.000 |            |
----------------|------------|------------|------------|------------|
      virginica |          0 |          2 |         15 |         17 |
                |      5.667 |      2.373 |     15.373 |            |
                |      0.000 |      0.118 |      0.882 |      0.378 |
                |      0.000 |      0.133 |      1.000 |            |
                |      0.000 |      0.044 |      0.333 |            |
----------------|------------|------------|------------|------------|
   Column Total |         15 |         15 |         15 |         45 |
                |      0.333 |      0.333 |      0.333 |            |
----------------|------------|------------|------------|------------|






















 

'R(알) ' 카테고리의 다른 글

R 5장. 결정트리  (0) 2017.09.08
R 4장. 나이브 베이즈의 이해활용한 기계학습4  (0) 2017.09.08
R 3장. knn (최근접 이웃을 사용한 분류의 이해)  (0) 2017.09.08
R 1장 R기본문법  (0) 2017.09.08
R 1장 R기본문법  (0) 2017.07.06