파이썬 pandas 더미 변수 완전정복 get_dummies prefix columns drop_first 사용법
📌 범주형 데이터를 모델 준비용 숫자로 바꾸는 가장 깔끔한 방법을 한 번에 정리합니다
데이터프레임에 범주형 열이 섞여 있으면 분석은 쉬워 보이지만 모델은 쉽게 흔들립니다.
그래서 많은 분들이 처리 초반에 막히곤 하죠.
실무에서는 조금의 실수로도 열 이름이 난잡해지거나 기준 범주가 어긋나서 성능이 들쭉날쭉합니다.
자동으로 안전하게 변환하고, 열 이름을 일관되게 붙이고, 회귀나 분류 모델에서 다중공선성을 줄이는 방법까지 한 번에 관리할 수 있다면 훨씬 수월해집니다.
이번 글은 그 핵심에 해당하는 pandas의 get_dummies를 정확한 옵션과 함께 설명하며, 실전에서 바로 복붙해도 문제없이 돌아가도록 정리합니다.
실수하기 쉬운 포인트를 짚어 오해를 줄이고, 팀 규칙에 맞춘 컬럼 네이밍까지 깔끔하게 맞추는 데 초점을 맞춥니다.
핵심은 단순합니다.
pandas의 더미 변수 변환은 get_dummies로 수행하며, 특히 prefix, columns, drop_first 옵션을 정확히 이해해야 합니다.
prefix는 생성되는 더미 열의 이름 규칙을, columns는 변환 대상 열을, drop_first는 기준 범주를 하나 제거해 다중공선성 리스크를 줄이는 역할을 합니다.
이 세 가지를 상황에 맞게 조합하면 전처리 파이프라인이 단단해지고, 스케일링이나 파이프라인 연결 과정에서도 예측 가능성이 높아집니다.
아래 목차에 따라 기본 원리에서 실전 예제까지 차근차근 안내합니다.
📋 목차
📊 get_dummies 기본 개념과 동작 원리
pandas의 더미 변수 변환은 get_dummies 함수로 수행합니다.
범주형 값을 0과 1로 이뤄진 여러 열로 펼쳐 모델이 해석 가능한 숫자 형태로 정형화합니다.
원본 데이터는 변환 대상 열을 기준으로 각 범주마다 별도의 열을 만들고, 해당 행이 그 범주에 속하면 1, 아니면 0을 기록합니다.
이 과정에서 데이터 손실 없이 정보 표현력을 유지하면서도 선형 모델, 트리 모델 등 대부분의 알고리즘에 적합한 형태가 됩니다.
핵심 옵션은 prefix, columns, drop_first입니다.
각 옵션을 정확히 이해하면 열 이름 충돌을 피하고, 필요한 열만 변환하며, 다중공선성 문제를 예방할 수 있습니다.
🧠 get_dummies가 하는 일
get_dummies는 지정한 열의 고유값들을 확인한 뒤, 그 개수만큼의 이진 열을 생성합니다.
예를 들어 성별 열이 [Male, Female]이라면 Gender_Male, Gender_Female처럼 두 개의 열이 만들어지고, 각 행에 해당하는 범주만 1로 표시됩니다.
여러 열을 동시에 변환하면 각 열별로 독립적으로 더미 열이 만들어집니다.
이 변환은 원-핫 인코딩과 같은 의미로 사용되며, 결측값이 있을 때는 별도의 열로 표시할지 여부를 선택할 수 있습니다.
이렇게 생성된 숫자 열은 스케일링, 교차검증, 파이프라인 등 후속 단계와 곧바로 연결하기 좋습니다.
🧩 prefix, columns, drop_first 핵심 이해
prefix는 생성되는 더미 열의 이름 앞부분을 지정해 가독성과 충돌 방지를 도와줍니다.
문자열을 주면 모든 더미 열 앞에 동일 접두사가 붙고, 딕셔너리를 주면 열별로 접두사를 다르게 설정할 수 있습니다.
columns는 변환할 대상 열 목록을 명시합니다.
데이터프레임 전체가 아닌 특정 열만 선택적으로 더미화할 때 필수적입니다.
drop_first는 각 범주 집합에서 첫 번째 범주를 기준으로 제거해 하나의 기준선을 만들고, 나머지 열로만 정보를 표현하도록 합니다.
이 설정은 선형 회귀처럼 절편이 있는 모델에서 다중공선성을 완화하는 데 도움이 됩니다.
import pandas as pd
df = pd.DataFrame({
"city": ["Seoul", "Busan", "Seoul", "Daegu"],
"grade": ["A", "B", "A", "C"],
"price": [10, 12, 9, 15]
})
# 핵심: prefix, columns, drop_first를 조합
encoded = pd.get_dummies(
df,
columns=["city", "grade"],
prefix={"city": "cty", "grade": "gr"},
drop_first=True
)
print(encoded)
# price는 그대로 유지되고,
# city와 grade는 첫 범주를 기준으로 제거된 원-핫 열만 남습니다.
💡 TIP: prefix_sep으로 접두사와 범주명을 구분하는 기호를 바꿀 수 있습니다.
기본은 ‘_’이며, 조직 규칙에 맞춰 ‘-‘나 ‘.’ 등으로 변경해 컬럼 네이밍 규칙을 표준화하세요.
| 상황 | 권장 설정 |
|---|---|
| 다양한 열을 한 번에 변환 | columns로 대상 명시, prefix는 딕셔너리로 열별 접두사 부여 |
| 선형 회귀 사용 | drop_first=True로 기준 범주 제거 |
| 열 이름 충돌 우려 | prefix와 prefix_sep로 명확한 네이밍 규칙 적용 |
⚠️ 주의: drop_first는 기준 범주가 어떤 값인지 명확히 알고 있을 때만 사용하세요.
학습·추론 데이터의 범주 구성이 달라지면 기준선이 의도치 않게 바뀌어 계수 해석이 흔들릴 수 있습니다.
- 🧭columns로 변환 대상을 명시했는가
- 🏷️prefix와 prefix_sep으로 열 이름 충돌을 피했는가
- ⚖️선형 모델이라면 drop_first=True를 검토했는가
💬 핵심 요약:
더미 변수는 정보 손실 없이 범주를 수치화하는 안전한 정형화 방식이며, get_dummies의 prefix, columns, drop_first를 알맞게 조합하면 예측 가능하고 해석 가능한 특성 공간을 설계할 수 있습니다.
🧩 prefix와 prefix_sep로 컬럼명 설계하기
get_dummies에서 열 이름을 정리하는 핵심 옵션은 prefix와 prefix_sep입니다.
이 두 옵션을 잘 활용하면 데이터프레임의 더미 변수 열 이름이 규칙적으로 정리되어 협업, 시각화, 후속 분석에서 혼란을 줄일 수 있습니다.
특히 여러 개의 범주형 열을 동시에 변환할 때, 이름 충돌이나 직관적이지 않은 컬럼명이 생기지 않도록 관리하는 것이 중요합니다.
🏷️ prefix 옵션으로 접두사 지정
prefix는 생성된 더미 열 이름 앞부분에 원하는 접두사를 붙입니다.
기본적으로는 원래 열 이름이 접두사 역할을 합니다.
하지만 프로젝트 규칙에 맞게 prefix를 커스터마이즈하면 컬럼명이 직관적이고 일관되게 유지됩니다.
예를 들어 열 이름이 gender일 때 prefix를 g로 설정하면 g_Male, g_Female과 같이 간단한 이름을 얻을 수 있습니다.
또한 딕셔너리 형태로 {열이름: 접두사}를 전달하면 열마다 다른 접두사를 지정할 수 있습니다.
df = pd.DataFrame({"gender": ["M", "F", "M"], "city": ["Seoul", "Busan", "Seoul"]})
pd.get_dummies(df, columns=["gender", "city"], prefix={"gender": "g", "city": "cty"})
# 결과: g_M, g_F, cty_Seoul, cty_Busan
🔗 prefix_sep로 구분자 변경
기본적으로 prefix와 값 사이에는 밑줄(_)이 들어갑니다.
하지만 어떤 경우에는 언더스코어 대신 다른 구분자가 더 유용할 수 있습니다.
예를 들어 데이터베이스 규칙상 언더스코어 대신 점(.)이나 하이픈(-)을 선호한다면 prefix_sep 옵션으로 변경할 수 있습니다.
이렇게 하면 팀이나 시스템 규칙에 맞는 컬럼명 체계를 유지할 수 있습니다.
df = pd.DataFrame({"color": ["red", "blue", "red"]})
pd.get_dummies(df, columns=["color"], prefix="clr", prefix_sep=".")
# 결과: clr.red, clr.blue
💡 TIP: 컬럼명이 긴 경우에는 prefix로 짧게 줄이고, prefix_sep을 ‘.’처럼 단순하게 설정하면 분석 리포트와 시각화 단계에서 훨씬 깔끔해집니다.
| 옵션 | 역할 |
|---|---|
| prefix | 더미 열 이름 앞에 붙는 접두사 |
| prefix_sep | 접두사와 범주값을 구분하는 기호 |
⚠️ 주의: 접두사 규칙을 데이터 전처리 단계와 모델링 단계 모두에서 동일하게 유지하지 않으면, 나중에 특성 매칭이 어긋나 학습/추론 시 오류가 발생할 수 있습니다.
- 🏷️prefix를 열 이름 규칙에 맞게 커스터마이즈했는가
- 🔗prefix_sep으로 원하는 구분자를 적용했는가
- 📑여러 열을 동시에 변환할 때 딕셔너리 형태로 접두사를 관리했는가
💬 prefix와 prefix_sep은 단순한 옵션 같지만, 협업과 장기 유지보수에서 열 이름을 직관적이고 일관되게 유지하는 핵심 도구입니다.
🗂️ columns 인자로 선택 변환하기
데이터프레임에는 수치형과 범주형 열이 섞여 있는 경우가 많습니다.
이때 get_dummies를 그대로 사용하면, 예상치 못하게 모든 문자열 또는 범주형 열이 변환되어 불필요한 더미 변수가 생길 수 있습니다.
이 문제를 피하려면 columns 인자를 사용해 변환할 열만 명확히 지정하는 것이 가장 안전합니다.
🎯 columns로 특정 열만 선택
columns 옵션은 리스트 형태로 변환할 열 이름을 전달합니다.
예를 들어 “city”, “gender” 같은 범주형 열만 지정하면, 다른 수치형 열은 그대로 유지됩니다.
이 방식은 데이터프레임에 수백 개의 열이 있는 상황에서도 더미화 과정을 통제할 수 있어 유용합니다.
df = pd.DataFrame({
"city": ["Seoul", "Busan", "Seoul"],
"gender": ["M", "F", "M"],
"age": [23, 31, 45]
})
pd.get_dummies(df, columns=["city"])
# 결과: gender와 age는 그대로 유지,
# city만 더미 열로 변환
🛡️ 불필요한 변환 방지
columns 인자를 생략하면 pandas는 모든 object와 category 타입 열을 자동 변환합니다.
이 경우 이메일, ID 같은 단순 문자열 열까지 변환되는 문제가 생길 수 있습니다.
분석이나 모델링에는 필요하지 않은 열까지 더미 변환되면 데이터 차원이 불필요하게 커지고 메모리 낭비로 이어집니다.
따라서 반드시 columns를 지정하는 습관을 들이는 것이 좋습니다.
| 상황 | columns 설정 |
|---|---|
| 모든 범주형 열 변환 | columns 지정 생략 |
| 특정 열만 변환 | columns=[“city”, “gender”] |
| 문자열 열 변환 제외 | columns에서 제외 |
💡 TIP: 범주형 열만 자동 선택하려면 df.select_dtypes(include=”category”) 같은 방법으로 리스트를 만든 뒤 columns 인자로 전달하면 안전합니다.
- 🗂️columns 인자를 사용해 필요한 열만 지정했는가
- 🚫불필요한 문자열 열이 변환되지 않도록 관리했는가
- ⚡대규모 데이터셋에서 메모리 낭비를 줄였는가
⚠️ 주의: columns 인자를 지정하지 않으면 예상치 못한 열까지 변환될 수 있습니다.
특히 문자열 ID, 코드 값은 더미 변수로 만들 필요가 없으니 반드시 열을 선별하세요.
💬 columns 인자는 불필요한 변환을 방지하고, 메모리 사용을 최적화하며, 전처리 파이프라인을 더 예측 가능하게 만드는 필수 옵션입니다.
🔀 drop_first와 단일 기준으로 다중공선성 완화
범주형 변수를 더미 변수로 변환하면, 기본적으로 각 범주마다 하나의 열이 생성됩니다.
예를 들어 성별(gender)에 M과 F가 있으면 gender_M, gender_F 두 개의 열이 만들어집니다.
하지만 이 두 열은 서로 완벽하게 반대되는 관계(즉, 선형 종속)를 가지므로 선형 회귀나 로지스틱 회귀 모델에서 다중공선성 문제가 발생할 수 있습니다.
이런 경우를 방지하기 위해 drop_first=True 옵션을 활용합니다.
⚖️ drop_first의 원리
drop_first 옵션을 True로 설정하면 각 범주형 변수에서 첫 번째 범주를 기준으로 제거합니다.
즉, 성별이 M, F라면 gender_M 열은 제거되고 gender_F만 남게 됩니다.
이 경우 모델은 gender_F 값이 1이면 Female, 0이면 Male로 해석할 수 있어 기준 범주를 명시적으로 설정하지 않아도 됩니다.
이는 다중공선성 문제를 줄여주면서 회귀 계수 해석도 간단해집니다.
df = pd.DataFrame({
"gender": ["M", "F", "M", "F"],
"city": ["Seoul", "Busan", "Seoul", "Daegu"]
})
# drop_first 사용
encoded = pd.get_dummies(df, drop_first=True)
print(encoded)
# 결과:
# gender 열은 F만 남고,
# city는 첫 번째 범주를 제거한 나머지만 남습니다.
📉 언제 drop_first를 써야 할까
drop_first는 모든 경우에 필요한 것은 아닙니다.
트리 기반 모델(XGBoost, RandomForest 등)은 다중공선성에 영향을 받지 않으므로 drop_first를 설정할 필요가 없습니다.
반면, 선형 회귀나 로지스틱 회귀처럼 계수 기반 모델은 drop_first가 권장됩니다.
이 옵션은 단순히 열을 줄이는 것이 아니라, 기준 범주를 설정해 해석 가능성을 높여주는 효과도 있습니다.
| 모델 유형 | drop_first 필요 여부 |
|---|---|
| 선형 회귀 / 로지스틱 회귀 | 필요 (다중공선성 완화) |
| 트리 기반 모델 | 불필요 (영향 없음) |
| 신경망 | 선택적 (필수는 아님) |
💡 TIP: drop_first=True를 쓸 경우 기준 범주가 자동으로 첫 번째 값으로 선택됩니다.
데이터셋마다 순서가 달라질 수 있으므로, 카테고리형 dtype을 직접 정의해 기준 범주를 고정하는 것이 안전합니다.
- ⚖️선형 회귀/로지스틱 회귀라면 drop_first=True 설정
- 📌트리 기반 모델에서는 drop_first 불필요
- 🔒카테고리 순서를 고정해 기준 범주를 제어했는가
⚠️ 주의: drop_first는 단순히 열을 줄이는 옵션이 아닙니다.
기준 범주가 바뀌면 회귀 계수 해석도 달라지므로, 반드시 도메인 지식을 반영해 기준 범주를 선택하세요.
💬 drop_first는 다중공선성을 예방하고 해석 가능한 모델을 만드는 데 핵심적인 옵션입니다.
하지만 어떤 모델에서는 불필요할 수 있으니 상황에 맞게 선택하는 것이 중요합니다.
🧪 실전 예제와 주의할 점
앞에서 설명한 prefix, columns, drop_first 옵션을 실제 데이터셋에 적용하면 어떻게 동작할까요?
아래 예제는 다양한 열을 포함한 데이터프레임에서 필요한 열만 더미 변수로 변환하고, 네이밍 규칙과 다중공선성 방지까지 적용한 실전 사례를 보여줍니다.
import pandas as pd
df = pd.DataFrame({
"city": ["Seoul", "Busan", "Seoul", "Daegu"],
"gender": ["M", "F", "M", "F"],
"age": [25, 32, 40, 28],
"grade": ["A", "B", "A", "C"]
})
encoded = pd.get_dummies(
df,
columns=["city", "gender", "grade"],
prefix={"city": "cty", "gender": "g", "grade": "gr"},
prefix_sep=".",
drop_first=True
)
print(encoded)
위 결과에서 age는 그대로 유지되고, city·gender·grade 열은 더미 변수로 변환됩니다.
drop_first=True 옵션 때문에 각 열에서 첫 번째 범주는 제거되어 다중공선성이 완화됩니다.
prefix와 prefix_sep으로 컬럼명 규칙을 통일해 직관적인 열 이름을 얻을 수 있습니다.
📝 주의할 점
실전에서는 데이터셋의 범주 구성이 훈련 데이터와 테스트 데이터에서 다를 수 있습니다.
예를 들어 학습 데이터에는 ‘Daegu’가 없는데 테스트 데이터에는 등장할 수 있습니다.
이 경우 get_dummies 결과의 열 구성이 달라져 오류가 발생할 수 있습니다.
따라서 scikit-learn의 OneHotEncoder 같은 도구와 함께 사용하거나, 데이터셋 전체를 합쳐 더미 열 구성을 미리 고정하는 전략이 필요합니다.
💡 TIP: 범주가 일정하지 않은 경우는 pd.Categorical을 활용해 가능한 범주를 사전에 정의해두면 안정적인 열 구성을 보장할 수 있습니다.
| 문제 상황 | 해결 방법 |
|---|---|
| 훈련·테스트 범주 불일치 | pd.Categorical로 범주 고정 |
| 불필요한 문자열 열까지 변환 | columns 인자로 선택 변환 |
| 열 이름 가독성 부족 | prefix와 prefix_sep으로 네이밍 통일 |
- 🧪실제 데이터에 prefix, columns, drop_first를 조합했는가
- ⚠️훈련/테스트 범주 불일치 문제를 고려했는가
- 📑열 이름 규칙이 일관되게 유지되는가
⚠️ 주의: get_dummies는 간단하고 빠르지만, 범주 구성이 변동되는 환경에서는 안정성이 떨어질 수 있습니다.
프로덕션 환경에서는 sklearn의 OneHotEncoder와 같은 도구와 병행해 사용하는 것이 안전합니다.
💬 실전에서는 단순히 get_dummies를 호출하는 것을 넘어서, 열 선택·네이밍·기준 범주 설정·범주 고정까지 고려해야 안정적이고 재현성 있는 전처리 파이프라인을 설계할 수 있습니다.
❓ 자주 묻는 질문 FAQ
get_dummies와 OneHotEncoder는 뭐가 다른가요?
drop_first를 사용하지 않으면 꼭 문제가 생기나요?
prefix와 prefix_sep을 꼭 설정해야 하나요?
columns 인자를 지정하지 않으면 어떤 문제가 생기나요?
훈련 데이터와 테스트 데이터의 범주 구성이 다르면 어떻게 하나요?
get_dummies에서 결측값은 어떻게 처리되나요?
범주가 많은 열을 get_dummies로 변환해도 괜찮을까요?
get_dummies 결과 열 순서는 항상 일정한가요?
📌 pandas get_dummies 활용 정리
pandas의 get_dummies는 범주형 데이터를 분석과 모델 학습에 적합한 숫자 형태로 변환하는 가장 직관적이고 간단한 방법입니다.
특히 prefix와 prefix_sep을 활용하면 컬럼명을 일관되게 관리할 수 있고, columns로 필요한 열만 선별해 변환할 수 있으며, drop_first를 통해 선형 모델에서 다중공선성을 예방할 수 있습니다.
이 세 가지 옵션을 적절히 조합하면 전처리 과정이 단순해지고 안정성이 높아져 실무 적용에 유리합니다.
실전에서는 훈련 데이터와 테스트 데이터의 범주 불일치, 결측값 처리, 범주 개수 폭발 등 추가적인 이슈를 고려해야 합니다.
필요하다면 pd.Categorical을 사용해 범주를 고정하거나, scikit-learn의 OneHotEncoder와 병행해 더 안정적인 파이프라인을 구축하는 것이 좋습니다.
즉, get_dummies는 간단하면서도 강력한 도구이지만, 옵션을 올바르게 이해하고 데이터 특성을 반영해야 진정한 효과를 발휘할 수 있습니다.
🏷️ 관련 태그 : pandas, get_dummies, 더미변수, 원핫인코딩, 데이터전처리, drop_first, prefix옵션, 머신러닝파이프라인, 데이터분석, 파이썬