728x90
728x90

15 R 내장 함수, 변수 타입과 데이터 구조

15-1 R 내장 함수로 데이터 추출하기

  • dplyr 패키지를 사용하지 않고 R에 기본적으로 내장되어 있는 함수들만 사용해도 데이터를 추출할 수 있음
    • dplyr이 내장 함수에 비해 사용하기 쉽고 처리 속도도 빠르지만
      다른 사용자들이 만든 코드를 이해하고 활용하려면 내장 함수를 사용하는 방법도 알아두어야 함
    • 내장 함수는 다른 함수들과 조합해 활용할 수 있음
    exam <- read.csv("./data/csv_exam.csv")
    
    exam[]  # 조건 없이 전체 데이터 출력
    
    ##    id class math english science
    ## 1   1     1   50      98      50
    ## 2   2     1   60      97      60
    ## 3   3     1   45      86      78
    ## 4   4     1   30      98      58
    ## 5   5     2   25      80      65
    ## 6   6     2   50      89      98
    ## ...
    
    exam[1, ]  # 1행 추출
    
    ##   id class math english science
    ## 1  1     1   50      98      50
    
    exam[exam$class == 1, ]  # class가 1인 행 추출
    
    ##   id class math english science
    ## 1  1     1   50      98      50
    ## 2  2     1   60      97      60
    ## 3  3     1   45      86      78
    ## 4  4     1   30      98      58
    
    # 1반이면서 수학 점수가 50점 이상
    exam[exam$class == 1 & exam$math >= 50, ]
    
    ##   id class math english science
    ## 1  1     1   50      98      50
    ## 2  2     1   60      97      60
    
    # 영어 점수가 90점 미만이거나 과학 점수가 50점 미만
    exam[exam$english < 90 | exam$science < 50, ]
    
    ##    id class math english science
    ## 3   3     1   45      86      78
    ## 5   5     2   25      80      65
    ## 6   6     2   50      89      98
    ## 7   7     2   80      90      45
    ## 8   8     2   90      78      25
    ## ...
    
    exam[, 1]  # 첫 번째 열 추출
    
    ##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
    
    exam[, "math"]  # math 변수 추출
    
    ##  [1] 50 60 45 30 25 50 80 90 20 50 65 45 46 48 75 58 65 80 89 78
    
    exam[, c("class", "math", "english")]  # class, math, english 변수 추출
    
    ##    class math english
    ## 1      1   50      98
    ## 2      1   60      97
    ## 3      1   45      86
    ## 4      1   30      98
    ## 5      2   25      80
    ## 6      2   50      89
    ## ...
    
    # 행, 변수 모두 인덱스
    exam[1, 3]
    
    ## [1] 50
    
    # 행 인덱스, 열 변수명
    exam[5, "english"]
    
    ## [1] 80
    
    # 행 부등호 조건, 열 변수명
    exam[exam$math >= 50, "english"]
    
    ##  [1] 98 97 89 90 78 98 65 56 98 68 78 68 83
    
    # 행 부등호 조건, 열 변수명
    exam[exam$math >= 50, c("english", "science")]
    
    ##    english science
    ## 1       98      50
    ## 2       97      60
    ## 6       89      98
    ## 7       90      45
    ## 8       78      25
    ## 10      98      45
    ## ...
    
    
    ## 수학 점수 50 이상, 영어 점수 80 이상인 학생들을 대상으로 각 반의 전 과목 총평균
    
    # 내장 함수 코드
    exam$tot <- (exam$math + exam$english + exam$science) / 3
    aggregate(data = exam[exam$math >= 50 & exam$english >= 80, ], tot~class, mean)
    
    ##   class      tot
    ## 1     1 69.16667
    ## 2     2 75.33333
    ## 3     3 64.33333
    ## 4     4 73.66667
    ## 5     5 73.00000
    
    # dplyr 코드
    library(dplyr)
    exam %>%
        filter(math >= 50 & english >= 80) %>%
        mutate(tot = (math + english + science) / 3) %>%
        group_by(class) %>%
        summarise(mean = mean(tot))
    
    ## # A tibble: 5 x 2
    ##   class  mean
    ## * <int> <dbl>
    ## 1     1  69.2
    ## 2     2  75.3
    ## 3     3  64.3
    ## 4     4  73.7
    ## 5     5  73

15-2 변수 타입

  • 함수에 따라 적용할 수 있는 변수 타입이 다르기 때문에 분석을 하기 전에 변수 타입이 무엇인지 확인
  • 함수를 실행했을 때 오류가 발생하거나 예상과 다른 결과가 출력되면 변수 타입을 확인하고 함수에 맞게 변경
  • 변수의 종류
    • 연속 변수 - Numeric 타입
      • 연속 변수(Continuous Variable)는 키, 몸무게, 소득처럼 연속적이고 크기를 의미하는 값으로 구성된 변수
      • 숫자가 크기를 지니기 때문에 더하기 빼기, 평균 구하기 등 산술을 할 수 있음
      • 양적 변수(Quantitative Variable)
      • R에서 연속 변수는 nemeric(뉴머릭)으로 표현
    • 범주 변수 - Factor 타입
      • 범주 변수(Categorical Variable)는 값이 대상을 분류하는 의미를 지니는 변수
      • 성별 변수는 남자는 1, 여자는 2로 각 범주를 분류
      • 숫자가 크기를 의미하지 않기 때문에 더하거나 평균을 구하는 등 산술을 할 수 없음
      • 명목 변수(Nominal Variable)
      • R에서 범주 변수는 factor(펙터)로 표현
    var1 <- c(1, 2, 3, 1, 2)          # numeric 변수 생성
    var2 <- factor(c(1, 2, 3, 1, 2))  # factor 변수 생성
    
    var1  # numeric 변수 출력
    
    ## [1] 1 2 3 1 2
    
    var2  # factor 변수 출력
    
    ## [1] 1 2 3 1 2
    ## Levels: 1 2 3
    
    var1 + 2  # numeric 변수로 연산
    
    ## [1] 3 4 5 3 4
    
    var2 + 2  # factor 변수로 연산
    
    ## [1] NA NA NA NA NA
    ## In Ops.factor(var2, 2) : 요인(factors)에 대하여 의미있는 '+'가 아닙니다.
    
    class(var1)
    
    ## [1] "numeric"
    
    class(var2)
    
    ## [1] "factor"
    
    levels(var1)
    
    ## NULL
    
    levels(var2)
    
    ## [1] "1" "2" "3"
    
    mean(var1)
    
    ## [1] 1.8
    
    mean(var2)
    
    ## [1] NA
    ## In mean.default(var2) :
    ##   인자가 수치형 또는 논리형이 아니므로 NA를 반환합니다
    
    var2 <- as.numeric(var2)  # numeric 타입으로 변환
    mean(var2)                # 함수 재적용
    
    ## [1] 1.8
    
    class(var2)   # 타입 확인
    
    ## [1] "numeric"
    
    levels(var2)  # 범주 확인
    
    ## NULL
  • 변환 함수(Coercion Function) : 변수의 타입을 바꾸는 기능
    • as.numeric()
      • numeric으로 변환
    • as.factor()
      • factor로 변환
    • as.character()
      • character로 변환
    • as.Date()
      • Date로 변환
    • as.data.frame()
      • Data Frame으로 변환
  • 다양한 변수 타입들
    • numeric : 실수
      • 1, 12.3
    • integer : 정수
      • 1L, 23L
    • complex : 복소수
      • 3 + 2i
    • character : 문자
      • "male", "%FEMALE#", "123"
    • logical : 논리
      • TRUE, FALSE, T, F
    • factor : 범주
      • 1, 2, a, b
    • Date : 날짜
      • "2014-04-16", "16/04/14"

