tidyverse

강림·2023년 12월 10일
0

Data Analysis

목록 보기
4/13
post-thumbnail

1. tidyverse

1. tidyverse 라이브러리 구동

# tidyverse 설치
install.packages(“tidyverse”)
# tidyverse 라이브러리 구동
library(tidyverse
)
# 하위 라이브러리
help(package='ggplot2’)
help(package='tibble’)
help(package='tidyr’)
help(package='readr’)
help(package='purrr’)
help(package='dplyr’)
help(package='stringr’)
help(package='forcats')

2. 현재 사용중인 파일 위치

# 현재 사용중인 파일 위치
?
getwd() # 파일 위치를 바꾸고자 한다면
?
setwd(“_____”) # 원하는 위치 입력
getwd() # 수정된 것을 확인

3. 외부에 저장된 데이터 불러오기

# 엑셀데이터 불러오기: 2007 버전 이후(*.xlsx)
library('tidyverse’)
library('readxl’)
world_country = read_xlsx("data_country.xlsx")
world_country
# 데이터가 어디서 시작하는가에 따라 skip 옵션을 조정해야 한다. 
seoul_educ = read_xls("data_student_class.xls")
seoul_educ
seoul_educ = read_xls("data_student_class.xls",skip=2)
seoul_educ
# 쉼표로 분리된 텍스트 형식의 데이터(*.csv)
seoul_loc = read_csv("data_district_lonlat.csv")
seoul_loc
# 탭으로 분리된 텍스트 형식의 데이터(*.txt)
seoul_loc = read_delim("data_district_lonlat.txt",delim='\t’)
seoul_loc
# read_delim : 데이터가 쉼표로 구분되지 않고 다른 기호로 분리된 경우에
이용되는 함수. delim 옵션에 어떤 기호로 구분되었는지 지정.
delim=‘\t’ # tab
delim=‘\n\ # 줄바꿈
delim=‘;’ # ;
delim=‘:’ # :
delim=‘ ‘ # 공백
# csv 데이터를 read_delim() 함수로 불러오기
seoul_loc = read_delim("data_district_lonlat.csv",delim=',’)
seoul_loc
# SPSS 형태의 데이터를 불러오기
library('haven’)
tess131 = read_spss("data_TESS3_131.sav")
tess131 
# STATA 형태의 데이터를 불러오기
gss_panel = read_dta("data_gss_panel06.dta")
gss_panel

4. %>% : 파이프 오퍼레이터 (pipe operators)

  • Tidyverse에서 가장 많이 사용되는 오퍼레이터
  • “A, then B” 라고 읽음 : “”~하고, 이후에 ~한다” 의 의미를 가짐
  • %>%의 기본 문법

단계 1 : data_library.xls 데이터를 불러온다.
단계 2 : ‘기간’이라는 이름의 변수의 빈도표를 구한다.

# 파이프 오퍼레이터 이해
library('readxl’)
read_xls("data_library.xls") %>% 
 count(기간)
# 전통적 방식
seoul_library = read_xls("data_library.xls") #단계1
count(seoul_library, 기간) #단계2

2. 데이터 선별

1. 변수 선별

  • 빅데이터 : 모든 데이터를 다 분석하지 않음
  • 연구자의 필요와 연구목적에 따라 데이터의 원하는 부분에 초점을 맞춤
  • 데이터가 불필요하게 커서 자료처리에 부담을 줄 수 있음
  • 변수가 너무 많으면 데이터를 이해하고 설명하는 것이 쉽지 않음
  • 변수 선별 : 원하는 변수만 남기거나 (keeping) 혹은 원하지 않는 변수를 버리는
    (dropping) 기법
  • 데이터의 ‘열‘, 변수를 다루는 방법
  • select()
# 서울시 25개 구별 도서관 현황 데이터(data.seoul.go.kr)
seoul_library = read_xls("data_library.xls")
seoul_library
# 기간, 자치구, 계 변수들만 선별
seoul_library2 = seoul_library %>% 
 select(기간, 자치구, 계)
seoul_library2
# 국립도서관 공공도서관 대학도서관 전문도서관 변수들만 버리는 경우
seoul_library2 = seoul_library %>%
 select(-국립도서관, -공공도서관, -대학도서관, -전문도서관) 
seoul_library2 %>%
 print(n=2)
# ends_with(“your expression”) : “ “이라는 문자형 데이터로 끝나는 변수를
일괄적으로 삭제
# starts_with(“your expression”) : “ “ 이라는 특정한 표현으로 시작하는 변
수들을 선택
# contains(“your expression”) : 데이터의 변수들에 만약 원하는 표현이 앞이
든 뒤든 아니면 중앙이든 일단 등장하는 경우
# 특정 표현이 규칙적으로 등장하는 경우
seoul_library2 = seoul_library %>%
 select(-ends_with("도서관")) 
seoul_library2 %>%
 print(n=2)
 
 # 데이터에서 기간, 자치구, 그리고 “도서”라는 표현이 등장한 어떠한 이름
의 변수를 선별
seoul_library2 = seoul_library %>%
 select(기간, 자치구, contains("도서")) 
seoul_library2 %>%
 print(n=2)
# 데이터에서 기간 변수부터 공공도서관 변수까지의 범위에 속하는 변수들
을 선별
seoul_library2 = seoul_library %>%
 select(기간:공공도서관) 
seoul_library2 %>%
 print(n=2)
# 2번째 부터 5번째 까지의 변수들을 선별
seoul_library2 = seoul_library %>%
 select(2:5) 
seoul_library2 %>%
 print(n=2)
# 범위에 해당되는 변수들을 제외할 때는 괄호()를 이용한 후 – 부호를 붙임
# 범위지정시 주의사항: 아래는 오류 발생
seoul_library2 = seoul_library %>%
 select(-2:5) 
# 2번째 부터 5번째 까지의 제외한 변수들을 선별
seoul_library2 = seoul_library %>%
 select(-(2:5))
seoul_library2 %>%
 print(n=2)

2. 사례 선별

  • 데이터의 ‘행‘, 사례(case)를 다루는 방법
  • 예. 응답자의 연령을 20대로 한정
  • filter()
# data_TESS3_131.sav 불러온 후 PP로 시작하는 변수들만 추려냄
library('haven’)
data_131 = read_spss("data_TESS3_131.sav")
data_131 = data_131 %>%
 select(starts_with("PP")) %>%
 print(n=2)
# 응답자의 성별 변수의 빈도표 (1:남성, 2:여성)
# PPGENDER 빈도표는?
data_131 %>%
 count(PPGENDER)
# PPGENDER 변수에서 1과 2에 붙은 라벨의 의미는? 
print_labels(data_131$PPGENDER
# 여성 응답자만 추려내면?
data_131 %>%
 filter(PPGENDER==2) %>%
 count(PPGENDER)
# 여성 응답자만 배제해 보자. 
data_131 %>%
 filter(PPGENDER!=2) %>%
 count(as_factor(PPGENDER)) # 1이 아니라 Male 이라는 라벨이 나타남
# <dbl+lbl> : 수치형 데이터에 라벨이 붙어 있는 형태의 데이터
# 이 경우에는 as_factor() 함수를 이용하여 숫자에 해당되는 라벨로 변수의
형태를 바꿈
# PPREG4 : 응답자가 거주하는 주(state)
# 1: Northeast, 2: Midwest, 3: South, 4: West
# South 혹은 West 거주 응답자는?
data_131 %>%
 filter(PPREG4==3|PPREG4==4) %>%
 count(as_factor(PPREG4))
# South 혹은 West 거주 응답자: 부등호 사용
data_131 %>%
 filter(PPREG4 >= 3) %>% # filter(PPREG4 > 2) 라고 해도 결과 동일
 count(as_factor(PPREG4))
# 남부가 아닌 다른 지역에 거주하는 남성 응답자를 선별
# 조건 1 : 남부 거주자가 아닌 경우
# 조건 2 : 응답자가 남성인 경우
data_131 %>%
 filter(PPREG4 != 3 & PPGENDER==1) %>%
 # filter(PPREG4 != 3, PPGENDER==1) 동일하지만 권장하지 않음
 count(as_factor(PPGENDER),as_factor(PPREG4))

3. 결측값 제거

# is.na()
# !is.na()
# 결측값 제거
myGSS = read_dta("data_gss_panel06.dta") %>% 
 select(starts_with("astrolgy_"))
# astrolgy_3 변수의 빈도표는? 
myGSS %>%
 count(as_factor(astrolgy_3))
# astrology_3 변수에 대해 1(yes) 혹은 2(no)라고 응답한 사람들만 선별
# astrolgy_3 변수에서 결측값이 아닌 응답자만 선별
myGSS %>%
 filter(!is.na(astrolgy_3)) %>%
 print(n=2)
# astrology_1, _2, _3 세 변수 모두에 대해 응답을 한 사람들만 선별
# 리스트 단위의 제거 (listwise deletion) : 데이터 전체에서 단 하나의 변수
에서라도 결측값이 존재하는 사례를 제거
# listwise deletion 적용
myGSS %>%
 filter(!is.na(astrolgy_1) &
 !is.na(astrolgy_2) &
 !is.na(astrolgy_3)) %>%
 print(n=2)
# drop_na() : 결측값 제거
# A라는 변수가 특정한 실측값을 가짐 & B라는 변수는 결측값이 아닐 조건
을 만족하는 사례들만 선별
# drop_na() 함수:astrolgy_3 변수에서 결측값이 아닌 응답자만 선별
myGSS %>%
 drop_na(astrolgy_3) %>%
 print(n=2)
# drop_na() 함수: listwise deletion 적용
myGSS %>%
 drop_na() %>%
 print(n=2)

4. 변수 수준별 집단 구분

  • 사례 1: 데이터에서 응답자의 성별에 따라 소득수준의 평균과 표준편차가 어떻게 나타나는지 살펴보자.

단계 1 : 데이터를 남성 응답자 집단과 여성 응답자 집단으로 나눈다.
단계 2 : 각 집단의 소득수준의 평균과 표준편차를 구한다.

  • 사례 2: 데이터에서 응답자의 거주지역에 따라 응답자의 연령과 보수정당 지지성향의 상관관계가 어떻게 다르게 나타나는지 살펴보자.

단계 1 : 응답자를 거주지역에 따라 구분한다.
단계 2 : 연령 변수와 보수정당 지지성향의 상관계수를 구한다.

  • filter()를 사용하면 여러번 이용해야 한다 → 복잡
  • group_by()

4-1. 사례 1

# 성별에 따라 응답자를 집단 구분
data_131 = read_spss("data_TESS3_131.sav") %>%
 select(starts_with("PP")) #PP로 시작하는 이름의 변수만
by_data_131 = data_131 %>%
 group_by(PPGENDER) 
# PPGENDER 수준에 따라 2개 집단으로 구분된 것을 확인
by_data_131 %>%
 print(n=2)
# 각 집단의 평균소득의 평균과 표준편차
by_data_131 %>%
 summarize(mean(PPINCIMP),sd(PPINCIMP),n()) 
# summarize() 함수 안에 연산작업을 하는 함수를 지정
# mean() 평균, sd() 표준편차, n() 사례수 계산
# 소수점 2자리에서 반올림된 결과
by_data_131 %>%
 summarize(mean(PPINCIMP),sd(PPINCIMP),n()) %>%
 round(., 2)
# 두 개 이상의 변수를 이용해 집단 구분
# 성별 X 거주지역 집단 구분
by_data_131 = data_131 %>%
 group_by(PPGENDER, PPREG4) #PPGENDER[2] X PPREG4[4] = 8 Gr
by_data_131 %>%
 print(n=2)
# 집단구분 삭제
by_data_131 %>%
 ungroup() %>%
 print(n=2

4-2. 사례 2

# 두 개 이상의 변수를 이용해 데이터 나누기
# 성별에 따라 데이터를 2개로 나누기
by_data_131 = data_131 %>%
 split(.$PPGENDER)by_data_131 
# summary() 함수
summary(by_data_131)
# 성별에 따라 연령과 소득의 상관관계 계산
# 집단별 상관계수
library('magrittr’)
data_131 %>%
 split(.$PPGENDER) %>%
 map(~ cor.test(~PPAGE+PPINCIMP, data=.x)) #상관계수 추정결과 저장
# 만약 상관계수만 확인하고자 한다면?
data_131 %>%
 split(.$PPGENDER) %>%
 map(~ cor.test(~PPAGE+PPINCIMP, data=.x)) %>%
 map("estimate") %>% # 상관계수만 추출하여 저장함
as_tibble() %>% #결과를 티블 데이터로 저장
round(3) # 소수점 3자리에서 반올림된 값

4-3. 두 변수를 교차시킨 경우 집단 구분

# PPGENDER, PPREG4 변수를 교차시킨 후 집단구분
data_131 %>%
 group_by(gender_reg4=10*PPGENDER+PPREG4) %>% 
 split(.$gender_reg4) %>%
 map(~ cor.test(~ PPAGE+PPINCIMP,data=.x)) %>%
 map("estimate") %>%
 as_tibble() %>%
 round(3)

3. 데이터 정렬

1. 데이터 정렬 : 한 개 변수

# 데이터의 현재 정렬 상태 확인
seoul_library = read_xls("data_library.xls")
seoul_library %>%
 print(n=3)
# 자치구의 가나다 순서로 재정렬 하는 경우
seoul_library %>%
 arrange(자치구)
# 자치구의 가나다 역순서로 재정렬
seoul_library %>%
 arrange(desc(자치구))

2. 데이터 정렬 : 두 개 이상 변수

# 두 개 혹은 그 이상의 변수들을 차례로 나열할 경우
# 첫 번째 변수를 기준으로 정렬한 후, 첫번째 변수값이 동등한 경우 두 번째 변
수로 정렬
# 두 개이상의 변수들에 따라 정렬
seoul_library %>%
 filter(기간==2016) %>%
 arrange(desc(공공도서관), 자치구)

3. 데이터 정렬 : 집단구분 된 데이터

# 집단구분 된 데이터를 정렬하는 경우 + 구분된 집단별로 데이터를 정렬
두 개 혹은 그 이상의 변수들을 차례로 나열할 경우
# 집단구분 된 데이터를 정렬할 경우 .by_group 옵션 추가
seoul_library %>%
 group_by(기간) %>%
 arrange(자치구,.by_group=TRUE)
profile
DRUDGER

0개의 댓글