본문 바로가기
DATA | IT/빅데이터분석기사

[공부] 빅데이터분석기사 실기 1유형 | 파이썬 Python 코드 정리

by KKAMPU 2024. 11. 25.

python 환경 기준

 

1) 라이브러리 호출 및 데이터셋 불러오기

import pandas as pd  # 판다스와 넘파이 라이브러리 호출
import numpy as np
df = pd.read_csv('주소.csv') # df라는 이름으로 데이터셋 불러오기
df.head() # 생략 가능 과정. 데이터의 대략적인 모습을 확인하기 위함.

 

2) 실행해야할 문제 조건 뜯어보기

 

'데이터에서 IQR을 활용해 Fare 컬럼의 이상치를 찾고, 이상치 데이터의 여성 수를 구하시오.' 라는 문제가 나왔다면

# IQR을 활용해 Fare 컬럼의 이상치 찾기

# 이상치 데이터의 여성 수 구하기

총 두가지의 값을 도출해야한다

 

3) 간단한 EDA 코드

df.shape # 데이터프레임의 (행, 열) 갯수를 알려줌
df.isnull().sum() # 각 컬럼별로 결측치 갯수를 알려줌
df.info() # 각 컬럼별 행의 수, 결측치 수, 데이터 타입을 알 수 있음
df.head() # 데이터프레임의 상단 5행을 보여줌 괄호 안에 숫자를 넣으면 숫자만큼의 행을 보여줌

 

4) 조건별 코드

 

* 판다스 기본 통계 함수 정리

# 최대값
df.max()

# 최소값
df.min()

# 평균값
df.mean()

# 중앙값
df.median()

# 최빈값
df.mode()

# 합계
df.sum()

# 데이터 수
df.count() --- 결측값은 제외됨

* 분위수
df.quantile(숫자)

* 분산
df.var()

* 표준편차
df.std()

* 왜도
df.skew()

* 첨도
df.kurt()

* 누적합
df.cumsum()

* 누적곱
df.sumprod()

* 누적 최대값
df.summax()

* 누적 최소값
df.cummin()

* 평균의 표준오차
df.sem()

* 평균의 절대편차
df.mad()

* 절대값
df.abs()

* 곱
df.prod()

 

 

* IQR 구하기 ---  np.percentile

# Q1, Q3값 구하기
Q1 = np.percentile(df['컬럼명'], 25) # 몇 퍼센트에 해당하는 값인지 써주기
Q3 = np.percentile(df['컬럼명'], 75)
# Q2 = np.percentile(df['컬럼명'], 50) 그러나 중앙값과 같으므로 df['컬럼명'].median() 으로 작성 가능

# IQR 구하기
IQR = Q3 - Q1

# IQR을 활용하여 이상치 판별하기
out1 = df[df['컬럼명'] < (Q1 - 1.5*IQR)] # df['컬럼명'] < (Q1 - 1.5*IQR) 조건에 해당하는 df만 필터링됨
out2 = df[df['컬럼명'] < (Q3 + 1.5*IQR)] # df['컬럼명'] < (Q3 + 1.5*IQR) 조건에 해당하는 df만 필터링됨

# 이상치 데이터에서 'kkampu'에 해당하는 수 구하기
print(sum(out1['컬럼명'] == 'kkampu') + sum(out2['컬럼명'] == 'kkampu'))

 

* 소수점의 올림, 내림, 버림 --- np.ceil, np.floor, np.trunc

# 올림
ceil = np.ceil(df['컬럼명'])

# 내림
floor = np.floor(df['컬럼명'])

# 버림
trunc = np.trunc(df['컬럼명'])

 

* 결측치 확인, 제거 --- df.isnull(), df.dropna

# 결측치 확인
df.isnull() --- true/false 형태로 결과 나옴

# 각 컬럼별 결측치 비율을 알고 싶다면
df.isnull().sum() / df.shape[0] --- isnull에 참인 값의 함 / 전체 row 수 = 비율 확인 가능

# 결측치를 어떠한 특정 값으로 대체하고자 할 때
df['컬럼명'].fillna(결측치 대체 값)

# 결측치를 제거하려고 할 때
df = df.dropna(subset= ['컬럼명'])

 

* 결측치 채우기 --- df.fillna

# 결측치를 바로 뒤에 나오는 값으로 채워주고 싶다면
df.fillna(method='bfill')

# 결측치를 바로 앞에 나오는 값으로 채워주고 싶다면
df.fillna(method='pad')

# 결측치를 최빈값으로 채워주고 싶다면
df['컬럼명'] = df['컬럼명'].fillna(df['컬럼명'].mode()[0])

 

* 왜도, 첨도 --- df.skew(), df.kurt()

# 왜도와 첨도 계산
df['컬럼명'].skew()
df['컬럼명'].kurt()

# 왜도 != 0 인 경우, 지나치케 값이 쏠려있으면 스케일링 필요성 있음
# 로그변환
np.log1p(df['컬럼명'])

 

* 절대값과 표준편차 --- abs, df.std()

