Quiet Time

■ 어제까지 배운 내용 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

R 1장 R기본문법

R(알) 2017. 7. 6. 20:27
  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)























 




















 
 


 





 
 














 































 



 










 




 
지난주 배운것
    1. SQL이란 무엇인가
    2. SQL 배워야 하는거ㅏ?
    3. 기본 select 6가지
5  select
  1 from
  2 where
  3 group by
  4 having
  6 order by
 
    1. 함수
      • 단일행  함수 : 문자, 숫자, 날짜 ,변환, 일반
      • 복수행 함수 :  max, min, avg, sum, count
 
문제 154. 부서번호, 부서번호별 인원수를 출력하시오 !
(세로)
 
SELECT deptno, COUNT(*)
  FROM EMP
GROUP BY deptno;               
 
(가로)

문제155. 부서번호 , 부서번호별 토탈 월급을 가로로출력하시오
 
-sum 함수와 decode 함수를 사용한 방법:
 
 
select sum ( decode, 10, sal , 0 ) ) as "10",
sum ( decode, 20, sal , 0 ) ) as "20",
sum ( decode, 30, sal , 0 ) ) as "30"
 from emp;


 
    • pivot 문을 이용하는 방법
 

select *
from ( select deptno, sal from emp)
pivot ( sum (sal) for deptno in (10,20,30) );

 
문제156.직업, 직업별 토탈 월급을 출력하시오
세로
 
SELECT job, SUM(sal)
FROM EMP
GROUP BY job;

 
가로

SELECT *
FROM ( SELECT job,sal FROM emp)
    pivot ( SUM(sal) FOR job IN ('SALESMAN', 'CLERK','PRESIDENT','MANAGER','ANALYST'));


싱글쿼테이션 없애기

SELECT *
FROM ( SELECT job,sal FROM emp)
    pivot ( SUM(sal) FOR job IN ('SALESMAN' AS "SALESMAN",
                                 'CLERK' AS "CLERK",
                                 'PRESIDENT' AS "PRESIDENT",
                                 'MANAGER' AS "MANAGER",
                                 'ANALYST'  AS "ANALYST"));

 
 
문제157. 통신사 , 통신사별 인원수를 가로로 출력하시오 (PIVOT으로 구현하시오)
 

SELECT *
  FROM (SELECT TELECOM FROM EMP2)
  PIVOT ( COUNT(*) FOR TELECOM IN (  'sk' AS "SK", 'lg' AS "LG",'kt' AS "KT"));

 
 
문제158. 입사한 년도 (4자리) , 입사한 년도별 토탈월급을 출력하시오
 
    • 세로
 

  SELECT TO_CHAR(hiredate, 'YYYY') , SUM(sal)
    FROM EMP
  GROUP BY TO_CHAR(hiredate, 'YYYY');

 
 - 가로

SELECT *
    FROM ( SELECT TO_CHAR(hiredate, 'YYYY') a, sal FROM emp)
    pivot( SUM(sal) FOR a IN ('1980' AS "1980",
                     '1981' AS "1981",
                             '1982' AS "1982",
                             '1983' AS "1983"));
설명: pivot안에TO_CHAR(hiredate, 'YYYY')하면에러간난다.
-> 컬럼 별칭을 이용하도록 하자

 
문제159. 입사한 년도(4자리), 입사한 년도별 인원수를 가로로 출력하시오.
SELECT *
  FROM ( SELECT TO_CHAR(hiredate, 'YYYY') A FROM EMP)
  PIVOT ( COUNT(*) FOR A IN ('1980' AS "1980",
'1981' AS "1981",
                             '1982' AS "1982",
                             '1983' AS "1983"));
 
문제160. 부서번호, 부서번호별 토탈월급을 가로로출력하시오!
 
    • SUM 함수와 DECODE 함수 사용
 

  SELECT  SUM(DECODE(DEPTNO,10,SAL,0)) AS "10",
         SUM(DECODE(DEPTNO,20,SAL,0)) AS "20",
        SUM(DECODE(DEPTNO,30,SAL,0)) AS "30"
               FROM EMP ;

 
 
 
  - PIVOT 이용하기
 
 

      SELECT *
        FROM ( SELECT DEPTNO, SAL FROM EMP)

        PIVOT ( SUM(SAL) FOR DEPTNO IN (10,20,30));

 
 
