그래프(Graph)란?

- 데이터를 보기 쉽게 그림으로 표현한 것. 데이터를 그래프로 표현하며 추세와 경향성이 드러나기 때문에 특징을 쉽게 이해할 수 있고, 그래프를 만드는 과정에서 새로운 패턴을 발견하기도 함. 특히 분석 결과를 발표해야 한다면 데이터의 특징을 쉽게 이해할 수 있도록 그래프를 만드는 것이 좋음.

 

R 그래프의 종류

- 2차원 그래프, 3차원 그래프, 지도 그래프, 네트워크 그래프, 시간에 따라 변화하는 모션 차트, 마우스 조작에 반응하는 인터랙티브 그래프 등

 

사용하는 패키지

- ggplot2는 그래프를 만들 때 가장 많이 사용하는 패키지 / ggplot2 문법은 레이어(layer) 구조

1단계: 배경 설정(축)  /  2단계: 그래프 추가(점, 막대, 선)  /  3단계: 설정 추가(축 범위, 색, 표시)

 

 

■ 산점도 - 변수 간 관계 표현하기

산점도(Scater Plot): 데이터를 x축과 y축에 점으로 표현한 그래프

- 나이와 소득처럼 연속 값으로 된 두 변수의 관계를 표현할 때 사용됨 >> 변수 둘 다 연속형일 때

 

(1) 배경 설정하기

library(ggplot2)  #ggplot2 패키지 로드

# x축은 displ, y축은 hwy로 지정해 배경 설정
ggplot(data=mpg, aes(x=displ, y=hwy))

 

>> 코드를 실행하면 R 스튜디오 우측 하단에 있는 플롯 창에 배경 그림이 생성

 

(2) 그래프 추가하기

- + 기호를 이용해 그래프 유형을 지정하는 함수를 추가

- 산점도를 그리는 함수 geom_point()

(** 참고) dplyr 패키지 함수들은 %>% 기호로 연결하는 반면 ggplot2 패키지 함수들은 + 기호로 연결

# 배경에 산점도 추가
ggplot(data = mpg, aes(x = displ, y = hwy)) + geom_point()

>> 앞에서 만든 배경 위에 점 표식이 추가된 산점도가 만들어짐. 산점도에 표시된 점들은 각각의 관측치(행)를 의미하고, 여기서는 각 점이 하나의 자동차 모델을 의미.

전반적으로 배기량이 큰 자동차일수록 고속도로 연비가 낮은 경향이 있다는 것을 알 수 있음

 

(3) 축 범위를 조정하는 설정 추가하기

- 축은 기본적으로 최솟값에서 최댓값까지 모든 범위의 데이터가 표현되도록 설정되어 있음

- 축 범위는 xlim()과 ylim()을 이용해 지정 가능. xlim()을 이용해 x축을 지정하고, 축이 시작되는 값과 끝나는 값을 쉼표로 나열하면 됨. ex) x축이 3~6까지만 표현되도록 설정: xlim(3, 6) / y축이 10~30까지만 표현되도록 설정: ylim(10, 30)

# x축 범위 3~6으로 지정
ggplot(data = mpg, aes(x = displ, y = hwy)) + geom_point() + xlim(3, 6)

 

<참고>

ggplot() 함수는 레이어 구조로 되어 있어, 각각의 요소를 어떻게 지정하느냐에 따라 다른 그래프가 생성됨

 

 

Q. ggplot과 qplot의 차이?

- 이전까지는 그래프를 만들 때 qplot()을 사용. qplot()은 기능은 많지 않지만 문법이 간단하기 때문에 주로 전처리 단계에서 데이터를 빠르게 확인해보는 용도로 활용함. 그러나 최종적으로 분석 결과를 보고하기 위해 그래프를 만들 때는 ggplot()을 사용한다. ggplot()을 사용하면 다양한 그래프를 만들 수 있고 색, 크기, 폰트 등 세부 요소들을 자유롭게 조절할 수 있다.

 

 

 

■ 막대 그래프 - 집단 간 차이 표현하기

막대 그래프(Bar Chart): 데이터의 크기를 막대의 길이로 표현한 그래프

- 성별 소득 차이처럼 집단 간 차이를 표현할 때 주로 사용 >> 범주형 + 연속형 (~별 ~ / ~당 ~)

 

가장 많이 사용되는 막대 그래프는 각 집단의 평균값을 막대 길이로 표현한 평균 막대 그래프이다. mpg 데이터를 이용해 drv(구동방식)별 평균 hwy(고속도로 연비) 막대 그래프를 만들어 보자.

