실기환경
작업형1: 문제 풀이 후 답안 제출, 답안만 채점하므로 만점 or 0점, 3문항
작업형2: 예측 결과를 CSV 파일로 제출, 코드 점수는 없는데 구간별 점수
작업형3: 1과 마찬가지, 2문항
판다스 활용
- dir(pd): 판다스 함수명
- help(pd.함수명): 함수 사용 방법 및 예시 코드
사이킷런 활용
- sklearn.__all__: 사이킷런 함수명
- dir(preprocessing): 전처리 함수명
- help(preprocessing.함수명): 함수 사용 방법 및 예시 코드
사이파이 활용
- dir(stats): 전처리 함수명
- help(stats.함수명): 함수 사용 방법 및 예시 코드
작업형1
판다스(pandas)
- df.to_csv('temp.csv')
- pd.read_csv('temp.csv')
- loc은 끝 인덱스 포함
- df.sort_values(['가격', '메뉴'], ascending=[False, True], inplace=True): 가격 내림차순, 메뉴 오름차순 정렬후 저장
- cond = df['메뉴'].isin(['녹차', '카푸치노', '카페라떼']: 저 메뉴가 포함된 데이터를 찾는 cond
- df['원산지'].fillna('코스타리카', inplace=True): 결측치 채우기
- numeric_only=True: 연산 에러시 확인할 것
- 최빈값은 mode()[0], 최빈값은 여러값이 있는 Series로 나오기 때문!
총 정리
- df['컬럼'].value_counts(): 카테고리별 개수 확인, 많은 수부터 나열됨, 컬럼이 index인 series 생성, mode() 대신 최빈값 구할 수도
- index[]: index 값을 찾을때 사용, value_counts 후에 index 이름을 가져올 필요가 있을때 사용하자, []없으면 모든 인덱스
- isin(): 리스트 형태를 입력받아 리스트에 있는 값을 한번에 찾음
- reset_index(): index와 컬럼이 다 컬럼이 되는 dataframe 생성
- sort_values('컬럼', ascending=False)
- iloc[행, 열]
- loc[cond, '컬럼'] 처럼 조건을 줄 수도 있음
- str.contains(): 특정 문자 찾기
- 데이터 개수 len으로 쉽게 구해도 됨, 조건에 대해 sum을 해도 됨
- idxmax(): 최댓값의 인덱스를 반환, idxmin() 마찬가지
- isnull().sum(): 컬럼별 결측치 수를 확인하는 방법, 작업형2에서도 많이 씀, 이 방식으로 mean()을 사용하면 비율을 확인할 수 있다는 사실
- drop_duplicates(): 중복 데이터 제거, 고유값 개수만 알려면 nunique()
- replace(np.nan, 값): 결측치 변경 법, numpy 필요, 결측치 말고 일반 값 변환도 가능
- map(딕셔너리): 여러 값을 변경하는 법
- select_dtypes(exclude='object'): 특정 자료형 제외하고 선택
- df.columns: 괄호는 없고 컬럼 리스트 반환
- df.T: 행 열 변환
- apply(함수): 함수로 각 값을 계산
- astype(int): int로 변환
- df[['컬럼들']].sum(axis=1): 열 방향 합계
- nlargest(n, '컬럼'): 컬럼 기준 n개 큰 데이터, nsmallest도 마찬가지
- melt(id_vars=['컬럼'], value_vars=['컬럼']): 유지할 컬럼은 두고 재구조화할 컬럼은 수평에서 수직으로
- concat(): 합치기, 순서가 동일할때
- merge(on='컬럼'): 컬럼을 기준으로 합치기
- 집계함수
- min(), max(), sum(), mean(), mode()[0]
- var(): 분산
- std(): 표준편차
- quantile(): 분위수, .75와 .25로 3사분위수, 1사분위수를 구할 수 있음, describe() 활용해도 됨, 3분위수 - 1분위수 = IQR, 이상치는 각 분위수에서 IQR * 1.5보다 더 차이나는 값
- size(), count(): 둘 다 요소 개수를 세지만 Nan값 포함, 제외 차이
- 결측치
- fillna(값, inplace=True): method='bfill'을 쓰면 뒤에 있는 가까운 값으로 채움, ffill은 앞
- dropna()
- isnull()
- 날짜
- pd.to_datetime(df['컬럼']): pd로 쓰는것 주의, datetime 자료형으로 변경
- dt.year: 괄호 없음 주의, 연도값, month, day, hour도 마찬가지, days는 일 차이이니 이런 차이 주의
- dt.total_seconds(): 전체 시간을 초 단위로, 나눗셈으로 분, 시단위로 만들면 됨, 그냥 seconds는 일 단위를 나누고 남은 초니까 주의
- dt.to_period('M'): 연도 월을 묶은 월 단위
- dt.dayofweek: 요일, 0이 월요일부터 6이 일요일
- 그룹
- groupby(['컬럼'])['컬럼'].집계함수(): 여러 컬럼도 가능, 두 컬럼은 각각 그룹핑할 컬럼과 집계함수를 적용할 컬럼
- MultiIndex: groupby를 여러 컬럼에 대해서 하거나 하면 index가 여러개가 될 수 있음, 귀찮다면 reset_index()
작업형2
데이터 전처리
- 결측치: 삭제하거나 평균값, 중앙값, 최빈값 등으로 채움 (시험에서는 데이터가 작아 보통 채움)
- 이상치: 문제에 명시된게 아니면 처리하지 않는 것을 추천
- 레이블 인코딩: 각 범주를 숫자로 매핑
- 원-핫 인코딩: 각 범주를 새로운 컬럼으로 1과 0으로 할당
- 스케일링: 값을 0부터 1사이 범위로, 선형 모델에서 긍정적인 영향
평가지표
- 이진 분류: accuracy_score, precision_score, recall_score, f1_score(문자인 경우 양성 클래스 지정), roc_auc_score(확률의 두 번째 열 사용) 사용
- 다중 분류: accuracy_score는 그대로 사용, precision_score, recall_score, f1_score는 average=에 'micro', 'macro', 'weighted' 요구에 따라 적용
- 회귀: mean_squared_error, mean_absolute_error, r2_score(결정계수), mean_squared_log_error 사용, RMSE, RMSLE는 제곱근 적용한 값, MAPE는 (abs(y_true - y_pred) / (y_true + epsilon))).mean() * 100
이진 분류
- EDA: info(), describe(), describe(include='object'), isnull().sum(), 타켓데이터 value_counts()
- 전처리: dropna(), fillna() (범주형은 보통 최빈값 혹은 임의값으로, 수치형은 보통 평균값 혹은 중앙값으로, test도 똑같이 적용)
- 인코딩: pop()을 통해 y값 따로, pd.get_dummies()로 원-핫 인코딩 (train, test 데이터 불일치 발생하므로 concat후 사용하고 나누기), object형인 column들을 리스트로 만들어 LabelEncoder() 사용 (sklearn.preprocessing에서 import, train에 fit_transform, test에 transform), target 변수는 map()이나 replace() 활용 (필수 아님)
- 스케일링: 수치형인 column들을 리스트로 만들어 MinMaxScaler(), StandardScaler(), RobustScaler() 사용 (레이블 인코딩과 달리 반복문 없이 한번에 가능)
- 데이터 분할: train_test_split(train, target, test_size=0.2, random_state=0) (sklearn.model_selection에서 import)
- 학습: RandomForestClassifier()로 fit과 predict 혹은 predict_proba(확률값) 사용 (sklearn.ensemble에서 import), lgb.LGBMClassifier()로 똑같이 사용 (lightgbm 따로 import)
- 평가: roc_auc_score(확률값이 필요), accuracy_score, f1_score(pos_label로 양성 클래스 지정) 사용 (sklearn.metrics에서 import)
- 검증: classes_로 확률값 순서 확인 가능, 컬럼명을 신경써서 데이터프레임을 만들고 index=False로 to_csv 저장
- 랜덤포레스트의 하이퍼파라미터 튜닝은 max_depth 3에서 7, n_estimators 200에서 500으로, 불균형 데이터의 경우 class_weight='balanced'로
회귀
- EDA, 전처리, 인코딩, 스케일링(생략), 분할 과정은 같음
- 선형회귀: LinearRegression() (sklearn.linear_model에서 import)
- 랜덤포레스트: RandomForestRegressor (sklearn.ensemble에서 import)
- LightGBM: lgb.LGBMRegressor (lightgbm as lgb로 import)
- 평가는 회귀 지표로 진행하면 되고 검증 과정은 같음
다중 분류
- EDA, 전처리, 인코딩, 스케일링(생략), 분할 과정은 같음
- LightGBM을 사용할 경우 인코딩 없이 자료형은 'category'로 변환만 해주어도 됨
- 평가 검증 마찬가지
총 정리
- import
- import pandas as pd (기본 판다스)
- from sklearn.preprocessing import LabelEncoder (레이블 인코딩)
- from sklearn.preprocessing import MinMaxScaler, StandardScaler, RobustScaler (스케일링)
- from sklearn.model_selection import train_test_split (데이터 나누기)
- import lightgbm as lgb (라이트지비엠)
- from sklearn.ensemble import RandomForestClassifier (분류 랜덤포레스트)
- from sklearn.linear_model import LinearRegression (선형회귀)
- from sklearn.ensemble import RandomForestRegressor (회귀 랜덤포레스트)
- from sklearn.metrics import roc_auc_score, accuracy_score, f1_score (분류 평가지표)
- from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score, mean_squared_log_error (회귀 평가지표)
- from sklearn.model_selection import cross_val_score (크로스 밸리데이션)
- EDA: info(), describe(), describe(include='object'), isnull().sum(), 타켓데이터 value_counts()
- 결측치
- dropna(): 결측치가 하나라도 있는 행 모두 제거
- dropna(subset=['컬럼명']): 특정 컬럼에 결측이 있는 행 제거
- dropna(axis=1): 결측치가 있는 컬럼 모두 제거
- drop(['컬럼명'], axis=1): 특정 컬럼 제거
- fillna('X'): 결측치를 채움 (원한다면 특정 값으로)
- 인코딩
- 원-핫 인코딩: concat(['train', 'test'])를 해준 후 pd.get_dummies(data), len(train) 기준으로 나눠줌
- 레이블 인코딩: object인 컬럼명 리스트를 반복문으로 le.fit_transform(train[col]), 내 생각엔 위의 concat 과정 그냥 해주는게 좋을 듯, list(train.columns[train.dtypes == object])로 cols 생성 가능
- 스케일링: 패스해도 좋음
- 마찬가지로 fit_transform 적용, test는 transform만 적용
- 데이터 나누기: X_train, X_val, y_train, y_val = train_test_split(train, target), 순서 주의
- 학습
- 랜덤 포레스트: rf.fit(X_train, y_train)으로 학습, rf.predict(test)는 결과값, rf.predict_proba(test)는 확률값
- 선형 회귀: 위와 동일
- 라이트지비엠: 따로 import해서 lgb.LGBMClassifier()로 객체 생성, 사용법은 같음, 회귀는 lgb.LGBMRegressor, 카테고리형을 인코딩 없이 사용 가능
- 평가
- ROU_AUC는 pred[:, 1]값 사용
- 나머지는 그냥 두 값 비교하며 사용
- 다중 분류에서는 average=에 'micro', 'macro', 'weighted'
- 튜닝
- 랜덤포레스트는 max_depth 이진은 3~7 다중은 5~10 회귀는 0~20, n_estimators 200에서 500으로, 불균형 데이터의 경우 class_weight='balanced'로
- 크로스밸리데이션: cross_val_score(rf, train, target, cv=3, scoring='메트릭')으로 스코어 얻고 학습은 따로
작업형3
가설검정
- 명확한 답변을 위해 귀무가설 채택 및 대립가설 기각, 귀무가설 기각 및 대립가설 채택으로 결론 짓도록
단일 표본 검정
- t_statistic, p_value = stats.t-test: ttest_1samp(a, popmean, alternative)
- a: 표본 데이터
- popmean: 모집단 평균, 기대 값
- alternative: 대립가설 정의 (two-sided(기본값), greater, less)
- stats.shapiro(df['weights']): 정규 분포를 따르는지 검증
- stats.wilcoxon(df['weights'] - 120, alternative='less'): 정규성을 만족하지 않을 때 비모수 검정, 중앙 값을 빼줌
대응 표본 검정
- 같은 집단을 사전, 사후 측정
- ttest_rel(a, b, alternative)
- a: 표본1
- b: 표본2 (같은 데이터 수)
- alternative: 대립가설 정의 (a-b 기준)
- stats.shapiro(df['after'] - df['before']): 두 차이가 정규 분포를 따르는지 검증
- stats.wilcoxon(df['after'], df['before'], alternative='greater'): 정규성을 만족하지 않을 때 비모수 검정
- stats.wilcoxon(df['diff'], alternative='greater'): diff를 이용해도 결과는 마찬가지
독립 표본 검정
- 두 그룹(표본) 간의 평균 비교
- ttest_ind(a, b, alternative, equal_val)
- equal_val: 분산이 같다고 가정 TF
- stats.shapiro(class1): 두번으로 각각 정규성 검증
- stats.levene(class1, class2): 등분산성 검증, 만족하지 않으면 equal_var=False (Welch의 t-검정)
- stats.mannwhitneyu(class1, class2, alternative='less'): 정규성이 만족하지 않을 때 비모수 검정 (Mann-Whitney U 검정)
일원 분산 분석
- 3개 이상의 집단 간의 평균 차이가 유의한지 검정
- stats.shapiro(class1): 각각의 그룹 정규성 검증
- stats.levene(class1, ...): 등분산성 검정
- stats.f_oneway(class1, ...): 일원 분산 분석 진행
- ols 활용
- from statsmodels.formula.api import ols
- from statsmodels.stats.anova import anova_lm
- model = ols('target ~ a + C(b)', df).fit(): ~로 종속변수와 독립변수를 구분, +로 여러 독립변수들을 포함, C로 범주형 변수임을 명시하니 숫자인 범주형 변수 꼭 처리할 것, 띄어쓰기나 특수문자 인식 못하니 컬럼명 변경 필요
- print(anova_lm(model)): PR(>F)가 p-값, 각각 자유도, 제곱합, 평균 제곱, F-통계량, p-값
이원 분산 분석
- 요인이 2개인 경우, 주 효과뿐만 아니라 상호작용 효과에도 관심을 둠
- model = ols('종속변수 ~ C(요인1) + C(요인2) + C(요인1):C(요인2) ', df).fit(): 상호작용 효과를 포함, C(요인1)*C(요인2)도 가능
- anova_lm(model, typ=숫자): 1은 변수 순서에 따라, 2는 변수의 독립적 효과 분석, 3은 모든 변수 상호작용을 동시에 고려, 모델이 단순하면 유사함, 특별한 요청이 없으면 기본값(1임)
적합도 검정
- 1개의 범주형 변수가 특정 분포를 잘 따르는지 검정
- stats.chisquare(observed, expected, ddof, axis): 각각 관측 빈도 리스트, 기대 빈도 리스트, 자유도 조정, 축
독립성 검정
- 2개의 변수가 서로 독립적인지, 연관이 있는지 검정
- stats.chi2_contingency(table, correction=True): 각각 교차표 데이터, 연속성 보정 여부
- 교차표 데이터가 주어지면 데이터프레임을 만들거나 간단하게 리스트 작성
- 로우 데이터가 주어지면 pd.crosstab(df['성별'], df['운동')으로 교차표를 만듦
동질성 검정
- 2개 이상 집단에서 분산의 동질성을 가졌는지 검정
- 독립성 검정과 상황만 다르고 동일
상관 계수
- 두 변수 가의 선형적인 관계가 강한지
- df.corr(method='pearson', numeric_only=False): pearson외에 kendall, spearman
- df['컬럼'].corr(df['컬럼'])으로 두 변수에 대한 산관 관계만 구할수도
- 각각 stats의 pearsonr, kendalltau, spearmanr로 구할 수 있음
단순 선형 회귀 분석
- 하나의 독립변수로부터 하나의 종속변수와의 관계를 분석하거나 예측
- model = ols('종속변수 ~ 독립변수', df).fit() 진행한 후 model.summary() 확인
- 결정 계수는 R-squared, model.rsquared로 구함
- 기울기와 절편은 coef값들, p-value도 확인 가능, 각각 model.params, model.pvalues로 구함
- model.predict(data)로 예측 가능
- 실제 값과 predict로 구한 값의 차이의 제곱값들을 합하면 잔차 제곱합
- 제곱값들의 평균은 MSE, 사이킷런의 mean_squared_error 사용과 같음
- 신뢰 구간도 볼 수 있으나 model.conf_int(alpha=0.05)로 다른 신뢰구간도 확인 가능
- pred = model.get_prediction()으로 예측값과 예측 구간을 구하고 pred.summary_frame(alpha=0.05)로 예측 결과 요약, mean_ci는 신뢰 구간, obs_ci는 예측 구간
다중 선형 회귀 분석
- +로 여러 독립변수 확인
- corr이나 stats.pearsonr로 상관 계수나 t-검정의 p-value 확인
- 나머지는 비슷함
범주형 변수
- 원-핫 인코딩을 통해 수치화 필요, ols는 자동 처리
- coef에서 첫번째 카테고리에 대한 절편값과 다른 카테고리의 차이값이 표시
- 숫자인 범주형 변수는 C()로 변환할 것, 문제에서 명확하게 설명해 줌
로지스틱 회귀 분석
- ols 대신 logit 사용, 사용 방법은 같음
- 결과가 두 가지 범주 중 하나로 나눠지는 상황에서 독립변수들과의 관계를 모델링
- 오즈비는 변수의 계수(coef)를 np.exp (단위가 주어지면 곱하고 씌움)
- 로그 우도는 model.llf로 확인
- 잔차이탈도는 로그 우도에 -2를 곱함
- 정확도는 올바른 데이터 비율, 오류율은 잘못된 데이터 비율
총 정리
음... 3은 다보도록 하자
'STUDY' 카테고리의 다른 글
[자격증] AICE PROFESSIONAL (0) | 2024.12.14 |
---|---|
[자격증] ADsP 준비 (4) | 2024.11.02 |
[자격증] 정보처리기사 실기 준비 (3) | 2024.10.17 |
[자격증] DAsP 준비 (6) | 2024.09.25 |
[자격증] 빅데이터 분석 기사 필기 준비 (2) | 2024.08.30 |