통계 이야기

[3일차] Do it! 쉽게 배우는 R 데이터 분석 / 145P~ 179P / 자유자재로 데이터 가공하기 / 결측, 이상치 정제

창이 2022. 5. 7.
728x90
반응형

< dplyr 패키지 정복하기 >

남은 부분인 summarise, group_by, left_join 부분 완료. 

추가적으로 dplyr 안에 있는 함수들로 연결해서데이터 분석해보기. 

 

# 2022.05.07
data <- read.csv("excel_exam.csv")
head(data)
library(dplyr)
data %>%
    summarise(mean_math = mean(math))
data %>%
  group_by(class) %>%
  summarise(mean_math = mean(math))

# group_by를 통해 반별로 집단을 나누고, n 을 통해 각 반 별로 몇 명이 있는지 알 수 있다. 
data %>%
  group_by(class) %>%
  summarise(mean_math = mean(math),
            sum_math = sum(math),
            median_math = median(math),
            n = n())

library(ggplot2)
mpg %>%
  group_by(manufacturer, drv) %>%     #회사별 , 구동 방식 별 분리
  summarise(mean_cty = mean(cty))%>% # cty 평균 산출
  head(10)


# dplyr 조합히기
head(mpg)
mpg %>%
  group_by(manufacturer) %>%
  filter(class == "suv") %>%
  mutate(tot = (cty + hwy)/2) %>%
  summarise(tot_mean = mean(tot)) %>%
  arrange(desc(tot_mean))%>%
  head(5)


# 혼자서 해보기 
mpg %>%
  group_by(class) %>%
  summarise(cty_mean = mean(cty))%>%
  arrange(desc(cty_mean))
mpg %>%
  group_by(class) %>%
  summarise(hwy_mean = mean(hwy))%>%
  arrange(desc(hwy_mean))
mpg %>% 
  filter(class == "compact")%>%
  group_by(manufacturer)%>%
  summarise(count = n())%>%
  arrange(desc(count))

# 데이터 합치기. 
# 가로로 합치기 , 기존데이터에 변수를 추가 
# 세로로 합치기 - 기존 데이터에 행을 추가한다. 

test1 <- data.frame(id = c(1, 2, 3, 4, 5), 
                    midterm = c(60, 80, 70, 90, 85))
test2 <- data.frame(id = c(1, 2, 3, 4, 5),
                    final = c(70, 83, 65, 95, 85))
test1 ; test2

total <- left_join(test1, test2, by = "id")
total

name <- data.frame(class= c(1, 2, 3, 4, 5),
                   teacher =c("kim", "lee", "park", "choi", "jung"))
exam_new <- left_join(data, name, by = "class")
exam_new


group_a <- data.frame(id = c(1, 2, 3,4, 5),
                      test = c(60, 80, 70, 90, 85))
group_b <- data.frame(id = c(6, 7, 8, 9, 10),
                      test = c(70, 83, 65, 95, 80))
group_all <- bind_rows(group_a, group_b)


#### 분석도전

mid <- midwest
str(mid)
mid <<- mid %>% 
  mutate(mid_pop = popadults/poptotal)%>%
  group_by(county) %>%
  arrange(desc(mid_pop))%>%
  head(5)

< 결측치 정제하기 > 

결측치는 누락된 값, 비어 있는 값을 의미합니다.

현장에서 만들어진 실제 데이터는 수집 과정에서 발생한 오류로 인해 결측치를 포함해고 있을 때가 많습니다.

결측치가 있으면 함수가 적용되지 않거나 분석 결과가 왜곡되는 문제가 발생. 

 

정상 범주에서 크게 벗어난 값을 이상치라고 한다.

이상치가 포함되어 있으면 분석결과가 왜곡되기 때문에 분석에 앞서 이상치를 제거하는 작업을 해야한다. 

 

# 결측치 찾기 
df <- data.frame(sex = c("M", "F", NA, "M", "F"),
                 score = c(5, 4, 3, 4, NA))
is.na(df) # 결측치 확인하기
table(is.na(df)) # 결측치 빈도 출력 

df %>% filter(is.na(score))
df %>% filter(!is.na(score))
df_nomiss <- df %>% filter(!is.na(score))
mean(df_nomiss$score)

df_nomiss <- df%>% filter(!is.na(score) & !is.na(sex)) # sex, score 결측치 제거 

# 결측치가 하나라도 있으면 제거하기
df_nomiss2 <- na.omit(df) # 결측치가 하나라도 있으면 모두 제거하기 떄문에 간편하지만, 분석에 필요한 행까지 손실된다는 단점이 있다. 예를들어, 성별, 소득, 지역 세 가지 변수로 구성된 데이터로 분석하는 상황을 가정해보면, 분석 목적이 성별에 따른 소득의 차이를 알아보는 것이라면, 성별, 소득의 두 변수에서만 결측치가 있는 행을 제거하면 된다. 하지만 na.omit을 사용하면 분석에 사용가능한 데이터까지 제거해버린다. 

# mean()과 같은 수치 연산 함수들은 na.rm 파라미터 제공 
sum(df$score, na.rm = T)

data[c(3, 8, 15), "math"] <- NA
data %>% summarise(mean_math = mean(math, na.rm = T))

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

#혼자서 해보기
mpg <- as.data.frame(ggplot2 :: mpg)
mpg[c(65, 124, 131, 153, 212), "hwy"] <- NA
table(is.na(mpg$drv))
table(is.na(mpg$hwy))

mpg %>%
  filter(is.na(mpg$hwy))


# 이상치 정제
outlier <- data.frame(sex = c(1, 2, 1, 3, 2, 1),
                      score = c(5, 4, 3, 4, 2, 6))
outlier$sex <- ifelse(outlier$sex == 3, NA, outlier$sex)

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

# 이상치 정제_ 박스플랏
boxplot(mpg$hwy)
boxplot(mpg$hwy)$stats
# 위에서 아래 순으로 아래쪽 극단치 경계, 1사분위, 중앙값, 3사분위수, 위쪽 극단치 경계를 의미한다. 이 값을 통해 12~37을 벗어나면 극단치로 분류된다는 것을 알 수 있다. 


# 혼자해보기
mpg <- as.data.frame(ggplot2::mpg)
mpg[c(10, 14, 58, 93), "drv"] <- "k"
mpg[c(29, 43, 129, 203), "cty"] <- c(3, 4, 39, 42)

table(mpg$drv)
mpg$drv <- ifelse(mpg$drv %in% c("4", "f", "r"), mpg$drv, NA)  
table(mpg$drv)

boxplot(mpg$cty)$stats
mpg$cty <- ifelse(mpg$cty < 9 | mpg$cty > 26, NA, mpg$cty)
boxplot(mpg$cty)

mpg%>%
  filter(!is.na(drv) & !is.na(cty)) %>%
  group_by(drv) %>%
  summarise(mean_cty = mean(cty))

 

728x90
반응형

댓글

추천 글