본 글은 모두를 위한 R 데이터 분석 입문 책을 공부하면서 정리·요약한 내용입니다.
저자 : 오세종
출판 : 한빛아카데미
1. - 1 -
2. - 2 - 상자그림과 관계없는 내용, 이상치의 값이 정상적인 값일 수 있음
3. ESD (Extreme Studentized Deviation)
복습
데이터 전처리 : 대표적으로 "결측값"과 "특이값"을 처리하여 데이터 정제 및 가공
order() : 번호표
sort() : 실제 값 위치를 변경
subset() : 기준에 맞는 행들만을 추출(조건)
v1 <- c(1, 7, 6, 8, 4, 2, 3)
order(v1)
v1 <- sort(v1) # 오름차순
v1
v2 <- sort(v1, decreasing=T) # 내림차순
v2
sp <- split(iris, iris$Species) # 품종별로 데이터 분리
sp
summary(sp) # 분리 결과 요약
sp$setosa # setosa품종의 데이터 확인
subset(iris, Species == "setosa") # Species가 setosa인 데이터만 확인
subset(iris, Sepal.Length > 7.5) # Sepal.Length가 7.5 초과인 데이터만 확인
subset(iris, Sepal.Length > 5.1 & Sepal.Width > 3.9) # Sepal.Length가 5.1 초과하면서 Sepal.Width가 3.9 초과인 데이터만 확인
subset(iris, Sepal.Length > 7.6, select=c(Petal.Length, Petal.Width)) # Sepal.Length가 7.6 초과인 데이터 중Petal.Length, Petal.width 컬럼만 확인
데이터 샘플링
샘플링(sampling) : 주어진 값들 중 임의의 개수의 값들을 추출하는 작업
샘플링이 사용되는 예 : 데이터 셋의 크기가 너무 커서 많은 시간이 소요될 때, 일부 데이터만 샘플링하여 대략의 결과를 확인할 수 있음
복원추출 : 한번 뽑은 값을 다시 뽑을 수 있는 추출 (중복 가능)
비복원추출 : 한번 뽑은 값을 다시 뽑을 수 없는 추출 (중복 불가능)
숫자를 임의로 추출하기
# size는 추출할 값의 개수, replace=FALSE는 비복원 추출을 의미
x <- 1:100
y <- sample(x, size=10, replace=FALSE) # 비복원 추출
y
행을 임의로 추출하기
# iris 데이터셋에서 50개의 행을 임의로 추출
idx <- sample(1:nrow(iris), size=50, replace=FALSE)
iris.50 <- iris[idx, ] # 50개의 행 추출
dim(iris.50) # str와 달리 행과 열의 개수만 확인
head(iris.50)
set.seed() 함수 이해하기
sample() 함수는 함수를 실행할때마다 매번 그 결과가 다름
set.seed() 함수를 sample() 함수 실행 전에 먼저 실행한다.
set.seed() 함수의 매개변수 값이 같으면 sample() 함수 결과 동일
sample(1:20, size=5)
sample(1:20, size=5)
sample(1:20, size=5)
set.seed(100)
sample(1:20, size=5)
set.seed(100)
sample(1:20, size=5)
set.seed(100)
sample(1:20, size=5)
데이터 조합
조합(combination) : 주어진 데이터 값들 중에서 짝을 이룰 수 있는 경우를 추출하는 작업
combn() 함수를 사용하며, 결과에서 각 열이 하나의 조합을 의미함
combn(1:5, 3) # 1~5에서 3개를 뽑는 조합
x <- c("red", "green", "blue", "black", "white")
com <- combn(x, 2) # x의 원소를 2개씩 뽑는 조합
com
for(i in 1:ncol(com)){ # 조합을 출력 (단지 문자열로 출력할 뿐 위 코드와 동일)
cat(com[,i], "\n")
}
연습문제
1. state.x77 데이터셋에서 20개의 행을 임의로 추출하여 st20에 저장하고, 나머지 행들은 st.other에 저장하시오. 그리고 st20과 st.other의 내용을 출력하시오.
state.x77
idx <- sample(1:nrow(state.x77), size=20)
st20 <- iris[idx,] # 50개의 행 추출
st20
st.other <- iris[-idx,]
st.other
# 2. iris 데이터셋에서 3개의 Species(품종)를 2개씩 짝지어 출력하시오. ( 힌트 : species <- unique(iris$Species) )
species <- unique(iris$Species)
combn(species, 2)
데이터 집계
2차원 데이터는 데이터 그룹에 대해서 합계나 평균을 계산해야 하는 일이 많음
이와 같은 작업을 집계(aggregation)라고 하며 aggregate() 함수를 통해서 사용
iris 데이터셋에서 각 변수의 품종별 평균 출력
aggregate() 함수를 이용하여 iris 데이터셋에서 각 품종별로 꽃잎 꽃받침의 폭과 길이의 평균 출력 코드
agg <- aggregate(iris[,-5], by=list(품종=iris$Species), FUN=mean)
agg
iris 데이터셋에서 각 변수의 품종별 표준편차 출력
aggregate() 함수를 이용하여 iris 데이터셋에서 각 품종별로 꽃잎 꽃받침의 폭과 길이의 표준편차 출력 코드
agg <- aggregate(iris[,-5], by=list(표준편차=iris$Species), FUN=sd)
agg
mtcars 데이터셋에서 각 변수의 최댓값 출력
aggregate() 함수를 이용하여 mtcars 데이터셋에서 cyl과 vs를 기준으로 다른 열들의 최댓값 출력 코드
head(mtcars)
agg <- aggregate(mtcars, by=list(cyl=mtcars$cyl, vs=mtcars$vs), FUN=max)
agg
데이터 병합
# x와 y는 name을 공통 열로 갖고 있어 name을 중심으로 두 파일을 병합
# 병합할 데이터 생성
x <- data.frame(name=c("a", "b", "c"), math=c(90, 80, 40))
y <- data.frame(name=c("a", "b", "d"), korean=c(75, 60, 90))
x
y
# merge()함수를 이용해 데이터 병합
z <- merge(x, y, by=c("name"))
z # math나 korean이 하나밖에 없으면 병합 불가
데이터 병합의 종류
1. all.x=T
2. all.y=T
3. all=T
1. merge(x, y, all.x=T) # 첫 번째 데이터셋의 행들은 모두 표시
2. merge(x, y, all.y=T) # 두 번째 데이터셋의 행들은 모두 표시
3. merge(x, y, all=T) # 두 데이터셋의 모든 행들이 표시
병합의 기준이 되는 열의 이름이 서로 다른 경우에 병합하는 방법
x <- data.frame(name=c("a", "b", "c"), math=c(90, 80, 40))
y <- data.frame(sname=c("a", "b", "d"), korean=c(75, 60, 90))
x # 병합 기준 열의 이름이 name
y # 병합 기준 열의 이름이 sname
merge(x, y, by.x=c("name"), by.y=c("sname"))
연습문제
(1) 제공된 파일 중 subway.csv와 subway_latlong.csv 파일을 읽은 후 병합하여 subway.tot에 저장하시오.(병합 기준 열은 STATION_CD와 station).
setwd("C:/Source")
sw <- read.csv("subway.csv")
sw.latlong <- read.csv("subway_latlong.csv")
subway.tot <- merge(sw.latlong, sw, by.x=c("STATION_CD"), by.y=c("station"))
subway.tot
(2) subway.tot에서 역 이름과 날짜를 기준으로 on_tot(탑승 인원)과 off_tot(하차 인원)을 집계(합계)하여 출력하시오.
agg <- aggregate(subway.tot[,c('on_tot','off_tot')], by=list(역이름=subway.tot$stat_name, 날짜=subway.tot$income_date), FUN=sum)
agg
Chile 데이터셋
1988년 칠레 대통령 선거에 대한 여론조사 결과가 저장되어있는 데이터셋
# carData 패키지
install.packages("carData") # Chile 데이터셋이 있는 carData패키지 설치
library(carData) # carData 패키지 활성화
# Chile 데이터셋
data (Chile) # carData 패키지에서 Chile 데이터셋 로딩
? Chile # Chile 데이터셋에 대한 설명
str(Chile) # Chile 데이터셋 요약
head(Chile) # Chile 데이터셋에서 상위 6개 데이터만 출력
# 결측값이 있는지 확인하고, 결측값을 제거한 후 ch에 저장
is.na(Chile) # Chile 데이터셋에서 결측값이면 TRUE, 결측값이 아니면 FALSE로 출력
sum(is.na(Chile)) # 결측값의 개수 출력 (295)
Chile[!complete.cases(Chile),] # 결측값이 있는 행들을 모두 출력
ch <- Chile[complete.cases(Chile),] # 결측값이 없는 행들을 ch 변수에 저장
ch
# 지역별 인구를 내림차순으로 정렬
# C(Central), M(수도권 산티아고 지역), N(북부), S(남부), SA(산티아고시)
agg <- aggregate(ch[,'population'], by=list(지역=ch$region), sum) # 지역별 인구 수 합계를 agg에 저장
agg[order(agg$x, decreasing=T),] # agg를 내림차순으로 정렬
# 여론조사 응답결과(vote) 확인(A:기권, N:현 대통령 반대, U:미정, Y:현 대통령 찬성)
table(ch$vote) # ch$vote에 대한 도수분포표 출력
# 성별(sex)별로 현 대통령에 대한 찬성 비율에 차이가 있는지 알아봄
no.people <- table(ch$sex) # ch에서 성별에 대한 도수분포표를 no.people에 저장
no.people
tmp <- subset(ch, vote=='Y') # ch에서 vote가 Y인 데이터만 tmp에 저장
agg <- aggregate(tmp[,"vote"], by=list(성별=tmp$sex), length) # tmp변수의 데이터 중 vote컬럼에 대해 성별을 기준으로 갯수를 agg에 저장
agg
yes.ratio <- agg$x/no.people # 성별을 기준으로 한 'Y'의 비율을 yes.ratio에 저장
yes.ratio
# 지역별(region)별로 현 대통령에 대한 찬성 비율에 차이가 있는지 알아봄
no.region <- table(ch$region) # ch$region에 대한 도수분포표를 no.region에 저장
tmp <- subset(ch, vote=='Y') # ch 변수에서 vote 컬럼의 값이 'Y'인 행들만 tmp에 저장
agg <- aggregate(tmp[,'vote'], by=list(지역=tmp$region), length) # tmp변수의 vote컬럼에 대하여 지역별로 갯수를 agg에 저장
yes.ratio <- agg$x/no.region # 지역별 찬성 비율
yes.ratio
'데이터 분석 > R' 카테고리의 다른 글
데이터 분석[R] - 9 차시 (0) | 2021.07.07 |
---|---|
데이터 분석[R] - 8차시 (0) | 2021.07.06 |
데이터 분석[R] - 6차시 (0) | 2021.07.02 |
데이터 분석[R] - 5차시 (0) | 2021.07.01 |
데이터분석[R] - 4차시 (0) | 2021.06.30 |