본문 바로가기

STUDY

[자격증] 빅데이터 분석 기사 실기 준비

실기환경

작업형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