15-3 데이터 구조

  • 데이터 구조(Data Structures)
    • 벡터(Vactor)
      • 1차원 ; 한 가지 변수 타입으로 구성
      • 하나의 값 또는 여러 개의 값으로 구성된 데이터 구조
      • 여러 변수 타입을 섞을 수 없고, 한 가지 타입으로만 구성
      # 벡터 만들기
      a <- 1
      a
      
      ## [1] 1
      
      b <- "hello"
      b
      
      ## [1] "hello"
      
      # 데이터 구조 확인
      class(a)
      
      ## [1] "numeric"
      
      class(b)
      
      ## [1] "character"
    • 데이터 프레임(Data Frame)
      • 2차원 ; 다양한 변수 타입으로 구성
      • 행과 열로 구성된 2차원 데이터 구조
      # 데이터 프레임 만들기
      x1 <- data.frame(var1 = c(1, 2, 3),
                       var2 = c("a", "b", "c"))
      x1
      
      ##   var1 var2
      ## 1    1    a
      ## 2    2    b
      ## 3    3    c
      
      # 데이터 구조 확인
      class(x1)
      
      ## [1] "data.frame"
    • 매트릭스(Matrix)
      • 2차원 ; 한 가지 변수 타입으로 구성
      • 데이터 프레임과 마찬가지로 행과 열로 구성된 2차원 데이터 구조지만 한 가지 변수 타입으로만 구성
      # 매트릭스 만들기 - 1~12로 2열
      x2 <- matrix(c(1:12), ncol = 2)
      x2
      
      ##      [,1] [,2]
      ## [1,]    1    7
      ## [2,]    2    8
      ## [3,]    3    9
      ## [4,]    4   10
      ## [5,]    5   11
      ## [6,]    6   12
      
      # 데이터 구조 확인
      class(x2)
      
      ## [1] "matrix" "array"
    • 어레이(Array)
      • 다차원 ; 2차원 이상의 매트릭스
      • 2차원 이상으로 구성된 매트릭스로, 한 가지 변수 타입으로만 구성
      # array 만들기 - 1~20으로 2행 x 5열 x 2차원
      x3 <- array(1:20, dim = c(2, 5, 2))
      x3
      
      ## , , 1
      ##
      ##      [,1] [,2] [,3] [,4] [,5]
      ## [1,]    1    3    5    7    9
      ## [2,]    2    4    6    8   10
      ##
      ## , , 2
      ##
      ##      [,1] [,2] [,3] [,4] [,5]
      ## [1,]   11   13   15   17   19
      ## [2,]   12   14   16   18   20
      
      # 데이터 구조 확인
      class(x3)
      
      ## [1] "array"
    • 리스트(List)
      • 다차원 ; 서로 다른 데이터 구조 포함
      • 모든 데이터 구조를 포함하는 데이터 구조로, 여러 데이터 구조를 합해 하나의 리스트로 만들 수 있음
      # 리스트 생성 - 앞에서 생성한 데이터 구조 활용
      x4 <- list(f1 = a,   # 벡터
                 f2 = x1,  # 데이터 프레임
                 f3 = x2,  # 매트릭스
                 f4 = x3)  # 어레이
      x4
      
      ## $f1
      ## [1] 1
      ##
      ## $f2
      ##   var1 var2
      ## 1    1    a
      ## 2    2    b
      ## 3    3    c
      ##
      ## $f3
      ##      [,1] [,2]
      ## [1,]    1    7
      ## [2,]    2    8
      ## [3,]    3    9
      ## [4,]    4   10
      ## [5,]    5   11
      ## [6,]    6   12
      ##
      ## $f4
      ## , , 1
      ##
      ##      [,1] [,2] [,3] [,4] [,5]
      ## [1,]    1    3    5    7    9
      ## [2,]    2    4    6    8   10
      ##
      ## , , 2
      ##
      ##      [,1] [,2] [,3] [,4] [,5]
      ## [1,]   11   13   15   17   19
      ## [2,]   12   14   16   18   20
      
      # 데이터 구조 확인
      class(x4)
      
      ## [1] "list"
출처 : Do it! 쉽게 배우는 R 데이터 분석
 

Do it! 쉽게 배우는 R 데이터 분석

통계, 프로그래밍을 1도 몰라도 데이터를 혼자서 다룰 수 있다!데이터 분석 프로젝트 전 과정 수록!데이터 분석을 처음 시작한 초보자도 어깨춤을 추며 데이터를 혼자 다룰 수 있게 한다는 강의

book.naver.com

728x90
728x90

14 R Markdown으로 데이터 분석 보고서 만들기

14-1 신뢰할 수 있는 데이터 분석 보고서 만들기

  • R 마크다운(R Markdown)을 활용하면 데이터 분석의 전 과정을 담은 보고서를 쉽게 만들 수 있음
    • HTML, 워드, PDF 등 다양한 포맷으로 저장할 수 있음
  • 데이터 분석 보고서를 신뢰할 수 있으려면 동일한 분석 과정을 거쳤을 때 동일한 분석 결과가 반복되어 나오도록
    재현성(Reproducibility)을 갖춰야 함
  • R 마크다운을 이용하면 분석 과정과 결과를 자세하게 기술할 수 있기 때문에 재현성을 갖춘 분석 보고서를 만들 수 있음

14-2 R 마크다운 문서 만들기

# 데이터 분석 보고서 만들기

## R 마크다운이란?

