Quiet Time

R(알) +11

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)