160825: 110회차

종료하기 전 티스토리 네이버 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것

[03] R 스크립트, R 함수

1. R 스크립트 및 Packages 설치
 
(1) R 스크립트
 
- 파일 -> 새로운 스크립트 -> 편집창에 아래 입력
 
x <- rnorm(1000)   : 1000개의 난수를 만들어 객체 x에 저장
mean(x)            : 평균 구한다
sd(x)              : 표준편차 구한다
hist(x)            : 히스토그램를 그려본다.
 
입력후 저장버튼을 눌러 저장한다 (example.R)
 
- 파일 -> 스크립트 불러오기 -> 편집창에서 Ctrl + R 로 한줄 실행하거나 전체를 선택후 Ctrl + R로 한꺼번에 실행한다.
 
 
 
(2) Packages 설치
 
- 패키지들 -> 패키지 설치 -> Korea 선택 -> lubridate 선택 -> OK
 
- 패키지들 -> 패키지 불러오기 -> lubridate 선택(시간 관련 패키지)
 
- 마크다운,니키 패키지가 설치됩니다. (필요한 기능은 Package를 설치하여 사용)



2. R 함수 

 
(1) apply(x,m,fun,...) :행렬이나 배열의 차원 별로 지정한 함수를 적용
  - x:대상자료(행렬,배열)
  - m:차원  1(행),2(열),3(면), c(1,2)
  - fun: 적용할 함수명





 
(2) lapply(x,fun,..) :list apply, 리스트에 지정한 함수를 적용
  - x : 대상 리스트 객체
  - fun:적용할 함수명
  - ..:함수에서 사용할 인수
 
 
(3) sapply(x,fun,...,simplify=TRUE,
    USE.NAMES=TRUE) : simplification apply
 
  - x : 대상 리스트 객체
  - fun:적용할 함수명
  - ..:함수에서 사용할 인수
  - simplify = T :연산결과를 벡터, 행렬 등 간단히 반환
  - simplify = F :연산결과를 리스트로 반환
  - USE.NAMES=T : 이름 속성도 반환
  - USE.NAMES=F : 이름 속성없이 반환
 



 
 (4) vapply(x.fun,fun.value,...,
     USE.NAMES=TRUE) : values simplification apply
 
  - x : 대상 리스트 객체
  - fun:적용할 함수명
  - fun.value:반환하는 데이터 유형 지정
  - ...:함수에서 사용할 인수
 







(5) replicate(n,expr,simplify="array")
    : expr을 n번 반복하여 행렬이나 리스트로 반환
 
   - n:반복횟수
   - expr:표현식
   - simplify=F: 리스트로 반환



 
 
 (6) sweep(x,m,s,fun="-",check.margin=TRUE,...)
    : 행렬, 배열, 데이터프레임에 함수와 통계량을 적용하는 함수
 
   - x: 대상객체(배열)
   - m: 배열의 차원
   - s: 적용할 통계량
   - fun: 적용할 함수(="-":뺄셈연산,default)
   - check.margin:인수 길이가 같은지 확인
 



 
 (7)aggregate(x,b,fun)
    : 데이터 부분별로 함수를 적용해서 통계량을 구하는 함수
   - x: 대상 자료 객체
   - b: a list of grouping elements
   - fun: 적용할 함수명
 



 - iris[,1:4] : 행은 모두, 열은(1~4)까지
 - list(Species=iris[,5]) : iris 5열의 값을 Species name에 담아서 list로 반환
 - mean : 표준편차


3. 연습문제
 
ex) R에 저장되어 있는 state.x77의 데이터를 이용하여 다음 각각의 물음에 답하시오.
 
1) 3번째 행과 8번째 열위 원소를 추출하시오.
 
풀이)
> state.x77[3,8]
[1] 113417
 