(1) 집단별 평균표 만들기

- 평균 막대 그래프를 만들려면 집단별 평균표로 구성된 데이터 프레임 필요 (구동 방식별 평균 고속도로 연비)

library(dplyr)

df_mpg <- mpg %>%
	group_by(drv) %>%
    summarise(mean_hwy = mean(hwy))

 

(2) 그래프 생성하기

- aes의 x축에 범주를 나타내는 변수를 지정하고, y축에 평균값을 나타내는 변수를 지정

- 막대 그래프 만드는 함수: geom_col()

ggplot(data = df_mpg, aes(x = drv, y = mean_hwy)) + geom_col()

 

(3) 크기 순으로 정렬하기

- 막대는 기본적으로 범주의 알파벳 순서로 정렬됨

- reorder()를 사용하면 막대를 값의 크기 순으로 정렬 가능. reorder()에 x축 변수와 정렬 기준으로 삼을 변수를 지정하면 됨. (정렬 기준 변수 앞에 - 기호를 붙이면 내림차순으로 정렬)

ggplot(data = df_mpg, aes(x = reorder(drv, -mean_hwy), y = mean_hwy)) + geom_col()

>> 참고: 변수의 값이 숫자와 문자로 함께 구성되면 숫자 오름차순, 알파벳 오름차순으로 정렬됨

 

Q. geom_col() vs geom_bar()?

- 평균 막대 그래프는 데이터를 요약한 평균표를 먼저 만든 후 이 평균표를 이용해 만든다. 반면 빈도 막대 그래프는 별도로 표를 만들지 않고 원자료를 이용해 바로 만든다. 요약표를 이용하는지 원자료를 이용하는지에 따라 그래프를 만드는 절차와 함수가 다르므로 유의

 

 

 

(출처; 가천대학교 컴퓨터공학과, 이영호 교수님)

(출처; 쉽게 배우는 R 데이터 분석, 김영우)

07-2. 이상한 데이터를 찾아라! - 이상치 정제하기

이상치(Outlier)란?

- 정상 범주에서 크게 벗어난 값

 

이상치 제거하기 - 존재할 수 없는 값

1. 이상치가 포함된 데이터 생성 (sex는 1과 2만 나올 수 있고, score는 1부터 5까지의 값만 들어갈 수 있음)

4행의 sex와 6행의 score에 이상치 확인 가능

 

2. 이상치 확인하기

table(outlier$sex)
table(outlier$score)

 

3. 결측 처리하기 - 이상치를 결측치로 변환, ifelse()를 이용해 이상치일 경우 NA 부여

#sex가 3이면 NA 부여
outlier$sex <- ifelse(outlier$sex == 3, outlier$sex)

4행의 sex 값이 NA로 변환

# score가 5초과면 NA 할당
outlier$score <- ifelse(outlier$score > 5, NA, outlier$score)

6행의 score 값이 NA로 변환

4. 결측치 제외 후 성별에 따른 score 평균 구하기

outlier %>%
	filter(!is.na(sex)&!is.na(score)) %>%
    group_by(sex) %>%
    summarise(mean_score = mean(score))

 

 

(출처; 쉽게 배우는 R 데이터 분석, 김영우)

07-1. 빠진 데이터를 찾아라! - 결측치 정제하기

결측치(Missing Value)란?

- 누락된 값, 비어 있는 값을 의미

 

결측치 찾기

1. 결측치 가진 데이터 프레임 만들기

df <- data.frame(sex=c("M","F",NA,"M","F"), score=c(5,4,3,4,NA))

2. 결측치 확인하기 - is.na() 사용하기 (결측치는 TRUE, 결측치가 아닌 값은 FALSE로 표시)

is.na(df)

is.na()를 사용해 결측치 확인

3. 데이터에 결측치가 몇 개 있는지 출력 - is.na()를 table()에 적용

table(is.na(df))

4. 결측치가 존재하는 변수 확인

 

 결측치 제거

1. 결측치 있는 행 제거하기 - '행'이므로 is.na()를 filter()에 적용

df %>% filter(is.na(score))

2. score의 값이 NA가 아닌 행들 출력

df %>% filter(!is.na(score))

3. 추출한 데이터로 데이터 프레임을 만들면 결측치가 없는 데이터가 생성됨

df_nomiss <- df %>% filter(!is.na(score))  #score 결측치 제거
mean(df_nomiss$score)  #score 평균 산출
sum(df_nomiss$score)  #score 합계 산출

결측치 없는 데이터

 

