150 likes | 426 Views
R 을 이용한 데이터 처리 및 분석과정에서의 유용한 사용 팁. 2012. 6. 오 원 기 wkoh@begas.co.kr. Agenda. 1) 자료 불러오기 - CSV File 불러오기 - Oracle DB 에서 불러오기 2) 자료 처리하기 3) 탐색적자료분석을 (EDA) 위한 그래프 생성 및 저장 4) Animation Package 5) googleVis Package 6) 분석결과 저장하기 - CSV File 저장하기
E N D
R을 이용한 데이터 처리 및 분석과정에서의 유용한 사용 팁 2012. 6. 오 원 기 wkoh@begas.co.kr
Agenda 1) 자료 불러오기 - CSV File 불러오기 - Oracle DB에서 불러오기 2) 자료 처리하기 3) 탐색적자료분석을(EDA) 위한 그래프 생성 및 저장 4) Animation Package 5) googleVis Package 6) 분석결과 저장하기 - CSV File 저장하기 - Oracle DB에 저장하기 7) Batch 작업
자료 불러오기 – CSVFile 불러오기 • 함수 이름 : read.csv, read.table • R에서는 Text파일 또는 csv등 다양한 포멧의 데이터를 호출할 수 있음 • read.csv(file, header = TRUE, sep = ",", quote="\"", dec=".", fill = TRUE, comment.char="", ...) • 목 표 : 여러 개의 csv 파일을 for문과 assigng함수를 활용하여 호출하기 • 필요함수 : shell(), for(), read.csv(), assign() • # 자료를 불러오기 위하여 디렉토리와 File이름을 정의한다. • file.dir <- "C:\\Rproject_1\\Data\\" • # 불러들일 자료는 속도와 교통량이 들어있는 20개의 파일임. • file.name <- shell(paste("dir ", file.dir, "*.CSV /b /w /a-d", sep = ""), intern = TRUE) • for(file.i in 1:length(file.name)) • { • temp.df <- read.csv(paste(file.dir, file.name[file.i], sep = ""),stringsAsFactor = FALSE) • names(temp.df) <- c("LINK_ID","TIME","SPEED","VOLUMN") • assign(paste("import_csv", file.i, "df", sep = "_"), temp.df) • }
자료 불러오기 – Oracle DB에서 불러오기 • 함수 이름 : odbcConnect , sqlQuery • ODBC Package를 사용하여 DB에있는 데이터를 호출할 수 있음 • odbcConnect(dsn, uid = "", pwd = "", ...) • sqlQuery(channel, query, errors = TRUE, ..., rows_at_time) • 목 표 : for문과 assign함수를 활용하여 DB에서 여러 번 데이터를호출하기 • 필요함수 : odbcConnect(), unique(), for(), sqlQuery, assign() • #RODBC library 호출 • library(RODBC) • #ODBC 연결 정보 생성 • #DSN, UID, PWD 입력 • speed.conn <- odbcConnect(dsn= "speed", uid = "system", pwd = "system32", believeNRows=FALSE) • #DB에 있는 데이터중 LINK_ID별로 각각의 데이터를 가지고 오기 • Link_Id_Names <- unique(Total_DB_Speed$LINK_ID) • for(file.i in 1:length(Link_Id_Names)) • { • query.x <- paste("select * from TB_LINK_SPEED where LINK_ID = '", Link_Id_Names[file.i], "'",sep = "") • temp.df <- sqlQuery(speed.conn, query.x, stringsAsFactors = FALSE) • cat(file.i, "/", length(Link_Id_Names), "[ N :", nrow(temp.df), "]", "\n") • assign(paste("import_DB", file.i, "df", sep = "_"), temp.df) • }
자료 처리하기 함수 이름 : get() get(x, pos = -1, envir = as.environment(pos), mode = "any", inherits = TRUE) get함수와 rbind함수를 활용하여 여러 개의 테이블을 하나의 테이블로 합칠 수 있다. import_csv_names <- apropos("import_csv_") for(i in 1:length(import_csv_names)){ if(i == 1){ Total_Csv_Speed <- get(import_csv_names[i], pos = 1) } else{ temp.df <- get(import_csv_names[i], pos = 1) Total_Csv_Speed <- rbind(Total_Csv_Speed, temp.df) } } 함수 이름 : sqldf() sqldf(x, stringsAsFactors = FALSE, row.names = FALSE, envir = parent.frame(), method = getOption("sqldf.method"), file.format = list(), dbname, drv = getOption("sqldf.driver"), user, password = "", host = "localhost", dll = getOption("sqldf.dll"), connection = getOption("sqldf.connection"), verbose = isTRUE(getOption("sqldf.verbose"))) Sqldf할수를 통하여서 R언어를 잘 사용하지 못하는 사람들이라도 SQL문을 사용할 줄 알면, Data처리를 할 수 있다. library(sqldf) Time_Speed <- sqldf("select TIME, min(SPEED) MIN_SPEED, max(SPEED) MAX_SPEED from Total_Csv_Speed group by TIME")
EDA를 위한 그래프 생성 및 저장 탐색적 분석을 효과적으로 수행하기 위한 사용자 함수 1)히스토그램(hist), 2)박스플롯(boxplot), 3)정규성검정그림(qqnorm, qqline), 4)확률밀도그림(plot(density)) savePlot()을 사용하여 사용자가 생성한 그래프를 이미지로 저장할 수 있다. eda.shape <- function(input.var, var.name) { dev.new(width=30, height=20) par(oma = c(1,1,2,1), mfrow = c(2,2)) hist(input.var, main = "Histogram", xlab = var.name) box("figure", lty="dotted", col="blue") boxplot(input.var, main = "Boxplot") box("figure", lty="dotted", col="blue") qqnorm(input.var) qqline(input.var) box("figure", lty="dotted", col="blue") plot(density(input.var), main = "Density Plot") box("figure", lty="dotted", col="blue") box("inner", col = "red") mtext(paste("탐색적 분석을 위한 그림", "[ 변수명 :", var.name, "]"), side = 3, outer = TRUE, cex = 0.9) par(op) } eda.shape(input.var = Total_Csv_Speed$SPEED, var.name = "속도") savePlot(paste(image.dir, "탐색적분석을위한그림", ".jpg", sep = ""), type = "jpg") dev.off()
Animation Package Animation Package를사용함으로써 동적인 그래프를 그릴 수 있으며, HTML등 다양한 유형으로 그래프를 만들어 다른 사용자에게 공유할 수 있다. http://animation.yihui.name/animation:start # Animation Package # animation library 호출 library(animation) dev.new(width=80, height=40) par(mfrow = c(2,2)) uni.link <- unique(Total_Csv_Speed$LINK_ID) color.x <- c("blue", "green", "yellow", "black") for (i in 1:24) { for(j in 1: 4) { tmp.x <- Total_Csv_Speed[Total_Csv_Speed$LINK_ID == uni.link[j],] plot(tmp.x$TIME, c(tmp.x$SPEED[1:i], rep(NA, 24-i)), main = paste("LINK ID : ",unique(tmp.x$LINK_ID), "시간대별 속도", sep =" "), ylim = c(0, 90), lwd = 3, type = "l", col = color.x[j], ylab = "속도(Km/h)", xlab = "Time(HH)") abline(h = 40, lwd = 2, col = "red") } ani.pause() }
googleVis Package R에서 구글 데이터 시각화 API를 이용 http://code.google.com/p/google-motion-charts-with-r/
분석결과 저장하기 - CSVFile 저장하기 • 함수 이름 : write.csv • R에 있는 데이터를 write.csv함수를 사용하여 CSV파일로 Export할 수 있음. • write.table(x, file = "", append = FALSE, quote = TRUE, sep = " ", eol = "\n", na = "NA", dec = ".", row.names = TRUE, col.names = TRUE, qmethod = c("escape", "double"), fileEncoding = "") write.csv(...) • # 자료를 저장하기 위하여 디렉토리와 File이름을 정의한다. • file.dir <- "C:\\Rproject_1\\Result_Data\\" • #CSV 파일로 저장한다. • write.csv(Time_Speed, paste(file.dir,"Time_Speed.csv", sep = ""), row.names = FALSE)
분석결과 저장하기 – Oracle DB 저장하기 • 함수 이름 : odbcConnect , sqlQuery • ODBC Package를 사용하여 R에서 생성되어진 데이터를 DB에 저장할 수 있다. • 기능 DB Table Create, Table Delete, Insert • odbcConnect(dsn, uid = "", pwd = "", ...) • sqlQuery(channel, query, errors = TRUE, ..., rows_at_time) • speed.conn <- odbcConnect(dsn= "speed", uid = "system", pwd = "system32", believeNRows=FALSE) • #DB에 저장되어질 테이블이 없으면 테이블 생성 • check.df<- sqlQuery(speed.conn, "select * from tab where TNAME = 'TB_SPEED_RESULT';") • if(nrow(check.df) == 0) • { • #TB_SPEED_RESULT 테이블 생성 • sqlQuery(speed.conn, "CREATE TABLE TB_SPEED_RESULT (TIME NUMBER(4), MIN_SPEED NUMBER(3), MAX_SPEED NUMBER(3));") • } • #TB_SPEED_RESULT안에 있는 데이터 제거 • if(nrow(sqlQuery(speed.conn, "select * from TB_SPEED_RESULT")) != 0){ • sqlQuery(speed.conn, "DELETE FROM TB_SPEED_RESULT") • } • #데이터 Insert • for(i in 1:nrow(Time_Speed)) • { • insert.query <- paste("INSERT INTO TB_SPEED_RESULT (TIME, MIN_SPEED, MAX_SPEED) VALUES(",Time_Speed$TIME[i],",",Time_Speed$MIN_SPEED[i],",",Time_Speed$MAX_SPEED[i],")") • sqlQuery(speed.conn, insert.query) • } • close(speed.conn)
Batch 작업 Batch Program [Batch Program 관련 디렉토리] C:\Rproject_1 BAT BAT 화일 RSC R Script 화일 TXT Batch 프로그램 로그 LOG Batch 프로그램 로그 이력 OUT Batch 프로그램 수행 시 output
Batch 작업 Batch 작업을 위한 R Script(C:\Rproject_1\RSC\krug_source.R) Batch 작업을 위한 bat 파일(C:\Rproject_1\BAT\Krug_source.bat) CD C:\Program Files\R\R-2.13.2\bin\x64 Rcmd BATCH C:\Rproject_1\RSC\krug_source.r C:\Rproject_1\TXT\krug_source.txt set filename=krug_source_%date:~2%_%time:~0,2%_%time:~3,2%_%time:~6,2%.log copy C:\Rproject_1\TXT\krug_source.txt C:\Rproject_1\LOG\%filename%
Batch 작업 Batch Job을 실행시 아래와 같은 Batch 작업 실행화면이 생성되어지며, 모든 Batch Job이 완료시 Log정보, Out File등과 같은 정보는 지정되어진 폴더에 생성되어짐 Batch 작업 실행화면 Batch 작업 결과 • TXT 디렉토리 • LOG 디렉토리 • OUT 디렉토리