My Log

[ADsP #7] 데이터 분석 1장 - R 기초와 데이터마트(1) 본문

자격증 기록/ADsP(데이터분석 준전문가)

[ADsP #7] 데이터 분석 1장 - R 기초와 데이터마트(1)

My Log 2019. 8. 11. 15:46

* 시작하기에 앞서 본 게시물에 포함된 내용은 한국데이터산업진흥원에서 발행한 [데이터 분석 전문가 가이드, 2019년 2월 8일 개정]

   에 근거한 것임을 밝힙니다.

 

 

1. 분석 환경의 이해

 가. 통계 패키지 R

   - 통계 분석 과정에서 수행되는 복잡한 계산이나 시각화 기법을 쉽게 사용할 수 있도록 설계된 무료 소프트웨어

   - 기본으로 제공되는 기능 외에도 사용자들이 직접 제작한 패키지를 이용하여 무수히 많은 기능들을 사용할 수 있도록 확장 가능

   - 상용 소프트웨어나 출력물에 견주어 뒤쳐지지 않는 강력한 시각화 요소

 

  - R의 선택 기준

  SAS SPSS R
프로그램 비용 유료, 고가 유료, 고가 오픈소스
설치 용량 대용량 대용량 적음
다양한 모듈지원 및 비용 별도 구매 별도 구매 오픈소스
최근 알고리즘 및 기술 반영 느림 다소 느림 매우 빠름
학습자료 입수의 편의성 유료 도서 위주 유료 도서 위주 공개 논문 및 자료 많음
질의를 위한 공개 커뮤니티 NA NA 매우 활발

 

 나. R의 역사

   - 1993년 뉴질랜드 Ross Inaka와 Robert Gentleman에 의해 개발된 소프트웨어

   - AT&T에서 개발한 통계 프로그래밍 언어인 S언어 기반

   - S보다 한 단계 발전되었다는 의미에서 알파벳 S보다 앞선 R을 차용했다는 의미를 포함

   - S로 작성된 대부분의 코드를 실행시킬 수 있었으며, UNIXㆍWindowsㆍLinuxㆍMac OS를 지원하며 발전

 

 다. R의 특징

   - 그래픽 처리

      → 상용 소프트웨어에 버금가는 상당한 수준의 그래프와 그림을 그릴 수 있다.

      → 사용자가 세부적인 부분까지 직접 지정하여 섬세한 작업을 수행할 수 있다.

      → 고해상도 이미지를 생산하면서 처리 시간이 매우 빠르다.

      → 보고서 작성이나 발표 자료 작성 시에도 유용하게 사용할 수 있다.

 

   - 데이터 처리 및 계산능력

      → 벡터, 행렬, 배열, 데이터 프레임, 리스트 등 다양한 형태의 데이터 구조를 지원한다.

      → 복잡한 데이터 구조 내의 개별 데이터에 접근하는 절차가 간단하여 큰 데이터를 핸들링하기 간편하다.

 

   - 패키지

      → 사용자들이 스스로 개발하는 새로운 함수들을 패키지의 형태로 내려받아 사용할 수 있다.

      → 이러한 확장성 덕분에 다른 통계 프로그램에 비해 최신 이론이나 기법을 사용해보기가 더 쉽다.

 

 라. R 설치 방법

   - R 공식 웹페이지인 https://r-project.org에서 무료로 R을 다운로드 받고 설치할 수 있다.

 

 마. R Studio

   - R Studio는 R을 사용하는 통합 개발 환경 중의 하나이다.

   - R을 조금 더 간편하고 확장된 기능을 가지는 환경에서 실행할 수 있다.

   - R Studio 역시 무료로 사용할 수 있고 다양한 운영체제를 지원한다.

   - 공식홈페이지인 https://www.rstudio.com에서 다운로드 받을 수 있다.

 

 

2. 분석 환경의 기본 사용법

 가. R과 R Studio의 구성

   1) R의 구성

     - 메뉴바

     - 단축 아이콘 툴바

     - R 콘솔

     - 스크립트 창

 

   2) R Studio의 구성

     - 스크립트 창

     - R 콘솔

     - 환경 및 히스토리

     - 현재 문서들이 저장되는 폴더나 R을 이용해 그린 그림들, 불러온 패키지들과 도움말 등을 별도의 한 영역에서 확인할 수 있다.

 

  나. R 패키지 설치하기

     - R 패키지를 통해 최신 통계 이론을 적용한 분석을 실시할 수도 있고, 복잡한 그래프 설정에 대해 미리 정의된 패키지로 손쉽게 작업할 수 있다. 또한, 기본 프로그램 R에서 지원하지 않는 명령어나 함수를 사용할 수 있으며 유용한 데이터셋이 내장되어 있는 패키지를 이용할 수도 있다.

 

     1) 설치 방법

     - R : [메뉴 - 패키지툴] > [CRAN 미러사이트 지정] > [설치할 패키지 선택]

     - R Studio : [우측 하단 인터페이스 - Packages 탭] > [Install 선택] > [패키지 이름 입력]

     - 명령어를 사용한 설치

             > install.packages("패키지 이름")

             > library(패키지 이름)

 

  다. R 도움말

   - '?'나 'help' 명령어를 통해 도움말을 불러올 수 있다.

      ex) par 함수에 대한 도움말 불러오기

              > ?par

              > help(par)

 

 

 

 

