May, 2018

R Data processing by index

Indexing 및 Filtering 을 이용한 데이터 정리

– Survey 데이터를 부르고 열 이름을 확인하자.

##          used (Mb) gc trigger (Mb) max used (Mb)
## Ncells 482619 25.8     940480 50.3   750400 40.1
## Vcells 868543  6.7    1650153 12.6  1135658  8.7

Indexing 및 Filtering 을 이용한 데이터 정리

  • surveys 데이터프레임에서 "plot_id", "species_id", "weight" 열을 골라보자
  • names(surveys) 는 데이터프레임의 열 이름을 출력하는 함수다.
  • match 함수의 용법은 R-graphical tool, R Basic(Review) 단원을 참고하여라.
match(c("plot_id", "species_id", "weight"),  names(surveys))
surveys[, match(c("plot_id", "species_id", "weight"),  names(surveys)) ]

Indexing 및 Filtering 을 이용한 데이터 정리

  • 데이터프레임의 column 을 인덱싱 하는 부분에 추출하고자 하는 열의 이름에 해당하는 문자열 벡터를 입력해도 같은 결과를 얻는다.
surveys[,c("plot_id", "species_id", "weight") ]
  • 혹은 데이터프레임이 List라는 성질을 이용하여 List에서 Slicing 방법을 이용할 수 있다.
surveys[c("plot_id", "species_id", "weight")]

Indexing 및 Filtering 을 이용한 데이터 정리

  • year 값이 1995인 데이터 행만 추출하고자 한다.
  • 데이터프레임에 행렬에서 행의 Slicing 방법을 적용한다.
surveys$year == 1995
surveys[surveys$year == 1995, ]
head(surveys[surveys$year == 1995, ])

Indexing 및 Filtering 을 이용한 데이터 정리

  • weight값이 5미만인 데이터에 대해서 "species_id", "sex", "weight" 열을 보고자 한다.
  • 데이터프레임에 행렬에서 행과 열의 Slicing 방법을 적용한다.
  • 다음 두개의 코드를 비교하여라.
surveys[surveys$weight<5, c("species_id", "sex", "weight")]
surveys[which(surveys$weight<5), c("species_id", "sex", "weight")]
  • 결과에서 어떤 차이가 있는가? 이런 차이는 왜 발행하는가?

Indexing 및 Filtering 을 이용한 데이터 정리

  • surveys 데이터에 weight_kg 열을 추가하여 surveys_ex 데이터프레임을 생성하고자 한다. weight_kg열은 weight열을 1000으로 나눈 값을 가진다. 단, surveys_ex 데이터는 weight_kg값이 NA인 것은 제외한다.
  • 데이터프레임에 열을 추가하는 방법은 cbind()를 사용하는 것도 가능하지만, list에서 데이터를 추가하는 방법을 사용하는 것도 가능하다.
  • is.na()를 사용하여 데이터프레임을 slicing 한다.
surveys_ex <- surveys
surveys_ex$weight_kg <- surveys_ex$weight/1000
surveys_ex <- surveys_ex[!is.na(surveys_ex$weight_kg),] 

Indexing 및 Filtering 을 이용한 통계량의 계산

  • surveys 데이터에서 sex별로 weight값의 평균을 계산하고자 한다. 단, NA값은 제외하고 계산하고자 한다.
  • sex 의 유일한 값은 어떻게 되나?
u = unique(surveys$sex)
length(u)
class(surveys$sex)
levels(surveys$sex)
  • surveys$sexfactor이므로 levels() 함수를 사용할 수 있다. 만약 그 변수가 characterunique함수를 사용해야 한다.

Indexing 및 Filtering 을 이용한 통계량의 계산

  • sex별로 weight값의 평균을 계산
mean( surveys$weight[surveys$sex == u[1]], na.rm = T )
mean( surveys$weight[surveys$sex == u[2]], na.rm = T )
mean( surveys$weight[surveys$sex == u[3]], na.rm = T )

