이번엔 여러 자료 구조를 배웠으니 다루는 방법에 대해 배운다.
흐름을 보았을 때, AI 모델을 학습 시키기 위해서 데이터를 전처리하는 작업을 배우는 느낌이다! 학부 때 해봐서 어느정도 익숙하다... 그래도 할 건 해야지
데이터를 전처리하는 단계는 두개가 있는데,
하나는 수집한 데이터를 df나 array로 만드는 데이터 구조 만들기
또 하나는 모델링을 위해 데이터를 전처리를 해 줍니당
컴퓨터는 계산만 할 줄 아는 기계기 떄문에 숫자로 바꾸어줘야겠지요? 그게 바로 두번째로 언급한 단계중 하나입니다
근데 이번 강의에선 첫번째 단계를 배울거고 목표를 봅시다!
- 분석을 위해 데이터 구조를 이해하고 생성하기.
- 데이터 분석 절차를 이해하고, 분석 도구를 사용하기.
df.rename(columns = {'col1' : '이걸로',
'col5' : '바꿀래요'},
inplace = True)
df.columns = ['col1', 'col2', '이걸로 바꿀래요', ...]
# mean이란 열이 없다는 가정
df['mean'] = df['total'] / len(df)
df.insert(1, 'new_column', data)
df = data.copy()
df.drop(['삭제할 열1, 삭제할 열2], axis = 1, inplace = True)
열 전체 값 변경하기
df['수정할 열'] = 0 # 전체 데이터가 0으로 바뀜
조건으로 값 변경하기
df.loc[df['수정할 열'] < 1000, '수정할 열'] = 0
# 1000미만 데이터면 0으로 바뀜
np.where
으로 변경하기
df['수정할 열'] = np.where(df['수정할 열'] > 40, 1, 0)
# 40 미만이면 0, 아니면 1
map()
으로 변경하기 : 딕셔너리로 매핑
df['gender'] = df['gender'].map({'Male' : 1, 'Female' : 0)}
cut()
메소드로 연속형 → 범주형으로 변경하기
예를들면 나이 → 연령대, 고객별 구매 금액 → 고객 등급...
값의 범위를 균등하게 분할할뿐이지 갯수를 균등하게 해주진 않는다.
df['Age'] = pd.cut(df['Age'], 3, labels = ['미성년', '청년', '노인'])
# 바꿀 열, 등분할 수, 각각 범주 명 (등분할 수는 구간을 정할수 있다.)
df['Age'] = pd.cut(df['Age],
bins = [0, 19, 50],
labels = ['미성년', '청년', '노인'])
# 미성년 <= 19, 20 < 청년 <= 50, 50 < 노인
두 데이터 프레임을 결합하는 경우는 허다하다. 3가지를 보자
pd.concat()
결합
매핑 기준 : 인덱스(행) 0 , 컬럼 명(열) 1
df = pd.concat(df1, df2], axis = 1, join = 'inner')
그림을 참고해서 join을 넣어보자
pd.merge()
결합
옆으로만 병합한다 (aixs = 1)
어떤 컬럼을 기준으로 삼는지 ? (on = '컬럼')
방법 집합으로 보면 됨 (how = 'inner', 'outer', 'left', 'right' 결합 방식에 따라 없는 데이터라면 NaN으로 데이터가 채워진다.
df = pd.merge(df1, df2, how = 'inner', on = 'col1'
# col1을 기준으로 inner join (교집합(
pd.pivot()
엥? merge 아니지 않아요? 라고 생각할 수 있겠지만, 구조를 변형해 조회하니 비슷한 결이라고 생각하자...
groupby()
vs pivot()
이전에 배운 그룹바이랑 비슷하긴하다
# 매장의 일별 카테고리별 판매량을 집계
temp = pd.merge(sales1, product)
temp2 = temp.groupby(['Date', 'Categort'],
as_index = False)['Qty'].sum()
"""
Date Category Qty
0 2013-01-01 Drink 0.000
1 2013-01-01 Food 0.000
2 2013-01-01 Grocery 0.000
3 2013-01-01 Household Goods 0.000
4 2013-01-02 Drink 1158.000
... ... ... ...
119 2013-01-30 Household Goods 932.000
120 2013-01-31 Drink 971.000
121 2013-01-31 Food 751.766
122 2013-01-31 Grocery 1907.797
123 2013-01-31 Household Goods 711.000
"""
# pivot
temp3 = temp2.pivot('Category', 'Date', 'Qty')
"""
Date 2013-01-01 2013-01-02 2013-01-03 2013-01-04 2013-01-05 2013-01-06 2013-01-07 2013-01-08 2013-01-09 2013-01-10 ... 2013-01-22 2013-01-23 2013-01-24 2013-01-25 2013-01-26 2013-01-27 2013-01-28 2013-01-29 2013-01-30 2013-01-31
Category
Drink 0.0 1158.000 985.000000 1055.000000 1319.000 407.000 1267.000 1115.000 1290.00000 914.000 ... 1114.000 1152.000 924.000 1213.000 1132.000 417.000 830.000 999.000 1140.000 971.000
Food 0.0 1227.652 913.699000 790.366000 901.057 416.912 852.676 829.851 967.58200 775.515 ... 780.201 1025.047 791.388 836.856 880.019 416.783 821.064 668.154 900.092 751.766
Grocery 0.0 3305.130 2613.685001 2711.079001 2746.782 926.282 2689.720 2356.277 3023.57298 1933.235 ... 2242.216 2824.296 2221.805 2393.208 2257.907 1162.207 2208.364 2001.047 2662.485 1907.797
Household Goods 0.0 1070.000 836.000000 834.000000 821.000 257.000 830.000 830.000 917.00000 687.000 ... 786.000 769.000 622.000 701.000 551.000 247.000 625.000 617.000 932.000 711.000
"""
참고 (시각화) sns.heatmap(df)
시계열 데이터는 행과 행에 시간의 순서이며, 시간 간격이 동일한 데이터를 일컫음.
Time Series Data ⊂ Sequential Data
pd.to_datetime(날짜 데이터, format=)
날짜 타입으로 변환할 수 있음 (object → dateTime)df['date'].dt.날짜 요소
df[’date’].shift(index)
시간에 따른 흐름 전후로 데이터를 이동시킬수 있음 df[’date’].rolling().집계함수()
시간에 흐름에 따라 일정 기간의 집계를 이동하며 계산 df[’date’].diff(index)
특정 시점 데이터, 이전 시점 데이터와 시간 차 구하기 (인덱스를 -로 함)Business Understanding - 가설 수립
문제를 정의하고, 요인을 파악하기 위해 가설 수립
Data Understanding
데이터 원본 식별 및 취득 (초기)가설에서 도출된 데이터의 원본을 확인한다.
EDA & CDA 진행 순서
Data Preparation
→ 결측치 조치, 가변수화, 스케일링, 데이터 분할
Modeling