Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 파이썬
- 블라인드테스트
- 통화정책파급경로
- montecarlo
- RL
- 통화주의학파
- 독후감
- ldbc
- 요한하리
- ReinforcementLearning
- 재무엑셀
- 프로그래머스
- SQL
- dataanalysis
- potatoeseater
- 독서모임
- 책읽는케이크
- 증권투자권유자문인력
- 파생상품평가모형
- agviewer
- 카카오
- 집중하는법
- pandas
- python
- 코딩테스트
- 재무제표
- Nas
- 인도가격
- 도둑맞은집중력
- 주식
Archives
- Today
- Total
이것저것 담는 블로그
데이터 처리 과정 요약 본문
데이터과학자로 일하다보면 데이터를 처리하는 과정은 어느 정도 정형화된 부분이 있다.
앞으로 항상 하게 될 일이라서 머릿 속에 framework을 잡는다는 생각으로 과정을 정리하였다.
다른 데이터분석가/데이터과학자 분들의 업무 프로세스도 유사할 것이라 생각한다.
1. 데이터 추출
- ANSI SQL, HiveQL, Sybase, Python
Step 1. 원하는 테이블과 컬럼 값 찾기
- 메타데이터시스템 활용
- 자주 활용하는 도메인 명칭과 datatype 등을 기억해두면 일처리 속도가 매우 빨라진다.
- 원하는 데이터가 없다면,
- 분석용 주제영역에만 없는 데이터인 경우, 인프라 쪽에 적재 요청
- 어디에도 없다면, API/크롤링 등으로 외부로부터 데이터 긁어서 적재
- API는 Parameter나 정책이 종종 바뀌기도 하기 때문에, 활용 당시 documentation을 잘해놔야함
- 외부데이터를 적재하는 경우, 회사의 표준단어에 맞게 컬럼명 변경 필요 & 컬럼 매칭 documentation 필수
- API Parameter 값이랑 변경한 컬럼명을 리스트화 해서 dtypes.py 등의 하나의 파일로 관리하면 나중에 운영하기 훨씬 수월하다.
- API Configuration 정보도 .py 나 .json 등으로 다 미리 지정해야 코드짤 때 편하다.
Step 2. 쿼리
- 부서에 다른 분이 짠 쿼리를 최대한 활용한다. 왜냐하면 특정 column에 조건을 꼭 걸어줘야만 하는 경우들이 있는데, 모든 column의 value와 유효값 그리고 그 값의 의미를 확인하는 것은 무리이기 때문이다.
- 로그데이터 같이 방대한 데이터를 처리할 때는 매번 select 하는 것보다는, 한 번 select하고 임시 테이블로 적재를 해둔 후에 그 테이블 데이터를 활용해서 분석하는 것이 좋다.
- JOIN은 정말 너무너무 중요하다. 이 때 Key값 에러 없는지 꼭 확인하고 넘어가자.
Etc.
- DB Configuration은 꼭 .ini 등으로 정의해두고, Hive쪽에 붙을 때 자주 활용되는 함수들은 미리 짜서 class로 꼭 만들어야한다.
- 사내 데이터를 추출하고 처리하다보면, 쿼리로는 raw data 그냥 다 가져오고 python으로 처리하는 것이 언뜻 편해보인다.
- 그치만 데이터를 가장 잘 활용하기 위해서는 추출 단계에서부터 필요한 데이터의 범위를 명확히하고, 최대한 쿼리를 활용해서 데이터를 뽑아야 검증 단계에서 덜 고생한다.
- python으로 이리저리 처리하다보면 데이터 정합성이 안맞는 경우가 많이 발생하기 때문이다.
2. 데이터 전처리
- Python, Pandas, Numpy, Matplotlib, Seaborn, Plotly, Scikit-learn, HiveQL
A. 아래 부분은 쿼리로 긁어온 데이터를 파이썬으로 처리할 때를 가정하고 작성한다.
B. 데이터 처리의 목적에 따라 SQL로 같은 Step을 거칠 수 있다.
Step 1. EDA
A. Python 처리
- df.describe() 함수로 대략적인 정보를 확인한다. 수치데이터인 경우, min max 값으로 대략적인 이상치는 확인할 수 있다.
- df[col].unique() 함수로 각 value 들이 보통 어떻게 생겼는지 파악한다. 여기서 이상치를 발견할 수 도 있다.
- df.isnull().sum() 등으로 각 컬럼별로 결측치가 얼마나 있는 지 확인한다.
- 다양한 라이브러리로 시각화를 해보면서 대략적인 데이터의 트렌드를 알아보는 것도 좋다.
B. SQL 처리
- DESC 함수로 테이블의 전체 컬럼과 datatype, description을 읽는다.
- 보통 SELECT * FROM TABLE LIMIT 10000 정도로 모든 데이터를 한 번 스윽 훑는다.
- DISTINCT를 활용해서 unique value를 빠르게 볼 수 있다.
Step 2. 이상치 처리
A. Python 처리
- df[col].unique()로 빠르게 value 들을 스캔한다. 바로 보이는 이상치는 결측치로 대체해도 되고, 해당 record 자체를 삭제할 수 도 있다.
- 여기서 은근 type이 이상하게 잡혀있는 데이터들이 있다. Type cast는 미리미리!
- 보통 DB에서 긁어오면 string 값 중에 blank가 굉장히 많다. 이때 strip 필수
- 평균값, 최빈값 등으로 대체하는 경우도 있다. time series 데이터의 경우, 앞뒤 레코드의 중간값으로 대체하기도 한다.
B. SQL 처리
- 보통 MIN, AVG, MAX 함수들로 값의 분포를 확인한다.
- 보통 BETWEEN 함수로 값의 range를 지정하는 경우가 많다.
- CASE WHEN ~ THEN ELSE END 문을 활용해서 값을 대체할 수 있다.
- VARCHAR 타입의 경우 공백이 종종 있기 때문에 TRIM을 웬만하면 해주자.
Step 3. 결측치 처리
- 경우에 따라, 모델에서 Feature의 결측이 있어도 처리 가능한 경우는 스킵해도 되는 부분이다.
- df.isnull().sum()으로 결측치의 수를 확인한다.
- 결측치 역시 평균값, 최빈값, time series의 경우 중간값 등으로 대체된다. 여기서 금융 시장 데이터 (ex. KOSPI 지수)등은 앞 레코드(전일 기준)로 채우는 경우도 있다.
Step 4. 정규화/ 표준화
Step 5. Encoding / Binding
Step 6. 파생변수 만들기
'IT > Data Processing' 카테고리의 다른 글
Graph query Cypher 교육 (6) | 2023.04.10 |
---|---|
간단한 SQL 리뷰 (0) | 2022.09.06 |