IQR을 활용한 이상치 찾기
# pandas 활용
Q1 = df[col].quantile(.25)
Q3 = df[col].quantile(.75)
# numpy 활용
Q1 = np.percentile(df[col], 25)
Q3 = np.percentile(df[col], 75)
Q1 - IQR*1.5 보다 작거나
Q3 + IQR*1.5 보다 크면 이상치로 판단(포함x)
올림, 내림, 절사
- import numpy as np
- 올림: np.ceil()
- 내림: np.floor()
- 버림: np.trunc()
groupby와 map, transform
# city별 중앙값으로 대체
# 인덱스 안맞을 때 transform으로 해결하는 방법
medi_seri = df['f1'].groupby(df['city']).transform('median')
df['f1'].fillna(medi_seri)
# city별 중앙값으로 대체
# 인덱스 안맞을 때 map으로 해결하는 방법
medi_seri = df['f1'].groupby(df['city']).median()
df['f1'].fillna(df['city'].map(medi_seri))
왜도와 첨도, 로그변환
- 왜도: 분포의 비대칭 정도
- 첨도: 꼬리의 두꺼운 정도
# 왜도구하기
df(['']).skew()
# 첨도구하기
df(['']).kurt()
- 로그스케일링으로 변환하는 방법
df['SalePrice'] = np.log1p(df['SalePrice'])
넘파이에 log1p가 있다는 것을 기억할 것
파이썬의 조건식
파이썬에서 조건식 만들 때는 절대 and나 or 사용하지 말것
반환되는게 true/false값이 들어있는 series 형태로 반환되는거지 단일 불리언 값으로 반환되는게 아니기에 영문자 and, or 쓰면 에러가 난다
-> 무조건 괄호 묶고 &나 |나 ~ 쓰기!
한 칼럼의 결측치가 있는 행을 지우는 방법
# 내가 푼 방법
cond = df['f1'].isna()
df = df.drop(df[cond].index)
# 더 쉬운 방법 2개
df = df.dropna(subset=['f1'])
df = df[df['f1'].notna()] # notna는 isna의 반대함수로 널이 아닌 값들만 모으는 함수
groupby...
result = df.groupby(['city', 'f2'])['f1'].sum()
df에 대해서 그룹으로 먼저 묶고, f1칼럼의 값을 sum하는 아주 합리적인 흐름!!!
조건에 맞는 값을 변경할 때
제발 loc을 써라 loc[조건, '컬럼명']으로 쓰기도 하고 loc[행인덱스, 컬럼인덱스] 이런식으로 쓰기도 하고...
df[cond]['f4'] = 'INFJ'
# 위와 같이 하면 절대 안된다!! 임시객체를 수정하는거지 df는 수정이 안되는 것
# 값을 수정한다는 말이 나오면 무조건 무조건 loc을 떠올리자
# df.loc[조건, '컬럼명'] = 값
df.loc[cond, 'f4'] = 'INFJ'
누적합과 결측치 앞뒤 값으로 채우는 방법
누적합 구하는 함수: cumsum()
결측치를 뒤에 나오는 값으로 채울 때: df.fillna(method = 'bfill')
결측치를 이전값으로 채울 때: df.fillna(method = 'pad')
수치형변수 표준화
표준화하는 식이