문제160. 부서번호, 부서번호별 토탈월급을 가로로출력하시오! (job또한)
 
 
    • SUM 함수와 DECODE 함수 사용
 

SELECT JOB,
       SUM(DECODE(DEPTNO, 10, SAL, 0)) AS "10",
       SUM(DECODE(DEPTNO, 20, SAL, 0)) AS "20",
       SUM(DECODE(DEPTNO, 30, SAL, 0)) AS "30"
  FROM EMP
 GROUP BY JOB ;

 
 
 
  - PIVOT 이용하기
 


      SELECT *
        FROM ( SELECT DEPTNO, SAL,,JOB FROM EMP)

        PIVOT ( SUM(SAL) FOR DEPTNO IN (10,20,30));

 
 
문제161. 전공별, 통신사별 인원수를 출력하시오
                   (세로)   (가로)
 
-SUM 함수와 DECODE함수를 활용하는방법

SELECT MAJOR ,SUM(DECODE(TELECOM,'sk',1,null)) AS "sk",
        SUM(DECODE(TELECOM,'lg',1,null)) AS "lg",
        SUM(DECODE(TELECOM,'kt',1,null)) AS "kt"

        FROM EMP2
        GROUP BY major;

 
 
 
-PIVOT문을 활용하는 방법
   SELECT *
          FROM (SELECT  major, telecom FROM EMP2)
         
        pivot ( COUNT(*) for telecom IN ( 'sk', 'lg', 'kt'));
       
 
 
 
문제162. (점심시간 문제)

전공별, 나이별 인원수를 출력하시오
(세로)    (가로)
 
select *
  from (select major, agefrom emp2)
pivot (count(*) for age in (24, 25, 26, 27, 28, 29, 30, 31, 33, 35 ));
 
 
 
 
데이터 분석함수
 
    • listagg 함수
    • rank 함수
문제163. 이름 , 월급, 월급에 대한 순위를 출력하시오
 
select ename, sal, rank() over ( order by sal desc) 순위
from emp;

 
3등을 뽑고 싶으면

문제164. 이름,나이, 순위를 출력하는데 순위가 생년월일 순으로 순위를 부여하시오
 
SELECT telecom, ename, age, 
dense_rank() over ( PARTITION BY telecom
order by birth asc) 순위
from EMP2 ;
 
 
문제166. 부서번호, 이름, 월급 ,순위를 출력하는데 부서번호별로 각각 월급이 높은 순서대로 순위를 부여하시오
select deptno , ename, sal , dense_rank() over ( partition by deptno
 order by sal desc)  순위
from emp;
 
 
문제167. FORD는 월급을 3000 받으면 emp 테이블에서 월급의 순위가
어떻게 되겠는가?
 
select rank(3000)  within GROUP (order by sal desc) 순위 from emp;
 
 
문제168. 1991 8 15 우리반에서 나이 순위가 어떻게 되는가
 
SELECT RANK(TO_DATE('1991/08/15','RRRR/MM/DD')) within GROUP (ORDER BY birth asc) 순위
FROM EMP2;
 
ALTER SESSION SET nls_date_format='yyyy-mm-dd';
select rank('1991/8/15') within group ( order by birth acs) 순위 from emp2;
 
 
문제169. 아래의 데이터를 입력하고 이름과 월급을 출력하는데
월급이 높은 것 부터 출력하시오!
insert into emp ( empno , ename, sal , deptno)
values (1924,'jack', null, 30);
commit;
 
 
 
select ename, sal FROM EMP ORDER by sal DESC;
 
null 위로 올라감
 
select ename, sal
FROM EMP
ORDER by sal DESC nulls last;
 
null 마지막으로 빠짐
 
문제 170. 이름, 입사일, 순위를 출력하는데 가장 최근에 입사한 사원부터 순위를 부여하시오 (가장 최근에 입사한 사원이 1등이 되게 )
 
 
SELECT ename, hiredate, RANK() OVER (ORDER BY hiredate DESC nulls last)
 FROM EMP ;