⏱ 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')