설문조사 응답 데이터를 다루다 보면 “매우 만족”, “만족”, “보통”, “불만족”, “매우 불만족” 같은 5점 척도 데이터 텍스트를 만나게 됩니다. 이 데이터는 겉보기엔 그저 단순한 자연어 문자열 같지만, 데이터 분석가나 통계학자 입장에서는 명확한 계급(의미적 서열)이 존재하는 특별한 문자(Ordinal Variable 등)입니다.
만약 이런 데이터를 다룰 때 R에서 일반 문자(Character)형으로 둔 채 냅다 바(Bar) 차트나 막대 그래프를 그려버리면, 우리가 원하는 “나쁘다-보통-좋다”의 자연스러운 사고 순서가 아니라 “나쁘다-좋다-보통” 처럼 그저 무심한 가나다순으로 마음대로 엉망진창 정렬되어 버립니다. (데이터 분석 초보가 많이 하는 실수죠!) 오늘은 이 카테고리의 출력 순서를 내 마음대로 절대 통제하고 시각화 그룹화를 장악할 수 있는 강력한 무기, 팩터(Factor)에 대해 완벽히 파헤쳐봅니다.
1. 팩터(Factor)란 대체 무엇일까?
팩터는 생물학적 성별(남/여)이나 학점(A/B/C/D), 부서명처럼 “가질 수 있는 값의 종류(분류군)가 논리적으로 정해져 있는 범주형(Categorical) 데이터”를 압축 보관하기 위해 통계 언어 R에서 특별히 고안된 데이터 구조입니다. 인간 눈에는 그냥 문자로 보이지만 시스템 뒷단에는 레벨(Level)이라는 보이지 않는 메타 서열 순위표를 몰래 달고 있는 영리한 녀석입니다.
gender <- c("남자", "여자", "남자", "남자", "여자")
# 그냥 문자열 덩어리를 팩터(Factor)로 강제 변신!
gender_factor <- factor(gender)
gender_factor
> [1] 남자 여자 남자 남자 여자
> Levels: 남자 여자
실제 출력된 결과를 유심히 보면 마지막에 Levels: 남자 여자라는 독특한 꼬리표가 붙어 반환되어 나옵니다. 바로 이 순간이 R 엔진이 “아하, 이 데이터 컬럼이 가질 수 있는 카테고리 속성에는 이 세계에 두 종류밖에 없구나” 라고 완벽히 메타 등록을 한 순간입니다.
2. 팩터를 쓰는 진짜 핵심 이유: 레벨 정렬(Levels) 직접 통제
팩터를 쓰는 가장 큰, 단 하나의 위대한 이유 중 하나는 다분히 시각화나 통계표를 출력할 때 내가 원하는 순서대로 범주의 우선순위(출력순)를 고정할 수 있다는 것입니다. 별도 옵션 세팅 없이 팩터를 냅다 만들면? R은 무조건 가나다 또는 알파벳 내림차순(A-B-C) 등 기계적인 순서로 매겨 버립니다.
x <- c("좋음", "아주 좋음", "나쁨", "아주 나쁨", "보통")
# 내가 원하는 순서대로 levels 배열을 조작해서 고정하기
x_factor <- factor(x, levels = c("아주 나쁨", "나쁨", "보통", "좋음", "아주 좋음"))
# 제대로 세팅이 되었는지 정렬(sort) 함수로 확인해 봅시다.
sort(x_factor)
> [1] 아주 나쁨 나쁨 보통 좋음 아주 좋음
> Levels: 아주 나쁨 나쁨 보통 좋음 아주 좋음
위와 같이 levels = c(...) 옵션 영역에 분석가가 의도한 인간 논리대로 순서를 지정해주면, 저 거칠고 제멋대로인 텍스트 덩어리들이 그래프나 테이블에서 엑셀의 커스텀 정렬처럼 이쁘고 당연하게 차곡차곡 정리되어 출력됩니다!
3. 카테고리 영문/한글 이름표를 싹 다 일괄 물갈이하고 싶다면?
이미 시스템에 등록된 텍스트 값이 영어 논문 제로 마음에 들지 않아 데이터를 통째로 변경하고 싶다면? 하나하나 힘들게 찾아서 정규표현식으로 바꾸고 앉아 있을 필요가 없습니다. 대신 단순히 시스템이 들고 있는 레벨의 이름표 메뉴판 마스터 배열만 바꿔 끼워주면 내부의 백만 개 데이터가 순식간에 매칭되어 변경됩니다.
# 앞서 만든 x_factor의 옷(Level 껍데기)을 영어 베이스로 일괄 갈아 입혀버리자.
levels(x_factor) <- c("Very Bad", "Bad", "Normal", "Good", "Very Good")
x_factor
> [1] Good Very Good Bad Very Bad Normal
> Levels: Very Bad Bad Normal Good Very Good
보이시나요? 한글의 촌스러운 로컬 데이터 문자열들이 levels(데이터) <- c(...) 명령어 단 한 줄의 마법으로 최고급 레벨의 글로벌 영문 통계 데이터로 탈바꿈했습니다.
4. 순서형 서열 팩터(Ordered Factor)의 강력한 부등호 로직 구사
팩터를 만들 때 옵션 맨 끝에 ordered = TRUE 옵션을 하나 더 얹어서 켜주면, 이 범주들이 단순한 횡적 집단이 아니라 “계급의 크기고 작음(위계질서)의 명백한 차이가 존재함”을 컴퓨터 엔진에게 확실히 각인시켜 줍니다.
# 계급이 존재하는 서열 셋팅을 ON!
x_ordered <- factor(x,
levels = c("아주 나쁨", "나쁨", "보통", "좋음", "아주 좋음"),
ordered = TRUE)
# 서열이 잡혔기 때문에 이젠 문자에 대고 부등호 크기 비교(>, <) 연산이 가능합니다!
x_ordered[x_ordered > "보통"]
> [1] 좋음 아주 좋음
> Levels: 아주 나쁨 < 나쁨 < 보통 < 좋음 < 아주 좋음
원래 프로그래밍 언어의 텍스트 문자끼리는 크다/작다 구분이 아예 불가능합니다. (“바나나”가 큰지 “사과”가 큰지 말이 안 되죠)
하지만 서열이 세팅된 ordered factor 객체가 되니 출력 하단에 부등호(`<`)가 달리는 것은 물론, 수식 필터 조건 부등호(>) 단 하나만으로 “보통 이상 상위 등급 그룹만” 싹 뽑아내 필터링 해버리는 엄청난 기능을 쓸 수 있게 되었습니다!
결론적으로, 데이터 시각화(특히 ggplot2)를 예쁘게 그릴 때 컬럼의 팩터 세팅을 안 해주면 영업실적 월별 바차트 데이터 그래프가 1월 다음 10월, 11월 다음 2월 순서로 개상식으로 엉망으로 튀어 그지같이 그려지곤 합니다. 오늘 배운 factor(levels = c(...)) 순방향 제어 스킬만 몸에 익히신다면, 앞으로 논문이나 보고서의 꼬인 그래프를 만날 일은 인생에 절대 결단코 없을 겁니다!
당신이 좋아할 만한 콘텐츠
by Google Adsense