기본 콘텐츠로 건너뛰기

4.2.1 R 결측치 처리 방법

2장. R 기본 2단계

2장. R 기본 2단계


  • 1단계에서 다루었던 내용에 대해서 복습을 합니다.
  • 결측치처리 방법에 대해서 다룹니다.
  • 이상치 관측 방법에 대해서 다룹니다.
  • 문자열 데이터를 다루는 법에 대해서 다룹니다.
  • 변수 간의 상관성 분석에 대해서 다룹니다.

데이터 다운로드 링크: https://www.kaggle.com/PromptCloudHQ/imdb-data

Ch1. IMDB_MOVIE_DATA_SET 데이터 불러오기

# 데이터 불러오기
DATA=read.csv("C:\\R/IMDB-Movie-Data.csv")

# 데이터 구조 파악
str(DATA)
## 'data.frame':    1000 obs. of  12 variables:
##  $ Rank              : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ Title             : Factor w/ 999 levels "(500) Days of Summer",..: 288 569 656 636 674 780 403 471 834 538 ...
##  $ Genre             : Factor w/ 207 levels "Action","Action,Adventure",..: 12 86 196 93 8 8 117 109 3 75 ...
##  $ Description       : Factor w/ 1000 levels "\"21\" is the fact-based story about six MIT students who were trained to become experts in card counting and s"| __truncated__,..: 97 538 881 606 218 520 123 109 276 238 ...
##  $ Director          : Factor w/ 644 levels "Aamir Khan","Abdellatif Kechiche",..: 266 519 392 106 137 641 123 559 265 449 ...
##  $ Actors            : Factor w/ 996 levels "Aamir Khan, Anushka Sharma, Sanjay Dutt,Boman Irani",..: 185 737 419 659 972 650 810 314 154 456 ...
##  $ Year              : int  2014 2012 2016 2016 2016 2016 2016 2016 2016 2016 ...
##  $ Runtime..Minutes. : int  121 124 117 108 123 103 128 89 141 116 ...
##  $ Rating            : num  8.1 7 7.3 7.2 6.2 6.1 8.3 6.4 7.1 7 ...
##  $ Votes             : int  757074 485820 157606 60545 393727 56036 258682 2490 7188 192177 ...
##  $ Revenue..Millions.: num  333 126 138 270 325 ...
##  $ Metascore         : int  76 65 62 59 40 42 93 71 78 41 ...
head(DATA)
##   Rank                   Title                    Genre
## 1    1 Guardians of the Galaxy  Action,Adventure,Sci-Fi
## 2    2              Prometheus Adventure,Mystery,Sci-Fi
## 3    3                   Split          Horror,Thriller
## 4    4                    Sing  Animation,Comedy,Family
## 5    5           Suicide Squad Action,Adventure,Fantasy
## 6    6          The Great Wall Action,Adventure,Fantasy
##                                                                                                                                                                                                                      Description
## 1                                                                                                A group of intergalactic criminals are forced to work together to stop a fanatical warrior from taking control of the universe.
## 2                                                                                                Following clues to the origin of mankind, a team finds a structure on a distant moon, but they soon realize they are not alone.
## 3                                                                  Three girls are kidnapped by a man with a diagnosed 23 distinct personalities. They must try to escape before the apparent emergence of a frightful new 24th.
## 4 In a city of humanoid animals, a hustling theater impresario's attempt to save his theater with a singing competition becomes grander than he anticipates even as its finalists' find that their lives will never be the same.
## 5                                            A secret government agency recruits some of the most dangerous incarcerated super-villains to form a defensive task force. Their first mission: save the world from the apocalypse.
## 6                                                                             European mercenaries searching for black powder become embroiled in the defense of the Great Wall of China against a horde of monstrous creatures.
##               Director
## 1           James Gunn
## 2         Ridley Scott
## 3   M. Night Shyamalan
## 4 Christophe Lourdelet
## 5           David Ayer
## 6          Yimou Zhang
##                                                                       Actors
## 1                       Chris Pratt, Vin Diesel, Bradley Cooper, Zoe Saldana
## 2    Noomi Rapace, Logan Marshall-Green, Michael Fassbender, Charlize Theron
## 3           James McAvoy, Anya Taylor-Joy, Haley Lu Richardson, Jessica Sula
## 4 Matthew McConaughey,Reese Witherspoon, Seth MacFarlane, Scarlett Johansson
## 5                         Will Smith, Jared Leto, Margot Robbie, Viola Davis
## 6                              Matt Damon, Tian Jing, Willem Dafoe, Andy Lau
##   Year Runtime..Minutes. Rating  Votes Revenue..Millions. Metascore
## 1 2014               121    8.1 757074             333.13        76
## 2 2012               124    7.0 485820             126.46        65
## 3 2016               117    7.3 157606             138.12        62
## 4 2016               108    7.2  60545             270.32        59
## 5 2016               123    6.2 393727             325.02        40
## 6 2016               103    6.1  56036              45.13        42
  • 변수 설명
    • Rank
    • Title : 영화 제목
    • Genre : 영화 장르
    • Description : 영화 설명
    • Director : 감독명
    • Actors : 배우
    • Year : 영화 상영 년도
    • Runtime..Minutes : 상영시간
    • Rating : Rating 점수
    • Votes : 관객 수
    • Revenue..Millions : 수익
    • Metascore : 메타 스코어