Indexing 및 Filtering 을 이용한 통계량의 계산

  • by 함수의 이용
by( data = surveys$weight, INDICES =  surveys$sex, 
    FUN  = mean, na.rm = TRUE)
  • aggregate 함수의 이용
aggregate(formula = weight ~ sex, data = surveys,
          FUN = mean, na.rm = TRUE)

Indexing 및 Filtering 을 이용한 통계량의 계산

  • sexspecies_id 별로 weight값의 평균을 계산
  • by문을 사용할 수 있지만, 다음과 같이 aggregate 함수를 이용해 간단히 표현할 수 있다.
aggregate(formula = weight ~ sex + species_id, 
          data = surveys, FUN = mean, na.rm = TRUE)
  • sexspecies_id 별로 weight값의 평균과 분산과 최소값과 최대값의 계산

Indexing 및 Filtering 을 이용한 통계량의 계산

  • surveys 데이터의 성별의 빈도, (성별, plot_id)빈도를 계산하여라.
table(surveys$sex)
table(surveys$sex, surveys$plot_id)

Indexing 및 Filtering 을 이용한 통계량의 계산

  • plot_id 값의 오름차순으로 surveys 데이터를 정렬하여라.
surveys[order(surveys$plot_id),]
  • 먼저 month값을 내림차순으로 정렬하고 그 순서를 유지시키면서 plot_id 값의 오름차순으로 surveys 데이터를 정렬하여라.
tmp <- surveys 
tmp <- tmp[order(tmp$plot_id),]
tmp <- tmp[order(tmp$month, decreasing = TRUE),]
head(tmp)

R dplyr

R dplyr

  • Hadley Wickham가 작성한 데이터 처리에 특화된 R 패키지
  • Hadley Wickham 은 뉴질랜드 통계학자로 RStudio 수석 과학자, Rice University의 겸임교수로 재직중임.

  • dplyr 의 중요한 함수로는 select, filter, mutate, group_by, summarize와 연산자인 파이프함수 %>% 가 있다.

  • dplyr는 디플라이어 (데이터 플라이어: 데이터를 다루는 작은 집게)라고 흔히 부른다.

  • 특히 파이프라인 연산자는 코드의 가독성을 높여주는데 큰 기여를 한다.

if (!require(dplyr)) { install.packages("dplyr") ; library(dplyr) }

R dplyr

  • surveys 데이터프레임에서 "plot_id", "species_id", "weight" 열을 골라보자.
  • select 함수를 이용하여 고를 수 있다.
select(.data = surveys, plot_id, species_id, weight)
  • 파이프라인 연산자인 %>%의 사용방법을 확인하여라.
head(select(surveys, plot_id, species_id, weight))
select(.data = surveys, plot_id, species_id, weight) %>% head()

R dplyr

  • year 값이 1995인 데이터 행만 추출하고자 한다.
  • filter
filter(.data = surveys, year == 1995) %>% head()
  • year 값이 1995이상이고 weight가 20보다 큰 데이터 행만 추출하고자 한다.
filter(.data = surveys, year >= 1995 & weight > 20) %>% head()
filter(.data = surveys, year >= 1995 , weight > 20) %>% head()

R dplyr

  • weight값이 5미만인 데이터에 대해서 "species_id", "sex", "weight" 열을 보고자 한다. 그리고 weight가 NA인 것은 제외하고 싶다.
surveys %>%
  filter( !is.na(weight) ) %>%
  filter(weight < 5) %>%
  select(species_id, sex, weight) %>% head()

R dplyr

  • surveys 데이터에 weight_kg 열을 추가하여 surveys_ex 데이터프레임을 생성하고자 한다. weight_kg열은 weight열을 1000으로 나눈 값을 가진다. 단, surveys_ex 데이터는 weight_kg값이 NA인 것은 제외한다.
