전처리(정제)에 대해서 공부하였다.

생각만큼 어렵지는 않았지만 어떤 데이터를 분석해야하는지 예측하여 기준을 세우는 게 내 목표이라고 생각하니 막막하다. 

하다보면 잘 할 수 있을 것이다.



==================================== R ====================================


rm(list = ls())

library("dplyr")


#csv 불러오기

a = read.csv("grade_csv.csv")

#위에 10개만 가져오기

head(a,10)

#요약

summary(a)

#class가 1인 정보만 가져오기

filter(a,class==1)

#a에서 위에서부터 10개 데이터만 요약한 것

a %>% head(.,10) %>% summary(.)

#a에서 class가 1인 것만 뽑기

a %>% filter(.,class==1)


#짝수번째 행(row)만 출력

a %>%subset(1:nrow(.) %% 2 == 0)

#수학이 50 이상이고 class가 1인 데이터만

a %>% filter(class == 1 & math >= 50)

#class가 1이거나 수학이 50이상인 데이터 

a %>% filter(class == 1 | math >= 50)

#class 1,3,5 중에서 1에 관한 데이터만 출력

a %>% filter(class == 1 %in% c(1,3,5))

#class 1,3,5를 출력

a %>% filter(class %in% c(1,3,5))



#class 1에서 math만 뽑아낸 값을 class1객체에 저장

class1 <- a %>% filter(class == 1) %>% select(math)


#math 빼고 다 

a %>% select(-math)


a %>% select(id,math) %>% head(3)


#오름차순 정렬 arrange

a %>% arrange(id) %>% head(3)


#내림차순 정렬 arrange(desc())

a %>% arrange(desc(id)) %>% head(3)


#파생객체(새로운 컬럼) 만들기 

a %>% mutate(total = math + english + science, average = total/3)


#ifelse를 사용하여 조건 부여하기

a %>% mutate(test = ifelse(math >=60 , 'pass','non-pass')) %>% arrange(desc(test))


#요약을 위한 함수

#summary는 그냥 요약, summaries는 행렬로 나눠주는 요약

summary(a)

#2차원 구조로 생성해야 하기 때문에 b라는 축을 추가해준다.

summarise(a, b = mean(math))


#na값을 넣은 grade_csv.csv

a = read.csv("grade_csv.csv")

t1 <- data.frame(id = c(1,2,3,4,5), so=c(60,70,80,90,95))

t2 <- data.frame(id = c(1,2,3,4,5), so=c(60,70,80,90,95))

#left_join으로 결합

s <- left_join(t1,t2, by = "id")

#bind_rows를 이용하여 한 줄로 출력

s <- bind_rows(t1,t2)


#결측치 확인을 위한 !is.na()

!is.na(a)

#테이블로 만들어서 true, false값을 바로 보여준다.

table(is.na(a))

#더 정확하게 확인하기 위해서 $로 컬럼마다 접근한다.

table(is.na(a$id))


summary(a)


a %>% filter(is.na(math)) %>% filter(is.na(english))


mean(a$math)


#na를 모두 제거한다.

s <- na.omit(a)

mean(a$math,na,rm=T)


summary(a$math)


#na값에 59를 넣어준다.

a$math <- ifelse(is.na(a$math), 59,a$math)

mean(a$math)


#3번재 칸에 강제로 na 값을 부

a[c(3),"math"] <-NA

a$math


a$gender <- ifelse(a$gender < 2, NA, a)




csvgrade <- read.csv("grade_csv.csv")

#원래는 filter(csvgrade,class==1)

csvgrade %>% filter(class ==1)

#원래는 filter(csvgrade,class !=1)

csvgrade %>% filter(class !=1)

#filter(csvgrade,math>50)

csvgrade%>% filter(math>50)

#filter(csvgrade,math<50)

csvgrade %>% filter(math<50)


#filter(csvgrade, english >=80)

csvgrade %>% filter(english >=80)

#filter(csvgrade, english <=80)

csvgrade %>% filter(english <= 80)


#filter(csvgrade,class==1&math >=50)

csvgrade %>% filter(class == 1& math >=50)

#filter(csvgrade,english<90|science<50)

csvgrade %>% filter(english<90|science <50)


#다중 출력. 둘 다 class 1,3,5인 것만 출력한다. 

csvgrade %>% filter(class==1|class==3|class==5)

csvgrade %>% filter(class %in% c(1,3,5))


#특정 데이터만 추출

class1 <- csvgrade %>% filter(class==1)

mean(class1$math)

mean(class1$english)

mean(class1$science)


#단일 컬럼 추출

select(csvgrade,math)

csvgrade %>% select(math)

#다중 컬럼 추출

select(csvgrade,class,math)

csvgrade %>% select(class,math)


#객체(컬럼) 제외

#math 컬럼만 제외하고 다 출력

select(csvgrade, -math)

csvgrade %>% select(-math)


#class 1의 english만 뽑아내는 방법

csvgrade %>% filter(class == 1) %>% select(english)

#id, math값만 추출하고 위에 3개만 출력

csvgrade %>% select(id,math) %>% head(3)


#math에 관하여 오름차순 정렬 

arrange(csvgrade,math)

csvgrade %>% arrange(math)



#math에 관하여 내림차순 정렬

arrange(csvgrade,desc(math))

#먼저 math에 관하여 내림차순 정렬을 하고 그 다음에 class에 대해서 내림차순 정렬을 한다.

#math값이 같은 경우에 한해서 class를 내림차순 정렬하게 된다.

csvgrade %>% arrange(desc(math,class))


#여러 기준 정렬. 위에서 설명

arrange(csvgrade,class,math)

csvgrade %>% arrange(.,class,math)

csvgrade %>% arrange(class,math)


#파생객체 추가(컬럼 추가)

