데이터 파편화 문제 - 데이터 요약이 필요한 경우

2021-07-20

.

Data_Preprocessing_TIL(20210720)

[학습자료]

패스트캠퍼스 온라인 강의 “파이썬을 활용한 데이터 전처리 Level UP 올인원 패키지 Online.” 를 공부하고 정리한 내용입니다.

URL : https://fastcampus.co.kr/data_online_preprocess

[학습내용]

  • 데이터 요약이 필요한 경우는 어떤 경우인가

일반적으로 1대 N 병합인 경우에 사용하는데, 거래데이터 또는 로그데이터와 병합하는 경우에 주로 사용된다.

중복레코드를 포함하는 데이터를 요약한 후 병합하는 방식으로 문제를 해결하면 된다.

1

  • 위에 문제를 해결하기 위해 자주쓰는 함수 : DataFrame.groupby()

1) 조건부 통계량(조건에 따른 대상의 통계량)을 계산하기 위한 함수로 머신러닝 프로세스 뿐만 아니라, 통계 분석등에서도 상당히 많이 사용된다.

2) 주요입력

by : 조건변수(컬럼명 혹은 컬럼명 리스트로 입력)

as_index : 조건변수를 index로 설정할 것인지 여부

활용예시

df.groupby(['성별'])['신장'].mean()

—> 성별(조건)에 따른 신장(대상)의 평균(통계량)

2

  • 실습

고객별 인구통계정보에 고객별 구매기록을 병합하는 실습

먼저 데이터를 불러오자

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