<쉽게 배우는 R 데이터 분석 p.160>

문제 1. popadults 는 해당 지역의 성인 인구, poptotal은 전체 인구를 나타냅니다. midwest 데이터에 '전체 인구 대비 미성년 인구 백분율' 변수를 추가하세요.

total 이라는 새로운 변수 추가

 

문제 2. 미성년 인구 백분율이 가장 높은 상위 5개 country(지역)의 미성년 인구 백분율을 출력하시오.

문제 3. 다음과 같은 분류표의 기준에 따라 미성년 비율 등급 변수를 추가하고, 각 등급에 몇 개의 지역이 있는지 알아보세요.
library(ggplot2)
data <- data %>% mutate(level = ifelse(data$total >= 40, "large",
					ifelse(data$county > 30, "middle", "small")))
table(data$level)
qplot(data$level)

large middle small
   32    396     9

 

문제 4. popasian은 해당 지역의 아시아인 인구를 나타냅니다. '전체 인구 대비 아시아인 인구 백분율' 변수를 추가하고 하위 10개 지역의 state(주), county(지역), 아시아인 인구 백분율을 출력하세요.
data <- midwest %>%
	mutate(tot_asian = (popasian/poptotal)*100) %>%
    arrange(tot_asian) %>%
    select(state, county, tot_asian) %>%
    tail(10)
data

 

(출처; 쉽게 배우는 R 데이터 분석, 김영우)

EDA 중 '데이터 모양 확인하기' 파트

 

<1> 데이터 파악하기

- 데이터가 주어졌을 때 가장 먼저 하는 일은 데이터의 전반적인 구조를 파악하는 것. 어떤 변수들이 있는지, 몇 행으로 구성되어 있는지 전반적인 구조를 살펴본다.

 

데이터를 파악할 때 사용하는 기본 함수들

1.  head( ) - 데이터 앞부분 확인하기

- 데이터의 앞부분을 출력하는 기능. 괄호 안에 데이터 프레임 이름을 입력하고 실행하면 앞에서부터 여섯 번째 행까지 출력된다.   ex. head(exam)

- 여섯 번째 행보다 더 아래 행까지 출력하고 싶으면 데이터 프레임 이름 뒤에 쉼표를 쓰고 숫자를 입력하면 입력한 행까지의 데이터를 출력할 수 있다.     ex. head(exam, 10) #앞에서부터 10행까지 출력

 

2. tail( ) - 데이터 뒷부분 확인하기

- 데이터의 뒷부분을 출력하는 기능. 괄호 안에 데이터 프레임 이름을 입력하고 실행하면 뒤에서부터 여섯 행을 출력된다. ex. tail(exam)

- head함수와 마찬가지로 숫자를 입력하면 원하는 만큼의 행을 출력할 수 있다. ex. tail(exam, 10) #뒤에서부터 10행까지 출력

 

3. View( ) - 뷰어 창에서 데이터 확인하기 (*V는 대문자로 입력)

- 엑셀과 유사하게 생긴 '뷰어 창'에 원자료를 직접 보여 주는 기능. 원자료를 눈으로 직접 확인해 보고 싶을 때 사용한다.

 

4.  dim( ) - 데이터가 몇 행, 몇 열로 구성되어 있는지 알아보기

- 데이터 프레임이 몇 행, 몇 열로 구성되어 있는지 알아볼 때 사용. 출력된 2개 숫자 중에서 앞의 숫자는 '행', 뒤의 숫자는 '열'의 개수를 나타낸다.

- [1] 20  5 이렇게 출력되었다면 >> 이 데이터는 20행, 5열로 구성되어 있다는 것을 의미

 

5. str( ) - 속성 파악하기

- 데이터에 들어 있는 변수들의 속성을 보여준다. 모든 변수의 속성을 한 눈에 파악하고 싶을 때 사용

str(exam)  # 데이터 속성 확인

## 'data.frame' :    20 obs. of 5 variables:  # 데이터의 속성과 몇 개의 관측치와 변수로 구성되어 있는지 표시됨
## $ id      :  int  1 2 3 4 5 6 7 8 9 10 . . .  
## $ class   :  int  1 1 1 1 2 2 2 2 3 3 . . .
## $ math    :  int  50 60 45 30 25 50 80 90 20 50 . . .
## $ english :  int  98 97 86 98 80 89 90 78 98 98 . . .
## $ science :  int  50 60 76 38 60 45 97 85 50 70 . . .

