16
R 활용 데이터 전처리 I. 개요 통계 소프트웨어 내장 절차(SAS 는 PROC (REG) 단계) 혹은 함수(R은 lm() 함수)에 의해 필요한 데 이터 분석(예제는 선형모형 분석)이 가능하도록 수집 데이터를 필요한 형태로 만드는 작업을 전처 리 pre-process 라 한다. 데이터는 행(개체)과 열(변수)로 구성되어 있으며 전처리는 변수의 처리, 필요한 개체의 집합 만들 기로 나누어져 있다. 본 강의에서 사용할 예제 데이터는 다음과 같다. 1986 메이저 리그 타자 연봉 및 경기 능력 측정 : [ 내용보기] 미세먼지 : 에어코리아 제공 (csv 포맷) 2017 1분기 데이터 (시간별 데이터, 대전) baseball<-read.csv('http://wolfpack.hnu.ac.kr/Stat_Notes/example_data/ baseball.csv') names(baseball) mise<-read.csv('http://wolfpack.hnu.ac.kr/Stat_Notes/example_data/ mise_dj.csv',header=T) names(mise) 한남대학교 통계학과 권세혁교수 ( ) 1

I. 개요wolfpack.hnu.ac.kr/Stat_Notes/softwares/about_R/R... · 2018-05-13 · r 활용 데이터 전처리 i. 개요 통계 소프트웨어 내장 절차(sas 는 proc (reg) 단계)

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: I. 개요wolfpack.hnu.ac.kr/Stat_Notes/softwares/about_R/R... · 2018-05-13 · r 활용 데이터 전처리 i. 개요 통계 소프트웨어 내장 절차(sas 는 proc (reg) 단계)

R 활용 데이터 전처리

I. 개요

통계 소프트웨어 내장 절차(SAS 는 PROC (REG) 단계) 혹은 함수(R은 lm() 함수)에 의해 필요한 데이터 분석(예제는 선형모형 분석)이 가능하도록 수집 데이터를 필요한 형태로 만드는 작업을 전처

리 pre-process 라 한다.

데이터는 행(개체)과 열(변수)로 구성되어 있으며 전처리는 변수의 처리, 필요한 개체의 집합 만들기로 나누어져 있다. 본 강의에서 사용할 예제 데이터는 다음과 같다.

1986 메이저 리그 타자 연봉 및 경기 능력 측정 : [내용보기]

미세먼지 : 에어코리아 제공 (csv 포맷) 2017 1분기 데이터 (시간별 데이터, 대전)

!

baseball<-read.csv('http://wolfpack.hnu.ac.kr/Stat_Notes/example_data/baseball.csv') names(baseball)

mise<-read.csv('http://wolfpack.hnu.ac.kr/Stat_Notes/example_data/mise_dj.csv',header=T) names(mise)

한남대학교 통계학과 권세혁교수 ( )1

Page 2: I. 개요wolfpack.hnu.ac.kr/Stat_Notes/softwares/about_R/R... · 2018-05-13 · r 활용 데이터 전처리 i. 개요 통계 소프트웨어 내장 절차(sas 는 proc (reg) 단계)

R 활용 데이터 전처리

II. 변수(열) 적용

1) 문자형 변수 처리

(1) 문자 나누기

• head(데이터, k) 함수 : 데이터 행을 첫 k 행만 출력, <-> tail() 함수

a) 열 자리가 일정한 경우 : substr(문자변수, 시작 위치, 끝 위치)

• 선택하려는 열의 위치값 (한글자가 하나 위치, SAS는 한글은 2개 열) 지정만 하면 됨

• baseball : 선수 성(last name) 설정, mise : 구이름 선택

• 선수 이름 중 이름의 길이가 상이하여 성(last name) 의 위치가 달라 ) 원하는 작업을 할 수 없

으나 주소의 경우는 위치가 동일하여 가능함

[참고] sub_str(문자변수, -끝 시작 위치, -끝 종료 위치) : - 부호 가능

head(baseball$Player_Name,3) head(mise$주소,3)

head(substr(baseball$Player_Name,4,10),3) head(substr(mise$주소,4,7),3)

한남대학교 통계학과 권세혁교수 ( )2

Page 3: I. 개요wolfpack.hnu.ac.kr/Stat_Notes/softwares/about_R/R... · 2018-05-13 · r 활용 데이터 전처리 i. 개요 통계 소프트웨어 내장 절차(sas 는 proc (reg) 단계)