# 특정 컬럼의 표준편차 구하기
a = df['컬럼명'].std()
b = df['컬럼명'].std()

# 두 표준편차의 차 구하기
# 어떤 값이 더 큰지 고려하는 과정을 상쇄하기위해 절대값으로 구해준다
# 이때 변수로 지정해준 a 와 b 값은 각각 값으로 계산되었기때문에 np 사용
np.abs(a - b)

 

* 표준화(Z-score) --- StandardScaler, scaler.fit_transform(df)

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
df['컬럼명'] = scaler.fit_transform(df[['컬럼명']])

 

* 여-존슨, 박스-콕스 변환 --- power_transform

from sklearn.preprocessing import power_transform

# 여-존슨 값 구하기
y = power_transfrom(df[['컬럼명']])

# 박스-콕스 값 구하기
b = power_transform(df[['컬럼명']], method='box-cox')

 

* min-max 스케일링 --- MinMaxScaler, scaler.fit_transform()

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
df['컬럼명'] = scaler.fit_transform(df[['컬럼명']])

 

* 상,하위 값 구하기 --- df.quantile(), df.head(), df.tail()

# ex) 상위 5% 값
df['컬럼명'].quantile(0.95)

# ex) 하위 5% 값
df['컬럼명'].quantile(0.05)

# ex) 상위 10개의 값
df.sort_valeus(by='컬럼명', ascending=False) --- 내림차순으로 정렬됨
df.head(10)

# ex) 하위 10개의 값
df.tail(10)

 

* 상관관계 구하기 --- df.corr()

df.corr()

 

* 원하는 행의 값 찾기 --- df.iloc[ ], df.loc[ ]

# 행번호 1번째부터 5번째 행까지를 찾고싶을때
df.iloc[1:6]

# 행번호 5번 행을 찾고싶을때
df.iloc[5]

# "kkampu"라는 행의 값들을 찾고싶을때
df.loc["kkampu"]

 

* 그룹화 멀티 인덱스 --- groupby()

# city 컬럼을 기준으로 집계하고싶을때
df.groupby('city').max() --- city 기준으로 집계했을때 최대값
df.groupby('city')['population'].sum() --- city별 총 인구수 집계

 

* 날짜 형식으로 바꾸기 --- pd.to_datetime()

df['날짜'] = pd.to_datetime(df['날짜'])

 

* 시계열 데이터 다루기

# 년도 추출
df['날짜'].dt.year

# 월 추출
df['날짜'].dt,month

# 일 추출
df['날짜'].dt.day

# 요일 넘버 추출
df['날짜'].dt.dayofweek --- 숫자로 표현됨. 월0 화1 수2 목3 금4 토5 일6
# 만약 주말과 평일을 구분해야한다면
weekend = df['날짜'].dt.dayofweek >= 5
weekday = df['날짜'].dt.dayofweek < 5
# 위의 조건문을 사용하여 df[weekend], df[weekday]로 데이터 프레임을 나눌 수 있음

# 주별 집계값을 계산하고싶다면
df.resample('W').sum() --- 주별 총 인구수 or 주별 총 수익 등을 집계할 수 있음
# 주 단위 : W / 2주 단위 : 2W / 월 단위 : M

 

* 함수 만들어서 적용하기

# 예를 들어 a 컬럼의 값이 1이면 a_1, 1이 아니면 a_2로 만들어주고싶다면
def filtered(x) :
  if df['a'] == 1 :
    df['a'] = 'a_1'
  else :
    df['a'] = 'a_2'
  return x
# 다음과 같은 함수식을 작성해주고
df = df.apply(lambda x : filtered(x), axis=1)
# 람다 표현식을 사용하여 일괄 적용해줄 수 있음

 

* 데이터 병합 --- pd.merge, pd.concat

pd.merge(a, b, how='left', on='key') --- how = 'left', 'right', 'outer'

pd.concat([a, b], axis=0) --- 아래로 (디폴트)
pd.concat([a, b], axis=1) --- 옆으로

 

* 비닝 --- pd.qcut

# 구간 분할 (SQL의 NTILE과 같음)
df['range'] = pd.qcut(df['컬럼명'], q=3, labels=['group1', 'group2', 'group3']
# range라는 새로운 컬럼에 3개로 비닝을 하는데, 각각 labels의 이름으로 라벨링됨

 

* 중복 제거 --- drop_duplicates

df.drop_duplicates(subset=['컬럼명'])
# 기본적으로 중복 데이터 발생 시 뒤에 나오는 데이터를 삭제함

 

* 이전값

# SQL LAG 함수와 유사
df['컬럼명'].shift(1) --- 한 행 이전의 값을 출력

 

* 문자열 다루기

* 값 변경하기 --- df.replace

# a라는 값을 b로 대체하기
df['컬럼명'] = df['컬럼명'].replace('a', 'b')

# 공백을 없앨 수 있음
df['컬럼명'].replace(' ', '')

# 문자열에 포함된 단어를 찾을 수 있음
df['컬럼명'].str.contains("단어")