TIL-데이터분석 프로세스

HJ·2024년 6월 12일

ML_TIL

목록 보기
12/13
post-thumbnail

데이터분석 프로세스

1. 데이터 수집

  • 이미 존재하는 데이터 : SQL or Python으로 추출, 리포팅
  • 없는 데이터 : 머신러닝으로 예측
    SNOWFLAKE - “MODERN” DATA ARCHITECTURES
  1. Data Sources
  • OLTP Database : OnLine Transaction Processing은 온라인 뱅킹, 쇼핑, 주문 입력 등 동시에 발생하는 다수의 트랜잭션(데이터베이스 작업의 단위) 처리 유형
  • Enterprise Applications : 회사 내 데이터 (ex. 입사, 연봉, 고객 관계 데이터, 제품 마케팅 세일즈)
  • Third-Party : 제3자로 부터 가지고 오는 데이터 (ex. 마케팅할 때 Google Analytics와 같은 외부소스에서 수집되는 데이터)
  • Web/Log : 사용자의 로그데이터
  1. ETL : Extract(데이터 추출), Transform(데이터 변환-데이터 베이스에 데이터가 입력되고, 수정되고 삭제되는 것을 관리하는 작업단위), Load(로드)과정을 통해 Data Warehouse(데이터 창고)로 데이터가 저장된다.
  1. Data Lake : 원시 형태의 다양한 유형의 데이터를 저장
  1. Data Warehouse : 보다 구조화된 형태로 정제된 데이터를 저장 (최종 저장소)
  • Web/Log Data
  • Other
  1. Data Marts : Data Warehouse와 다르게 특정 조직의 목적을 위해 가공된 데이터 (ex. 회사의 금융, 마케팅, 영업부서 등에서 "저 이제 데이터 말겠습니다~")
  1. BI/Analytics : Business Intelligence(BI)는 의사결정에 사용될 데이터를 수집하고 분석하는 프로세스

2. 실제 데이터 수집

  • 😄회사 내 데이터가 존재한다면 : SQL 혹은 Python을 통해 Data Marts 생성
  • 😭회사 내 데이터가 없다면 : 데이터 수집 필요
    • 방법 1 : CSV, Excel 파일 다운로드
    • 방법 2 : API(Application Programming Interface - ex. 김밥천국가서 주문표 작성해서 사장님한테 제출하는거 = 규격화 된 형태로 서로 의사소통 하는 것)를 이용한 데이터 수집
    • 방법 3 : Data Crawling(API보다 데이터가 정형화되어있지 않음)

3. EDA : 탐색적 데이터 분석

  • EDA(Exploratory Data Analysis, 탐색적 데이터 분석)는 데이터의 시각화, 기술통계 등의 방법을 통해 데이터를 이해하고 탐구하는 과정이다.

1) 기술통계를 통한 EDA 예시

  • tips.describe()
    • include='all' 옵션을 통해 범주형 데이터도 확인 가능

2) 시각화를 이용한 EDA 예시

  • tips 데이터

① countplot : 범주형 자료의 빈도 수 시각화

  • 방법 : 범주형 데이터의 각 카테고리별 빈도 수를 나타낼 때 (ex. 상점에서 판매되는 제품의 카테고리별 판매수 파악)
  • X축 : 범주형 자료
  • y축 : 자료의 빈도수(자료의 갯수)

② barplot : 범주형 자료의 시각화

  • 방법 : 범주형 데이터의 각 카테고리에 따른 수치 데이터의 평균을 비교 (ex. 다양한 연령대별 평균소득을 비교할 때)
  • X축 : 범주형 자료
  • y축 : 연속형 자료

③ boxplot : 수치형 & 범주형 자료의 시각화

  • 방법 : 데이터의 분포, 중앙값, 사분위 수, 이상치 등을 한눈에 표현하고 싶을 때 (ex. 여러 그룹간 시험 점수 분포를 비교할 때)
  • X축 : 수치형 or 범주형
  • y축 : 수치형 자료

④ histogram : 수치형 자료 빈도 시각화

이거는 seaborn 라이브러리
이거는 matplotlib 라이브러리

  • 방법 : 연속형 분포를 나타내고 싶을 때, 데이터가 몰려있는 구간을 파악하기 쉬움 (ex. 고객들의 연령 분포를 파악 할 때)
  • X축 : 수치형 자료
  • y축 : 자료의 빈도수

⑤ scatterplot : 수치형끼리 자료의 시각화

  • 방법 : 두 연속형 변수간의 관계를 시각적으로 파악하고 싶을 때 (ex. 키와 몸무게 간의 관계를 나타낼 때)
  • X축 : 수치형 자료
  • y축 : 수치형 자료