- 위의 출력 결과 예시를 보면 exam 데이터가 데이터 프레임이고, 20개의 관측치와 5개의 변수로 구성되어 있음을 알 수 있다.

 

6. summary( ) - 요약 통계랑 산출하기

- '평균'처럼 변수의 값을 요약한 '요약 통계량'을 산출. ex. 중앙값과 평균 등

- 요약 통계량을 보면 변수의 특성을 파악하는데 도움이 됨

- 수치에 관해 나타내는 것이므로 '연속형 데이터'에만 의미 있음.

summary( )를 실행해 출력되는 요약 통계량들

 

(어떤 데이터를 분석하든, 가장 먼저 이러한 함수들을 활용해 전반적인 특징을 파악하는 작업을 해야함)

 

<2> 변수명 바꾸기

- 데이터의 전반적인 특징을 파악하고 나면 본격적으로 분석하기 전에 변수명을 수정하는 작업을 해야 한다. 변수명이 기억하기 어려운 문자로 되어 있으면 쉬운 단어로 변경하는 게 좋다.

ex.  분석하고자 하는 데이터에서 성별을 s_12 이런식으로 저장해두었다면 분석하기 전 sex로 바꿔놓는 것이 이해하기 쉽고 헷갈리지 않게 작업할 수 있다. 

 

*dplyr 패키지의 rename( )을 이용해 변수명 바꾸기

# 실습에 활용할 데이터 프레임 생성

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
# rename( )을 이용하기 위해 dplyr 패키지 설치 후 로드 (dplyr은 데이터 조작 패키지)

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

 

》 데이터 프레임 복사본 만들기 (중요)

- 변수명을 바꾸기 전에 원본을 보유하기 위해 데이터 프레임 복사본을 만든다. 새로운 변수명 df_new에 df_raw를 할당하는 형태로 코드 작성

df_new <- df_raw  # 복사본 생성

 

》 변수명 바꾸기

- rename(데이터 프레임명, 새 변수명 = 기존 변수명)  // 괄호 안의 것들이 순서가 바뀌면 실행되지 않음.

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

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

 

 

3. 파생변수 만들기

- 데이터에 들어 있는 변수만 이용해 분석할 수도 있지만, 변수를 조합하거나 함수를 적용해 새 변수를 만들어 분석할 수 있음. 기존의 변수를 변형해 만든 변수를 '파생변수(Derived Variable)'라고 한다. 

ex. 학생들의 이름, 영어 점수, 수학 점수로 이루어진 데이터에 각 학생별 영어 점수와 수학 점수의 '평균' 변수를 새로 만들 수 있음

 

** 변수를 조합해 파생변수 만들기

# 실습에 활용할 2개의 변수로 구성된 데이터 프레임 생성

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

 

 

 

 

(출처; 쉽게 배우는 R 데이터 분석, 김영우)

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

*데이터 프레임(Data Frame)

- 가장 많이 사용하는 데이터 형태로, 행과 열로 구성된 사각형 모양의 표처럼 생김

(3개의 행과 4개의 열로 구성된 데이터 프레임)

행을 보면 세 명의 자료임을 알 수 있고, 열은 성별, 연령, 학점, 연봉의 4가지 속성으로 되어 있음

>> 이 표는 '4개의 속성에 대한 3명의 자료로 구성된 데이터 프레임'이라고 할 수 있다.

 

'열'은 속성이다.

세로로 나열되는 열은 '속성'을 나타냄. 열은 '컬럼(Column)' 또는 '변수(Variable)'라고 불림

>> 만약, 어떤 데이터가 100가지 속성에 대한 정보를 가지고 있다면, 그 데이터는 100개의 컬럼 또는 100개의 변수를 가지고 있다고 표현할 수 있다.

 

'행'은 한 사람의 정보다.

가로로 나열되는 행은 각 사람에 대한 정보를 보여줌. 행은 '로(Row)' 또는 '케이스(Case)'라고 불림

행이 반드시 사람이어야 하는 건 아니지만, 무엇이든 하나의 단위가 하나의 행으로 구성될 수 있다. 예를 들어, 하나의 도시, 하나의 거래 내역, 하나의 웹 사이트 접속 기록도 행이 될 수 있다. 

>> 만약, 어떤 데이터가 30명의 정보로 구성되어 있다면, 그 데이터는 30개의 Row 또는 30개의 Case를 가지고 있다고 표현할 수 있다.

 

데이터가 크다 = 행이 많다 또는 열이 많다