이거니까 컬럼의 평균과 표준편차를 구해서 빼고 나눠서 z-score값을 구해도 된다. 하지만 sklearn의 preprocessing의 StandardScaler를 사용할 수도 있다는 점!
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
df['f5'] = scaler.fit_transform(df[['f5']])
sklearn의 함수들에 넣는 데이터는 항상 2차원이여야 하기에, 한줄짜리 series를 넣고싶어도 꼭 대괄호 두개를 써서 데이터프레임 형태로 써야한다.
그리고 fit만 하면 그 컬럼의 평균과 표준편차를 저장하기만 한다. 무조건 fit_transform을 통해 변환한 값을 반환해야한다.
MinMaxScaler
마찬가지 sklearn의 preprocessing 안에 있다. MinMaxScaler()이라는 스케일러를 사용하여 fit_transform() 하면 된다.
이렇게 구하는 방법 말고 두번째 방법으로는
# min-max scale 방법2
df['f5_2'] = df['f5'].transform(lambda x: ((x - x.min()) / (x.max() - x.min())))
위의 모듈이 생각나지 않는다면 방법2처럼 직접 minmax스케일링 식에 넣어도 된다. x에서 최소값 뺀거/최대값에서 최소값 뺀거
이게 민맥스 스케일링이다. 참고로 transform(함수)는 이 함수에 값을 넣은 결과값을 같은 길이로 반환하는 함수다.
분위수
quantile(0.05)
정렬
정렬은 sort_values(by='컬럼명')
상위n개 하위n개 뽑기
df['a'].nlargest(10)
df['a'].nsmallest(10)
이렇게 할 수도 있고
정렬된 상태라면
df['a'].head(10)
df['a'].tail(10)
이렇게 뽑기도 가능
건너뛴 문제
- 10번 Yeo-Johnson & Box-Cox
- 20번 데이터병합
- 21번 Binning Data
- 24번 Lagged Feature
- 28번
시계열데이터 년 월 일
df['Date'] = pd.to_datetime(df['Date'])
df['year'] = df['Date'].dt.year
df['month'] = df['Date'].dt.month
df['day'] = df['Date'].dt.day
일단 pd.to_datetime 함수를 이용해서 datetime형으로 변환해주면,
dt.year
dt.month
dt.day
이렇게 분리해낼 수 있다.
이건 함수아니니까 괄호하지마
그리고 to_datetime()으로 형변환할때 판다스꺼니까 pd 붙이는거 제발 절대 까먹지마라
df['date'] = pd.to_datetime(df['date'], format='%Y%m%d')
format 옵션도 기억해야하고
이 to_datetime() 함수는 str데이터에 대해서 적용되는거니까 string으로 형변환하고 해주고 쓰거나 정수형이면 format함수 쓰거나
시계열데이터 무슨요일?
dt.dayofweek
dt.weekday
월요일0~일요일6 으로 매핑
마찬가지 함수 아니니까 괄호하지마
시계열데이터 몇주차?
몇주찬지 알아보려면 앞에서 본 것 처럼
dt.week
를 쓸 수도 있다. 하지만 여러해의 데이터가 같이 있다면, 22년도 1주차와 23년도 1주차가 같은 week값을 가진다.
주별 통계값을 구하는 중인데 여러해의 데이터가 같이 있다면 groupby(['year', 'week']) 이런식으로 년도도 꼭 묶어주도록 하자.
두번째 방법으로,
인덱스가 시계열데이터인 경우 쓸 수 있는
df_w = df.resample('W').sum()
이 resample()이라는 함수도 있다.
만약 인덱스가 아니라 컬럼에 날짜데이터가 있다면, resample('W', on='Date') 이런식으로 on 옵션에 컬럼이름을 넣어주면 된다.
- 주 단위 W
- 2주 단위 2W
- 월 단위 M
중복제거
df = df.drop_duplicates(subset=['age'])
drop_duplicates(subset=) 외우자!
도저히 생각안날땐 코딩을 하자..
# age 컬럼 중복 제거
x = 0
idx = 1
for y in df.loc[1:,'age']:
if y == df.loc[x, 'age']:
df = df.drop(idx)
idx += 1
else:
idx += 1
for문에서 인덱스까지 같이 반환하는 함수 enumerate()마저 또 까먹어서 idx 변수 만들어서 함...
문자열 다루기
컬럼이 string 타입이 아닐 때 -> astype(str)
startswith()
endswith()
contains()
얘네로 문자열을 다루는데, 시리즈.startswith() 이렇게 쓰면 에러가 난다.
이 함수들은 시리즈가 아니라 오직 str에 대해서만 작동하기에
df['f1'].str.startswith()
이런식으로 꼭 .str을 붙여주어야 한다!
그리고 replace(): 앞 인수를 뒤의 인수로 바꾸기
df['menu'].str.replace(' ','')
이렇게 하면 공백이 사라지겠지
'빅데이터분석기사' 카테고리의 다른 글
| 기출풀이 (0) | 2026.06.18 |
|---|---|
| 작업형3 추가적으로 (0) | 2026.06.14 |
| 작업형2 문풀 (0) | 2026.06.14 |
| 빅분기 실기 작업형2 정리 (0) | 2026.05.17 |
| 1과목 - 빅데이터 분석 기획 (2) | 2026.03.16 |