일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 청청구역
- 유니코드 제거
- 빅데이터분석기사후기
- 빅데이터분석기사
- 마우스클릭
- 갈자신이없다
- 언제또가보지
- 사각형변형
- 가고싶은데
- 오류
- 호주
- 색상변경
- 크롤링
- 파이썬
- 빅데이터분석기사필기
- 정말
- 애니메이션
- 너무오래됐다
- 방향변경
- 데이터전처리
- 멜버른
- BeautifulSoup
- selenium
- 필기후기
- 예쁜곳
- OpenGL
- 보라카이
- Today
- Total
wisdiom 아니고 wisdom
2. 데이터 사전 처리 본문
Data Preprocessing
데이터 분석의 정확도는 분석 데이터의 품질에 의해 좌우된다.
데이터 품질을 높이기 위해 누락 데이터, 중복 데이터 등 오류를 수정하고 분석 목적에 맞게 변형하는 과정이 필요하다.
1️⃣ 누락 데이터(결측값, Missing Value) 처리
데이터프레임에는 원소 데이터 값이 종종 누락되는 경우가 있다. 데이터를 파일로 입력할 때 빠트리거나 파일 형식을 변환하는 과정에서 데이터가 소실되는 것이 주요 원인다. 일반적으로 유효한 데이터 값이 존재하지 않는 누락 데이터를 NaN(Not a Number)으로 표시한다. 머신러닝 분석 모형에 데이터를 입력하기 전에 반드시 누락 데이터를 제거하거나 다른 적절한 값으로 대체하는 과정이 필요하다. 누락 데이터가 많아지면 데이터 품질이 떨어지고, 머신러닝 분석 알고리즘을 왜곡하는 현상이 발생하기 때문이다.
📢 누락 데이터 확인
📍 DataFrame.isnull() : 누락 데이터면 True를 반환하고, 유효한 데이터가 존재하면 False를 반환한다.
📍 DataFrame.notnull() : 유효한 데이터 존재하면 True를 반환하고, 누락 데이터면 False를 반환한다.
📢 누락 데이터 제거
📍 DataFrame객체.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
- axis : 0 or 'index', 1 or 'columns'
- how
- 'any' : NaN값이 하나라도 존재하면 삭제
- 'all' : 모든 데이터가 NaN값일 경우에만 삭제
- thresh : NaN 값이 n개 이상 갖는 행이나 열 삭제
- subset : 특정 '열 리스트'에 데이터가 없는 행 삭제
- inplace : 원본 변경 여부
📢 누락 데이터 치환
데이터셋의 품질을 높일 목적으로 누락 데이터를 무작정 삭제해 버린다면 어렵게 수집한 데이터를 활용하지 못하게 된다.
데이터 분석의 정확도는 데이터 품질 외에도 제공되는 데이터 양에 의해 상당한 영향을 받는다. 따라서 데이터 중 일부가 누락되어 있더라도 나머지 데이터를 최대한 살려 데이터 분석에 활용하는 것이 좋은 결과를 얻는 경우가 많다.
누락 데이터를 바꿔서 대체할 값으로는 데이터의 분포와 특성을 잘 나타낼 수 있는 평균값, 최빈값 등을 활용한다.
📍 DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)
- value : NaN값에 채울 값
- method : 채우는 방법
- 'backfill'
- 'bfill' : NaN이 있는 행의 바로 다음 행에 있는 값으로 치환
- 'pad'
- 'ffill' : NaN이 있는 행의 직전 행에 있는 값으로 치환
- axis : 0 or 'index', 1 or 'columns'
- inplace : 원본 변경 여부
- limit : method가 지정된 경우 연속적으로 앞 또는 뒤로 채울 NaN 값의 최대 수
2️⃣ 중복 데이터 처리
하나의 데이터셋에서 동일한 관측값이 2개 이상 중복되는 경우, 중복 데이터를 찾아 삭제해야 한다. 동일한 대상이 중복으로 존재하는 것이므로 분석 결과를 왜곡하기 때문이다.
📢 중복 데이터 확인
📍 DataFrame.duplicated(subset=None, keep='first')
- subset : 특정 '열 리스트'를 기준으로 데이터의 중복 여부 판별
- keep : 표시할 중복(있는 경우)을 결정합니다.
- first: True 첫 번째 항목을 제외하고 중복 항목을 표시합니다.
- last: True 마지막 항목을 제외하고 중복 항목을 표시합니다.
- False : 모든 중복 항목을 True.
📢 중복 데이터 제거
📍 DataFrame.drop_duplicates(subset=None, keep='first', inplace=False, ignore_index=False)
- ignore_index : True인 경우, 새로운 정수형 인덱스 설정
3️⃣ 데이터 표준화 (standardization)
서로 다른 단위가 섞여 있거나 같은 대상을 다른 형식으로 표현하는 등 동일한 대상을 표현하는 방법에 차이가 있으면, 분석의 정확도는 현저히 낮아진다. 따라서 데이터 포맷을 일관성 있게 표준화하는 작업이 필요하다.
4️⃣ 범주형(Category) 데이터 처리
📢 구간 분할
데이터 분석 알고리즘에 따라 연속 데이터를 그대로 사용하기 보다는 일정한 구간(bin)으로 나눠서 분석하는 것이 효율적인 경우가 있다. 연속적인 값을 일정한 수준이나 정도를 나타내는 이산 값으로 나타내어 구간별 차이를 드러내는 것이다.
이처럼 연속 변수를 일정한 구간으로 나누고, 각 구간으로 범주형 이산 변수로 변환하는 과정을 구간 분할(binning)이라고 한다.
☝ 구간 자르기
📍 numpy.histogram(나눌 값, bins=나누려는 구간 개수)
✌ 구간 나누기 및 Categorize
- 각 '구간에 속하는 값의 개수'와 '경계값 리스트'를 반환한다.
📍 pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates='raise', ordered=True)
- x : 데이터 배열
- bins : 경계값 리스트
- labels : bin 이름
- include_lowest : 첫 경계값 포함 여부
📢 더미 변수 (dummy variable)
더미 변수(dummy variable)란, 숫자 0과 1로 표현되는 데이터이다.
원핫벡터(one hot vector) 또는 원핫인코딩(one-hot-encoding)이라고도 부른다.
카테고리를 나타내는 범주형 데이터는 범주형 데이터를 회귀분석 등 머신러닝 알고리즘에 바로 사용할 수 없는 경우 사용된다.
0은 해당 특성(feature)이 존재하지 않을 때, 1은 해당 특성이 존재할 때 표현한다.
📍 pandas.get_dummies(데이터프레임의 열)
📢 Wait a minutes ✋
📌 sklearn 라이브러리를 이용한 원핫인코딩 🔥
결과는 '희소행렬(sparse matrix)' 로 정의된다.
# sklern 라이브러리 불러오기
from sklearn import preprocessing
# 전처리를 위한 encoder 객체 만들기
label_encoder = preprocessing.LabelEncoder() # label encoder 생성
onehot_encoder = preprocessing.OneHotEncoder() # one hot encoder 생성
# label encoder로 문자열 범주를 숫자형 범주로 변환
onehot_labeled = label_encoder.fit_transform(df['hp_bin'].head(15))
print(onehot_labeled)
print(type(onehot_labeled))
# 2차원 행렬로 형태 변경
onehot_reshaped = onehot_labeled.reshape(len(onehot_labeled), 1)
print(onehot_reshaped)
print(type(onehot_reshaped))
# 희소행렬로 변환
onehot_fitted = onehot_encoder.fit_transform(onehot_reshaped)
print(onehot_fitted)
print(type(onehot_fitted))
5️⃣ 정규화 (normalization)
정규화란, 각 열(변수) 속하는 데이터 값을 동일한 크기 기준으로 나눈 비율로 나타내는 것이다.
정규화를 거친 데이터의 범위는 (0 ~ 1) 또는 (-1 ~ 1)이 된다.
📍 데이터 정규화 방법 🔧
- Min-Max Normalization(최소-최대 정규화)
- $\frac{x - min(x)}{ max(x) - min(x)}$
- Z-Score Normalization(Z-점수 정규화)
- $\frac{x - mean}{std}
■ Min-Max Normalization(최소-최대 정규화)
- 🥰 장점 : 모든 feature들의 스케일이 동일해진다. (최소값:0, 최대값:1)
- 😥 단점 : 이상치(outlier)를 잘 처리하지 못한다. (영향을 많이 받는다.)
■ Z-Score Normalization(Z-점수 정규화)
- 🥰 장점 : 이상치(outlier)를 잘 처리한다. (평균:0, 표준편차:1)
- 😥 단점 : 정확히 동일한 척도로 정규화 된 데이터를 생성하지는 않는다.
# 정규화(normalization)
# 1) Min-Max Normalization
from sklearn import preprocessing
x = preprocessing.MinMaxScaler().fit_transform(x)
# 2) z-score standardization
## numpy array 사용 가능
from sklearn import preprocessing
x = preprocessing.StandardScaler().fit(x).transform(x)
📢 정규화는 왜 하는걸까 🤔❓❔
각 변수(feature)에 들어 있는 숫자 데이터의 상대적 크기 차이 때문에 머신러닝 분석 결과가 달라질 수 있기 때문이다.
예를 들어, A변수는 0에서 1000 범위의 값을 갖고, B변수는 0에서 1 범위의 값을 갖는다면 상대적으로 큰 숫자 값을 갖는 A 변수의 영향이 더 커진다.
6️⃣ 시계열 데이터
시계열 데이터란 일정한 시간동안 수집된 일련의 순서를 가진 데이터셋이다.
시계열 데이터를 데이터프레임의 행 인덱스로 사용하면, 시간으로 기록된 데이터를 분석하는 것이 매우 편리하다.
- 시계열 데이터 표현
- Timestamp : 특정한 시점 기록
- Period : 두 시점 사이의 일정한 기간
📢 다른 자료형을 시계열 객체로 변환
대부분 시간 데이터들은 시간 자료형으로 기록되지 않고, 문자열 또는 숫자로 저장되는 경우가 많다.
판다스는 다른 자료형으로 저장된 시간 데이터를 판다스 시계열 객체인 Timestamp로 변환하는 함수를 제공한다.
📈 문자열(object)을 Timestamp로 변환
📍 pandas.to_datatime()
📈Timestamp를 Period로 변환
- 📍 pandas.Timestamp.to_period(freq=None, axis=0, copy=True)
- 📍 pandas.DataFrame.to_period(freq=None, axis=0, copy=True)
- feq : 기준이 되는 기간('D', 'M', 'A', ... )
📢 시계열 데이터 만들기
📈 Timestamp 배열
여러 개의 날짜(Timestamp)가 들어 있는 배열 행태의 시계열 데이터를 만들 수 있다.
- 📍 pandas.date_range(start=None, end=None, periods=None, freq=None, tz=None, normalize=False, name=None, closed=None)
- start : 날짜 범위 시작
- end : 날짜 범위 끝
- periods : 생성할 Timestamp 개수
- freq : 시간 간격
- tz : 시간대(timezone)
📈 Period 배열
여러 개의 기간(Period)이 들어 있는 시계열 데이터를 만든다.
- 📍 pandas.period_range(start=None, end=None, periods=None, freq=None, name=None)
📢 시계열 데이터 활용
💡 dt(datetime) 속성을 이용해 연 - 월 - 일 날짜 데이터에서 일부를 분리해서 추출해보자 ❗
- Timestamp
- 📍 연도 : datetime64객체.dt.year
- 📍 월 : datetime64객체.dt.month
- 📍 일 : datetime64객체.dt.day
- Period
- 📍 연도만 : datetime64객체.dt.to_period(freq='A')
- 📍 연도+월 : datetime64객체.dt.to_period(freq='M')
📈 날짜 인덱스 활용
날짜 인덱스를 활용하면 시계열 데이터에 대한 인덱싱과 슬라이싱이 편리하다.
- Timestamp로 구성된 행 인덱스 → DatetimeIndex
- Period로 구성된 행 인덱스 → PeriodIndex
'👩💻 > pandas' 카테고리의 다른 글
3. 데이터프레임 응용(3) (0) | 2021.01.31 |
---|---|
3. 데이터프레임 응용(2) (0) | 2021.01.31 |
3. 데이터프레임 응용(1) (0) | 2021.01.31 |
1. 판다스 자료구조(2) (0) | 2021.01.18 |
1. 판다스 자료구조(1) - Series, 시리즈 (0) | 2021.01.18 |