데이터를 분석하는 입장에서 봤을 때 행이 많은 것과 열이 많은 것 중 무엇이 더 중요할까?

>> 열이 많은 것이 더 중요하다. (행이 많은 것은 Computer Power로 해결)

>> 데이터의 양을 의미하는 행보다 데이터의 '다양성'을 의미하는 열이 많은 것이 분석의 측면에서 더 중요

 

행이 늘어나더라도 분석 기술의 측면에서는 별다른 차이가 생기지 않는다. 메모리를 늘려보고, 그래도 힘들다면 분산 처리 시스템을 구축하면 된다.

반면, 열이 많아지면 변수를 조합할 수 있는 경우의 수가 늘어난다. 예를 들어, 학점과 연봉의 관계는 전공이 무엇인지에 따라 다른 양상으로 나타날 수 있다. 여기에 출신지, 자격증, 성별, 직업군 등 수십 가지 변수가 추가되면 경우의 수가 기하급수적으로 늘어난다. 여러 변수의 영향을 동시에 고려할 수 있는 복잡한 분석 방법을 활용해야 할 필요성이 생기게 된다.

행이 많다 > 컴퓨터가 느려짐 > 고사양 장비 구축
열이 많다 > 분석 방법의 한계 > 고급 분석 방법 필요

 

2. 데이터 프레임 만들기 - 시험 성적 데이터 만들기

데이터 프레임은 데이터를 직접 입력해 만들 수도 있고, 외부의 데이터를 가져와 만들 수도 있다.

*데이터 직접 입력해서 데이터 프레임 만들기 (4명의 학생이 영어 시험과 수학 시험을 봤다고 가정)

1. 변수 만들기

- 학생 4명의 영어 점수와 수학 점수를 담은 변수를 각각 만듦

english <- c(100, 45, 80, 70)  # 영어 점수 변수 생성
math <- c(50, 60, 90, 100)  # 수학 점수 변수 생성

 

2. 데이터 프레임 만들기

- 데이터 프레임을 만들 때는 data.frame( )을 이용 (데이터 프레임을 구성할 변수를 괄호 안에 쉼표로 나열)

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

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

cf. 데이터 프레임의 이름을 정할 때 앞에 'Data Frame'의 약자인 'df'를 붙여 두면 다른 변수들과 구별하기 쉬움.

 

3. 생성된 데이터에 새로운 열 추가하기 (학생들의 반에 대한 정보를 추가해보기)

class <- c(1, 1, 2, 2)
df_midterm <- data.frame(class, english, math)
df_midterm

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

 

4. 분석하기

- 데이터 프레임이 완성되면 분석해보기. mean( )을 이용해 전체 학생의 영어 점수와 수학 점수 평균을 구해볼 것

mean(df_midterm$english)  #df_midterm의 english로 평균 산출
## [1] 73.75

mean(df_midterm$math)  #df_midterm의 mathfh 평균 산출
## [1] 75

mean ( ) 안에 입력된 df_midterm$english는 'df_midterm 데이터 프레임 안에 있는 english 변수'를 의미한다.

cf. 달러 기호($)는 데이터 프레임 안에 있는 변수를 지정할 때 사용한다.

 

5. 데이터 프레임 한 번에 만들기

- 위에서는 여러 변수를 각각 만든 후에 합치는 형태로 데이터 프레임을 만들었다. 이 방법 외에 data.frame( ) 안에 변수와 값을 나열해서 한 번에 만드는 방법도 있다.

df_midterm <- data.frame(class = c(1, 1, 2, 2),
						 english = c(100, 45, 80, 70),
                         math = c(50, 60, 90, 100))
df_midterm

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

cf. 코드가 길어질 경우에는 쉼표 뒤에서 엔터키를 눌러 다음 줄로 넘기는 것이 좋음. 전체적인 구조가 한 눈에 잘 들어오기 때문에 코드를 이해하기 쉽고 오류를 쉽게 찾을 수 있음.

 

3. 외부 데이터 이용하기 - 축적된 시험 성적 데이터 불러오기

직접 데이터를 입력하기보다 외부에서 생성된 데이터를 불러와 분석하는 경우가 더 많다.

* 데이터를 관리할 때 가장 많이 사용되는 엑셀 파일과 CSV 파일을 불러와 데이터 프레임을 만드는 방법 보기

 

1. 깃허브(bit.ly/doit_ra)에서 실습에 사용할 excel_exam.xlsx 파일 다운로드하기 (cf. 깃허브에서 실습 파일을 다운로드하는 방법은 블로그 내 ' ' 포스팅 참고)