surveys_ex <- surveys %>% filter( !is.na(surveys$weight)) %>%
  mutate(weight_kg = weight / 1000) 

R dplyr 을 이용한 통계량 추출

  • surveys 데이터에서 sex별로 weight값의 평균을 계산하고자 한다. 단, NA값은 제외하고 계산하고자 한다.
surveys %>%
  group_by(sex) %>%
  summarize(mean_weight = mean(weight, na.rm = TRUE))

R dplyr 을 이용한 통계량 추출

  • sexspecies_id 별로 weight값의 평균을 계산
surveys %>%
  filter(!is.na(weight)) %>%
  group_by(sex, species_id) %>%
  summarize(mean_weight = mean(weight, na.rm = TRUE))

R dplyr 을 이용한 통계량 추출

  • sexspecies_id 별로 weight값의 평균과 분산과 최소값과 최대값의 계산
surveys %>%
  filter(!is.na(weight)) %>%
  group_by(sex, species_id) %>%
  summarize(mean_weight = mean(weight),
            var_weight = var(weight),
            min_weight = min(weight),
            max_weight = max(weight)) %>%
  print(n = 5)

R dplyr 을 이용한 통계량 추출

  • surveys 데이터의 성별의 빈도, (성별, plot_id)빈도를 계산하여라.
surveys %>%
  group_by(sex) %>%
  tally()

surveys %>%
  group_by(plot_id, sex) %>%
  tally()

R dplyr 을 이용한 통계량 추출

  • plot_id 값의 오름차순으로 surveys 데이터를 정렬하여라.
surveys %>% arrange(month, plot_id) %>% head()
  • 먼저 month값을 내림차순으로 정렬하고 그 순서를 유지시키면서 plot_id 값의 오름차순으로 surveys 데이터를 정렬하여라.
surveys %>% arrange(desc(month), plot_id) %>% head()

reshape2

Long format and wide format

  • wide format
##   Ozone Solar.R Wind Temp Month Day
## 1    41     190  7.4   67     5   1
## 2    36     118  8.0   72     5   2
## 3    12     149 12.6   74     5   3
  • Long format
## No id variables; using all as measure variables
##   variable value
## 1    Ozone    41
## 2    Ozone    36
## 3    Ozone    12

Long format and wide format

데이터 분석시 사용되는 함수에 따라 요구하는 데이터의 포맷이 다를 수 있다.

  • Wide format: almost modeling function such as lm, glm, gam,…

  • Long format: ggplot2

reshape2 라이브러리는 데이터 포맷의 변경 및 간단한 요약통계량을 산출해주는 함수를 가지고 있다.

melt

  • melt 함수는 wide format 데이터를 long format 데이터로 변경해준다.
names(airquality) <-  tolower(names(airquality))
melt(data = airquality) %>% head(n=3)
## No id variables; using all as measure variables
##   variable value
## 1    ozone    41
## 2    ozone    36
## 3    ozone    12

melt

  • melt 함수에 id.vars을 지정해줌으로써 long format은 행을 구분해 줄 수 있는 식별자를 지정해줄 수 있다.
names(airquality) <-  tolower(names(airquality))
aql <- melt(data = airquality, id.vars= c("month","day"))
head(aql, n = 3)
##   month day variable value
## 1     5   1    ozone    41
## 2     5   2    ozone    36
## 3     5   3    ozone    12
  • 다음과 같이 variablevalue에 값의 이름을 지정해 줄 수 있다.
##   month day climate_variable climate_value
## 1     5   1            ozone            41
## 2     5   2            ozone            36
## 3     5   3            ozone            12

dcast

  • dcast는 long format 데이터를 wide format 데이터로 변경하는 함수다.
knitr::include_graphics("./fig/reshape2-1.JPG")

dcast

if (!require(reshape2)) { install.packages("reshape2") ; library(reshape2) }

aqw <- dcast(aql, month + day ~ climate_variable, 
             value.var ="climate_value")
  • dcast 예제
