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


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

① 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 수치형 자료
- 대각선(=같은 변수) : 히스토그램(분포)
: 관측된 데이터 범위에서 많이 벗어난 아주 작은 값 혹은 큰 값. 크게 2가지 기준이 있다.



✅ 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) 사기탐지, 사이버 보안 등
: 존재하지 않는 데이터. null, NaN
💡 이상치는 평균 값을 흔들리게 한다.
✅ 간단한 삭제 & 대치
- 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 최근접 이웃 : 주변 정보를 통해 결측값 예측)이라는 방법이 있다.
: 인코딩의 사전적 뜻은 어떤 정보를 정해진 규칙에 따라 변환하는 것.
① 레이블 인코딩(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)
: 인코딩-범주형 자료 전처리 / 스케일링-수치형 자료 전처리



① 표준화(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_: 훈련 데이터의 중앙값- 특징
- 장점 : 이상치의 영향에 덜 민감
- 단점 : 표준화와 정규화에 비해 덜 사용됨


fit)하기 위한 데이터sklearn.model_selection.train_test_splittest_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에 적용하면 안됨.

*이따구로 불균형하니까 주의해야함. 이 비율 지켜서 뽑아내야함.
*Train Data 잘 뽑힘
*Test Data 잘 뽑힘
✅
stratify= 분포가 불균형한 컬럼을 설정해줘야 비율을 지켜서 데이터를 분리할 수 있다.
💡위에 있는 평가방법들은 모델을 평가하기 위한 별도의 테스트 데이터로 평가하는 과정이다. 하지만, 이때도 고정된 테스트 데이터가 존재하기 때문에 과적합할 수 있다. 그래서 교차검증을 해야한다.
정의 : Train Data를 K개의 하위 집합으로 나누어 모델을 학습시키고 모델을 최적화 하는 방법이다.

특징 : 데이터가 부족할 떄 유용하다. → 반복 학습이기 때문!
사용 함수 :
sklearn.model_selection.KFoldsklearn.model_selection.StrifiedKFold : 불균형한 레이블(Y)를 가지고 있을 때!


어렵다 어려워..😭