2. 프로젝트 폴더에 엑셀 파일 삽입하기

- 데이터 파일을 불러오려면 현재 작업중인 프로젝트 폴더에 불러올 파일을 삽입해야한다. excel_exam.xlsx 파일을 프로젝트 폴더에 넣기

3. readx1 패키지 설치하고 로드하기

- 엑셀 파일을 불러오려면 엑셀 파일을 불러오는 기능을 제공하는 패키지를 이용해야 한다. readxl 패키지를 설치하고 로드한다. ( cf. readxl의 맨 뒷 글자는 소문자 엘 ) 

install.packages("readxl") 
library(readxl)

 

4. 엑셀 파일 불러오기

- readxl 패키지에서 제공하는 read_excel( )을 이용해 엑셀 파일을 불러온다. read_excel( )은 엑셀 파일을 데이터 프레임으로 만드는 기능을 한다. 괄호 안에 양쪽에 큰따옴표와 함께 불러올 엑셀 파일명을 넣으면 되고, 확장자(.xlsx)까지 기입해야한다.

cf. R에서는 파일명을 지정할 때 항상 앞 뒤에 따옴표를 넣는다. 만약, 프로젝트 폴더가 아닌 다른 폴더에 있는 엑셀 파일을 불러오려면 파일 경로를 지정하면 된다. 경로를 지정할 때는 슬래시(/)를 사용한다.

df_exam <- read_excel("d:/easy_r/excel_exam.xlsx")

 

5. 분석하기

- mean( )을 이용해 전체 평균을 구할 수 있다.

 

엑셀 파일 첫 번째 행이 변수명이 아니라면?

변수명 없이 첫 번째 행부터 바로 데이터가 시작되는 엑셀 파일

read_excel( )은 기본적으로 엑셀 파일의 첫 번째 행을 '변수명'으로 인식해 불러온다. 변수명 없이 첫 번째 행부터 바로 데이터가 시작되는 경우, 첫 번째 행의 데이터가 변수명으로 지정되면서 유실되는 문제가 발생한다.

df_exam_novar <- read_excel("excel_exam_novar.xlsx")
df_exam_novar

##      1 1__1   50   98 50__1
## 1    2    1   60   97    60
## 2    3    2   25   80    65
## 3    4    2   50   89    98
## 4    5    3   20   98    15
## 5    6    3   50   98    45
## 6    7    4   46   98    65
## 7    8    4   48   87    12

출력 결과를 보면, 엑셀 파일 첫 번째 행을 변수명으로 인식해 원본과 달리 7행까지만 존재하는 문제가 발생한 것 보임.

>> col_names = F 파라미터를 설정하면 첫 번째 행을 변수명이 아닌 데이터로 인식해 불러오고, 변수명은 'X__숫자'로 자동 지정된다. (F는 대문자로 입력해야함)

df_exam_novar <- read_excel("excel_exam_novar.xlsx", col_names = F)
df_exam_novar

##   X__1 X__2 X__3 X__4 X__5
## 1    1    1   50   98   50
## 2    2    1   60   97   60
## 3    3    2   25   80   65
## 4    4    2   50   89   98
## 5    5    3   20   98   15
## 6    6    3   50   98   45
## 7    7    4   46   98   65
## 8    8    4   48   87   12

cf. R에는 참(TRUE)과 거짓(FALSE) 중 하나로 구성되는 논리형 벡터(Logical Vectors)라는 변수 타입이 있다. 논리형 벡터는 어떤 값이 참인지 거짓인지를 나타내는데, 여기서는 col_names = F의 F가 '거짓'을 의미한다. '열 이름(Column Name)을 가져올 것인가?'라는 질문에 '그렇지 않다'라는 답을 한 셈이다. <<논리형 벡터는 반드시 대문자 TRUE 또는 FALSE로 입력해야 하고, 앞글자만 따서 T 또는 F를 입력해도 된다.>>

 

엑셀 파일에 시트가 여러 개 있다면?

여러 개의 시트로 구성된 엑셀 파일을 불러올 경우 sheet 파라미터를 이용해 몇 번째 시트의 데이터를 불러올지 지정할 수 있다. 

# 엑셀 파일의 세 번째 시트에 있는 데이터 불러오기
df_exam_sheet <- read_excel("excel_exam_sheet.xlsx", sheet = 3)

 

 

 

(출처; 쉽게 배우는 R 데이터 분석, 김영우)

+ Recent posts