-
머신러닝 3 / 코드카타 / 판다스[스파르타코딩클럽]데이터분석 과정/TIL,WIL 2024. 1. 31. 20:51
머신러닝
- 데이터분석 프로세스
데이터 수집 -> 데이터 전처리 -> EDA -> 모델링 & 평가 -> 배포
- 탐색적 데이터 분석 (EDA)
데이터의 시각화, 기술통계 등의 방법을 통해 데이터를 이해하고 탐구하는 과정
include = 'all' : 범주형 데이터 확인 가능
countplot 범주형 자료의 빈도 수 시각화
범주형의 데이터의 각 카테고리별 빈도수barplot 범주형 자료의 시각화
범주형 데이터의 각 카테고리에 따른 수치 데이터의 평균 비교boxplot 수치형 & 범주형 자료의 시각화
데이터의 분포, 중앙값, 사분위 수 이상치 표현histogram 수치형 자료 빈도 시각화
연속형 분포를 나타내고, 몰려있는 구간 파악scatterplot 수치형끼리 자료의 시각화
두 연속혀 변수간의 관계를 시각화pairplot 전체 변수에 대한 시각화
한 번에 여러 개의 변수를 동시에 시각화- 이상치
보통 관측된 데이터 범위에서 많이 벗어난 아주 작은 값 혹은 큰 값
-데이터가 정규분포를 따른다고 가정할 때 평균에서 표준편차의 3배 이상 떨어진 값
-모든 데이터가 정규 분포를 따르지 않을 수 있기 때문에 다음 상황에서 제한됨
- 데이터가 크게 비대칭일 때
- 샘플 크기가 작을 경우-IQR을 이용한 이상치 처리 : boxplot
Q1 = df['column'].quantile(0.25) Q3 = df['column'].qunatile(0.75) IQR = Q3 - Q1 uppper_limit = Q3 + 1.5*IQR lower_limit = Q1 - 1.5*IQR
-ESD를 이용한 처리
import numpy as np mean = np.mean(data) std = np.std(data) upper_limit = mean + 3*std lower_limit = mean - 3*std
- 결측치
존재하지 않는 데이터
-결측치 처리 방법
- 수치형 데이터
-평균값 대치
-중앙값 대치
- 범주형 데이터
-최빈값 대치
- 함수
-간단한 삭제 & 대치
df.dropna(axis = 0)`: 행 삭제 df.dropna(axis = 1)`: 열 삭제 Boolean Indexing df.fillna(value)`: 특정 값으로 대치(평균, 중앙, 최빈값)
-알고리즘
sklearn.impute.SimpleImputer`:평균, 중앙, 최빈값으로 대치 SimpleImputer.statistics_` : 대치한 값 확인 가능 sklearn.impute.IterativeImputer`: 다변량대치(회귀 대치) sklearn.impute.KNNImputer`: KNN 알고리즘을 이용한 대치
- 범주형 데이터 전처리 - 인코딩
어떤 정보를 정해진 규칙에 따라 변환
-레이블 인코딩
- 정의 : 문자열 범주형 값을 고유한 숫자로 할당
- 특징 : 모델이 처리하기 쉬운 수치형으로 데이터 변환하지만 실제로 그러지 않아 잘못 해석할 수 있음
- 사용함수
sklearn.preprocessing.LabelEncoder` `fit`: 데이터 학습 `transform`: 정수형 데이터로 변환 fit_transform`: fit과 transform을 연결하여 한번에 실행 inverse_transform` : 인코딩된 데이터를 원래 문자열로 변환 classes_`: 인코더가 학습한 클래스(범주)
-원-핫 인코딩
- 정의 : 각 범주를 이진 형식으로 변환하는 기법
- 특징 : 각 범주가 독립적으로 표현되어, 순서가 중요도를 잘못 학습하는 것을 방지, 명목형 데이터에 권장한다. 다만 범주 개수가 많을 경우 차원이 크게 증가해 모델의 복잡도를 증가시키고 과적합을 유발한다
- 사용함수
pd.get_dummies` sklearn.preprocessing.OneHotEncoder` categories_`: 인코더가 학습한 클래스(범주) get_feature_names_out()`: 학습한 클래스 이름(리스트)
- 수치형 데이터 전처리 - 스케일링
수치형 자료에 대한 전처리
-표준화
- 정의 각 데이터에 평균을 빼고 표준편차를 나누어 평균을 0 표준편차를 1로 조정하는 방법
- 특징 : 이상치가 있거나 분포가 치우쳐저 있을 때 유용하고, 모든 특성의 스케일을 동일하게 맞추지만 데이터의 최대 최소값이 정해지지 않았다.
- 함수
sklearn.preprocessing.StandardScaler` fit : 데이터학습(평균과 표준편차를 계산) transform: 데이터 스케일링 진행 `mean_`: 데이터의 평균 값 `scale_`, `var_`: 데이터의 표준 편차,분산 값 `n_features_in_`: fit 할 때 들어간 변수 개수 `feature_names_in_`: fit 할 때 들어간 변수 이름 `n_samples_seen_` : fit 할 때 들어간 데이터의
-정규화
- 정의 : 데이터를 0과 1 사이 값으로 조정
- 특징 : 모든 특성의 스케일을 동일하게 맞추며 최대-최소 범위가 명확하지만 이상치에 영향을 많이 받을 수 있다.
- 함수
sklearn.preprocessing.MinMaxScaler data_min_`: 원 데이터의 최소 값 data_max_`: 원 데이터의 최대 값 data_range_` : 원 데이터의 최대-최소 범위
-로버스트 스케일링
- 정의 : 중앙값과 IQR을 사용하여 스케일링
- 특징 : 이상치의 영향에 덜 민감하지만 표준화와 정규화에 비해 덜 사용된다.
- 함수
sklearn.preprocessing.RobustScaler center_: 훈련 데이터의 중앙값
- 과적합
데이터를 너무 과도하게 학습한 나머지 해당 문제만 잘 맞추고 새로운 데이터를 제대로 예측 혹은 분류하지 못한 현상
-과적합의 원인
- 모델의 복잡도
- 데이터 양이 충분하지 않음
- 학습 반복이 많음
- 데이터 불균형
-과적합 해결 : 테스트 데이터의 분리 (7:3)
sklearn.model_selection.train_test_split 파라미터 test_size: 테스트 데이터 세트 크기 train_size: 학습 데이터 세트 크기 shuffle: 데이터 분리 시 섞기 random_state`: 호출할 때마다 동일한 학습/테스트 데이터를 생성하기 위한 난수 값. 수행할 때 마다 동일한 데이터 세트로 분리하기 위해 숫자를 고정 시켜야 함 반환 값(순서 중요) `X_train`, `X_test`, `y_train`, `y_test`
- 교차검증
데이터 셋을 여러 개의 하위 집합으로 나누어 돌아가면서 검증 데이터로 사용하는 방법
- K-Fold Validation
-정의 : Train Data를 K개의 하위 집합으로 나누어 모델을 학습시키고 모델을 최적화 하는 방법
-K는 분할의 갯수
데이터가 부족할 경우 유용
skelarn.model_selection.KFold sklearn.model_selection.StrifiedKFold: 불균형한 레이블(Y)를 가지고 있을 때 사용
- GridSearchV
SQL 코드카타
고양이와 개는 몇 마리 있을까
보호소에 들어온 동물 중 고양이와 개가 각각 몇 마리인지 조회하는 SQL문
이때 고양이를 개보다 먼저 조회- 몇 마리 : count
- 동물 종 : group by
- 정렬 : order by
SELECT ANIMAL_TYPE, COUNT(*) count FROM ANIMAL_INS GROUP BY 1 ORDER BY 1;
Product Sales Analysis 3
판매된 모든 제품의 첫 해에 대한 제품 ID, 연도, 수량 그리고 가격 SQL- 판매된 모든 제품의 첫해 : where의 서브쿼리
- 첫해 : min(year)
SELECT product_id, year as first_year, quantity, price FROM Sales WHERE (product_id, year) in ( SELECT product_id, MIN(year) FROM Sales GROUP BY PRODUCT_ID )
Revising Aggregations - The Count Function
인구가 100000 이상인 도시의 수- 인구가 100000 이상 : population >= 100000
- 도시의 수 : count
SELECT COUNT(*) FROM CITY WHERE POPULATION >= 100000;
파이썬 코드카타
명예의 전당(1)
출연한 가수의 점수가 지금까지 출연 가수들의 점수 중 상위 k번째 이내이면 해당 가수의 점수를 명예의 전당
출연 가수의 점수가 기존의 명예의 전당 목록의 k번째 순위의 가수 점수보다 더 높으면, 출연 가수의 점수가 명예의 전당에 오르게 되고 기존의 k번째 순위의 점수는 명예의 전당에서 내려옴- 명예의 전당 순위 : a =[]
- k개의 점수라면~ : if
- 최하점수 저장 : .append(i)
- 명예의 전당에서 가장 적은 점수 제거 : remove
- 그 자리가 채워짐 : append(i)
def solution(k, score): answer = [] #명예의 전당 순위 a=[] for i in score: #k개의 점수 중 최하 점수 저장 if len(a)<k: a.append(i) else: #가장 적은 점수 제거 #명예의 전당 오름 if min(a)<i: a.remove(min(a)) a.append(i) answer.append(min(a)) return answer
2016
2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일인지 리턴하는 함수- 요일 : thu부터 시
- a 이전의 월 반복해서 a월의 요일 찾기 : for i in range(a-1):
def solution(a, b): answer = '' #금 1 토 2 ... -> 나머지값이 0인 요일 : 목요일 day=["THU","FRI","SAT","SUN","MON","TUE","WED"] month_len=[31,29,31,30,31,30,31,31,30,31,30,31] #2016년 1월 1일부터 입력 날짜까지의 전체 일 수 total_day=0 #a 이전의 월 반복 -> 해당 월 길이 + today_day for i in range(a-1): total_day+=month_len[i] total_day+=b result=total_day%7 answer=day[result] return answer
판다스
- Datetime : 시간 데이터의 전처리
pandas.Series.dt.year: 연도
pandas.Series.dt.month: 월
pandas.Series.dt.day: 일
pandas.Series.dt.hour: 시
pandas.Series.dt.minute: 분
pandas.Series.dt.second: 초
pandas.Series.dt.microsecond: micro 초
pandas.Series.dt.nanosecond: nano 초
pandas.Series.dt.week: 주
pandas.Series.dt.weekofyear: 연중 몇 째주
pandas.Series.dt.dayofweek: 요일
pandas.Series.dt.weekday: 요일 (dayofweek과 동일)
pandas.Series.dt.dayofyear: 연중 몇 번째 날
pandas.Series.dt.quarter: 분기- to_numeric: 수치형 데이터로 변환하는 방법
- insert(컬럼 인덱스, 컬럼명, 값) : 중간에 컬럼 추가
- drop() : 인덱스 지정하여 삭제, 범위 지정해서 삭제 가능
- fancy indexnig을 활용하여 삭제
- axis = 1 옵션 지정
- 다수의 컬럼 삭제 가능
- 바로 적용 : inplace = True
- pd.cut() : 구간 나누기
- pd.qcut() : 동일한 갯수를 갖도록 구간 분할하지만 간격은 일정하지 않
'[스파르타코딩클럽]데이터분석 과정 > TIL,WIL' 카테고리의 다른 글
머신러닝 5/ 코드카타 / pandas (0) 2024.02.02 머신러닝 4/ 코드카타 / 판다스 (0) 2024.02.01 머신러닝 2 / 코드카타 / 판다스 (1) 2024.01.30 머신러닝 1 / 코드카타 / 판다스 (1) 2024.01.29 코드카타 / 파이썬 / 판다스 (1) 2024.01.26