데이터분석

Jupyter 를 이용한 패키지 및 데이터 관리

장수우 2024. 11. 5. 23:08

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()

결측치 처리하기

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']])
반응형