#csvgrade에 total이라는 컬럼을 추가하고 위에서 3개만 출력

csvgrade %>% mutate(total = math+english+science) %>% head(3)

#total, average 컬럼을 추가하고 위에서부터 3개만 출력

csvgrade %>% mutate(total = math+english+science, average=total/3) %>% head(3)

#조건에 맞춰 컬럼을 추가. 여기서 과학이 60이상이면 pass, 아니면 fail로 출력하게 해놨다.

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

#컬럼을 추가하고 바로 사용 가능하다

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


#데이터를 그룹별로 요약하는 방법

#mean_math라는 컬럼을 추가하고 거기에 수학의 평균값을 추가했다.

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

#여기서는 두 개의 컬럼을 추가

csvgrade %>% summarise(mean_math = mean(math), mean_english = mean(english))


#집단별 요약 통계량 산출

#일단 각 반별로 group_by로 묶고 summarise로 mean_math 컬럼을 추가하여 math의 평균값을 넣는다.

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

#여러 요약 통계량 산출

csvgrade %>% group_by(class) %>% 

  summarise(mean_math = mean(math), sum_math=sum(math),median_math = median(math), number=n())


#데이터 결합

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를 id에 관해 가로로 결합시킨다.

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

#total컬럼을 추가하여 보기 쉽게 만든다. total내림차순으로 보기 쉽게 만든다.

total1 %>% mutate(total = midterm+final) %>% arrange(desc(total))

#세로로 결합시킨다. 즉 test1에 test2데이터를 아래다 붙인 형태가 된다. 컬럼별로 없는 데이터는 NA가 된다.

total2 <- bind_rows(test1,test2)


library("dplyr")

csvgrade <- read.csv("grademissing_csv.csv")

csvgrade


#결측치 확인. na가 true로 출력된다.

is.na(csvgrade)

#결측치 확인. na가 false로 출력된다.

!is.na(csvgrade)

#결측치 true, false를 테이블로 출력한다. 

table(is.na(csvgrade))

#컬럼별 결측치 확인

table(is.na(csvgrade$math))

table(is.na(csvgrade$english))

table(is.na(csvgrade$science))


#결측치가 존재하는 컬럼은 계산 결과가 NA로 나온다.

mean(csvgrade$math)

mean(csvgrade$english)

mean(csvgrade$science)


#math에 결측치가 존재하면서 동시에 english에도 존재하는 행을 찾는다.

csvgrade %>% filter(is.na(math)) %>% filter(is.na(english))

#결측치가 없는 데이터만 추출

csvgrade %>% filter(!is.na(math)) %>% filter(!is.na(english))

#math는 결측치가 없고 english에만 있는 행을 추출

csvgrade %>% filter(!is.na(math)) %>% filter(is.na(english))


#결측치 제거 후 연산

#결측치가 없는 행만 추출하여 새로운 데이터를 만들었다.

new_csvgrade1 <- csvgrade %>% filter(!is.na(math)) %>% filter(!is.na(english))

#평균값 추출

mean(new_csvgrade1$math)

mean(new_csvgrade1$english)

mean(new_csvgrade1$science)

#위의 new_csvgrade1과 같은 말

new_csvgrade2 <- csvgrade %>% filter(!is.na(math) & !is.na(english))

#평균값 추출

mean(new_csvgrade2$math)

mean(new_csvgrade2$english)

mean(new_csvgrade2$science)

#합 추출

sum(new_csvgrade2$math)

sum(new_csvgrade2$english)

sum(new_csvgrade2$science)


#결측치가 하나라도 존재하는 행 제거

#na.omit()으로 결측치가 존재하는 행을 다 제거할 수 있다.

new_csvgrade <- na.omit(csvgrade)

#값을 계산하고자 할 때 na.rm를 TRUE로 해서 결측치를 제거하고 계살 할 수도 있다.

mean(csvgrade$math,na.rm=TRUE)

sum(csvgrade$english, na.rm = T)


#결측치 대체

#여기서는 결측치에 결측치를 제외한 평균값을 넣어서 계산했다.

#결측치를 제외한 평균값 계산

mean_math <- mean(csvgrade$math, na.rm=T)

#csvgrade$math에 na가 존재하는 곳에 mean_math라는 평균값을 넣고 아니면 본래값을 넣는 csvgrade$math를 입력했다.

csvgrade$math <- ifelse(is.na(csvgrade$math), mean_math, csvgrade$math)

#결측치를 평균값으로 채우고 계산한 평균값

mean(csvgrade$math)




#결측치가 없는 데이터에 결측치를 넣는 방법

csvgrade <- read.csv("grade_csv.csv")

csvgrade$math

is.na(csvgrade$math)

#math컬럼의 3,8,15행에 결측치를 추가한다.

csvgrade[c(3,8,15),"math"] <- NA

csvgrade$math





#이상치 정제

library("dplyr")

csvgrade <- read.csv("grademissing_csv.csv")

csvgrade$gender

csvgrade$gender <- ifelse(csvgrade$gender>2,NA,csvgrade$gender)

#gender와 science가 NA가아닌 데이터만 뽑아 그것들을 gender로 묶고 묶은 자료의 science평균을 summaries한다.

csvgrade %>% filter(!is.na(gender)&!is.na(science)) %>%

  group_by(gender) %>% summarise(mean_science=mean(science))



==================================== R ====================================

'프로그래밍 > Python, R 프로그래밍' 카테고리의 다른 글

[R] R 7일차  (0) 2018.05.18
[Python] Python 6일차  (0) 2018.05.17
[Python] Python 5일차  (0) 2018.05.16
[Python] Python 4일차 - 2  (0) 2018.05.16
[R] R 5일차  (0) 2018.05.16

+ Recent posts