이것저것 담는 블로그

데이터 처리 과정 요약 본문

IT/Data Processing

데이터 처리 과정 요약

버즈와우디 2022. 11. 18. 20:11

데이터과학자로 일하다보면 데이터를 처리하는 과정은 어느 정도 정형화된 부분이 있다.

앞으로 항상 하게 될 일이라서 머릿 속에 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