Search

데이터 분석하기

결측치 확인하기

결측치를 확인하기 위해 결측치 NA가 포함된 샘플 데이터를 생성한다. “ “의 NA표현은 문자열을 의미하는 것에 주의하자.
> # 결측치 NA가 포함된 샘플 데이터를 생성한다. > sample = data.frame(id=c(NA,"id002","id003","id004","id005"),math=c(89,70,NA,97,100)) > sample id math 1 <NA> 89 2 id002 70 3 id003 NA 4 id004 97 5 id005 100
R
복사
결측치를 확인하기 위해 is.na()함수를 이용한다. 결측치인 데이터에 TRUE값을 반환하고 그 외는 FALSE를 반환할 것이다.
# is.na()를 사용해서 결측치를 확인한다. is.na(sample)
R
복사
table()함수를 이용하면 컬럼별 결측치의 개수를 확인할 수 있다.
# table함수를 사용해서 컬럼별 결측치의 개수를 확인한다. table(is.na(sample) FALSE TRUE 8 2 # id 변수에서 결측치 확인 table(is.na(sample$id)) FALSE TRUE 4 1 # math변수에서 결측치 확인 table(is.na(sample$math)) FALSE TRUE 4 1
R
복사
필요에 따라서 함수의 옵션에 결측치를 제거하는 옵션을 활용할 수 있다.
# 기본 > mean(sample) [1] NA Warning message: In mean.default(sample) : 인자가 수치형 또는 논리형이 아니므로 NA를 반환합니다 max(sample) Error in FUN(X[[i]], ...) : only defined on a data frame with all numeric-alike variables > min(sample) Error in FUN(X[[i]], ...) : only defined on a data frame with all numeric-alike variables # 결측치 제거 옵션 설정 # 결측치 제거 옵션 설정 mean(sample$math, na.rm=T) max(sample$math, na.rm=T) min(sample$math, na.rm=T)
R
복사
결측치를 처리하는 방법에는 결측치를 제거하는 방법 대체하는 방법이 있다.
결측치를 제거하는 방법에는 크게 두가지가 있다. 첫번째는 전체 데이터개수에 비해 아주 일부일 경우에는 해당 행을 제거할 수 있다. 두번째는 특정 변수에서만 결측치가 발생할 경우에는 해당 변수를아예 제거하는 방법이다.
해당 행을 제거할 때는 is.na() 함수를 사용해서 그 위치를 찾아낸 뒤 제거한다.
# 결측치 포함된 행 제거 sample_omit1 = sample[!is.na(sample$id),] # id에서 발생한 결측치를 제거하고 객체에 할당 sample_omit1 id math 2 id002 70 3 id003 NA 4 id004 97 5 id005 100 sample_omit2 = sample_omit1[!is.na(sample_omit1$math),] # math에서 발생한 결측치를 제거하고 객체에 할당 sample_omit2 id math 2 id002 70 4 id004 97 5 id005 100
R
복사
na.omit() 함수를 사용하면 결측치가 발생한 전체행을 제거할 수 있다.
# 기본 함수 사용해서 객체에 할당 # na.omit 함수 사용해서 결측치 포함한 전체 행 제거 sample_omit3 = na.omit(sample) sample_omit id math 2 id002 70 4 id004 97 5 id005 100
R
복사

결측치 대체하기

결측치를 처리하는 두 번째 방법은 특정 값으로 대체하는 것이다. 기본적으로 평균, 최솟값, 최댓값으로 대체할 수 있고 경우에 따라서는 데이터를 예측해서 대체할 수도 있다.
먼저, 대표적인 평균으로 대체하는 방법을 보겠다. 결측치가 있기 때문에 na.rm=TRUE 로 지정해준다.
# 결측치 평균으로 대체 # 결측치 평균으로 대체하기, na.rm=TRUE 로 지정하기 math_avg_abn = mean(sample$math, na.rm=TRUE) math_avg_abn [1] 89 sample[is.na(sample$math),2] = math_avg_abn sample id math 1 <NA> 89 2 id002 70 3 id003 89 4 id004 97 5 id005 100
R
복사

이상치 처리하기

논리적으로 존재할 수 없는 이상치 처리하기

가장 쉽게 이상치를 처리하는 방법은 제거하는 것이다. 하지만 작은 규모의 데이터에서는 이런 경우 위험할 수 있다. 따라서 때로는 이상치를 다른 값으로 대체하기도 한다. 이상치를 다른 값으로 대체할 때는 데이터의 이해도에 따라서 분석모델의 성능이 좌우되는 것은 당연하다.
경우에 따라서는 해당 데이터들을 분리해서 분석하는 경우도 있다. 기존의 분석 문제와 별개의 또 다른 주제가 생길 수도 있기 때문이다.

이상치 찾기

