데이터프레임 기초
##데이터 프레임 만들기
english <- c(90, 80, 60, 70) # 영어 점수 변수 생성
english
## [1] 90 80 60 70
math <- c(50, 60, 100, 20) # 수학 점수 변수 생성
math
## [1] 50 60 100 20
# english, math 로 데이터 프레임 생성해서 df_midterm 에 할당
df_midterm <- data.frame(english, math) df_midterm
## english math
## 1 90 50
## 2 80 60
## 3 60 100
## 4 70 20
class <- c(1, 1, 2, 2) class
## [1] 1 1 2 2
df_midterm <- data.frame(english, math, class) df_midterm
## english math class
## 1 90 50 1
## 2 80 60 1
## 3 60 100 2
## 4 70 20 2
mean(df_midterm$english) # df_midterm 의 english 로 평균 산출
## [1] 75
mean(df_midterm$math) # df_midterm 의 math 로 평균 산술
## [1] 57.5
##데이터 프레임 한 번에 만들기
df_midterm <- data.frame(english = c(90, 80, 60, 70),
math = c(50, 60, 100, 20),
class = c(1, 1, 2, 2))
df_midterm
## english math class
## 1 90 50 1
## 2 80 60 1
## 3 60 100 2
## 4 70 20 2
외부 데이터 이용하기
## 엑셀 파일 불러오기
# readxl 패키지 설치
install.packages("readxl")
# readxl 패키지 로드
library(readxl)
df_exam <- read_excel("excel_exam.xlsx") # 엑셀 파일을 불러와서 df_exam 에 할당
df_exam # 출력
## # A tibble: 20 x 5
## id class math english science
## <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 1 50 98 50
## 2 2 1 60 97 60
## 3 3 1 45 86 78
## 4 4 1 30 98 58
## 5 5 2 25 80 65
##직접 경로를 지정하여 불러오기
df_exam <- read_excel("d:/easy_r/excel_exam.xlsx"
## 워크디렉토리에 불러올 파일이 있어야 한다.
#엑셀 파일 첫번째 행이 변수명이 아닐 때
df_exam_novar <- read_excel("excel_exam_novar.xlsx", col_names = F)
#엑셀 파일에 시트가 여러개 있을 때
df_exam_sheet <- read_excel("excel_exam_sheet.xlsx", sheet = 3)
#csv 파일 불러오기
#csv?
#범용 데이터 형식
#값 사이를 쉼표(,)로 구분
#용량 작음, 다양한 소프트웨어에서 사용
df_csv_exam <- read.csv("csv_exam.csv")
write.csv(df_midterm, file = "df_midterm.csv") # CSV 파일로 저장하기
# Rda 파일
load("df_midterm.rda") # Rda 파일 불러오기
save(df_midterm, file = "df_midterm.rda") # Rda 파일로 저장하기
#문자가 들어 있는 파일을 불러올 때는 stringsAsFactors = F
df_csv_exam <- read.csv("csv_exam.csv", stringsAsFactors = F)
데이터 파악하기
exam <- read.csv("csv_exam.csv") #데이터 불러오기
head(exam) # 앞에서부터 6 행까지 출력
head(exam, 10) # 앞에서부터 10 행까지 출력
tail(exam) # 뒤에서부터 6 행까지 출력
tail(exam, 10) # 뒤에서부터 10 행까지 출력
View(exam) #뷰 창에서 데이터 확인하기
dim(exam) # 행 , 열 출력 /몇 행 몇 열로 구성 되어 있는지 알아보기
str(exam) # 데이터 속성 확인
## 'data.frame': 20 obs. of 5 variables:
## $ id : int 1 2 3 4 5 6 7 8 9 10 ...
## $ class : int 1 1 1 1 2 2 2 2 3 3 ...
## $ math : int 50 60 45 30 25 50 80 90 20 50 ...
## $ english: int 98 97 86 98 80 89 90 78 98 98 ...
## $ science: int 50 60 78 58 65 98 45 25 15 45 ...
summary(exam) # 요약통계량 출력
## id class math english
## Min. : 1.00 Min. :1 Min. :20.00 Min. :56.0
## 1st Qu.: 5.75 1st Qu.:2 1st Qu.:45.75 1st Qu.:78.0
## Median :10.50 Median :3 Median :54.00 Median :86.5
## Mean :10.50 Mean :3 Mean :57.45 Mean :84.9
## 3rd Qu.:15.25 3rd Qu.:4 3rd Qu.:75.75 3rd Qu.:98.0
## Max. :20.00 Max. :5 Max. :90.00 Max. :98.0
## science
## Min. :12.00
## 1st Qu.:45.00
## Median :62.50
## Mean :59.45
## 3rd Qu.:78.00
## Max. :98.00
데이터 수정하기
# 수정하기
install.packages("dplyr") # dplyr 설치
library(dplyr) # dplyr 로드
df_raw <- data.frame(var1 = c(1, 2, 1),
var2 = c(2, 3, 2))
#데이터 프레임 복사본 만들기
df_new <- df_raw # 복사본 생성
df_new # 출력
## var1 var2
## 1 1 2
## 2 2 3
## 3 1 2
#변수명 바꾸기
df_new <- rename(df_new, v2 = var2) # var2 를 v2 로 수정
df_new
## var1 v2
## 1 1 2
## 2 2 3
## 3 1 2
#rename()에 '새 변수명 = 기존 변수명' 순서로 입력
파생변수 만들기
#데이터 프레임 생성
df <- data.frame(var1 = c(4, 3, 8),
var2 = c(2, 6, 1))
## var1 var2
## 1 4 2
## 2 3 6
## 3 8 1
df$var_sum <- df$var1 + df$var2 # var_sum 파생변수 생성
## var1 var2 var_sum
## 1 4 2 6
## 2 3 6 9
## 3 8 1 9
df$var_mean <- (df$var1 + df$var2)/2 # var_mean 파생변수 생성
## var1 var2 var_sum var_mean
## 1 4 2 6 3.0
## 2 3 6 9 4.5
## 3 8 1 9 4.5
조건문 활용
mpg 통합 연비 변수 만들기
mpg$total <- (mpg$cty + mpg$hwy)/2 # 통합 연비 변수 생성
head(mpg)
## manufacturer model displ year cyl trans drv cty hwy fl class
## 1 audi a4 1.8 1999 4 auto(l5) f 18 29 p compact
## 2 audi a4 1.8 1999 4 manual(m5) f 21 29 p compact
## 3 audi a4 2.0 2008 4 manual(m6) f 20 31 p compact
## 4 audi a4 2.0 2008 4 auto(av) f 21 30 p compact
## 5 audi a4 2.8 1999 6 auto(l5) f 16 26 p compact
## 6 audi a4 2.8 1999 6 manual(m5) f 18 26 p compact
## total
## 1 23.5
## 2 25.0
## 3 25.5
## 4 25.5
## 5 21.0
## 6 22.0
mean(mpg$total)
## [1] 20.14957
#조건문을 활용해 파생변수 만들기
#1.기준값 정하기
summary(mpg$total) # 요약 통계량 산출
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 10.50 15.50 20.50 20.15 23.50 39.50
hist(mpg$total) # 히스토그램 생성
#2.조건문으로 합격 판정 변수 만들기
# 20 이상이면 pass, 그렇지 않으면 fail 부여
mpg$test <- ifelse(mpg$total >= 20, "pass", "fail")
head(mpg, 20) # 데이터 확인
#3.빈도표로 합격 판정 자동차 수 살펴보기
table(mpg$test) # 연비 합격 빈도표 생성
## fail pass
## 106 128
#4.막대 그래프빈 빈도 표현하기
library(ggplot2) # ggplot2 로드
qplot(mpg$test) # 연비 합격 빈도 막대 그래프 생성
#중첩 조건문
연비 등급 변수 만들기
# total 을 기준으로 A, B, C 등급 부여
mpg$grade <- ifelse(mpg$total >= 30, "A", ifelse(mpg$total >= 20, "B", "C"))
head(mpg, 20) # 데이터 확인
table(mpg$grade) # 등급 빈도표 생성
## A B C
## 10 118 106
qplot(mpg$grade) # 등급 빈도 막대 그래프 생성
#원하는 만큼 범주 만들기
# A, B, C, D 등급 부여
mpg$grade2 <- ifelse(mpg$total >= 30, "A",
ifelse(mpg$total >= 25, "B",
ifelse(mpg$total >= 20, "C", "D")))
정리하기
# 1. 데이터 준비 , 패키지 준비
mpg <- as.data.frame(ggplot2::mpg) # 데이터 불러오기
library(dplyr) # dplyr 로드
library(ggplot2) # ggplot2 로드
# 2. 데이터 파악
head(mpg) # Raw 데이터 앞부분
tail(mpg) # Raw 데이터 뒷부분
View(mpg) # Raw 데이터 뷰어 창에서 확인
dim(mpg) # 차원
str(mpg) # 속성
summary(mpg) # 요약 통계량
# 3. 변수명 수정
mpg <- rename(mpg, company = manufacturer)
# 4. 파생변수 생성
mpg$total <- (mpg$cty + mpg$hwy)/2 # 변수 조합
mpg$test <- ifelse(mpg$total >= 20, "pass", "fail") # 조건문 활용
# 5. 빈도 확인
table(mpg$test) # 빈도표 출력
qplot(mpg$test) # 막대 그래프 생성
문제풀이
midwest<-as.data.frame(ggplot2::midwest) #데이터 블러오기
str(midwest) #데이터 특성 파악하기
head(midwest)
tail(midwest)
View(midwest)
dim(midwest)
summary(midwest)
#변수명 수정하기
install.packages("dplyr") # dplyr 설치
library(dplyr) # dplyr 로드
midwest<- rename(midwest, total = poptotal,
asian =popasian)
midwest
#파생변수 만들기
midwest$ratio <- midwest$asian/midwest$total*100
#히스토스램 출력
hist(midwest$ratio)
#아시아 인구 백분율 전체 평균 구하기
mean(midwest$ratio)
#아시아 인구 백분율 요약 통계량 산출
summary(midwest$ratio)
#조건문
midwest$grade <- ifelse(midwest$ratio >= 0.4872462, "large", "small")
#빈도표 생성
table(midwest$grade)
#막대 그래프빈 빈도 표현하기
library(ggplot2) # ggplot2 로드
qplot(midwest$grade) # 빈도 막대 그래프 생성
데이터 전처리
# 조건에 맞는 데이터만 추출하기
#1.패키지 로드 & 데이터 준비
library(dplyr)
exam <- read.csv("csv_exam.csv")
# exam 에서 class 가 1 인 경우만 추출하여 출력
exam %>% filter(class == 1)
## id class math english science
## 1 1 1 50 98 50
## 2 2 1 60 97 60
## 3 3 1 45 86 78
## 4 4 1 30 98 58
# 2 반인 경우만 추출
exam %>% filter(class == 2)
## id class math english science
## 1 5 2 25 80 65
## 2 6 2 50 89 98
## 3 7 2 80 90 45
## 4 8 2 90 78 25
#1반이 아닌 경우
exam %>% filter(class != 1)
# 3 반이 아닌 경우
exam %>% filter(class != 3)
#초과, 미만, 이상, 이하 조건 걸기
# 수학 점수가 50 점을 초과한 경우
exam %>% filter(math > 50)
# 수학 점수가 50 점 미만인 경우
exam %>% filter(math < 50)
# 영어점수가 80 점 이상인 경우
exam %>% filter(english >= 80)
# 영어점수가 80 점 이하인 경우
exam %>% filter(english <= 80)
# 여러 조건을 충족하는 행 추출하기
#1반이면서 수학 점수가 50점 이상인 경우
exam %>% filter(class == 1 & math >= 50)
# 2 반 이면서 영어점수가 80 점 이상인 경우
exam %>% filter(class == 2 & english >= 80)
# 수학 점수가 90 점 이상이거나 영어점수가 90 점 이상인 경우
exam %>% filter(math >= 90 | english >= 90)
# 영어점수가 90 점 미만이거나 과학점수가 50 점 미만인 경우
exam %>% filter(english < 90 | science < 50)
#목록에 해당되는 행 추출하기
exam %>% filter(class == 1 | class == 3 | class == 5) # 1, 3, 5 반에 해당되면 추출
exam %>% filter(class %in% c(1,3,5)) # 1, 3, 5 반에 해당하면 추출
#%in%: 매칭 확인
#추출된 행으로 데이터 만들기
class1 <- exam %>% filter(class == 1) # class 가 1 인 행 추출 , class1 에 할당
class2 <- exam %>% filter(class == 2) # class 가 2 인 행 추출 , class2 에 할당
mean(class1$math) # 1 반 수학 점수 평균 구하기
## [1] 46.25
mean(class2$math) # 2 반 수학 점수 평균 구하기
## [1] 61.25
#필요한 변수만 추출하기
exam %>% select(math) # math 추출
exam %>% select(english) # english 추출
exam %>% select(class, math, english) # class, math, english 변수 추출
exam %>% select(-math) # math 제외
exam %>% select(-math, -english) # math, english 제외
# class 가 1 인 행만 추출한 다음 english 추출
exam %>%
filter(class == 1) %>%
select(english)
#일부만 출력하기
exam %>%
select(id, math) %>% # id, math 추출
head # 앞부분 6 행까지 추출
exam %>%
select(id, math) %>% # id, math 추출
head(10) # 앞부분 10 행까지 추출
#정렬하기
exam %>% arrange(math) # math 오름차순 정렬
exam %>% arrange(desc(math)) # math 내림차순 정렬
exam %>% arrange(class, math) # class 및 math 오름차순 정렬
#추가하기
exam %>%
mutate(total = math + english + science) %>% # 총합 변수 추가
head # 일부 추출
exam %>%
mutate(total = math + english + science, # 총합 변수 추가
mean = (math + english + science)/3) %>% # 총평균 변수 추가
head # 일부 추출
#mutate()에 ifelse() 적용하기
exam %>%
mutate(test = ifelse(science >= 60, "pass", "fail")) %>%
head
## id class math english science test
## 1 1 1 50 98 50 fail
## 2 2 1 60 97 60 pass
## 3 3 1 45 86 78 pass
## 4 4 1 30 98 58 fail
## 5 5 2 25 80 65 pass
## 6 6 2 50 89 98 pass
추가한 변수를 dplyr 코드에 바로 활용하기
exam %>%
mutate(total = math + english + science) %>% # 총합 변수 추가
arrange(total) %>% # 총합 변수 기준 정렬
head # 일부 추출
## id class math english science total
## 1 9 3 20 98 15 133
## 2 14 4 48 87 12 147
## 3 12 3 45 85 32 162
## 4 5 2 25 80 65 170
## 5 4 1 30 98 58 186
## 6 8 2 90 78 25 193
#요약하기
exam %>% summarise(mean_math = mean(math)) # math 평균 산출
## mean_math
## 1 57.45
#집단별로 요약하기
exam %>%
group_by(class) %>% # class 별로 분리
summarise(mean_math = mean(math)) # math 평균 산출
## # A tibble: 5 x 2
## class mean_math
## <int> <dbl>
## 1 1 46.25
## 2 2 61.25
## 3 3 45.00
## 4 4 56.75
## 5 5 78.00
#여러 요약통계량 한 번에 산출하기
exam %>%
group_by(class) %>% # class 별로 분리
summarise(mean_math = mean(math), # math 평균
sum_math = sum(math), # math 합계
median_math = median(math), # math 중앙값
n = n()) # 학생 수
## # A tibble: 5 x 5
## class mean_math sum_math median_math n
## <int> <dbl> <int> <dbl> <int>
## 1 1 46.25 185 47.5 4
## 2 2 61.25 245 65.0 4
## 3 3 45.00 180 47.5 4
## 4 4 56.75 227 53.0 4
## 5 5 78.00 312 79.0 4
#각 집단별로 다시 집단 나누기
mpg %>% group_by(manufacturer, drv) %>% # 회사별 , 구방방식별 분리
summarise(mean_cty = mean(cty)) %>% # cty 평균 산출
head(10) # 일부 출력
dplyr 조합하기
mpg %>% group_by(manufacturer) %>% # 회사별로 분리
filter(class == "suv") %>% # suv 추출
mutate(tot = (cty+hwy)/2) %>% # 통합 연비 변수 생성
summarise(mean_tot = mean(tot)) %>% # 통합 연비 평균 산출
arrange(desc(mean_tot)) %>% # 내림차순 정렬
head(5) # 1~5 위까지 출력
#데이터 합치기
#데이터 생성
# 중간고사 데이터 생성
test1 <- data.frame(id = c(1, 2, 3, 4, 5),
midterm = c(60, 80, 70, 90, 85))
## id midterm
## 1 1 60
## 2 2 80
## 3 3 70
## 4 4 90
## 5 5 85
# 기말고사 데이터 생성
test2 <- data.frame(id = c(1, 2, 3, 4, 5),
final = c(70, 83, 65, 95, 80))
## id final
## 1 1 70
## 2 2 83
## 3 3 65
## 4 4 95
## 5 5 80
#id 기준으로 합치기
total <- left_join(test1, test2, by = "id") # id 기준으로 합쳐 total 에 할당
## id midterm final
## 1 1 60 70
## 2 2 80 83
## 3 3 70 65
## 4 4 90 95
## 5 5 85 80
#다른 데이터를 변수에 추가하기
name <- data.frame(class = c(1, 2, 3, 4, 5),
teacher = c("kim", "lee", "park", "choi", "jung"))
## class teacher
## 1 1 kim
## 2 2 lee
## 3 3 park
## 4 4 choi
## 5 5 jung
#class 기준 합치기
exam_new <- left_join(exam, name, by = "class")
## id class math english science teacher
## 1 1 1 50 98 50 kim
## 2 2 1 60 97 60 kim
## 3 3 1 45 86 78 kim
## 4 4 1 30 98 58 kim
## 5 5 2 25 80 65 lee
## 6 6 2 50 89 98 lee
## 7 7 2 80 90 45 lee
## 8 8 2 90 78 25 lee
## 9 9 3 20 98 15 park
## 10 10 3 50 98 45 park
## 11 11 3 65 65 65 park
## 12 12 3 45 85 32 park
## 13 13 4 46 98 65 choi
## 14 14 4 48 87 12 choi
## 15 15 4 75 56 78 choi
## 16 16 4 58 98 65 choi
## 17 17 5 65 68 98 jung
## 18 18 5 80 78 90 jung
## 19 19 5 89 68 87 jung
## 20 20 5 78 83 58 jung
#세로로 합치기
#데이터 생성
# 학생 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_all <- bind_rows(group_a, group_b) # 데이터 합쳐서 group_all 에 할당
데이터 정제
-빠진데이터, 이상한 데이터 제거하기
1.결측치
-누락된 값, 비어있는 값
-함수 적용 불가, 분석결과 왜곡
-제거 후 분석 실시
# 결측치 표기 - 대문자 NA
#결측치 만들기
df <- data.frame(sex = c("M", "F", NA, "M", "F"),
score = c(5, 4, 3, 4, NA)) df
## sex score
## 1 M 5
## 2 F 4
## 3 <NA> 3
## 4 M 4
## 5 F NA
#결측치 확인하기
is.na(df) # 결측치 확인
## sex score
## [1,] FALSE FALSE
## [2,] FALSE FALSE
## [3,] TRUE FALSE
## [4,] FALSE FALSE
## [5,] FALSE TRUE
table(is.na(df)) # 결측치 빈도 출력
## ## FALSE TRUE
## 8 2
#변수 별로 결측치 확인하기
table(is.na(df$sex)) # sex 결측치 빈도 출력
## ## FALSE TRUE
## 4 1
table(is.na(df$score)) # score 결측치 빈도 출력
## ## FALSE TRUE
## 4 1
#결측치 포함된 상태로 분석
mean(df$score) # 평균 산출
## [1] NA
sum(df$score) # 합계 산출
## [1] NA
#결측치 제거하기
library(dplyr) # dplyr 패키지 로드
df %>% filter(is.na(score)) # score 가 NA 인 데이터만 출력
## sex score
## 1 F NA
df %>% filter(!is.na(score)) # score 결측치 제거
## sex score
## 1 M 5
## 2 F 4
## 3 <NA> 3
## 4 M 4
#결측치 제외한 데이터로 분석하기
df_nomiss <- df %>% filter(!is.na(score)) # score 결측치 제거
mean(df_nomiss$score) # score 평균 산출
## [1] 4
sum(df_nomiss$score) # score 합계 산출
## [1] 16
#여러 변수 동시에 결측치 없는 데이터 추출하기
# score, sex 결측치 제외
df_nomiss <- df %>% filter(!is.na(score) & !is.na(sex)) df_nomiss
## sex score
## 1 M 5
## 2 F 4
## 3 M 4
#결측치가 하나라도 있으면 제거하기
df_nomiss2 <- na.omit(df) # 모든 변수에 결측치 없는 데이터 추출
## sex score
## 1 M 5
## 2 F 4
## 4 M 4
#함수의 결측치 제외 기능 이용하기 - na.rm = T
mean(df$score, na.rm = T) # 결측치 제외하고 평균 산출
## [1] 4
sum(df$score, na.rm = T) # 결측치 제외하고 합계 산출
## [1] 16
#summarise()에서 na.rm = T사용하기
#결측치 생성
exam <- read.csv("csv_exam.csv") # 데이터 불러오기
exam[c(3, 8, 15), "math"] <- NA # 3, 8, 15 행의 math 에 NA 할당
#평균구하기
exam %>% summarise(mean_math = mean(math)) # 평균 산출
## mean_math
## 1 NA
exam %>% summarise(mean_math = mean(math, na.rm = T)) # 결측치 제외하고 평균 산출
## mean_math
## 1 55.23529
#다른 함수들에 적용
exam %>% summarise(mean_math = mean(math, na.rm = T), # 평균 산출
sum_math = sum(math, na.rm = T), # 합계 산출
median_math = median(math, na.rm = T)) # 중앙값 산출
## mean_math sum_math median_math
## 1 55.23529 939 50
#평균값으로 결측치 대체하기
#평균 구하기
mean(exam$math, na.rm = T) # 결측치 제외하고 math 평균 산출
## [1] 55.23529
#평균으로 대체하기
exam$math <- ifelse(is.na(exam$math), 55, exam$math) # math 가 NA 면 55 로 대체
table(is.na(exam$math)) # 결측치 빈도표 생성
mean(exam$math) # math 평균 산출
2. 이상치
#1. 논리적으로 존재할 수 없으므로 바로 결측 처리 후 분석시 제외
outlier <- data.frame(sex = c(1, 2, 1, 3, 2, 1),
score = c(5, 4, 3, 4, 2, 6)) outlier
## sex score
## 1 1 5
## 2 2 4
## 3 1 3
## 4 3 4
## 5 2 2
## 6 1 6
#이상치 확인하기
table(outlier$sex)
## 1 2 3
## 3 2 1
table(outlier$score)
## 2 3 4 5 6
## 1 1 2 1 1
#결측 처리하기
# sex 가 3 이면 NA 할당
outlier$sex <- ifelse(outlier$sex == 3, NA, outlier$sex) outlier
## sex score
## 1 1 5
## 2 2 4
## 3 1 3
## 4 NA 4
## 5 2 2
## 6 1 6
# sex 가 1~5 아니면 NA 할당
outlier$score <- ifelse(outlier$score > 5, NA, outlier$score) outlier
## sex score
## 1 1 5
## 2 2 4
## 3 1 3
## 4 NA 4
## 5 2 2
## 6 1 NA
#결측치 제외하고 분석
outlier %>%
filter(!is.na(sex) & !is.na(score)) %>%
group_by(sex) %>%
summarise(mean_score = mean(score))
## # A tibble: 2 x 2
## sex mean_score
## <dbl> <dbl>
## 1 1 4
## 2 2 3
#2. 극단적인 값
#상자그림 생성
mpg <- as.data.frame(ggplot2::mpg)
boxplot(mpg$hwy)
boxplot(mpg$hwy)$stats # 상자그림 통계치 출력
#결측 처리하기
# 12~37 벗어나면 NA 할당
mpg$hwy <- ifelse(mpg$hwy < 12 | mpg$hwy > 37, NA, mpg$hwy) table(is.na(mpg$hwy))
#결측치 제외하고 분석하기
mpg %>%
group_by(drv) %>%
summarise(mean_hwy = mean(hwy, na.rm = T))
정리하기
# 1. 결측치 정제하기
# 결측치 확인
table(is.na(df$score))
# 결측치 제거
df_nomiss <- df %>% filter(!is.na(score))
# 여러 변수 동시에 결측치 제거
df_nomiss <- df %>% filter(!is.na(score) & !is.na(sex))
# 함수의 결측치 제외 기능 이용하기
mean(df$score, na.rm = T) exam %>% summarise(mean_math = mean(math, na.rm = T))
# 2. 이상치 정제하기
# 이상치 확인
table(outlier$sex)
# 결측 처리
outlier$sex <- ifelse(outlier$sex == 3, NA, outlier$sex)
# boxplot 으로 극단치 기준 찾기
boxplot(mpg$hwy)$stats
# 극단치 결측 처리
mpg$hwy <- ifelse(mpg$hwy < 12 | mpg$hwy > 37, NA, mpg$hwy)
그래프 만들기
1. 산점도
library(ggplot2)
#배경설정하기
# x 축 displ, y 축 hwy 로 지정해 배경 생성
ggplot(data = mpg, aes(x = displ, y = hwy))
#그래프 추가하기
# 배경에 산점도 추가
ggplot(data = mpg, aes(x = displ, y = hwy)) + geom_point()
#축 범위를 조정하는 설정 추가하기
# x 축 범위 3~6 으로 지정
ggplot(data = mpg, aes(x = displ, y = hwy)) + geom_point() + xlim(3, 6)
#축 범위를 조정하는 설정 추가하기
# x 축 범위 3~6, y 축 범위 10~30 으로 지정
ggplot(data = mpg, aes(x = displ, y = hwy)) + geom_point() + xlim(3, 6) + ylim(10, 30)
2. 막대그래프 - 집단간 차이 표현하기
#1. 평균 막대 그래프
#집단별 평균표 만들기
library(dplyr)
df_mpg <- mpg %>%
group_by(drv) %>%
summarise(mean_hwy = mean(hwy))
## # A tibble: 3 x 2
## drv mean_hwy
## <chr> <dbl>
## 1 4 19.17476
## 2 f 28.16038
## 3 r 21.00000
# 그래프 생성하기
ggplot(data = df_mpg, aes(x = drv, y = mean_hwy)) + geom_col()
#크기 순으로 정렬하기
ggplot(data = df_mpg, aes(x = reorder(drv, -mean_hwy), y = mean_hwy)) + geom_col()
#2.빈도 막대 그래프
#값의 개수(빈도)로 막대의 길이를 표현한 그래프
# x 축 범주 변수 , y 축 빈도
ggplot(data = mpg, aes(x = drv)) + geom_bar()
# x 축 연속 변수 , y 축 빈도
ggplot(data = mpg, aes(x = hwy)) + geom_bar()
3. 선 그래프 - 시간에 따라 달라지는 데이터 표현
#선 그래프(Line Chart) : 데이터를 선으로 표현한 그래프
#시계열 그래프(Time Series Chart) : 일정 시간 간격을 두고 나열된 시계열
#데이터(Time Series Data)를 선으로 표현한 그래프. 환율, 주가지수 등 경제 지표가 시간에 따라
#어떻게 변하는지 표현할 때 활용
#시계열 그래프만들기
ggplot(data = economics, aes(x = date, y = unemploy)) + geom_line()
4. 상자 그림 - 집단 간 분포 차이 표현하기
#상자 그림(Box Plot) : 데이터의 분포(퍼져 있는 형태)를 직사각형 상자 모양으로 표현한 그래프
#분포를 알 수 있기 때문에 평균만 볼 때보다 데이터의 특성을 좀 더 자세히 이해할 수 있음
#상자 그림 만들기
ggplot(data = mpg, aes(x = drv, y = hwy)) + geom_boxplot()
정리하기
# 1. 산점도
ggplot(data = mpg, aes(x = displ, y = hwy)) + geom_point()
# 축 설정 추가
ggplot(data = mpg, aes(x = displ, y = hwy)) + geom_point() + xlim(3, 6) + ylim(10, 30)
# 2. 평균 막대 그래프
# 1 단계 . 평균표 만들기
df_mpg <- mpg %>% group_by(drv) %>% summarise(mean_hwy = mean(hwy))
# 2 단계 . 그래프 생성하기 , 크기순 정렬하기
ggplot(data = df_mpg, aes(x = reorder(drv, -mean_hwy), y = mean_hwy)) + geom_col()
# 3. 빈도 막대 그래프
ggplot(data = mpg, aes(x = drv)) + geom_bar()
# 4. 선 그래프
ggplot(data = economics, aes(x = date, y = unemploy)) + geom_line()
# 5. 상자 그림
ggplot(data = mpg, aes(x = drv, y = hwy)) + geom_boxplot()
'한국복지패널데이터' 분석하기
#패키지 준비하기
install.packages("foreign") # 패키지
install.packages("readxl") # 패키지 설치
library(foreign) #SPSS 파일 로드
library(dplyr) #전처리
library(ggplot2) #시각화
library(readxl) #엑셀파일 불러오기
#데이터 준비하기
raw_welfare <- read.spss(file = "C:/rwork/Koweps_hpc10_2015_beta1.sav",
to.data.frame =T)
#복사본 만들기
welfare <- raw_welfare
#데이터 검토하기
head(welfare)
tail(welfare)
View(welfare)
dim(welfare)
str(welfare)
summary(welfare)
#변수명 바꾸기
welfare<-rename(welfare,
sex=h10_g3, #성별
birth=h10_g4,#태어난 연도
marriage=h10_g10,#혼인상태
religion=h10_g11,#종교
income=p1002_8aq1,#월급
code_job=h10_eco9,#직종코드
code_region=h10_reg7)#지역코드
#질문1.남녀 임금차이
#바뀐 내용 확인
names(welfare)
#변수 검토하기
class(welfare$sex)
table(welfare$sex)
#이상치 결측하기
welfare$sex<-ifelse(welfare$sex==9, NA, welfare$sex)
#결측치 확인
table(is.na(welfare$sex))
#성별 항목 이름 부여
welfare$sex<-ifelse(welfare$sex==1, "male","female")
table(welfare$sex)
#그래프 보기
qplot(welfare$sex)
#월급 변수 검토 및 전처리
class(welfare$income)
summary(welfare$income)#월급 컬럼만 보기
#그래프 보기
qplot(welfare$income) +xlim(0,1000)
#이상치 확인
summary(raw_welfare$income)
qplot(raw_welfare$income)
qplot(raw_welfare$income)+xlim(0,1000)
#이상치 결측 처리
raw_welfare$income <- ifelse(raw_welfare$income %in% c(0,9999),NA,raw_welfare$income)
table(is.na(raw_welfare$income))
#성별 월급 평균표 만들기
sex_income<-welfare%>%
filter(!is.na(income)) %>%
group_by(sex) %>%
summarise(mean_income = mean(income))
sex_income
#그래프 만들기
ggplot(data=sex_income,aes(x=sex,y=mean_income))+geom_col()
#변수 검토하기
class(welfare$birth)
summary(welfare$birth)
qplot(welfare$birth)
#이상치 확인
summary(welfare$birth)
#결측치 확인
table(is.na(welfare$birth))
#이상치 결측 처리
welfare$birth<-ifelse(welfare$birth==9999,NA,welfare$birth)
table(is.na(welfare$birth))
#파생변수 만들기- 나이
welfare$age<-2015-welfare$birth+1
qplot(welfare$age)
#나이와 월급의 관계 분석하기
#1.나이에 따른 월급 평균표 만들기
age_income <- welfare %>%
filter(!is.na(income)) %>%
group_by(age) %>%
summarise(mean_income = mean(income))
head(age_income)
#2.그래프 만들기
ggplot(data=age_income,aes(x=age,y=mean_income))+geom_line()
#연령대에 따른 월급 차이
#분석 절차
#1.변수 검토 및 전처리 : 연령대, 월급
#2. 변수 간 관계 분석 : 연령대별 월급 평균표 만들기, 그래프 만들기
welfare <- welfare %>%
mutate(ageg = ifelse(age<30, "young",
ifelse(age <= 59, "middle", "old")))
table(welfare$ageg)
qplot(welfare$ageg)
#연령대에 따른 월급 차이 분석
#1.연령대별 월급 평균표 만들기
ageg_income <- welfare %>%
filter(!is.na(income)) %>%
group_by(ageg) %>%
summarise(mean_income = mean(income))
ageg_income
#2.그래프만들기
ggplot(data=ageg_income,aes(x=ageg,y=mean_income))+geom_col()
#성별 평균 연령표
#연령대 및 성별 월급 평균표 만들기
sex_income<-welfare%>%
filter(!is.na(income))%>%
group_by(ageg,sex)%>%
summarise(mean_income=mean(income))
sex_income
#그래프 만들기
ggplot(data=sex_income, aes(x=ageg,y=mean_income,fill=sex))+geom_col()+scale_x_discrete(limits=c("young","middle","old"))
#성별 막대 분리
ggplot(data = sex_income, aes(x = ageg, y=mean_income, fill=sex)) +
geom_col(position="dodge") + # 동일코드지만 옵션만 추가(스택차트가 아닌 그룹차트 생성)
scale_x_discrete(limits = c("young", "middle", "old"))
#나이 및 성별 월급 차이 분석
#성별 연령별 월급 평균표 만들기
sex_age<-welfare%>%
filter(!is.na(income))%>%
group_by(age,sex)%>%
summarise(mean_income=mean(income))
sex_age
#라인차트
ggplot(data = sex_age,aes(x=age,y=mean_income, col=sex))+geom_line()
':: IT > R' 카테고리의 다른 글
[빅데이터] 전처리 작업, 오라클 연결, xml/json 다루는 방법, Markdown (0) | 2020.04.07 |
---|---|
[빅데이터]20200402 데이터 전처리 (0) | 2020.04.06 |
[빅데이터] 텍스트 마이닝, 등 (0) | 2020.04.03 |
[빅데이터] 20200331 RStudio 설치, plot, 워드클라우드 (0) | 2020.03.31 |
[빅데이터] 20200330 R 정의, 설치, 시각화 (2) | 2020.03.30 |