1. Data Cleaning의 개념
데이터에서 부정확한 레코드를 감지 및 수정(or 제거)하는 과정
(ex. 이상치를 감지하여 제거, 결측치를 찾아 보간)
데이터를 주어진 양식에 맞게 변경/수정하는 과정
(ex. 딥러닝 학습을 위해 이미지 데이터 256X256 -> 27X27 으로 size 변경)
(데이터 전처리와는 다른 개념)
2. 데이터 통합
데이터 분석은 다양한 곳에서 수집하기에, 하나로 합치는 작업 필요
(데이터 분석 및 비지니스 의사 결정에 중요한 역할을 함)

어떤 데이터를 통합할 지 선정하는 과정
수집 데이터에 대한 표준 어휘를 사용하여 데이터의 속성을 정의
중복 데이터는 데이터의 정확도와 신뢰성을 저해, 그래서 반드시 확인해야 함
(중복 데이터의 종류 : 인스턴스 중복 / 속성 중복)
여러 개의 데이터 파일이 있는 경우, column / row를 결합하는 작업
(단순히 배열을 합치는데 사용)

일반적으로 특정 키 값을 기준으로 병합

: index를 기준으로 합치기에, 기준 index를 지정해줘야 함

: 눈치있게 알아서 value를 기준으로 합침

#inner join 실행
pd.merge(df1, df2, how='inner')
3. 결측치 처리
결측치 : 데이터 수집을 했지만 데이터 값이 없는 경우
(NaN 혹은 Null 값 형태로 존재)
결측치 발생 원인
결측치를 처리하는 이유

행 또는 열을 제거하는 것
(데이터의 양이 적을 경우 유용하지 않은 방법)
결측치에 대해 합리적인 값으로 대체하는 방법
4. 정규화(Normalization) vs 표준화(Standardization)
두 개 이상의 변수를 탐색할 경우, 정확한 비교를 위해 scaling 필요

최소값을 0, 최대값을 1로(또는-1~1) 만들고 이사이에 데이터들이 배치됨.
(데이터의 최대값과 최소값이 사용되므로 Min-Max Normalization 이라고도 함)


데이터의 평균을 0, 표준편차를 1로 조정하는 방법
(정규화는 스케일을 통일하지만 표준화는 데이터 범위를 통일)

데이터 처리 tip
'Data -> 표준화 -> 이상치 제거 -> 정규화' 순으로 처리하면 좋음
5. 노이즈 제거
노이즈 : 실제 입력된 신호가 아닌 것 / 잘못 판단된 값
노이즈의 종류
특정 윈도우 영역(Sliding window) 내에 포함되는 값들의 평균으로 필터링
(스무딩 선형필터, 평균 필터, 저역통과 필터라고 부름)

필터의 크기가 커질 수록 블러링(blurring) 효과가 커지는 것을 볼 수 있음
가운데 있는 값이 가장 큰 정보를 가지며, 중앙으로부터 멀어질 수록 값이 작아지도록 하는 필터

실습 1. 중복 데이터 제거하기
1) drop_duplicates()로 중복제거 실행
2) subset=[‘brand’] 를 넣어서 실행
3) subset=[‘brand’, ‘style’], keep=[‘last’] 넣어서 실행
4) 3번 예제에 ignore_index=True 옵션을 넣어서 실행
5) 3번 예제에 inplace=True 옵션을 넣어서 실행 후 데이터 확인
import pandas as pd
df=pd.DataFrame({
'brand' : ['Yum Yum', 'Yum Yum', 'Indomie', 'Indomie', 'Indomie'],
'style' : ['cup', 'cup', 'cup', 'pack', 'pack'],
'rating' : [4,4,3.5,15,5]
})
print(df)

df.drop_duplicates()

df.drop_duplicates(subset=['brand'])

df.drop_duplicates(subset=['brand','style'],keep='last')

실습 2. 결측치 제거 및 대체
import pandas as pd
import seaborn as sns
df=sns.load_dataset('titanic')
print(df)

df.info()

df.isnull().sum() #결측치 확인 1

df.notnull().sum() #결측치 확인 2

pandas의 dropna 함수를 사용하여 결측치를 삭제
axis=0 (row), axis=1 (column) 삭제를 실행
df_del_row=df.dropna(axis=0)
df_del_row.info()

df_del_row=df.dropna(axis=1)
df_del_row.info()

pandas의 fillna 함수를 사용하여 결측치를 대체
updated_df=df
updated_df['age'].fillna(updated_df['age'].mean())
updated_df.info()

import matplotlib.pyplot as plt
fig,ax=plt.subplots(figsize=(10,6))
df['age'].plot(kind='kde', ax=ax, color='blue')
updated_df['age'].plot(kind='kde', ax=ax, color='red')
lines, labels=ax.get_legend_handles_labels()
ax.legend(lines, labels, loc='best')