3. R 언어와 문법

  가. R의 데이터 구조

     1) 벡터

         - 벡터 데이터 구조는 하나 이상의 스칼라 원소들을 갖는 단순한 형태의 집합을 의미한다.

         - 벡터 데이터 내에 들어갈 수 있는 원소는 숫자, 문자, 논리 연산자 등이 될 수 있다.

         - 기본적으로 열벡터가 만들어진다.

         - 명령어 c를 이용해 선언할 수 있다. ('c'는 concentration, 연결을 의미한다.)

              > x = c(1, 10, 24, 40)

              > y = c("사과", "바나나", "오렌지")

              > z = c(TRUE, FALSE, TRUE)

              > x <- c(1, 10, 24, 40)

              > y <- c("사과", "바나나", "오렌지")

              > z <- c(TRUE, FALSE, TRUE)

 

       - 논리연산자를 입력할 때는 반드시 모든 글자를 대문자로 기입해야 한다.

        - 논리연산자 벡터 z를 숫자형 벡터처럼 사용할 때, TRUE는 1, FALSE는 0을 할당받는다.

 

        - 벡터의 결합

              > xy <- c(x, y)

              > xy

               [1] "1"     "10"     "24"     "40"     "사과"     "바나나"     "오렌지"

  

         - 같은 형식의 벡터가 결합하면 이전의 벡터 형식과 동일

         - 결합하는 벡터에 문자형 벡터가 포함되면 결과 벡터는 문자형 벡터가 된다.

 

 

     2) 행렬

          - 기본적으로 열우선 방식

          - 명령어 matrix를 사용

              > matrix(벡터, [ ncol | nrow | byrow ])

                  * ncol : 열의 개수를 지정

                  * nrow : 행의 개수를 지정

                  * byrow : T값이면 행우선 방식으로 변경

 

              > mx = matrix(c(1,2,3,4,5,6) , ncol=2)

              > mx

                                   [ , 1]     [ , 2]

                   [ 1 , ]         1            4

                   [ 2 , ]         2            5

                   [ 3 , ]         3            6

 

          - 행렬 합치기

              명령어 rbind : 행을 추가하는 형태로 데이터 결합

              > r1 = c(10, 10)

              > rbind(mx, r1)

                                   [ , 1]     [ , 2]

                                      1            4

                                      2            5

                                      3            6

                      r1           10         10

 

               명령어 cbind : 열을 추가하는 형태로 데이터 결합

              > c1 = c(20, 20, 20)

              > cbind(mx, c1)

                                                                   c1

                   [ 1 , ]         1            4            20

                   [ 2 , ]         2            5            20

                   [ 3 , ]         3            6            20

 

 

     3) 데이터 프레임

          - 행렬과 유사한 2차원 목록의 데이터 구조이다.

          - 다루기가 쉽고 한 번에 많은 정보를 담을 수 있어 R에서 가장 많이 사용된다.

          - 행렬과는 달리, 각 열이 서로 다른 데이터 타입을 가질 수 있기 때문에 데이터의 크기가 커져도 사용자가 다루기 수월하다.

          - 명령어 data.frame을 사용하여 여러 개의 벡터를 하나의 데이터 프레임으로 합칠 수 있다.

 

              > income = c(100, 200, 150, 300, 900)

              > car = c("kia", "hyundai", "kia", "toyota", "lexus")

              > marrige = c(FALSE, FALSE, FALSE, TRUE, TRUE)

 

              > mydat = data.frame(income, car, marrige)

              > mydat

                                                     income          car                       marriage

                              1                        100               kia                       FALSE

                              2                        200               hyundai            FALSE

                              3                        150               kia                       FALSE

                              4                        300               toyota                TRUE

                              5                        900               lexus                   TRUE

 

 

  나. 외부 데이터 불러오기

        1) csv 파일 불러오기

            - 명령어 read.table

               read.table("csv파일 경로", [header | seq ]

                   * 파일의 경로는 \\ 또는 /를 사용한다.

                   * header : T값을 입력하면 csv파일의 첫 줄을 변수명으로 지정할 수 있다.

                   * seq : 데이터가 어떤 값으로 구분되어 있는지 지정해준다.

 

              > data1 <- read.table("D:\\DATA\\example.csv", header=T, sep=",")

 

            - 명령어 read.csv

                 read.table과 유사하지만, sep 옵션을 통해 구분자를 명시할 필요가 없다.

 

        2) txt 파일 불러오기

            - 명령어 read.table에서 sep 옵션을 사용하지 않으면 txt파일을 불러올 수 있다.

            - 구분자를 명시하지 않았기에 txt파일 자체가 구분자나 형식 등을 잘 지켜서 작성되어 있어야 한다.

 

              > data2 <- read.table("D:/DATA/example.txt")

 

        3) 엑셀 파일(xls/xlsx) 불러오기

            가. 엑셀을 csv파일 형식으로 저장하여 1) csv 파일 불러오기 방식을 이용하는 방법 

            나. 엑셀 파일을 직접 불러올 수 있는 패키지를 설치하는 방법

              > library(RODBC)    # 패키지 열기, "" 없는 것에 유의

              > new <- odbcConnectExcel("c:\\data\\mydata")     # 엑셀파일의 경로 입력(확장자 생략)

              > yourdata <- sqlFetch(new, "Sheet1")     # 엑셀파일의 워크시트 이름 입력(대소문자 구별)

              > close(new)

 

 

  다. R의 기초 함수

        1) 수열 생성

             - rep 함수(a, b) : a를 b번 반복하는 숫자벡터 생성

              > rep ( 1 ,  3 )

               [1]     1     1     1

 

             - seq 함수(a, b, [ by | length ]) : a부터 시작하여 b까지 1씩 증가하는 숫자벡터 생성

                   * by : 숫자 n을 입력하여 n씩 증가하는 수열을 생성한다.

                   * length : 숫자 n을 입력하여 전체 수열의 개수가 n개가 되도록 증가값을 자동으로 생성한다.

 

              > seq ( 1 ,  3 )

              > 1:3

               [1]     1     2     3

 

              > seq ( 1 ,  11 ,  by=2 )

               [1]     1     3     5     7     9     11

 

              > seq ( 1 ,  10 ,  length=4 )

               [1]     1     4     7     10

 

             - rep 함수의 인자로 seq 함수를 사용할 수 있다.

              > rep ( 2 : 5 ,  3 )

               [1]     2     3     4     5     2     3     4     5     2     3     4     5

 

        2) 벡터간 사칙연산

             - 연산하는 벡터의 길이가 같아야 한다.

              > a=1:10

              > a

               [1]     1     2     3     4     5     6     7     8     9     10

              > a+a

               [1]     2     4     6     8     10     12     14     16     18     20

              > a-a

               [1]     0     0     0     0     0     0     0     0     0     0

              > a*a

               [1]     1     4     9     16     25     36     49     64     81     100

              > a/a

               [1]     1     1     1     1     1     1     1     1     1     1

 

        3) 행렬곱과 역행렬

             - 행렬곱

                * 행렬 A(m, l)와 행렬 B(l, n)이 있을 때, 행렬곱 AB는 m x n 이 된다.

                   이때, l 의 값이 같아야 한다.

 

             - 전치행렬

                * 행과 열을 i, j로 표현할 때, i와 j 값이 같은 행렬 값들을 기준으로 뒤집은 행렬

                * 행과 열의 개수가 뒤바뀐다.

 

             - 역행렬

                * 행렬 A와 B가 'A x B = 1' 이 되는 관계에 있을 때, 행렬 B는 행렬 A의 역행렬이라 한다.

                * solve 명령어를 통해 역행렬을 계산할 수 있다.

 

              > a=c(2, 7, 3)                # 숫자 벡터 a 생성 (3행 1열의 벡터)

              > a

               [1]     2     7     3

 

              > t(a)                                # 전치행렬 (1행 3열의 벡터)

                             [ , 1 ]     [ , 2 ]     [ , 3 ]

               [ 1 ,  ]       2            7            3

 

              > A= a%*%t(a)        # 행렬곱(%*%) (3행 3열의 벡터)

              > A

                             [ , 1 ]     [ , 2 ]     [ , 3 ]

               [ 1 ,  ]       4           14            6

               [ 2 ,  ]     14           49          21

               [ 3 ,  ]       6           21            9

 

              > A * 2       # 스칼라 곱(*)

                             [ , 1 ]     [ , 2 ]     [ , 3 ]

               [ 1 ,  ]       8           28          12

               [ 2 ,  ]     28           98          42

               [ 3 ,  ]     12           42          18

 

              > solve(A)     # A의 역행렬

 

        4) 기초 통계값 계산

             - mean / var / sd 함수 : 주어진 벡터의 평균, 분산, 표준편차를 계산

 

             - sum / median / log 함수 : 주어진 벡터의 합, 중앙값, 자연로그를 계산

 

             - summary 함수 : 주어진 벡터의 각 사분위수와 최소값, 최대값, 중앙값, 평균을 계산

                       * 숫자 벡터 외의 벡터에 사용 시 해당 대상에 대한 정보를 요약해주는 기능을 한다.

 

             - cov / cor 함수 : 두 벡터의 공분산과 상관계수 계산

 

 

  라. R의 데이터 핸들링

        1) 벡터형 변수

             - 벡터 뒤에 대괄호 [ ] 를 붙여 숫자를 지정하여, 원하는 값을 불러온다.

 

              > b = c ("a", "b", "c", "d", "e")

              > b [2]                # 2번째 값

               [1]     "b"

 

              > b [-2]                # 2번째 값을 제외한 벡터

               [1]     "a"     "c"     "d"     "e"

 

              > b [ c( 2 , 3 ) ]                # 2, 3번째 값

               [1]     "b"     "c"

 

        2) 행렬/데이터 프레임 변수

             - 행렬형 변수나 데이터 프레임 변수에 대해서도 대괄호를 통해 특정요소의 참조가 가능하다.

             - 원하는 행, 열, 행과열 / 제외하려는 행, 열을 선택할 수 있으나, [ -m , -n ] 의 형태로 하나의 원소만을 제외할 수는 없다.

 

              > mydat [ 3 , 2 ]                    # 3행 2열의 값

 

              > mydat [    , 2 ]                    # 2열의 값

 

              > mydat [ 4 ,    ]                    # 4행의 값

 

 

  마. 반복 구문과 조건문

        1) for 문

             - 괄호 안의 조건 하에서 중괄호 { } 안의 구문을 반복실행

 

              (예) 1부터 100까지의 합

              > isum = 0

              > for (  i   in   1 : 100  )  {

              + isum = isum + i

              + }

              > cat ( "1부터 100까지의 합 = ", isum, "\n")

              1부터 100까지의 합 = 5050

 

        2) while 문

             - for 문과 마찬가지로 주어진 조건 하에서 중괄호 { } 안의 구문을 반복실행

             - for 문과 달리 몇 회 반복할지 미리 정해지지 않음

 

             (예) 1부터 100까지의 합

              > isum = 0

              > i = 1

              > while (  i < 101 )  {

              + isum = isum + i

              + i = i + 1

              + }

              > cat ( "1부터 100까지의 합 = ", isum, "\n")

              1부터 100까지의 합 = 5050

 

        3) if~else 문

             - if 조건문은 특정 조건이 만족되는 경우 이후의 구문을 실행, 만족하지 않는 경우 else 이하의 구문을 실행

 

             (예) 80점 이상이면 A 출력, 80점 미만이면 B 출력

              > score = 83

              > if ( score >= 80 )  cat("A\n")

              + else  cat("B"\n)

              A

 

  바. 사용자 정의 함수

        - function 명령어를 이용하여 사용자가 직접 함수를 구성할 수 있다.

        - 형식

              함수명 = function ( x , y , z ) {

              + ...

              + ...

              + }

 

  사. 기타 유용한 기능들

        1) paste

             - 문자열을 하나로 붙여주는 명령어

             - 'sep = ' 옵션을 통해 구분자를 삽입할 수 있다.

 

              > number = 1 : 10

              > alphabet = c ( "a", "b", "c" )

              > paste ( number, alphabet)

               [1]     "1a"    "2b"    "3c"    "4a"    "5b"    "6c"    "7a"    "8b"    "9c"    "10a" 

 

              > paste ( number , alphabet , sep=" to the " )

               [1]    "1 to the a"    "2 to the b"    "3 to the c"    "4 to the a"    "5 to the b"

               [6]    "6 to the c"    "7 to the a"    "8 to the b"    "9 to the c"    "10 to the a"

 

 

        2) substr

             - 주어진 문자열에서 특정 문자열을 추출하는 명령어

 

              > substr ( "BigDataAnalysis" , 1, 4 )

               [1]    "BigD"

 

              > country = c ("Korea" , "Japan" , "China" , "France " , "Spain" )

              > substr ( country , 1 , 3 )

               [1]    "Kor"    "Jap"    "Chi"    "Fra"    "Spa"

 

 

        3) 데이터 구조 변환

             - as.data.frame(x) : 데이터 프레임 형식으로 변환

               as.list(x) : 리스트 형식으로 변환

               as.matrix(x) : 행렬 형식으로 변환

               as.vector(x) : 벡터 형식으로 변환

               as.factor(x) : 팩터 형식으로 변환

 

             - 강제 형변환에 의해 표시될 수 없을 때는, 결측치인 'NA'가 출력되며 경고문 발생

             - 데이터 프레임을 행렬로 변환할 경우, 원소들은 모두 문자형으로 전환된다.

 

 

        4) 문자열 -> 날짜 변환

             - as.Date("yyyy-mm-dd") 함수 이용

               "yyyy-mm-dd" 형식의 문자열이 아닐경우, format 옵션으로 형식을 지정한다.

 

              > as.Date ( "01/13/2015" , format="%m/%d/%Y" )

               [1]    "2015-01-13"

 

        5) 날짜 -> 문자열 변환

             - format 함수와 as.character 함수를 이용해 날짜를 문자열로 변환한다.

              > format(Sys.Date())                # Sys.Date() : 현재 날짜를 반환

               [1]    "2019-08-11"

              > as.character(Sys.Date())

               [1]    "2019-08-11"

 

             - format 함수의 옵션

              > format(Sys.Date(), format="%m/%d/%Y")

               [1]    "08/11/2019"

 

              > format(Sys.Date(), '%a')     # 요일 출력

 

              > format(Sys.Date(), '%b')     # 월 출력

 

              > format(Sys.Date(), '%m')     # 두자리 숫자의 월 출력

 

              > format(Sys.Date(), '%d')     # 두자리 숫자의 일 출력

 

              > format(Sys.Date(), '%y')     # 두자리 숫자의 연도 출력

 

              > format(Sys.Date(), '%Y')     # 네자리 숫자의 연도 출력

 

 

4. R 언어의 그래픽 기능

  가. 산점도 그래프

        - x변수와 y변수의 값을 한눈에 살펴볼 수 있도록 평면에 점을 찍어 표현

        - plot(x, y) 또는 plot(y~x) 함수를 사용한다.

 

              <산점도 그래프 예시, 출처:위키백과>

 

  나. 산점도 행렬

        - 여러 가지 변수들에 대해서 각각의 산점도를 한눈에 살펴볼 수 있도록 확장된 산점도 행렬

        - pairs 명령어를 이용한다.

          ( 'main =' 옵션 : 최상단에 제목 표기 / 'pch =' 옵션 : 점의 모양 변경 / 'bg =' 옵션 : 데이터에 따른 색상 부여)

 

  다. 히스토그램과 상자 그림

        - 히스토그램과 상자 그림을 통해 자료의 분포를 손쉽게 확인할 수 있다.

        - hist(x) 함수를 통해 히스토그램을 생성하며, 'prob=T' 옵션으로 상대도수로 변경이 가능하다.

          기본적으로 세로축에 도수가 표기된다.

 

        - 상자 그림은 boxplot(x) 함수를 통해 생성할 수 있다.

 

             <상자 그림 예시, 출처:위키백과>

 

 

Comments