Ch2. 결측치 처리

결측치(Missing Value)는 말 그대로 데이터에 값이 없는 것을 뜻합니다. 줄여서 'NA'라고 표현하기도 하고, 다른 언어에서는 Null 이란 표현을 많이 씁니다. 결측치는 데이터를 분석하는데에 있어서 매우 방해가 되는 존재입니다. 결측치는 다음과 같은 문제를 야기합니다.

  • 결측치를 다 제거할 경우, 막대한 데이터 손실을 불러일으킬 수 있습니다.
  • 결측치를 잘못 대체할 경우, 데이터에서 편향(bias)이 생길 수가 있습니다.
  • 결측치를 처리하는 데에 있어 분석가의 견해가 가장 많이 반영되며, 이 때문에 잘못될 경우 분석결과가 매우 틀어질 수도 있다.
  • 결측치를 자세히 처리하기 위해서는 시간이 많이 투자되어야 합니다. 무엇보다, 데이터에 기반한 결측치 처리가 진행되어야 분석을 정확하게 진행할 수 있습니다.
# 결측치 확인
is.na(DATA$Metascore)[1:100] # Metascore 변수 내에서 결측치 논리문 판단 (True, False) , 1 ~ 100번째 값만 관찰
##   [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [23] FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE
##  [34] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE
##  [45] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [56] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [67] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [78] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [89] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [100] FALSE
sum(is.na(DATA$Metascore)) # Metascore 변수 내에 결측치 갯수
## [1] 64
colSums(is.na(DATA)) # DATA 내 모든 변수별 결측치 갯수
##               Rank              Title              Genre 
##                  0                  0                  0 
##        Description           Director             Actors 
##                  0                  0                  0 
##               Year  Runtime..Minutes.             Rating 
##                  0                  0                  0 
##              Votes Revenue..Millions.          Metascore 
##                  0                128                 64
# 결측치 전부 삭제
# 가장 극단적인 방법, 결측치가 하나라도 포함된 obs(행)은 삭제
DATA2 = na.omit(DATA) 
colSums(is.na(DATA2))
##               Rank              Title              Genre 
##                  0                  0                  0 
##        Description           Director             Actors 
##                  0                  0                  0 
##               Year  Runtime..Minutes.             Rating 
##                  0                  0                  0 
##              Votes Revenue..Millions.          Metascore 
##                  0                  0                  0
# 특정 변수에 결측치가 존재하는 행 삭제
# 12번째 변수에 해당되는 MetaScore가 결측치인 obs(행) 모두 제거
DATA3 = DATA[complete.cases(DATA[ ,12]),]
colSums(is.na(DATA3))
##               Rank              Title              Genre 
##                  0                  0                  0 
##        Description           Director             Actors 
##                  0                  0                  0 
##               Year  Runtime..Minutes.             Rating 
##                  0                  0                  0 
##              Votes Revenue..Millions.          Metascore 
##                  0                 98                  0
# 결측치 대체 
DATA$Metascore2=DATA$Metascore
DATA$Metascore2[is.na(DATA$Metascore2)]=58.99 # is.na가 True인 값들에 대해 58.99 지정