⑥ pairplot : 전체 변수에 대한 시각화

  • 방법 : 한 번에 여러 개의 변수를 동시에 시각화 하고 싶을 때
  • X축 : 범주형 or 수치형 자료
  • y축 : 범주형 or 수치형 자료
  • 대각선(=같은 변수) : 히스토그램(분포)

4. 데이터 전처리

1) 이상치(Outlier)

: 관측된 데이터 범위에서 많이 벗어난 아주 작은 값 혹은 큰 값. 크게 2가지 기준이 있다.

① ESD(Extreme Studentized Deviation) 이용한 이상치 발견

  • 데이터가 정규분포를 따른다고 가정할 때, 평균에서 표준편차의 3배 이상 떨어진 값
  • 모든 데이터가 정규분포를 따르지 않을 수 있기 때문에 다음 상황에서는 제외!!
    • 데이터가 크게 비대칭일때(→ Log변환 등을 노려볼 수 있다)
    • 샘플 크기가 작을 경우

② IQR(Inter Quantile Range) 이용한 이상치 발견

  • ESD와 동일하게 비대칭적이거나 생플사이즈가 작은 경우 제한됨
  • Boxplot : 데이터의 사분위 수를 포함하여 분포를 보여주는 시각화 그래프. '상자-수염 그래프'
    • 사분위 수 : 데이터를 순서에 따라 4등분 한 것

③ 이상치 발견 방법

ESD(평균과 표준편차)를 이용한 처리

import numpy as np
mean = np.mean(data) 		#평균
std = np.std(data)			#표준편차
upper_limit = mean + 3*std	#표준편차 3배 떨어진 값(상방)
lower_limit = mean - 3*std	#표준편차 3배 떨어진 값(하방)

IQR을 이용한 처리(boxplot)

Q1 = df['column'].quantile(0.25)  #얘는 pd.series[], 하위 25%
Q3 = df['column'].qunatile(0.75)  #얘는 상위 25%
IQR = Q3 - Q1					  #얘는 박스플롯 구간
uppper_limit = Q3 + 1.5*IQR		  #얘는 선 끝, 상한 이상치
lower_limit = Q1 - 1.5*IQR		  #얘는 선 끝, 하한 이상치

조건필터링을 통한 삭제(a.k.a boolean Indexing)
df[df['column'] > limit_value

이상치는 주관적인 값이다. 도메인과 비즈니스 맥락에 따라 기준이 달라지며 데이터 품질은 향상되지만, 정보 손실을 동반하기 떄문에 주의해야한다.

이상 탐지(Anomaly Detection)라는 이름으로 데이터에서 패턴을 다르게 보이는 개체 또는 자료를 찾는 방법으로도 발전할 수 있다. ex) 사기탐지, 사이버 보안 등

2) 결측치(Missing Value)

: 존재하지 않는 데이터. null, NaN

① 수치형 데이터 처리 방법

  • 평균 값 대치 : 대표적인 대치 방법
  • 중앙값 대치 : 데이터에 이상치가 많아 평균 값이 대표성이 없다면 중앙 값을 이용 (ex. 이상치는 평균값을 흔들리게 함)

② 범주형 데이터 처리 방법

  • 최빈값 대치

💡 이상치는 평균 값을 흔들리게 한다.

③ 사용 함수

✅ 간단한 삭제 & 대치
- df.dropna(axis = 0) : 행 삭제
- df.dropna(axis = 1) : 열 삭제
- df.fillna(value) : 특정 값으로 대치(평균, 중앙, 최빈값)
- Boolean Indexing

✅ 알고리즘을 이용
- sklearn.impute.SimpleImputer : 평균, 중앙, 최빈값으로 대치
- SimpleImputer.statistics_ : 대치한 값 확인 가능
- sklearn.impute.IterativeImputer : 다변량대치(회귀 대치)
- sklearn.impute.KNNImputer : KNN 알고리즘을 이용한 대치

💡 이 방법 외에도, Imputation(알고리즘을 이용한 방법론)을 이용하여 대치할 수도 있다.

💡 예를 들어, 대표적인 알고리즘인 K-Nearest Neighbors(K 최근접 이웃 : 주변 정보를 통해 결측값 예측)이라는 방법이 있다.

3) 범주형 데이터 전처리 - 인코딩(Encoding)

: 인코딩의 사전적 뜻은 어떤 정보를 정해진 규칙에 따라 변환하는 것.

