[내일배움캠프] 이상치 & 결측치 확인

셔닝🧸·2025년 6월 16일
0

[기초 프로젝트 (2025.06.13 ~ 06.23)]


⏱ 1일차

▪️ 프로젝트 취지 및 프로세스 이해
▪️ 주제 선정 및 제출
▪️ 데이터셋 탐색
▪️ 핵심 질문
▪️ 페르소나 설정

⏱ 2일차
▫️ 데이터셋 구조 및 주요 컬럼 이해
▫️ 데이터 이상치/결측치에 대한 탐색 및 논의
▫️ 이상치 & 결측치 처리
▫️ 데이터 통합
▫️ 페르소나 구체화 및 가설 설정


[결측치 처리]

1️⃣ NaN 결측치 분석 ➡️ 데이터 값으로 대체

1) isnull().sum() 활용
✔️ 데이터가 어디에 얼마나 있는지 확인

df_stat.isnull().sum()

2) fillna() 사용
✔️ 특정 컬럼 결측치 대체

# 새 컬럼명 변수로 지정해줌으로써 새 컬럼 생성
# inplace = False가 기본값

df_stat['dropout_reason_detail_filled'] =  \
df_stat['dropout_reason_detail'].fillna(df_stat['dropout_reason_category'])

3) 데이터 잘 들어갔는지 확인하기 위해 [기존 컬럼, 새 컬럼 도출]

print(df_stat[['dropout_reason_detail', 'dropout_reason_detail_filled']])

2️⃣ 결측치 분석 ➡️ 평균값으로 대체

1) dtype 속성 활용
✔️ 데이터 타입 확인

df_user['birthday'].dtype

2) to_datetime() 활용
✔️ 날짜 형태로 데이터 타입 변환 (object 타입 ➡️ date 타입)

df_user['birthday'] = pd.to_datetime(df_user['birthday'], errors = 'coerce')
# errors = 'coerce'로 변환 불가능한 값은 NaT(datetime의 NaN)로 처리

3) mean() 활용
✔️ 평균값 구하기

birth_avg = df_user['birthday'].mean()

4) fillna() 활용
✔️ birthday NaN값을 birthday 평균으로 대체

df_user['birthday'] = df_user['birthday'].fillna(birth_avg)
df_user['birthday']

5) value_counts() 활용
✔️ NaN값에 평균값 잘 들어갔는지 개수 확인

df_user['birthday'].value_counts()

[이상치 처리]

1️⃣ 데이터 카테고리 통일

1) value_counts() 활용
✔️ 카테고리 확인

df_user['gender'].value_counts()

2) unique() 활용
✔️ 고유값 확인

df_user['gender'].unique()

3) str.lower() & str.strip() & tolist() 활용
✔️ 모든 값 소문자로 변경 & 양쪽 끝 공백 제거 & 문자열 리스트로 변환

df_user['gender'] = df_user['gender'].str.lower().str.strip().tolist()

4) 변경된 값 확인

df_user['gender'].value_counts()

2️⃣ 데이터 카테고리 통일

1) value_counts() 활용

df_user['theme_mode'].value_counts()

2) unique() 활용
✔️ 고유값 확인

df_user['theme_mode'].unique()

3) replace 활용
✔️ 여러 데이터 값 변경

df_user['theme_mode'] = df_user['theme_mode'].replace({
    'customized' : 'custom', 
    'dark_mode' : 'dark',
    'Light' : 'light'
    })

4) 변경된 값 확인

df_user['theme_mode'].value_counts()

3️⃣ 날짜 형식에 있는 이상치 NaN값으로 변경 후 평균값으로 대체

1) dtype 활용
✔️ 데이터 타입 확인

df_act['last_access_timestamp'].dtype 

2) to_datetime() 활용
✔️ 날짜 형태로 데이터 타입 변환 (object 타입 ➡️ date 타입)

df_act['last_access_timestamp'] = pd.to_datetime(df_act['last_access_timestamp'], format='%Y.%m.%d %H:%M', errors='coerce')

3) isna().sum() 활용
✔️ NaT 개수 확인

df_act['last_access_timestamp'].isna().sum() 

4) describe() 활용
✔️ 평균값과 중위수값 비교

df_act['last_access_timestamp'].describe()

➡️ 큰 차이 없어서 평균값으로 이상치 대체하기로 결정

5) mean() 활용
✔️ 평균값 구하기

timestamp_avg = df_act['last_access_timestamp'].mean() 

6) fillna() 활용
✔️ last_access_timestamp NaN값을 last_access_timestamp 평균으로 대체

df_act['last_access_timestamp_filled']= df_act['last_access_timestamp'].fillna(timestamp_avg)

[데이터 병합]

merge() 함수 사용

df_merged = pd.merge(df_user, df_act, on='user_id', how='inner')
df_merged = pd.merge(df_merged, df_stat, on='user_id', how='inner')
profile
어떻게든 하겠숴여...❕

0개의 댓글