전처리(정제)에 대해서 공부하였다.
생각만큼 어렵지는 않았지만 어떤 데이터를 분석해야하는지 예측하여 기준을 세우는 게 내 목표이라고 생각하니 막막하다.
하다보면 잘 할 수 있을 것이다.
==================================== 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 |