R 활용 데이터 전처리

새로운 변수 만들기 : mise 데이터 마지막 열에 GU 변수가 만들어지고 ‘구이름’ 저장

b)콤마로 분리된 있는 경우 : str_split_fixed(문자변수, 분리 연산자, 나누는 개수)

선수 이름이 콤마로 성과 이름이 분리되어 있으므로 2개 단어로 분리하고 두 번째 단어 [ ,2]를 baseball 데이터 마지막 열에 last.name 변수가 만들어지고 저장된다.

c) 빈칸 (space)로 분리된 경우 : str_split_fixed(문자변수, ‘//s’, 나누는 개수)

mise 데이터의 주소 문자를 빈칸(\\s)을 분리 연산자로 하여 4개 단어로 분리하였다. 3개 단어 까지는 공백을 나누고 나머지는 모두 4번째 단어로 나뉜다.

mise$GU<-substr(mise$주소,4,7) head(mise,3)

library(stringr) baseball$last.name<-str_split_fixed(baseball$Player_Name,',',n=2)[,2]names(baseball)head(baseball$last.name,5)

library(stringr) head(str_split_fixed(mise$주소,'\\s',n=4),3)

한남대학교 통계학과 권세혁교수 ( )3

Page 4: I. 개요wolfpack.hnu.ac.kr/Stat_Notes/softwares/about_R/R... · 2018-05-13 · r 활용 데이터 전처리 i. 개요 통계 소프트웨어 내장 절차(sas 는 proc (reg) 단계)

R 활용 데이터 전처리

2) 숫자형 변수 활용 새로운 변수 만들기 : [상세내용 강의보기]

(1) 수학 연산자 이용하기

안타를 타석 수로 나누어 평균 타율을 계산하여 baseball에 avg 변수 (baseball 데이터에 동일 이름의 변수가 없으므로 마지막 열에 저장, 동일 이름 변수가 있으면 대체된다)

(2)논리 연산자 이용하기

미세먼지 80 이상, ‘나쁨’으로 120 이상 ‘매우 나쁨’으로 판별하여 새로운 변수 만들자.

동일한 결과를 얻

는다.

baseball$avg<-baseball$Hits/baseball$TimesatBat head(baseball,3)

mise$grade[mise$PM10<=100]<-'좋음' mise$grade[mise$PM10>100 & mise$PM10<=150]<-'나쁨' mise$grade[mise$PM10>150]<-'매우나쁨'

mise$grade2<-ifelse(mise$PM10>100, ifelse(mise$PM10>150,’매우나쁨','나쁨'),'좋음')

한남대학교 통계학과 권세혁교수 ( )4

Page 5: I. 개요wolfpack.hnu.ac.kr/Stat_Notes/softwares/about_R/R... · 2018-05-13 · r 활용 데이터 전처리 i. 개요 통계 소프트웨어 내장 절차(sas 는 proc (reg) 단계)

R 활용 데이터 전처리

(3)함수 이용하기

변수 계산에 활용할 함수 찾기 - 2개 이상의 변수들의 평균(mean)으로 혹은 합(sum)으로 새로운

변수를 만들고 싶다면, 어떤 함수가 있을까? apropos() 함수 이용 찾자.

• mean()은 개별 열(변수)의 평균을 구하는 것이므로 변수들의 평균을 구하려면 rowMeans() 함수를 사용해야 한다. 동일하게 변수 합을 구하려면 rowSums 이용하면 된다.

[MISE 데이터] 4개 오염 물질 측정값의 평균을 구하고 새로운 변수 ‘Sum’에 저장하자.

3) 날짜 형식

mise$Sum<-rowMeans(mise[,c(5:8)]) head(mise,3)

head(mise$측정일시,3);tail(mise$측정일시,3) mise$date<-as.Date(as.character(substr(mise$측정일시,1,10)),'%Y%m%d') mise$time<-substr(mise$측정일시,9,10) head(mise$date,3);tail(mise$date,3) head(mise$time,3)

한남대학교 통계학과 권세혁교수 ( )5

Page 6: I. 개요wolfpack.hnu.ac.kr/Stat_Notes/softwares/about_R/R... · 2018-05-13 · r 활용 데이터 전처리 i. 개요 통계 소프트웨어 내장 절차(sas 는 proc (reg) 단계)

R 활용 데이터 전처리

http://statmethod.net 참고

install.packages('DescTools') library(DescTools) head(Year(mise$date), 3) #연도 보기 head(Quarter(mise$date), 3) #분기 보기 head(Month(mise$date), 3) #월 보기 tail(Week(mise$date), 3) #주 보기 head(Weekday(mise$date), 3) #요일 보기 1=월요일, 7-일요일 head(Day(mise$date), 3) #일 보기 head(YearMonth(mise$date), 3) #연월 보기

한남대학교 통계학과 권세혁교수 ( )6

Page 7: I. 개요wolfpack.hnu.ac.kr/Stat_Notes/softwares/about_R/R... · 2018-05-13 · r 활용 데이터 전처리 i. 개요 통계 소프트웨어 내장 절차(sas 는 proc (reg) 단계)

R 활용 데이터 전처리

일련의 날짜 데이터 만들기

III. 개체 (행) 중심 전처리

1) 행 위치 중심