2) 5, 22, 44행과 1, 4, 7열에 해당하는 값을 추출하시오.
풀이)
> state.x77[c(5,22,44), c(1,4,7)]
           Population  Life Exp  Frost
California      21198    71.71    20
Michigan        9111    70.63   125
Utah            1203    72.90   137
 
3) 5행부터 50행까지를 제외한 나머지 행과 3열부터 5열까지의 원소를 추출하시오.
풀이)
> state.x77[-(5:50), 3:5]
         Illiteracy  Life Exp  Murder
Alabama      2.1    69.05   15.1
Alaska        1.5    69.31   11.3
Arizona       1.8    70.55    7.8
Arkansas      1.9    70.66   10.1
 
4) stats.x77의 두 번째 열인 Income이 4000보다 큰 것만을 추출하시오.
풀이)
> inc <- state.x77[1:50]
> state.x77[inc>4000,2]
California               5114 
Florida                 4815 
Georgia                4091
Illinois                  5107 
Indiana                 4458
Maryland               5299
Massachusetts          4755
Michigan               4751
Missouri                4254
New Jersey             5237 
New York               4903 
North Carolina          3875  
Ohio                   4561
Pennsylvania           4449
Tennessee             3821
Texas                 4188
Virginia                4701
Wisconsin             4468
 
3. 1~8, 11~18, 111~118로 이루어진 2, 4, 3차원의 배열을 만드시오.
풀이)
> b <- c(1:8, 11:18, 111:118)
> dim(b) <- c(2,4,3)
> b
, , 1
 
      [,1] [,2] [,3] [,4]
[1,]    1    3    5    7
[2,]    2    4    6    8
 
, , 2
 
      [,1] [,2] [,3] [,4]
[1,]   11   13   15   17
[2,]   12   14   16   18
 
, , 3
 
      [,1] [,2] [,3] [,4]
[1,]  111  113  115  117
[2,]  112  114  116  118
 
4. R에 저장된 iris의 (38,1,3)번째 원소를 추출하시오.
풀이)
> iris[38,1,3]
[1] 4.9
 

[04] R 그래프 기초

[01]  R 그래프 기초
1. plot()함수
  - plot(y축데이터, 옵션)
  - plot(x축데이터,y축 데이터, 옵션)
 
> v<-c(5,4,6,3,2)
> plot(v)
 
> x<-1:10
> y<-10:1
> plot(x,y)
 
 
 -  xlim, ylim : 한계값지정
 > plot(x,y,xlim=c(1,20), ylim=c(20,1))
 
 - xlab, ylab : x축, y축 이름 지정, main을 이용해서 그래프제목 지정
> plot(x,y,xlim=c(1,20), ylim=c(20,1))
> plot(x,y,xlim=c(1,20), ylim=c(20,1),
+ xlab="X축 값",ylab="Y축값",
+ main="Plot Test")
 
 - 옵션
 
2. plot, axis, title, par, legend
 
 - plot() : 그래프 그리기
 - axis() : 축값 지정 하기
 - title() : 제목 달기
 
> plot.new()     # 새로운 그래프 창 열기
> v1<-c(100,120,130,140,150)
> plot(v1,type="o", col="red", ylim=c(0,200),axes=F, ann=F)
> axis(1,at=1:5, lab=c("MON","TUE","WED","THU","FRI"))
> axis(2,ylim=c(0,200))
> title(main="FRUT", col.main="red", font.main=4)
> title(xlab="DAY", col.lab="black")
> title(ylab="PRIC", col.lab="blue")
 
 
 - par(mfrow=c(nr,nc)) nr:행의 갯수, nc 열의 갯수
   :한 화면에 여러 개의 그래프 동시 배치
   nr:행의 갯수, nc 열의 갯수
 
> v1
[1] 100 120 130 140 150
> par(mfrow=c(1,3))
> plot(v1,type="o")
> plot(v1,type="s")
> plot(v1,type="l")
 
  - legend(x축 위치, y축 위치, 내용, cex=글자크기, col=색상,pch=크기, lty=선모양)
   :범례 추가
 
  - lines(), par(new=T) : 충첩허용
  
  > dev.new()
