Stats & AI tech blog - '일단 시도함'

[R] EDA with ggplot2 본문

Programming/R

[R] EDA with ggplot2

justdoit ok? 2024. 2. 27. 13:24

R에서 그래프로 탐색적 분석을 수행할 때, 주로 아래 순서대로 시각화를 진행한다.

 

1. 단변량 시각화

: 변수의 분포 이해 (히스토그램, 박스플롯, KDE, 막대그래프)

 

2. 이변량 시각화

: 두 변수 간의 관계 파악 (산점도, 히트맵, 라인플롯)

 

3. 다변량 시각화

 : 세 개 이상의 변수 간 관계 파악 (페어플롯, 병렬좌표, 히트맵)

 

아래는 자주 사용하는 몇 가지 그래프에 대한 예시 코드이다.

 

  • 밀도추정그래프 (KDE)
# 이탈여부에 따라 분포가 어떻게 다른지 확인
df %>% 
  ggplot(aes(x = tenure, fill = fct_rev(Churn), alpha = .5))+
  geom_density()

 

 

  • 평균 막대 그래프
     - fct_rev()를 통해 레벨 거꾸로 표현
     - stat = 'summary', fun = 'mean' 으로 평균 표현
     - stat_summary()로 그래프 위에 평균 지점 텍스트로 표현
     - grid.arrange()로 여러 그래프 함께 표현
     - position = 'dodge'로 막대그래프 옆으로 표현
# 이탈 여부에 따라 평균이 얼마나 다른지 확인
g1 <- df %>% 
  ggplot(aes(y = tenure, x=fct_rev(Churn), fill = fct_rev(Churn))) + 
  geom_bar(stat = 'summary', fun = 'mean', alpha = .5) + 
  stat_summary(fun = 'mean', geom = 'text', aes(label = paste(round(..y.., 0), "months")), size = 3.5, vjust = -0.5) +
  labs(title = 'Average Customer Tenure', y = 'Tenure')
g2 <- df %>% 
  ggplot(aes(y = MonthlyCharges, x=fct_rev(Churn), fill = fct_rev(Churn))) + 
  geom_bar(stat = 'summary', fun = 'mean', alpha = .5) + 
  stat_summary(fun = 'mean', geom = 'text', aes(label = paste('$',round(..y.., 0))), size = 3.5, vjust = -0.5) +
  labs(title = 'Average Monthly Charges', y = 'Monthly Charges')
g3 <- df %>% 
  ggplot(aes(y = TotalCharges, x=Contract, fill = fct_rev(Churn))) + 
  geom_bar(position = "dodge", stat = 'summary', fun = 'mean', alpha = .5) + 
  stat_summary(fun = 'mean', geom = 'text', aes(label = paste('$',round(..y.., 0))), size = 3.5, vjust = -0.5,position = position_dodge(width = 0.9)) +
  labs(title = 'Average Monthly Charges by Contract', y = 'Total Charges')

grid.arrange(g1,g2,g3, ncol= 2, nrow=2, layout_matrix = rbind(c(1,2),c(3,3)))

 

 

 

  • 비율 막대 그래프
     - group과 facet_grid로 영역 나누고 그 안에서 비율 계산
     - y=..prop..로 축 비율로 설정
     - fill = factor(..x..)로 색 지정 근데 Churn으로 적으면 오류남
     - geom_test에서 y=..prop.., label = scales::percent(..prop..)로 그래프 위에 라벨링
     - scales_y_continuous(labels = scales::percent)로 축 %형식으로 변경
df %>% 
  ggplot(aes(x=fct_rev(Churn), group = Contract))+
  geom_bar(stat='count', aes(y = ..prop.., fill = factor(..x..)), alpha=.6)+
  geom_text(stat='count', aes(label = scales::percent(..prop..), y=..prop..), vjust = -.5)+
  scale_y_continuous(labels = scales::percent)+
  facet_grid(~Contract)

 

 

  • Pair plot
df %>% 
  select(tenure, MonthlyCharges, TotalCharges, Churn) %>% 
  ggpairs(aes(color = fct_rev(Churn)), 
          upper = list(combo = wrap('box_no_facet', alpha=.7)),
          diag = list(continuous = wrap('densityDiag', alpha=.6),
                      discrete = wrap('barDiag', alpha=.7)),
          lower = list(combo = wrap('box_no_facet',alpha = .7),
                       continuous = wrap('smooth', alpha=.15)))