마크다운 문법으로 코드를 작성해 [HTML](https://ko.wikipedia.org/wiki/HTML)로 변환할 수 있습니다. 
R 마크다운을 이용하면 분석 과정과 결과를 자세하게 기술할 수 있기 때문에 **재현 가능성**을 갖춘 *데이터 분석 보고서*를 만들 수 있습니다.

### R 마크다운 문법 예제

아래와 같이 작성하면 코드와 함께 `summary(cars)`를 실행한 결과물이 출력됩니다.

``` {r}
summary(cars)
```

별도로 이미지 파일을 붙여 넣는 작업을 하지 않아도 코드 아래에 그래프를 삽입할 수 있습니다.

``` {r}
library(ggplot2)
qplot(data = mpg, x = drv, fill = drv)
```
출처 : Do it! 쉽게 배우는 R 데이터 분석
 

Do it! 쉽게 배우는 R 데이터 분석

통계, 프로그래밍을 1도 몰라도 데이터를 혼자서 다룰 수 있다!데이터 분석 프로젝트 전 과정 수록!데이터 분석을 처음 시작한 초보자도 어깨춤을 추며 데이터를 혼자 다룰 수 있게 한다는 강의

book.naver.com

728x90
728x90

13 통계 분석 기법을 이용한 가설 검정

13-1 통계적 가설 검정이란?

  • 기술 통계(Descriptive statistics)
    • 데이터를 요약해 설명하는 통계 기법
    • 사람들이 받는 월급을 집계해 전체 월급 평균을 구한다면 이는 기술 통계 분석
  • 추론 통계(Inferential statistics)
    • 단순히 숫자를 요약하는 것을 넘어 어떤 값이 발생할 확률을 계산하는 통계 기법
    • 수집된 데이터에서 성별에 따라 월급에 차이가 있는 것으로 나타났을 때, 이런 차이가 우연히 발생할 확률을 계산
      이런 차이가 우연히 나타날 확률이 작다면 성별에 따른 월급 차이가 통계적으로 유의하다(statistically significant)고 결론
      이런 차이가 우연히 나타날 확률이 크다면 성별에 따른 월급 차이가 통계적으로 유의하지 않다(not statistically significant)고 결론
  • 일반적으로 통계 분석을 수행했다는 것은 추론 통계를 이용해 가설 검정을 했다는 의미
  • 통계적 가설 검정(Statistical hypothesis test)
    • 유의 확률을 이용해 가설을 검정하는 방법
    • 유의 확률(Significance probability, p-value)
      • 실제로 집단 간 차이가 없는데 우연히 차이가 있는 데이터가 추출될 확률을 의미
    • 통계 분석을 실시한 결과 유의 확률이 크게 나타났다면 '집단 간 차이가 통계적으로 유의하지 않다'라고 해석
      • 실제로 차이가 없더라도 우연에 의해 이 정도의 차이가 관찰될 가능성이 크다는 의미
    • 반대로 유의 확률이 작다면 '집단 간 차이가 통계적으로 유의하다'라고 해석
      • 실제로 차이가 없는데 우연히 이 정도의 차이가 관찰될 가능성이 적다, 우연이라고 보기 힘들다는 의미

13-2 t 검정 - 두 집단의 평균 비교

  • t 검정(t-test)
    • 두 집단의 평균에 통계적으로 유의한 차이가 있는지 알아볼 때 사용하는 통계 분석 기법
    mpg <- as.data.frame(ggplot2::mpg)
    
    library(dplyr)
    mpg_diff <- mpg %>%
        select(class, cty) %>%
        filter(class %in% c("compact", "suv"))
    
    head(mpg_diff)
    
    ##     class cty
    ## 1 compact  18
    ## 2 compact  21
    ## 3 compact  20
    ## 4 compact  21
    ## 5 compact  16
    ## 6 compact  18
    
    table(mpg_diff$class)
    
    ## compact     suv
    ##      47      62
    
    t.test(data = mpg_diff, cty ~ class, var.equal = T)
    
    ##         Two Sample t-test
    ##
    ### data:  cty by class
    ## t = 11.917, df = 107, p-value < 2.2e-16
    ## alternative hypothesis: true difference in means is not equal to 0
    ## 95 percent confidence interval:
    ##  5.525180 7.730139
    ## sample estimates:
    ## mean in group compact     mean in group suv
    ##              20.12766              13.50000
    
    
    ## p-value < 2.2e-16
    
    ## 유의확률을 의미, 판단 기준 : 5%
    ## p-value가 0.05 미만이면 '집단 간 차이가 통계적으로 유의하다'고 해석
    ## 따라서 'compact 와 suv 간 평균 도시 연비 차이가 통계적으로 유의하다'고 해석할 수 있음
    
    
    ## sample estimates:
    ## mean in group compact     mean in group suv
    ##              20.12766              13.50000
    
    ## 각 집단의 cty 평균
    ## "compact"는 20인 반면, "suv"는 13이므로, "suv"보다 "compact"의 도시 연비가 더 높다고 할 수 있음

13-3 상관분석 - 두 변수의 관계성 분석

  • 상관분석(Correlation Analysis)
    • 두 연속 변수가 서로 관련이 있는지 검정하는 통계 분석 기법
    • 상관분석을 통해 도출한 상관계수(Correlation Coefficient)로 두 변수가 얼마나 관련되어 있는지, 관련성 정도를 파악할 수 있음
    • 상관계수는 0~1 사이의 값을 지니고 1에 가까울수록 관련성이 크다는 것을 의미
    • 상관계수가 양수면 정비례, 음수면 반비례 관계임을 의미
    economics <- as.data.frame(ggplot2::economics)
    cor.test(economics$unemploy, economics$pce)
    
    ##         Pearson's product-moment correlation
    ##
    ## data:  economics$unemploy and economics$pce
    ## t = 18.63, df = 572, p-value < 2.2e-16
    ## alternative hypothesis: true correlation is not equal to 0
    ## 95 percent confidence interval:
    ##  0.5608868 0.6630124
    ## sample estimates:
    ##       cor
    ## 0.6145176
    
    
    ## p-value가 0.05 미만이므로, 실업자 수와 개인 소비 지출의 상관이 통계적으로 유의하다고 해석
    
    
    ##       cor
    ## 0.6145176
    
    ## 상관계수를 의미, 상관계수가 양수 0.61이므로,
    ## 실업자 수와 개인 소비 지출은 한 변수가 증가하면 다른 변수가 증가하는 정비례 관계
    head(mtcars)
    
    ##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
    ## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
    ## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
    ## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
    ## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
    ## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
    ## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
    
    car_cor <- cor(mtcars)  # 상관행렬 생성
    round(car_cor, 2)       # 소수점 셋째 자리에서 반올림해 출력
    
    ##        mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
    ## mpg   1.00 -0.85 -0.85 -0.78  0.68 -0.87  0.42  0.66  0.60  0.48 -0.55
    ## cyl  -0.85  1.00  0.90  0.83 -0.70  0.78 -0.59 -0.81 -0.52 -0.49  0.53
    ## disp -0.85  0.90  1.00  0.79 -0.71  0.89 -0.43 -0.71 -0.59 -0.56  0.39
    ## hp   -0.78  0.83  0.79  1.00 -0.45  0.66 -0.71 -0.72 -0.24 -0.13  0.75
    ## drat  0.68 -0.70 -0.71 -0.45  1.00 -0.71  0.09  0.44  0.71  0.70 -0.09
    ## wt   -0.87  0.78  0.89  0.66 -0.71  1.00 -0.17 -0.55 -0.69 -0.58  0.43
    ## qsec  0.42 -0.59 -0.43 -0.71  0.09 -0.17  1.00  0.74 -0.23 -0.21 -0.66
    ## vs    0.66 -0.81 -0.71 -0.72  0.44 -0.55  0.74  1.00  0.17  0.21 -0.57
    ## am    0.60 -0.52 -0.59 -0.24  0.71 -0.69 -0.23  0.17  1.00  0.79  0.06
    ## gear  0.48 -0.49 -0.56 -0.13  0.70 -0.58 -0.21  0.21  0.79  1.00  0.27
    ## carb -0.55  0.53  0.39  0.75 -0.09  0.43 -0.66 -0.57  0.06  0.27  1.00
    
    ## mpg(연비) 행과 cyl(실린더 수) 열이 교차되는 부분: -0.85
    ## 연비가 높을수록 실린더 수가 적은 경향이 있다는 것을 알 수 있음
    
    ## cyl(실린더 수) 행과 wt(무게) 열이 교차되는 부분: 0.78
    ## 실린더 수가 많을수록 자동차가 무거운 경향이 있다는 것을 알 수 있음
    
    library(corrplot)
    
    corrplot(car_cor)
    
    ## 상관계수가 클수록 원의 크기가 크고 색깔이 진함
    ## 상관계수가 양수면 파란색, 음수면 빨간색 계열로 표현
출처 : Do it! 쉽게 배우는 R 데이터 분석
 

Do it! 쉽게 배우는 R 데이터 분석

통계, 프로그래밍을 1도 몰라도 데이터를 혼자서 다룰 수 있다!데이터 분석 프로젝트 전 과정 수록!데이터 분석을 처음 시작한 초보자도 어깨춤을 추며 데이터를 혼자 다룰 수 있게 한다는 강의

book.naver.com

728x90
728x90

12 인터랙티브 그래프

12-1 plotly 패키지로 인터랙티브 그래프 만들기

  • 인터랙티브 그래프(Interactive Graph)
    • 마우스 움직임에 반응하며 실시간으로 형태가 변하는 그래프
    • 그래프를 자유롭게 조작하면서 관심 있는 부분을 자세히 살펴볼 수 있음
    • 그래프를 HTML 포맷으로 저장하면, 일반 사용자들도 웹 브라우저를 이용해 그래프를 조작할 수 있음
    library(ggplot2)
    library(plotly)
    
    p <- ggplot(data = mpg, aes(x = displ, y = hwy, col = drv)) + geom_point()
    
    ggplotly(p)
    p <- ggplot(data = diamonds, aes(x = cut, fill = clarity)) +
        geom_bar(position = "dodge")
    
    ggplotly(p)

12-2 dygraphs 패키지로 인터랙티브 시계열 그래프 만들기

library(dygraphs)

economics <- ggplot2::economics
head(economics)

## # A tibble: 6 x 6
##   date         pce    pop psavert uempmed unemploy
##   <date>     <dbl>  <dbl>   <dbl>   <dbl>    <dbl>
## 1 1967-07-01  507. 198712    12.6     4.5     2944
## 2 1967-08-01  510. 198911    12.6     4.7     2945
## 3 1967-09-01  516. 199113    11.9     4.6     2958
## 4 1967-10-01  512. 199311    12.9     4.9     3143
## 5 1967-11-01  517. 199498    12.8     4.7     3066
## 6 1967-12-01  525. 199657    11.8     4.8     3018

library(xts)

eco <- xts(economics$unemploy, order.by = economics$date)
head(eco)

##            [,1]
## 1967-07-01 2944
## 1967-08-01 2945
## 1967-09-01 2958
## 1967-10-01 3143
## 1967-11-01 3066
## 1967-12-01 3018

dygraph(eco)  # 그래프 생성

# 저축률
eco_a <- xts(economics$psavert, order.by = economics$date)

# 실업자 수
eco_b <- xts(economics$unemploy / 1000, order.by = economics$date)

eco2 <- cbind(eco_a, eco_b)                 # 데이터 결합
colnames(eco2) <- c("psavert", "unemploy")  # 변수명 바꾸기
head(eco2)

##            psavert unemploy
## 1967-07-01    12.6    2.944
## 1967-08-01    12.6    2.945
## 1967-09-01    11.9    2.958
## 1967-10-01    12.9    3.143
## 1967-11-01    12.8    3.066
## 1967-12-01    11.8    3.018

dygraph(eco2) %>% dyRangeSelector()

출처 : Do it! 쉽게 배우는 R 데이터 분석
 

Do it! 쉽게 배우는 R 데이터 분석

통계, 프로그래밍을 1도 몰라도 데이터를 혼자서 다룰 수 있다!데이터 분석 프로젝트 전 과정 수록!데이터 분석을 처음 시작한 초보자도 어깨춤을 추며 데이터를 혼자 다룰 수 있게 한다는 강의

book.naver.com

728x90
728x90

11 지도 시각화

11-1 미국 주별 강력 범죄율 단계 구분도 만들기

  • 단계 구분도(Choropleth Map)
    • 지역별 통계치를 색깔의 차이로 표현한 지도
    • 인구나 소득 같은 특성이 지역별로 얼마나 다른지 쉽게 이해할 수 있음
    library(ggiraphExtra)
    
    str(USArrests)
    
    ## 'data.frame':   50 obs. of  4 variables:
    ##  $ Murder  : num  13.2 10 8.1 8.8 9 7.9 3.3 5.9 15.4 17.4 ...
    ##  $ Assault : int  236 263 294 190 276 204 110 238 335 211 ...
    ##  $ UrbanPop: int  58 48 80 50 91 78 77 72 80 60 ...
    ##  $ Rape    : num  21.2 44.5 31 19.5 40.6 38.7 11.1 15.8 31.9 25.8 ...
    
    head(USArrests)
    
    ##            Murder Assault UrbanPop Rape
    ## Alabama      13.2     236       58 21.2
    ## Alaska       10.0     263       48 44.5
    ## Arizona       8.1     294       80 31.0
    ## Arkansas      8.8     190       50 19.5
    ## California    9.0     276       91 40.6
    ## Colorado      7.9     204       78 38.7
    
    library(tibble)
    
    crime <- rownames_to_column(USArrests, var = "state")
    crime$state <- tolower(crime$state)
    
    str(crime)
    
    ## 'data.frame':   50 obs. of  5 variables:
    ##  $ state   : chr  "alabama" "alaska" "arizona" "arkansas" ...
    ##  $ Murder  : num  13.2 10 8.1 8.8 9 7.9 3.3 5.9 15.4 17.4 ...
    ##  $ Assault : int  236 263 294 190 276 204 110 238 335 211 ...
    ##  $ UrbanPop: int  58 48 80 50 91 78 77 72 80 60 ...
    ##  $ Rape    : num  21.2 44.5 31 19.5 40.6 38.7 11.1 15.8 31.9 25.8 ...
    
    library(ggplot2)
    
    states_map <- map_data("state")
    str(states_map)
    
    ## 'data.frame':   15537 obs. of  6 variables:
    ##  $ long     : num  -87.5 -87.5 -87.5 -87.5 -87.6 ...
    ##  $ lat      : num  30.4 30.4 30.4 30.3 30.3 ...
    ##  $ group    : num  1 1 1 1 1 1 1 1 1 1 ...
    ##  $ order    : int  1 2 3 4 5 6 7 8 9 10 ...
    ##  $ region   : chr  "alabama" "alabama" "alabama" "alabama" ...
    ##  $ subregion: chr  NA NA NA NA ...
    
    ggChoropleth(data = crime,         # 지도에 표현할 데이터
                 aes(fill = Murder,    # 색깔로 표현할 변수
                     map_id = state),  # 지역 기준 변수
                 map = states_map)     # 지도 데이터

11-2 대한민국 시도별 인구, 결핵 환자 수 단계 구분도 만들기

library(kormaps2014)

str(changeCode(korpop1))

## 'data.frame':   17 obs. of  25 variables:
##  $ C행정구역별_읍면동     : chr  "'11" "'21" "'22" "'23" ...
##  $ : chr  "서울특별시" "부산광역시" "대구광역시" "인천광역시" ...
##  $ : chr  "2015" "2015" "2015" "2015" ...
##  $ : chr  "9904312" "3448737" "2466052" "2890451" ...
##  $ : chr  "4859535" "1701347" "1228511" "1455017" ...
##  ...

library(dplyr)

korpop1 <- rename(korpop1, pop = 총인구_명, name = 행정구역별_읍면동)
korpop1$name <- iconv(korpop1$name, "UTF-8", "CP949")

str(changeCode(kormap1))

## 'data.frame':   8831 obs. of  15 variables:
##  $ id       : chr  "0" "0" "0" "0" ...
##  $ long     : chr  "137.774352627938" "137.779270931415" "137.780545929866" "137.814504843261" ...
##  $ lat      : chr  "50.6883045072662" "50.6899249663447" "50.6900586920365" "50.6937941360883" ...
##  ...

ggChoropleth(data = korpop1,       # 지도에 표현할 데이터
             aes(fill = pop,       # 색깔로 표현할 변수
                 map_id = code,    # 지역 기준 변수
                 tooltip = name),  # 지도 위에 표시할 지역명
             map = kormap1,        # 지도 데이터
             interactive = T)      # 인터랙티브

str(changeCode(tbc))

## 'data.frame':   255 obs. of  5 variables:
##  $ name1 : chr  "강원" "경기" "경남" "경북" ...
##  $ code  : chr  "32" "31" "38" "37" ...
##  $ name  : chr  "강원도" "경기도" "경상남도" "경상북도" ...
##  $ year  : chr  "2001" "2001" "2001" "2001" ...
##  $ NewPts: chr  "1396" "4843" "1749" "2075" ...

tbc$name <- iconv(tbc$name, "UTF-8", "CP949")
ggChoropleth(data = tbc,           # 지도에 표현할 데이터
             aes(fill = NewPts,    # 색깔로 표현할 변수
                 map_id = code,    # 지역 기준 변수
                 tooltip = name),  # 지도 위에 표시할 지역명
             map = kormap1,        # 지도 데이터
             interactive = T)      # 인터랙티브

출처 : Do it! 쉽게 배우는 R 데이터 분석
 

Do it! 쉽게 배우는 R 데이터 분석

통계, 프로그래밍을 1도 몰라도 데이터를 혼자서 다룰 수 있다!데이터 분석 프로젝트 전 과정 수록!데이터 분석을 처음 시작한 초보자도 어깨춤을 추며 데이터를 혼자 다룰 수 있게 한다는 강의

book.naver.com

728x90
728x90

10 텍스트 마이닝

10-1 힙합 가사 텍스트 마이닝

  • 텍스트 마이닝(Text mining) : 문자로 된 데이터에서 가치 있는 정보를 얻어 내는 분석 기법
    • 형태소 분석(Morphology Analysis)
      • 텍스트 마이닝을 할 때 가장 먼저 하는 작업
      • 문장을 구성하는 어절들이 어떤 품사로 되어 있는지 파악
    • 어절들의 품사를 파악한 후 명사, 동사, 형용사 등 의미를 지닌 품사의 단어들을 추출해 각 단어가 얼마나 많이 등장했는지 확인
    # 패키지 로드
    library(KoNLP)
    library(dplyr)
    
    useNIADic()
    
    # 데이터 불러오기
    txt <- readLines(file("./data/hiphop.txt", encoding = "UTF-8"))
    head(txt)
    
    ## [1] "\"보고 싶다"                  "이렇게 말하니까 더 보고 싶다"
    ## [3] "너희 사진을 보고 있어도"      "보고 싶다"
    ## [5] "너무 야속한 시간"             "나는 우리가 밉다"
    
    library(stringr)
    
    # 특수문자 제거
    txt <- str_replace_all(txt, "\\W", " ")
    
    # 가사에서 명사 추출
    nouns <- extractNoun(txt)
    
    # 추출한 명사 list를 문자열 벡터로 변환, 단어별 빈도표 생성
    wordcount <- table(unlist(nouns))
    
    # 데이터 프레임으로 변환
    df_word <- as.data.frame(wordcount, stringsAsFactors = F)
    
    # 변수명 수정
    df_word <- rename(df_word, word = Var1, freq = Freq)
    
    # 두 글자 이상 단어 추출
    df_word <- filter(df_word, nchar(word) >= 2)
    
    top_20 <- df_word %>%
        arrange(desc(freq)) %>%
        head(20)
    top_20
    
    ##    word freq
    ## 1   you   89
    ## 2    my   86
    ## 3   YAH   80
    ## 4    on   76
    ## 5  하나   75
    ## 6  오늘   51
    ## ...
    
    # 패키지 로드
    library(wordcloud)
    library(RColorBrewer)
    
    # Dark2 색상 목록에서 8개 색상 추출
    pal <- brewer.pal(8, "Dark2")
    
    set.seed(1234)
    
    wordcloud(words = df_word$word,  # 단어
              freq = df_word$freq,   # 빈도
              min.freq = 2,          # 최소 단어 빈도
              max.words = 200,       # 표현 단어 수
              random.order = F,      # 고빈도 단어 중앙 배치
              rot.per = .1,          # 회전 단어 비율
              scale = c(4, 0.3),     # 단어 크기 범위
              colors = pal)          # 색상 목록
    
    ## 많이 사용된 단어일수록 글자가 크고 가운데에 배치
    ## 덜 사용된 단어일수록 글자가 작고 바깥쪽에 배치되는 형태로 구성

10-2 국정원 트윗 텍스트 마이닝

  • 텍스트 마이닝은 소셜 네트워크에 올라온 글을 통해 사람들이 어떤 생각을 하고 있는지 알아보기 위한 목적으로 자주 활용
  • 해당 데이터는 국정원이 대선에 개입한 사실이 밝혀져 논란이 됐던 2013년 6월, 독립 언론 뉴스타파가 인터넷을 통해 공개한 것으로
    국정원 계정으로 작성된 3,744개 트윗으로 구성
    # 데이터 로드
    twitter <- read.csv("./data/twitter.csv",
                        header = T,
                        stringsAsFactors = F,
                        fileEncoding = "UTF-8")
    
    # 변수명 수정
    twitter <- rename(twitter,
                      no = 번호,
                      id = 계정이름,
                      date = 작성일,
                      tw = 내용)
    
    # 특수문자 제거
    twitter$tw <- str_replace_all(twitter$tw, "\\W", " ")
    head(twitter$tw)
    
    ## [1] "민주당의 ISD관련 주장이 전부 거짓으로 속속 드러나고있다  미국이 ISD를 장악하고 있다고 주장하지만 중재인 123명 가운데
    ## 미국인은 10명뿐이라고 한다 "
    ## [2] "말로만  미제타도   사실은  미제환장   김정일 운구차가 링컨 컨티넬탈이던데 북한의 독재자나 우리나라 종북들이나 겉으로는 
    ## 노동자  서민을 대변한다면서 고급 외제차  아이팟에 자식들 미국 유학에 환장하는 위선자들인거죠"
    ## ...
    
    # 트윗에서 명사추출
    nouns <- extractNoun(twitter$tw)
    
    # 추출한 명사 list를 문자열 벡터로 변환, 단어별 빈도표 생성
    wordcount <- table(unlist(nouns))
    
    # 데이터 프레임으로 변환
    df_word <- as.data.frame(wordcount, stringsAsFactors = F)
    
    # 변수명 수정
    df_word <- rename(df_word,
                      word = Var1,
                      freq = Freq)
    
    # 두 글자 이상 단어만 추출
    df_word <- filter(df_word, nchar(word) >= 2)
    
    # 상위 20개 추출
    top20 <- df_word %>%
        arrange(desc(freq)) %>%
        head(20)
    
    top20
    
    ##        word freq
    ## 1      종북 2431
    ## 2      북한 2216
    ## 3      세력 1162
    ## 4      좌파  829
    ## 5  대한민국  804
    ## 6      우리  780
    ## 7      들이  566
    ## 8      국민  550
    ## 9      친북  430
    ## ...
    
    ## 북한, 좌파, 친북, 김정일, 천안함, 연평도 등 북한과 관련된 단어들이 자주 사용된 것을 보면,
    ## 국정원이 안보 위협을 강조하는 트윗을 주로 작성했다는 것을 알 수 있음
    
    library(ggplot2)
    
    order <- arrange(top20, freq)$word  # 빈도 순서 변수 생성
    
    ggplot(data = top20, aes(x = word, y = freq)) +
        ylim(0, 2500) +
        geom_col() +
        coord_flip() +
        scale_x_discrete(limit = order) +           # 빈도순 막대 정렬
        geom_text(aes(label = freq), hjust = -0.3)  # 빈도 표시
    
    ## 가장 많이 사용된 단어인 '종북', '북한'이 '대한민국'의 세 배 가까이 될 정도로 많은 것을 보면
    ## 국정원이 북한 관련 이슈에 초점을 맞추고 트윗을 작성했다는 것을 알 수 있음
    
    pal <- brewer.pal(8, "Dark2")  # 색상 목록 생성
    set.seed(1234)                 # 난수 고정
    
    wordcloud(words = df_word$word,  # 단어
              freq = df_word$freq,   # 빈도
              min.freq = 10,         # 최소 단어 빈도
              max.words = 200,       # 표현 단어 수
              random.order = F,      # 고빈도 단어 중앙 배치
              rot.per = .1,          # 회전 단어 비율
              scale = c(6, 0.2),     # 단어 크기 범위
              colors = pal)          # 색상 목록
출처 : Do it! 쉽게 배우는 R 데이터 분석
 

Do it! 쉽게 배우는 R 데이터 분석

통계, 프로그래밍을 1도 몰라도 데이터를 혼자서 다룰 수 있다!데이터 분석 프로젝트 전 과정 수록!데이터 분석을 처음 시작한 초보자도 어깨춤을 추며 데이터를 혼자 다룰 수 있게 한다는 강의

book.naver.com

728x90
728x90

08 그래프 만들기

08-1 R로 만들 수 있는 그래프 살펴보기

  • 그래프(Graph) : 데이터를 보기 쉽게 그림으로 표현한 것

08-2 산점도 - 변수 간 관계 표현하기

  • 산점도(Scater Plot)
    • 데이터를 x축과 y축에 점으로 표현한 그래프
    • 나이와 소득처럼 연속 값으로 된 두 변수의 관계를 표현할 때 사용
    # x축 범위 3~6, y축 범위 10~30으로 지정
    ggplot(data = mpg, aes(x = displ, y = hwy)) + geom_point() + xlim(3, 6) + ylim(10, 30)

08-3 막대 그래프 - 집단 간 차이 표현하기

  • 막대 그래프(Bar Chart)
    • 데이터의 크기를 막대의 길이로 표현한 그래프
    • 성별 소득 차이처럼 집단 간 차이를 표현할 때 주로 사용
    library(dplyr)
    
    df_mpg <- mpg %>%
        group_by(drv) %>%
        summarise(mean_hwy = mean(hwy))
    df_mpg
    
    ## # A tibble: 3 x 2
    ##   drv   mean_hwy
    ## * <chr>    <dbl>
    ## 1 4         19.2
    ## 2 f         28.2
    ## 3 r         21
    
    # 크기 순으로 정렬하기
    ggplot(data = df_mpg, aes(x = reorder(drv, -mean_hwy), y = mean_hwy)) + geom_col()

08-4 선 그래프 - 시간에 따라 달라지는 데이터 표현하기

  • 선 그래프(Line Chart)
    • 데이터를 선으로 표현한 그래프
    • 시간에 따라 달라지는 데이터를 표현할 때 주로 선 그래프를 이용
    • 환율, 주가지수 등 경제 지표가 시간에 따라 어떻게 변하는지를 선 그래프로 표현
  • 시계열 데이터(Time Series Data)
    • 일별 환율처럼, 일정 시간 간격을 두고 나열된 데이터
    • 시계열 데이터를 선으로 표현한 그래프를 '시계열 그래프(Time Series Chart)'라고 함
    ggplot(data = economics, aes(x = date, y = unemploy)) + geom_line()

08-5 상자 그림 - 집단 간 분포 차이 표현하기

  • 상자 그림(Box Plot)
    • 데이터의 분포(퍼져 있는 형태)를 직사각형 상자 모양으로 표현한 그래프
    • 상자 그림을 보면 분포를 알 수 있기 때문에 평균만 볼 때보다 데이터의 특징을 더 자세히 이해할 수 있음
    ggplot(data = mpg, aes(x = drv, y = hwy)) + geom_boxplot()
  • 상자 그림은 값을 크기 순으로 나열해 4등분 했을 때 위치하는 값인 '사분위수'를 이용해 그려짐
    • 상자 아래 세로선
      • 아랫수염
      • 하위 0~25% 내에 해당하는 값
    • 상자 밑면
      • 1사분위수(Q1)
      • 하위 25% 위치 값
    • 상자 내 굵은 선
      • 2사분위수(Q2)
      • 하위 50% 위치 값(중앙값)
    • 상자 윗면
      • 3사분위수(Q3)
      • 하위 75% 위치 값
    • 상자 위 세로선
      • 윗수염
      • 하위 75~100% 내에 해당하는 값
    • 상자 밖 점 표식
      • 극단치
      • Q1, Q3 밖, 1.5 IQR을 벗어난 값
        • 1.5 IQR : 사분위 범위(Q1~Q3 간 거리)의 1.5배
출처 : Do it! 쉽게 배우는 R 데이터 분석
 

Do it! 쉽게 배우는 R 데이터 분석

통계, 프로그래밍을 1도 몰라도 데이터를 혼자서 다룰 수 있다!데이터 분석 프로젝트 전 과정 수록!데이터 분석을 처음 시작한 초보자도 어깨춤을 추며 데이터를 혼자 다룰 수 있게 한다는 강의

book.naver.com

728x90
728x90

07 데이터 정제 - 빠진 데이터, 이상한 데이터 제거하기

07-1 빠진 데이터를 찾아라! - 결측치 정제하기

  • 결측치(Missing Value) : 누락된 값, 비어 있는 값을 의미
    • 결측치가 있으면 함수가 적용되지 않거나 분석 결과가 왜곡되는 문제가 발생
    • 실제 데이터에서는 결측치가 있는지 확인해 제거하는 정제 과정을 거친 후에 분석
    df <- data.frame(sex = c("M", "F", NA, "M", "F"),
                     score = c(5, 4, 3, 4, NA))
    df
    
    ##    sex score
    ## 1    M     5
    ## 2    F     4
    ## 3 <NA>     3
    ## 4    M     4
    ## 5    F    NA
    
    is.na(df)  # 결측치 확인
    
    ##        sex score
    ## [1,] FALSE FALSE
    ## [2,] FALSE FALSE
    ## [3,]  TRUE FALSE
    ## [4,] FALSE FALSE
    ## [5,] FALSE  TRUE
    
    table(is.na(df))  # 결측치 빈도 출력
    
    ## FALSE  TRUE
    ##     8     2
    
    library(dplyr)               # dplyr 패키지 로드
    
    df_nomiss <- df %>% filter(!is.na(score) & !is.na(sex))  # score, sex 결측치 제거
    df_nomiss
    
    ##   sex score
    ## 1   M     5
    ## 2   F     4
    ## 3   M     4
    
    df_nomiss2 <- na.omit(df)  # 모든 변수에 결측치 없는 데이터 추출
    df_nomiss2
    
    ##   sex score
    ## 1   M     5
    ## 2   F     4
    ## 4   M     4
    
    mean(df$score, na.rm = T)  # 결측치 제외하고 평균 산출
    
    ## [1] 4

07-2 이상한 데이터를 찾아라! - 이상치 정제하기

  • 이상치(Outlier) : 정상 범주에서 크게 벗어난 값
    • 오류는 아니지만 굉장히 드물게 발생하는 극단적인 값이 있을 수도 있음
    • 이상치가 포함되어 있으면 분석 결과가 왜곡되기 때문에 분석에 앞서 이상치를 제거하는 작업을 해야 함
  • 이상치 제거하기 - 존재할 수 없는 값
    outlier <- data.frame(sex = c(1, 2, 1, 3, 2, 1),
                          score = c(5, 4, 3, 4, 2, 6))
    outlier
    
    ##   sex score
    ## 1   1     5
    ## 2   2     4
    ## 3   1     3
    ## 4   3     4
    ## 5   2     2
    ## 6   1     6
    
    table(outlier$sex)
    
    ## 1 2 3
    ## 3 2 1
    
    table(outlier$score)
    
    ## 2 3 4 5 6
    ## 1 1 2 1 1
    
    # sex가 3이면 NA 할당
    outlier$sex <- ifelse(outlier$sex == 3, NA, outlier$sex)
    outlier
    
    ##   sex score
    ## 1   1     5
    ## 2   2     4
    ## 3   1     3
    ## 4  NA     4
    ## 5   2     2
    ## 6   1     6
    
    # score가 5보다 크면 NA 할당
    outlier$score <- ifelse(outlier$score > 5, NA, outlier$score)
    outlier
    
    ##   sex score
    ## 1   1     5
    ## 2   2     4
    ## 3   1     3
    ## 4  NA     4
    ## 5   2     2
    ## 6   1    NA
    
    outlier %>%
        filter(!is.na(sex) & !is.na(score)) %>%
        group_by(sex) %>%
        summarise(mean_score = mean(score))
    
    ## # A tibble: 2 x 2
    ##     sex mean_score
    ## * <dbl>      <dbl>
    ## 1     1          4
    ## 2     2          3
  • 이상치 제거하기 - 극단적인 값
    boxplot(mpg$hwy)
    
    boxplot(mpg$hwy)$stats  # 상자 그림 통계치 출력
    
    ##      [,1]
    ## [1,]   12  # 아래쪽 극단치 경계
    ## [2,]   18  # 1사분위수
    ## [3,]   25  # 중앙값
    ## [4,]   27  # 3사분위수
    ## [5,]   37  # 위쪽 극단치 경계
    ## attr(,"class")
    ##         1
    ## "integer"
    
    # 12~37 벗어나면 NA 할당
    mpg$hwy <- ifelse(mpg$hwy < 12 | mpg$hwy > 37, NA, mpg$hwy)
    table(is.na(mpg$hwy))
    
    ## FALSE  TRUE
    ##   226     8
    
    mpg %>%
        group_by(drv) %>%
        summarise(mean_hwy = mean(hwy, na.rm = T))
    
    ## # A tibble: 3 x 2
    ##   drv   mean_hwy
    ## * <chr>    <dbl>
    ## 1 4         19.2
    ## 2 f         27.8
    ## 3 r         21
출처 : Do it! 쉽게 배우는 R 데이터 분석
 

Do it! 쉽게 배우는 R 데이터 분석

통계, 프로그래밍을 1도 몰라도 데이터를 혼자서 다룰 수 있다!데이터 분석 프로젝트 전 과정 수록!데이터 분석을 처음 시작한 초보자도 어깨춤을 추며 데이터를 혼자 다룰 수 있게 한다는 강의

book.naver.com

728x90
728x90

06 자유자재로 데이터 가공하기

06-1 데이터 전처리 - 원하는 형태로 데이터 가공하기

  • 데이터 전처리(Data Preprocessing) : 분석에 적합하게 데이터를 가공하는 작업
    • 일부를 추출하거나, 종류별로 나누거나, 여러 데이터를 합치는 등 데이터를 자유롭게 가공할 수 있어야 목적에 맞게 분석할 수 있음
  • dplyr은 데이터 전처리 작업에 가장 많이 사용되는 패키지
    • filter()
      • 행 추출
    • select()
      • 열(변수) 추출
    • arrange()
      • 정렬
    • mutate()
      • 변수 추가
    • summarise()
      • 통계치 산출
    • group_by()
      • 집단별로 나누기
    • left_join()
      • 데이터 합치기(열)
    • bind_rows()
      • 데이터 합치기(행)

06-2 조건에 맞는 데이터만 추출하기

library(dplyr)
exam <- read.csv("./data/csv_exam.csv")
exam

##    id class math english science
## 1   1     1   50      98      50
## 2   2     1   60      97      60
## 3   3     1   45      86      78
## 4   4     1   30      98      58
## 5   5     2   25      80      65
## 6   6     2   50      89      98
## ...

# exam에서 class가 1인 경우만 추출해 출력
exam %>% filter(class == 1)

##   id class math english science
## 1  1     1   50      98      50
## 2  2     1   60      97      60
## 3  3     1   45      86      78
## 4  4     1   30      98      58

# 1반이면서 수학 점수가 50점 이상인 경우
exam %>% filter(class == 1 & math >= 50)

##   id class math english science
## 1  1     1   50      98      50
## 2  2     1   60      97      60

# 수학 점수가 90점 이상이거나 영어 점수가 90점 이상인 경우
exam %>% filter(math >= 90 | english >= 90)

##   id class math english science
## 1  1     1   50      98      50
## 2  2     1   60      97      60
## 3  4     1   30      98      58
## 4  7     2   80      90      45
## 5  8     2   90      78      25
## 6  9     3   20      98      15
## ...

exam %>% filter(class %in% c(1, 3, 5))  # 1, 3, 5반에 해당하면 추출

##    id class math english science
## 1   1     1   50      98      50
## 2   2     1   60      97      60
## 3   3     1   45      86      78
## 4   4     1   30      98      58
## 5   9     3   20      98      15
## 6  10     3   50      98      45
## ...

06-3 필요한 변수만 추출하기

exam %>% select(math)  # math 추출

##    math
## 1    50
## 2    60
## 3    45
## 4    30
## ...

exam %>% select(-math)  # math 제외

##    id class english science
## 1   1     1      98      50
## 2   2     1      97      60
## 3   3     1      86      78
## 4   4     1      98      58
## ...

exam %>%
    filter(class == 1) %>%  # class가 1인 행 추출
    select(english)         # english 추출

##   english
## 1      98
## 2      97
## 3      86
## 4      98

exam %>%
    select(id, math) %>%  # id, math 추출
    head(10)              # 앞부분 10행까지 추출

##    id math
## 1   1   50
## 2   2   60
## 3   3   45
## 4   4   30
## 5   5   25
## 6   6   50
## 7   7   80
## 8   8   90
## 9   9   20
## 10 10   50

06-4 순서대로 정렬하기

exam %>% arrange(math)  # math 오름차순 정렬

##    id class math english science
## 1   9     3   20      98      15
## 2   5     2   25      80      65
## 3   4     1   30      98      58
## 4   3     1   45      86      78
## 5  12     3   45      85      32
## 6  13     4   46      98      65
## ...

exam %>% arrange(desc(math))  # math 내림차순 정렬

##    id class math english science
## 1   8     2   90      78      25
## 2  19     5   89      68      87
## 3   7     2   80      90      45
## 4  18     5   80      78      90
## 5  20     5   78      83      58
## 6  15     4   75      56      78
## ...

exam %>% arrange(class, math)  # class 및 math 오름차순 정렬

##    id class math english science
## 1   4     1   30      98      58
## 2   3     1   45      86      78
## 3   1     1   50      98      50
## 4   2     1   60      97      60
## 5   5     2   25      80      65
## 6   6     2   50      89      98
## 7   7     2   80      90      45
## 8   8     2   90      78      25
## ...

06-5 파생변수 추가하기

exam %>%
    mutate(total = math + english + science) %>%  # 총합 변수 추가
    head                                          # 일부 추출

##   id class math english science total
## 1  1     1   50      98      50   198
## 2  2     1   60      97      60   217
## 3  3     1   45      86      78   209
## 4  4     1   30      98      58   186
## 5  5     2   25      80      65   170
## 6  6     2   50      89      98   237

exam %>%
    mutate(test = ifelse(science >= 60, "pass", "fail")) %>%
    head

##   id class math english science test
## 1  1     1   50      98      50 fail
## 2  2     1   60      97      60 pass
## 3  3     1   45      86      78 pass
## 4  4     1   30      98      58 fail
## 5  5     2   25      80      65 pass
## 6  6     2   50      89      98 pass

exam %>%
    mutate(total = math + english + science) %>%  # 총합 변수 추가
    arrange(total) %>%                            # 총합 변수 기준 정렬
    head                                          # 일부 추출

##   id class math english science total
## 1  9     3   20      98      15   133
## 2 14     4   48      87      12   147
## 3 12     3   45      85      32   162
## 4  5     2   25      80      65   170
## 5  4     1   30      98      58   186
## 6  8     2   90      78      25   193

06-6 집단별로 요약하기

exam %>% summarise(mean_math = mean(math))  # math 평균 산출

##   mean_math
## 1     57.45

exam %>%
    group_by(class) %>%                # class별로 분리
    summarise(mean_math = mean(math))  # math 평균 산출

## # A tibble: 5 x 2
##   class mean_math
## * <int>     <dbl>
## 1     1      46.2
## 2     2      61.2
## 3     3      45
## 4     4      56.8
## 5     5      78

exam %>%
    group_by(class) %>%                    # class별로 분리
    summarise(mean_math = mean(math),      # math 평균
              sum_math = sum(math),        # math 합계
              median_math = median(math),  # math 중앙값
              n = n())                     # 학생 수

## # A tibble: 5 x 5
##   class mean_math sum_math median_math     n
## * <int>     <dbl>    <int>       <dbl> <int>
## 1     1      46.2      185        47.5     4
## 2     2      61.2      245        65       4
## 3     3      45        180        47.5     4
## 4     4      56.8      227        53       4
## 5     5      78        312        79       4

06-7 데이터 합치기

# 중간고사 데이터 생성
test1 <- data.frame(id = c(1, 2, 3, 4, 5),
                    midterm = c(60, 80, 70, 90, 85))

# 기말고사 데이터 생성
test2 <- data.frame(id = c(1, 2, 3, 4, 5),
                    final = c(70, 83, 65, 95, 80))

total <- left_join(test1, test2, by = "id")  # id를 기준으로 합쳐 total에 할당
total                                        # total 출력

##   id midterm final
## 1  1      60    70
## 2  2      80    83
## 3  3      70    65
## 4  4      90    95
## 5  5      85    80

# 학생 1~5번 시험 데이터 생성
group_a <- data.frame(id = c(1, 2, 3, 4, 5),
                      test = c(60, 80, 70, 90, 85))

# 학생 6~10번 시험 데이터 생성
group_b <- data.frame(id = c(6, 7, 8, 9, 10),
                      test = c(70, 83, 65, 95, 80))

group_all <- bind_rows(group_a, group_b)  # 데이터 합쳐서 group_all에 할당
group_all                                 # group_all 출력

##    id test
## 1   1   60
## 2   2   80
## 3   3   70
## 4   4   90
## 5   5   85
## 6   6   70
## 7   7   83
## ...
출처 : Do it! 쉽게 배우는 R 데이터 분석
 

Do it! 쉽게 배우는 R 데이터 분석

통계, 프로그래밍을 1도 몰라도 데이터를 혼자서 다룰 수 있다!데이터 분석 프로젝트 전 과정 수록!데이터 분석을 처음 시작한 초보자도 어깨춤을 추며 데이터를 혼자 다룰 수 있게 한다는 강의

book.naver.com

728x90
728x90

04 데이터 프레임의 세계로!

04-1 데이터는 어떻게 생겼나? - 데이터 프레임 이해하기

  • 데이터 프레임(Data Frame)
    • 가장 많이 사용하는 데이터 형태
    • 행과 열로 구성된 사각형 모양의 표
  • 세로로 나열되는 열은 속성
    • 열은 '컬럼(Column)' 또는 '변수(Variable)'
  • 가로로 나열되는 행은 각 사람에 대한 정보
    • 행은 Row(로) 또는 Case(케이스)
  • "데이터가 크다"라는 말은 행이 많다는 의미일 수도 있고, 열이 많다는 의미일 수도 있음
    • 데이터를 분석하는 입장에서 봤을 때 열이 많은 것이 더 중요
    • 변수가 늘어나면 단순한 분석 방법으로는 해결하기 힘들어지고
      여러 변수의 영향을 동시에 고려할 수 있는 복잡한 분석 방법을 활용해야 할 필요성이 생김
    • 변수가 많아지면 적용하는 분석 기술이 달라지기 때문에 분석가는 전보다 많은 노력을 기울여야 함
  • "데이터가 크다"
    • 행이 많다 → 컴퓨터가 느려짐 → 고사양 장비 구축
    • 열이 많다 → 분석 방법의 한계 → 고급 분석 방법

04-2 데이터 프레임 만들기 - 시험 성적 데이터를 만들어 보자!

english <- c(90, 80, 60, 70)  # 영어 점수 변수 생성
english

## [1] 90 80 60 70

math <- c(50, 60, 100, 20)  # 수학 점수 변수 생성
math

## [1]  50  60 100  20

# english, math로 데이터 프레임 생성해서 df_midterm에 할당
df_midterm <- data.frame(english, math)
df_midterm

##   english math
## 1      90   50
## 2      80   60
## 3      60  100
## 4      70   20

mean(df_midterm$english)  # df_midterm의 english로 평균 산출

## [1] 75

mean(df_midterm$math)  # df_midterm의 math로 평균 산출

## [1] 57.5

# 데이터 프레임 한 번에 만들기
df_midterm <- data.frame(english = c(90, 80, 60, 70),
                         math = c(50, 60, 100, 20),
                         class = c(1, 1, 2, 2))
df_midterm

##   english math class
## 1      90   50     1
## 2      80   60     1
## 3      60  100     2
## 4      70   20     2

04-3 외부 데이터 이용하기 - 축적된 시험 성적 데이터를 불러오자!

  • 엑셀 파일 불러오기
    install.packages("readxl")
    library(readxl)
    
    df_exam <- read_excel("./data/excel_exam.xlsx")  # 엑셀 파일을 불러와 df_exam에 할당
    df_exam                                          # 출력
    
    ##       id class  math english science
    ##    <dbl> <dbl> <dbl>   <dbl>   <dbl>
    ##  1     1     1    50      98      50
    ##  2     2     1    60      97      60
    ##  3     3     1    45      86      78
    ##  4     4     1    30      98      58
    ##  5     5     2    25      80      65
    ##  6     6     2    50      89      98
    ##  ...
    
    mean(df_exam$english)
    
    ## [1] 84.9
    
    mean(df_exam$science)
    
    ## [1] 59.45
  • CSV 파일 불러오기
    df_csv_exam <- read.csv("./data/csv_exam.csv")
    df_csv_exam
    
    ##    id class math english science
    ## 1   1     1   50      98      50
    ## 2   2     1   60      97      60
    ## 3   3     1   45      86      78
    ## 4   4     1   30      98      58
    ## 5   5     2   25      80      65
    ## 6   6     2   50      89      98
    ## ...
    
    # 데이터 프레임을 CSV 파일로 저장하기
    df_midterm <- data.frame(english = c(90, 80, 60, 70),
                             math = c(50, 60, 100, 20),
                             class = c(1, 1, 2, 2))
    df_midterm
    
    ##   english math class
    ## 1      90   50     1
    ## 2      80   60     1
    ## 3      60  100     2
    ## 4      70   20     2
    
    write.csv(df_midterm, file = "./data/df_midterm.csv")
  • RDS 파일 활용하기
    df_midterm <- readRDS("./data/df_midterm.rds")
    
    df_midterm
    
    ##   english math class
    ## 1      90   50     1
    ## 2      80   60     1
    ## 3      60  100     2
    ## 4      70   20     2

05 데이터 분석 기초! - 데이터 파악하기, 다루기 쉽게 수정하기

05-1 데이터 파악하기

  • 데이터가 주어졌을 때 가장 먼저 하는 일은 데이터의 전반적인 구조를 파악하는 것
    • 어떤 변수들이 있는지, 몇 행으로 구성되어 있는지 전반적인 구조를 살펴보면서 데이터의 특징에 대한 감을 잡음
  • 데이터를 파악할 때 사용하는 함수들
    • head()
      • 데이터 앞부분 출력
    • tail()
      • 데이터 뒷부분 출력
    • View()
      • 뷰어 창에서 데이터 확인
    • dim()
      • 데이터 차원 출력
    • str()
      • 데이터 속성 출력
    • summary()
      • 요약 통계량 출력

05-2 변수명 바꾸기

df_raw <- data.frame(var1 = c(1, 2, 1),
                     var2 = c(2, 3, 2))
df_raw

##   var1 var2
## 1    1    2
## 2    2    3
## 3    1    2

install.packages("dplyr")  # dplyr 설치
library(dplyr)             # dplyr 로드

df_new <- df_raw  # 복사본 생성
df_new            # 출력

##   var1 var2
## 1    1    2
## 2    2    3
## 3    1    2

df_new <- rename(df_new, v2 = var2)  # var2를 v2로 수정
df_new

##   var1 v2
## 1    1  2
## 2    2  3
## 3    1  2

05-3 파생변수 만들기

  • 파생변수(Derived Variable) : 기존의 변수를 변형해 만든 변수
    df <- data.frame(var1 = c(4, 3, 8),
                     var2 = c(2, 6, 1))
    df
    
    ##   var1 var2
    ## 1    4    2
    ## 2    3    6
    ## 3    8    1
    
    df$var_sum <- df$var1 + df$var2  # var_sum 파생변수 생성
    df
    
    ##   var1 var2 var_sum
    ## 1    4    2       6
    ## 2    3    6       9
    ## 3    8    1       9
    
    df$var_mean <- (df$var1 + df$var2) / 2  # var_mean 파생변수 생성
    df
    
    ##   var1 var2 var_sum var_mean
    ## 1    4    2       6      3.0
    ## 2    3    6       9      4.5
    ## 3    8    1       9      4.5
출처 : Do it! 쉽게 배우는 R 데이터 분석
 

Do it! 쉽게 배우는 R 데이터 분석

통계, 프로그래밍을 1도 몰라도 데이터를 혼자서 다룰 수 있다!데이터 분석 프로젝트 전 과정 수록!데이터 분석을 처음 시작한 초보자도 어깨춤을 추며 데이터를 혼자 다룰 수 있게 한다는 강의

book.naver.com

728x90
728x90