# 결측치 신경 안쓰고 계산하기
mean(DATA$Revenue..Millions.) # NA 생성
## [1] NA
mean(DATA$Revenue..Millions.,na.rm = TRUE) # NA 생략하고 계산
## [1] 82.95638
  • 데이터를 다룰 때, 기본적으로 raw data는 절대 건드리는 것이 아닙니다.

  • 보통의 경우, 데이터를 새로 복사를 해두고 진행을 하는 것이 나중을 위해 매우 좋은 습관이 됩니다.

  • 결측치를 대체하는 방법은 다음과 같습니다.

    • 가장 기본적인 방법
    • 연속형 변수 : 평균으로 대체
    • 이산형 변수 : 최빈값으로 대체

    하지만 이렇게 무턱대고 결측치를 대체하는 경우에는 데이터가 심하게 쏠릴 수가 있습니다. 결측치를 대체할 때는 항상 다음의 사항들을 확인해야 됩니다.

    • 결측치의 비율
    • 데이터의 분포
    • 다른 변수와의 관계가 있는지

    데이터를 분석 할 때, 항상 데이터의 분포를 확인하고 진행을 해야됩니다. 데이터가 평균을 중심으로 균형있게 퍼져있는 '정규분포'형태를 뛰고 있는 경우는 모르지만, 현실의 대부분 데이터는 그렇게 이상적이지는 않기 때문입니다. 다음의 그래프를 보면서 확인해보겠습니다.

summary(DATA$Revenue..Millions.)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##    0.00   13.27   47.98   82.96  113.72  936.63     128
library(ggplot2)

ggplot(DATA,aes(x=Revenue..Millions.)) +
  geom_histogram(fill='royalblue') +
  ylab('') +
  xlab("Revenue_Millions")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 128 rows containing non-finite values (stat_bin).
  • Revenu_Millions를 볼 때 데이터가 한쪽으로 매우 치우쳐져 있습니다.
  • 이런 분포는 항상 평균과 중위수의 차이를 확인해봐야합니다. (평균: 82.96, 중위수: 47.98)
    • 따리서, 이런 분포의 데이터의 결측치는 평균으로 대체하면 매우 위험합니다.
    • 평균은 극단값(Outlier)에 영향을 받기 때문입니다. 극단값은 패턴을 벗어난 특수한 상황이지, 결코 일반적인 상황을 대변해주지 않습니다.

그럼 어떻게 해야하는가?

  • 평균보다는 중위수가 안전합니다. 중위수는 극단값(Outlier)에 영향을 받지 않기 때문입니다.
  • 그렇다고 해도, 중위수로 대체 하는 것은 차선책이지 완벽한 방법은 아닙니다.
  • 다른 변수들과의 관계를 보면서 대체하는 것이 많은 시간을 요구하지만, 더 정교한 분석결과를 뽑아낼 수 있습니다.
    • 다른 변수들을 정리해보고 더 자세한 결측치 대체방법을 다루도록 해보겠습니다.

이 블로그의 인기 게시물

6.1.2 고수들이 자주 쓰는 R코드 소개 2편 [중복 데이터 제거 방법]

Ch2. 중복데이터 제거하기 및 데이터 프레임 정렬 Ch2. 중복데이터 제거하기 및 데이터 프레임 정렬 흔하지는 않지만, 중복으로 입력되는 데이터 셋을 마주치는 일이 생기기 마련입니다. 보통 중복데이터는 데이터 수집단계에서 많이 발생합니다. 하지만 이를 하나하나 엑셀로 처리하는 것은 한계가 있기때문에, R에서 처리하는 방법에 대해 다루어 보고자 합니다. 1차원 벡터, 리스트에서의 중복 제거 A = rep(1:10, each = 2) # 1 ~ 10까지 2번씩 반복 print(A) ## [1] 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 # 중복 제거 unique(A) ## [1] 1 2 3 4 5 6 7 8 9 10 데이터 프레임에서의 중복 제거 다음과 같은 데이터 프레임을 예시로 삼겠습니다. 변수 설명 OBS : 번호 NAME : 환자 이름 ID : 환자 고유번호 DATE : 검사 날짜 BTW : Body total water 먼저, 환자 이름이 있고, 그 환자의 고유 ID가 있습니다. 세상에 동명이인은 많기 때문에 항상 고유 ID를 기록해둡니다. # 데이터 불러오기 DUPLICATE = read.csv("C:/R/DUPLICATED.csv") DUPLICATE ## OBS NAME ID DATE BTW ## 1 1 A A10153 2018-11-30 1 ## 2 2 A A10153 2018-11-30 3 ## 3 3 B B15432 2018-11-30 4 ## 4 4 A A15853 2018-11-29 5 ## 5 5 C C54652 2018-11-28 5 ## 6 6 C C54652 2018-11-27 6 ## 7 7 D D14

