Jupyter 에서 사용할 수 있는 패키지를 정리해보겠습니다.
또한 많이 사용하는 Usecase도 같이 정리해보겠습니다.
- Pandas:
데이터 프레임 구조를 다루기 위해 가장 널리 사용되는 라이브러리입니다. 데이터 로드, 조작, 결합, 필터링 등 다양한 기능을 제공합니다.import pandas as pd
- NumPy: 수치 데이터를 효율적으로 처리하는 데 유용합니다. 특히 배열 연산과 수학적 함수 사용이 가능합니다.
import numpy as np - Scikit-learn: 머신러닝 라이브러리지만 데이터 전처리와 특성 엔지니어링 기능도 다양합니다. 연속형 변수를 구간화하거나 스케일링할 때 사용할 수 있는 함수가 있습니다.
from sklearn.preprocessing import KBinsDiscretizer - Matplotlib, Seaborn: 데이터 시각화를 위한 라이브러리로, 데이터를 가공한 후 결과를 시각화하는 데 유용합니다.
import matplotlib.pyplot as plt import seaborn as sns - Feature-engine: 다양한 특성 엔지니어링 기능을 제공하는 라이브러리입니다. 연속형 변수의 구간화, 다중공선성 제거 등 데이터 전처리에 필요한 기능을 지원합니다.
import feature_engine as fe - 연속형 변수 구간화 예시
- Scikit-learn의 KBinsDiscretizer를 사용하여 구간화하는 방법
from sklearn.preprocessing import KBinsDiscretizer # 예시 데이터 data = pd.DataFrame({'age': [23, 45, 21, 50, 31, 40, 28, 35]}) # KBinsDiscretizer를 사용해 연속형 변수를 구간화 (3개 구간으로 구분) kb = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform') data['age_binned'] = kb.fit_transform(data[['age']]) print(data) - Binning 을 이용한 방법
- Binning을 통해 연속형 변수인 연령을 청소년, 청년, 중년 등으로 나누면 각 그룹에 대해 별도로
마케팅 전략을 수립할 수 있습니다.
import pandas as pd import numpy as np # 예시 데이터 data = pd.DataFrame({'age': [18, 22, 35, 45, 52, 68, 77, 85]}) # 연령을 3개의 그룹으로 구간화 data['age_group'] = pd.cut(data['age'], bins=[0, 29, 59, 100], labels=['청소년', '청년', '중년']) print(data) - 의사결정 나무를 이용한 방법
- 의사결정 나무는 데이터의 특징을 기준으로 가지를 나누어 결과를 예측하는 데 유용합니다.
각 변수의 중요도를 시각적으로 확인하고 해석하기 쉽다는 장점이 있습니다.
from sklearn.tree import DecisionTreeClassifier, plot_tree import matplotlib.pyplot as plt # 예시 데이터 data = pd.DataFrame({ 'age': [25, 45, 32, 40, 23, 37, 50, 60], 'purchase_frequency': [5, 2, 6, 3, 10, 4, 1, 0], 'churn': [0, 1, 0, 1, 0, 0, 1, 1] # 1은 이탈, 0은 유지 }) # 독립 변수와 종속 변수 설정 X = data[['age', 'purchase_frequency']] y = data['churn'] # 의사결정 나무 모델 생성 model = DecisionTreeClassifier(max_depth=3, random_state=42) model.fit(X, y) # 의사결정 나무 시각화 plt.figure(figsize=(10, 6)) plot_tree(model, feature_names=['age', 'purchase_frequency'], class_names=['유지', '이탈'], filled=True) plt.show()
- Scikit-learn의 KBinsDiscretizer를 사용하여 구간화하는 방법
결측치 처리하기
1. 결측치를 평균 또는 중앙값으로 대체하기
- 데이터의 분포가 크게 왜곡되지 않는다는 가정하에 유용합니다. 예를 들어 고객의 나이 정보가 결측된 경우,
평균이나 중앙값으로 대체하면 분석에 큰 문제가 되지 않을 수 있습니다.
## 특정 열의 결측치가 일부 데이터에만 존재하며, 해당 열이 숫자형 데이터일 경우.
import pandas as pd
import numpy as np
# 예시 데이터
data = pd.DataFrame({
'age': [25, np.nan, 32, np.nan, 23, 37],
'purchase_frequency': [5, 2, np.nan, 3, 10, np.nan]
})
# age 열의 결측치를 평균으로 대체
data['age'].fillna(data['age'].mean(), inplace=True)
# purchase_frequency 열의 결측치를 중앙값으로 대체
data['purchase_frequency'].fillna(data['purchase_frequency'].median(), inplace=True)
print(data)
2. 결측치 제거하기
- 특정 열이나 행에 결측치가 많으면 해당 데이터를 제거하는 것이 더 나을 수 있습니다.
설문 데이터에서 응답자의 절반 이상이 어떤 질문에 답변하지 않았다면 그 질문을 아예 분석에서 제외할 수도 있습니다.
##결측치가 너무 많아서 대체가 적절하지 않을 경우.
# 결측치가 있는 행 제거
data_dropped_rows = data.dropna()
# 결측치가 있는 열 제거
data_dropped_columns = data.dropna(axis=1)
print("결측치가 있는 행 제거:\n", data_dropped_rows)
print("결측치가 있는 열 제거:\n", data_dropped_columns)
3. 예측 모델을 사용해 결측치 대체하기
- 결측치를 단순히 평균으로 대체하는 것보다 더 정밀하게 결측치를 예측할 수 있습니다.
고객의 나이와 연관된 다른 변수가 많다면 이 정보를 바탕으로 결측된 나이 데이터를 예측할 수 있습니다.
## 데이터의 다른 변수들을 사용해 결측치를 예측할 수 있을 때
from sklearn.linear_model import LinearRegression
# 예시 데이터
data = pd.DataFrame({
'age': [25, np.nan, 32, 40, 23, np.nan],
'income': [50000, 52000, 60000, 64000, 58000, 61000]
})
# 결측치가 없는 데이터를 이용해 모델 학습
train_data = data.dropna()
X_train = train_data[['income']]
y_train = train_data['age']
model = LinearRegression()
model.fit(X_train, y_train)
# 결측치 대체
data.loc[data['age'].isnull(), 'age'] = model.predict(data[['income']][data['age'].isnull()])
print(data)
4. 다중 대치법
- 다중 대치법은 결측치를 대체할 때 단일 값을 사용하지 않고 여러 개의 가능한 값으로 대체하여 분석을 여러 번
반복하는 방법입니다. 이를 통해 결측치 대체로 인해 발생할 수 있는 불확실성을 고려할 수 있습니다.
MICE (Multiple Imputation by Chained Equations) 알고리즘이 대표적인 다중 대치법입니다.
import pandas as pd
from sklearn.experimental import enable_iterative_imputer # 이 코드는 필요에 따라 사용
from sklearn.impute import IterativeImputer
import numpy as np
# 예시 데이터
data = pd.DataFrame({
'age': [25, np.nan, 32, 40, np.nan, 37],
'income': [50000, 52000, 60000, np.nan, 58000, 61000]
})
# MICE 알고리즘 사용
imputer = IterativeImputer(max_iter=10, random_state=0)
data_imputed = imputer.fit_transform(data)
data_imputed_df = pd.DataFrame(data_imputed, columns=data.columns)
print(data_imputed_df)
5. 이상값 인식 방법
- 이상값(Outlier)은 다른 데이터와 크게 차이가 나는 값으로, 분석 결과에 왜곡을 줄 수 있습니다.
일반적으로 이상값을 감지하는 방법에는 IQR 방법과 Z-score 방법이 있습니다.
또한 boxplot 등 그림으로도 파악이 가능합니다.
# IQR 방법
Q1 = data['income'].quantile(0.25)
Q3 = data['income'].quantile(0.75)
IQR = Q3 - Q1
# 이상값을 감지하는 조건
outliers = data[(data['income'] < Q1 - 1.5 * IQR) | (data['income'] > Q3 + 1.5 * IQR)]
print("이상값:\n", outliers)
-------------------
from scipy import stats
# Z-score 방법
data['income_z'] = stats.zscore(data['income'])
outliers_z = data[(data['income_z'] > 3) | (data['income_z'] < -3)]
print("Z-score 이상값:\n", outliers_z)
6. 극단값 절단 방법
- 극단값 절단(Capping)은 이상값을 제거하지 않고 일정한 범위 안으로 값을 제한하는 방법입니다.
상한과 하한을 설정하고, 그 범위를 벗어나는 값들을 상한이나 하한 값으로 대체합니다.
# 하한과 상한 설정 (예: 1사분위수 - 1.5 * IQR, 3사분위수 + 1.5 * IQR)
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
# 극단값 절단
data['income_capped'] = data['income'].apply(lambda x: lower_bound if x < lower_bound else upper_bound if x > upper_bound else x)
print(data[['income', 'income_capped']])'데이터분석' 카테고리의 다른 글
| 비모수 검정법 (2) | 2024.11.06 |
|---|---|
| 데이터 스케일링 및 모델 특성 선택법 (3) | 2024.11.06 |
| 데이터 분석에서 자주 사용되는 대표적인 Use_Case(2) (4) | 2024.10.23 |
| 데이터 분석에서 자주 사용되는 대표적인 Use_Case(1) (3) | 2024.10.22 |
| 로그변환(Log Transformation) (2) | 2024.10.16 |