R
[R 프로그램] Kaggle 타이타닉 생존자 예측(4) - EDA(3)
Yeenn
2021. 12. 5. 23:27
728x90
Cabin(객실 번호) 변수
#Cabin 변수 탐색
head_tail_cabin <- c(head(table(data$Cabin)), tail(table(data$Cabin)))
t(head_tail_cabin)
A10 A11 A14 A16 A18 F2 F33 F38 F4 G6 T
[1,] 1014 1 1 1 1 1 4 4 1 4 5 1
Cabin 변수를 살펴보니, 값이 존재하지 않는 결측치가 1014개나 존재함을 알 수 있었다. 생각보다 많은 수의 값이 결측치로 존재하기 때문에 변수 자체를 삭제하는 것을 고려해본다.
Embarked(승선지) 변수
#Embarked 변수 탐색
str(data$Embarked)
chr [1:1309] "S" "C" "S" "S" "S" "Q" "S" "S" "S" "C" "S" "S" "S" "S" "S" "S" "Q" "S" "S" "C" "S" "S" "Q" "S" "S" "S" "C" "S" "Q" ...
table(data$Embarked)
C Q S
2 270 123 914
Emarked 변수는 문자형 변수로, C, Q, S 세가지 class로 이루어져 있으며, 결측값은 2개가 존재한다.
가장 높은 비율을 가지고 있는 S 값으로 대체하면 될 것으로 보인다.
#level=4 -> 3 변환 위한 문자열>팩터 변환
data$Embarked[which(data$Embarked == "")] <- 'S'
data$Embarked <- as.factor(as.character(data$Embarked))
#시각화
data %>%
group_by(Embarked) %>%
summarise(count=n()) %>%
ggplot()+
geom_col(aes(x=Embarked, y=count, fill=Embarked))
결측치를 S값으로 대체 후, Embarked 변수의 범주를 시각화해보았다. S값이 가장 많은 것으로 보인다.
#Embarked Survived 관계
chisq.test(data$Embarked, data$Survived)
Pearson's Chi-squared test
data: data$Embarked and data$Survived
X-squared = 25.964, df = 2, p-value = 2.301e-06
mosaicplot(Embarked~Survived, data = data)
Embarked 변수와 Survived 변수와의 관련성을 파악하기 위해 카이검정을 진행해본 결과, p value가 유의하는 것으로 나타나, 생존여부와 관련이 있음을 확인할 수 있었다.
mosiac plot을 그려 확인해보니 연관성을 다시 한 번 확인할 수 있었다.
Ticket(여객권) 변수
install.packages("stringr")
library(stringr)
# sapply를 활용한 Ticket 변수 전처리
Ticket <- sapply(data$Ticket, function(x) {
res <- gsub('[A-z]', '', x)
res <- gsub('[.]', '', res)
res <- gsub('[/]', '', res)
res <- str_trim(res)
if (grepl(' ', res)) {
res <- unlist(strsplit(res, split = ' '))[2]
}
return(res)
})
head_tail_ticket <- c(head(table(Ticket)), tail(table(Ticket)))
t(head_tail_ticket)
10482 110152 110413 110465 110469 8471 8475 851 9232 9234 9549
[1,] 4 1 3 3 2 1 1 1 3 1 1 3
#비어있는 값 확인
#변환전_변환후 의 값을 반환하도록 다시 연산
Ticket <- sapply(data$Ticket, function(x) {
res <- gsub('[A-z]', '', x)
res <- gsub('[.]', '', res)
res <- gsub('[/]', '', res)
res <- str_trim(res)
if (grepl(' ', res)) {
res <- unlist(strsplit(res, split = ' '))[2]
}
res <- paste(x, res, sep = '_') #_로 끝나는 값을 찾기
return(res)
})
# _로 끝나는 값의 정보를 불러오기
Ticket[grepl('_$', Ticket)]
LINE LINE LINE LINE
"LINE_" "LINE_" "LINE_" "LINE_"
# LINE이라는 티켓값을 새로운 값으로 대치하기 위해 index 저장
LINE_idx <- grep('_$', Ticket)
# index를 저장이후, 처음 연산을 반복
Ticket <- sapply(data$Ticket, function(x) {
res <- gsub('[A-z]', '', x)
res <- gsub('[.]', '', res)
res <- gsub('[/]', '', res)
res <- str_trim(res)
if (grepl(' ', res)) {
res <- unlist(strsplit(res, split = ' '))[2]
}
return(res)
})
# 저장한 index(LINE에 해당하는 위치)에 9999값을 입력.
Ticket[LINE_idx] <- 9999
head_tail_ticket <- c(head(table(Ticket)), tail(table(Ticket)))
t(head_tail_ticket)
10482 110152 110413 110465 110469 110489 8475 851 9232 9234 9549 9999
[1,] 1 3 3 2 1 1 1 3 1 1 3 4
#전처리 완료한 Ticket 변수를 데이터프레임에 입력
data$Ticket <- Ticket
# 중복되는 티켓의 수를 확인
not_unique_Ticket <- table(data$Ticket)[table(data$Ticket)>1]
table(not_unique_Ticket)
not_unique_Ticket
2 3 4 5 6 7 8 11
134 49 17 7 4 5 2 1
Ticket변수는 영문과 숫자가 함께 포함된 변수이지만, Unique한 값이 필요하므로 숫자만 남기고 나머지 문자는 제거하였다.
728x90