4.4.1 R 문자열(TEXT) 데이터 처리하기 1

Ch4. 문자열 데이터 다루기 1 데이터 다운로드 링크: https://www.kaggle.com/PromptCloudHQ/imdb-data # 데이터 불러오기 DATA=read.csv("C:\\R/IMDB-Movie-Data.csv") Ch4. 문자열 데이터 다루기 1 이번에는 문자열 데이터를 처리하는 방법에 대해 다루겠습니다. 문자열을 다룰 때 기본적으로 숙지하고 있어야 하는 명령어는 다음과 같습니다. 문자열 대체 : gsub() 문자열 분리 : strsplit() 문자열 합치기 : paste() 문자열 추출 : substr() 텍스트마이닝 함수: Corpus() & tm_map(), & tdm() # 문자열 추출 substr(DATA$Actors[1],1,5) # 첫번째 obs의 Actors변수에서 1 ~ 5번째에 해당하는 문자열 추출 ## [1] "Chris" # 문자열 붙이기 paste(DATA$Actors[1],"_",'A') # 첫번째 obs의 Actors변수에서 _ A 붙이기, 기본적으로 띄어쓰기르 구분 ## [1] "Chris Pratt, Vin Diesel, Bradley Cooper, Zoe Saldana _ A" paste(DATA$Actors[1],"_",'A',sep="") # 띄어쓰기 없이 붙이기 ## [1] "Chris Pratt, Vin Diesel, Bradley Cooper, Zoe Saldana_A" paste(DATA$Actors[1],"_","Example",sep="|") # |로 붙이기 ## [1] "Chris Pratt, Vin Diesel, Bradley Cooper, Zoe Saldana|

3. Resampling 방법론(Leave one out , Cross Validation)

Ch4. Resampling 방법론 이전 챕터에서는 앙상블에 대해 다루었습니다. 앙상블을 요약하자면, Training Set을 Resampling할 때 마다, 가중치를 조정할 것인지 말 것인지를 다루는 내용이었습니다. 이번에는 구체적으로 Resampling 방법들에 대해 다루어 보고자 합니다. 1. Resampling의 목적과 접근 방식 모형의 변동성(Variability)을 계산하기 위해서 입니다. Training Set으로 모형을 만들고, Test Set으로 Error rate를 계산하며, 이를 반복합니다. 각 실행 별, Error Rate 값이 계산이 될 것이며, 해당 Error rate의 분포를 보고 모형의 성능을 평가할 수 있습니다. Model Selection : 모형의 성능을 Resampling 방법론을 통해 평가한다면, 모델링 과정에서 어떤 변수를 넣어야 하고, 혹은 모형의 유연성(Flexibility)을 어느정도로 조절하는 것이 적당한지 결정을 할 수 있기 때문에 매우 중요한 방법론 중 하나입니다. 모형의 유연성에 대해서는 다음 챕터에서 설명하도록 하겠습니다. 2. Leave-One-Out Cross Validation(LOOCV) LOOCV는 n개의 데이터에서 1개를 Test Set으로 정하고 나머지 n-1개의 데이터로 모델링을 하는 방법을 의미합니다. LOOCV 방법은 데이터 수 n이 크다면, n번의 모델링을 진행해야되기 때문에, 시간이 오래 걸립니다. 회귀, 로지스틱, 분류모형 등에 다양하게 적용할 수 있습니다. 3. K - Fold Cross - Validation 연산시간이 오래걸린 다는 것은 곧, 작업시간이 길어진다는 의미이며 이는 곧 야근을 해야된다는 소리와 다를게 없어집니다. 그래서 시간이 오래걸리는 LOOCV를 대채하기 위하여 K-Fold Cross - Validation이 존재합니다. 위 그림은 데이터 셋을 총 4개의 Set로 구성하였습니다. Cross -