① 레이블 인코딩(Label Encoding)

  • 정의 : 문자열 범주형 값을 고유한 숫자로 할당
    • 1등급 → 0
    • 2등급 → 1
    • 3등급 → 2
  • 특징
    • 장점 : 모델이 처리하기 쉬운 수치형으로 데이터 변환
    • 단점 : 실제로는 그렇지 않은데, 순서 간 크기에 의미가 부여되기 때문에 모델이 잘못 해석 가능
    • 두가지는 상관없는데, 3개 이상부터는 반드시 순서형 자료를 사용해야함
  • 사용 함수 : sklearn.preprocessing.LabelEncoder
    • 메소드
      - fit : 데이터 학습
      : ex. 학점 데이터 니가 학습해서 분류해봐.
      - transform : 정수형 데이터로 변환
      : ex. 학점 → A=0, B=1, C=2, D=3, F=4
      - fit_transform : fit과 transform을 연결하여 한번에 실행
      : fit+transform 한번에 해버려 그냥!
      - inverse_transform : 인코딩된 데이터를 원래 문자열로 변환
      : 아 몰랑 다시 원상복구해줘!
      - classes_ : 인코더가 학습한 클래스(범주)
      : 몇개를 학습했어? ex. 학점 데이터에서 A~F까지 몇개임?

② 원-핫 인코딩(One-Hot Encoding)

  • 정의 : 각 범주를 이진 형식으로 변환하는 기법
    • 빨강 → [1,0,0]
    • 파랑 → [0,1,0]
    • 초록 → [0,0,1]
  • 특징
    • 장점 : 각 범주가 독립적으로 표현되어, 순서가 중요도를 잘못 학습하는 것을 방지, 명목형 데이터(혈액형, 색깔, 성별)에 권장한다!!
    • 단점 : 범주 개수가 많을 경우 차원이 크게 증가(차원의 저주 : 데이터가 너무 많아서 모델이 멍청해짐), 모델의 복잡도를 증가, 과적합 유발!
  • 사용 함수 : pd.get_dummies , sklearn.preprocessing.OneHotEncoder
    • 메소드(LabelEncoder와 동일)
      • categories_ : 인코더가 학습한 클래스(범주)
      • get_feature_names_out() : 학습한 클래스 이름(리스트)
        # CSR 데이터 데이터프레임으로 만들기
        csr_df = pd.DataFrame(csr_data.toarray(), columns = oe.get_feature_names_out())
        # 기존 데이터프레임에 붙이기(옆으로)
        pd.DataFrame([titaninc_df,csr_df], axis = 1) 

4) 수치형 데이터 전처리 - 스케일링(Scaling)

: 인코딩-범주형 자료 전처리 / 스케일링-수치형 자료 전처리


① 표준화(Standardization)

  • 정의 : 각 데이터에 평균을 빼고 표준편차를 나누어 평균을 0, 표준편차를 1로 조정하는 방법 (=Z-Score를 통한 표준화)
  • 수식
  • 사용 함수 : sklearn.preprocessing.StandardScaler
    • 메소드
      • fit : 데이터 학습(평균과 표준편차를 계산)
      • transform : 데이터 스케일링 진행
    • 속성
      • mean_ : 데이터의 평균 값
      • scale_, var_ : 데이터의 표준편차, 분산 값
      • n_features_in_ : fit할 때 들어간 변수 개수
      • feature_names_in_ : fit할 때 들어간 변수 이름
      • n_samples_seen_ : fit할 때 들어간 데이터의 개수
  • 특징
    • 장점
      • 이상치가 있거나 분포가 치우쳐져 있을 때 유용!
      • 모든 특성의 스케일을 동일하게 맞춘다. 많은 알고리즘에서 좋은 성능!
    • 단점
      • 데이터의 최소-최대 값이 정해지지 않음

② 정규화(Normalization)

  • 정의 : 데이터를 0과 1사이 값으로 조정(최소값 0, 최대값1)
  • 수식
  • 사용 함수 : sklearn.preprocessing.MinMaxScaler
    • ❗표준화와 공통인 것은 제외다
    • 속성
      • data_min_ : 원 데이터의 최소 값
      • data_max_ : 원 데이터의 최대 값
      • data_range_ : 원 데이터의 최대-최소 범위
  • 특징
    • 장점
      • 모든 특성의 스케일을 동일하게 맞춤
      • 최대-최소 범위가 명확하다
    • 단점
      • 이상치에 영향을 많이 받을 수 있음(반대로 말하면 이상치가 없을 때 유용)

③ 로버스트 스케일링(Robust Scaling)

  • 정의 : 중앙값과 IQR을 사용하여 스케일링
  • 수식
  • 사용 함수 : sklearn.preprocessing.RobustScaler
    • 속성
      • center_ : 훈련 데이터의 중앙값
  • 특징
    • 장점 : 이상치의 영향에 덜 민감
    • 단점 : 표준화와 정규화에 비해 덜 사용됨

