데이터 파편화 문제 - 데이터 요약이 필요한 경우
.
Data_Preprocessing_TIL(20210720)
[학습자료]
패스트캠퍼스 온라인 강의 “파이썬을 활용한 데이터 전처리 Level UP 올인원 패키지 Online.” 를 공부하고 정리한 내용입니다.
URL : https://fastcampus.co.kr/data_online_preprocess
[학습내용]
- 데이터 요약이 필요한 경우는 어떤 경우인가
일반적으로 1대 N 병합인 경우에 사용하는데, 거래데이터 또는 로그데이터와 병합하는 경우에 주로 사용된다.
중복레코드를 포함하는 데이터를 요약한 후 병합하는 방식으로 문제를 해결하면 된다.
- 위에 문제를 해결하기 위해 자주쓰는 함수 : DataFrame.groupby()
1) 조건부 통계량(조건에 따른 대상의 통계량)을 계산하기 위한 함수로 머신러닝 프로세스 뿐만 아니라, 통계 분석등에서도 상당히 많이 사용된다.
2) 주요입력
by : 조건변수(컬럼명 혹은 컬럼명 리스트로 입력)
as_index : 조건변수를 index로 설정할 것인지 여부
활용예시
df.groupby(['성별'])['신장'].mean()
—> 성별(조건)에 따른 신장(대상)의 평균(통계량)
- 실습
고객별 인구통계정보에 고객별 구매기록을 병합하는 실습
먼저 데이터를 불러오자
import os
import pandas as pd
os.chdir(r"C:/Users/user/Desktop/aa/part-4.-머신러닝을-위한-필수-전처리/Part 4. 머신러닝을 위한 필수 전처리/데이터/")
demo_df = pd.read_csv("고객별_인구통계정보.csv", engine = "python")
demo_df
고객ID | 나이 | 성별 | 주소 | |
---|---|---|---|---|
0 | 고객1 | 48 | 남 | A아파트 |
1 | 고객2 | 40 | 남 | B아파트 |
2 | 고객3 | 37 | 여 | C아파트 |
3 | 고객4 | 35 | 여 | A연립주택 |
4 | 고객5 | 42 | 남 | B연립주택 |
5 | 고객6 | 44 | 남 | C연립주택 |
6 | 고객7 | 47 | 남 | A단독주택 |
7 | 고객8 | 38 | 여 | B단독주택 |
8 | 고객9 | 33 | 여 | D아파트 |
9 | 고객10 | 30 | 남 | E아파트 |
구매기록도 확인해보면 한명의 고객이 여러번 구매한 기록도 확인할 수 있다.
purchasing_df = pd.read_csv("고객별_구매금액.csv", engine = 'python')
purchasing_df
고객ID | 구매금액 | |
---|---|---|
0 | 고객10 | 45990 |
1 | 고객2 | 29800 |
2 | 고객7 | 31400 |
3 | 고객5 | 35300 |
4 | 고객2 | 41200 |
... | ... | ... |
995 | 고객8 | 41270 |
996 | 고객3 | 7520 |
997 | 고객2 | 7210 |
998 | 고객5 | 37760 |
999 | 고객10 | 11610 |
1000 rows × 2 columns
groupby 함수를 이용해서 고객별로 구매금액을 합산하여 데이터를 요약해보자
대상 변수의 이름이 그대도 시리즈의 이름이 되기 때문에 이때 적절한 변수명으로 변경해줘야 한다.
(구매금액 –> 구매금액합계)
purchasing_aggregated_df = purchasing_df.groupby('고객ID')['구매금액'].sum()
purchasing_aggregated_df = purchasing_aggregated_df.rename('구매금액합계')
print(type(purchasing_aggregated_df))
purchasing_aggregated_df
<class 'pandas.core.series.Series'>
고객ID
고객1 2494480
고객10 2644200
고객2 2573880
고객3 2998590
고객4 2875420
고객5 2628430
고객6 2419410
고객7 2709620
고객8 2914460
고객9 2283150
Name: 구매금액합계, dtype: int64
고객별 인구통계정보에 요약한 고객별 구매기록을 병합해보자
merged_df = pd.merge(demo_df, purchasing_aggregated_df, left_on = '고객ID', right_index = True)
merged_df
고객ID | 나이 | 성별 | 주소 | 구매금액합계 | |
---|---|---|---|---|---|
0 | 고객1 | 48 | 남 | A아파트 | 2494480 |
1 | 고객2 | 40 | 남 | B아파트 | 2573880 |
2 | 고객3 | 37 | 여 | C아파트 | 2998590 |
3 | 고객4 | 35 | 여 | A연립주택 | 2875420 |
4 | 고객5 | 42 | 남 | B연립주택 | 2628430 |
5 | 고객6 | 44 | 남 | C연립주택 | 2419410 |
6 | 고객7 | 47 | 남 | A단독주택 | 2709620 |
7 | 고객8 | 38 | 여 | B단독주택 | 2914460 |
8 | 고객9 | 33 | 여 | D아파트 | 2283150 |
9 | 고객10 | 30 | 남 | E아파트 | 2644200 |
#하나의 변수를 추가하는 경우에 주로 사용하는 테크닉
#demo_df['구매금액합계_2'] = demo_df['고객ID'].replace(purchasing_aggregated_df.to_dict())