4. 통계적 추정(점추정,구간추정)

Ch1. 점추정 추정량은 우리가 알고 싶어하는 모수를 표본들을 이용하여 단 하나의 점으로 추측하는 통계량입니다. 그 과정을 점추정(Point estimation)이라고 하며, 그렇게 얻어진 통계량을 점주청량(Point estimator)라고 합니다. 점추정량은 다양한 방식으로 구할 수 있습니다. 모평균을 추정하기 위한 표본평균 계산 각 끝의 일정 부분씩은 무시하고 나머지 표본들의 평균 계산(절삭 평균, Trimmed Mean) 등의 방법들이 있습니다. 하지만 가장 많이 쓰는 척도는 표본평균입니다. 그 이유는 대표적으로 수리적인 확장성과 표본평균의 분포를 비교적 쉽게 알 수 있다는 점을 들 수 있습니다. 점추정은 단순히 모평균을 추정하는 것만이 아닌, 회귀식을 추정하였을 때의 회귀계수도 점추정이라고 할 수 있습니다. (회귀분석은 후에 다룰 예정입니다.) 다만, 이런 점추정에도 몇 가지의 장점과 단점이 있습니다. 점추정의 장점 점추정량은 지극히 직관적이다. 통계를 모르는 누군가가 한국의 30대 여성의 평균 수입을 묻는다면 점추정량으로 즉각적인 답을 줄 수 있을 것입니다. 점추정량은 매우 직관적이며 합리적입니다. 점추정량은 우리가 원하는 수치를 대체할 구체적인 값을 제시해준다. 우리가 통계적인 모델링 혹은 함수를 작성하기 위해 30대 여성 수입의 평균치가 필요하나 모평균을 알 수 없을 때 점추정량으로 간단히 대체할 수 있습니다. 사실상 이는 대부분에 통계이론을 전개하는데 가장 중요한 역할을 합니다. 간단한 예를 말씀드리자면 모분산을 추정하기 위해서는 평균이 필요하기 때문에 표본평균을 이용합니다. 여기서 분산은 각 개별 값들이 평균에서 얼만큼 멀리 떨어져있는지에 대한 척도입니다. 그런데 우리는 '진짜 평균'을 알 수 없으니 아래 식과 같이 표본들의 평균으로 대체하는 것입니다. 여기서 평균 값을 표본평균으로 대체하였기에 표본분산은 n이 아닌 n-1으로 나누어 주게 됩니다. 이해를 돕기 위해 자유도에 대한 개념을 잠깐 다루도록 하

3.2.3 R 시각화[ggplot2] 2편 (히스토그램, 밀도글래프, 박스플롯, 산점도)

R 데이터 시각화 2편 R 데이터 시각화 2편 데이터 다운로드 링크: https://www.kaggle.com/liujiaqi/hr-comma-sepcsv # 시각화 이전에 처리 되어 있어야 하는 시각화 DATA = read.csv('C:/R/HR_comma_sep.csv') DATA$left = as.factor(DATA$left) DATA$Work_accident = as.factor(DATA$Work_accident) DATA$promotion_last_5years = as.factor(DATA$promotion_last_5years) 히스토그램(Histogram) [연속형 변수 하나를 집계 내는 그래프, 1차원] 히스토그램은 연속형변수를 일정 범위로 구간을 만들어, x축으로 설정하고 y축은 집계된 값(Counting)을 나타내는 그래프입니다. library(ggplot2) # 기본 ggplot(DATA,aes(x=satisfaction_level))+ geom_histogram() ## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`. # 구간 수정 및 색 입히기 ggplot(DATA,aes(x=satisfaction_level))+ geom_histogram(binwidth = 0.01,col='red',fill='royalblue') # col은 테두리, fill은 채우기 밀도그래프(Density Plot)[연속형 변수 하나를 집계 내는 그래프, 1차원] 밀도그래프는 연속형변수를 일정 범위로 구간을 만들어, x축으로 설정하고 y축은 집계된 값(percentage)을 나타내는 그래프입니다. # 기본 ggplot(DATA,aes(x=satisfaction_level))+ geom_density() # 색 입히기 ggplot(DATA,a