행 위치를 정확하게 아는 경우 사용 가능함 : 데이터_오브젝트[행 위치, 열 위치]

seq(as.Date('2018-5-1'),by='days',length=10) seq(as.Date('2018-5-1'),by='2 days',length=10) seq(as.Date('2018-1-1'),to=as.Date('2018-5-10'),by='2 weeks')

names(baseball) baseball[c(1:5),c(1,2,22)] # 행은 1:5 행, 열은 1, 2, 22번째 변수만 선택 head(baseball[c(-1:-5),],3) # 행은 1:5 행 삭제, 열 변수는 모두 선택

한남대학교 통계학과 권세혁교수 ( )7

Page 8: I. 개요wolfpack.hnu.ac.kr/Stat_Notes/softwares/about_R/R... · 2018-05-13 · r 활용 데이터 전처리 i. 개요 통계 소프트웨어 내장 절차(sas 는 proc (reg) 단계)

R 활용 데이터 전처리

2) 조건 : subset() 함수 사용하기

baseball 데이터 : 선수 포지션(Position)이 내야(1B, 2B, 3B, SS)이고 홈런 10 개 이상 친 선수만으로 데이터 구성하여 ‘baseball.sub’ 에 저장하자.

3) 범주형 변수별 측정형 변수의 요약 통계량 데이터

baseball 데이터 : 리그(League), 포지션(Position)별 안타수(Hits) 평균으로 새로운 데이터 baseball.mean 을 만들자

aggregate(측정형 타겟~범주형 변수, 데이터명, FUN=통계량, na.rm=T) 이용

통계량에는 min, max, mean, median, sd, 등이 가능

dim(baseball) baseball.sub<-subset(baseball,(Position=='1B'|Position=='2B'|Position=='3B'|Position=='SS') & HomeRuns>=10) dim(baseball.sub);head(baseball.sub,5)

baseball.Hits.mean<-aggregate(Hits~League+Position,baseball,FUN=mean,na.rm=T)

한남대학교 통계학과 권세혁교수 ( )8

Page 9: I. 개요wolfpack.hnu.ac.kr/Stat_Notes/softwares/about_R/R... · 2018-05-13 · r 활용 데이터 전처리 i. 개요 통계 소프트웨어 내장 절차(sas 는 proc (reg) 단계)

R 활용 데이터 전처리

타겟 측정형 변수가 2개 이상인 경우 다음 스크립트를 이용하는 것이 적절하다.

위의 형식에는 data 적는 곳이 없어 반드시 변수명 앞에는 데이터 이름 baseball$ 을 변수 명 앞에

적어야 한다. baseball[ , c(3:5)] 의 의미는 baseball 데이터의 3번

쩨~5번째 측정형 변수를 지정하였다. trim=0.1

은 데이터 양쪽 끝 값을 10% 절삭한 후 통계량을 구한다.

summaryBy(타겟측정형변수~범주형변수, data= , FUN=c(통계량), na.rm=T)

리그, 포지션별 선수의 안타수, 홈런 평균과 최대값을 구하면 다음과 같다.

baseball.Hits.mean2<-aggregate(baseball[,c(3:5)], by=list(baseball$League,baseball$Position), FUN=mean,trim=0.1,na.rm=T) head(baseball.Hits.mean2,5)

