[패스트캠퍼스 수강 후기] R 인강 100% 환급 챌린지 12차 미션
[패스트캠퍼스 수강 후기] R 인강 100% 환급 챌린지 12차 미션
패스트캠퍼스의 강의 중, 프로젝트와 함께 배우는 R 데이터 분석 올인원 패키지 Online를 수강하고 있습니다.
내용을 복습도 할 겸, 미션에도 참가할 겸, 블로그에 매일 매일 정리해 보게 되었습니다.
오늘은 12회차 미션!
Part 2) [R로 하는 데이터 분석] 데이터 분석 기본기 익히기
-
04. Ch 06. 그래프 그리기 - 04. 집단 간 분포 차이를 표현하는 상자 그림
-
05. Ch 07. 데이터 정제하기 - 01. 결측치 정제하기
-
04. Ch 06. 그래프 그리기 - 04. 집단 간 분포 차이를 표현하는 상자 그림
-
box plot
-
자주 써보기를 추천!
-
두 반의 평균이 동일하더라도 편차가 완전히 다를 수도 있다.
-
따라서 단순히 평균을 보기보다는 box plot으로 데이터의 분포를 확인해보는 것이 좋다.
-
사용법
-
ggplot(data = mpg, aes(x=drv, y=hwy))+geom_boxplot()
-
상자의 가운데 선분은 '중간값'
-
밑면은 1분위수, 윗면은 3분위수
-
상자의 최하점은 최소값, 최상점은 최대값
-
가운데에 점으로 표시된 건, '극단치'
-
1~3분위까지의 거리(IQR)의 1.5배 계산
-
1분위 - 1.5xIQR보다 작으면 극단치
-
3분위+1.5xIQR보다 크면 극단치
-
따라서 극단치가 있을 수도, 없을 수도 있음
-
즉, 위의 그림에서
-
f구동이 연비 중간값이 제일 높다~ 그 후 r, 4 순서
-
상자의 폭을 보면.. r구동은 연비가 다양한 차량들이 있음
-
f구동은 연비가 비슷비슷..
-
box에서 중간값이 전체 상자의 중간인지, 위쪽인지, 아래쪽인지..
-
4륜이라면, 분포가 낮은 쪽으로 치우쳐 있다는 것을 알 수 있음
-
즉, 평균값만 보는 것보다 다양한 값을 알 수 있다.
-
연습
-
여기서는 group_by + summarise 를 쓰면 안됨
-
이걸 쓰면 summarise에서 원자료가 사라지고, mean값만 남기에 Box_plot을 그릴 수 없게 됨
-
코드
-
mpg_new <-mpg %>%
-
select(class, cty) %>%
-
filter(class %in% c("compact", "subcompact", "suv"))
-
ggplot(data = mpg_new, aes(x=class, y=cty))+geom_boxplot()
-
05. Ch 07. 데이터 정제하기 - 01. 결측치 정제하기
-
앞서 자료는 오류가 없는 데이터였음.
-
하지만 실제 데이터는 대부분 오류가 존재
-
따라서 오류가 있는 데이터를 처리한 후 분석을 해야 함.
-
오류의 종류
-
자료가 빠진 것... (아예 없는 것) -> 결측치
-
이상한 데이터가 있는 것.. (너무 큰 값이라든지.. 너무 작은 값이라든지) -> 이상치
-
결측치 (missing value)
-
누락된 값, 비어있는 값
-
함수 적용 불가, 분석 결과 왜곡
-
제거 후 분석 실시
-
R에는 결측치를 표기할 때 NA로 표시
-
df <- data.frame(sex=c("M", "F", NA, "M", "F"),
-
score = c(5,4,3,4,NA))
-
df
-
is.na(df)
-
table(is.na(df))
-
is.na
-
결측치면 TRUE 아니면 FALSE
-
table(is.na(df))
-
table함수를 통해 내가 가진 데이터에 결측치가 몇개 있는 지 확인하는 방법
-
전체 df에 몇개의 결측치가 있는 지 확인
-
그러면 NA가 있는 값을 걸러내는 방법은?
-
table(is.na(df$sex))
-
table(is.na(df$score))
-
개별 변수에 대해 몇개의 결측치가 있는 지 확인
-
결측치가 있는 상태에서 연산하면 결과가 NA
-
mean(df$score)
-
sum(df$score)
-
결측치 제거하기
-
filter함수와 is.na()를 사용
-
df_nomiss <- df %>% filter(!is.na(score) & !is.na(sex))
-
df_nomiss
-
하지만 이 방법은 변수 하나하나에 대해서 is.na를 써야해서 불편할 수 있음
-
na.omit을 써보자!
-
df_nomiss2 <- na.omit(df)
-
df_nomiss2
-
이건 편하긴 한데..
-
나는 성별-소득만 분석할거라서 지역의 결측치는 있든 없든 상관없음.
-
따라서 omit을 쓰지 않음
-
이 때는 그냥 하나하나 is.na()를 사용.
-
mean, sum 등의 함수에 결측치는 빼고 계산하는 파라미터가 있음! 오예~!
-
mean(df$score, na.rm = T)
-
sum(df$score, na.rm = T)
-
이 파라미터가 없는 함수도 있음
-
없으면 filter써야 함~
-
summarise에서도 사용 가능
-
exam <- read.csv("csv_exam.csv")
-
exam[c(3,8,15), "math"] <- NA
-
table(is.na(exam))
-
exam %>% summarise(mean_math = mean(math))
-
exam %>% summarise(mean_math = mean(math, na.rm = T))
-
위에서
-
exam[c(3,8,15), "math"]
-
R 자체 함수의 데이터 추출방법
-
1번째 인자는 '행 조건'
-
3, 8, 15번째 행
-
2번째 인자는 '열 조건'
-
math
-
위에서 설명한 건, 결측치는 그냥 '제외'...
-
데이터가 좀 아깝다~
-
따라서 결측치를 '대체해서 사용하는 방법'이 존재
-
요약통계량으로 집어넣음
-
평균값이나 최빈값을 채워넣어서 사용하기도 함
-
또는 머신러닝 등을 이용하여 주변값 등으로부터 예측해서 사용하기도 함.
-
exam <- read.csv("csv_exam.csv")
-
exam[c(3,8,15), "math"] <- NA
-
table(is.na(exam))
-
exam %>% summarise(mean_math = mean(math, na.rm = T))
-
//55로 결측치 대체
-
exam$math <- ifelse(is.na(exam$math), 55, exam$math)
-
table(is.na(exam$math))
-
exam
-
mean(exam$math)
-
연습문제
-
코드
-
mpg %>%
-
filter(!is.na(mpg$drv) & !is.na(mpg$hwy)) %>%
-
group_by(drv) %>%
-
summarise(mean_hwy = mean(hwy)) %>%
-
arrange(desc(mean_hwy))
상자 그림에 대한 설명
상자 그림을 앞으로 종종 활용해봐야할 듯~
결측치 역시 실제로 데이터를 다루면 많이 발생하는 케이스.. is.na를 이용하는 것도 잘 기억해 두어야할 듯~