[ADsP]3.R 데이터 처리/분석

😃

지난 글에서 간단하게 R의 기본언어를 알아보았다. 이번 글에서는 실제로 R을 사용하여 데이터를 입출력하는 방법을 알아보려고 한다.


데이터 처리/분석 과정

모든 일이 그러하듯이 데이터 분석을 시작할 때에도 그것의 목적을 명확히 하고 이에 맞는 분석 방법론을 선택해야 한다. 정확한 분석을 위해서는 분석가가 설계한대로 올바른 데이터가 입력되어야 한다. 따라서 데이터를 분석이 가능한 형태로 전처리하는 과정이 필요하며 이를 데이터 핸들링이라고도 한다. 그리고 데이터 분석 이후에 의사결정권자와 고객에 보고서 형태로 제공됨으로써 분석과제가 종료된다.

[데이터 수집 -> 데이터 전처리 -> 데이터 분석 -> 보고서 작성 ]

R 언어 자체는 분석을 위해 특화된 언어기 때문에 전문적인 데이터 전처리 작업은 python, perl, ruby 같은 스크립트 언어를 사용하게 된다. 데이터 전처리 작업도 분석 작업만큼이나 많은 공수가 들어가고 전문적인 분야이기 때문에, 이러한 작업들을 별도의 데이터 엔지니어가 처리한다. 동시에 간단한 데이터 전처리 작업은 데이터 분석가들이 직접 datalake에서 필요한 데이터를 탐색하여 python등을 처리해서 가져가도록 구성하기도 한다. R도 다양한 데이터 소스에서 데이터를 가져올 수 있는 API가 제공되기 때문에 일반적이진 않지만 간단한 데이터 처리를 수행할 수 있다.


R에서 다룰 수 있는 파일 타입

  • Tab-delimited text
  • Comma-seperated text
  • Excel file
  • JSON file
  • HTML/XML file
  • Database
  • 기타 통계 SW파일

데이터 입출력

  1. 데이터 입력

    #하위경로의 파일 목록 출력
    > list.files
    function (path = ".", pattern = NULL, all.files = FALSE, 
        full.names = FALSE, recursive = FALSE, ignore.case = FALSE, 
        include.dirs = FALSE, no.. = FALSE) 
    > list.files("d:\\download") 
    
    #고정폭 데이터 읽기
    > read.fwf
    function (file, widths, header = FALSE, sep = "\t", skip = 0L, 
        row.names, col.names, n = -1L, buffersize = 2000, fileEncoding = "", 
        ...)
    > f1 = read.fwf("d:\\download\\sample_fwf.txt",header=T, widths=c(11,7,7))
    
    #구분자로 데이터 구분해서 읽기 (기본 탭으로 구분)  
    #아래 read.table의 wrapper function. 내부적으로 read.table을 호출
    > read.delim
    function (file, header = TRUE, sep = "\t", quote = "\"", 
        dec = ".", fill = TRUE, comment.char = "", ...)
    > f2 = read.delim("d:\\download\\sample.csv",sep=",")
    
    # CSV파일 읽기 (구분자 )
    > read.csv 
    function (file, header = TRUE, sep = ",", quote = "\"", 
        dec = ".", fill = TRUE, comment.char = "", ...) 
    > f3 = read.csv("d:\\download\\sample.csv", header=T)
    > # as.is=T  -- 주소,이름,성 등의 형변환 없이 text로 데이터를 읽고 싶은 경우 
    
    # table 형태로 읽기 (구분자를 설정가능)
    > read.table
    function (file, header = FALSE, sep = "", quote = "\"'", 
        dec = ".", numerals = c("allow.loss", "warn.loss", 
            "no.loss"), row.names, col.names, as.is = !stringsAsFactors, 
        na.strings = "NA", colClasses = NA, nrows = -1, skip = 0, 
        check.names = TRUE, fill = !blank.lines.skip, strip.white = FALSE, 
        blank.lines.skip = TRUE, comment.char = "#", allowEscapes = FALSE, 
        flush = FALSE, stringsAsFactors = default.stringsAsFactors(), 
        fileEncoding = "", encoding = "unknown", text, 
        skipNul = FALSE) 
    > f4 = > read.table("d:\\download\\sample.csv", header=T, sep=",")
    
    #웹에서 데이터 읽어올 때 
    > read.csv("http://www.example.com/download/sample.csv")
    > read.table("http://www.example.com/download/sample.txt", sep="|	")
    
    #html 테이블 읽어오는 경우 
    > readHTMLTable("http://www.example.com/download/table.html")
    
    # line 단위로 읽기 
    > readLines
    function (con = stdin(), n = -1L, ok = TRUE, warn = TRUE, encoding = "unknown", 
        skipNul = FALSE) 
    > readLines("d:\\download\\sample.csv",n=3)
    
    #토큰 기반 읽기 - 타입에 맞춰 데이터 읽기 
    > scan
    function (file = "", what = double(), nmax = -1L, n = -1L, 
        sep = "", quote = if (identical(sep, "\n")) "" else "'\"", 
        dec = ".", skip = 0L, nlines = 0L, na.strings = "NA", 
        flush = FALSE, fill = FALSE, strip.white = FALSE, quiet = FALSE, 
        blank.lines.skip = TRUE, multi.line = TRUE, comment.char = "", 
        allowEscapes = FALSE, fileEncoding = "", encoding = "unknown", 
        text, skipNul = FALSE)
    > scan("d:\\download\\sample.csv",nlines = 1, what=character('0'))
    Read 1 item
    [1] "Series_reference,Period,Data_value,Suppressed,STATUS,UNITS,Magnitude,Subject,Group,Series_title_1,Series_title_2,Series_title_3,Series_title_4,Series_title_5"
    
    # 예1. what=numeric(0)
    # 예2. what=interger(0)
    # 예3. what=list(v1=character(),v2=numberic(0))
    
  2. 데이터 출력

    > cat
    > function (..., file = "", sep = " ", fill = FALSE, 
        labels = NULL, append = FALSE) 
    > cList=c("a","b","c","d","e")
    > cat(cList,"d:\\data.out",sep=",")
    
    > fval=1.524520
    > print(fval,digits=1)
    2
    cat(printformat(fval,digits=1),"d:\\data2.out")
    
    

간단하게 데이터를 읽는 방법을 확인해 보았다. 제공되는 모든 function들을 확인해본 것은 아니지만 전체적으로 정형화된 데이터를 읽고, 출력하는 것을 확인할 수 있었다. 이처럼 R로 데이터를 읽어들이기 위해서는 반드시 csv나 table과 같이 정형화된 형태로 데이터가 제공되어야 함을 알 수가 있다. 따라서 효과적인 분석작업을 위해 전달되는 데이터의 전처리 과정이 매우 중요할 것으로 생각된다.