> a1 <- c(1,2,3,4,5)
> a2 <- c(5,4,3,2,1)
> a3 <- c(2,4,6,8,10)
 
> plot(a1,type="s", col="red", ylim=c(1,10))
> lines(a2,type="o", col="blue", ylim=c(1,5))
> lines(a3,type="l", col="green", ylim=c(1,15))
> legend(4,9,c("a1","a2","a3"),cex=0.9,col=c("red","blue","green"),lty=1)



3. 막대 그래프
 
  - barplot() 함수를 이용(세로막대)
  - horiz=T : 가로막대
  - beside=T : 그룹으로 묶어서 출력
 
> xm <- matrix(x,2,5)
> xm
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    3    5    7    9
[2,]    2    4    6    8   10
>
>
>
 
  - 옵션
  
 
 
4. 파이 그래프
 
   - pie() 함수를 이용
 
   - 옵션 

  
 
> dev.new()
 
> p1<- c(10,20,30,40)
>
> pie(p1,radius=1)
>
> #시작각도를 90도로 지정
> pie(p1,radius=1,init.angle=90)
>
> #색상과 lable 지정
> pie(p1,radius=1,init.angle=90,col=rainbow(p1))
>
> pie(p1,radius=1,init.angle=90,col=rainbow(p1)
+ ,label=c("Week 1", "Week 2", "Week 3", "Week 4"))
 
   - 수치값및 범례 보여주기
   - round(대상, 반올림할 자리수)
   - paste(a,b) : a에 b를 붙여서 하나로 만드는 함수
 
> pct<-round(p1/sum(p1) * 100,1)
> lab<-paste(pct,"%")
> pie(p1,radius=1,init.angle=90,col=rainbow(p1),label=lab)
> legend(1,1,c("Week 1","Week 2","Week 3","Week 4"),cex=0.5,fill=rainbow(length(p1)))
 
  - pie3D()함수
    : 3D로 파이그래프 만들기
      plotrix패키지를 설치후 library를 로딩해야함.
 
      install.packages("plotrix")
      library(plotrix)
 
      [05]비정형 데이타 그래프 출력시 사용
 
 
 
 5. 나이팅 게일 그래프 
 
   - star()함수 사용 : 비교,분석시 사용
 
> dev.new()
> total <- read.table("학생별전체성적_new.txt",header=T,sep=",")
> total
    이름 국어 영어 수학 국사 화학 물리
1 박지영   90   85   55   88   91   79
2 김태함   70   65   80   75   76   89
3 김효섭   92   95   76   65   89   91
4 임경희   76   89   88   98  100   91
5 권혁진   97   87   83   91   86   91
6 하혜진   80   86   97   85   69   77
7 이준원   80   30   40   50   70   90
8 윤정웅   70   82   54   56   58   60
9 주시현   90   95  100   85   89   92
> row.names(total)<- total$이름
> total
         이름 국어 영어 수학 국사 화학 물리
박지영 박지영   90   85   55   88   91   79
김태함 김태함   70   65   80   75   76   89
김효섭 김효섭   92   95   76   65   89   91
임경희 임경희   76   89   88   98  100   91
권혁진 권혁진   97   87   83   91   86   91
하혜진 하혜진   80   86   97   85   69   77
이준원 이준원   80   30   40   50   70   90
윤정웅 윤정웅   70   82   54   56   58   60
주시현 주시현   90   95  100   85   89   92
> total <- total[2:7]
> total
       국어 영어 수학 국사 화학 물리
