Kaggle 뇌졸증 예측 데이터셋 사용
🔗링크
문제 1) 데이터 불러오기와 크기 확인
뇌졸중 예측 데이터셋 CSV 파일을 pandas를 사용하여 불러오고, 데이터프레임의 크기(행과 열의 개수)를 출력하는 코드를 작성하세요. (힌트: pd.read_csv 함수를 사용합니다.)
import pandas as pd
df = pd.read_csv(r'C:\Users\1234\PycharmProjects\sparta_python\review\csv\stroke_data.csv')
문제 2) 데이터 미리보기
데이터가 잘 불러와졌는지 확인하기 위해 데이터프레임의 처음 5행을 출력하는 코드를 작성하세요. 이때 데이터의 각 열 이름도 함께 확인해보세요. 그리고 각 열의 의미도 한번 유추해보세요!
df.head()
문제 3) 데이터 정보 확인 (데이터 타입과 결측값)
데이터프레임의 각 열에 대한 요약 정보를 출력하는 코드를 작성하세요. 이를 통해 각 열의 데이터 타입(dtype)과 누락된 값(null/결측값) 개수를 확인해보세요. (힌트: DataFrame.info() 메서드를 사용합니다.)
df.info()
# bmi만 결측치 존재
문제 4) 결측값 개수 확인
각 열별로 결측값(null)이 몇 개인지 합계로 확인하려 합니다. 이를 계산하는 코드를 작성하세요. (힌트: isnull() 또는 isna()와 sum() 함수를 활용합니다.)
missing_cnt = df.isna().sum()
print(f"결측치 개수 :\n{missing_cnt}")
문제 5) id 열 삭제하기
id 열은 각 환자를 식별하기 위한 고유 식별자일 뿐, 예측 모델링에는 필요하지 않은 정보입니다. 데이터프레임에서 id 열을 제거하는 코드를 작성하세요.
df = df.drop(columns=['id'])
문제 6) BMI 결측값 처리 (중앙값 대체)
bmi 열에 존재하는 201개의 결측값을 어떻게 처리할지 결정해야 합니다. 이번에는 중앙값(median)을 사용하여 이 결측치를 채우려고 합니다. bmi 열의 중앙값을 계산하고, 그 값으로 결측값들을 채우는 코드를 작성하세요.
median = df['bmi'].median()
df['bmi'] = df['bmi'].fillna(median)
print(f"bmi 중앙값 : {median}")
문제 7) BMI 데이터의 분포와 이상치 탐색
bmi 열의 분포를 파악하여 이상치를 탐지해보겠습니다. 우선 bmi 값의 평균(mean)과 중앙값(median)을 계산하고 비교해보세요. 그런 다음 IQR(Interquartile Range, 사분위 범위) 방식을 사용하여 bmi의 이상치 범위를 구하고, 범위를 벗어난 bmi 값이 몇 개인지 찾아 출력하는 코드를 작성하세요.
mean = df['bmi'].mean()
print(f"bmi 중앙값 : {median}")
print(f"bmi 평균값 : {mean}")
# bmi 중앙값 : 28.1
# bmi 평균값 : 28.862035225048924
import numpy as np
Q1 = df['bmi'].quantile(0.25)
Q3 = df['bmi'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
iqr_mask = (df['bmi'] < lower_bound) | (df['bmi'] > upper_bound)
outliers = df[iqr_mask]
print(f"bmi IQR 이상치 개수 : {outliers.shape[0]}")
문제 8) 이진 범주형 변수 인코딩 (ever_married)
ever_married 열은 결혼했는지 여부를 나타내며 값이 "Yes" 또는 "No"로 이루어진 이진 범주(binary category)입니다. 이 열을 0과 1의 숫자로 변환하려고 합니다. "Yes"를 1로, "No"를 0으로 변환하는 코드를 작성하세요.
df['ever_married'] = df['ever_married'].map({'Yes' : 1, 'No' : 0})
df['ever_married'].unique()
문제 9) 범주값 탐색 (gender 열의 고유값 확인)
범주형 변수 gender의 데이터 값 종류를 확인해보세요. gender 열에는 어떤 고유값들이 있는지 나열하는 코드를 작성하세요.
df['gender'].unique() # Male, Female, Other
문제 10) 라벨 인코딩 (gender 열)
gender 열을 라벨 인코딩(Label Encoding) 방식으로 숫자 값으로 변환하려 합니다. gender의 고유값 "Female", "Male", "Other"를 각각 0, 1, 2로 매핑하여 새로운 숫자 값으로 바꾸세요. (예: Female→0, Male→1, Other→2)
df['gender'] = df['gender'].map({
'Female' : 0, 'Male' : 1, 'Other' : 2
})
df['gender'].unique() # 1, 0, 2
문제 11) 원-핫 인코딩 (work_type 열)
work_type 열은 범주가 다섯 가지 ("Private", "Self-employed", "Govt_job", "children", "Never_worked")로 이루어져 있습니다. 이 열에 대해 원-핫 인코딩(One-Hot Encoding)을 수행하세요. 즉, work_type의 각 범주마다 새로운 더미(dummy) 변수를 만들고, 해당 범주에 해당하면 1 아니면 0을 가지도록 변환하는 코드를 작성하세요. 변환 후 생성된 새로운 열들을 확인해보세요.
df = pd.get_dummies(df, columns=['work_type'], drop_first=False)
print("열 개수:", len(df.columns))
print("work_type_*:", [col for col in df.columns if col.startswith('work_type')])
문제 12) smoking_status의 'Unknown' 처리 방안
smoking_status 열에는 "formerly smoked", "never smoked", "smokes", 그리고 "Unknown"이라는 범주가 있습니다. 여기서 "Unknown"은 흡연 상태 정보를 알 수 없는 경우를 뜻합니다. 전처리 단계에서 이러한 "Unknown" 범주를 어떻게 다루는 것이 좋을지 설명하세요.
unknown 자체로 그냥 두는 게 맞을듯
흡연 여부에 대해 대답하지 않은 경우도 있으니까?
→ 권장답변
이 데이터셋의 경우 "Unknown"을 별도 범주로 유지하는 것이 일반적입니다.
즉, 원-핫 인코딩을 하면 "smoking_status_Unknown" 열이 생기고, 해당 행들은 그 열에 1값을 가지게 됩니다.
이렇게 하면 흡연 정보를 알 수 없는 집단을 모델이 따로 인식할 수 있게 됩니다.
굳이 삭제하지 않는 이유는, 그런 행도 다른 유용한 정보(나이, 병력 등)를 갖고 있기 때문에 데이터에서 배제할 필요가 없기 때문입니다.
문제 13) 수치형 변수 특성 스케일링 (StandardScaler 적용 전후 비교)
age, avg_glucose_level, bmi와 같은 연속형(수치형) 변수들은 값의 스케일(범위)이 서로 많이 다를 수 있습니다. 이러한 값들을 모델에 투입하기 전에 표준화(Standardization)를 통해 스케일을 맞춰주려고 합니다. 사이킷런의 StandardScaler를 이용하여 이 세 개 열을 변환해보세요. 변환 전과 변환 후의 평균과 표준편차를 비교하는 코드를 작성하고 결과를 확인하세요.
from sklearn.preprocessing import StandardScaler
numeric_features = ['age', 'avg_glucose_level', 'bmi']
print("스케일링 전:")
print(df[numeric_features].agg(['mean', 'std']))
scaler = StandardScaler()
df[numeric_features] = scaler.fit_transform(df[numeric_features])
print("\n스케일링 후:")
print(df[numeric_features].agg(['mean', 'std']).round(3))
파이프라인은 잘 모르겠어서 해설 따라쳐보기만 함. .
문제 14) 전처리 파이프라인 구성 (숫자형 파이프라인) 🔴
지금까지 개별 단계로 수행한 전처리를 사이킷런의 파이프라인(Pipeline)으로 구성해보겠습니다. 우선 숫자형 특성에 대한 전처리 파이프라인을 만들어보세요. 이 파이프라인은 다음 단계를 포함해야 합니다:
1. 결측값 처리: bmi 열의 결측치를 중앙값으로 대체 (SimpleImputer(strategy='median') 사용).
2. 스케일링: StandardScaler를 적용하여 표준화. 이 두 단계를 순차적으로 수행하는 파이프라인 객체를 정의하는 코드를 작성하세요.
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
numeric_features = ['age', 'avg_glucose_level', 'bmi']
numeric_pipeline = Pipeline([
('imputer', SimpleImputer(strategy='median')),
('scaler', StandardScaler())
])
print(numeric_pipeline)
문제 15) 전처리 파이프라인 구성 (전체 ColumnTransformer) 🔴
이제 전처리 파이프라인을 완성해보겠습니다. 숫자형 특성에는 앞서 만든 numeric_pipeline을 적용하고, 범주형 특성들 (gender, hypertension, heart_disease, ever_married, Residence_type, smoking_status, 그리고 work_type 관련 열들 등)에는 원-핫 인코딩을 적용하는 하나의 통합된 변환기를 만들겠습니다. 사이킷런의 ColumnTransformer를 사용하여 숫자형 파이프라인과 범주형 원-핫 인코딩을 결합한 전처리기(preprocessor)를 정의하는 코드를 작성하세요.
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
categorical_features = ['gender', 'hypertension', 'heart_disease', 'ever_married',
'Residence_type', 'work_type', 'smoking_status']
preprocessor = ColumnTransformer([
('num', numeric_pipeline, numeric_features), # 숫자형 열들에 numeric_pipeline 적용
('cat', OneHotEncoder(handle_unknown='ignore'), categorical_features) # 범주형 열들에 OneHotEncoder 적용
], remainder='drop') # 지정하지 않은 열(drop)
print(preprocessor)
아답터 1과목 ✅ 아답터 2과목 ✅ 모의고사 1회 ✅ 3회차 과제 ✅ 2회차 복습 ✅모의고사 풀고있는데 진짜 아무고토 모르겠다 이거에요