데이터 결합 및 집계 (Data Merging and Aggregation)
데이터 결합과 집계는 데이터 전처리 과정에서 매우 중요한 단계로, 여러 데이터 소스를 통합하거나 데이터를 요약하여 분석에 필요한 정보를 추출할 때 사용됩니다. 이 과정은 데이터의 일관성을 유지하고, 분석의 정확성을 높이는 데 필수적입니다.
데이터 결합 (Data Merging)
데이터 결합은 두 개 이상의 데이터 프레임을 결합하여 하나의 통합된 데이터 세트를 만드는 과정입니다. R에서 데이터 결합은 주로 merge() 함수를 사용하여 수행됩니다. 이 과정은 SQL의 조인(join) 연산과 유사합니다.
merge() 함수
merge() 함수는 두 데이터 프레임을 공통 열을 기준으로 결합합니다. 결합 방식에는 내부 조인(inner join), 외부 조인(outer join), 왼쪽 조인(left join), 오른쪽 조인(right join) 등이 있습니다.
기본적인 내부 조인 (Inner Join):
내부 조인은 두 데이터 프레임의 공통 열에 대해 일치하는 행만 결합합니다. 일치하지 않는 행은 제외됩니다.
# 내부 조인: 공통 열에 대해 일치하는 행만 결합
merged_data <- merge(data1, data2, by = "common_column")
여기서 data1과 data2는 결합할 두 데이터 프레임이며, common_column은 두 데이터 프레임에서 일치하는 값을 가진 열입니다. 이 코드는 두 데이터 프레임에서 common_column이 일치하는 행만 결합하여 merged_data에 저장합니다.
왼쪽 조인 (Left Join):
왼쪽 조인은 첫 번째 데이터 프레임의 모든 행을 유지하면서, 두 번째 데이터 프레임에서 일치하는 행을 결합합니다. 일치하지 않는 경우, 두 번째 데이터 프레임의 값은 NA로 표시됩니다.
# 왼쪽 조인: 첫 번째 데이터 프레임의 모든 행을 유지
merged_data <- merge(data1, data2, by = "common_column", all.x = TRUE)
이 코드에서 all.x = TRUE는 왼쪽 조인을 수행하도록 지정합니다.
오른쪽 조인 (Right Join):
오른쪽 조인은 두 번째 데이터 프레임의 모든 행을 유지하면서, 첫 번째 데이터 프레임에서 일치하는 행을 결합합니다.
# 오른쪽 조인: 두 번째 데이터 프레임의 모든 행을 유지
merged_data <- merge(data1, data2, by = "common_column", all.y = TRUE)
이 코드에서 all.y = TRUE는 오른쪽 조인을 수행하도록 지정합니다.
외부 조인 (Full Outer Join):
외부 조인은 두 데이터 프레임의 모든 행을 결합합니다. 일치하지 않는 행의 값은 NA로 표시됩니다.
# 외부 조인: 두 데이터 프레임의 모든 행을 결합
merged_data <- merge(data1, data2, by = "common_column", all = TRUE)
이 코드에서 all = TRUE는 외부 조인을 수행하도록 지정합니다.
그룹별 집계 (Data Aggregation by Groups)
그룹별 집계는 데이터를 특정 기준에 따라 그룹화한 후, 각 그룹에 대해 요약 통계를 계산하는 과정입니다. R에서는 dplyr 패키지를 사용하여 그룹별 집계를 쉽게 수행할 수 있습니다. dplyr 패키지는 데이터 조작을 위한 다양한 기능을 제공하며, 그 중 group_by()와 summarise() 함수가 대표적인 그룹별 집계 함수입니다.
group_by() 함수
group_by() 함수는 데이터를 지정된 열의 값에 따라 그룹화합니다. 그룹화된 데이터는 이후에 summarise() 함수나 기타 연산에 사용됩니다.
# 그룹화: 데이터를 특정 열을 기준으로 그룹화
grouped_data <- data %>% group_by(group_column)
이 코드는 data 데이터프레임에서 group_column을 기준으로 데이터를 그룹화합니다. group_by()는 데이터를 그룹화한 상태로 반환하며, 이 결과는 summarise()와 같은 요약 함수에 사용됩니다.
summarise() 함수
summarise() 함수는 그룹화된 데이터에 대해 요약 통계를 계산합니다. 예를 들어, 각 그룹의 평균, 합계, 개수 등을 계산할 수 있습니다.
# 그룹별 요약: 각 그룹에 대해 평균 계산
summary_data <- data %>%
group_by(group_column) %>%
summarise(mean_value = mean(target_column, na.rm = TRUE))
이 코드는 data 데이터프레임을 group_column으로 그룹화한 후, target_column의 평균을 계산하여 mean_value로 저장합니다. na.rm = TRUE는 결측치를 무시하고 계산하도록 지정합니다.
다양한 요약 통계 계산:
summarise() 함수는 평균 외에도 다양한 요약 통계를 계산할 수 있습니다.
# 예제: 그룹별로 여러 요약 통계 계산
summary_data <- data %>%
group_by(group_column) %>%
summarise(mean_value = mean(target_column, na.rm = TRUE),
sum_value = sum(target_column, na.rm = TRUE),
count_value = n())
이 코드는 각 그룹에 대해 평균(mean_value), 합계(sum_value), 개수(count_value)를 계산하여 summary_data 데이터프레임에 저장합니다.
mutate()와 함께 사용
mutate() 함수는 기존 데이터를 기반으로 새로운 변수를 생성할 때 사용됩니다. group_by()와 함께 사용하여 각 그룹에 대해 새로운 변수를 생성할 수 있습니다.
# 예제: 그룹별로 평균과 편차 계산 후 새로운 변수 생성
data <- data %>%
group_by(group_column) %>%
mutate(mean_value = mean(target_column, na.rm = TRUE),
deviation = target_column - mean_value)
이 코드는 target_column의 그룹별 평균(mean_value)과 각 값이 그룹 평균에서 얼마나 떨어져 있는지를 나타내는 편차(deviation)를 계산하여 새로운 변수로 추가합니다.
데이터 샘플링 및 나누기 (Sampling and Splitting)
데이터 샘플링과 나누기(Sampling and Splitting)는 데이터 분석 및 머신러닝 모델링 과정에서 매우 중요한 단계입니다. 이 과정은 모델의 성능을 평가하고 일반화 능력을 확인하기 위해 필수적입니다.
데이터 샘플링 (Data Sampling)
데이터 샘플링은 큰 데이터셋에서 일부 데이터를 무작위로 추출하는 과정입니다. 샘플링은 데이터 분석이나 모델링 과정에서 데이터의 크기를 줄여 처리 속도를 향상시키거나, 특정 데이터 분포를 테스트하기 위해 사용됩니다.
sample() 함수
R에서 데이터 샘플링을 위해 가장 기본적으로 사용되는 함수는 sample() 함수입니다. 이 함수는 주어진 벡터나 데이터프레임에서 무작위로 샘플을 추출할 수 있습니다.
기본 샘플링:
# 데이터프레임에서 100개의 샘플을 무작위로 추출
sampled_data <- data[sample(1:nrow(data), size = 100), ]
이 코드는 data 데이터프레임에서 100개의 행을 무작위로 선택하여 sampled_data 데이터프레임에 저장합니다. 여기서 nrow(data)는 데이터프레임의 총 행 수를 반환하고, sample() 함수는 1부터 총 행 수까지의 숫자 중에서 100개를 무작위로 선택합니다.
복원 추출 (Sampling with Replacement):
복원 추출은 샘플링된 데이터가 다시 샘플링에 포함될 수 있도록 허용하는 방법입니다. sample() 함수의 replace 인자를 TRUE로 설정하여 복원 추출을 수행할 수 있습니다.
# 복원 추출로 100개의 샘플을 무작위로 추출
sampled_data <- data[sample(1:nrow(data), size = 100, replace = TRUE), ]
이 코드는 데이터프레임에서 중복된 샘플이 포함될 수 있도록 복원 추출을 통해 100개의 샘플을 무작위로 선택합니다.
층화 샘플링 (Stratified Sampling)
층화 샘플링은 데이터의 특정 그룹(층, stratum)에 대해 동일한 비율로 샘플을 추출하는 방법입니다. 이 방법은 특정 그룹이 데이터에서 불균형하게 분포되어 있을 때, 각 그룹이 대표되도록 샘플링하는 데 유용합니다.
R에서는 caret 패키지의 createDataPartition() 함수를 사용하여 층화 샘플링을 수행할 수 있습니다.
library(caret)
set.seed(123) # 결과의 재현성을 위해 시드 설정
# 층화 샘플링: 데이터의 target_column을 기준으로 70%를 샘플링
trainIndex <- createDataPartition(data$target_column, p = 0.7, list = FALSE)
sampled_data <- data[trainIndex, ]
이 코드는 target_column에 따라 데이터를 층화하여 70%를 샘플링하고, 그 결과를 sampled_data에 저장합니다. createDataPartition() 함수는 target_column의 클래스 비율을 유지하면서 훈련 데이터와 테스트 데이터를 분할합니다.
데이터 분할 (Data Splitting)
데이터 분할은 주어진 데이터셋을 훈련 세트(Training Set)와 테스트 세트(Test Set)로 나누는 과정입니다. 훈련 세트는 모델을 학습시키는 데 사용되고, 테스트 세트는 모델의 성능을 평가하는 데 사용됩니다. 이를 통해 모델의 일반화 능력을 확인할 수 있습니다.
caret 패키지의 createDataPartition() 함수
R에서 데이터 분할은 주로 caret 패키지의 createDataPartition() 함수를 사용하여 수행됩니다. 이 함수는 주어진 비율에 따라 데이터를 훈련 세트와 테스트 세트로 나눕니다.
기본적인 훈련/테스트 데이터 분할:
library(caret)
set.seed(123) # 결과의 재현성을 위해 시드 설정
# 데이터를 70% 훈련 세트와 30% 테스트 세트로 나누기
trainIndex <- createDataPartition(data$target_column, p = 0.7, list = FALSE)
train_data <- data[trainIndex, ]
test_data <- data[-trainIndex, ]
이 코드는 데이터프레임 data에서 target_column을 기준으로 데이터를 70%는 훈련 세트(train_data), 나머지 30%는 테스트 세트(test_data)로 나눕니다. createDataPartition() 함수는 층화 샘플링을 통해 target_column의 클래스 비율을 유지하며 데이터를 분할합니다.
기타 설정:
- p 인자: 데이터를 나눌 비율을 지정합니다. 예를 들어, p = 0.7은 70%를 훈련 세트로, 30%를 테스트 세트로 나누는 것을 의미합니다.
- list 인자: 반환 값을 리스트로 받을지 여부를 지정합니다. FALSE로 설정하면 인덱스를 벡터로 반환합니다.
데이터셋이 불균형한 경우
데이터셋이 불균형한 경우(즉, 특정 클래스가 다른 클래스보다 훨씬 더 많은 경우), createDataPartition() 함수를 사용하여 클래스의 비율을 유지하면서 훈련 세트와 테스트 세트를 나누는 것이 중요합니다. 이렇게 하면 모델이 훈련 중에 각 클래스를 적절히 학습할 수 있게 됩니다.
데이터 샘플링 및 분할 시 고려사항
- 재현성: 샘플링 및 분할 과정의 결과가 동일하도록 set.seed() 함수를 사용하여 시드를 설정하는 것이 중요합니다. 이렇게 하면 동일한 데이터를 여러 번 분석할 때 일관된 결과를 얻을 수 있습니다.
- 데이터 크기: 데이터가 매우 크면 샘플링을 통해 데이터 크기를 줄여 처리 속도를 향상시킬 수 있습니다. 하지만 샘플이 원본 데이터를 충분히 대표할 수 있는지 확인해야 합니다.
- 층화 샘플링: 불균형한 데이터셋에서는 층화 샘플링을 통해 각 클래스가 적절히 대표되도록 해야 합니다. 이는 모델이 소수 클래스도 잘 예측할 수 있도록 도와줍니다.
데이터 결합과 집계, 샘플링 및 분할은 데이터 분석과 모델링의 성공을 좌우하는 중요한 과정입니다. 이러한 단계들을 올바르게 수행하면 데이터의 일관성을 유지하고, 보다 정확한 분석 결과를 도출할 수 있습니다. 데이터를 다룰 때는 항상 신중하게 계획하고, 다양한 방법을 고려하여 최적의 결과를 얻을 수 있도록 해야 합니다. 데이터 전처리 과정에서 시간을 투자하는 것이 최종 분석에서 큰 차이를 만들어 낼 것입니다.
'프로그래밍 언어 > R' 카테고리의 다른 글
19. R에서의 데이터 전처리 및 변환 1️⃣ (결측값 처리와 데이터 변환 및 정제) (0) | 2024.09.25 |
---|---|
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 |
데이터 분석을 공부하고 카페를 열심히 돌아다니는 이야기
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!