library(doBy) result<-summaryBy(Hits+HomeRuns~League+Position, data=baseball,FUN=c(mean,max),na.rm=TRUE) head(result,5)

한남대학교 통계학과 권세혁교수 ( )9

Page 10: I. 개요wolfpack.hnu.ac.kr/Stat_Notes/softwares/about_R/R... · 2018-05-13 · r 활용 데이터 전처리 i. 개요 통계 소프트웨어 내장 절차(sas 는 proc (reg) 단계)

R 활용 데이터 전처리

[예제] 데이터 전처리 필요한 경우

10개 관측소, 매일 24시간별로 측정되어 있는 미세먼지 데이터를 대전 - 일별로 만들어 향후 분석을 하려고 한다.

1) 관측소가 10개 임, 각 관측소별 관측값 개수 90일(3개월) * 24시간 = 2,160 - 총 관측개수 21,600개, 11개 변수 - 먼저 10개 관측소 평균 값으로 대표 값을 정한다면...

10개 관측소의 평균으로 일별-시간대별 대전 미세먼지, 오염 물질의 관측값을 사용하여 향후 분석

2) 24 시간 시간대별 데이터의 대표 값을 정하자 -> 미세먼지, 오염물질 데이터 특성 상 최대값으로 일별 데이터를 활용하는 것이 적절함

일별 데이터로 만들려면 범주형 변수인 측정일 데이터가 있어야 한다. (mise$date<-

as.Date(as.character(substr(mise$측정일시,1,10)),'%Y%m%d'))

24시간 미세먼지 데이터 중 하루(일별)를 대표할 수 있는 값을 결정? 어느 통계량이 적절할까? 평

균? 중앙값? 최대? 최소? 미세먼지 값은 클수록 문제가 되므로 ‘최대값’이 적절하다.

mise_dj<-summaryBy(mise[,c(5:10)]~측정일시, data=mise,FUN=mean,na.rm=TRUE) names(mise_dj); dim(mise_dj)

mise_dj$date<-as.Date(as.character(substr(mise_dj$측정일시,1,10)),'%Y%m%d') names(mise_dj) mise_dj.max<-summaryBy(mise_dj[,c(2:7)]~date,data=mise_dj, FUN=max, na.rm=TRUE) head(mise_dj.max,5)

한남대학교 통계학과 권세혁교수 ( )10

Page 11: I. 개요wolfpack.hnu.ac.kr/Stat_Notes/softwares/about_R/R... · 2018-05-13 · r 활용 데이터 전처리 i. 개요 통계 소프트웨어 내장 절차(sas 는 proc (reg) 단계)

R 활용 데이터 전처리

mise_dj.max 데이터 : SO2, CO, O3, NO2, PM10, PM25 변수의 90일 일별 데이터를 저장 - 관측소 10개의 평균, 24시간 중 최대 값을 대전 일별 데이터로 저장되어 있음

대전 관측소 10개의 일별 데이터 시간도표

library(DescTools) mise_dj.max$month<-Month(mise_dj.max$date) #월 변수 mise_dj.max$wday<-Weekday(mise_dj.max$date) #요일 변수 names(mise_dj.max) library(ggplot2) ggplot(data=mise_dj.max,aes(date,PM10.mean.max))+ geom_line(color='blue',size=0.5,lty=2)

한남대학교 통계학과 권세혁교수 ( )11

(1) size= 라인 두께 지정 1이 디폴트

(2)lty= 라인 타입 지정이며 1=실선, 정수이며 커질수록 점선이 많이 끊김

Page 12: I. 개요wolfpack.hnu.ac.kr/Stat_Notes/softwares/about_R/R... · 2018-05-13 · r 활용 데이터 전처리 i. 개요 통계 소프트웨어 내장 절차(sas 는 proc (reg) 단계)

R 활용 데이터 전처리

월별-요일별 나무상자 그림

ggplot(mise_dj.max,aes(x=factor(month),y=PM10.mean.max,fill=factor(wday))) + geom_boxplot() + ggtitle("PM10 ; Month-Weekday Box Plot") + theme_bw()

한남대학교 통계학과 권세혁교수 ( )12

Page 13: I. 개요wolfpack.hnu.ac.kr/Stat_Notes/softwares/about_R/R... · 2018-05-13 · r 활용 데이터 전처리 i. 개요 통계 소프트웨어 내장 절차(sas 는 proc (reg) 단계)

