- R 개요
- R 데이터 종류
- 개요도
- 데이터 속성
- 변수
- 데이터 품질
- 데이터 형
- 빅데이터 분석
- CentOS에서 R 설치
- 사전 준비 사항
- 설치
- Windows에서 R 설치
- R 설치
- RStudio 설치
- R 매뉴얼
- R의 기본 문법
- R 사용법
- R 한글
- 샘플링
- 데이터 입출력
- Package
- knitr
- 인라인 코드 추가
- 군집의 개수 산정
- data : 원본 데이터
- groups : 확인할 군집의 개수 범위
- 그래프의 경사가 완만해 지는 지점이 군집의 개수 입니다
- 연관 분석
- 트랜잭션 데이터 : items, transactionID, TimeStamp
- items : 트랜잭션(rows)에 속한 항목(columns)의 이름과 값
- transactionID : 트랜잭션 아이디 (rows 이름)
- TimeStamp : 트랜잭션이 발생한 시간
- Corpus 생성
- Corpus 조회
- Corpus 변환
- (a <- c("mining", "miners", "mining"))
- (b <- stemDocument(a))
- (d <- stemCompletion(b, dictionary=a))
- DocumentTermMatrix / TermDocumentMatrix
- 단어의 빈도 분석
- 문서의 군집 분석
- 감성 분석
- 연관 분석
- 데이터 준비
- 그래프 생성
- 그래프 시각화
- 그래프 가공
- Sys.setenv(JAVA_HOME="C:/appl/jre170")
통계소프트웨어인 GNU R language를 정리 합니다.
한글 위키 : http://r-project.kr/wiki/CentOS
R 매뉴얼 : http://r4pda.co.kr/
다운로드 : http://cran.rstudio.com/, http://cran.r-project.org/mirrors.html
라이센스 : GNU GPL
플랫폼 : 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 데이터 종류
개요도
데이터 속성
비율식 (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 파일 생성
첨부된 SampleKnitr.Rmd 파일을 RStudio의 작업 폴더로 복사 합니다.
RStudio에서 SampleKnitr.Rmd 파일을 오픈 합니다.
방법 1. "File --> Open File..." 메뉴를 선택하여 파일을 오픈 합니다.
방법 2. 작업 폴더에서 해당 파일을 마우스로 클릭하여 오픈 합니다.
"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") .md", "~.html")
markdownToHTML("
- 참고 문헌
- 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)