dcast(aql, month ~ climate_variable, fun.aggregate = mean, 
      na.rm = TRUE, margins  = TRUE) %>% head(n=3)
##   month    ozone  solar.r      wind     temp    (all)
## 1     5 23.61538 181.2963 11.622581 65.54839 68.70696
## 2     6 29.44444 190.1667 10.266667 79.10000 87.38384
## 3     7 59.11538 216.4839  8.941935 83.90323 93.49748
- 여기서 `margins = TRUE` 를 생략하고 결과를 비교하여라.
- `margins`와 관련한 다른 option 을 찾아보아라.

Exercise

Skillcraft

Skillcraft

게임의 개요

  • RTS game: real-time strategy (RTS) games
  • 멀리플레이 온라인 게임: 다수의 사용자가 참가해 승패를 가리는 온라인 게임
  • 개인 플레이 (1:1), 팀플레이 (2:2~4:4)로 정해진 기준에 의해 승패가 결정
  • 모든 건물의 파괴
  • 게임 포기 등.
  • 온라인 상에서 플레이어간에 일방적인 경기가 나오지 않도록 플레이어 매칭을 고려, 등급제 실시
  • 데이터 다운로드

Skillcraft

플레이어의 등급

  • Bronze, Silver, Gold, Platinum, Diamond, Master, GrandMaster, and Professional leagues
  • Bronze 등급이 가장 초보적인 수준의 플레이가 받게 되는 등급, Professional leagues가 최고수준의 플레이어가 받게 되는 등급
  • 게임의 등급을 통한 플레이어 매칭은 여러 게임에서 사용되고 있음. ex) league of legend

Skillcraft

  • SkillCraft1:Master Table Dataset Data Set
  • 데이터 제공자: Mark Blair, Joe Thompson, Andrew Henrey, Bill Chen, Mark Blair: Department of Psychology; Simon Fraser University
  • 날짜: September, 20, 2013

데이터 수집 방법

  • StarCraft 2 replay file에서 스크린 내에서 발생하는 플레이어의 입력 정보를 Salvucci & Goldberg (2000) dispersion-threshold 알고리즘을 이용하여 1초당 약 88.5개의 시분할 작업을 수집하였음

  • StarCraft 2 replay file: 하나의 게임이 저장되어 게임 내에서 일어난 전체정보를 담고 있는 파일. 이 파일로 기록된 게임의 모든 정보를 얻을 수 있음

Skillcraft

데이터 정보

  • GameID : 게임 식별번호
  • LeagueIndex: Bronze, Silver, Gold, Platinum, Diamond, Master, GrandMaster, and Professional leagues coded 1-8 (Ordinal)

  • Age: 플레이어의 나이
  • HoursPerWeek: 주당 게임시간
  • TotalHours: 게임 총시간
  • APM: Action per minute (분당 마우스 또는 키보드를 통해 입력한 명령수)
  • SelectByHotkeys: 하나의 타임 프레임에서 (1/85.5 sec) 핫키 사용 평균 횟수 ( 핫키: 단축키)

Skillcraft

데이터 정보

  • AssignToHotkeys: 핫키에 할당된 건물 또는 유닛수
  • UniqueHotkeys: 유니크 핫키의 사용수
  • MinimapAttacks: 미니맵을 통한 공격횟수
  • MinimapRightClicks: 미니맵을 이용한 우클릭 횟수 (공격 또는 이동)

Skillcraft

데이터 정보

  • PAC : Perception-Action-Cycles. 특정 유닛을 클릭한 후 명령을 완료하는 동작 NumberOfPACs

  • GapBetweenPACs
  • ActionLatency: PAC의 첫번째 동작에서 완료할 동작까지 걸리는 평균시간
  • ActionsInPAC: PAC 내에서 일어나는 작업의 수
  • TotalMapExplored
  • WorkersMade: 하나의 타임프레임 내의 평균 일꾼수
  • UniqueUnitsMade: 하나의 타임프레임 내에서 Unique한 유닛의 수 (다양성)
  • ComplexUnitsMade: 다루기 어려운 유닛의 평균 수 (ghosts, infestors, and high templars )
  • ComplexAbilitiesUsed