R 활용 데이터 전처리

시계열 데이터 전처리 (예제 중심)

1) 시간 변수 만들기

시간 형식의 변수가 있은 경우

미세먼지 데이터는 ‘측정일시’ 변수가 시간 형식으로 되어 있으므로 Y연도(4자리) - m(2자리) - d(2자리) 시간 변수로 변환 - as.Date(문자형, 날짜 포멧)

시간 형식의 변수가 없는 경우

시작 날짜와 길이를 정할 수 있음. 날짜 데이터를 만든 후 원 데이터와 cbind() 이용하여 붙일 수 있음

mise$date<-as.Date(as.character(substr(mise$측정일시,1,10)),'%Y%m%d') mise$time<-substr(mise$측정일시,9,10) head(mise$date,3);tail(mise$date,3) head(mise$time,3)

seq(as.Date('2018-5-1'),by='days',length=5) seq(as.Date('2018-5-1'),by='2 days',length=5) seq(as.Date('2018-5-1'),by='1 months',length=5) seq(as.Date('2018-5-1'),to=as.Date('2018-5-31'),by='2 weeks') seq(from=as.POSIXct('2018-5-1 0'),to=as.POSIXct('2018-5-2 23'),by='hour')

한남대학교 통계학과 권세혁교수 ( )13

Page 14: I. 개요wolfpack.hnu.ac.kr/Stat_Notes/softwares/about_R/R... · 2018-05-13 · r 활용 데이터 전처리 i. 개요 통계 소프트웨어 내장 절차(sas 는 proc (reg) 단계)

R 활용 데이터 전처리

2) 주가 데이터 가져오기

한동안 source(src) 제공자가 google 도 있었는데, 현재는 야후, 네이버 등에서 제공함

auto.assign= F 사용해야 시작가, 장중 최대, 최소, 종가, 거래량, 수정 종가 자동 저장

library(quantmod) today <- Sys.Date() #오늘 날짜 #야후 금융: https://finance.yahoo.com/ kospi <- getSymbols("^KS11",src='yahoo', from='2018-1-1', to=today, auto.assign = F) #코스피 1월1일 ~ 현재 head(kospi,3); tail(kospi,3) stock_ss <- getSymbols("005930.KS",src='yahoo', from=today-120, to=today, auto.assign = F) #120일 삼성전자 주가 head(stock_ss,3); tail(stock_ss,3)

한남대학교 통계학과 권세혁교수 ( )14

Page 15: I. 개요wolfpack.hnu.ac.kr/Stat_Notes/softwares/about_R/R... · 2018-05-13 · r 활용 데이터 전처리 i. 개요 통계 소프트웨어 내장 절차(sas 는 proc (reg) 단계)

R 활용 데이터 전처리

3) 주가 1일 수익율 : (오늘 주가 , 어제 주가, )

• diff(시계열 관측변수, k=1) - 오늘 관측치와 어제 관측치 차이 값 (k=2이면 시차 2)

• lag(시계열 관측변수, k=1) - k 전 관측치 (k=1이면 어제 관측값, 일별 데이터 경우)

Rt =Yt − Yt−1

Yt−1Yt Yt−1

names(stock_ss);dim(stock_ss) stock_ss$Returns<-diff(stock_ss$`005930.KS.Close`,k=1)/lag(stock_ss$`005930.KS.Close`,k=1) ts.plot(stock_ss$Returns,main='Samsung daily returns(recent 60 days 20180512)')

한남대학교 통계학과 권세혁교수 ( )15

Page 16: I. 개요wolfpack.hnu.ac.kr/Stat_Notes/softwares/about_R/R... · 2018-05-13 · r 활용 데이터 전처리 i. 개요 통계 소프트웨어 내장 절차(sas 는 proc (reg) 단계)

R 활용 데이터 전처리

4) 삼성전자 주가 요일별 변동 - 어느 요일에 사는 것이 좋나?

월요일이 낮고 목요일이 높다 - 중위값 기준

library(DescTools) stock <- as.data.frame(stock_ss) #주가 날짜 변수화 stock$time <- time(stock_ss) stock$wday <- Weekday(stock$time) #요일 변수 만들기 names(stock) boxplot(stock$'005930.KS.Close'~stock$'wday',na.rm=T, col=c(2:6),main='삼성종가:요일별 분포')

한남대학교 통계학과 권세혁교수 ( )16