본문 바로가기
인공지능/R

R 데이터 가공

by bibibig_data 2021. 6. 3.

06-1 데이터 전처리 - 원하는 형태로 데이터 가공하기

 

dplyr 패키지  ( 전처리 작업에 가장 많이 사용 )

 

125p dply함수

dplyr함수 기능
filter() 행 추출
select() 열 추출
arrange() 정렬
mutate() 변수 추가
summarise() 통계치 산출
group_by() 집단별로 나누기
left_join() 데이터 합치기(열)
bind_join() 데이터 합치기(행)

126p - 132 p - 조건에 맞는 데이터 추출하기

library(dplyr) #라이브러리 할당
exam <- read.csv("D:/rclass/csv_exam.csv") #데이터 불러오기
exam

#단축키 [ ctrl + shift + m ] = [ %>% ]

exam %>% filter(class == 1)  # dplyr패키지는 %>% 이용해서 함수 사용
                             # class가 1인 행만 추출

exam %>% filter(class==2)    # class가 2인 행만 추출

exam %>% filter(class !=1 )  # 1반이 아닌경우

exam %>% filter(class != 3)  # 3반이 아닌 경우

exam %>% filter(math > 50)   # 수학 점수가 50점을 초과한 경우

exam %>% filter(math < 50)   # 수학 점수가 50점 미만인 경우

exam %>% filter(english >= 80) # 영어 점수가 80점 이상인 경우

exam %>% filter(english <= 80) # 영어 점수가 80점 이하인 경우

exam %>% filter(class ==1 & math >= 50) # 1반이면서 수학점수가 50점 이상인 경우

exam %>% filter(class ==2 & english >= 80) # 2반이면서 영어점수가 80점 이상인 경우

exam %>% filter(math >= 90 | english >= 90) # 수학 점수가 90점 이상이거나 영어점수가 90점 이상인 경우

exam %>% filter(english < 90 | science < 50) # 영어 점수가 90점 미만이거나 과학 점수가 50점 미만인 경우

exam %>% filter(class == 1 | class == 3 | class == 5) # 1반, 3반, 5반에 해당하면 추출

exam %>% filter(class %in% c(1,3,5)) # 1반, 3반, 5반에 해당하면 추출

- 데이터명 %>% filter ( 변수명  조건 )  :  조건에 맞는 행 추출

 


 

132p - 138p 추출하기

# 추출한 행으로 데이터 만들기
class1 <- exam %>% filter(class == 1) # class가 1인 행 추출, class1에 할당
class2 <- exam %>% filter(class == 2) # class가 2인 행 추출, class2에 할당

mean(class1$math)

mean(class2$math)

#필요한 변수만 추출하기
exam %>% select(math)

exam %>% select(english)

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

exam %>% select(-math)

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

# dplyr 함수 조합하기
# filter()와 select() 조합하기
exam %>% filter(class == 1) %>% select(english)

# 가독성 있게 줄 바꾸기
exam %>% 
  filter(class == 1) %>%  # class가 1인 행 추출
  select(english)         # english 추출

# 일부만 추출하기
exam %>% 
  select(id, math) %>%  # id, math 추출 
  head()                # 앞부분 6행까지 추출

exam %>% 
  select(id, math) %>%  # id, math 추출
  head(10)              # 앞부분 10행까지 추출

- 데이터명 %>% select ( 변수명 )   :  필요한 변수 추출

- 데이터명 %>% select ( -변수명 )  :  불필요한 변수 제거

 


 

139p - 141p 순서대로 정렬하기

# 순서대로 정렬하기

exam %>% arrange(math) # math 오름차순 정렬

exam %>% arrange(desc(math)) # math 내림차순 정렬

exam %>% arrange(class, math) # class 및 math 오름차순 정렬

- 데이터명 %>% arrange ( 변수명 )  :  오름차순 정렬

 


 

142p - 144p 파생변수 추가하기

# 파생변수 추가하기

exam %>% 
  mutate(total = math + english + science) %>%  # 총합 변수 추가
  head  # 일부 추출

exam %>% 
  mutate(total = math + english + science) %>%  # 총합 변수 추가
         mean = (math + english + science)/3 %>%  # 총평균 변수 추가
  head  # 일부 추출

exam %>% 
  mutate(test = ifelse(science >= 60, "pass", "fail")) %>% 
  head

exam %>% 
  mutate(total = math + english + science) %>% 
  arrange(total) %>% 
  head

- mutate : 파생변수 만드는 함수

 


 

145p - 148p 집단별로 요약하기

 

summarise()에 자주 사용하는 요약 통계량 함수

- mean() 평균

- sd() 표준편차

- sum() 합계

- median() 중앙값

- min() 최솟값

- max() 최댓값

- n() 빈도

 

# 집단별로 요약하기

exam %>% summarise(mean_math = mean(math))