박지영   90   85   55   88   91   79
김태함   70   65   80   75   76   89
김효섭   92   95   76   65   89   91
임경희   76   89   88   98  100   91
권혁진   97   87   83   91   86   91
하혜진   80   86   97   85   69   77
이준원   80   30   40   50   70   90
윤정웅   70   82   54   56   58   60
주시현   90   95  100   85   89   92
>
> stars(total,flip.labels=F,draw.segment=F,frame.plot=T,full=T,main="학생별 과목별 성적분석")
> lab <- names(total)
> lab
[1] "국어" "영어" "수학" "국사" "화학" "물리"
> value <- table(lab)
> value
lab
국사 국어 물리 수학 영어 화학 
   1    1    1    1    1    1 
> pie(value,labels=lab,radius=0.1,cex=0.6,col=NA)
> draw.segment=T #색상 표현
> color <- c("black","red","green","blue","cyan","violet")
> pie(value,labels=lab,col=color,radius=0.1,cex=0.6)
 
  [05] R 그래프(비정형 데이터)
1. 비정형 데이터를 이용한 그래프

  - 거의 대부분의 DBMS 벤더 제품은 정형화 된 형태의 데이터를 저장하고 있습니다.
  - 비정형화된 데이터는 web을 통해서 크롤링(crawling-데이터를 모으는 작업) 하거나 설문등을 통해서 모아진 데이터등 일상적인 모든 환경에서 접할 수 있는 모든 데이터를  말합니다.

 - 블로그등 인터넷에서 크롤링한 데이터 (서울의 추천 명소)별로 그래프를 그리는 작업 


 >>>> 작업1) 작업디렉토리 확인하고 필요한 단어추출과 그래프를 위한 패키지 설치와 로딩

 > getwd()

 > install.packages("KoNLP")
 > install.packages("wordcloud")
 > install.packages("stringr")

 > Sys.setenv(Java_HOME='c:\\Program Files\\Java\\jre1.8.0_40')    # 'rJava'를 로딩할 수 없습니다. 오류시에 작성

  > library(KoNLP) #설치된 KoNLP 패키지를 호출
 
필요한 패키지를 로딩중입니다: rJava
필요한 패키지를 로딩중입니다: stringr
필요한 패키지를 로딩중입니다: hash
hash-2.2.6 provided by Decision Patterns
 
필요한 패키지를 로딩중입니다: tau
필요한 패키지를 로딩중입니다: Sejong
Successfully Loaded Sejong Package.
Building dictionary structures.
 
 
다음의 패키지를 부착합니다: ‘KoNLP’
 
The following object is masked from ‘package:tau’:
 
    is.ascii
 
 > library(wordcloud) #설치된 wordcloud 패키지를 호출
필요한 패키지를 로딩중입니다: RColorBrewer
 > library(stringr)   #설치된 stringr패키지를 호출
 

>>>> 작업2) 세종사전에 서울 관광지 명소를 수동으로 추가 (파일로 추가)

> useSejongDic() 
 
> mergeUserDic(data.frame(readLines("mergefile.txt"),"ncn"))
21 words were added to dic_user.txt.


>>>> 작업3) 분석할 크롤링한 자료를 변수로 불러 들여서 명사만 분리

> txt <-readLines("seoul_go.txt")
> place <- sapply(txt,extractNoun,USE.NAMES=F) #명사만 분리
> head(place,10) #확인
[[1]]
[1] "162,900" "건"     
 
[[2]]
[1] ""
 
[[3]]
[1] "서울"   "야경"   "데이트"
 
[[4]]
[1] ""
 
[[5]]
[1] "6"
 
[[6]]
[1] ""
 
[[7]]
[1] ""
 
[[8]]
 [1] "서울"           "야경"           "데이트"         "야경"          
 [5] "명소"           "BEST7"          "7"              "전"            
 [9] "서울"           "명소가되었는데" "달빛"           "후원"          