이상치를 찾으려면 데이터를 탐색하면서 논리적으로 올 수 없는 데이터가 담겨있는지 확인해야 한다.
#2. 이상치 처리하기 # 이상치 찾기 sample <- data.frame(id=c("id001","id002","id003","id004","id005","id006"), sex = c("m","f","f","c","m","f"), math = c(89,70,85,97,100,120))
R
복사
이상치를 확인할 때 데이터셋이 커지면서 작업자에 의해 발생하는 오류가 분석에 방해가 된다.
빈도표를 작성해서 데이터를 좀 더 쉽게 확인해보자.
# 빈도표로 데이터 확인하기 # 성별 빈도표 table(sample$sex) c f m 1 3 2 # 수학 점수 빈도표 table(sample$math) 70 85 89 97 100 120 1 1 1 1 1 1
R
복사
논리적으로 올 수 없는 이상치를 제거해보겠다.
# 성별의 'c' 값과 수학점수의 120이 논리적으로 이상치이기 때문에 제거해보겠다. # 성별의 이상치 제거 sample_omit = sample[sample$sex!='c',] sample_omit id sex math 1 id001 m 89 2 id002 f 70 3 id003 f 85 5 id005 m 100 6 id006 f 120 # 수학성적의 이상치 제거 sample_omit = sample_omit[sample_omit$math <= 100,] sample_omit id sex math 1 id001 m 89 2 id002 f 70 3 id003 f 85 5 id005 m 100
R
복사

논리적으로 존재할 수 있는 이상치 처리하기

논리적으로 존재하는 데이터임에도 불구하고 이상치가 존재할 수 있다. 이런값들을 극단값이라고 부른다. 극단값을 찾기위해서 상자그림을 활용한다.
# 30명의 수학 성적 데이터 입력 score = c(71,67,69,76,63, 67,59,68,76,66, 70,67,68,72,71, 73,73,68,72,67, 62,69,76,69,68, 30,55,100,95,90) boxplot(score)
R
복사
제 1사분위수와 제 3 사분위수를 기준으로 1.5배만큼 떨어진 곳은 inner face, 3배만큼 떨어진 곳은 outer face라고 한다. 보통 inner face와 outer face 사이에 위치한 데이터들을 ‘보통 이상치’ 라고 하고 outer face 밖에 위치한 데이터를 ‘극단 이상치’라고 한다.
inner face 안쪽에 위치한 정상 데이터 중에서 inner face와 가장 가까운 데이터가 인접값이며 위쪽과 아래쪽 모두 존재한다.
극단값 경계를 구하려면 우선 quantile()함수를 사용해서 제 1사분위수와 제 3사분위수를 계산해야 한다.
극단값 경계선 상한 : Q3 + 1.5 * IQR
극단값 경계선 하한 : Q1 - 1.5 * IQR
> # quantile()함수 사용해서 제 1사분위수와 제 3사분위수 구하기 > Q1 = quantile(score,probs=0.25) # 제 1사분위수 > Q1 25% 67 Q3 = quantile(score, probs=0.75) # 제 3사분위수 Q3 75% 72.75 IQR = Q3-Q1 IQR 75% 5.75 > LC = Q1 - 1.5*IQR > UC = Q3 + 1.5*IQR > UC 75% 81.375 > LC 25% 58.375
R
복사
극단값 경계선을 초과하거나 미달하는 데이터를 제외한 나머지 데이터만 추출한다.
score_adj = score[score > LC & score < UC] score_adj [1] 71 67 69 76 63 67 59 68 76 66 70 67 68 72 71 73 73 68 72 67 62 69 76 69 68
R
복사

피처 엔지니어링

피처 엔지니어링은 기존에 존재하는 변수를 활용해서 새로운 정보를 추가로 생성하는 과정을 말한다.
대표적으로는 변수의 단위를 변환하기 위한 스케일 조정 방식연속형 변수를 범주형 변수로 또는 범주형 변수를 연속형 변수로 변환하는 방법이 있다. 또는 특정 변수의 존재 유무를 0과 1로 표현하는 더미 변수를 생성할 수도 있다.
날짜 데이터인 경우에는 날짜 변수를 주말과 평일로 구분하거나 시간 데이터를 오전과 오후라는 새로운 변수를 추가해서 활용하는 방법 등이 있다.

새로운 파생변수 생성하기