exam %>% 
  group_by(class) %>% 
  summarise(mean_math = mean(math))   

exam %>% 
  group_by(class) %>% 
  summarise(mean_math = mean(math),     #집단 별 평균
            sum_math = sum(math),       # 집단 별 합계
            median_math = median(math), # 집단 별 중앙값
            n = n())

- group_by()  : 집단 나누기

 


 

예제

회사별로 "suv" 자동차의 도시 및 고속도로 통합 연비 평균을 구해 내림차순으로 정렬하고, 1~5위까지 출력하기

 

- 회사별로 분리 group_by()

- suv 추출 filter()

- 통합 연비 변수 생성 mutate()

- 통합 연비 평균 산출 summarise()

- 내림차순 정렬 arrange()

- 1~5까지 출력 head()

# 회사별로 "suv" 자동차의 도시 및 고속도로 통합 연비 평균을 구해 내림차순으로 정렬하고, 1~5위까지 출력하기

mpg %>% 
  group_by(manufacturer) %>% 
  filter(class == "suv") %>% 
  mutate(tot = (cty+hwy)/2) %>% 
  summarise(mean_tot = mean(tot)) %>% 
  arrange(desc(mean_tot)) %>% 
  head(5)

151p-157p 데이터 합치기

# 데이터 합치기

rm(list = ls()) # 다 지우기기

# 중간고사 데이터 생성
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, 80))

test1
test2

ls()

str(test2)

left_join(test1, test2, by="id") # id를 기준으로 합치기

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

exam_new <- left_join(exam, name, by = "class") # class를 기준으로 exam_new에 할당
exam

# 세로로 합치기
# 학생 1-5 시험 데이터 생성
group_a <- data.frame(id = c(1, 2, 3, 4, 5),
                      test = c(60, 80, 70, 90, 85))

# 학생 6-10 시험 데이터 생성
group_b <- data.frame(id = c(6, 7, 8, 9, 10),
                      test = c(70, 83, 65, 95, 80))

group_a
group_b

group_all <- bind_rows(group_a, group_b)
group_all

- left_join() : by를 기준으로 합치기

 


7장 데이터 정제

 

162p - 168p결측치 정제하기

# 결측치 정제하기

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

is.na(df) # 결측치 확인  (결측치면 TRUE 관측치면 FALSE 출력)

table(is.na(df)) # 결측치 빈도 출력  (TRUE와 FALSE의 갯수 출력)

table(is.na(df$sex)) # sex 결측치 빈도 출력

table(is.na(df$score)) # score 결측치 빈도 출력

mean(df$score) # 평균 산출

sum(df$score)  # 합계 산출

library(dplyr)

df %>% filter(is.na(score))  # score가 NA인 데이터만 출력

df %>% filter(!is.na(score))  # score 결측치 제거 

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

mean(df_nomiss$score)   # score 평균 산출

sum(df_nomiss$score)  # score 합계 산출

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



# 결측치가 하나라도 있으면 제거하기 

df_nomiss2 <- na.omit(df) # 모든 변수에 결측치 없는 데이터 추출
df_nomiss2  # 출력

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

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

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


exam <- read.csv("D:/rclass/csv_exam.csv") # 데이터 불러오기
exam[c(3,8,15), "math"] <- NA # 3, 8, 15행의 math에 NA 할당

exam %>% summarise(mean_math = mean(math)) # math 평균 산출

# math 결측치 제외하고 평균 산출
exam %>% summarise(mean_math = mean(math, na.rm = T))

exam %>% summarise(mean_math = mean(math, na.rm = T),   # 평균 산출
                   sum_math = sum(math, na.rm = T),     # 합계 산출
                   median_math = median(math, na.rm = T)) # 중앙값 산출

- is.na() : 결측치 유무 (TRUE, FALSE)

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

- na.omit() : 모든 변수에 결측치 없는 데이터 행만 추출 ( 필요한 데이터도 지워질 수 있어서 조심 )

- 옵션(na.rm = T)  : 결측치 제외

 


 

169p - 170p  평균값으로 결측치 대체하기

# 평균값으로 결측치 대체하기

mean(exam$math, na.rm = T ) # 결측치 제외하고 math 평균 산출 # 55출력

exam$math <- ifelse(is.na(exam$math), 55, exam$math)  # math가 NA면 55로 대체

table(is.na(exam$math))  # 결측치 빈도표 생성

mean(exam$math)

- 결측치 대체법 1 : 평균을 구해서 결측치를 평균으로 대체  ( 결측치가 많은 경우 )

 

 

'인공지능 > R' 카테고리의 다른 글

R - 지도시각화  (0) 2021.06.08
R - 인터렉티브  (0) 2021.06.08
R (4)  (0) 2021.06.04
R 데이터프레임, 데이터 분석 기초  (0) 2021.06.02
R 설치, 변수, 함수, 패키지 이해  (0) 2021.06.01