[13] "모습"           "수"             "곳인거"         "두"            
[17] "번째"           "서울"           "야경"           "명소"          
[21] "북악"           "팔각정"         "저"             "rudyrudy1207"  
[25] "blog"           "me"             "220147814047"   "루디"          
[29] "반딧불이"       "세"             "블로그"         "내"            
[33] "검색"          
 
[[9]]
[1] ""
 
[[10]]
[1] "여행"   "하기"   "좋은곳"

>head(unlist(place),30) #보기좋은 모양(리스트가 아닌)으로 변경
>c <- unlist(place)
>place <- Filter(function(x) {nchar(x) >= 2},c) #2자이상된 단어만 필터링함


>>>> 작업4) 의미없는 문자, 기호, 숫자, 공백 제거


>res <- str_replace_all(place,"[^[:alpha:]]","")      #영문,한글 아닌것 전부제거
>res <- res[res != ""]                                  #벡터에서 공백을 제거합니다.
> res <-gsub("서울","",res)                      #문자열 변환
> res <-gsub("명소","",res)
> res <-gsub("소개","",res)
> res <-gsub("추천","",res)
> res <-gsub("블로그","",res)
> res <-gsub("검색","",res)
> res <-gsub("blog","",res)
> res <-gsub("naver","",res)
> res <-gsub("com","",res)
> res <-gsub("me","",res)
> res <-gsub("데이트","",res)
> res <-gsub("약도","",res)
> res <-gsub("사진","",res)
> res <-gsub("야경","",res)
> res <-gsub("여행","",res)
> res <-gsub("근교","",res)
> res <-gsub("이야기","",res)
> res <-gsub("안녕","",res)
> res <-gsub("도시","",res)
> res <-gsub("관광","",res)
> res <-gsub("벚꽃","",res)
> res <-gsub("코스","",res)
> res <-gsub("오늘","",res)
> res <-gsub("요한","",res)
> res <-gsub("축제","",res)
> res <-gsub("행복","",res)
> res <-gsub("가볼만한곳","",res)
> res <-gsub("걷기","",res)
> res <-gsub("km","",res)
> res <-gsub("거리","",res)
> res <-gsub("공원","",res)
> res <-gsub("문화","",res)
> res <-gsub("마을","",res)
> res <-gsub("가을","",res)
> res <-gsub("단풍","",res)
> res <-gsub("나들이","",res)
> res <-gsub("주말","",res)
> res <-gsub("출사","",res)
> res <-gsub("하게","",res)
> res <-gsub("구경","",res)
> res <-gsub("유명","",res)
> res <-gsub("좋은곳","",res)
> res <-gsub("daum","",res)
> res <-gsub("시간","",res)
 
> NROW(res) #행객수
[1] 5540

> write(res,"seoul_go2.txt")                    #정제된 내용을 파일로 저장
> res2 <- read.table("seoul_go2.txt")         #파일을 다시 변수로 읽어옴
> wordcount<-table(res2)                     #각 언어별 언급 횟수를 집계
> head(sort(wordcount,decreasing=T),30)   #언급횟수가 30부터내림차순의 내용 출력
res2
          한옥           북촌           홍대         삼청동         경복궁 
            38             32             25             23             22 
          인사           하늘         창경궁         올림픽 국립중앙박물관 
            20             20             18             17             13 
        나들길           남산         청계천         cognos           명동 
            13             13             13             12             12 
          억새           호수           강남 국립민속박물관           벽화 
            12             12             11             11             11 
            에           촬영           하나           국립         선유도 
            11             11             11             10             10 
          에서           일출           카페           하기        tistory 
            10             10             10         



>>>> 작업5) 추선 수가 높은 상위 10개의 명소를 골라서 pie형 그래프로 출력

> top10 <- head(sort(wordcount,decreasing=T),10)
> top10
res2
          한옥           북촌           홍대         삼청동         경복궁 
            38             32             25             23             22 
          인사           하늘         창경궁         올림픽 국립중앙박물관 
            20             20             18             17             13 
