public bigdata

R4DS (R for DataScience) 5장(4장 별 내용 없어 3장에 간단히 기록) 본문

R programming/R4DS (R for DataScience)

R4DS (R for DataScience) 5장(4장 별 내용 없어 3장에 간단히 기록)

public bigdata 2019. 12. 10. 22:08

5.2 질문하기

  • EDA는 근본적으로 창의적인 과정
  • 좋은 질문을 하는 핵심은 많은 양의 질문을 생성하는 것
  • 데이터셋에 어떤 통찰력이 포함되어 있는지 알 수 없기 때문에 흥미로운 질문을 하기 어렵다
  • 스스로 발견한 것을 따라 새로운 질문들을 만들다 보면 시사하는 바가 큰 질문을 발견할 수 있다.
  • 데이블 형식의 데이터는 각 변수들과 관측값의 조합인 값들의 집합이다 테이블 형식의 데이터는 각 값은 '셀'에, 변수들은 열에, 관측값은 행에 있을 때 타이디(tidy)하다고 한다.

5.3.1 분포 시각화

  • dplyr::count와 ggplot2::cut_width를 결합하면 값을 직접 나누어 플롯할 수 있다.
> diamonds %>% 
+   count(cut_width(carat, 0.5))
# A tibble: 11 x 2
   `cut_width(carat, 0.5)`     n
   <fct>                   <int>
 1 [-0.25,0.25]              785
 2 (0.25,0.75]             29498
 3 (0.75,1.25]             15977
 4 (1.25,1.75]              5313
 5 (1.75,2.25]              2002
 6 (2.25,2.75]               322
 7 (2.75,3.25]                32
 8 (3.25,3.75]                 5
 9 (3.75,4.25]                 4
10 (4.25,4.75]                 1
11 (4.75,5.25]                 1
  • geom_histogram 사용 시 binwidth 인자를 통해 너비를 결정할 수도 있다.
  • 여러 개의 히스토그램을 겹쳐서 그리고 싶다면 geom_frepoly를 사용하는 것이 좋다.

5.3.2 일반적인 값

  • 어떤 값이 가장 일반적인가? 그 이유는 무엇인가
  • 드물게 나타나는 값은 무엇인가? 그 이유는 무엇인가? 여러분의 예상과 일치 하는가?
  • 비정상적인 패턴을 볼 수 있는가? 그 패턴을 설명할 수 있는가?

 

  • 일반적으로 유사한 값들의 군집은 데이터 내에 하위집단이 있다는 것을 의미한다. 하위집단을 이해하기 위해 질문을하자
  • 각 군집 내의 관측값은 서로 유사한가?
  • 각 군집은 서로 다른 클러스터의 관측갑소가 다른가?
  • 군집은 어떻게 설명하거나 묘사할 수 있는가?
  • 군집의 모양이 오해의 소지가 있는 이유는 무엇인가?

5.3.3 이상값

  • 이상치들은 대부분 눈으로 확인하기 어렵다.
  • 이상값들을 쉽게 확인하기 위해서는 coor_cartesian을 사용하여 y축의 작은 값들을 확대해야 한다.
ggplot(diamonds) +
  geom_histogram(aes(x = y), binwidth = 0.5)+
  coord_cartesian(ylim = c(0, 50))

x 축을 확대할 때는 coord_cartesian(xlim = ***)을 사용한다. coord_cartesian은 xlim, ylim처럼 범위 밖의 데이터를 제외하지 않고 플롯을 확대하는 역할만 수행한다.

  • 이상값을 포함, 제외하여 분석을 반복하는 것은 좋은 연습이다.
  • 이상값이 이 결과에 최소한의 영향을 미치고 왜 이상값이 발생했는지 그 이유를 알 수 없다면 결측값으로 대체한 후 계속 진행하는 것이 합리적
  • 그러나 이상값이 겨로가에 상당한 영향을 미치는 경우, 타당한 이유 없이 제외해서는 안 된다. 문제의 원인을 파악하고 이상값을 제거한 사실을 밝혀야 한다.

5.4 결측값

  • 이상값이 포함된 행 전체를 삭제한다(비 추천)
  • 이상값을 결측값으로 변경하는 방법을 권장한다.(추천)

R과 동일하게 ggplot2는 결측값이 묵시적으로 사라져서는 안 된다는 방침에 동의한다. ggplot2는 결측값을 플롯에 포함하지는 않지만 결측값이 제거되었음을 경고한다.

경고 표시를 숨기려면 geom 함수내에 na.rm=T 인자를 추가하면 된다.

5.5.1 범주형 변수와 연속형 변수

geom_frepoly의 기본 모양은 높이가 빈도수를 나타내기 때문에 그룹 중 하나가 다른 값들보다 월등히 작으면 형태의 차이를 파악하기 어렵다.

따라서 아래와 같이 ..density..를 사용해 빈도 다각형 아래의 영역이 1이 되도록 빈도수를 표준화하여 나타낼 수 있다.

