R의 요인: 범주형 변수 및 연속형 변수
⚡ 스마트 요약
R에서 factor는 범주형 데이터를 정수 코드와 레벨 집합이 쌍을 이루는 벡터로 저장합니다. 이는 R 언어가 제한된 범주 그룹과 연속적인 측정값을 구분하는 방식입니다.
R의 Factor란 무엇인가요?
R의 요인 `Factor`는 제한된 수의 값을 가지는 범주형 변수로, 데이터를 분류하고 저장하는 데 사용됩니다. 정수 벡터 형태로 데이터를 저장하며, R에서는 문자열과 정수 값을 모두 레벨로 저장하는 범주형 변수로 알려져 있습니다. `Factor`는 주로 R을 이용한 통계 모델링 및 탐색적 데이터 분석에 사용됩니다.
내부적으로 팩터는 함께 이동하는 두 개의 객체, 즉 코드의 정수 벡터와 이름이 지정된 문자 속성으로 구성됩니다. 레벨각 코드는 해당 레벨 벡터의 위치를 나타내므로, 팩터를 출력할 때 단어가 표시되는 것입니다. unclass() 숫자를 보여줍니다.
데이터 세트에서는 두 가지 유형의 변수를 구분할 수 있습니다. 범주 형 끊임없는.
- R의 범주형 변수에 대한 기술 통계에서 값은 제한되며 일반적으로 특정 유한 그룹을 기반으로 합니다. 예를 들어 R의 범주형 변수는 국가, 연도, 성별, 직업이 될 수 있습니다.
- 하지만 연속 변수는 정수부터 소수까지 어떤 값이든 가질 수 있습니다. 예를 들어, 매출, 주가 등이 이에 해당합니다.
R은 각 유형에 따라 서로 다른 기본값을 암묵적으로 선택하기 때문에 이러한 차이점을 명확히 구분하는 것이 중요합니다. 숫자형 열은 평균과 중앙값으로 요약되는 반면, 팩터형은 수준별 빈도수로 요약됩니다. 따라서 범주를 텍스트 또는 숫자로 저장하는 방식에 따라 분석 결과가 달라집니다. 더 자세한 저장 모드는 가이드에서 확인할 수 있습니다. R 데이터 유형 및 연산자.
범주형 변수
범주형 변수 R 변수들은 팩터(factor)로 저장됩니다. 아래 코드를 통해 R에서 문자 변수를 팩터 변수로 변환하는 방법을 살펴보겠습니다. 많은 모델링 및 머신러닝 루틴은 원시 텍스트를 직접 처리할 수 없으므로, 모델을 학습시키기 전에 범주를 레벨 또는 숫자로 인코딩해야 합니다.
통사론
factor(x = character(), levels, labels = levels, ordered = is.ordered(x))
R 기본 참조 문서에는 위의 축약형에서 생략된 두 가지 추가 인수가 나와 있습니다. 제외이는 레벨 세트가 생성되기 전에 값을 제거하는 것입니다. nmax이는 매우 큰 벡터의 변환 속도를 높이는 레벨 수에 대한 상한값입니다.
인수 :
- xR에서 범주형 데이터 벡터입니다. 문자열 또는 정수여야 하며, 소수점은 사용할 수 없습니다.
- 레벨: x가 가질 수 있는 가능한 값들의 벡터입니다. 이 인수는 선택 사항입니다. 기본값은 벡터 x의 항목들을 오름차순으로 정렬한 고유 목록입니다.
- 라벨R에서 범주형 데이터 x에 레이블을 추가합니다. 예를 들어, 1은 남성, 0은 여성으로 레이블을 지정할 수 있습니다.
- 제외레벨 세트를 생성할 때 제외할 값들의 벡터입니다. 제외된 값은 결과에서 NA가 됩니다.
- 주문한: 레벨을 주어진 순서대로 정렬된 것으로 간주해야 하는지 여부를 결정하는 논리적 플래그입니다.
- nmax레벨 수에 대한 선택적 상한값으로, 긴 벡터에 유용합니다.
예:
문자 벡터를 팩터로 변환하고 class() 함수를 사용하여 변경 사항을 확인해 보겠습니다.
# Create gender vector gender_vector <- c("Male", "Female", "Female", "Male", "Male") class(gender_vector) # Convert gender_vector to a factor factor_gender_vector <-factor(gender_vector) class(factor_gender_vector)
출력:
## [1] "character" ## [1] "factor"
클래스가 문자형에서 팩터형으로 바뀌었지만 출력되는 값은 전혀 변하지 않았습니다. 변환하는 것이 중요합니다. 현 머신러닝 작업을 시작하기 전에 R에서 범주를 요인 변수로 변환해야 합니다. 그래야만 범주들이 고정되고 검증된 집합이 되기 때문입니다.
R의 범주형 변수는 다음과 같이 나눌 수 있습니다. 명목형 범주형 변수 순서 범주형 변수.
명목형 범주형 변수
명목 범주형 변수는 여러 값을 가질 수 있지만 순서는 중요하지 않습니다. 예를 들어, 남성 또는 여성과 같습니다. R에서 명목 범주형 변수는 순서를 갖지 않습니다.
# Create a color vector color_vector <- c('blue', 'red', 'green', 'white', 'black', 'yellow') # Convert the vector to factor factor_color <- factor(color_vector) factor_color
출력:
## [1] blue red green white black yellow ## Levels: black blue green red white yellow
factor_color만으로는 순서를 알 수 없습니다. 레벨 목록이 알파벳순으로 정렬된 이유는 levels 인수가 제공되지 않았기 때문에 R이 고유 값들을 자체적으로 정렬했기 때문입니다. 이 정렬은 일반 ASCII가 아닌 활성화된 로케일을 따르므로, 순서가 중요한 경우에는 레벨을 명시적으로 지정해야 합니다.
순서형 범주형 변수
순서형 범주 변수는 자연적인 순서를 가지고 있습니다. 순위는 전달된 벡터의 순서에서 비롯됩니다. 레벨 `ordered = TRUE`로 설정하면 R은 해당 시퀀스를 단순한 목록이 아닌 순위로 처리합니다. `ordered = FALSE`로 설정해도 순위가 반전되지 않고 일반적인 순서 없는 요소가 생성됩니다. 가장 높은 순위부터 가장 낮은 순위까지 정렬하려면 레벨 벡터 자체를 반전시키면 됩니다.
예:
요약을 사용하여 R의 각 요인 변수에 대한 값을 계산할 수 있습니다.
# Create Ordinal categorical vector day_vector <- c('evening', 'morning', 'afternoon', 'midday', 'midnight', 'evening') # Convert `day_vector` to a factor with ordered level factor_day <- factor(day_vector, order = TRUE, levels =c('morning', 'midday', 'afternoon', 'evening', 'midnight')) # Print the new variable factor_day
출력:
## [1] evening morning afternoon midday
midnight evening
콘솔에는 먼저 값이 출력되고 그 아래에 순위가 출력됩니다. 다음 코드 블록은 여전히 주석 처리된 Levels 줄로 시작하므로, summary() 호출이 이전 코드에 추가되는 동안에도 순위가 계속 표시됩니다.
## Levels: morning < midday < afternoon < evening < midnight # Append the line to above code # Count the number of occurence of each level summary(factor_day)
출력:
## morning midday afternoon evening midnight ## 1 1 1 2 1
R은 levels 인수에 지정된 대로 레벨을 '아침'부터 '자정'까지 순서대로 정렬합니다. 요소가 순서대로 정렬되어 있으므로 위의 명목 색상 요소에는 적용되지 않는 < 및 >와 같은 비교 연산자도 해당 요소에 적용됩니다.
연속변수
R에서 연속형 변수는 기본값입니다. 이러한 변수는 숫자형 또는 정수형으로 저장됩니다. 아래 데이터셋에서 이를 확인할 수 있습니다. mtcars는 내장 데이터셋으로, 다양한 종류의 자동차 정보를 수집합니다. mtcars를 사용하여 이 데이터셋을 불러온 후, mpg(갤런당 마일) 변수의 클래스 값을 확인해 보면 숫자형 값을 반환하는 것을 알 수 있습니다. 이는 연속형 변수임을 나타냅니다.
dataset <- mtcars class(dataset$mpg)
산출
## [1] "numeric"
모든 숫자 열이 진정한 연속형 데이터는 아닙니다. 동일한 데이터 세트에서 cyl 열에는 4, 6, 8만 저장되고 am 열에는 0과 1만 저장되므로 둘 다 숫자로 저장된 범주형 데이터입니다. 모델링 전에 factor() 함수를 사용하여 이들을 범주형 데이터로 변환하면 R이 4와 6 사이의 간격을 측정 가능한 양으로 처리하는 것을 방지할 수 있습니다. 반대로 연속형 열을 구간으로 나누는 작업은 cut() 함수를 사용하여 처리할 수 있습니다.
R에서의 요인 수준 및 레이블
levels 속성은 출력되는 값과 모델이 기준선으로 사용하는 값을 모두 제어하기 때문에 조정하는 데 가장 많은 시간을 할애하게 될 요소입니다. 네 가지 기본 R 헬퍼 함수를 사용하면 거의 모든 경우를 처리할 수 있습니다.
| 함수 | 그것이하는 일 | 일반적인 사용 |
|---|---|---|
| 레벨(f) | 레벨 이름을 읽거나 바꿉니다. | 약어를 읽기 쉬운 이름으로 변경하기 |
| n레벨(f) | 레벨 수를 반환합니다. | 카테고리를 확인해 보니 조인 후 문제가 발생하지 않았습니다. |
| 레벨 조정(f, ref) | 한 단계 앞으로 이동합니다. | 회귀 분석을 위한 기준선 선택 |
| 드롭레벨(f) | 관측값이 없는 레벨을 제거합니다. | 부분집합 추출 또는 필터링 후 정리 |
아래 블록은 앞서 생성한 색상 및 성별 요소에 네 가지 요소를 모두 적용합니다.
# Inspect the levels of an existing factor levels(factor_color) # the level names, in the order R stored them nlevels(factor_color) # how many distinct levels exist # Rename the levels in place (the new vector must follow the same order) levels(factor_color) <- c('Black', 'Blue', 'Green', 'Red', 'White', 'Yellow') # Attach labels at creation time instead of renaming afterwards gender_coded <- factor(c(1, 0, 0, 1, 1), levels = c(0, 1), labels = c('female', 'male')) # Make 'male' the reference level that modelling functions compare against gender_coded <- relevel(gender_coded, ref = 'male') # Remove levels that survived a subset but no longer occur in the data subset_color <- droplevels(factor_color[1:3])
두 가지 사항을 기억해 두는 것이 좋습니다. levels()에 값을 할당하면 위치를 기준으로 이름이 변경되므로, 벡터가 일치하지 않으면 잘못된 범주로 레이블이 지정되어 아무런 경고 없이 변경됩니다. 또한 부분 집합은 droplevels()가 호출될 때까지 모든 원래 레벨을 유지합니다. 이것이 바로 필터링된 결과가 나타나는 이유입니다. 데이터 프레임 빈 막대도 여전히 표시할 수 있습니다. 라벨 인수는 다시 한번 다릅니다. 생성 시점에 레벨 이름을 지정하고, 중복된 레이블은 여러 입력 값을 하나의 레벨로 병합합니다.
R에서 팩터를 숫자 또는 문자로 변환하는 방법
이것은 R에서 가장 흔한 팩터 관련 버그입니다. 팩터는 정수 코드를 저장하기 때문에 as.numeric()을 호출하면 화면에 표시되는 값이 아닌 해당 코드가 반환됩니다. 예를 들어 2021년부터 2023년까지의 연도를 나타내는 팩터는 1, 2, 3으로 반환됩니다.
# A factor whose labels happen to look like numbers year_factor <- factor(c('2021', '2023', '2022', '2023')) # WRONG: this returns the internal codes 1, 3, 2, 3 - not the years as.numeric(year_factor) # RIGHT: read the label through the levels attribute first as.numeric(levels(year_factor))[year_factor] # Equivalent and easier to remember, but slightly slower as.numeric(as.character(year_factor)) # Back to plain text as.character(year_factor)
R 기본 문서에서는 as.numeric(levels(f))[f]를 올바르고 약간 더 빠른 방법으로 권장하며, as.numeric(as.character(f))는 읽기 쉬운 동등한 방법으로 권장합니다. 두 방법 모두 레이블을 먼저 읽은 다음 변환합니다.
- 캐릭터에 영향을 미치는 요소: as.character(f)는 레이블을 일반 텍스트로 반환합니다.
- 인수분해를 통해 정수 코드로 변환: 코드가 실제로 원하는 코드인 경우 as.integer(f) 또는 unclass(f)를 사용합니다.
- 문자 대 인수: factor(x) 또는 더 빠른 as.factor(x) 단축 함수.
- 숫자를 인수분해하기: 이산 코드의 경우 factor(x), 밴딩이 필요한 연속 값의 경우 cut(x, breaks)를 사용합니다.
모든 경우에 적용되는 안전장치가 하나 있습니다. x의 값이 levels 벡터에 나타나지 않으면 factor() 함수는 오류를 발생시키는 대신 해당 요소를 NA로 설정합니다. 따라서 공백이나 대소문자 차이로 인해 행이 조용히 삭제될 수 있습니다. 변환 전후의 고유 값을 비교하거나 데이터프레임 정렬 새로운 열을 추가하면 문제가 빠르게 드러납니다.
R에서 팩터, 문자, 숫자 데이터 유형은 각각 언제 사용해야 할까요?
저장 모드를 미리 선택하면 나중에 디버깅 시간을 크게 줄일 수 있습니다. 아래 표는 텍스트 또는 코드 열이 취할 수 있는 세 가지 모드를 비교합니다.
| 부동산 | 요인 | 캐릭터 | 숫자 |
|---|---|---|---|
| 저장됨 | 정수 코드와 레벨 속성 | 문자열 | Doubles 또는 정수 |
| 고정된 값 집합 | 네, 레벨별로 정의됩니다. | 아니 | 아니 |
| 맞춤형 디스플레이 주문 | 네, 단계별로 가능합니다. | 알파벳순으로만 | 숫자만 |
| 산수 | 허용되지 않음 | 허용되지 않음 | 허용 |
| 모델 대비 | 자동으로 생성됨 | 강제로 먼저 | 측정값으로 취급됨 |
사용하십시오 인자 값이 알려진 폐쇄형 목록에서 가져온 경우, 표시 순서 또는 순위가 중요한 경우, 또는 해당 열이 모델이나 그래프 범례에 사용되는 경우에 사용하십시오. 문자 자유 텍스트, 식별자 및 이름, 메모, 코드와 같이 새로운 값이 계속해서 추가되는 모든 구문 분석 또는 결합 기준이 되는 모든 항목에 사용하세요. 숫자 두 값 사이의 거리가 의미 있는 경우에만 그렇습니다.
아래 블록은 현재 보유하고 있는 물품을 가장 빠르게 확인하는 방법을 보여줍니다.
# Ask R what each column of a data frame actually is sapply(mtcars, class) # Direct membership tests is.factor(factor_day) is.ordered(factor_day) # unclass() exposes the integer codes hiding behind the labels unclass(factor_color)
두 가지 습관이 선택의 정확성을 유지하는 데 도움이 됩니다. 첫째, 숫자 열에 잘못된 문자가 하나라도 있으면 전체 열이 텍스트로 바뀌기 때문에 매번 데이터를 가져온 후에는 `sapply(df, class)`를 실행해야 합니다. 둘째, 데이터 정리 및 결합이 완료된 후 가능한 한 늦게 팩터로 변환해야 합니다. dplyr 조인과 필터는 여전히 일치하지 않는 레벨 집합이 아닌 일반 문자열을 비교합니다.

