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