cf) na.omit() 을 이용하면 변수를 지정하지 않고 결측치가 있는 행을 한 번에 제거

df_nomiss2 <- na.omit(df)

na.omit()는 결측치가 하나라도 있으면 모두 제거하기 때문에 간편하게 쓸 수 있지만 분석에 필요한 데이터가 일부 손실된다는 단점이 있음. 따라서 filter()를 이용해 분석에 사용할 변수의 결측치만 제거하는 방식을 권함.

 

함수의 결측치 제외 기능 이용하기

** mean()과 같은 수치 연산 함수들은 결측치를 제외하고 연산하도록 설정하는 na.rm 파라미터를 지원한다. na.rm을 TRUE로 설정하면 결측치를 제외하고 함수를 적용하기 때문에 결측치를 제거하는 절차를 건너뛰고 곧바로 분석할 수 있다. 하지만 모든 함수가 na.rm을 지원하는 것이 아니기 때문에 filter()로 결측치를 제거한 후에 함수를 적용하는 순으로 작업해야 한다.

1. na.rm() 파라미터 사용

mean(df$score, na.rm=T)  #결측치를 제외하고 평균 산출
sum(df$score, na.rm=T)  #결측치를 제외하고 합계 산출

2. summarise()도 na.rm 적용 가능

exam<-read.csv("csv_exam.csv")
exam[c(3, 8, 15), "math"] <- NA

summarise()에 mean()과 sum(), median() 함수를 불러온 다음 na.rm을 사용해서 결측치를 제외하고 값을 구함.

exam %>% summarise(mean_math = mean(math, na.rm = T),
		sum_math = sum(math, na.rm = T),
        median_math = median(math, na.rm = T))

mean_math sum_math median_math
 55.23529      939          50

 

 

 결측치 대체하기

1. 앞에서 만든 exam 데이터에서 3, 8, 15행의 math는 결측치. 이 값들을 평균값으로 대체하기 위해 먼저 math의 평균값을 구해보자.

mean(exam$math, na.rm = T)

결측치 제외한 math 평균, 약 55

 

2. 결측치를 평균값으로 대체 - ifelse()를 이용해 NA값을 평균값으로 대체 (math가 NA면 55를 입력하고 그렇지 않으면 원래의 값을 그대로 둠)

exam$math <- ifelse(is.na(exam$math), 55, exam$math)
table(is.na(exam$math))

math의 결측치가 55로 수정됨

 

 

 

(출처; 쉽게 배우는 R 데이터 분석, 김영우)

 

dplyr 패키지에 있는 함수 알아보기

 

많이 사용하는 함수 종류

dplyr 패키지 설치하기

library(dplyr)

 

filter() - 조건에 맞는 데이터만 추출하기

<1> dplyr 패키지를 로드한 후 csv_exam.csv 파일을 데이터 프레임으로 만들어 출력하기

exam <- read.csv("csv_exam.csv")
exam

<2> dplyr 패키지의 filter 함수를 이용하여 1반 학생들의 데이터만 추출하기

exam %>% filter(class==1)

<3> 같은 형식으로 2반 학생들의 데이터만 추출하기

exam %>% filter(class=2)

<4> 변수가 '특정 값이 아닌 경우'에 해당하는 데이터 추출하기

exam %>% filter(class != 1)  #1반이 아닌 학생만 추출

 

 

select() - 필요한 변수만 추출하기

<1> select() 이용하여 수학 점수만 추출하기

exam %>% select(math)

<2> select() 이용하여 여러 변수 추출하기

exam %>% select(class, math, english)

<3> 특정 변수 제외하기

exam %>% select(-english)

 

 

arrange() - 순서대로 정렬하기

<1> 오름차순으로 정렬하기

english 변수의 값을 기준으로 오름차순으로 정렬됨

<2> 내림차순으로 정렬하기

english 변수의 값을 기준으로 내림차순으로 정렬됨
쉼표를 사용하여 여러 변수 한 번에 정렬 가능

 

 

mutate() - 파생변수 추가하기★

<1> 파생변수 추가하기

세 과목의 점수를 모두 더한 total이라는 파생 변수 추가

<2> 여러 파생변수 한 번에 추가하기

+

세 과목 점수를 더한 total 변수의 상위 5개

 

summarise() - 요약하기

** summarise 함수에는 연속형 변수만 들어갈 수 있다. (주로 group_by 함수와 같이 사용)

group_by() - 집단별로 나누기

** group_by 함수에는 범주형 변수만 들어갈 수 있다.

 

 

(출처; 쉽게 배우는 R 데이터 분석, 김영우)

+ Recent posts