목차
- 결측값
- 특이값
- 데이터 정렬
- 데이터 분리와 선택
- 데이터 샘플링과 조합
- 데이터 집계와 병합
데이터 전처리란 수집한 원본(raw) 데이터를 분석이 가능하거나 용이한 형태로 변형 가공하는 작업을 말한다.
데이터 전처리는 모든 데이터 분석의 시작이며 반드시 거치는 과정이다.
데이터 전처리의 목적은 데이터 품질의 향상을 위함이며, 데이터 품질이 낮으면 분석 기법이나 도구가 아무리 훌륭해도 좋은 분석 결과를 얻기 못한다.
데이터 품질 문제를 야기하는 요인으로는 측정 오류와 수집 과정의 오류가 있다.
측정 오류는 실수로 잘못된 기록을 하거나 측정 장비 자체의 결함 및 한계 등으로 발생한 오류이다.
수집 과정의 오류는 데이터의 손실이나 중복으로 발생한 오류이다.
1. 결측값
결측값(missing value)란 데이터를 수집하고 저장하는 과정에서 저장할 값을 얻지 못하는 경우 발생하는 값이다.
예를 들어 통계조사 응답자가 어떤 문항에 대해 응답을 안 했다고 하면, 그 문항의 데이터 값은 결측값이 되는 것이다.
쉽게 말해 결측값은 존재해야 하는 값인데 누락된 경우를 말한다.
데이터셋에 결측값이 섞여 있으면, 데이터 분석 시 여러 가지 문제를 발생시킨다.
따라서 결측값을 제거하거나 제외하고 데이터를 분석하거나, 결측값을 추정하여 적당한 값으로 치환한 후 데이터를 분석해야 한다.
우선 결측값의 특성과 존재 여부를 확인해 보면, 결측값이 포함된 벡터의 합계 계산이 안 되는 것을 확인할 수 있다.
해당 벡터에 결측값이 있는지 확인하려면 is.na() 함수를 활용하여 각 값이 NA인지 확인한다.
만약 결측값인 NA이면 TRUE를, 결측값이 아니면 FALSE를 반환한다.
is.na() 함수를 사용하여 얻어진 결과에 sum() 함수를 적용시키면 해당 벡터의 총 NA 개수를 확인할 수 있다.
또한 결측치가 포함되어 있는 벡터에서 결측치를 제외하고 합계 계산을 하고 싶다면 sum() 함수에서 na.rm 옵션을 TRUE로 적용시켜 주면 된다.
결측값이 포함된 벡터에서 해당 결측값을 다른 값으로 대체할 수도 있다.
is.na() 함수를 활용해 해당 벡터 값이 결측치인치 판단하고 이를 해당 벡터에 적용시켜 결측치인 값만 선택한다.
선택한 값을 특정 값으로 변환하면 해당 벡터에서 결측값을 다른 값으로 대체하게 된다.
결측값을 그냥 제거하고 새롭게 벡터를 구성하고 싶다면 na.omit() 함수를 활용하여 결측값을 제거하고 그 결과에 as.vector() 함수를 활용하여 새로운 벡터를 구성하면 된다.
벡터가 아닌 데이터프레임에 존재하는 결측치는 어떻게 처리해야 할까?
iris 데이터를 불러와 결측치를 임의로 지정한다.
데이터프레임의 열별 결측값을 확인하는 방법은 2가지가 있는데, 우선 for 문을 이용할 수 있다.
for 문을 활용하여 해당 데이터프레임의 각 열을 불러오고 불러온 열에 is.na() 함수를 적용시키면 불러온 열의 결측값 여부를 확인할 수 있다.
이후 열의 결측값 여부를 sum() 함수를 활용해 결측값 개수를 확인할 수 있다.
데이터프레임의 열별 결측값을 확인하는 또 다른 방법은 apply() 함수를 활용하는 방법이다.
열별 결측값의 개수를 구해줄 함수를 생성하고 생성한 함수를 apply() 함수를 활용해 해당 데이터프레임에 적용시켜 주면 각 column별 결측값의 개수를 확인할 수 있다.
반대로 데이터프레임의 행별 결측값을 확인할 때는 is.na() 함수를 활용하여 데이터프레임에서 각 행별 결측값 여부를 확인하고 해당 결과를 rowSums() 함수에 넣어 적용하면 데이터프레임의 행별 결측값의 개수를 확인할 수 있다.
데이터프레임의 행이 많아 결측값이 있는 행만 보려면 행별 결측값의 개수의 결과에서 값이 0보다 큰 값을 추출하면 된다.
추출한 결과를 sum() 함수에 넣으면 데이터프레임에서 결측값이 포함된 행의 개수를 확인할 수 있다.
데이터프레임에 is.na() 함수를 적용시키고 이를 sum() 함수에 넣은 결과는 해당 데이터프레임 전체에서 결측값의 개수를 의미한다.
데이터프레임에서 결측값을 처리하려면, complete.cases() 함수를 활용해 결측값이 없는 행에 대한 논리값을 얻은 후, 해당 결과를 데이터프레임 추출에서 ! 연산을 붙여 결측값이 있는 행들을 추출할 수 있다.
반면 complete.cases() 함수의 결과를 데이터프레임에 그대로 사용하면 결측값이 포함된 행들이 제거된다.
즉, 결측값이 없는 행들만 추출된다.
complete.cases() 함수는 결측치가 있는 행일 경우 FALSE를, 결측치가 없는 행일 경우 TRUE를 반환하기 때문이다.
2. 특이값
특이값(outlier)이란 정상적이라고 생각되는 데이터의 분포 범위 밖에 위치하는 값을 의미하며, 이상치라고도 한다.
특이값은 입력 오류에 의해 발생하기도 하고, 실제로 특이한 값일 수도 있다.
특이값을 포함하여 계산하면 전체 데이터의 양상을 파악하는 데 왜곡을 가져올 수 있으므로 분석할 때 특이값을 제외하는 경우가 많다.
특이값이 포함되어 있는지 여부를 확인할 때는 보통 논리적으로 있을 수 없는 값인지 찾아보거나, 상식을 벗어난 값이 있는지 찾아보거나, 상자그림(boxplot)을 통해 찾아볼 수 있다.
boxplot() 함수를 활용해 상자그림을 그리고 상자그림 밖의 점을 특이값이라고 한다.
boxplot.stats()의 out을 나타내면 특이값이 무엇인지 나타낸다.
boxplot.stats()의 out을 활용해 특이값을 추출하고 데이터에서 추출한 특이값을 지정하여 NA로 대체할 수도 있다.
NA로 대체를 하면 complete.cases()를 활용하여 NA가 포함된 행을 제거할 수도 있다.
3. 데이터 정렬
정렬(sort)은 데이터를 주어진 기준에 따라 크기순으로 재배열하는 과정을 의미한다.
order() 함수는 각 데이터를 크기순으로 나열했을 때 그 인덱스를 나타낸다.
sort() 함수는 각 데이터를 오름차순 한 결과를 나타낸다.
sort() 함수에서 decreasing 옵션을 T로 해주면 각 데이터를 내림차순 한 결과를 나타낸다.
매트릭스와 데이터프레임의 정렬은 우선 order() 함수를 활용하여 데이터를 오름차순으로 정렬했을 때 그 인덱스 값을 추출하고 추출한 인덱스 값을 매트릭스와 데이터프레임에 적용하면 행 단위로 정렬된다.
order() 함수에서도 decreasing 옵션을 T로 지정하면 내림차순으로 정렬했을 때 그 인덱스 값을 추출할 수 있다.
내림차순으로 정렬한 인덱스 값을 매트릭스와 데이터프레임에 적용시키면 해당 매트릭스와 데이터프레임을 정렬할 수 있다.
order() 함수로 정렬할 때 정렬 기준을 여러 개 지정할 수도 있다.
정렬할 기준을 여러 개 지정하면 해당 기준들을 바탕으로 매트릭스와 데이터프레임이 정렬된다.
기준을 여러 개 지정할 때는 기준을 순서대로 지정해야 한다.
앞에 적은 기준으로 먼저 정렬을 하고 뒤에 적은 기준은 앞에 적은 기준별 안에서 다시 정렬을 하게 된다.
기준에 -를 붙이게 되면 오름차순, 내림차순의 정렬 옵션이 반전된다.
decreasing 옵션을 T로 주면 -가 없는 기준은 내림차순, -가 있는 기준은 오름차순 정렬이 된다.
4. 데이터 분리와 선택
split() 함수를 사용하면 벡터 또는 데이터프레임을 분리 기준의 각 그룹별로 분리할 수 있다.
split(x, factor) 형식으로 사용하면 벡터나 데이터프레임 x를 factor의 각 그룹별 분리한 결고 벡터나 데이터프레임 그룹을 리스트로 반환해 준다.
품종별로 데이터를 분리한 결과를 살펴보면 setosa, versicolor, virginca 그룹으로 분리된 것을 확인할 수 있다.
분리한 결과에 summary() 함수를 적용하면 분리 결과를 요약하여 확인할 수 있다.
분리한 결과의 각 그룹의 칼럼 개수와 class, mode 등을 확인할 수 있다.
또한 분리한 결과에서 특정 그룹의 이름을 지정해 주면 해당 그룹만 확인할 수도 있다.
subset() 함수를 사용하면 데이터의 일부를 선택할 수 있다.
subset(벡터 or 데이터프레임, 조건) 형식으로 작성하면 해당 벡터나 데이터프레임에서 특정 조건을 만족하는 값만 선택할 수 있다.
데이터를 선택하는 조건을 여러 개 사용할 수 있고 조건들을 and 연산으로 적용할 때는 & 기호를, or 연산으로 적용할 때는 | 기호를 사용하면 된다.
또한 subset() 함수를 사용할 때 select 옵션을 사용하면 조건을 만족하는 데이터만 추출한 뒤, 추출하고자 하는 변수들만 확인하고 싶을 때 select 옵션에 벡터로 묶어 변수들을 지정해 주면 지정해 준 변수들만 확인할 수 있다.
5. 데이터 샘플링과 조합
샘플링(sampling)은 통계 용어로, 주어진 값들이 있을 때 그중에서 임의의 개수의 값들을 추출하는 작업을 의미한다.
데이터셋의 크기가 너무 커서 데이터 분석에 많은 시간이 걸리는 경우, 일부의 데이터만 샘플링하여 대략의 결과를 미리 확인하고자 할 때 샘플링을 사용할 수 있다.
샘플링에는 복원 추출과 비복원 추출이 있는데, 복원 추출은 한 번 뽑은 것을 다시 뽑을 수 있는 추출을 의미하고 비복원 추출은 한 번 뽑은 것을 다시 뽑을 수 없는 추출을 의미한다.
우선 숫자를 활용해 데이터 샘플링을 해보면 sample() 함수에 데이터와 추출할 개수, 복원 추출 여부를 지정해 주면 간단하게 데이터를 임의로 추출할 수 있다.
sample(데이터, size = 추출할 데이터 개수, replace = 복원 추출 여부) 형식으로 작성해 주면 된다.
replace 옵션을 TRUE로 지정해 주면 복원 추출을, FALSE로 지정해 주면 비복원 추출을 의미한다.
데이터프레임에서 행을 임의로 추출하려면, 벡터 추출과 마찬가지로 sample() 함수를 사용한다.
위 예시에서는 데이터에 데이터프레임의 행 번호를 값으로 주어 임의로 행 번호를 추출하고, 추출한 행 번호를 데이터프레임에 지정하여 데이터프레임을 샘플링하였다.
여기서 sample() 함수를 살펴보면, sample() 함수는 실행할 때마다 매번 다른 결과를 출력하게 된다.
하지만 set.seed() 함수를 활용하면 매 샘플링마다 같은 결과를 추출하게 할 수 있다.
set.seed() 함수를 사용할 때는 함수에 임의의 값을 지정해 주면 된다.
조합(combination)은 주어진 데이터 값들 중에서 몇 개씩 짝을 지어 추출하는 작업을 의미한다.
combn() 함수를 활용하면 데이터에서 지정해 준 개수만큼 짝을 지어 추출해 준다.
combn(데이터, 개수) 형식으로 작성한다.
combn() 함수를 사용할 때 simplify 옵션은 F로 지정하면 결과가 가로 방향이 아니라 세로 방향으로 출력된다.
6. 데이터 집계와 병합
2차원 데이터는 데이터 그룹에 대해서 합계나 평균을 계산해야 하는 일이 많다.
이러한 작업을 집계(aggregation)이라고 한다.
R에서는 aggregate() 함수를 통해 집계 작업을 수행한다.
aggregate(적용 데이터, by = 적용 그룹 대상, FUN = 적용 함수) 형식으로 작성해 주면 적용데이터에서 적용 그룹 대상에 적용 함수를 적용시킨다.
by 옵션에 지정해 주는 적용 그룹 대상은 list() 함수를 사용하여 리스트 형태로 지정해 준다.
그리고 by 옵션을 list() 함수를 통해 리스트 형태로 지정해 줄 때 출력되는 결과에서 열의 이름을 지정해 줄 수 있다.
병합(merge)은 분리된 데이터 파일을 공통 칼럼을 기준으로 하나로 합치는 작업을 의미한다.
데이터를 병합할 때는 merge() 함수를 활용한다.
merge(데이터 1, 데이터 2, by = 병합의 기준이 되는 공통 칼럼) 형식으로 사용하면 데이터 1과 데이터 2를 지정한 공통 칼럼을 기준으로 하나의 데이터로 병합이 된다.
여기서 all 옵션이 있는데, all 옵션은 두 데이터 셋의 행들이 모두 표시되도록 지정해 주는 옵션이다.
all.데이터 1 = T로 지정해 주면, 첫 번째 데이터셋의 행들이 모두 표시된다.
all.데이터 2 = T로 지정해 주면, 두 번째 데이터셋의 행들이 모두 표시된다.
all = T로 지정해 주면, 두 데이터셋의 모든 행들이 표시된다.
만약에 병합하려는 두 데이터의 병합 기준 열의 이름이 다를 때는 by 옵션을 활용하여 병합 기준 칼럼을 따로 지정해 준다.
by.데이터 1 = 첫 번째 데이터에서의 병합 기준 칼럼 이름, by.데이터 2 = 두 번째 데이터에서의 병합 기준 칼럼 이름처럼 각각 병합 기준 칼럼을 따로 지정해 주면 지정해 준 칼럼을 기준으로 데이터가 병합된다.
이렇게 데이터를 병합하게 되면 첫 번째 데이터에서 지정해 준 병합 기준 칼럼 이름으로 결과가 나타난다.
'Data Science > R' 카테고리의 다른 글
[R 공부하기] 7. 다중변수 자료 탐색 - 우당탕탕 개발자 되기 프로젝트 (0) | 2024.04.24 |
---|---|
[R 공부하기] 6. 단일변수 자료 탐색 - 우당탕탕 개발자 되기 프로젝트 (0) | 2024.04.23 |
[R 공부하기] 5. 조건문, 반복문, 함수 - 우당탕탕 개발자 되기 프로젝트 (0) | 2024.04.12 |
[R 공부하기] 4. 데이터프레임 - 우당탕탕 개발자 되기 프로젝트 (0) | 2024.04.10 |
[R 공부하기] 3. 매트릭스 - 우당탕탕 개발자 되기 프로젝트 (0) | 2024.03.29 |
[R 공부하기] 2. 변수와 벡터 - 우당탕탕 개발자 되기 프로젝트 (0) | 2024.03.24 |
[R 공부하기] 1. R, R Studio 설치 및 사용 - 우당탕탕 개발자 되기 프로젝트 (0) | 2024.03.15 |