ggplot(
  data = diamonds,
  aes(x = price, y = ..density..)
)+
  geom_freqpoly(aes(color = cut), binwidth = 500)

  • reorder, coord_flip(90도 회전)을 이용해 박스플롯을 그릴 때 유용하게 시각화 할 수 있다.

5.5.2 연습문제

pass 복습 시 2번만 책 참고

5.5.3 두 개의 범주형 변수

범주형 변수들의 공변동을 시각화하는 한 가지 방법은 내장된 함수인 geom_count()를 이용하는 것이다.

ggplot(data = diamonds)+
  geom_count(mapping = aes(x = cut, y = color))

count 함수를 이용하여 빈도수를 계산한 뒤에 geom_tile 함수를 통해 시각화할 수도 있다.

diamonds %>% 
  count(color, cut) %>% 
  ggplot(aes(x = color, y = cut))+
  geom_tile(aes(fill = n))

위 코드에서 aes(x = cut, y = color) 대신 aes(x = color, y = cut)을 사용한 이유는 일반적으로 범주가 더 많거나 라벨이 긴 경우에 y축 방향으로 배치하는게 가독성이 더 좋기 때문이다.

5.5.5 두 개의 연속형 변수

  • 기본적으로 박스플롯은 얼마나 많은 관측값이 있는지 관계없이 동일하게 보이기 때문에 varwidth =TRUE를 통해 박스 플롯의 너비를 개수와 비례하도록 설정할 수 있다.
  • 또 다른 방법은 각 빈에 대략적으로 같은 수의 점을 표시하는 것이다. 이는 cut_number를 사용하면 된다.
ggplot(data = diamonds, aes(x = carat, y = price))+
  geom_boxplot(mapping = aes(group = cut_number(carat, 20)))

group인자가 주어지면 varwidth = TRUE가 디폴트인 것인가? / varwidth=FALSE 지정해줘도 동일하게 그려지는데, 둘 다 사용되면 group의 값이 덮어씌여지는 것으로 보인다.

5.5.6 연습문제

pass

5.6 패턴과 모델

모델을 활용하여 가격과 캐럿 간의 매우 강력한 상관관계를 제거하면 남아있는 중요한 세부 요소들을 탐색할 수 있다.

carat으로 price를 예측하는 모델을 적합시킨 다음, 잔차를 게산한다. 캐럿의 효과를 제거 시킨 후 다이아몬드 가격에 대한 관점을 제공한다.

두 이미지의 결과를 종합해 보면 carat이 3 이상인 부분에서는 잔차가 작아지는데 이는 선형 모델의 예측과 실제값이 차이가 적다는 것을 말한다. 즉, 우상향의 직선의 선형 모델이 3 이상인 지점에서는 잘 맞아 떨어진다는 것이고 그 말은 3이상인 부분에서는 carat이 클수록 가격이 높다는 것을 말한다.(3 아래 부분에서 그렇지 않은 것은 작은 크기의 다이아몬드는 cut을 잘해서 비싸게 파는 경우도 있어서 cut이 작으면서도 비싸거나 저렴할 수 있기 때문에 잔차의 편차가 큰 편이다)

아래 그림에서는 cut이 즉. 다이아몬드 등급이 높을 수록 잔차의 중앙값이 높이 위치한다.

좋은 등급의 다이아몬드인 경우에 잔차가 양의 방향으로 더 높아지는데 이는 좋은 다이아몬드 일수록 선형모델의 예측보다 실제값이 더 크다는 것으로 좋은 다이아몬드 일수록 더 많이 비싸다는 것을 말한다. 아래 그림처럼

두 가지 사실을 정리하면 1) 큰 다이아몬드 일수록 비싸다(3이상에서는 특히 명확) 2) 좋은 등급의 다이아몬드 일수록 더 많이 비싸다 

두 가지 사실을 종합하면 다이아몬드 크기에 비례하면서,  좋은 품질의 다이아몬드가 더 비싸다 라고 책에 나와 있는데 잘모르겠다. 1), 2) 결론 각각은 이해가 되지만....

플롯을 하나 더 그려본다면 이해가 될지도 모르겠다.

더 그려봐도 이해가 안된다. 책의 번역이 잘못된 건지, 내가 이해를 못하는 건지...

추가적으로 위에서 carat, price에 로그를 취해준 것은 log를 취함으로서 carat, price 각각의 편차를 줄여 carat과 price를 플롯했을 때 선형의 관계를 보이므로 모델을 더 잘 적합할 수 있다. 로그를 취해서 정규분포를 만들면 왜 더 잘 적합이 되는지는 모르겠다. 단지 플롯했을 때 선형의 관계를 잘 보이니 해주는 것으로만 이해한다. 더 자세한 내용은 회귀분석 관련 자료를 공부해야 할 것 같다.

5.8 더 배우기

  • ggplot2의 메커니즘에 대해 더 알고 싶다면 ggplot2를 추천한다. dplyr과 tidyr코드가 포함되어 있다.