Big Data/R

dplyr패키지 활용

창문닦이 2019. 2. 19. 23:57

 

#train , test

csv파일을 읽어서 data에 저장

data = read.csv("train.csv")

 

패키지 설치

install.packages("dplyr",”bindrcpp”)

 

라이브러리 실행

library(dplyr)

 

dplyr

dplyr → ‘%>%’ 많이쓰는 기호

data %>% str → dataframe의 구조를 알수 있는 함수

head(data) → dataframe의 첫 5개 행

summary(data) → dataframe의 통계지표( min, max, 25% , 75%, mid)

nrow(data) → data의 행의수

ncol(data) → data의 열의수

 

csv 파일을 읽은 뒤 이 데이터셋에 대해서 하나하나 파악을 해야함 (속성, 데이터의 양, 클래스 개수 등)

 

data$PassengerId %>% as.factor() 891개의 행이 존재하는 데 팩터로 변환했는데 변환된 범주개 891개. 모두 각기 다른 정보이므로 유용하게 사용할 수 없는 속성이다.

 

data$Pclass %>% as.factor()

data$Pclass %>% unique()

 

벡터 -- 1차원

v[index]

v[c(index1,index2)]

data[row index, col index]

data[3,2] = data[3, ‘Survived’]

data[row index, col name]

data[c(5:15), c(‘Survived’,’Pclass’)] 5번째행부터 15번째 행까지 두 컬럼만 출력

 

#select 따옴표를 작성하지 않아도 된다.

data %>% select(Survived,Pclass)

 

1.Ticket, Fare 컬럼을 출력하세요

data %>% select(Ticket,Fare)
data[,c('Ticket','Fare')]

2. Passenger id를 출력해라

data$PassengerId
data[,"PassengerId"]
data %>% select(PassengerId)

 


 

# filter  

# 성별이 여자인 데이터만 출력해라

data %>% filter(Sex=='female') %>%head()

data[data$Sex=='female',]%>%head()

 


문제 1 . 요금이 $40 이상이면서 나이가 20인 고객이름을 출력하시오
data %>% filter(Fare>=40) %>% filter(Age%/%10==2) %>% select(Name)

data %>% filter(Fare>=40 & Age%/%10==2) %>% select(Name)

data[data$Fare >= 40 & data$Age%/%10==2 , ‘Name’ ]  결측치 존재!!

data[data$Fare >= 40 & data$Age%/%10==2  & is.na(data$Age)==F, 'Name']

문제 2. 부모 자녀의 수가 3명 이상인 고객의 나이와 부모 자녀수를 출력하세요

data %>% filter(data$Parch>=3) %>% select(Age, Parch)

 

# in.na()

NA 결측치. 측정되지 않은 값. 즉 null에 해당 Age에 NA값이 존재해서 어떤 사칙연산도 적용되지 않음. 이 결측치를 모두 제외하고 진행할치 다른 전처리를 처리하고 진행할지도 결정해서 데이터 분석을 진행해야 한다.

필터로  data %>% filter(is.na(data$Age) == F) 조건을 추가해 줘야한다

 

# group by + summarise

생존자와 사망자수 출력

data %>% group_by(Survived) %>% summarise(cnt=n(), max_fare=max(Fare))

생존비율, 사망비율로 변환

data %>% group_by(Survived) %>% summarise(cnt=n()/nrow(data), max_fare=max(Fare))

성별에따른 생존여부 출력

data %>% group_by(Survived,Sex) %>% summarise(cnt=n())

₩문제 3 . 성별 생존 여부별 평균 요금을 구하세요
data %>% group_by(Survived,Sex) %>% summarise(cnt=n(),mean_fare=mean(Fare))

문제 4. 클래스가 1등급인 사람들 중 생존여부에 따라 최소, 최대요금, 평균나이를 출력
data %>% filter(is.na(data$Age)==F & Pclass==1)  %>% group_by(Survived) %>%
 summarise(cnt=n(), max_fare=max(Fare), min_fare=min(Fare), mean_age=mean(Age))



mean에서 제공하는 함수 이용 ( 동일 결과를 도출함!!)
data %>% filter(Pclass==1)  %>% group_by(Survived) %>%  summarise(cnt=n(), max_fare=max(Fare), min_fare=min(Fare), mean_age=mean(Age, na.rm=T))



문제 5. 형제자매가 함께 여행을 온 식구들의 생존율을 구하시오
data %>% filter(SibSp>0) %>% group_by(Survived) %>% summarise(cnt=n()/nrow(data%>% filter(SibSp>0)))

문제 6. 성별 생존 확률을 구하세요(mutate 이용)
#mutate 컬럼을 정제하거나 새로운 컬럼을 추가할 때 사용한다.
#성별기준 생존비율
data %>% group_by(Sex,Survived) %>% summarise(cnt=n()) %>%
 mutate(pct=cnt/sum(cnt))



#생존기준 남녀비율
data %>% group_by(Survived,Sex) %>% summarise(cnt=n()) %>%
 mutate(pct=cnt/sum(cnt))

 

요금에 대한 summary를 확인하니 중앙값은 14.45 평균값은 32.20으로 gap이 몹시 큰 걸 알 수 있다. 이 데이터의 분포 자체가 너무 넓게 퍼져있어 유효한 정보를 뽑아낼수 없겠다는 것을 캐치하면서 분석을 진행해야 함.

 

아무것도 없는 관측치를 결측치라고 했었음

#Embarked

data %>% mutate(Embarked==ifelse(Embarked=="",'U',Embarked))%>% filter(Embarked=="U")

 

성별이 여성이면 1 남성이면 0으로 Sex2 column을 생성하세요

data %>% mutate (Sex2 =ifelse(Sex==female,1,0)) %>% select(Sex,Sex2) %>% head()



선박별 좌석등급의 비율을 구하세요
data %>% mutate(Embarked=ifelse(Embarked=="",'U',Embarked))%>%
 group_by(Embarked,Pclass)%>% summarise(cnt=n()) %>% mutate(pct=cnt/sum(pct))


선박별 좌석등급의 평균요금, 평균 동반자 수를 구하세요
data %>% group_by(Embarked,Pclass) %>% summarise(mean_f = mean(Fare),mean_p = mean(Parch+SibSp))

선박별 생존률 비율을 구하세요
data %>% group_by(Embarked,Survived) %>% summarise(cnt=n())%>% mutate(pct=cnt/sum(pct))

혼자 여행온 사람의 나이, 좌석등급에 대한 summary를 구하세요
data %>% filter(Parch+SibSp ==0) %>% select (Age, Pclass) %>% summary

혼자 여행온 사람의 성비를 구하세요
data %>% filter(Parch+SibSp==0) %>% group_by(Sex) %>%
summarise(pct=n() / nrow(data%>%filter(Parch+SibSp==0)))

혼자 여행온 여성과 그렇지 않은 여성의 생존율을 비교해 보세요
data %>% filter(Sex=="female") %>% mutate(solo=ifelse(Parch+SibSp==0,'s','ns')) %>%
 group_by(Survived,solo) %>% summarise(cnt=n()) %>% mutate(pct=cnt/sum(cnt))
           

 

'Big Data > R' 카테고리의 다른 글

기본적인 R의 지식과 문법  (0) 2019.02.16