상단

통계소프트웨어인 GNU R language를 정리 합니다.

 
 

R 개요


통계/데이터 마이닝 및 그래프를 위한 언어

 
  • 데이터 분석용 객체지향언어인 GNU S language의 구현

  • 통계 분석과 그래픽 처리 분야에 특화된 프로그램 언어와 패키지로 구성된 소프트웨어 환경

  • CRAN (Comprehensive R Archive Network)라는 R package site 제공

    • 3826개 이상의 package

     
  • 많이 사용하는 통계 Software

    • SaS

    • Rapid Miner, Weka

    • Minitab, SPSS, Systat, RATS, KXEN

 
 

R 데이터 종류


개요도

700px

 

데이터 속성

  • 비율식 (Ratio) < 구간식 (Interval) < 순서식 (Ordinal) < 명명식 (Nominal)
    {|cellspacing="0" cellpadding="2" border="1" width="100%" bgcolor="#FFFFFF" align="center" 
    |- 
    |width="25%" align="center" valign="middle" style="background-color:#eee;"|데이터 속성 
    |width="75%" align="center" valign="middle" style="background-color:#eee;"|상세 |- |align="center" valign="middle" style="background-color:#eee;"|명명식 (Nominal) |

  • 명목척도

  • 이름으로 구분되는 자료, 예) 성별
    align="center" valign="middle" style="background-color:#eee;"
  • 서열척도

  • 순서가 있는 명명식, 예) 소득의 상, 중, 하
    align="center" valign="middle" style="background-color:#eee;"
  • 간격척도

  • 순서의 간격을 측정할 수 있는 순서식, 예) 온도
    align="center" valign="middle" style="background-color:#eee;"
  • 비율척도

  • 절대 영점이 존재해 비율이 의미가 있는 구간식, 예) 체중
    |}

 

변수

{|cellspacing="0" cellpadding="2" border="1" width="100%" bgcolor="#FFFFFF" align="center" 
|- |width="25%" align="center" valign="middle" style="background-color:#eee;"|변수

|width="75%" align="center" valign="middle" style="background-color:#eee;"|상세 
|- |align="center" valign="middle" style="background-color:#eee;"|연속형 변수 |

  • Continuous, 연속된 변수
    align="center" valign="middle" style="background-color:#eee;"
  • Discrete, 값의 개수가 정의된 변수, 예) 동전의 앞, 뒤

    • 범주형 변수 (Categorical)

      • 이산형 변수의 한 종류로 연속형 변수를 그룹화하여 이산화할 때 사용할 수 있음

      • 예) 나이 : 10대, 20대, 30대, ...
        |}

 

데이터 품질

{|cellspacing="0" cellpadding="2" border="1" width="100%" bgcolor="#FFFFFF" align="center" 
|- |width="25%" align="center" valign="middle" style="background-color:#eee;"|데이터 품질

|width="75%" align="center" valign="middle" style="background-color:#eee;"|상세 
|- |align="center" valign="middle" style="background-color:#eee;"|특이값 |

  • Outlier, 이상 데이터
    align="center" valign="middle" style="background-color:#eee;"
  • Missing, 측정되지 않은 값
    align="center" valign="middle" style="background-color:#eee;"
  • 중복된 값
    align="center" valign="middle" style="background-color:#eee;"
  • Accuracy, 실제값과 측정된 값의 가까운 정도

  • 오차 (Error)
    align="center" valign="middle" style="background-color:#eee;"
  • Precision, 반복 측정시 측정된 값의 가까운 정도

  • 표준펀차
    align="center" valign="middle" style="background-color:#eee;"
  • Bias, 측정값과 측정값의 평균의 차이

  • 변이도 (Variation)
    |}

 

