결측치 처리는 데이터 전처리 과정에서 매우 중요한 단계입니다.
결측치가 있는 데이터를 잘못 처리하면 분석 결과에 큰 영향을 미칠 수 있기 때문에, 이를 적절히 처리하는 것이 중요합니다.
결측값 처리
결측치 확인 (Identifying Missing Data)
먼저 데이터셋 내에 결측치가 어디에 있는지 확인해야 합니다.
R에서 결측치를 확인하는 주요 방법은 is.na() 함수입니다.
이 함수는 주어진 데이터셋에서 결측치가 있는 위치를 논리값(참/거짓)으로 반환합니다.
# 결측치 확인하기
is.na(data)
이 코드는 데이터셋 data의 모든 값을 검사하여 결측치가 있는 위치를 TRUE로 표시하는 논리 행렬을 반환합니다.
일반적으로 sum() 함수를 함께 사용하여 결측치의 총 개수를 확인할 수 있습니다.
# 데이터프레임 전체에서 결측치 개수 확인
sum(is.na(data))
# 특정 열에서 결측치 개수 확인
sum(is.na(data$column))
결측치 시각화 (Visualizing Missing Data)
결측치를 시각화하는 것도 매우 유용합니다. 이를 위해 VIM, naniar, ggplot2 같은 패키지를 사용할 수 있습니다.
# naniar 패키지를 이용한 결측치 시각화
library(naniar)
gg_miss_var(data)
이 코드는 각 변수에 대해 결측치 비율을 시각화하여 결측치가 어느 변수에 집중되어 있는지 쉽게 파악할 수 있게 합니다.
결측치 처리 방법 (Handling Missing Data)
결측치를 처리하는 방법은 여러 가지가 있으며, 선택한 방법에 따라 분석 결과가 달라질 수 있습니다. 일반적으로 사용하는 방법은 다음과 같습니다.
결측치 제거 (Removing Missing Data)
가장 간단한 방법은 결측치가 있는 데이터를 제거하는 것입니다. na.omit() 함수는 데이터프레임에서 결측치가 포함된 행을 모두 제거합니다.
# 결측치가 있는 행 제거
data_clean <- na.omit(data)
이 방법은 데이터에서 결측치가 많은 경우 분석에 사용되는 데이터가 크게 줄어들 수 있기 때문에 신중하게 사용해야 합니다.
결측치 대체 (Imputing Missing Data)
결측치를 제거하는 대신 다른 값으로 대체하는 방법이 더 일반적입니다. 대체 방법에는 여러 가지가 있으며, 데이터의 특성에 따라 적절한 방법을 선택할 수 있습니다.
- 평균 또는 중앙값으로 대체 (Mean/Median Imputation)
수치형 데이터의 경우 결측치를 해당 열의 평균 또는 중앙값으로 대체할 수 있습니다.
# 평균으로 대체
data$column[is.na(data$column)] <- mean(data$column, na.rm = TRUE)
# 중앙값으로 대체
data$column[is.na(data$column)] <- median(data$column, na.rm = TRUE)
- 최빈값으로 대체 (Mode Imputation)
범주형 데이터의 경우 결측치를 최빈값으로 대체할 수 있습니다. 최빈값은 데이터에서 가장 자주 나타나는 값입니다.
# 최빈값 계산을 위한 사용자 정의 함수
mode_value <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}
# 최빈값으로 대체
data$column[is.na(data$column)] <- mode_value(data$column)
- 선형 회귀, KNN 등으로 대체 (Regression, KNN Imputation)
보다 정교한 방법으로, 다른 변수들을 사용해 결측치를 예측하여 대체할 수 있습니다. 예를 들어, K-최근접 이웃(KNN) 방법을 사용해 결측치를 대체할 수 있습니다. 이를 위해 DMwR 또는 VIM 같은 패키지를 사용할 수 있습니다.
library(DMwR)
data <- knnImputation(data)
이 방법은 데이터의 패턴을 유지하면서 결측치를 대체할 수 있지만 계산 비용이 높을 수 있습니다.
- Forward/Backward Fill (전방/후방 채우기)
시계열 데이터의 경우, 결측치를 이전 또는 이후의 값으로 채우는 방법이 사용될 수 있습니다.
# zoo 패키지 사용
library(zoo)
# 전방 채우기
data$column <- na.locf(data$column)
# 후방 채우기
data$column <- na.locf(data$column, fromLast = TRUE)
결측치 처리 방법 선택 시 고려 사항 (Considerations for Choosing a Method)
결측치를 어떻게 처리할지는 데이터의 특성, 결측치의 비율, 분석 목적에 따라 달라집니다. 예를 들어, 결측치가 무작위로 발생한 경우와 특정 패턴에 따라 발생한 경우의 처리가 다를 수 있습니다. 분석자가 결측치가 왜 발생했는지 이해하고, 적절한 방법을 선택하는 것이 중요합니다.
결론적으로, R에서의 결측치 처리는 매우 다양한 방법으로 접근할 수 있으며, 데이터의 특성에 맞는 방법을 선택하는 것이 분석 결과의 신뢰성을 높이는 핵심입니다.
데이터 변환
데이터 변환(Data Transformation)은 데이터 전처리 과정에서 데이터를 분석하기 적합한 형식으로 변환하는 작업을 의미합니다. 데이터의 유형을 변환하거나, 새로운 변수를 생성하거나, 날짜 형식을 처리하는 등의 다양한 작업이 포함됩니다.
데이터 형 변환 (Data Type Conversion)
데이터 분석을 위해서는 변수의 데이터 유형을 적절하게 변환하는 것이 중요합니다. R에서는 데이터 유형 변환을 위한 다양한 함수들이 있습니다.
as.factor()
as.factor() 함수는 변수를 범주형(Categorical) 변수로 변환합니다. 범주형 변수는 주로 명목형 데이터(예: 성별, 색상) 또는 순서형 데이터(예: 등급)를 나타낼 때 사용됩니다.
# 예제: 숫자형 데이터를 범주형 데이터로 변환
data$category_column <- as.factor(data$numeric_column)
이 코드는 numeric_column을 범주형 데이터로 변환하여 category_column이라는 새로운 변수에 저장합니다.
범주형 데이터로 변환하면, R의 특정 모델이나 함수에서 이 변수를 처리하는 방식이 달라집니다.
예를 들어, 범주형 변수는 회귀 모델에서 더미 변수(dummy variables)로 자동 변환됩니다.
as.numeric()
as.numeric() 함수는 변수를 숫자형(Numeric) 데이터로 변환합니다. 주로 문자열이나 범주형 데이터를 수치형 데이터로 변환할 때 사용됩니다.
# 예제: 범주형 데이터를 숫자형 데이터로 변환
data$numeric_column <- as.numeric(data$category_column)
이 코드는 category_column을 숫자형 데이터로 변환하여 numeric_column에 저장합니다. 숫자형 데이터로 변환하면 수치 연산이나 통계적 분석을 수행할 수 있습니다.
as.character()
as.character() 함수는 변수를 문자형(Character) 데이터로 변환합니다. 데이터가 숫자나 범주형 데이터일 때 이를 문자형으로 변환하여 문자열 조작이 가능하게 만듭니다.
# 예제: 숫자형 데이터를 문자형 데이터로 변환
data$char_column <- as.character(data$numeric_column)
이 코드는 numeric_column을 문자형 데이터로 변환하여 char_column에 저장합니다. 이를 통해 문자열 연결, 패턴 매칭 등의 작업을 수행할 수 있습니다.
파생 변수 생성 (Creating Derived Variables)
파생 변수는 기존 데이터를 기반으로 새로운 변수를 생성하는 작업을 의미합니다. 파생 변수를 생성함으로써 데이터에 대한 추가적인 통찰을 얻거나 분석의 정확성을 높일 수 있습니다.
산술 연산을 통한 변수 생성
가장 기본적인 파생 변수 생성 방법은 산술 연산을 통해 새로운 변수를 만드는 것입니다. 예를 들어, 매출 데이터를 분석할 때 단가와 수량을 곱하여 총매출 변수를 생성할 수 있습니다.
# 예제: 단가와 수량을 곱하여 총매출 변수 생성
data$total_sales <- data$price * data$quantity
이 코드는 price와 quantity 변수를 곱하여 total_sales라는 새로운 변수를 생성합니다.
조건문을 사용한 변수 생성
조건문을 사용하여 특정 조건을 만족하는 경우에만 값을 할당하는 변수를 생성할 수 있습니다. 예를 들어, 성적 데이터를 분석할 때 특정 점수 이상인 경우 "합격"을, 그렇지 않은 경우 "불합격"을 표시하는 변수를 생성할 수 있습니다.
# 예제: 점수를 기준으로 합격 여부를 결정하는 변수 생성
data$pass_fail <- ifelse(data$score >= 60, "Pass", "Fail")
이 코드는 score 변수를 기준으로 점수가 60 이상이면 pass_fail 변수에 "Pass"를, 그렇지 않으면 "Fail"을 할당합니다.
함수 적용을 통한 변수 생성
apply(), lapply(), sapply() 등의 함수를 사용하여 데이터를 처리하고, 이를 바탕으로 새로운 변수를 생성할 수 있습니다.
# 예제: 벡터에 로그 변환을 적용하여 새로운 변수 생성
data$log_column <- log(data$original_column)
이 코드는 original_column에 로그 변환을 적용하여 log_column이라는 새로운 변수를 생성합니다.
날짜 처리 (Date Handling)
날짜 데이터를 적절히 처리하는 것은 데이터 분석에서 매우 중요합니다. R에서는 lubridate 패키지를 사용하여 날짜 데이터를 효율적으로 처리할 수 있습니다.
날짜 형식 변환
날짜 데이터를 처리할 때, lubridate 패키지의 다양한 함수를 사용하여 문자열로 되어 있는 날짜를 날짜 형식으로 변환할 수 있습니다. 가장 일반적인 함수는 ymd(), dmy(), mdy() 등입니다.
# 예제: ymd 형식의 문자열을 날짜 형식으로 변환
library(lubridate)
data$date_column <- ymd(data$date_string)
이 코드는 date_string 변수를 YYYY-MM-DD 형식의 날짜로 변환하여 date_column에 저장합니다.
날짜 연산
날짜 데이터를 변환한 후에는 날짜 간의 차이를 계산하거나, 특정 날짜에 일정 기간을 더하거나 빼는 등의 연산을 수행할 수 있습니다.
# 예제: 두 날짜 간의 차이 계산
data$date_diff <- as.numeric(difftime(data$end_date, data$start_date, units = "days"))
# 예제: 특정 날짜에 7일을 더하기
data$new_date <- data$start_date + days(7)
이 코드는 start_date와 end_date 간의 차이를 계산하여 date_diff 변수에 저장하고, start_date에 7일을 더하여 new_date 변수에 저장합니다.
날짜의 구성 요소 추출
날짜에서 연도, 월, 일과 같은 구성 요소를 추출할 수도 있습니다. 이를 통해 연도별 분석, 월별 분석 등을 수행할 수 있습니다.
# 예제: 연도, 월, 일 추출
data$year <- year(data$date_column)
data$month <- month(data$date_column)
data$day <- day(data$date_column)
이 코드는 date_column에서 연도, 월, 일을 각각 추출하여 year, month, day 변수에 저장합니다.
데이터 정제
데이터 정제(Data Cleaning)는 데이터 전처리 과정에서 중요한 단계 중 하나로, 데이터의 품질을 향상시켜 분석의 정확성과 신뢰성을 높이는 데 필수적입니다. 데이터 정제 과정에서 주로 수행하는 작업은 중복 데이터 제거와 이상치 처리입니다. 각각의 방법에 대해 자세히 설명하겠습니다.
중복 데이터 제거 (Removing Duplicate Data)
중복된 데이터는 데이터 분석의 결과를 왜곡시킬 수 있습니다. 예를 들어, 동일한 고객의 구매 기록이 중복으로 포함되어 있을 경우, 매출이나 고객 수에 대한 분석이 잘못될 수 있습니다. R에서는 중복된 행을 식별하고 제거하기 위해 duplicated() 함수를 사용합니다.
duplicated() 함수
duplicated() 함수는 데이터프레임의 행 중에서 중복된 항목을 TRUE 또는 FALSE로 반환합니다. 이 함수는 첫 번째 발생한 중복 항목을 제외한 나머지 중복 항목을 TRUE로 표시합니다.
# 중복된 행 확인
duplicated_rows <- duplicated(data)
# 중복된 행 출력
data[duplicated_rows, ]
이 코드는 data 데이터프레임에서 중복된 행을 확인하고, 중복된 행만 출력합니다.
중복된 행 제거
중복된 행을 제거하려면 !duplicated() 조건을 사용하여 중복되지 않은 행만 남길 수 있습니다.
# 중복된 행 제거
data <- data[!duplicated(data), ]
이 코드는 duplicated() 함수로 중복된 행을 식별하고, 이를 제거하여 새로운 데이터프레임을 생성합니다. 결과적으로 data 데이터프레임은 중복된 행이 제거된 상태로 갱신됩니다.
이상치 처리 (Handling Outliers)
이상치는 데이터의 일반적인 패턴에서 벗어난 값으로, 분석 결과에 큰 영향을 미칠 수 있습니다. 예를 들어, 대부분의 고객이 100달러 이하의 제품을 구매하는데 1명의 고객이 10,000달러의 제품을 구매했다면, 이 값은 평균을 크게 왜곡할 수 있습니다. 따라서 이상치를 식별하고 적절히 처리하는 것이 중요합니다.
IQR(Interquartile Range) 방법
IQR(사분위 범위) 방법은 데이터의 중앙값을 기준으로 1사분위수(Q1, 25번째 백분위수)와 3사분위수(Q3, 75번째 백분위수) 사이의 범위를 사용하여 이상치를 식별합니다. IQR은 Q3와 Q1의 차이이며, 이 IQR 값을 사용하여 데이터의 하한과 상한을 계산합니다. 일반적으로 Q1 - 1.5 * IQR 이하이거나 Q3 + 1.5 * IQR 이상의 값이 이상치로 간주됩니다.
# IQR 계산
Q1 <- quantile(data$column, 0.25)
Q3 <- quantile(data$column, 0.75)
IQR <- Q3 - Q1
# 이상치 하한과 상한 계산
lower_bound <- Q1 - 1.5 * IQR
upper_bound <- Q3 + 1.5 * IQR
# 이상치를 제외한 데이터만 선택
data_clean <- subset(data, data$column > lower_bound & data$column < upper_bound)
이 코드는 column 변수에서 IQR을 계산하고, 이 값을 바탕으로 이상치가 아닌 데이터를 data_clean 데이터프레임에 저장합니다.
Z-Score 방법
Z-Score 방법은 데이터의 각 값이 평균에서 얼마나 떨어져 있는지를 표준편차 단위로 측정합니다. 일반적으로 Z-Score가 3 이상이거나 -3 이하인 값은 이상치로 간주됩니다.
# Z-Score 계산
z_scores <- scale(data$column)
# Z-Score가 3을 초과하거나 -3 미만인 값 제거
data_clean <- data[abs(z_scores) < 3, ]
이 코드는 column 변수의 Z-Score를 계산하고, Z-Score가 3보다 크거나 -3보다 작은 값을 제거하여 새로운 데이터프레임 data_clean을 생성합니다.
이상치 처리 방법 선택 시 고려사항
이상치 처리 방법을 선택할 때는 데이터의 특성과 분석 목적을 고려해야 합니다. 예를 들어, 이상치가 실제로 중요한 정보를 담고 있을 가능성이 있다면, 단순히 제거하기보다는 분석에 포함시키되 그 영향을 이해하는 것이 중요할 수 있습니다. 또한, 이상치가 분석 결과에 미치는 영향을 평가하기 위해 이상치를 포함한 경우와 제외한 경우의 결과를 비교하는 것도 유용합니다.
결측치 처리와 데이터 변환, 그리고 데이터 정제는 데이터 분석에서 필수적인 단계입니다. 올바르게 처리된 데이터는 신뢰성 높은 분석 결과를 도출하는 기반이 됩니다. 데이터의 특성에 맞는 적절한 전처리 방법을 선택하고 적용하는 것이 중요하며, 이를 통해 더 정확하고 의미 있는 인사이트를 얻을 수 있습니다.
'프로그래밍 언어 > R' 카테고리의 다른 글
20. R에서의 데이터 전처리 및 변환 2️⃣ (데이터 결합 및 집계와 샘플링) (1) | 2024.09.27 |
---|---|
18. R을 활용한 기본 통계 2️⃣ (가설 검정 및 회귀 분석) (1) | 2024.09.16 |
17. R을 활용한 기본 통계 1️⃣ (기초 통계 분석 및 확률 분포) (0) | 2024.09.13 |
16. R에서의 객체 지향 프로그래밍 (Class) (0) | 2024.09.10 |
15. R 함수를 이용한 데이터 시각화 3️⃣ (기타 시각화 기법 및 그래프 저장) (0) | 2024.09.07 |
데이터 분석을 공부하고 카페를 열심히 돌아다니는 이야기
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!