# 새로운 파생변수 생성하기 # 실습파일 score 불러오기 score = read.csv("score.csv") score 癤퓁d sex math kor 1 id001 m 89 100 2 id002 f 70 60 3 id003 f 85 77 4 id004 c 97 60 5 id005 m 100 120 6 id006 f 120 50
R
복사
csv 파일을 읽을 때 첫 번째 칼럼의 이름이나 첫 번째 데이터의 문자가 깨지는 경우가 있다. 해결방법은 read.csv 내의 fileEncoding=”UTF-8-BOM” 으로 지정해서 BOM형식을 확인하도록 선언해준다.
score = read.csv("score.csv", fileEncoding="UTF-8-BOM") > score id sex math kor 1 id001 m 89 100 2 id002 f 70 60 3 id003 f 85 77 4 id004 c 97 60 5 id005 m 100 120 6 id006 f 120 50
R
복사
새로운 파생변수인 합계와 평균을 추가해보자.
# 파생변수 total 생성하기 > # 파생변수인 합계와 평균을 추가하기 > score$total = score$math + score$kor > score id sex math kor total 1 id001 m 89 100 189 2 id002 f 70 60 130 3 id003 f 85 77 162 4 id004 c 97 60 157 5 id005 m 100 120 220 6 id006 f 120 50 170 # 파생변수 avg 생성하기 > score$avg = (score$math + score$kor) / 2 > score id sex math kor total avg 1 id001 m 89 100 189 94.5 2 id002 f 70 60 130 65.0 3 id003 f 85 77 162 81.0 4 id004 c 97 60 157 78.5 5 id005 m 100 120 220 110.0 6 id006 f 120 50 170 85.0 # 평균이 80점 넘으면 'PASS', 못 넘으면 'FAIL'라고 평가하는 파생변수 생성 # ifelse() 함수 사용 > score$result = ifelse(score$avg > 80, 'PASS', 'FAIL') > score id sex math kor total avg result 1 id001 m 89 100 189 94.5 PASS 2 id002 f 70 60 130 65.0 FAIL 3 id003 f 85 77 162 81.0 PASS 4 id004 c 97 60 157 78.5 FAIL 5 id005 m 100 120 220 110.0 PASS 6 id006 f 120 50 170 85.0 PASS
R
복사
# result 파생변수를 table함수를 사용해서 한눈에 정리 table(score$result) FAIL PASS 2 4 > # 성별에 따라 pass와 fail을 받은 학생 수 한눈에 정리 > table(score$sex, score$result) FAIL PASS c 1 0 f 1 2 m 0 2
R
복사

분석 주제 구체화하기

분석에 필요한 데이터를 수집한 후 탐색적 데이터 분석 과정을 수행하면서 데이터 분석 문제를 어떻게 해결할 수 있는지 이해한다.
문제를 구체화하기 위해서 데이터를 다양한 형태로 처리하는 과정은 반드시 필요하다.
탐색적 데이터 분석에서의 시각화는 크게 두가지 역할을 한다. 첫 번째는 데이터의 패턴을 도출하고 다양한 가설을 세우기 위해 사용하는 것이고 두 번째는 분석 과정에서 얻은 다양한 인사이트를 사람들이 이해하기 쉽도록 사용하는 보조 도구로 활용하는 것이다.
탐색적 데이터 분석은 수많은 데이터 중에서 분석의 목적에 맞는 변수가 있는지, 이 변수는 어떻게 구성되어 있는지 파악하는 과정이다.
탐색적 데이터 분석은 전체 데이터 분석 프로세스 중 한 단계다.
탐색적 데이터 분석은 다음과 같은 순서로 진행된다.
1.
결측치나 이상치를 처리한다.
2.
독립된 변수의 데이터 분포를 확인한다.
3.
두 개 이상의 변수 간의 관계를 확인한다. ( 산점도,..) (군집성, 선형성 등등)
4.
분석 주제를 구체화한다.

데이터 분석 수행하기

통계적 가설 검정을 할 수도, 기계 학습을 통한 예측과 분류일 수도 있다. 또 얼마나 쉽게 전달하는지를 좌우하는 시각화 기법도 포함한다.

통계적 가설 검정

데이터 분석을 할 때는 “분석 결과가 이익을 가져올 수 있는가” 에 초점을 맞춰야 한다.
예를들어 어떤 요인에 의해 우리 서비스를 통해 이익이 창출될 것인지, 요인을 변화시키는 것이 가능한지, 비용 대비 순이익이 남는지에 대한 정보가 필요하다.

기계 학습

기계 학습은 학습 방식에 따라 크게 3가지로 분류된다. 분류나 수치를 예측하기 위한 목적인 지도학습, 군집을 통해 특정 집단을 세분화하기 위한 목적으로 사용하는 비지도 학습 그리고 보상과 벌점을 통해 최적화된 목표를 찾기 위한 목적으로 사용하는 강화 학습이다.
지도학습 : 정답지를 제공하고 학습시키는 방법. 분류모형이나 회귀모형 등에 활용
비지도학습 : 정답지 없이 학습시키는 방법. 유사한 속성을 찾아 분류하는데 활용. 분류하는 방법으로는 크러스터 분석(군집 분석)이나 연관 규칙이 있다.
강화 학습 : 주어진 환경 내에서 보상을 최대한 많이 받도록 에이전트를 학습하는 것이다. 입력과 출력이라는 개념보다는 행동과 환경, 보상 이라는 개념을 활용한다는 차이점이 있다.
데이터의 규모가 커서 사용이 어려울 경우에 차원을 축소하여 데이터를 활용할 수도 있다. 대표적인 방법으로는 주성분 분석이나 커널 PCA 등이 있다.

시각화

동일한 통계량이지만 시각화를 했을 때 전혀 다른 데이터라는 것을 확인할 수 있다. 이 점이 시각화의 중요성을 나타낸다. “요약 통계만을 맹신하지 말고 데이터를 시각화하라”