데이터프레임 기초

##데이터 프레임 만들기

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()

 

+ Recent posts