날짜: 2024년 1월 15일
주제: Telco Customer Churn 데이터셋 분석
서론: 데이터 분석의 여정 시작
오늘은 Kaggle의 'Telco Customer Churn' 데이터셋을 통해 데이터 분석의 깊은 바다에 뛰어들었습니다. 이 데이터셋은 통신사 고객 이탈에 관한 풍부한 정보를 담고 있으며, 데이터 분석의 기초부터 심화 기술까지 다루는 데 이상적입니다.
학습 경험: 데이터 분석 기초
1. nunique(): 데이터의 다양성 파악이 함수는 열별로 고유한 값의 개수를 계산하여, 데이터의 다양성을 이해하는 데 도움을 줍니다. 예를 들어, 고객들이 사용하는 서비스 유형의 다양성을 파악하는 데 유용합니다.
nunique() 함수는 pandas 데이터프레임에서 각 열(컬럼)별로 고유한 값들의 개수를 계산하는 데 사용됩니다. 이 함수는 각 열에 포함된 서로 다른 값들의 수를 반환하여, 데이터의 다양성을 이해하는 데 도움을 줍니다. 예를 들어, 어떤 열이 여러 개의 고유한 값을 가지고 있는지, 아니면 대부분의 값이 비슷한지를 파악할 수 있습니다.
예를 들어, 다음과 같은 데이터프레임이 있다고 가정해봅시다:
import pandas as pd
data = {
'A': [1, 2, 3, 4, 4, 4, 5], # 5개의 고유한 값
'B': ['red', 'blue', 'red', 'red', 'blue', 'blue', 'red'], # 2개의 고유한 값
'C': [1, 1, 1, 1, 1, 1, 1] # 1개의 고유한 값
}
df = pd.DataFrame(data)
이 데이터프레임에서 각 열의 고유한 값의 개수를 계산하려면 nunique() 함수를 사용합니다:
nuniq = df.nunique()
print(nuniq)
이 코드는 다음과 같은 결과를 출력할 것입니다:
A 5
B 2
C 1
dtype: int64
여기서, 열 'A'에는 5개의 고유한 값이 있고, 'B'에는 2개, 'C'에는 1개의 고유한 값이 있다는 것을 알 수 있습니다.
이진 변수(바이너리 변수)를 찾기 위해서는 nunique()의 결과에서 값이 2인 열을 필터링할 수 있습니다. 이는 해당 열이 정확히 두 개의 고유한 값을 가지고 있어서 이진적인 특성을 가진다는 것을 의미합니다. 예를 들어, 위의 예시에서 'B' 열은 이진 변수입니다:
bi_cols = nuniq[nuniq == 2].index
print(bi_cols)
결과는 다음과 같습니다:
Index(['B'], dtype='object')
이는 'B' 열이 두 개의 고유한 값(예: 'red', 'blue')으로 구성되어 있어 이진 변수라는 것을 나타냅니다.
2. value_counts(1): 데이터의 분포 이해이 함수는 각 값의 상대적인 빈도를 계산하여, 전체 데이터 중 특정 값이 차지하는 비율을 제공합니다. 이를 통해 특정 서비스의 인기도나 고객 선호도를 분석할 수 있습니다.
value_counts() 함수는 판다스(Pandas)에서 사용되며, 시리즈 내 각 고유 값의 빈도를 계산하는 데 사용됩니다. 이 함수의 매개변수로는 다양한 옵션이 있지만, 여기서 중요한 것은 normalize 매개변수입니다.
- .value_counts(normalize=False) (기본 설정): 이 옵션은 각 고유 값이 나타나는 횟수를 반환합니다. 예를 들어, 어떤 값이 3번 나타나면 그 값의 빈도는 3이 됩니다.
- .value_counts(normalize=True): 이 옵션은 각 고유 값의 상대적인 빈도를 반환합니다. 즉, 전체 데이터 중에서 특정 값이 차지하는 비율을 반환합니다. 결과는 0과 1 사이의 값으로 나타납니다.
- .value_counts(1)은 .value_counts(normalize=True)와 동일합니다. 즉, 이는 각 값의 상대적인 빈도를 0과 1 사이의 비율로 반환합니다.
train_test_split() 함수는 주로 머신러닝에서 데이터를 훈련 세트(Training set)와 테스트 세트(Test set)로 분할하는 데 사용됩니다. 이 함수는 scikit-learn 라이브러리의 model_selection 모듈에 포함되어 있습니다.
기본적인 기능은 다음과 같습니다:
- 데이터 분할: 이 함수는 주어진 데이터(피처들)와 대상 변수(레이블)를 훈련 세트와 테스트 세트로 나눕니다. 이를 통해 모델을 훈련할 때와 평가할 때 서로 다른 데이터 세트를 사용할 수 있습니다.
- 무작위 샘플링: 데이터는 무작위로 섞여서 분할됩니다. 이는 모델이 특정 순서나 패턴에 의존하지 않게 하기 위함입니다.
- 비율 조정: 사용자는 훈련 세트와 테스트 세트의 비율을 조정할 수 있습니다. 예를 들어, 데이터의 80%를 훈련용으로, 20%를 테스트용으로 설정할 수 있습니다.
- 복원 여부: 기본적으로는 비복원 추출 방식을 사용하여, 한 번 선택된 샘플은 다시 선택되지 않습니다.
train_test_split() 함수의 기본적인 사용법은 다음과 같습니다:
from sklearn.model_selection import train_test_split
# X는 피처들, y는 대상 변수(레이블)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
여기서 X와 y는 데이터와 레이블을 나타내며, test_size 매개변수는 테스트 세트가 전체 데이터에서 차지할 비율을 결정합니다. random_state는 무작위 분할의 재현성을 보장하기 위해 사용됩니다.
"무작위 분할의 재현성 보장"은 데이터를 무작위로 분할할 때, 같은 결과를 다시 생성할 수 있는 능력을 의미합니다. 이는 기계 학습에서 매우 중요한 개념입니다. train_test_split() 함수에서 random_state 매개변수를 사용하여 이를 달성합니다.
데이터를 무작위로 분할하는 과정은 특정한 "시드(seed)"를 기반으로 합니다. 이 시드 값이 동일하면 무작위 과정이 항상 동일한 방식으로 수행되어, 같은 무작위 선택 결과를 재현할 수 있습니다.
예를 들어, train_test_split(X, y, test_size=0.2, random_state=42)에서 random_state에 42라는 값을 지정하면, 이 코드를 실행할 때마다 데이터는 항상 같은 방식으로 분할됩니다. 이는 다음과 같은 이점을 제공합니다:
- 재현성: 데이터 분할 과정을 다른 사람이나 다른 시간에도 동일하게 재현할 수 있습니다.
- 결과 비교: 실험의 결과를 다른 모델이나 방법론과 비교할 때, 데이터 분할의 일관성이 유지되어 공정한 비교가 가능합니다.
- 버그 발견: 데이터 분할 과정에서 예상치 못한 버그나 문제가 발생했을 때, 같은 random_state 값을 사용하여 문제를 재현하고 해결할 수 있습니다.
하지만, 실제 운영 환경에서는 무작위 분할이 일반적으로 매번 다를 수 있으며, 이는 더 현실적인 시나리오를 반영합니다. 따라서 모델이 무작위성에 과도하게 의존하지 않는지 확인하는 것도 중요합니다.
4. DecisionTreeClassifier: 의사 결정 트리 구축이 모델은 데이터의 패턴을 학습하여 간단하고 직관적인 규칙을 생성합니다. 이를 통해 고객 이탈의 주요 원인을 파악할 수 있습니다.
DecisionTreeClassifier는 분류를 위해 사용되는 결정 트리 기반의 머신 러닝 모델입니다. 각 매개변수는 모델이 학습하고 트리를 구성하는 방식에 영향을 미칩니다. 아래에서 주요 매개변수들에 대해 설명드리겠습니다:
- criterion ('gini' 또는 'entropy'):
- 이 매개변수는 노드 분할의 품질을 측정하는 기능입니다.
- 'gini'는 불순도를 측정하는 지니 계수를 의미하며, 'entropy'는 정보 이득을 의미합니다.
- 두 기준 모두 불확실성 또는 무질서를 측정하며, 결정 트리가 각 분할에서 얼마나 "좋은" 결정을 내렸는지 평가합니다.
- splitter ('best' 또는 'random'):
- 각 노드에서 분할을 선택하는 전략입니다.
- 'best'는 각 노드에서 가장 좋은 분할을 찾는 것을 의미하며, 'random'은 분할을 무작위로 선택합니다.
- max_depth:
- 트리의 최대 깊이를 지정합니다. None일 경우, 모든 잎이 순수하거나 모든 잎이 min_samples_split보다 적은 샘플을 포함할 때까지 확장됩니다.
- min_samples_split:
- 내부 노드를 분할하는 데 필요한 최소 샘플 수입니다.
- 이 값이 클수록 트리의 성장이 제한됩니다.
- min_samples_leaf:
- 잎 노드가 되기 위해 필요한 최소 샘플 수입니다.
- 이 매개변수도 트리의 성장을 제한하는 데 도움이 됩니다.
- min_weight_fraction_leaf:
- 잎 노드가 되기 위해 필요한 가중치의 최소 합의 비율입니다.
- 이는 min_samples_leaf와 유사하지만 가중치가 적용된 샘플에 대해 계산됩니다.
- max_features:
- 각 분할에서 고려할 최대 기능 수입니다.
- 기능 선택의 다양성을 증가시키기 위해 사용될 수 있습니다.
- random_state:
- 분할 또는 부트스트랩 샘플링 시의 무작위성을 제어합니다.
- max_leaf_nodes:
- 트리에서 최대 잎 노드의 수입니다. None이 아닌 경우, max_depth는 무시됩니다.
- min_impurity_decrease:
- 이 매개변수는 노드 분할이 이루어지기 위해 만족해야 하는 불순도 감소량을 지정합니다.
- 불순도 감소가 이 값보다 크거나 같을 때만 분할이 이루어집니다. 즉, 이 값이 높을수록 트리가 덜 복잡해집니다.
- class_weight:
- 각 클래스에 대한 가중치를 지정합니다. 주로 불균형 데이터셋을 다룰 때 유용합니다.
- 클래스 가중치는 모델이 더 적은 데이터를 가진 클래스에 더 많은 중요도를 부여하는 데 도움이 됩니다.
- ccp_alpha:
- 비용 복잡도 가지치기(Cost Complexity Pruning)의 파라미터입니다.
- 이 값이 높을수록 트리가 더 간소화됩니다. 이는 트리의 크기를 줄이고 과적합을 방지하는 데 도움이 됩니다.
결정 트리는 데이터의 규칙을 학습하여 간단하고 이해하기 쉬운 규칙 기반 모델을 만드는 데 사용됩니다. 이러한 매개변수들을 통해 트리의 복잡성, 성장 방식, 그리고 분할 결정 방식을 제어할 수 있습니다. 이 매개변수들을 적절히 조정함으로써, 과적합을 방지하고 모델의 일반화 능력을 향상시킬 수 있습니다.
5. export_text(): 트리 구조의 시각화학습된 결정 트리의 구조를 텍스트 형태로 출력하여, 모델의 결정 과정을 이해하고 해석하는 데 도움이 됩니다.
export_text() 함수는 결정 트리의 구조를 텍스트 형태로 출력하는 데 사용됩니다. 이 함수는 sklearn.tree 모듈의 export_text 함수를 사용하여 호출됩니다. 이 함수는 학습된 결정 트리 모델을 입력으로 받아, 트리의 규칙을 텍스트 형식으로 반환합니다. 이를 통해 트리의 구조를 쉽게 이해하고 분석할 수 있습니다.
다음은 export_text() 함수의 사용 예시입니다:
from sklearn.tree import DecisionTreeClassifier, export_text
# 결정 트리 모델을 학습시킵니다.
clf = DecisionTreeClassifier()
clf.fit(X_train, y_train)
# 트리 구조를 텍스트 형태로 추출합니다.
tree_rules = export_text(clf, feature_names=feature_names)
# 텍스트 형태의 트리 구조를 출력합니다.
print(tree_rules)
여기서 X_train과 y_train은 각각 학습 데이터와 타겟 레이블을 나타냅니다. feature_names는 데이터셋의 특성 이름을 나타내는 ==리스트==입니다. export_text() 함수는 트리의 각 노드에서의 분할 조건, 잎 노드에서의 클래스 분포 등을 포함한 텍스트 정보를 제공합니다.
이 방법을 통해, 학습된 결정 트리 모델의 의사 결정 과정을 텍스트로 쉽게 확인할 수 있으며, 모델의 해석성을 높일 수 있습니다.
개인적 성찰: 데이터 분석의 가치
이러한 분석 기법들은 중학교 국어 교사로서 저에게 데이터에 숨겨진 이야기를 발견하고 해석하는 새로운 방법을 제시합니다. 데이터 분석은 단순히 숫자를 넘어서 의미와 패턴을 찾는 여정이며, 이는 언어 교육에도 적용될 수 있는 중요한 기술입니다.
마무리 생각:
오늘 배운 데이터 분석 기법들은 앞으로 데이터를 보는 새로운 시각을 제공할 것입니다. 이 기술들을 활용하여 더 깊이 있는 데이터 분석 프로젝트에 도전해보고 싶습니다. 여러분도 데이터 분석의 여정에 함께 도전해보세요!
'국어교사의 파이썬 일기' 카테고리의 다른 글
중학교 국어 교사의 파이썬 일기: 날짜 다루기- strftime의 활용과 HTTP 요청 (0) | 2024.01.14 |
---|---|
중학교 국어 교사의 파이썬 일기: 데이터 조작 및 웹 스크래핑 기초 소개 (1) | 2024.01.14 |
중학교 국어 교사의 파이썬 일기: 주식 분석을 위한 list와 for 문 탐색하기 (1) | 2024.01.14 |