시험 준비
빅데이터 분석기사 실기 준비를 하면서, 시험 직전에 볼 간단한 문법 정리집이 필요했다.
실제 시험 준비는 많은 분들처럼 캐글 놀이터를 활용했는데, 나같은 경우는
- python은 익숙하지만 pandas는 낯설어서 정답을 따라서 손코딩을 해보고
- 학습한 내용을 바탕으로 직접 문제를 풀어보는 식으로 공부했다.
작업형 1의 경우에는 아래의 문법을 숙지하고 있다면 어렵지 않게 풀 수 있다.
Simple EDA (데이터분석)
- 데이터 크기 파악: df.shape
- 데이터 일부 예시: df.head(N)
- 데이터 일부 예시: df.tail(N)
- 컬럼별 결측값 확인: df.isnull().sum()
- 컬럼별 non-null 개수, 데이터타입 확인: df.info()
- 컬럼별 개수, 평균, 표준편차, 최솟값, 최댓값 등 확인: df.describe()
- numpy array 형태로 값 확인: df.values
Pandas 함수
기본 조건문
- &: and 조건 표현
- |: or 조건 표현
- ~: not 조건 표현
기본 통계
- 최댓값: df[컬럼].max()
- 최솟값: df[컬럼].min()
- 평균: df[컬럼].mean()
- 중앙값: df[컬럼].median()
- 최빈값: df[컬럼].mode()[0]
- 합: df[컬럼].sum()
- 곱: df[컬럼].prod()
- 데이터 갯수: df[컬럼].count()
- 분산: df[컬럼].var()
- 표준편차: df[컬럼].std()
- 절대값: df[컬럼].abs()
심화 통계
- 평균의 표준오차: df[컬럼].sem()
- 평균의 절대편차: df[컬럼].mad()
- 누적합: df[컬럼].cumsum()
- 누적곱: df[컬럼].cumprod()
- 누적 최댓값: df[컬럼].cummax()
- 누적 최솟값: df[컬럼].cummin()
- 사분위수: df[컬럼].quantile()
- 1사분위수: df[컬럼].quantile(.25)
- 3사분위수: df[컬럼].quantile(.75)
- 사분범위(IQR): 3사분위수 - 1사분위수, 중앙값을 기준으로 데이터의 흩어진 정도
- 이상치: 1사분위수-1.5*IQR보다 작거나, 3사분위수+1.5*IQR보다 큰 값
- 왜도: df[컬럼].skew()
- 분포의 비대칭도를 나타냄
- 오른쪽 꼬리가 길면(평균 < 중앙값) 양수, 왼쪽 꼬리가 길면(평균 > 중앙값) 음수
- 첨도: df[컬럼].kurt()
- 분포의 뾰족함 혹은 완만한 정도 (= 중심에 얼마나 몰려있는가)
- 뾰족하면 양수, 완만하면 음수
- 상관관계: df.corr()
- -1~1 사이의 값, 0에 가까울수록 상관관계 없음
데이터 조회
- 순서 기반: df.iloc[행 인덱스, 열 인덱스]
- 이름 기반: df.loc[행 값, 열 값]
- 유니크한 데이터값 확인: df[컬럼].unique()
- 컬럼 내 값의 개수 확인: df[컬럼].value_counts()
- 유니크한 값에 대해서 개수 확인, 내림차순 출력
- df[컬럼].value_counts().index[0]일 경우 최빈값의 인덱스
- df[컬럼].value_counts().idxmax()도 마찬가지
- df[컬럼].value_counts()[0]은 최빈값
삭제, 변경, 정렬
- 컬럼 삭제: df = df.drop(columns=['컬럼명'])
- df = df.drop(['컬럼명'], axis=1)도 동일
- 중복 제거: df = df.drop_duplicates(subset=['컬럼명'], keep='first')
- keep의 경우 어떤 값을 유지할지 결정 (first, last)
- 치환: df[컬럼] = df[컬럼].replace('원래 값', '변경 값')
- 함수 적용: df[컬럼] = df[컬럼].apply(함수)
- axis=1일 경우 row, axis=0일 경우 column
- 정렬: df = df.sort_values(by='컬럼명', ascending=True)
- ascending=True일 경우 오름차순, False일 경우 내림차순
결측치 처리
- 특정 컬럼 내 결측치 삭제: df = df.dropna(subset=['컬럼명'])
- 결측값 채우기: df[컬럼] = df[컬럼].fillna('값')
- 이후 값으로 채우기: df[column] = df[column].fillna(method='bfill')
- 이전 값으로 채우기: df[column] = df[column].fillna(method='pad')
인덱스 설정, 원복
- 인덱스 설정하기: df = df.set_index('값')
- 인덱스 원복하기: df = df.reset_index()
- 그룹함수, sort_values 등 인덱스의 값이 변화한 경우 기본 인덱스로 전환 가능
- drop=True일 경우 바꾸기 전 인덱스 값을 삭제함 (컬럼에 넣는 대신)
병합, 구간 나누기, 재구조화
- 병합: df = pd.merge(left=df1, right=df2, how='left', on='label')
- how(병합 방법) 옵션으로는 left, right, outer, inner, cross
- on(병합 기준)에는 컬럼 혹은 인덱스 이름 사용
- 구간 나누기: df[컬럼1] = pd.qcut(df[컬럼2], q=N, labels=[...])
- pd.cut은 절대평가, pd.qcut은 상대평가
- q는 숫자를 작성해도 되고, [0, .25, .5, .75, 1.]과 같이 비율로 작성할 수 있음
- label은 나눠진 구간의 레이블
- 재구조화: pd.melt
- id_vars 옵션은 identifier variable로 사용할 컬럼
- value_vars 옵션은 unpivot할 컬럼 (=통합할 컬럼)
- 예를 들어 컬럼명과 상관없이 전체(혹은 일부)에서 상위 N개 값을 찾는 문제에 적합
문자열 처리
- 문자열 자르기: df[컬럼1] = df[컬럼2].str[:n]
- 문자열 포함여부: df[컬럼].str.contains(‘값‘)
- True, False로 리턴 (개수 셀 때 sum 활용)
- 문자열 치환: df[컬럼].str.replace(‘이전 값‘, ‘대체할 값’)
- 문자열 길이: df[컬럼].str.len()
그룹함수
- 그룹합계: df = df.groupby(['컬럼1', '컬럼2']).sum()
- 그룹평균: df = df.groupby(['컬럼1', '컬럼2']).mean()
시계열 데이터
- 시계열 데이터로 전환: pd.to_datetime(df[컬럼])
- format=“%Y%m%D” 사용하면 연-월-일로 형식 지정됨
- pd.read_csv를 할 때 parse_dates를 사용해줘도 무방
- 연도 추출하기: df['year'] = df[컬럼].dt.year
- 월 추출하기: df['month'] = df[컬럼].dt.month
- 일 추출하기: df['day'] = df[컬럼].dt.day
- 요일 추출하기: df['dayofweek'] = df[컬럼].dt.dayofweek
- 소요시간 계산: df['duration'] = (df[컬럼1] - df[컬럼2]).dt.total_seconds()
- 해당값을 60으로 나눠주면 소요시간을 분으로 계산한 값
- 시계열 데이터 리샘플링: df.resample(rule)
- 빈도를 변환하기 위한 편리한 방식 = 원하는 주기로 나눠줌
- 예를 들어, 주단위 합계 계산을 위해서 df.resample('W').sum()과 같이 작성 가능
- rule은 Y, M, D, H, T(min), S 등을 조합해서 사용 가능하며, 3min과 같이 특정 값도 가능
- 원하는 기간만큼 쉬프트: df.shift(periods)
- periods는 이동할 기간
- freq가 None(기본값)일 경우 데이터가, 입력하면 인덱스가 이동 (Y, M, D, H, T, S 등)
- fill_value는 shift로 인해 생긴 결측치를 대체할 값
Numpy 함수
- 올림: np.ceil(df[컬럼])
- 내림: np.floor(df[컬럼])
- 버림: np.trunc(df[컬럼])
- 로그 변환: np.log1p(df[컬럼])
- exponential: np.exp(‘값‘)
- 절대값: np.abs('값')
- 최댓값: np.maximum(‘값1’, ‘값2’)
Scikit-learn 함수
데이터 전처리
- 표준화 (Z-score normalization)
- 평균 0, 분산 1
- from sklearn.preprocessing import StandardScaler
- df[컬럼] = StandardScaler().fit_transform(df[[컬럼]])
- 최소-최대 정규화
- from sklearn.preprocessing import MinMaxScaler
- df[컬럼] = MinMaxScaler().fit_transform(df[[컬럼]])
- 여-존슨 변환 / 박스-칵스 변환 (출제 가능성 낮음)
- from sklearn.preprocessing import power_transform
- df[컬럼] = power_transform(df[[컬럼]], method='yeo-johnson')
- df[컬럼] = power_transform(df[[컬럼]], method='box-cox')
Useful Tips
- 어떤 기능을 어떻게 사용할 수 있을지 도움받기
- dir: 어떤 기능이 있는지 확인
- help: 어떻게 사용할 수 있는지 확인 (e.g. 필요한 인자 등)