안녕하세요! 데이터 분석에 관심 있는 분들, R을 배우고 싶은 분들 모두 환영해요! R에서 데이터를 다루는 가장 기본적이고 중요한 요소, 바로 데이터 프레임(Data Frame)에 대해 함께 알아보는 시간을 가져보려고 해요. 마치 엑셀 시트처럼 데이터를 표 형태로 정리하는 데이터 프레임은 R을 이용한 데이터 분석의 시작이라고 할 수 있죠.
오늘은 `data.frame()` 함수를 활용해서 데이터 프레임을 만드는 방법부터 시작해서, 강력한 데이터 조작 패키지인 dplyr를 이용해 데이터를 자유자재로 변형하는 방법까지 차근차근 배워볼 거예요. 복잡한 코드에 겁먹지 마세요! 실전 예제를 통해 직접 데이터를 다뤄보면서 쉽고 재밌게 이해할 수 있도록 도와드릴게요. 자, 이제 R로 데이터 프레임을 마스터하는 여정을 함께 떠나볼까요?
데이터 프레임 생성 기본
R에서 데이터 분석을 시작할 때 가장 먼저 만나게 되는 친구, 바로 데이터 프레임이에요! 마치 엑셀 스프레드시트처럼 행과 열로 이루어진 표 형태를 가지고 있어서 데이터를 보기 쉽게 정리하고 분석할 수 있도록 도와주죠. 자, 그럼 이 친절한 데이터 프레임을 R에서 어떻게 만들 수 있는지 하나씩 알아볼까요?
`data.frame()` 함수를 사용하는 방법
가장 기본적인 방법은 `data.frame()` 함수를 사용하는 거예요. 마치 레고 블록을 조립하듯이 원하는 데이터를 넣어서 데이터 프레임을 만들 수 있답니다. 이 함수는 여러 벡터를 입력받아 각 벡터를 열로 가지는 데이터 프레임을 생성해요. 벡터의 길이가 서로 다르면 어떻게 될까요? 걱정 마세요! R은 센스 있게 짧은 벡터를 재활용해서 길이를 맞춰준답니다. (하지만 가끔 예상치 못한 결과가 나올 수 있으니 주의해야 해요!)
데이터 프레임 생성 예시
예를 들어, 학생들의 이름, 나이, 성적을 저장하는 데이터 프레임을 만들어 볼게요. `names <- c("Alice", "Bob", "Charlie", "David")`, `ages <- c(20, 21, 19, 20)`, `scores <- c(90, 85, 92, 88)` 이렇게 세 개의 벡터를 만들었다고 생각해 보세요. 이 벡터들을 `data.frame()` 함수에 넣어주면 짜잔~! 이름, 나이, 성적을 담은 데이터 프레임이 완성되는 거죠! 참 쉽죠?
students <- data.frame(이름 = names, 나이 = ages, 성적 = scores)
이렇게 하면 students
라는 이름의 데이터 프레임이 만들어지고, 각 열의 이름은 "이름", "나이", "성적"이 됩니다. 열 이름을 따로 지정해주지 않으면 R이 알아서 `X1`, `X2`, `X3`…처럼 이름을 붙여주기도 해요. 하지만 나중에 데이터를 다룰 때 헷갈릴 수 있으니, 처음부터 의미 있는 이름을 붙여주는 것이 좋겠죠?
다양한 데이터 타입 처리
data.frame()
함수는 숫자형, 문자형, 논리형 등 다양한 데이터 타입을 처리할 수 있어요. 심지어 날짜 데이터나 factor형 데이터도 문제없답니다! 데이터 타입이 섞여 있어도 괜찮아요. R은 각 열의 데이터 타입을 자동으로 인식해서 처리해주거든요. 정말 똑똑하죠?!
`stringsAsFactors = FALSE` 옵션
하지만 가끔 데이터 타입이 예상과 다르게 설정되는 경우도 있어요. 예를 들어 숫자로 이루어진 벡터를 data.frame()
함수에 넣었는데 문자형으로 인식되는 경우가 있을 수 있죠. 이럴 때는 stringsAsFactors = FALSE
옵션을 사용해서 문자형으로 변환되는 것을 막을 수 있어요! 작은 팁이지만 알아두면 유용하게 쓸 수 있답니다.
`seq()` 함수와 `rep()` 함수 활용
자, 이제 데이터 프레임을 만드는 기본적인 방법을 알았으니, 좀 더 다양한 상황을 생각해 볼까요? 예를 들어, 1부터 100까지의 숫자를 담은 데이터 프레임을 만들고 싶다고 해봅시다. 일일이 숫자를 입력하는 건 너무 번거롭겠죠? 이럴 때는 seq()
함수와 rep()
함수를 활용하면 훨씬 간편하게 만들 수 있어요.
numbers <- data.frame(num = seq(1, 100), group = rep(LETTERS[1:4], each = 25))
이 코드는 1부터 100까지의 숫자를 num
열에 저장하고, "A", "B", "C", "D" 네 개의 문자를 각각 25번씩 반복해서 group
열에 저장하는 데이터 프레임을 만듭니다. seq()
함수는 순차적인 숫자 벡터를 생성하고, rep()
함수는 특정 값을 반복하는 벡터를 생성하는 데 사용돼요. 이렇게 함수들을 조합하면 원하는 형태의 데이터 프레임을 쉽게 만들 수 있답니다!
`matrix()` 함수와 `as.data.frame()` 함수 활용
또 다른 예시로, 10행 5열의 데이터 프레임을 모두 0으로 채우고 싶다면 어떻게 해야 할까요? matrix()
함수를 사용하면 돼요!
zero_matrix <- matrix(0, nrow = 10, ncol = 5)
zero_df <- as.data.frame(zero_matrix)
matrix()
함수로 0으로 채워진 행렬을 만들고, as.data.frame()
함수를 사용해서 데이터 프레임으로 변환하면 된답니다. 참 간단하죠?
이처럼 data.frame()
함수를 기반으로 다양한 함수들을 활용하면 원하는 형태의 데이터 프레임을 자유자재로 만들 수 있어요! 처음에는 조금 어려워 보일 수 있지만, 여러 번 연습하다 보면 금방 익숙해질 거예요. 화이팅!
data.frame() 함수 활용법
드디어! R에서 데이터 프레임을 만드는 핵심 함수, `data.frame()`에 대해 자세히 알아볼 시간이에요! 마치 요리 레시피처럼, `data.frame()` 함수에 필요한 재료들을 하나씩 넣어 테이블 형태의 데이터 프레임을 뚝딱 만들어낼 수 있답니다. 어떤 재료들이 필요하고 어떻게 넣어야 하는지, 지금부터 차근차근 살펴보도록 할게요. 준비되셨나요~? ^^
기본적인 data.frame() 함수 사용법
자, 우선 가장 기본적인 형태부터 살펴봅시다. `data.frame()` 함수는 기본적으로 벡터들을 입력받아 데이터 프레임을 생성해요. 벡터의 길이가 다르면 어떻게 될까요? 🤔 걱정 마세요! R은 똑똑하게도 가장 긴 벡터의 길이에 맞춰 나머지 벡터들을 재활용해 채워준답니다. (물론, 경고 메시지도 함께 띄워주니 안심하세요!) 예를 들어, 길이가 3인 벡터와 길이가 1인 벡터를 사용하면, 길이가 1인 벡터가 세 번 반복되어 길이 3짜리 데이터 프레임이 만들어져요.
name <- c("Alice", "Bob", "Charlie") # 길이 3
age <- c(25) # 길이 1
df <- data.frame(name, age)
print(df)
결과를 보면, age 열에는 25 값이 세 번 반복되어 나타나는 것을 확인할 수 있죠? 신기하지 않나요?!?!?
하지만 벡터의 길이가 정확하게 일치하지 않으면 데이터 분석에 오류가 생길 수 있으니, 항상 벡터 길이를 꼼꼼히 확인하는 습관을 들이는 것이 중요해요! 데이터 분석의 기본 중 기본이라고 할 수 있겠죠?
stringsAsFactors 인자
`data.frame()` 함수를 사용할 때 또 하나 알아두면 좋은 꿀팁! 바로 `stringsAsFactors` 인자예요. 이 인자는 문자열 벡터를 factor(범주형) 변수로 변환할지 여부를 결정한답니다. R의 이전 버전에서는 기본값이 TRUE
였지만, 최근 버전에서는 FALSE
로 변경되었어요. 왜 바뀌었을까요? 🤔 그 이유는 factor 변수가 가끔 예상치 못한 결과를 초래할 수 있기 때문이에요. 그래서 문자열 데이터를 factor로 변환해야 할 경우에는 명시적으로 stringsAsFactors = TRUE
로 설정해주는 것이 좋답니다. 이렇게 하면 나중에 데이터 분석 과정에서 발생할 수 있는 혼란을 미리 방지할 수 있어요!
다양한 데이터 타입 처리
`data.frame()` 함수는 다양한 데이터 타입을 처리할 수 있다는 장점이 있어요. 숫자형, 문자형, 논리형 등등… 마치 뷔페처럼 원하는 데이터를 골라 담아 나만의 데이터 프레임을 만들 수 있답니다. 예를 들어, 학생들의 이름, 나이, 성적, 출석 여부 등 다양한 정보를 담은 데이터 프레임을 만들 수 있겠죠?
students <- data.frame(
name = c("Alice", "Bob", "Charlie", "David", "Eve"),
age = c(20, 21, 19, 22, 20),
grade = c(3.5, 3.8, 4.0, 3.2, 3.7),
attended = c(TRUE, TRUE, FALSE, TRUE, TRUE),
stringsAsFactors = FALSE # 문자열을 factor로 변환하지 않음
)
print(students)
row.names 인자
여기서 `row.names` 인자를 사용하면 행 이름을 직접 지정할 수도 있어요. 기본적으로 1, 2, 3…과 같이 숫자가 자동으로 할당되지만, row.names = c("A", "B", "C", "D", "E")
와 같이 지정하면 행 이름을 원하는 대로 바꿀 수 있답니다. 데이터의 특징에 맞춰 행 이름을 지정하면 데이터를 더욱 효율적으로 관리할 수 있겠죠?
리스트를 활용한 데이터 프레임 생성
`data.frame()` 함수는 단순히 벡터를 합쳐서 데이터 프레임을 만드는 것 외에도 리스트를 활용하여 데이터 프레임을 생성할 수도 있어요. 리스트는 서로 다른 데이터 타입의 데이터를 담을 수 있는 만능 저장소와 같아서, 데이터 프레임을 만들 때 매우 유용하게 활용될 수 있답니다. 리스트를 사용하면 각 열의 데이터 타입을 유연하게 지정할 수 있다는 장점이 있어요!
my_list <- list(
names = c("Apple", "Banana", "Cherry"),
prices = c(1.2, 0.5, 2.0),
quantity = c(10, 20, 5)
)
fruit_df <- data.frame(my_list)
print(fruit_df)
`data.frame()` 함수, 생각보다 활용도가 높죠? 다음에는 `dplyr` 패키지를 이용해서 데이터 프레임을 자유자재로 변형하는 방법에 대해 알아볼 거예요. 벌써부터 기대되지 않나요? 😉 다음에 만나요~!
dplyr 패키지로 데이터 변형하기
후~ 드디어 데이터 프레임을 만들었으니 이제 본격적으로 요리(?)를 시작해 볼까요? 데이터 분석에서 가장 중요한 부분 중 하나가 바로 데이터 변형이에요. 복잡하고 어려운 데이터를 보기 좋고 분석하기 쉽게 바꿔주는 마법 같은 과정이죠! 마치 요리 재료를 손질하는 것과 같아요. dplyr 패키지는 이런 데이터 변형 작업을 아주 쉽고 효율적으로 할 수 있게 도와주는 R의 필수 패키지랍니다! 마치 셰프의 만능 칼 같은 존재랄까요? ^^
dplyr 패키지 소개
dplyr 패키지는 데이터 조작에 특화된 함수들을 제공하는데, 이 함수들은 일관된 구조와 직관적인 동사 형태를 가지고 있어서 코드를 읽고 이해하기가 훨씬 쉬워요. 가장 핵심적인 함수 5가지, `filter()`, `select()`, `arrange()`, `mutate()`, `summarize()` (그리고 이 친구와 짝꿍인 `group_by()`)를 '데이터 변형의 5대 천왕'이라고 부르기도 해요. 이 다섯 가지만 잘 알아두면 데이터 변형의 80%는 정복했다고 봐도 과언이 아니에요!
dplyr 핵심 함수 살펴보기
자, 그럼 각 함수들을 하나씩 살펴볼까요? 먼저 `filter()` 함수는 특정 조건에 맞는 행만 추출해 새로운 데이터 프레임을 만들어 줘요. 예를 들어, 100명의 학생 데이터에서 수학 점수가 90점 이상인 학생들만 뽑아내고 싶다면 `filter()` 함수를 사용하면 돼요. 마치 체로 거르는 것처럼 원하는 데이터만 쏙쏙 뽑아낼 수 있죠.
`select()` 함수는 특정 열만 선택해서 새로운 데이터 프레임을 만들어요. 예를 들어, 학생 데이터에서 이름, 수학 점수, 영어 점수 열만 필요하다면 `select()` 함수를 이용해서 간편하게 새로운 데이터 프레임을 만들 수 있어요. 필요 없는 정보는 깔끔하게 제거하고, 필요한 정보만 남기는 거죠. 정말 편리하지 않나요?
`arrange()` 함수는 특정 열을 기준으로 데이터를 정렬해 줘요. 예를 들어, 학생 데이터를 수학 점수 오름차순으로 정렬하고 싶다면 `arrange()` 함수를 사용하면 돼요. 데이터가 순서대로 정렬되어 있으면 한눈에 보기도 좋고 분석하기도 훨씬 편하답니다.
`mutate()` 함수는 새로운 열을 추가하거나 기존 열의 값을 변경할 수 있어요. 예를 들어, 학생 데이터에 수학 점수와 영어 점수의 평균을 나타내는 새로운 열 '평균 점수'를 추가하고 싶다면 `mutate()` 함수를 사용하면 된답니다. 기존 데이터를 바탕으로 새로운 정보를 만들어낼 수 있다는 점에서 아주 강력한 함수예요!
마지막으로 `summarize()` 함수는 데이터를 요약하는 함수예요. 주로 `group_by()` 함수와 함께 사용되는데, 특정 그룹별로 데이터를 요약할 수 있죠. 예를 들어, 학생 데이터에서 반별 수학 점수 평균을 구하고 싶다면 `group_by()` 함수로 반별로 그룹을 나누고 `summarize()` 함수로 각 그룹의 수학 점수 평균을 계산하면 돼요. 데이터의 전체적인 경향을 파악하는 데 아주 유용한 함수랍니다!
dplyr 추가 함수 및 장점
dplyr 패키지에는 위에서 설명한 5가지 핵심 함수 외에도 다양한 함수들이 존재해요. 예를 들어, `bind_rows()` 함수는 여러 개의 데이터 프레임을 행 방향으로 합쳐주고, `bind_cols()` 함수는 열 방향으로 합쳐주는 역할을 해요. `left_join()`, `right_join()`, `inner_join()`, `full_join()`과 같은 join 함수들은 두 개의 데이터 프레임을 특정 열을 기준으로 합쳐주는 기능을 제공해요. 마치 퍼즐 조각을 맞추듯이 서로 다른 데이터 프레임을 연결해서 더욱 풍부한 정보를 얻을 수 있죠!
또한, dplyr 패키지는 tidyverse라는 R 생태계의 일부로, 다른 tidyverse 패키지들과 매끄럽게 연동된다는 장점이 있어요. ggplot2 패키지로 데이터 시각화를 하거나, purrr 패키지로 함수형 프로그래밍 기법을 적용할 때 dplyr 패키지와 함께 사용하면 더욱 강력한 분석 파이프라인을 구축할 수 있답니다! 마치 레고 블록처럼 다양한 패키지를 조합해서 원하는 결과물을 만들어낼 수 있는 거죠! 정말 멋지지 않나요?!
dplyr 패키지의 중요성
dplyr 패키지는 데이터 분석에 있어서 없어서는 안 될 필수 도구예요. 데이터 변형 작업을 훨씬 쉽고 효율적으로 만들어주기 때문에 데이터 분석가라면 꼭 알아둬야 할 패키지 중 하나랍니다! dplyr 패키지를 마스터하고 데이터 분석의 신세계를 경험해 보세요! 데이터 분석의 재미에 푹 빠지게 될 거예요! 다음 실전 예제 파트에서는 더욱 흥미진진한 내용들이 기다리고 있으니 기대 많이 해주세요~!
실전 예제로 데이터 프레임 다루기
자, 이제까지 data.frame()
함수와 dplyr
패키지의 기본적인 사용법을 배워봤으니, 실제 데이터를 가지고 씨름(?) 해 볼 시간이에요! ^^ 복잡해 보일 수 있지만, 차근차근 따라오시면 어렵지 않아요. 걱정 마세요~?
쇼핑몰 판매 데이터 예시
먼저, 쇼핑몰 판매 데이터를 예시로 들어볼게요. 상품명, 가격, 판매량, 판매일, 고객 ID 등의 정보를 담고 있는 데이터라고 가정해 봅시다! 데이터 프레임의 이름은 sales_data
로 지정할 거예요.
# 샘플 데이터 생성 (판매 데이터) sales_data <- data.frame( product_name = c("티셔츠", "바지", "모자", "신발", "가방", "티셔츠", "바지", "모자", "신발", "가방"), price = c(15000, 25000, 12000, 50000, 80000, 15000, 25000, 12000, 50000, 80000), sales_volume = c(100, 50, 80, 30, 20, 120, 60, 90, 40, 25), sales_date = as.Date(c("2023-07-01", "2023-07-01", "2023-07-01", "2023-07-01", "2023-07-01", "2023-07-05", "2023-07-05", "2023-07-05", "2023-07-05", "2023-07-05")), customer_id = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) ) print(sales_data)
이렇게 데이터 프레임을 만들었어요! 이제 dplyr
패키지를 활용해서 데이터를 분석해 볼게요. 먼저, 각 상품별 총 판매액을 계산해보고 싶다고 가정해 봅시다. mutate()
함수를 이용해서 새로운 열 total_sales
를 만들고, price
와 sales_volume
을 곱해서 값을 채워 넣을 수 있어요!
library(dplyr) sales_data <- sales_data %>% mutate(total_sales = price * sales_volume) print(sales_data)
짠! total_sales
열이 추가되었죠?! 이제 각 상품별로 7월 1일과 7월 5일의 판매량 차이를 계산해보고 싶어졌어요. 어떻게 할 수 있을까요? group_by()
함수와 summarize()
함수를 함께 사용하면 돼요!
sales_diff <- sales_data %>% group_by(product_name) %>% summarize(sales_diff = sum(sales_volume[sales_date == "2023-07-05"]) - sum(sales_volume[sales_date == "2023-07-01"])) print(sales_diff)
7월 5일 판매량에서 7월 1일 판매량을 뺀 값이 sales_diff
열에 저장되었어요. 티셔츠는 20개, 바지는 10개 더 팔렸네요! 이처럼 group_by()
함수는 특정 열을 기준으로 데이터를 그룹화하고, summarize()
함수는 그룹별로 요약 통계량을 계산하는 데 사용돼요. 정말 편리하죠?
특정 고객 구매 내역 추출
자, 그럼 이번엔 특정 고객 ID를 가진 고객의 구매 내역만 보고 싶다고 해볼까요? filter()
함수를 사용하면 특정 조건을 만족하는 행만 추출할 수 있어요. 예를 들어, 고객 ID가 1, 3, 5인 고객의 구매 내역만 보고 싶다면 다음과 같이 코드를 작성하면 돼요.
customer_filtered <- sales_data %>% filter(customer_id %in% c(1, 3, 5)) print(customer_filtered)
%in%
연산자를 사용하면 여러 값 중 하나라도 일치하는 행을 추출할 수 있답니다! 이 외에도 select()
함수를 이용하면 특정 열만 선택해서 볼 수도 있어요. 예를 들어, 상품명과 총 판매액만 보고 싶다면 다음과 같이 코드를 작성하면 돼요.
특정 열 선택
selected_columns <- sales_data %>% select(product_name, total_sales) print(selected_columns)
정말 간단하죠?! dplyr
패키지를 사용하면 이처럼 데이터를 원하는 대로 자유자재로 다룰 수 있어요! 물론, 이 외에도 다양한 함수와 기능들이 존재하지만, 오늘은 여기까지만 알아보도록 할게요! 이 정도만 알아도 데이터 분석 작업의 효율성을 훨씬 높일 수 있을 거예요! ^^ 다음에는 더욱 흥미로운 R 활용법을 가지고 돌아올게요! 그때까지 열심히 연습해보세요~?!
R로 데이터 다루는 거, 이제 좀 감 잡히셨나요? 처음엔 복잡해 보여도 막상 해보면 생각보다 쉽다는 걸 느끼셨을 거예요. data.frame() 함수로 데이터 프레임 뼈대를 만들고, dplyr 패키지로 살을 붙여 원하는 모양으로 뚝딱! 만들 수 있잖아요. 마치 요리하는 것 같지 않나요? 다양한 재료(데이터)를 가지고 맛있는 요리(분석 결과)를 만들어내는 멋진 셰프처럼 말이에요. 이제 여러분도 R 데이터 분석의 세계에 한 발짝 더 가까워지셨어요. 앞으로 더 많은 데이터를 만나고, 분석하면서 실력을 쌓아갈 여러분을 응원할게요! 다음 포스팅도 기대해 주세요!
답글 남기기