5. 데이터 분리

1) 과적합은 머신러닝의 적

  • 과대적합(Overfitting)이란? 데이터를 너무 과도하게 학습한 나머지 해당 문제만 잘 맞추고 새로운 데이터를 제대로 예측 혹은 분류하지 못하는 현상

① 예측 혹은 분류를 하기 위해서 모형의 복잡도를 설정

  • 모형이 지나치게 복잡할 때 : 과대적합(Overfitting)이 될 수 있음
  • 모형이 지나치게 단순할 때 : 과소적합(Underfitting)이 될 수 있음

② 과적합의 원인

  • 모델의 복잡도 (ex. 고3이 3월 모의고사만 공부하고 수능치는거)
  • 데이터 양이 충분하지 않음
  • 학습 반복이 많음 (ex. 딥러닝의 경우)
  • 데이터 불균형 (ex. 정상환자-암환자 비율이 95:5)

2) 과적합 해결 - 테스트 데이터의 분리

  • 학습 데이터(Train Data) : 모델을 학습(fit)하기 위한 데이터
  • 테스트 데이터(Test Data) : 모델을 평가하기 위한 데이터
  • 사용 함수 : sklearn.model_selection.train_test_split
  • 파라미터
    • test_size : 테스트 데이터 세트 크기 (보통 3 or 2)
    • train_size : 학습 데이터 세트 크기 (보통 7 or 8)
    • shuffle : 데이터 분리 시 섞기
    • random_state : 호출할 때마다 동일한 학습/테스트 데이터를 생성하기 위한 난수 값. 수행할 때 마다 동일한 데이터 세트로 분리하기 위해 숫자를 고정 시켜야함
    • 변환 값(❗순서 매우 중요❗)
      X_train : (ex. 전체의 70% 중 공부하는것의 70%),
      X_test : (ex. 전체의 30% 중 테스트하는것의 70%),
      y_train : (ex. 전체의 70% 중 공부하는것의 30%),
      y-test : (ex. 전체의 30% 중 테스트하는것의 30%)

⚠️ Train Data에서 얻은 정보는 절대절대절대절대절대 Test Data에 적용하면 안됨.

3) 데이터분리 실습

*이따구로 불균형하니까 주의해야함. 이 비율 지켜서 뽑아내야함.

*Train Data 잘 뽑힘

*Test Data 잘 뽑힘

stratify= 분포가 불균형한 컬럼 을 설정해줘야 비율을 지켜서 데이터를 분리할 수 있다.

6. 교차 검증과 GridSearch

1) 교차 검증(Cross Validation)

  • 교차검증(Cross Validation)이란? 데이터 셋을 여러개의 하위 집합으로 나누어 돌아가면서 검증 데이터로 사용하는 방법이다.

    💡위에 있는 평가방법들은 모델을 평가하기 위한 별도의 테스트 데이터로 평가하는 과정이다. 하지만, 이때도 고정된 테스트 데이터가 존재하기 때문에 과적합할 수 있다. 그래서 교차검증을 해야한다.

① K-Fold Validation

  • 정의 : Train Data를 K개의 하위 집합으로 나누어 모델을 학습시키고 모델을 최적화 하는 방법이다.

    • K는 분할의 갯수이다.
      • Split 1 : 학습용(Fold 2~5), 검증용(Fold 1)
      • Split 2 : 학습용(Fold 1, 3~5), 검증용(Fold 2)
      • Split 5까지 반복 후 최종 평가
  • 특징 : 데이터가 부족할 떄 유용하다. → 반복 학습이기 때문!

  • 사용 함수 :

    • sklearn.model_selection.KFold
    • sklearn.model_selection.StrifiedKFold : 불균형한 레이블(Y)를 가지고 있을 때!

② GridSearch V : 하이퍼 파라미터 자동 적용하기

  • 하이퍼 파라미터(Hyper Parameter)란? 모델을 구성하는 입력 값 중 사람이 임의적으로 바꿀 수 있는 입력 값. 다양한 값을 넣고 실험할 수 있다.
  • 이걸 자동화 하는 게 Grid Search이다.

7. 총 정리

  • test data는 마지막에 모델을 평가하기 위해서 빼둔다! 절대 안건든다!!
  • train 안에서 7대 3으로 나눠서 또 검증, 평가 한다.
  • 거기서 가장 좋은 전처리 결과를 뽑아서 test data에 적용한다!

어렵다 어려워..😭

profile
First time, Last time, Every time.

0개의 댓글