Skillcraft

  • 등급별로 Skillcraft 데이터의 탐색적 자료분석을 실시하여라.

Wine Quality data

Wine Quality data

포르투칼 와인

  • vinho verde wine 산업
  • 포르투갈 북부지방에 Minho province 지역에서 시작되었음
  • 레드, 화이트, 로제 와인을 생산하고 있음
  • 2014년 약 19000개의 작은 농장이 있음
  • 포르투칼 와인 수출이 1997~2007년 사이 36% 증가하였음

와인의 성격

  • 약간의 기포가 있어 청량감이 있으나 스파클링 와인으로는 구분하지 않음
  • 도수는 11.5~14도 정도 임.
  • 화이트 와인은 상큼한 과일향과 청량감이 특징임.

Wine Quality data

와인의 평가

  • 감각에 의한 평가 (sensory test)
  • 주로 시음자에 의해서 이루어짐
  • 몇몇 평가는 상업적으로 많이 사용되기도 함: ex) 로버트 파커 rating

물리화학적 평가 (physicochemical test)

  • 와인의 화학적 성분을 실험실에서 측정한 다음, 그것들의 특징을 찾는 작업

  • 물리화학적 평가와 감각에 의한 평가에 대한 관계가 있을것으로 예상하나 몇몇 연구에 제한되어 있음

Wine Quality data

품질 평가가 왜 필요한가?

  • 소비자의 욕구 충족
  • 적절한 가격 책정
  • Taste preferenc의 분석을 통한 맞춤형 wine 추천 등….

물리화학적 평가와 감각에 의한 평가의 관계를 학습하자.

  • 왜?
  • 파커가 작은 농장에서 나온 와인에 평가점수를 줄리가 없다
  • 감각은 주관적이다. 맞춤형 와인을 개발할 수 없다.
  • 사람이 하는 것 보다 비용이 싸게 들 수 있다.

Wine Quality data

와인 데이터

  • official certification entity (CVRVV)에 제공하는 데이터

  • 데이터의 수: 1599(레드와인), 4898(화이트 와인)

  • 변수: 총 12개, ( 평가점수 (0 (very bad)~10점 (excellent); 11개의 물리화학적 성분)

  • 데이터 다운로드

Wine Quality data

와인 데이터

  • Fixed acidity: 단위 부피당 주석상의 양, 주석산의 포도산이라고 불린다. 따뜻한 곳에서 재배된 포도에 더 많이 들어 있다고 알려져 있다.
  • Volatile acidity: 단위 부피당 아세트산의 양. 식초에서 나는 신맛이 아세트산에 의한 것으로, 식초에는 아세트산이 약 4%가량 포함되어 있다. 살균 능력이 있어 대장균이나 포도상구균과 같이 식중독을 일으키는 세균을 죽임으로써 음식의 부패가 진행되는 것을 막아 준다.
  • citric acid: 구연산, 시트론을 비롯하여 레몬이나 덜 익은 감귤 등 감귤류의 과일에 특히 많이 함유되어 있는 데에서 연유한다

Wine Quality data

와인 데이터

  • Residual sugar: 단위 부피당 당분의 양
  • Chlorides: 단위 부피당 염화나트륨의 양
  • Free sulfur dioxide: 단위 부피당 (free) 상태에 있는 무수아황산의 양
  • Total sulfur dioxide:
  • Density: 밀도 (단위 부피당 무게)
  • ph: 산도
  • Sulphates: 단위 부피당 아황산칼륨의 양
  • Alcohol

Wine Quality data

  • 등급별로 Wine Quality data (red, white) 데이터의 탐색적 자료분석을 실시하여라.