> pie(top10)
> savePlot("seoul_go_1.jpeg",type="jpeg")


>>>> 작업6) 색깔과 크기 지정해서 pie형 그래프 출력



> pie(top10,col=rainbow(10),radius=1)
> savePlot("seoul_go_2.jpeg",type="jpeg")

 

>>>> 작업7) 수치값을 함께 출력

> pct<-round(top10/sum(top10)*100,1)
> names(top10)
 [1] "한옥"           "북촌"           "홍대"           "삼청동"        
 [5] "경복궁"         "인사"           "하늘"           "창경궁"        
 [9] "올림픽"         "국립중앙박물관"
 
> lab<-paste(names(top10),"\n",pct,"%")
> pie(top10,main="서울시 가볼만한 명소 TOP 10",col=rainbow(10),cex=0.8,labels=lab)
> savePlot("seoul_go_3.jpeg",type="jpeg")


>>>> 작업8) 도넛모양 으로 출력

> pie(top10,radius=0.6,col="black",labels=NA,border=NA)
> pie(top10,main="서울시 가볼만한 명소 TOP 10",col=rainbow(10),cex=0.8,labels=lab)
> par(new=T) #기존 파이그래프 지우지 않고 덮어쓴다는 의미
> pie(top10,radius=0.6,col="white",labels=NA,border=NA)
> savePlot("seoul_go_4.jpeg",type="jpeg")


>>>> 작업9) 3D Pie 출력


   - pie3D()함수  
    : 3D로 파이그래프 만들기
      plotrix패키지를 설치후 library를 로딩해야함.
 
      install.packages("plotrix")
      library(plotrix)
 
>   bchart <- head(sort(wordcount, decreasing=T), 10)
>   th_pct <- round(bchart/sum(bchart)*100,1)
>   th_names <- names(bchart)
>   th_labels <- paste(th_names,"\n","(",th_pct,")")
>   pie3D(bchart,main="서울의 가볼만한 명소 Top 10",col=rainbow(10),
+   cex=0.5,labels=th_labels,explode=0.05)
>   savePlot("seoul_go_5.jpeg",type="jpeg")


>>>> 작업10) bar 형식으로 출력

> bplot <- barplot(bchart, main="서울의 가볼만한 명소 top10",col=rainbow(10),
+ cex.names=0.7,las=2,ylim=c(0,45))
> pct <- round(bchart/sum(bchart) *100,1)
> pct
res2
          한옥           북촌           홍대         삼청동         경복궁           인사           하늘         창경궁         올림픽 국립중앙박물관 
          16.7           14.0           11.0           10.1            9.6            8.8            8.8            7.9            7.5            5.7 

> text(x=bplot, y=bchart*1.05, labels=paste("(",pct,"%",")"), col = "black", cex=0.5)
> text(x=bplot, y=bchart*0.95, labels = paste(bchart,"건"),col="black",cex=0.5)
> savePlot("seoul_go_6.jpeg",type="jpeg")


-------------------------------------------------------------------------------------------


>   barplot(bchart, main="서울의 가볼만한 명소 top10",col=rainbow(10),
+  xlim=c(0,45),cex.names=0.7,las=2,horiz=T)
>  text(y=bplot, x=bchart*0.9, labels = paste(bchart,"건"), col = "black", cex=0.7)
>  text(y=bplot, x=bchart*1.1, labels = paste("(",pct,"%",")"),col="black",cex=0.7)
>  savePlot("seoul_go_7.jpeg",type="jpeg")
 
 




R은 읽어봐야 할 것 같다^^



5. 수업

진도: 

hw: 


6. 할것



'Programming' 카테고리의 다른 글

160917: 완료  (1) 2016.09.17
160826: 111회차  (0) 2016.08.26
160824: 109회차  (0) 2016.08.24
160823: 108회차  (0) 2016.08.23
160822: 107회차  (0) 2016.08.22
Posted by DAVID