데이터 형

  • 기본형
    {|cellspacing="0" cellpadding="2" border="1" width="100%" bgcolor="#FFFFFF" align="center" 
    |- 
    |width="25%" align="center" valign="middle" style="background-color:#eee;"|데이터형 
    |width="75%" align="center" valign="middle" style="background-color:#eee;"|상세 |- |align="center" valign="middle" style="background-color:#eee;"|numeric
    (수치형) 
    |

  • Integer, Double

  • numeric(25)
    align="center" valign="middle" style="background-color:#eee;"
  • 상수 : TRUE, FALSE

  • 변수 : T, F

  • logical(25)
    align="center" valign="middle" style="background-color:#eee;"
  • "", ''

  • character(25)

  • paste(var1, var2, sep = " ") : sep를 사용하여 두 문자열을 결합
    |}

  • 구조형

    • 동일한 자료형을 가지는 데이터를 가짐
      {|cellspacing="0" cellpadding="2" border="1" width="100%" bgcolor="#FFFFFF" align="center" 
      |- 
      |width="25%" align="center" valign="middle" style="background-color:#eee;"|데이터형 
      |width="75%" align="center" valign="middle" style="background-color:#eee;"|상세 |- |align="center" valign="middle" style="background-color:#eee;"|Scalar
      (스칼라) 
      |

  • 하나의 기본형 데이터를 가지는 변수
    align="center" valign="middle" style="background-color:#eee;"
  • 범주형(Categorical) 변수, 여러 개의 값을 가질 수 있음

  • 명명식 또는 순서식 데이터를 저장

 
 
 sex <- factor("남", levels=c("남", "여"))           #--- 명명식 (Nominal)
 sex <- factor(c("남", "여"), levels=c("남", "여"))  #--- 명명식 (Nominal)
 factor(c("a", "b", "c"), ordered=TRUE)              #--- 순서식 (Ordinal)
 ordered("a", "b", "c")                              #--- 순서식 (Ordinal)
 
 nlevels(~)                                          #--- 범주의 수
 levels(~)                                           #--- 범주 목록
 sex[1](1.md)                                              #--- 첫번재 값 표시 (1, 2, 3, …)

|- 
|align="center" valign="middle" style="background-color:#eee;"|Vector
(벡터) 
|

  • Scalar의 조합, Factor의 조합도 가능

  • 속성 : 자료형, 길이 (length(vectorA), NROW(vectorA))

 
 
 vectorA <- c(1, 2, 3)                               #--- c. concatenating
 vectorA <- vector(mode = "numeric", length = 3)
 names(vectorA) <- c("aaa", "bbb", "ccc")            #--- 이름 지정
 vectorA["aaa"]("aaa".md)                                      #--- 이름으로 데이터 반환
 vectorA[2](2.md)                                          #--- 두번째 값 반환 (1, 2, 3, …)
 vectorA[-1](-1.md)                                         #--- 첫번째 값을 제외하고 반환
 vectorA[3)](c(1,)                                    #--- 첫번째와 세번째 값 반환
 vectorA[> 5](vectorA)                                #--- 5보다 큰 값
 vectorA[FALSE, TRUE)](c(FALSE,)                      #--- TRUE로 표시된 순서의 데이터 반환
 
 vectorC = append(~, ~), vectorC <- c(~, ~)          #--- 두개의 Vector 결합
 1 %in% vectorA                                      #--- vectorA에 1이 포함되어 있으면 TRUE 반환
 union(~, ~), intersect(~, ~), setdiff(~, ~)         #--- 합집합, 교집합, 차집합
 setequal(~, ~)                                      #--- Vector간 비교

|- 
|align="center" valign="middle" style="background-color:#eee;"|Matrix
(행렬) 
|

  • R의 기본 데이터형

  • 속성 : 행 개수(nrow(~)), 열(ncol()) 길이 (nrow(matrixA), NROW(matrixA)), 자료형, 행 이름

 
 
 matrixA <- matrix(1:15, nrow=3, ncol=5)             #--- 열부터 데이터 채움
 matrixA <- matrix(c(1, 3, 5, 7), nrow=2, ncol=2,    #--- 행부터 데이터 채움
    byrow=TRUE, dimnames=list(c('R1', 'R2'), c('C1', 'C2)))
 matrixA[col](row,)                                   #--- row 또는 col은 생략 가능 (1, 2, 3, …)
 matrixA[1:2,](1:2,.md)                                       #--- 1행과 2행 데이터 반환
 matrixA[-3,](-3,.md)                                        #--- 3행을 제외한 데이터 반환
 matrixA["C1", drop=FALSE]("R1",)                     #--- R1 행, C1열 데이터를 Matrix 형태로 반환
 
 matrixA %*% matrixB                                 #--- 행렬 곱
 solve(~)                                            #--- 역행렬
 t(~)                                                #--- 전치 행렬 (행과 열을 교환)

|- 
|align="center" valign="middle" style="background-color:#eee;"|Array
(배열) 
|

  • 3차원 이상의 데이터를 다룰 경우 주로 사용

  • 속성 : 열 길이, 자료형, 차원수(dim(~)), 차원 이름

 
 
 arrayA <- array(1:12, dim=c(3, 4))                  #--- 2차원 배열 생성
 
 attr(arrayA, "dim") <- NULL                         #--- Array에서 dim 속성을 삭제하면 vector가 됨
 Vector                                              #--- dim 속성이 없음
 Matrix                                              #--- dim 속성이 c(~, ~) 임
 Array                                               #--- dim 속성이 있음

|}

 
  • 복합형

    • 서로 다른 자료형의 데이터를 가질 수 있음
      {|cellspacing="0" cellpadding="2" border="1" width="100%" bgcolor="#FFFFFF" align="center" 
      |- 
      |width="25%" align="center" valign="middle" style="background-color:#eee;"|데이터형 
      |width="75%" align="center" valign="middle" style="background-color:#eee;"|상세 |- |align="center" valign="middle" style="background-color:#eee;"|List
      (리스트) 
      |

  • vector와 동일한 연산 방식 적용

  • 속성 : 컴포넌트 개수 (length()), 자료형, 이름

 
 listA <- list(name='aa', age=45)
 list$name, listA[1](1.md)                 #--- 'aa' 반환
 listA[1](1.md)                              #--- list(name='aa') 반환
 list$name <- NULL                     #--- List에서 name 항목 삭제
 vectorB <- unlist(listA)              #--- list를 vector로 변환
 sort(~), ~[sort(~)](sort(~).md)                   #--- 정렬

|- 
|align="center" valign="middle" style="background-color:#eee;"|Data Frame
(데이터 프레임) 
|

  • matrix와 동일한 연산 방식 적용

  • 속성: 열 길이, 자료형(복수), 변수 이름, data.frame 객체

 
 data <- data.frame(x=c(1, 2, 3), y=(4, 5, 6))   #--- x, y열을 같는 데이터 정의
 data <- data.frame(cols1, cols2, cols3)
 data <- data.frame(1:3, c("col1", "col2", "col3"))
 names(~), colnames(~)                 #--- 열이름 조회
 colnames(~) <- c(~, ~)                #--- 열이름 지정
 rownames(~)                           #--- 행 이름 조회
 dim(~)                                #--- 차수(5행 * 2열)를 조회
 data[col](row,)                        #--- row/col (1, 2, 3, …)
 data["colName"]("rowName",)
 data$col1                             #--- 컬럼 이름에 해당하는 데이터
 #--- R search path에 data 등록, col1 이름을 직접 사용 가능
 attach(data)               
 data[1](,)                             #--- 결과를 Vector로 반환
 data[1, drop=FALSE](,)                 #--- 결과를 Data Frame으로 반환
 data[names(data) %in% c("col2", "col3")](,)   #--- col2, col3 열 표시
 data[c(FALSE, TRUE, TRUE)](,)          #--- 위 라인과 동일한 결과 표시
 data[!names(data) %in% c("col1")](,)   #--- col1 열을 제외한 열 표시
 
 head(~), head(~, 12)                  #--- 몇 개의 시작 데이터만 조회
 tail(~), tail(~, 3)                   #--- 몇 개의 마지막 데이터만 조회
 subset(data, math > 6), data[data$math > 6)  #--- 조건을 만족하는 데이터 반환
 data[, "math" <- data2["math"](,) + 1
 transform(data, math = math + 1)
 rbind(~, ~), cbind(~, ~)              #--- 두개의 data를 행기준, 열기준으로 결합
 split(data$a, data$b)                 #--- b를 기준으로 그룹화된 list 반환

|}

 
  • Special Values
    {|cellspacing="0" cellpadding="2" border="1" width="100%" bgcolor="#FFFFFF" align="center" 
    |- 
    |width="25%" align="center" valign="middle" style="background-color:#eee;"|데이터 
    |width="75%" align="center" valign="middle" style="background-color:#eee;"|상세 |- |align="center" valign="middle" style="background-color:#eee;"|NULL |

  • Empty value

 
 is.null(~)

|- 
|align="center" valign="middle" style="background-color:#eee;"|NA |

  • Not Available (missing value, 결측치), is.na(var1)

  • mean(~, na.rm=T) : NA 값은 계산에서 제외

 
 var1[!complete.cases(var1),](!complete.cases(var1),.md)          #--- var1에서 NA 데이터가 포함된 레코드 제외
 var1[](is.na(!var1$field1),)           #--- var1에서 field1이 NA인 데이터 레코드 제외
 na.omit(data)                         #--- NA가 포함된 행 제외
 na.pass(data)                         #--- NA 여부에 상관없이 처리
 na.fail(data)                         #--- NA 포함시 Exception 발생
 
 library(Amelia)
 data(freetrade)
 
 #--- year, country를 고려하고 5개의 파일을 만들어 NA 데이터 처리
 imsi <- amelia(freetrade, m=5, ts="year", cs="country") 
 freetrade$tariff <- imsi$imputation[5](5.md)$tariff
 missmap(freetrade)
 
 hist(imsi$imputations[3](3.md)$tariff, col="grey", border="white")
 write.amelia(obj=imsi, file.stem="outdata")   #--- outdata1.csv ~ outdata5.csv

|- 
|align="center" valign="middle" style="background-color:#eee;"|NaN |

  • Not a Number

 
 is.nan(var1)

|- 
|align="center" valign="middle" style="background-color:#eee;"|Inf |

  • Infinite number (-Inf)

 
 is.finite(var1)

|}

 
  • Formulas

    • y ~ x : y는 x로 기술됨

      • : 효과 추가 (y ~ x1 + x2)

    • : : Interaction ( y ~ x1 : x2)

      • : Main effect + interaction (y ~ x1 * x2는 다음과 동일 y ~ x1 + x2 + x1 : x2)

    • I() : I()를 사용하여 수식 형태의 독립변수 추가, 예) I(x^2)

    • (x1 + x2 + x3)^2 : 최대 2개까지의 변수가 상호 작용이 있음

    • x1 + x2 + x3 + x1:x2 + x1:x3 + x2:x3

    • -1 : Remove intercept

 
 

빅데이터 분석

  • 요약 변수 (Summary Variables)

    • 빅데이터 분석을 위해서 1차 가공한 변수

    • 연속형 변수 : 구간화

    • 시계열 : 기간별 ~, 요일별 ~, 주중/주말별 ~

    • Trend : 증감액, 증감비율

    • 순서 : 구매 순서

    • SNS 데이터 : 단어 빈도

  • 파생 변수 (Derived Variables)

    • 분석자의 판단에 따라 특정 조건을 만족하는 변수

    • 예) 가중치를 부여한 데이터, 주구매 상품 10개

    • 예) 근무시간 구매지수, 주구매 매장, 주 활동 지역, 주구매 상품(10개), 구매 상품 다양성, 가격 선호대, 시즌 선호 고객, Life Stage, Life Style, 행사 민감, 휴면 가망, 최대 가치, 고객 생애 가치 (CLV), Best Call Time

     
  • 독립 변수

    • 종속 변수를 설명하기 위해서 사용하는 변수

  • 종속 변수

    • 분석의 대상이 되는 변수

    • 독립 변수로 설명을 하고자 하는 변수

     
  • 데이터의 속성을 확인하는 함수

    • class(~) : 변수의 type을 표시

      • is.numeric, is.factor, is.matrix, is.data.frame 등의 함수 제공

    • typeof(~) : 저장된 데이터 type을 표시

    • mode(~) : 데이터의 저장 구조 표시

    • str(~) : 데이터의 내부 구조 표시

    • 데이터 변환

      • 생성자의 인자로 데이터를 전달하여 변환

      • as.character, as.numberic, as.factor 등의 함수 제공

    • R의 객체는 불변하므로 객체 연산을 하는 것이 속도와 메모리 측면에서 유리

 
 

CentOS에서 R 설치


사전 준비 사항

  • [CentOS에 EPEL 설치](CentOS.md#EPEL 설치.md)

 
 

설치

  • R을 설치 합니다.

 
 yum install R R-*
 R --version
  • 관련 패키지 설치

 
 R
     install.packages("KoNLP")
 
  • 설치 정보

    • 홈 디렉토리 : /usr/lib64/R

    • 라이브러리 설치 폴더 : /usr/lib64/R/library

    • R_SHARE_DIR=/usr/share/R

    • R_INCLUDE_DIR=/usr/include/R

    • R_DOC_DIR=/usr/share/doc/R-3.0.0

     
  • 실행

 
 R
     q() 와 n을 입력하여 종료 합니다.
 

Windows에서 R 설치


R 설치

  • http://cran.rstudio.com/ 사이트에서 Windows용 R 설치 파일(R-3.0.2-win.exe)을 다운로드 하여 설치 합니다.

  • Windows의 시작 메뉴에서 "R -> R x86 3.0.2" 메뉴를 선택하여 R을 실행 합니다.

 
 q()                      //--- R 종료
 

RStudio 설치

  • http://www.rstudio.com/ide/download/desktop 사이트에서 윈도우용 RStudio 설치 파일(RStudio-0.98.501.exe)을 다운로드 하여 설치 합니다.

  • Windows의 시작 메뉴에서 "RStudio -> RStudio" 메뉴를 선택하여 RStudio를 실행 합니다.

 
 

R 매뉴얼


R의 기본 문법

  • R 기본 명령어

 
 ? cmd                       //--- 명령어/함수 등에 대한 도움말
 help(cmd)                   //--- 명령어/함수 등에 대한 도움말
 ?? cmd                      //--- 명령어/함수 검색   
 install.packages("~")       //--- Package 설치
 library(package)            //--- Package 로딩
 q()                         //--- 종료
 
  • 제어문

    • var : 데이터의 내용 표시

    • var <- val : 변수에 값 지정

    • while (~) { break; continue; }

    • if (~) { ~ }

    • 함수 선언 : funcName <- function(~) { return(result) }

    • Sequence value : 1:5 -> 1, 2, 3, 4, 5

 
 1:5
 seq(0, 10, by=1)
 seq(0, 10, length=20)
 rep(5, 10)                //--- 5를 10번 반복
  • debug(함수명), undebug(함수명) : 함수 실행시 debug 모드로 실행

    • n : 함수를 한줄씩 실행

    • c : 함수의 현단계 마지막까지 실행함

    • ls() : 확인 가능한 변수를 보여줌

    • where : 활성화된 함수의 traeback 목록 표시

    • Q : Debug Browser 종료

     
  • 기본 함수

    • summary(~) : 통계 정보

    • range() : 최대/최소, quantile() : 4분위 수, var() : 분산, sqrt() : 표준펀차

    • hist() : Histogram, plot() : 선 그래프, boxplot(), plot() : 산점도 행렬

     
  • 데이터 입력

    • 표준 입력 : scan()

    • 파일 입력 : read.table(), text, csv, 압축파일 (zip, gzip, bzip 등)

    • 데이터 소스 입력 : URL, Database 등

 
 varA <- read.csv(~.csv)
 load("~.Rdata")
 
  • 데이터 처리

 
 print(varA)
 rm(varA)                             //--- varA 변수를 삭제
 rm(list=ls(pattern="a01?"))          //--- a01로 시작하는 모든 변수 삭제
 
 data(varA)
 describe(varA)
 summary(varA)
 
  • 데이터 저장

 
 write.csv(varA, "~.csv")
 save(varA, file="~.Rdata")           //--- 데이터 파일로 저장
 

R 사용법

  • R

 
 memory.limit(4096)                   #--- Memory를 4GB로 설정
 
  • Package Library

    • bigmemory package

 
 install.packages("bigmemory", repos="Http://R-Forge.R-project.org")
  • biganalytics package

 
 install.packages("biganalytics", repos="Http://R-Forge.R-project.org")
  • doSMP

  • Rhipe (R and Hadoop Integrated Processing Environment)

    • Google Protocol Buffers (protobuf 2.4.1)

 
 R CMD INSTALL Rhipe_version.tar.gz
 
 library(Rhipe)
 system("wget ~")
 rhput("~", "hdfs://user/root/~")
 
 map<-expression({
     words_vector<-unlist(strsplit(unlist(map.values), " "))
     lapply(words_vector, function(i) rhcollect(i, 1))
 })
 
 reduce<-expression(
     pre={total <- 0},
     reduce={total<-sum(total, unlist(reduce.values))},
     post={rhcollect(reduce.key, total)}
 )
 
 Job <- rhmr(
     map=map, reduce=reduce, inout=c("text", "sequence"),
     ifolder="hdfs://user/root/~", 
     ofolder="hdfs://user/root/out/~",
     jobname="word_count"
 )
 rhex(job)
 
 x<-rhread("hdfs://user/root/out/~")
 head(do.call("rbind", lapply(x, function(x) list(x[[x]], x[2](2.md)))))
 
 m <- expression({
     for (i in 1:length(map.values)) rhcollect(map.key[[i]], map.values[i](i.md))
 })
 
 res <- rhmr(map=m, inout=c("seq", "map")
     ifolder="hdfs://user/root/out/~",
     ofolder="hdfs://user/root/out2/~",
 )
 rhex(res)
 
 rhgetkey(list("whale"), "hdfs://user/root/out2/~")
 

R 한글

 
 

샘플링

 ###-----------------------------------------------------------------------------
 ### Sample 추출
 ###-----------------------------------------------------------------------------
 data <- iris
 
 #--- Index를 사용한 샘플링
 #--- replace = TRUE : 복원 추출
 #--- 2. 그룹수, 70% : 30%
 idx <- sample(2, nrow(data), replace = TRUE, prob = c(0.7, 0.3))
 train <- data[== 1, ](idx)
 test <- data[== 2, ](idx)
 
 #--- 데이터를 랜덤하게 섞은 후 샘플링
 idx <- sample(1:nrow(data), nrow(data), replace = FALSE)
 data01 <- data[](idx,)
 train <- data01[* 0.7), ](1:floor(nrow(data))
 test <- data01[* 0.7) + 1):nrow(data), ]((floor(nrow(data))
 
 #--- 가장 나쁜 샘플링
 idx1 <- sample(1:nrow(data), floor(nrow(data) * 0.7), replace = FALSE)
 idx2 <- setdiff(1:nrow(data), idx1)
 train <- data[](idx1,)
 test <- data[](idx2,)
 rm(list = c("idx1", "idx2")) 
 
 #--- 분류별 샘플 추출
 library(doBy)
 train <- sampleBy(~ Species, frac = 0.7, replace = FALSE, data = data)
 train <- sampleBy(~ Species, frac = 0.7, systematic = TRUE, data = data)   #--- 계통 추출 
 
 #--- 층화 임의 추출
 library(sampling)
 #--- 비복원 단순 임의 추출, Species의 3가지 종류별로 3개, 4개, 5개 샘플 추출
 idx <- strata(c("Species"), size = c(3, 4, 5), method = "srswor", data = data)
 train <- getdata(data, idx)
 #--- 복원 단순 임의 추출, Species의 3가지 종류별로 3개, 4개, 5개 샘플 추출
 idx <- strata(c("Species"), size = c(3, 4, 5), method = "srswr", data = data)
 train <- getdata(data, idx)
 
 #--- K-Fold Cross Validation
 library(cvTools)
 m <- cvFolds(nrow(data), K = 10, R = 3) #--- 1/10만큼 테스트 데이터 추출
 idx <- m$subset[== 1), 1](which(m$which) #--- 첫번째 반복에 사용할 행 번호
 train <- data[](-idx,)
 test <- data[](idx,)
 
 #--- createDataPartition
 library(caret)
 part <- createDataPartition(data$Species, p = 0.7)   #--- 70% 샘플링
 train <- data[](part$Resample1,)
 test <- data[](-part$Resample1,)
 
 #--- 불균형을 없애는 샘플링
 library(caret)
 train <- upSample(subset(data, select = - Species), data$Species)
 train <- downSample(subset(data, select = - Species), data$Species)
 
 library(DMwR)
 train <- SMOTE(Species ~ ., data, perc.over = 600, perc.under = 100)
 
 
 pSample <- function(data, prob = c(0.7, 0.3), type = 1) {
   if (type == 1) {
     idx <- sample(2, nrow(data), replace = TRUE, prob = prob)
     train <- data[== 1, ](idx)
     test <- data[== 2, ](idx)
     list(train = train, test = test)  
   } else {
     idx <- sample(1:nrow(data), nrow(data), replace = FALSE)
     data01 <- data[](idx,)
     train <- data01[1:floor(nrow(data) * prob[](1]),)
     test <- data01[(floor(nrow(data) * prob[+ 1):nrow(data), ](1]))
     list(train = train, test = test)  
   }
 }
 data <- pSample(iris, type = 2)
 data$train
 data$test
 
 rm(list=ls(all=TRUE))                   #--- 작업 영역에 저장된 데이터 모두 삭제
 

데이터 입출력

  • 데이터 로딩

 
 data <- read.table("data/ADV_4_2_003.csv", header=TRUE, sep=",", 
                    stringsAsFactors=FALSE, na.strings=c('NIL'), 
                    comment.char="#", encoding="UTF-8") 
 load("~.RData")
 
  • 데이터 저장

 
 write.table(data, file="data/data.csv", append=FALSE, quote=FALSE, sep=",", row.names=FALSE)
 save(data, "~.RData)
 

Package


knitr

R에는 Markdown을 지원하는 markdown 이라는 패키지가 있습니다. 여기에 knitr 패키지를 사용하면 손쉽게 R 코드를 사용하여 HTML 문서를 만들수 있습니다.

 
  • 패키지 설치

 
 install.packages("knitr")
 install.packages("markdown")
 
  • Rmd 파일로 HTML 파일 생성

 
  1. 첨부된 SampleKnitr.Rmd 파일을 RStudio의 작업 폴더로 복사 합니다.

  2. RStudio에서 SampleKnitr.Rmd 파일을 오픈 합니다.

     방법 1. "File --> Open File..." 메뉴를 선택하여 파일을 오픈 합니다.
     방법 2. 작업 폴더에서 해당 파일을 마우스로 클릭하여 오픈 합니다.

600px

 
  1. "Knit HTML" 아이콘을 선택하여 Rmd 파일을 HTML 파일(SampleKnitr.html)로 변환 합니다. 
    600px

      
  • Markdown 문법
    ~.Rmd 파일에서 사용할 수 있는 markdown 문법은 간단하기 때문에
     
    아래 SampleKnitr.Rmd 파일을 RStudio에서 HTML로 변환하여 비교를 하여 보세요.

 Markdown 사용법
 =
 
 
 기본 문법
 -
 
 ### 줄바꾸기
 한 라인의 끝에 두자 이상의 공백 문자를 사용하면   
 줄이 변경 됩니다.  
 
 ### 설명문
 > 라인의 시작을 ">" 문자로 시작하면  
 > 설명문을 표시 합니다.
 
 ### 참조 
 
 #### 링크
 http://www.jopenbusiness.com/  
 [비즈니스 컨설팅](오픈소스)(http://www.jopenbusiness.com/)
 
 [오픈소스 비즈니스 컨설팅][id1](id1.md).  
 [id1](id1.md): http://www.jopenbusiness.com/ "Title" 
 
 #### 이미지
 ![비즈니스 컨설팅](오픈소스)(h ttp://www.jopenbusiness.com/mediawiki/images/2/28/Namecard_10.png)
 
 ![오픈소스 비즈니스 컨설팅][id2](id2.md)
 [id2](id2.md): h ttp://www.jopenbusiness.com/mediawiki/images/2/28/Namecard_10.png "Title"
 
 
 ### 글씨체 등
 *이탤릭체*  
 **볼드체**  
 위 첨자^2  
 ~~삭제된 문장~~
 
 
 목록
 -
 
 ### 순서 없는 목록
 * 항목 1
 * 항목 2
  * 항목 2-1
  * 항목 2-2
 
 ### 순서 있는 목록
 1. 항목 1
 2. 항목 2
  1. 항목 2-1
  2. 항목 2-2
 
 ### 테이블
 제목 1 | 제목 2
 ----------|----------
 항목 11 | 항목 21
 항목 12 | 항목 22
 
 
 R 코드 실행
 -
 
 ### 코드 블럭 추가
 ```{r}
 #--- R 코드 추가, R 코드 실행 결과 표시
 summary(iris)
#--- R 코드 추가
summary(iris)

인라인 코드 추가

R 코드 실행 결과 추가 : iris의 dimension은

r dim(iris)
입니다.
R 코드만 추가 : iris의 dimension은
dim(iris)
입니다.

  
- knitr 패키지 사용법  

library(knitr) 
library(markdown)

knit(".Rmd") 
markdownToHTML("
.md", "~.html")

  
- 참고 문헌  
  - http://www.rstudio.com/ide/docs/authoring/using_markdown?version=0.98.501&mode=desktop  
  - http://www.rstudio.com/ide/docs/r_markdown  
  - http://daringfireball.net/projects/markdown/syntax  
  

### dplyr
- dplyr 패키지  

library(dplyr)  
data(iris)

  {|cellspacing="0" cellpadding="2" border="1" width="100%" bgcolor="#FFFFFF" align="center"
|-
|width="20%" align="center" valign="middle" style="background-color:#eee;"|함수
|width="80%" align="center" valign="middle" style="background-color:#eee;"|상세
|-
|align="center"|tbl_df()
|
- data.frame 데이터를 data.frame table 형태의 데이터로 변환 합니다.  
- print() 시 한 페이지에 해당하는 데이터만 보여주는 기능외에는 특별한 기능은 없습니다.  

(data <- tbl_df(iris))

|-
|align="center"|filter()
|
- 데이터 추출  
  - 조건 : & - AND (,로 구분시), | - OR  
- data <- filter(data, 조건1, 조건2)  

(data <- filter(data, Species == 'setosa' | Species == 'versicolor'))

|-
|align="center"|arrange()
|
- 정렬 : desc() 사용시 내림차순으로 정렬  
- data <- arrange(data, field1, desc(field2))  

(data <- arrange(data, Sepal.Length))

|-
|align="center"|select()
|
- 열 추출 (- 사용시 추출에서 제외할 열 지정)  
- data <- select(data, field1, -field2)  

(data <- select(data, Sepal.Length, Sepal.Width, Species))

|-
|align="center"|mutate()
|
- 열 추가 : 새로 추가된 열은 다음 계산식에서 사용 가능  
- data <- mutate(data, newField = 계산식)  

(data <- mutate(data, Total = Sepal.Length + Sepal.Width))

|-
|align="center"|group_by()
|
- 그룹화 : field1의 값으로 그룹화  
- data <- group_by(data, field1)  

(data <- group_by(data, Species))

|-
|align="center"|summarise()
|
- 집계 : group_by()로 지정한 그룹을 기준으로 집계  
- summarise(data, t1 = 수식, t2 = 수식)  

summarise(data, meanLength = mean(Sepal.Length), meanWidth = mean(Sepal.Width))

|}
  
- dplyr는 chain 형태로도 사용할 수 있습니다.  
  - data %.% 함수1 %.% 함수2 %.% 함수3  

data(iris) 
(data <- iris) (data <- data %.% filter(Species == 'setosa' | Species == 'versicolor') %.% arrange(Sepal.Length) %.% select(Sepal.Length, Sepal.Width, Species) %.% mutate(Total = Sepal.Length + Sepal.Width) %.% group_by(Species) %.% summarise(meanLength = mean(Sepal.Length), meanWidth = mean(Sepal.Width)) )

  

## Classification

### 분류 분석
- 분류 분석 개요  

#--- MASS : m <- lda(Species ~ ., data=train); pred$class 
#--- MASS : m <- qda(Species ~ ., data=train); pred$class #--- party : m <- ctree(Species ~ ., data=train); pred #--- party : m <- cforest(Species ~ ., data = train, control = cforest_unbiased(mtry = 3)); pred #--- randomForest : m <- randomForest(Species ~ ., data = train, ntree = 100, proximity = TRUE); pred

#--- rpart : m <- rpart(Species ~ ., data = train, control = rpart.control(minsplit = 10))) 
#--- predict(result$m, result$train) #--- class가 숫자일 경우 사용

  
- 분류 분석  

###--- 데이터 준비 
data <- iris idx <- sample(2, nrow(data), replace = TRUE, prob = c(0.7, 0.3)) train <- data== 1,  
test <- data== 2,  
cls <- "Species" formula = Species ~ .

###--- 분류 분석 (아래에서 한가지 선택) 
library(MASS) m <- lda(formula, data=train) #--- Linear Discriminant Analysis, 선형 판별 분석

library(MASS) 
m <- qda(formula, data=train) #--- Quadratic Discriminant Analysis, 이차 판별 분석

library(party) 
m <- ctree(formula, data=train)

library(party) 
m <- cforest(formula, data = train, control = cforest_unbiased(mtry = 3))

library(randomForest) 
m <- randomForest(formula, data = train, ntree = 100, proximity = TRUE) #--- ntree = 100 : 최대 트리개수 100개 #--- proximity = TRUE : 다양한 트리분할 시도

###--- data로부터 분류 산정 
pred <- predict(m) #--- cforest pred <- predict(m, train) #--- ctree, randomForest pred <- predict(m, train)$class #--- lda, qda

###--- 분류 분석 시각화 
plot(m) #--- lda, ctree, randomForest plot(m, type = "simple") #--- ctree

###--- 변수 및 분류 분석 평가 
margin(m, datacls) #--- randomForest 
varImpPlot(m) #--- randomForest importance(m) #--- randomForest

table(pred, traincls) #--- 예측값과 실제값의 비교 
correct <- pred == traincls 
print(paste(round(mean(correct) * 100, 2), "% of predicted classifications correct for train", sep=""))

###--- 분류 분석을 통한 예측 
pred <- predict(m, newdata = test) #--- ctree, cforest, randomForest pred <- predict(m, newdata = test)$class #--- lda, qda table(pred, testcls) #--- 예측값과 실제값의 비교 
correct <- pred == testcls 
print(paste(round(mean(correct) * 100, 2), "% of predicted classifications correct for test", sep=""))

  

## Estimation

### formula
- 문자열을 사용하여 R Language에서 제공하는 formula 생성하기  

formula("문자열")

  

### 회귀분석

###--- 데이터 준비 
data <- iris left <- "Sepal.Length" upper = "~ Sepal.Width + Petal.Length + Petal.Width"

###--- 수작업으로 회귀 분석, 유의한 결과가 나올 때까지 formula를 변경해 가면서 적용 
plot(data) #--- 데이터의 분포를 보고 초기 회귀식을 작성

m <- lm(formula(paste(left, upper)), data = data)
#--- 회귀식 : Sepal.Length = 1.8560 + 0.6508 * Petal.Length + 0.7091 * v - 0.5565 * Petal.Width 
#--- formula(paste(left, upper)) 부분을 원하는 formula로 변경해 가면서 회귀식을 작성 하세요.

summary(m) 
#--- F 통계량 (F-statistic) #--- p-value : 유의수준 5%하에서 0.05보다 작으면 통계적으로 유의함 #--- 결정 계수 (Multiple R-Squared) : 회귀식이 데이터를 설명하는 정도 #--- 수정 결정 계수 (Adjusted R-squared) #--- 유의수준 (Pr(>|t|)) : 회귀계수들의 p-value, 0.05보다 작으면 통계적으로 유의함 #--- 후진제거법으로 변수 선택시, 유의수준이 높은 변수부터 제거 합니다.

###--- 자동으로 회귀 분석 
step(lm(formula(paste(left, "~ 1")), data=data), scope=list(lower=~ 1, upper=formula(upper)), direction="forward") #--- 전진선택법 step(lm(formula(paste(left, upper)), da ta=data), scope=list(lower=~ 1, upper=formula(upper)), direction="backward") #--- 후진소거법 step(lm(formula(paste(left, "~ 1")), data=data), scope=list(lower=~ 1, upper=formula(upper)), direction="both") #--- 단계적방법

  

### 시계열 분석

###--- 데이터 준비 
(data <- c(60, 43, 67, 50, 56, 42, 50, 65, 68, 43, 65, 34, 47, 34, 49, 41, 13, 35, 53, 56, 16, 43, 69, 59, 48, 59, 86, 55, 68, 51, 33, 49, 67, 77, 81, 67, 71, 81, 68, 70, 77, 56)) (data <- ts(data)) #--- 데이터를 시계열 자료 형식으로 변환

###----------------------------------------------------------------------------- 
#--- 자동으로 시계열 모형 선택 library(forecast) auto.arima(data) #--- 자동으로 최적의 ARIMA 모형을 제시

###----------------------------------------------------------------------------- 
#--- 수동으로 시계열 모형 선택 plot(data) #--- 각 요인(추세, 순환, 계절, 불규칙)을 시각적으로 확인 data01 <- data

#--- 평활 : 들쭉날쭉한 시계열자료 값을 평탄한 값으로 변환 
#--- 이동평균법, 지수평활법 등 library(TTR) #--- 평활 plot(data01) plot(SMA(data01, n = 2)) #--- 2년마다 평균을 낸 데이터로 변환 plot(SMA(data01, n = 3)) #--- 3년마다 평균을 낸 데이터로 변환 plot(SMA(data01, n = 4)) #--- 4년마다 평균을 낸 데이터로 변환 plot(SMA(data01, n = 5)) #--- 5년마다 평균을 낸 데이터로 변환 plot(SMA(data01, n = 6)) #--- 6년마다 평균을 낸 데이터로 변환 plot(SMA(data01, n = 7)) #--- 7년마다 평균을 낸 데이터로 변환 plot(SMA(data01, n = 8)) #--- 8년마다 평균을 낸 데이터로 변환 plot(SMA(data01, n = 9)) #--- 9년마다 평균을 낸 데이터로 변환 (data01 <- SMA(data01, n = 3)) #--- n의 값은 위 그래프를 보고 판단

#--- 정상형 시계열 자료로 만들기 위해서 차분을 진행 
plot(data01)
plot(diff(data01, differences = 1)) #--- 1차 차분 (difference), ARIMA(p, 1, q) 모델 
plot(diff(data01, differences = 2)) #--- 2차 차분 (difference), ARIMA(p, 2, q) 모델 plot(diff(data01, differences = 3)) #--- 3차 차분 (difference), ARIMA(p, 3, q) 모델 plot(diff(data01, differences = 4)) #--- 4차 차분 (difference), ARIMA(p, 4, q) 모델 plot(diff(data01, differences = 5)) #--- 5차 차분 (difference), ARIMA(p, 5, q) 모델 plot(diff(data01, differences = 6)) #--- 6차 차분 (difference), ARIMA(p, 6, q) 모델 plot(diff(data01, differences = 7)) #--- 7차 차분 (difference), ARIMA(p, 7, q) 모델 plot(diff(data01, differences = 8)) #--- 8차 차분 (difference), ARIMA(p, 8, q) 모델 plot(diff(data01, differences = 9)) #--- 9차 차분 (difference), ARIMA(p, 9, q) 모델 (data01 <- diff(data01, differences = 2)) #--- differences의 값은 위 그래프를 보고 판단

#--- 부분자기함수(PACF) 
(pacf(data01, lag.max=10)) #--- 부분자기함수(PACF) #--- lag = 0인 지점은 판단에서 제외 #--- lag = 만약 4에서 절단점을 가질 경우 AR(3) 모형

 

#--- 자기상관함수(ACF) 
(acf(data01, lag.max=10, Plot=TRUE)) #--- 자기상관함수(ACF) #--- lag = 0인 지점은 판단에서 제외 #--- lag = 만약 2에서 절단점을 가질 경우 MA(1) 모형

 

###----------------------------------------------------------------------------- 
#--- 모델 보정 (fitting) 및 예측 (data02 <- arima(data, order=c(2, 0, 0)))

library(forecast) 
(data03 <- forecast.Arima(data02, h=20))#--- 20개 데이터 예측 plot(data03) #--- 신뢰구간 80%와 95%에서 예측값 표시

###----------------------------------------------------------------------------- 
#--- 분해 시계열 모형 plot(data) #--- 각 요인(추세, 순환, 계절, 불규칙)을 시각적으로 확인

m <- decompose(data) #--- 시계열에 영향을 주는 일반적인 요인을 시계열에서 분리
m$x #--- 원본 데이터 
m$trend #--- 추세요인 (Trend factor, 경향요인) m$seasonal #--- 계절요인 (Seasonal factor) m$random #--- 불규칙요인 (Irregular factor) plot(m) #--- 추세요인, 계절요인, 불규칙요인이 포함된 그래프

plot(data - m$trend) #--- 추세요인을 제거한 그래프 
plot(data - m$trend - m$seasonal) #--- 추세요인과 계절요인을 제거한 그래프

  
- 참고 문헌  
  - [계절 ARIMA](https://www.otexts.org/fpp/8/9)  
  

## Clustering

###  군집 분석 
  
- 군집 분석 개요  
  

#--- stats  : m <- kmeans(data, centers = 3); m$cluster 
#--- stats  : m <- hclust(dist(data, method = "euclidean")^2, method = "ward") #--- pred <- cutree(m, k = 3) #--- cluster  : m <- pam(data, 3), m$cluster #--- cluster  : m <- fanny(data, 2), m$cluster

#--- fpc  : m <- dbscan(data, eps = 0.5, MinPts = 5); m$cluster 
#--- pred <- predict(m, data) #--- class  : m <- SOM(data, somgrid(topo = "hexagonal")) #--- m <- SOM(data, somgrid(topo = "hexagonal"), #--- alpha = list(seq(0.05, 0, len = 1e4), seq(0.02, 0, len = 1e5)), #--- radii = list(seq(8, 1, len = 1e4), seq(4, 1, len = 1e5)))

  
- 군집 분석  
  

#--- 데이터 준비 
data <- iris1:4 #--- 원본 데이터 
cls <- iris5 #--- 원본 데이터의 분류 
group <- 3 #--- 군집수, Clustering - 군집수 결정 참조

#--- 군집 분석 (아래에서 한가지 선택) 
library(stats) m <- kmeans(data, group) #--- K-평균군집

library(cluster) 
m <- pam(data, group) #--- PAM (Partitioning Around Medoids)

library(cluster) 
m <- fanny(data, group) #--- Fuzzy Clustering

library(fpc) 
m <- dbscan(data, eps = 0.5), MinPts = 5) #--- Density-based Clustering #--- eps : Maximum distance #--- MinPts : 최소 데이터 개수 #--- eps 범위내에 MinPts 개수의 데이터가 있으면 군집으로 분류

#--- data로부터 군집 산정 
pred <- m$cluster

  
- 시각화를 위해서는 아래 방식을 사용해 보세요.  
  

plot(m) #--- pam, fanny 
plot(data, col = pred) #--- kmeans, pam, fanny plot(m, data) #--- dbscan plotcluster(data, pred) #--- dbscan

  
- 군집 분석의 제대로 되고 있는지 확인 하려면 아래와 같이 수작업을 하세요.  
  

table(pred, cls) 
#--- predStr : 숫자로 표시된 pred를 문자로 변경하기 위해 사용 #--- data 별로 다르므로 매번 수작업이 필요 합니다. predStr <- c("setosa", "versicolor", "virginica")
print(paste(round(mean(predStrpred == cls) * 100, 2), "% of predicted clusters correct", sep=""))

  
  
  
참고 문헌
  
- SOM : http://shanelynn.ie/index.php/self-organising-maps-for-customer-segmentation-using-r/  
  

### 군집의 개수 산정

###-----------------------------------------------------------------------------

군집의 개수 산정

data : 원본 데이터

groups : 확인할 군집의 개수 범위

그래프의 경사가 완만해 지는 지점이 군집의 개수 입니다

###----------------------------------------------------------------------------- 
findCluster = function(data = iris1:4, groups = 1:10) { 
models <- 0 for (i in groups) { modelsi <- sum(kmeans(data, centers = i)$withinss) 
} plot(groups, models, type = "b", main = "군집의 개수 산정", xlab = "군집의 수", ylab = "군집간 거리 제곱합") } findCluster()

  

## Association

### 연관 분석

###-----------------------------------------------------------------------------

연관 분석

트랜잭션 데이터 : items, transactionID, TimeStamp

items : 트랜잭션(rows)에 속한 항목(columns)의 이름과 값

transactionID : 트랜잭션 아이디 (rows 이름)

TimeStamp : 트랜잭션이 발생한 시간

###-----------------------------------------------------------------------------

###--- 데이터 준비 
data(Epub, package = "arules") (data <- Epub)

length(data) #--- transactions 데이터 개수 
size(data1) #--- 첫번째 트랜잭션의 항목수

data1 #--- 첫번째 트랜잭션 데이터 조회 
inspect(data1) #--- 첫번째 트랜잭션 데이터 상세 조회 
transactionInfo(data1) #--- transactions 데이터 조회 
itemsetInfo(data1) #--- 첫번째 트랜잭션 아이디 
itemInfo(data1) #--- 모든 항목의 목록

summary(data1) #--- 첫번째 트랜잭션 데이터 요약 
summary(data) #--- 트랜잭션 데이터 요약

as(data, "list")1 #--- list로 변환한 후 첫번째 데이터 조회 
format(as.POSIXlt(transactionInfo(data[1])"TimeStamp"), "%Y-%m-%d %H:%M:%S") #--- TimeStamp를 문자열로 변환

#--- support = 0.1 : 최소지지도 10% 이상 
#--- cex.names = 0.8 : 글씨 크기 itemFrequencyPlot(data, support = 0.1, cex.names = 0.8) #--- 항목별 빈도수

#--- support = 0.01 : 최소지지도 1% 이상, 최소신뢰도 60% 이상인 연관 규칙 탐색 
(m <- apriori(data, parameter = list (support = 0.01, confidence = 0.6))) summary(m) length(m) #--- 연관규칙의 개수 inspect(m1:10) #--- 10개의 연관규칙 조회 
#--- 연관규칙 : lhs 발생 후에 rhs 발생 #--- support : 지지도, confidence : 신뢰도, lift. 향상도 inspect(sort(m1:10)) #--- 지지도 내림 차순으로 정렬후 조회 
inspect(sort(m1:10, by = "confidence")) #--- 신뢰도 내림 차순으로 정렬후 조회 
inspect(sort(m1:10, by = "lift")) #--- 향상도 내림 차순으로 정렬후 조회

#--- rhs가 "income=small"이고 향상도(lift)가 1.2 이상이 연관규칙 추출 
(small <- subset(m, subset = rhs %in% "income=small" & lift > 1.2)) inspect(small1:10) #--- 10개의 연관규칙 조회

#--- rhs가 "income=large"이고 향상도(lift)가 1.2 이상이 연관규칙 추출 
(large <- subset(m, subset = rhs %in% "income=large" & lift > 1.2)) inspect(large1:10) #--- 10개의 연관규칙 조회

write(m1:10, file="m.txt", sep = "\t", col.names = NA) #--- 연관규칙을 파일로 저장 
library("pmml") saveXML(pmml(m1:10), file = "m.xml") #--- 연관규칙을 XML로 변환한 후, XML 파일로 저장

  

## Optimization

### loSolve

#--- "판매 수익 최대화" 
#--- 제품 : A, B, C, D #--- 목적 함수 : 4 * A + 6 * B + 7 * C + 8 * D (최대 수익) #--- 제약식 #--- 혼합 공정 시간 : 1 * A + 1.5 * B + 2 * C + 3 * D <= 800시간 #--- 주형 공정 시간 : 1.5 * A + 2 * B + 2 * C + 3 * D <= 1000시간 #--- 검사 공정 시간 : 0.5 * A + 0.6 * B + 1 * C + 1 * D <= 340시간 #--- B <= A : 1 * A - 1 * B + 0 * C + 0 * D >= 0 library(lpSolve) f.obj <- c(4, 6, 7, 8) #--- 목적함수 계수 (f.con <- matrix(c( 1, 1.5, 2, 3,
1.5, 2, 2, 3,  
0.5, 0.6, 1, 1, 1, -1, 0, 0), nrow = 4, byrow = TRUE))#--- 제약식 행렬 (f.dir <- c("<=", "<=", "<=", ">=")) #--- 제약식 부등호 (f.rhs <- c(800, 1000, 340, 0)) #--- 제약식 우변값

lp("max", f.obj, f.con, f.dir, f.rhs) #--- 목적함수 값 
lp("max", f.obj, f.con, f.dir, f.rhs)$solution #--- 최적의 해

lp("max", f.obj, f.con, f.dir, f.rhs, compute.sens = TRUE)$duals 
lp("max", f.obj, f.con, f.dir, f.rhs, compute.sens = TRUE)$duals.from lp("max", f.obj, f.con, f.dir, f.rhs, compute.sens = TRUE)$duals.to lp("max", f.obj, f.con, f.dir, f.rhs, compute.sens = TRUE)$sens.coef.from #--- 목적식 계수의 민감도 분석 - 하한 lp("max", f.obj, f.con, f.dir, f.rhs, compute.sens = TRUE)$sens.coef.to #--- 목적식 계수의 민감도 분석 - 상한

  

### lpSolveAPI

#--- "판매 수익 최대화" 
#--- 제품 : A, B, C, D #--- 목적 함수 : 4 * A + 6 * B + 7 * C + 8 * D (최대 수익) #--- 제약식 #--- 혼합 공정 시간 : 1 * A + 1.5 * B + 2 * C + 3 * D <= 800시간 #--- 주형 공정 시간 : 1.5 * A + 2 * B + 2 * C + 3 * D <= 1000시간 #--- 검사 공정 시간 : 0.5 * A + 0.6 * B + 1 * C + 1 * D <= 340시간 #--- B <= A : 1 * A - 1 * B + 0 * C + 0 * D >= 0 library("lpSolveAPI") m <- make.lp(0, 4) #--- 4는 변수의 개수 lp.control(m, sense="max") #--- 최대값 구하기 set.objfn(m, c(4, 6, 7, 8)) #--- 목적 함수 add.constraint(m, c(1, 1.5, 2, 3), "<=", 800) #--- 혼합 공정 시간의 제약식 add.constraint(m, c(1.5, 2, 2, 3), "<=", 1000) #--- 주형 공정 시간의 제약식 add.constraint(m, c(0.5, 0.6, 1, 1), "<=", 340) #--- 검사 공정 시간의 제약식 add.constraint(m, c(1, -1, 0, 0), ">=", 0) #--- B <= A 인 제약식 m #--- 등록된 목적 함수와 제약식 보기

solve(m) #--- 최적해 구하기 
get.objective(m) #--- 최적해 get.variables(m) #--- 최적해일 때, 변수들의 값

  

## Text Mining
- 텍스트 마이닝  

library(tm) 
getReaders() #--- Reader의 종류 확인 getTransformations() #--- tm_map용 함수 목록

###-----------------------------------------------------------------------------

Corpus 생성

(lines <- c("You're awe some and I love you",  
"I hate and hate and hate. So angry. Die!", "Impressed and amazed: you are peer less in your achievement of unparalleled mediocrity.", "I love you")) (doc <- Corpus(VectorSource(lines)))

#--- XML 파일 읽기 
#--- C:/Program Files/R/R-3.0.3/library/tm/texts/crude/ 폴더 지정 (folder <- system.file("texts", "crude", package = "tm")) (doc <- Corpus(DirSource(folder), readerControl = list(reader = readReut21578XML))) rm(folder)

###-----------------------------------------------------------------------------

Corpus 조회

summary(doc) 
doc1 #--- 첫번째 문서 조회 
inspect(doc1) #--- 첫번째 문서 조회

#writeCorpus(doc) #--- Corpus 저장 
#writeCorpus(doc1, filenames="01.txt") #--- 첫번째 Corpus 저장

###-----------------------------------------------------------------------------

Corpus 변환

(doc <- tm_map(doc, as.PlainTextDocument))1 #--- XML 문서를 Text로 변환 
(doc <- tm_map(doc, stripWhitespace))1 #--- 두개 이상의 공백을 하나의 공백으로 치환 
(doc <- tm_map(doc, tolower))1 #--- 소문자로 변환 
(doc <- tm_map(doc, removePunctuation))1 #--- 구두점 삭제 
(doc <- tm_map(doc, removeWords, stopwords("english")))1 #--- Stopword (조사, 띄어쓰기, 시제 등)를 제거하고 표준화 
(doc <- tm_map(doc, stripWhitespace))1 #--- 두개 이상의 공백을 하나의 공백으로 치환 
(doc <- tm_map(doc, stemDocument))1 #--- 어근만 추출 
#(doc <- tm_map(doc, removeNumbers))1 #--- 숫자 삭제 
#removeURL <- function(x) gsub("http:alnum:*", "", x) 
#(doc <- tm_map(doc, removeURL))1 #--- URL 삭제 
#rm(removeURL) #(doc <- tm_map(doc, gsub, pattern = "diamond", replacement = "aaa"))1 #--- 문자열 치환

#(doc <- tm_map(doc, grep, pattern = "diamond"))1 #--- diamond가 포함된 라인 번호 반환 
#(doc <- tm_map(doc, stemCompletion, dictionary = doc))1 #--- 어근으로 원래 단어 유추

(a <- c("mining", "miners", "mining"))


(b <- stemDocument(a))


(d <- stemCompletion(b, dictionary=a))


###-----------------------------------------------------------------------------

DocumentTermMatrix / TermDocumentMatrix

(m <- DocumentTermMatrix(doc)) #--- DocumentTermMatrix 생성 
#--- Non-/sparse entries : 단어가 있는 entry / 단어가 없는 entry #--- Sparsity : 문서별 단어 중 한번도 사용하지 않은 비율 (m <- removeSparseTerms(m, 0.70)) #--- Sparsity가 70% 이상인 경우 삭제

dic <- c("prices", "crude", "oil") #--- 여기 기술된 단어를 포함하는 모델 생성 
(m <- DocumentTermMatrix(doc, list(dictionary = dic)))

(m <- TermDocumentMatrix(doc)) #--- TermDocumentMatrix 생성 
(m <- t(m)) #--- DocumentTermMatrix로 변환 (data <- as.matrix(m)) #--- DocumentTermMatrix를 matrix로 변환

m$nrow #--- 문서 (document) 개수 / 단어 (term) 개수 
m$ncol #--- 단어 (term) 개수 / 문서 (document) 개수 m$dimnames #--- 문서 (document)와 단어 (term) 목록 m$dimnames$Docs m$dimnames$Terms m$i #--- 문서 (document) 인덱스 / 단어 (term) 인덱스 m$j #--- 단어 (term) 인덱스 / 문서 (document) 인덱스 m$v #--- m$i[0] 문서에서 m$j0 단어의 발생 빈도 
#--- m$j[0] 문서에서 m$i0 단어의 발생 빈도

inspect(m) #--- 단어의 분포를 확인 
inspect(m3:5) #--- 처음 2개 문서의 3번째에서 5번째 단어의 분포를 확인

findFreqTerms(m, 10) #--- 10회 이상 사용된 단어 표시 
findFreqTerms(m, 10, 15) #--- 10회 이상, 15회 이하 사용된 단어 표시 findAssocs(m, "oil", 0.65) #--- "oil" 단어와 연관성(같이 사용될 확률)이 65% 이상이 단어를 표시

rm(dic)

  
- 단어의 빈도 분석  

###-----------------------------------------------------------------------------

단어의 빈도 분석

(frequency <- colSums(data)) #--- 단어별 발생 건수 계산 
(frequency <- subset(frequency, frequency >= 20)) #--- 10건 이상 발생한 단어 추출

#library(gdata) 
(frequency <- as.data.frame(available.packages())) #--- 패키지 목록 추출 (frequency <- gdata::trim(unlist(strsplit(as.character(frequency$Depends), ',')))) #--- 패키지 의존 정보 추출 (frequency <- gsub('\(.*|\n', '', frequency)) #--- 다양한 문자 부호 제거 
(frequency <- table(frequency)) #--- 단어의 빈도수 테이블

library(ggplot2) 
barplot(frequency, las = 2)

library(wordcloud) #--- 워드 클라우드 
wordcloud(names(frequency), as.numeric(frequency), colors = c("green", "red")) wordcloud(names(frequency), log(as.numeric(frequency)), colors = c("green", "red"))

(colors <- gray((frequency + 10) / (max(frequency) + 10))) 
wordcloud(words = names(frequency), freq = frequency, min.freq = 2, random.order = F, colors = colors) rm(frequency, colors)

rm(list=ls(all=TRUE)) #--- 작업 영역에 저장된 데이터 모두 삭제

  
- 문서의 군집 분석  

###-----------------------------------------------------------------------------

문서의 군집 분석

(fit <- hclust(dist(scale(data)), method = "ward")) 
plot(fit) rect.hclust(fit, k = 3) #--- 5개의 그룹으로 구분 (groups <- cutree(fit, k = 3)) #--- 문서별로 그룹 지정 rm(fit, groups)

k <- 3 
(kmeansResult <- kmeans(m, k)) #--- k-평균 군집 모형 for (i in 1:k) { cat(paste("cluster", i, ": ", sep = "")) s <- sort(kmeansResult$centersi,, decreasing = T) 
cat(names(s), "\n") }

library(fpc) 
(pamResult <- pamk(m, metric = "manhatttan")) (k <- pamResult$nc)

(pamResult <- pamResult$pamobject) 
for (i in 1:k) { cat(paste("cluster", i, ": ")) cat(colnames(pamResult$medoids)which(pamResult$medoids[] == 1), "\n") 
}

plot(pamResult, color = F, labels = 4, lines = 0, #--- 오류가 발생함 
cex = .8, col.clus = 1, col.p = pamResult$clustering)

rm(list=ls(all=TRUE)) #--- 작업 영역에 저장된 데이터 모두 삭제

  
- 감성 분석  

###-----------------------------------------------------------------------------

감성 분석

###----------------------------------------------------------------------------- 
#--- 문장을 입력받아 문장과 점수를 반환 #--- 점수 = 긍정 점수 - 부정 점수 #--- 긍정 점수 : 긍정 단어 (pos.words)가 포함된 개수 #--- 부정 점수 : 부정 단어 (neg.words)가 포함된 개수 (pos.word <- scan("data/ADV_4_5_positiveWords.txt", what = "character", comment.char = ";")) #--- 긍정 단어 (pos.words <- c(pos.word, "upgade")) (neg.word <- scan("data/ADV_4_5_negativeWords.txt", what = "character", comment.char = ";")) #--- 부정 단어 (neg.words <- c(neg.word, "wait", "waiting"))

scores <- function(sentences, pos.words, neg.words, .progress='none') { #--- 점수와 문장을 반환 
require(plyr) require(stringr) scores = laply( sentences, function(sentence, pos.words, neg.words) { sentence = gsub(':punct:', '', sentence) #--- 구두점 삭제 
sentence = gsub(':cntrl:', '', sentence) #--- 특수기호 삭제 
sentence = gsub('\d+', '', sentence) #--- 숫자 삭제 
sentence = tolower(sentence) #--- 소문자로 변환

 
   word.list = str_split(sentence, '\\s+')        #--- 하나 이상의 공백으로 단어 추출
   words = unlist(word.list)                      #--- list를 벡터로 변환
   
   pos.matches = match(words, pos.words)          #--- 긍정의 점수 계산 (긍정 단어와 매핑되는 개수 산정)
   pos.matches = !is.na(pos.matches)
   neg.matches = match(words, neg.words)          #--- 부정의 점수 계산 (부정 단어와 매핑되는 개수 산정)
   neg.matches = !is.na(neg.matches)     
   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) }

(result <- scores(lines, pos.words, neg.words)) 
library(ggplot2) qplot(result$score) hist(result$score)

  
- 연관 분석  

###-----------------------------------------------------------------------------

연관 분석

###----------------------------------------------------------------------------- 
library(KoNLP) extractNoun("연습을 해보고자 한다. 명사가 잘 추출되는지 보자. 빨간색으로 글씨를 쓴다.") sapply("연습을 해보고자 한다. 명사가 잘 추출되는지 보자. 빨간색으로 글씨를 쓴다.", extractNoun) system.time(nouns <- sapply(head(lines, 1000), extractNoun, USE.NAMES = FALSE)) rm(nouns)

(data <- Map(extractNoun, lines)) #--- 각 문장에서 명사 추출 (문장 -> 문자열 목록) 
(data <- unique(data))1 #--- 라인별 데이터를 unique하게 
(data <- sapply(data, unique))1 #--- 각 라인내 데이터를 unique하게

(data <- sapply(data, function(x) { #--- 2자 이상 4자 이하의 한글 단어 추출 
Filter(function(y) { nchar(y) <= 4 && nchar(y) > 1 && is.hangul(y) }, x) })) (data <- Filter(function(x) { length(x) >= 2 }, data)) #--- 단어가 2개 이상 포함된 문장만 추출 (names(data) <- paste("Tr", 1:length(data), sep = "")) #--- 데이터에 행 이름 지정 data #--- 문장별 단어 목록

library(arules) 
(data <- as(data, "transactions")) (dataTab <- crossTable(data))

#--- 빈도수 5%, 같이 있을 확률이 10%인 단어 목록 추출 
#--- 최소지지도 5% 이상, 최소신뢰도 10% 이상인 연관 규칙 탐색 (m <- apriori(data, parameter = list(supp = 0.05, conf = 0.1)))
inspect(m)

rm(list=ls(all=TRUE)) #--- 작업 영역에 저장된 데이터 모두 삭제

  

## Social Network Analytics

###-----------------------------------------------------------------------------

데이터 준비

#data <- read.table("http://sna.stanford.edu/sna_R_labs/data/Krack-High-Tec-edgelist-Advice.txt") 
#write.table(data, file="data/ADV_4_5_001.csv", append=FALSE, quote=FALSE, sep=",", row.names=FALSE) (data01 <- read.table("data/ADV_4_5_001.csv", header=TRUE, sep=",", stringsAsFactors=FALSE, na.strings=c('NIL'), comment.char="#", fileEncoding="UTF-8", encoding="CP949")) colnames(data01) <- c("ego", "alter", "advice_tie")

#data <- read.table("http://sna.stanford.edu/sna_R_labs/data/Krack-High-Tec-edgelist-Friendship.txt") 
#write.table(data, file="data/ADV_4_5_002.csv", append=FALSE, quote=FALSE, sep=",", row.names=FALSE) (data02 <- read.table("data/ADV_4_5_002.csv", header=TRUE, sep=",", stringsAsFactors=FALSE, na.strings=c('NIL'), comment.char="#", fileEncoding="UTF-8", encoding="CP949")) colnames(data02) <- c("ego", "alter", "friendship_tie")

#data <- read.table("http://sna.stanford.edu/sna_R_labs/data/Krack-High-Tec-edgelist-ReportsTo.txt") 
#write.table(data, file="data/ADV_4_5_003.csv", append=FALSE, quote=FALSE, sep=",", row.names=FALSE) (data03 <- read.table("data/ADV_4_5_003.csv", header=TRUE, sep=",", stringsAsFactors=FALSE, na.strings=c('NIL'), comment.char="#", fileEncoding="UTF-8", encoding="CP949")) colnames(data03) <- c("ego", "alter", "reports_to_tie")

#data <- read.csv("http://sna.stanford.edu/sna_R_labs/data/Krack-High-Tec-Attributes.csv", header = T) 
#write.table(data, file="data/ADV_4_5_004.csv", append=FALSE, quote=FALSE, sep=",", row.names=FALSE) (data04 <- read.table("data/ADV_4_5_004.csv", header=TRUE, sep=",", stringsAsFactors=FALSE, na.strings=c('NIL'), comment.char="#", fileEncoding="UTF-8", encoding="CP949"))

which(data01$ego != data02$ego) #--- 두 데이터의 ego가 동일한지 검사 
which(data01$ego != data03$ego) #--- 두 데이터의 ego가 동일한지 검사 which(data01$alter != data02$alter) #--- 두 데이터의 alter가 동일한지 검사 which(data01$alter != data03$alter) #--- 두 데이터의 alter가 동일한지 검사

#(data <- cbind(data01, data02$friendship_tie, data03$reports_to_tie)) 
#names(data)4:5 <- c("friendship_tie", "reports_to_tie") 
(data <- data.frame(ego = data01[, 1], alter = data01[, 2], advice_tie = data013
friendship_tie = data02[, 3], reports_to_tie = data033)) 
(data <- subset(data, (advice_tie > 0 | friendship_tie > 0 | reports_to_tie > 0))) (attrs <- cbind(1:length(data041), data04)) 
rm(list = c("data01", "data02", "data03", "data04"))

###-----------------------------------------------------------------------------

그래프 생성

library(igraph) 
#(m <- graph.data.frame(data)) #--- 방향 그래프 생성 (m <- graph.data.frame(d = data, directed = TRUE, vertices = attrs))
#--- 그래프 
#--- Node : vertex, link : edge #--- 첫번째 컬럼이 두번째 컬럼을 가르키는 방향성 그래프 생성 #--- 세번째 이상의 컬럼은 edge의 attribute로 추가됨 #--- directed : TRUE. 방향 그래프, FALSE. 무방향 그래프 #--- vertices : vertex의 속성, 첫번째 열이 vertices의 아이디 #(m <- as.undirected(m, mode = "collapse")) #--- 무방향 그래프로 변환 #(m <- as.directed(m)) #--- 방향 그래프로 변환

#--- 방향성을 삭제한 인접(adjacency) 매트릭스 생성 
#(m <- graph.adjacency(data, weight = T, mode = "undirected"))

#(m <- simplify(m)) #--- 그래프 단순화 
m$layout <- layout.fruchterman.reingold(m) #--- Fruchterman-Reingold Layout

summary(m)

vcount(m) #--- Vertex 개수 
V(m) #--- Vertex get.vertex.attribute(m, "name") #--- Vertex 이름 get.vertex.attribute(m, "AGE") #--- Vertex attribute get.vertex.attribute(m, "TENURE") #--- Vertex attribute get.vertex.attribute(m, "LEVEL") #--- Vertex attribute get.vertex.attribute(m, "DEPT") #--- Vertex attribute

#--- vertex 크기 : V(m)$size : vertex.size 
#--- vertex 색상 : V(m)$color : vertex.color #--- vertex 프레임 : V(m)$frame : vertex.frame #--- vertex 프레임 색상 : V(m)$frame.color : vertex.frame.color #--- vertex 모양 : V(m)$shape : vertex.shape

#--- vertex 라벨 : V(m)$label : vertex.label 
#--- vertex 라벨 폰트 : V(m)$label.font : vertex.label.font #--- vertex 폰트 family : V(m)$label.family : vertex.label.family #--- vertex 라벨 크기 : V(m)$label.cex : vertex.label.cex #--- vertex 라벨 distance : V(m)$dist : vertex.label.dist #--- vertex 라벨 색상 : V(m)$label.color : vertex.label.color

ecount(m) #--- Edge 개수 
E(m) #--- Edge get.edge.attribute(m, "advice_tie") #--- Edge attribute get.edge.attribute(m, "friendship_tie") #--- Edge attribute get.edge.attribute(m, "reports_to_tie") #--- Edge attribute get.edge.ids(m, c(20, 18, 21, 18)) #--- 20 -> 18, 21 -> 18인 edge ID 반환 #--- edge 색상 : E(m)$color : edge.color #--- edge 길이 : E(m)$width : edge.arrow.width #--- edge 화살표 크기 : E(m)$arrow.size : edge.arrow.size #--- edge 화살표 길이 : E(m)$arrow.width : edge.arrow.width #--- edge 타입 : E(m)$lty : edge.lty

#--- edge 라벨 : E(m)$label : edge.label 
#--- edge 라벨 폰트 : E(m)$label.font : edge.label.font #--- edge 폰트 family : E(m)$label.family : edge.label.family #--- edge 라벨 크기 : E(m)$label.cex : edge.label.cex #--- edge 라벨 색상 : E(m)$label.color : edge.label.color

#write.graph(m, file = "sns.txt", format = "pajek") #--- 그래프를 파일로 저장

###-----------------------------------------------------------------------------

그래프 시각화

(layouts <- layout.fruchterman.reingold(m)) #--- Fruchterman-Reingold Layout

plot(m, main = "Krackhardt High-Tech Managers", edge.arrow.size = .05) #--- 매번 그래프가 변경 
plot(m, layout = layouts, main = "Krackhardt High-Tech Managers", edge.arrow.size = .05)

#--- DEPT별로 vertex 색상 지정 
(vcolors <- get.vertex.attribute(m, "DEPT")) vcolors== 0 <- "Black" 
vcolors== 1 <- "Red" 
vcolors== 2 <- "Blue" 
vcolors== 3 <- "Yellow" 
vcolors== 4 <- "Green" 
vcolors plot(m, layout = layouts, main = "Krackhardt High-Tech Managers", vertex.color = vcolors, vertex.label = NA, edge.arrow.size = .05) plot(m, layout = layouts, main = "Krackhardt High-Tech Managers", vertex.color = vcolors, edge.arrow.size = .05)

#--- TENURE로 vertex 크기 지정 
(vsizes <- get.vertex.attribute(m, "TENURE")) plot(m, layout = layouts, main = "Krackhardt High-Tech Managers", vertex.color = vcolors, vertex.size = vsizes, edge.arrow.size = .05)

#--- edge 색상 지정 
(colorStr <- c(rgb(1, 0, 0, .5), rgb(0, 0, 1, .5), rgb(0, 0, 0, .5))) #--- rgb : red, green, blue, alpha (투명도) (ecolors <- 1:length(E(m))) ecolors[E(m)$advice_tie == 1] <- colorStr1 
ecolors[E(m)$friendship_tie == 1] <- colorStr2 
ecolors[E(m)$reports_to_tie == 1] <- colorStr3 
ecolors plot(m, layout = layouts, main = "Krackhardt High-Tech Managers", vertex.color = vcolors, vertex.size = vsizes, edge.color = ecolors, edge.arrow.size = .05) legend(1, 1.25, legend = c("Advice", "Friendship", "Reports To"), #--- 범례 표시 col = colorStr, lty = 1, cex = .7) rm(colorStr)

#--- V(m)과 E(m)의 속성 지정 방식으로 그래프 표시 
plot(m, layout = layouts, main = "Krackhardt High-Tech Managers") (V(m)$size <- vsizes) (E(m)$color <- ecolors) (E(m)$arrow.size <- .05) plot(m, layout = layouts, main = "Krackhardt High-Tech Managers", vertex.color = vcolors) rm(list = c("vsizes", "ecolors"))

###-----------------------------------------------------------------------------

그래프 가공

#--- advice_tie에 값이 있는 것만 추출 
(mAdvice <- delete.edges(m, E(m)name = "advice_tie") == 0
plot(mAdvice, layout = layouts, main = "Krackhardt High-Tech Managers", vertex.color = vcolors)

#--- 다른 vertex와 연결되지 않은 vertex 삭제 
(mAdviceNo <- delete.vertices(mAdvice, V(mAdvice)== 0))
plot(mAdviceNo, layout = layouts, main = "Krackhardt High-Tech Managers", 
vertex.color = vcolors)

(mFriendship <- delete.edges(m, E(m)name = "friendship_tie") == 0
plot(mFriendship, layout = layouts, main = "Krackhardt High-Tech Managers", vertex.color = vcolors)

(mReport <- delete.edges(m, E(m)name = "reports_to_tie") == 0
plot(mReport, layout = layouts, main = "Krackhardt High-Tech Managers", vertex.color = vcolors)

###----------------------------------------------------------------------------- 
#--- 매개 중심성 (Betweenness centrality) : 한 노드가 연결망 내의 #--- 다른 노드들 사이의 최다 경로 위에 위치할수록 그 노드의 중심성이 높다. (m1 <- edge.betweenness.community(m)) #--- 매개 중심성 계산 plot(as.dendrogram(m1)) #--- 계층적 군집 rm(m1)

###----------------------------------------------------------------------------- 
#--- community detection : walktrap과 edge-betweenness 방법 #--- steps : random walks의 길이 #--- modularity = TRUE : modularity scores를 결과에 포함 (m1 <- walktrap.community(m, steps = 200, modularity = TRUE)) plot(as.dendrogram(m1, use.modularity = TRUE)) #--- 계층적 군집 m1$modularity rm(m1)

###----------------------------------------------------------------------------- 
#--- 연결정도 중심성 (Degree centrality) : 한 점에 직접적으로 연결된 점들의 합 (deg_full_in <- degree(m, mode = "in")) #--- indegree 계산 (deg_full_out <- degree(m, mode = "out")) #--- outdegree 계산 (deg_advice_in <- degree(mAdvice, mode = "in")) (deg_advice_out <- degree(mAdvice, mode = "out")) (deg_friendship_in <- degree(mFriendship, mode = "in")) (deg_friendship_out <- degree(mFriendship, mode = "out")) (deg_reports_to_in <- degree(mReport, mode = "in")) (deg_reports_to_out <- degree(mReport, mode = "out"))

###----------------------------------------------------------------------------- 
#--- 근접 중심성 (Closeness centrality) : 친밀감, shortest.paths의 역 #--- 노드 수 / 최단거리합 (m1 <- closeness(m)) (m1.score <- round((m1 - min(m1)) * length(m1) / max(m1)) + 1) (m1.colors <- rev(heat.colors(max(m1.score)))) plot(m1, col = m1.colorsm1.score
rm(m1, m1.score, m1.colors)

###----------------------------------------------------------------------------- 
#--- 근접 중심성 (Closeness centrality) : 한 노드로부터 다른 노드에 도달하기까지 필요한 최소 단계의 합 #--- 최단거리합 / 노드 수 (sp_full_in <- shortest.paths(m, mode = "in")) #--- 노드간 짧은 거리 표시 (sp_full_out <- shortest.paths(m, mode = "out")) #--- 노드간 짧은 거리 표시 (sp_advice_in <- shortest.paths(mAdvice, mode = "in")) (sp_advice_out <- shortest.paths(mAdvice, mode = "out")) (sp_friendship_in <- shortest.paths(mFriendship, mode = "in")) (sp_friendship_out <- shortest.paths(mFriendship, mode = "out")) (sp_reports_to_in <- shortest.paths(mReport, mode = "in")) (sp_reports_to_out <- shortest.paths(mReport, mode = "out"))

###----------------------------------------------------------------------------- 
#--- matrix에서 행 vertex에서 열 vertex로 연결이 있으면 1을 설정 reachability <- function(m, mode) { reach_mat <- matrix(nrow = vcount(m), ncol = vcount(m)) for (idx in 1:vcount(m)) { reach_mat <- 0 
# reaches <- subcomponent(m, idx, mode = mode) #--- 특정 vertex와 연결된 버텍스 집합을 반환 reaches <- subcomponent(m, idx, mode = mode)[2:(degree(m, mode = mode)+ 1) 
for (pos in 1:(length(reaches))) { reach_matidx, reaches[pos] <- 1 
} } return(reach_mat) }

(reach_full_in <- reachability(m, "in")) 
(reach_full_out <- reachability(m, "out")) (reach_advice_in <- reachability(mAdvice, "in")) (reach_advice_out <- reachability(mAdvice, "out")) (reach_friendship_in <- reachability(mFriendship, "in")) (reach_friendship_out <- reachability(mFriendship, "out")) (reach_reports_to_in <- reachability(mReport, "in")) (reach_reports_to_out <- reachability(mReport, "out"))

  

## Visualization

### graphics

#--- 그래프의 공통 Parameter 
#--- main : 제목 #--- xlab, ylab : X축, Y축 이름 #--- xlim, ylim : X축, Y축 값의 범위 #--- type : p. 점, l. 라인, s. 라인, o. 점과 선, b. 점과 선, n. 빈 화면 표시 #--- col : 색상 (색상명 또는 "#FF0000" (RGB 코드)) #--- col.lab, col.axis : 레이블 색상, 축 색상 #--- pch : 점의 모양 #--- axes : FALSE - 축을 표시하지 않음 (data <- data.frame(y = iris$Species, y1 = iris$Sepal.Length, y2 = iris$Sepal.Width, y3 = iris$Petal.Length, x = iris$Petal.Width)) (idx <- sample(2, nrow(data), replace = TRUE, prob = c(0.7, 0.3))) (data <- data== 1, ) #--- 랜덤하게 샘플 추출 
rm(idx)

hist(data$x, freq = T, breaks = 10) #--- 히스토그램 
hist(data$x, freq = F, breaks = 10) #--- 밀도 히스토그램

lines(density(data$x)) #--- 밀도 그래프 추가 
plot(density(data$x)) #--- 밀도 그래프

plot(data$x, type = "l") #--- 선 그래프 
plot(data$x, type = "s") #--- 선 그래프

plot(data$x, data$y1) #--- 산점도 
plot(y1 ~ x, data = data) #--- 산점도 plot(x ~ y1 + y2 + y3, data = data) #--- 산점도

plot(~ y1 + y2 + y3, data = data) #--- 산점도 행렬 
pairs(~ y1 + y2 + y3, data = data) #--- 산점도 행렬 library(caret) featurePlot(data2:4, data$y, "ellipse") #--- 산점도 행렬

plot(data$y) #--- 막대 그래프 
barplot(tapply(data$x, data$y, mean)) #--- 막대 그래프

plot(data$y, data$x) #--- 박스 그래프 
boxplot(x ~ y, data = data, notch = F) #--- 박스 그래프 boxplot(x ~ y, data = data, notch = T) #--- 박스 그래프 boxplot(data2:4) #--- 박스 그래프

plot(y ~ y1 + y2 + y3, data = data) #--- 모자이크 플롯

(data <- dataindex.return = TRUE)$ix, #--- y1을 기준으로 데이터 정렬 
plot(data$y1, data$y2, #--- 산점도 (빈화면 표시) main="붓꽃의 3가지 종", xlab="꽃받침 길이", ylab="꽃받침 넓이", pch=20, cex=1, col="yellowgreen", col.axis="green", col.lab="blue", xlim=c(4, 8), ylim=c(1, 5), type="n")

points(data$y1, data$y2, #--- 점 추가 
pch="+", cex=1, col="green")

lines(data$y1, data$y2, col="blue") #--- 선 추가 
lines(lowess(data$y1, data$y2)) #--- 회귀 분석선 추가 abline(h=mean(data$y2), lty=2, col="blue") #--- Y축 평균 (가로선) abline(v=mean(data$y1), lty=2, col="green") #--- X축 평균 (세로선)

curve(sin(5 * x) + 3, 4, 8, n = 100, add=T) #--- 곡선을 추가 
polygon(data$y1, data$y2) #--- 다각형을 추가

text(data$y1, data$y2, data$x, pos=4) #--- 문자열 추가 
legend("topleft", legend=c("꽃받침 넓이"), #--- 범례 표시 pch=c(43), col=c("green"), bg="gray")

  

### 다중축

par(mar = c(5, 12, 4, 4) + 0.1) #--- 그래프에 여백 지정 
plot(data$x, data$y1, pch=20, col="green", xlim=c(0, 3), ylim=c(4, 8), main = "", xlab = "", ylab = "", axes = FALSE)

axis(1, pretty(range(data$x), 10)) #--- x축 추가 
mtext(text = "x", side = 1, line = 2) #--- X축에 라벨 추가

axis(2, ylim = c(0, max(data$y1)), line = 0) #--- y축 추가 
mtext(2, text = "y1", line = 2) #--- y축에 라벨 추가

par(new = T) #--- 원래 그래프에 새 그래프 추가 
plot(data$x, data$y2, pch=21, col="blue", xlim=c(0, 3), ylim=c(2, 5), main = "", xlab = "", ylab = "", axes = FALSE) axis(2, ylim = c(0, max(data$y2)), line = 3.5) #--- y축 추가 mtext(2, text = "y2", line = 5.5) #--- y축에 라벨 추가

par(new = T) #--- 원래 그래프에 새 그래프 추가 
plot(data$x, data$y3, pch=20, col="red", xlim=c(0, 3), ylim=c(1, 7), main = "", xlab = "", ylab = "", axes = FALSE) axis(2, ylim = c(0, max(data$y3)), line = 7) #--- y축 추가 mtext(2, text = "y3", line = 9) #--- y축에 라벨 추가

legend("topleft", 
legend = c("y1", "y2", "y3"), pch = c(20, 21, 22), col = c("green", "blue", "red"), bg = "grey")

title(main = "산점도", sub = "x별 y1, y2, y3의 분포")

par(mar = c(0, 0, 0, 0) + 4) #--- 그래프에 여백 지정

  

### qplot
- ggplot2에서 시각화 단계  
[700px](파일:Ggplot2.png.md)
  
- qplot 주요 arguments  
  - x, y : x, y 좌표의 값  
  - data : 데이터  
  - geom : 챠트의 형태  
    - auto : 자동으로 선택  
    - point		: 산점도, 점 그래프  
    - smooth		: 회귀선 표시  
    - line		: 선 그래프 (방향 : 왼쪽 -> 오른쪽)  
    - path		: 선 그래프 (무방향)  
    - boxplot		: 박스 챠트  
    - jitter		:   
    - histogram		: 히스토그램  
    - density		: 밀도 그래프  
    - bar		: 막대 그래프, 도수분포표  
  - facets		: 챠트 분할  
  - main			: 제목  
  - xlab, ylab		: X축, Y축 이름  
  - xlim, ylim		: X축, Y축 값의 범위  
  - binwidth		: 구간의 넓이  
  
  - colour, color		: 색상 분류 기준 (선/점 색)  
  - shape		: 점의 모양  
  - alpah 		: 투명도, 작을수록 투명함  
  
  - fill			: 채우는 색  
  
  - 예약어  
    - ..count..		: 관측 개수  
    - ..ncount..		: (0, 1)인 관측 개수  
    - ..density..		: 밀도  
    - ..ndensity..		: (0, 1)인 밀도  
  
- qplot 기타 arguments  
  - weight		: 가중치 적용  
  - method  
    - loess		: smooth용 회귀분석  
    - gam		: 데이터로 자유도 계산한 lm  
    - lm		: 회귀분석  
  - formula		: 수식  
  - se = FALSE		: smooth에서 편차 제거  
  - span			: smooth와 같이 사용, 0~1  
  - log			: 로그 적용 (x, y, xy)  
  
  - asp			: y/x 비율  
  - margins		: 마진  
  - stat			: 통계  
  - position		:  
  

### ggplot2
- GEOM		: geometric object, 기하 객체  
- ggplot()		: 데이터와 미적속성을 매핑하는 메타데이터 생성  
  - ggplot(~, aes(x=~, y=~, colour=~, group=~))  
  - 추가적으로 하나 이상의 레이어가 생성이 되어야 챠트가 생성됨  
  - + 로 레이어를 추가할 경우, 미적 속성은 +뒤의 레이어로 상속됨  

ggplot(data = diamonds, aes(x=carat, y=price)) + geom_point(aes(colour=clarity)) + geom_smooth() 
ggplot(data = diamonds, aes(x=carat, y=price, colour=clarity) + geom_point() + geom_smooth()

  
- data			: 데이터  
  - graph %+% dataFrame	: 그래프의 데이터 교체  
  
- aes(~)		: Aesthetic attributes, 미적 속성 (데이터와 매핑됨)  
  - x, y		: x, y 좌표의 값  
  - colour		: 색상 분류 기준 (선/점 색)  
  - shape		: 점의 모양 분류 기준, NA. 표시하지 않음  
  - size		: 점의 크기, 선의 굵기 (1. default)  
  - alpha		: 투명도, 작을수록 투명함  
  - fill		: 색상 분류 기준 (채워넣는 색)  
  - group		: 그룹 지정  
  - order		: 누적 데이터 표시시 누적되는 순서 변경, order = desc(~)  
  
- geom_point()		: 산점도, 점 그래프  
- geom_smooth()		: 회귀선 표시  
  - stat_smooth()	: smooth 추가  
  - binwidth()		: 한칸당 간격  
- geom_line()		: 선 그래프 (방향 : 왼쪽  오른쪽)  
- geom_histogram()	: 히스토그램  
- geom_density()		: 밀도 그래프  
- geom_bar()		: 막대 그래프, 도수분포표  
  - aes(~)		: Aesthetic attributes, 미적 속성  
  - binwidth		: 구간의 넓이, X축 간격  
  - colour		: 색상 분류 기준 (선/점 색)  
  - shape		: 점의 모양 분류 기준, NA. 표시하지 않음  
  - size		: 점의 크기, 선의 굵기 (1. default)  
  - alpha		: 투명도, 작을수록 투명함  
  - fill		: 채우는 색  
  - linetype		: 선의 모양 (2, "dotdash")  
  - method		: lm  
  - position		: 그룹항목을 누적 표시, dodge (그룹 항목을 개별 표시), fill  
  
- geom_pointrange()	: 값과 범위 표시  
  - ymin, ymax		: pointrange()에서 사용할 최소값과 최대값  
  
- stat_bin2d()		: 격자 형태의 그래프  
  - bins		: stat_bin2d()에서 격자의 크기  
  - stat_bin2d(bins=25, colour="grey50")  
  
- stat_bin()		: 그래프 지정  
  - geom		: bar, area, point, tile  
  
- facet_grid()		: 챠트 분할  
- facet_wrap()		: 챠트 분할  
  - nrow		: 한 행에 표시할 챠트의 수  
  
- xlab(), ylab()			: X축, Y축 이름  
- coord_cartesian()  
  - xlim, ylim			: X축, Y축 값의 범위  
- scale_x_continuous()		: X축의 범위를 지정  
  - limits  
- scale_y_continuous()		: Y축의 범위를 지정  
  - limits  
- sacle_x_date(breaks="2 years", labels=date_format("%Y-%m")) : 날자축 지정  
  
- guides()  
  - colour = "colourbar"		: 색상 범례 사용  
  - colour = guide_legend()	: 이산형 범례, 작은값  큰값  
  - colour = guide_legend(reverse = TRUE) : 이산형 범례, 큰값  작은값  
- scale_color_hue()		: 색상 범례 제목 지정  
- scale_colour_continuous()		: 색상 범례  
  - breaks			: break point 지정  
  
- scale_shape_identity()		: shape에 주어진 연속값을 불연속 값으로 매핑  
  
- last_plot()		: 마지막으로 그린 그래프  
- coord_flip()		: 가로, 세로 변경  
- scale_x_reverse()	: X축 값의 순서를 반대로 설정  
- scale_y_reverse()	: Y축 값의 순서를 반대로 설정  
  
- opts()			: 테마(theme) 상세 설정  
  - opts(axis.text.x=theme_text(angle=90, hjust=1)) : X축 라벨 90 회전  
  
- geom_hline()		: 가로선  
- annotate()		: 사각형 상자  
  - annotate("rect", xmin = 2, xmax = 3.5, ymin = 2, ymax = 25, fill = "dark grey", alpha = 0.5)  
  
- 예약어  
  - ..count..		: 관측 개수  
  - ..ncount..		: (0, 1)인 관측 개수  
  - ..density..		: 밀도  
  - ..ndensity..		: (0, 1)인 밀도  
  
- ggsave("~.png")	: 챠트 저장  
  

## Java 연동
- rJava 설치  

Sys.setenv(JAVA_HOME="C:/appl/jre170")

install.packages("rJava") 
install.packages("JavaGD")

  
- 환경변수 설정  
  - R_HOME  
  - Path에 URL 추가 : %R_HOME%\bin\x64;%R_HOME%\library\rJava\jri\x64  
  
- Java 프로그램  
  - $R_HOME/library/rJava/jri/*.jar 파일을 Java의 classpath에 추가  

package MiD.R

import org.rosuda.JRI.*;

public class RMain {
public static void main(String arg) {
String Rargs = { "--vanilla " };
Rengine ren = new Rengine(Rargs, false, null);

     if (!ren.waitForR())  {   
         System.out.println("Cannot Load R");   
         return;  
     }    

     REXP rn = ren.eval("rnorm(10)");  
     double[](.md) rnd = rn.asDoubleArray();    
     for (int i = 0 ; i < rnd.length ; i++)  {   
         System.out.println(rnd[i](i.md));  
     }  
     ren.end(); 
}

}

  - JavaGD_~.zip 파일에 포함된 javaGD.jar를 classpath에 추가  
    - 애플릿 상에서 그래프 표시  

package MiD.R;

import javax.swing.JFrame; 
import org.rosuda.javaGD.GDCanvas; import org.rosuda.javaGD.GDInterface;

public class MiDJavaGD extends GDInterface {  
public JFrame f;

 
public void gdOpen(double w, double h)  {  
    f = new JFrame("JavaGD");  
    c = new GDCanvas(w, h);  
    f.add((GDCanvas) c);  
    f.pack();  
    f.setVisible(true);  
    f.setTitle("Naked R plot");  
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
}

}

public class RMain {
public static void main(String args) {
Rengine engine = new Rengine(new String {"--vanilla"}, false, null);
engine.eval("library(JavaGD)");
engine.eval("Sys.putenv('JAVAGD_CLASS_NAME'='MiDJavaGD')");
engine.eval("JavaGD()");
engine.eval("plot(rnorm(100))");

}

    - 그래프를 저장  

public class RMain {
public static void main(String args) {
Rengine engine = new Rengine(new String {"--vanilla"}, false, null);
if (!engine.waitForR()) {
System.out.println("Cannot Load R");
return;
}

 
    engine.eval("png(filename=\"c:/aaa/test3.png\")");        
    engine.eval("plot(rnorm(100))");        
    engine.eval("dev.off()");        
    engine.end();    
}

}

  

## 관리자 매뉴얼
- rJava 로딩시 오류 발생  

Error : .onLoad가 loadNamespace()에서 'rJava'때문에 실패했습니다: 
호출: inDL(x, as.logical(local), as.logical(now), ...) 에러: unable to load shared object 'C:/Users/ghkim/Documents/R/win-library/3.1/rJava/libs/x64/rJava.dll': LoadLibrary failure: 지정된 모듈을 찾을 수 없습니다.

  - 원인 : JDK 1.8 설치시 오류 발생  
  - 조치 : 작업 폴더에 있는 .Rprofile 파일에 아래 코드 추가 합니다.  

Sys.setenv(JAVA_HOME="C:/appl/jre170")

  

##  데이터셋 
  
국내 데이터셋
  
- [공공데이터포털](https://www.data.go.kr/)  
- [서울 열린 데이터 광장](http://data.seoul.go.kr/)  
- [통계청](http://kosis.kr/statisticsList/statisticsList_01List.jsp?vwcd=MT_ZTITLE&parmTabId=M_01_01.md#SubCont)  
- [경기도 공공데이터 공개 포털](http://data.gg.go.kr/)  
- [국가 DB 피디아](http://lod.data.go.kr/)  
- [국가 공유자원 포털](https://www.data.go.kr/)  
- [TheDataHub](http://thedatahub.kr/)  
  

해외 데이터셋 - [https://explore.data.gov/ 미국 공공데이터], [http://www.data.gov/](http://www.data.gov/) - [미국 뉴욕시 공공데이터](https://nycopendata.socrata.com/) - [영국 공공데이터](http://data.gov.uk/data) - [영국 오픈소스 데이터포털 소프트웨어 ckan](http://ckan.org/) - [호주 공공데이터](http://data.gov.au/data/) - [캐나라 공공데이터](http://data-donnees.gc.ca/) - [뉴질랜드 공공데이터](http://data.govt.nz/) - [노르웨어 공공데이터](http://data.norge.no/) - [그리스 지리정보 데이터](http://geodata.gov.gr/) - [러시아 공공데이터](http://opengovdata.ru/) - [모로코 공공데이터](http://data.gov.ma/) - [벨기에 공공데이터](http://data.belgium.be/) - [케냐 공공데이터](https://opendata.go.ke/) - [네덜란드 공공데이터](http://data.overheid.nl/) - [네덜란드 로테르담시 Open Data Store](http://www.rotterdamopendata.nl/web/guest/home) - [칠레 공공데이터](http://datos.gob.cl/) - [이탈리아 공공데이터](http://data.gov.it/) - [스페인 공공데이터](http://datos.gob.es/) - [우루과이 공공데이터](http://datos.gub.uy/) - [프랑스 공공데이터](http://data.gouv.fr/) - [브라질 공공데이터](http://beta.dados.gov.br/) - [에스토니아 공공데이터](http://www.opendata.ee/) - [포루투갈 공공데이터](http://www.dados.gov.pt/) - [몰도바 공화국 공공데이터](http://date.gov.md/) - [인도 공공데이터](http://data.gov.in/) - [오스트리아 공공데이터](http://data.gv.at/) - [유럽연합 공공데이터](http://open-data.europa.eu/) - [세계은행 공공데이터](http://data.worldbank.org/data-catalog) ## 온라인교육 [DBGuide.net](http://cyber.dbguide.net/) - [데이터 사이언티스트의 현실과 미래](http://cyber.dbguide.net/user/apply/Apply.jsp?page_name=ApplyDetail.jsp&cate_code=AA017&course_code=124&order_year=2014&order_num=0) - [빅데이터 분석 과정 (R)](http://cyber.dbguide.net/user/apply/Apply.jsp?page_name=ApplyDetail.jsp&cate_code=AA017&course_code=119&order_year=2014&order_num=0)           : 공개 강좌 - [빅데이터 기술 과정 (Hadoop)](http://cyber.dbguide.net/user/apply/Apply.jsp?page_name=ApplyDetail.jsp&cate_code=AA017&course_code=117&order_year=2014&order_num=0)  : 공개 강좌 - [데이터 분석 전문가로 가는 길](http://cyber.dbguide.net/user/apply/Apply.jsp?page_name=ApplyDetail.jsp&cate_code=AA013&course_code=118&order_year=2014&order_num=0) ## 참고 문헌 - [RHive](RHive.md) - [Rhipe](Rhipe.md) : [http://ml.stat.purdue.edu/rhafen/rhipe/ http://ml.stat.purdue.edu/rhafen/rhipe/] - [RStudio](RStudio.md) - [Protovis](Protovis.md) : [http://mbostock.github.io/protovis/ http://mbostock.github.io/protovis/] - [GNUplot](GNUplot.md) - [Kaggle](http://www.kaggle.com/) - [http://freesearch.pe.kr/archives/tag/r](http://freesearch.pe.kr/archives/tag/r) - [한국 R 사용자 모임](http://r-project.kr/) - [위키피디아 - R (프로그래밍 언어)](http://ko.wikipedia.org/wiki/R_(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%96%B8%EC%96%B4)) - [빅데이터 시대의 R](https://docs.google.com/a/jopenbusiness.com/document/d/1adTOIwrnTReMOj3601wJoWsE__dLmlflmp7jV3tWL_E/edit?hl=en_US) - [The R Ecosystem](http://prezi.com/s1qrgfm9ko4i/the-r-ecosystem/) - [http://economicslab.tistory.com/search/R](http://economicslab.tistory.com/search/R) - [Installing R on CentOS 5.4 64 bit, 2010.03](http://kevin-gattaca.blogspot.kr/2010/05/installing-r-on-centos-54-64-bit.html) - [R 기본 문법 및 통계 프로그래밍](http://www.imaso.co.kr/?doc=bbs/gnuboard.php&bo_table=article&wr_id=37720) - [R-bloggers](http://www.r-bloggers.com/) - [데이터 사이언티스트 필수 분석언어 'R' 입문 과정, 2013.06](http://edu.etnews.com/Menu/View/?IDX=87&MIDX=1&CIDX=3&mem_seq=3057,) - [http://freesearch.pe.kr/](http://freesearch.pe.kr/) - [http://starmethod.tistory.com/334](http://starmethod.tistory.com/334) - R 추천 도서 - An Introduction to R - R Cookbook - Paul Teetor - Beginning R - R in a Nutshell - R Graphics Cookbook - The Art of R Programming - 통계 추천 도서 - Head First Statistics - Dawn Griffiths - Statistics for the Behavioural Sciences - Frederick J Gravetter 외 - [Cookbook for R](http://www.cookbook-r.com/) - [Quick-R](http://www.statmethods.net/) - PDF : [R Reference Card](http://cran.r-project.org/doc/contrib/Short-refcard.pdf) - [Chart Chooser in R](http://www.maths.lancs.ac.uk/~rowlings/Teaching/UseR2012/cheatsheet.html) - [http://www.r-bloggers.com/analysis-of-covariance-%E2%80%93-extending-simple-linear-regression/](http://www.r-bloggers.com/analysis-of-covariance-%E2%80%93-extending-simple-linear-regression/) - [http://cran.r-project.org/web/views/MachineLearning.html](http://cran.r-project.org/web/views/MachineLearning.html) - [http://cran.r-project.org/web/packages/FSelector/FSelector.pdf](http://cran.r-project.org/web/packages/FSelector/FSelector.pdf) - [Forecasting : principles and practice](https://www.otexts.org/book/fpp) - [http://www.youtube.com/watch?v=LsyOLBroVx4](http://www.youtube.com/watch?v=LsyOLBroVx4) - [https://www.otexts.org/fpp/resources](https://www.otexts.org/fpp/resources) - [http://www.rstudio.com/shiny/](http://www.rstudio.com/shiny/) - [http://blog.daum.net/huh420/](http://blog.daum.net/huh420/) 분류: [BigData](분류_BigData.md)
최종 수정일: 2024-09-30 12:26:18

이전글 :
다음글 :