데이터의 파편화 및 분포문제

2019-05-30

Data_Preprocessing_Studynotes_(20190529)

study program : https://www.fastcampus.co.kr/data_camp_ppc

[학습기록]

1. 피쳐 엔지니어링

  • 우리가 원하는 데이터프레임 모양의 이쁜데이터는 현실에서는 그다지 많지 않다. 그래서 우리는 지저분한 현실데이터를 이쁜데이터로 변환을 해줘야 하는데 그런 작업을 피쳐 엔지니어링 이라고 한다.

  • 피쳐 엔지니어링은 ‘특징추출’과 ‘특징선택’ 으로 이루어지는데 통상 특징추출이 특징선택보다 선행되어야 한다.

  • 범주형 변수에 대한 더미화 vs 원핫인코딩

범주형 변수는 변수간에 대소관계가 존대하지 않기 때문에 이 변수가 “있냐”, “없냐”로 변환을 해줘야 하는데 그렇게 해주는 방법이 더미화와 원핫인코딩이다.

1) 더미화

기존에 특정 피쳐에서 n개의 범주형 변수를 n-1개의 피쳐로 만드는 것(이 피쳐가 있느냐 없느냐를 의미함)

굳이 n개로의 원핫인코딩을 하지 않아도 된다 왜냐하면 예를들어서 아래와 같이 더미화를해서 2개 피쳐만으로도 세개를 표현할 수 있는데 뭐하러 피쳐를 늘리는가..

ex) ‘성별’이라는 변수에서 더미화 예시

1

2) 원핫인코딩

특정 피쳐에서 범주형 변수를 n개의 변수로 만들어주는 것, 신경망에서 대상이 출력노드를 구성할때 주로 사용(머신러닝시는 그냥 라벨링, 원핫인코딩 불가)

원핫인코딩 예시)

2

양념 = [1,0,0]

후라이드 = [0,1,0]

간장 = [0,0,1]

2. 원핫인코딩 실제 적용사례

보통 겟더미즈 메서드를 많이 쓴느데 여기서는 딕트벡터라이저를 쓰겠다.

  • 딕트벡터라이저 쓰는 방법

1) 데이터프레임 -> 딕셔너리로 바꿔주는 작업 필요(df.dict() 메서드를 사용하면 된다.)

2) 중복되는 피쳐 제거

3) 딕트 벡터라이저 적용

위에 처럼 딕셔너리로 바꿔주고 중복되는 피쳐까지 제거해야하는 번거로움이 있음에도 불구하고 딕트벡터라이저를 쓴 이유는 겟더미즈 함수는 딕트벡터라이저보다 재사용성이 떨어진다. 다시말해서 추후 새로운 형태의 변수를 입력변수를 입력받기 어렵다.

  • 메서드 설명

1) vec = sklearn.feature_extraction.DictVectorizer()

vec이라는 변수로 정의하는 인스턴스화

2) vec.fit(data)

data에 대한 피팅. 피팅하고 나면 명목변수를 변환할 사전을 저장한다.

3) vec.transform(data)

피팅한 vec 인스턴스를 data에 적용하여 변환시킴

4) vec.fit_trasform(data)

vec 인스턴스를 data에 대해 피팅하고 data를 변환시킴(학습데이터에만 적용)

4) vec.get_feature_names()

피팅한 후 새로 만들어진 변수집합

  • 적용예시
from sklearn.feature_extraction import DictVectorizer

data = [
{'price': 850000, 'rooms': 4, 'neighborhood': 'Queen Anne'},
{'price': 700000, 'rooms': 3, 'neighborhood': 'Fremont'},
{'price': 650000, 'rooms': 3, 'neighborhood': 'Wallingford'},
{'price': 600000, 'rooms': 2, 'neighborhood': 'Fremont'}
]

vec = DictVectorizer (sparse=False, dtype=int)
vec.fit_transform(data)
array([[     0,      1,      0, 850000,      4],
       [     1,      0,      0, 700000,      3],
       [     0,      0,      1, 650000,      3],
       [     1,      0,      0, 600000,      2]], dtype=int32)
vec.get_feature_names()
['neighborhood=Fremont',
 'neighborhood=Queen Anne',
 'neighborhood=Wallingford',
 'price',
 'rooms']

3. 데이터 파편화 문제패턴 중 ID별 파일이 따로 없는 경우

자식 데이터를 아이디 기준으로 요약하여 데이터를 통합한다.

3

aggregated_df=df.groupby(‘key’)aggregate([‘요약방법’])을 바탕으로 요약 결과 활용

다시말해 조건부 통계인 그룹바이을 활용하면 된다.

그룹바이 다른예시)

고객 아이디에 따른 구매금액의 합계 집계

4

위와 같은 경우 아래와 같은 코드로 병합하면 된다.

demo_df = pd.read_csv("고객별 인구통계정보 .csv", engine = "python")
purchasing_df = pd.read_csv("고객별 구매금액 .csv", engine = "python")

purchasing_aggregated_df = purchasing_df.groupby('고객ID')['구매금액'].aggregate(['sum'])
merged_df = pd.merge(demo_df,purchasing_aggregated_df,\
                     left_on = '고객 ID', right_index = True)