Search

분류문제

분석 전 필수 라이브러리

numpy : 연산 빠르게 하기 좋은 라이브러리(데이터가 클수록 필수)
pandas : 데이터 분석하기 좋은 라이브러리
seaborn : 시각화 라이브러리(좀 더 다양)
matplotlib.pyplot : 시각화 라이브러리

그외 하면 좋은 옵션들

warnings
warnings.filterwarnings(’ignore’)
pd.set_option.display.max_columns = None : 모든 컬럼 수 보이기
pd.set_option.display.max_seq_items = 충분히 큰 수 : 열의 이름 자르지 말고 다 보이기
pd.set_option.display.max_rows = 값 : 보이는 레코드 수 지정
import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') pd.options.display.max_columns = None # 열 다 보이기 pd.options.display.max_seq_items = 8000 # 열의 이름 자르지 말고 다 보이기 pd.optionㄴ.display.max_rows = 8000 # 행 모두 보이기
Python
복사

데이터 받고 기본적인 것들 살펴보기

1. 데이터 로드하기

# 데이터 불러오기 # 1. train / test 데이터 따로 존재할 때 train = pd.read_csv('데이터가 있는 파일 위치') # train 데이터 test = pd.read_csv('데이터가 있는 파일 위치') # test 데이터
Python
복사
한글이 포함된 파일의 경우 : encoding = ‘utf-8’ 또는 ‘cp9494’
pd.read_csv('데이터 파일 위치', encoding = 'cp9494' 또는 'utf-8')
Python
복사

만약, 대용량 데이터(100만개 이상..)를 로드해야 할 경우

노트북을 가지고 분석해야 한다면 당연히 샘플링을 해서 분석해야 한다.
→ 그렇게 안하면 컴퓨터 무리..
다음과 같은 방식을 사용한다.
skiprows : 데이터를 건너뛰면서 추출하는 방식이다.
→ 추출방식은 lambda 함수를 사용해서 사용자 지정할 수 있음
 헤더를 건너뛰고, 전체 데이터의 1% 만 추출
df = pd.read_csv('데이터 파일 위치', skiprows = lamb0da x : x > 0 and np.random.rand() > 0.01)
Python
복사
주의해야 할 점은 샘플링이다보니 중요한 데이터가 날라갈 수 있다는 점이다.

2. 데이터 살펴보기

df.shape # 데이터의 행과 열의 수 확인 df.head() # 데이터의 앞 5 데이터 확인 df.tail() # 데이터의 뒤 5 데이터 확인 df.info() # 데이터 요약 정보 확인
Python
복사
df.info() : 데이터의 형태, 각 변수의 데이터 수나 타입, 결측치 개수 등을 확인할 수 있다.
결측치 확인하기 (None, NaN)
df.isnull().sum() : 열별로 결측치 개수 확인
 통상적인 결측치 가이드 라인
10% 미만 : 삭제 또는 대치
10 ~ 20% : 핫덱 또는 대치
20 ~ 50% : 대치
50% 이상 : 해당 칼럼 제거
결측치를 그냥 제거하는 경우는 거의 없다..고 보면 됨
 대치법 종류
최빈값(mode)
중앙값(median)
평균(mean)
위의 방식에서 주의할 점은 전체 데이터 셋의 통계값에 영향을 끼칠 수 있으므로 변동을 인위적으로 줄여줘야 한다는 점이다 → (그럼 어떻게..? )
예측 대치
결측치들이 무작위로 발생하지 않는다고 가정한다. 따라서 예측 모델을 사용(회귀 분석, SVM, 그 외 모델)해서 대치한다.
일반적인 대치법 사용하기
1) df.fillna(특정값) : 특정값으로 채워넣기
-1) df.fillna(method = ‘pad’) : 결측치 바로 이전의 값으로 채워넣기
-2) df.fillna(method = ‘bfill’) : 결측치 바로 뒤의 값으로 채워넣기
2) df.replace(to_replace = 바꾸기 전의 값, value = 바꾸기 후 값)
: 꼭 결측치로 되어 있지 않아도 바꾸기 가능 → 유연하게 사용 가능
3) df.interpolate(method = ‘linear’, limit_direction = ‘forward’)
: 선형 방법으로 채워넣기
df.interplolate(method = ‘polynomial’, order = 2)
: 다항 방법으로 채워넣기
분포 확인해보기 : describe()
수치형 변수 분포 통계치 확인하기 : 개수, 평균, 표준편차, 최솟값, 제1사분위수, 중앙값, 제3사분위수, 최댓값
train_data.describe()
Python
복사
범주형 또는 문자형 데이터 통계치 확인하기 : 개수, 종류, 최빈값, 최빈값 개수
train_data.describe(include = ['o']) # 'o' means object
Python
복사
범주형 데이터(또는 문자형 데이터)

3. 데이터 전처리

1.
학습 데이터를 가지고 전처리를 진행하는데, 이때 학습데이터의 레이블 변수는 따로 빼둔다.
train_label = train_data['예측 레이블 변수']
Python
복사
2.
전처리를 진행할 시에 학습 + 테스트 데이터 모두 적용시켜야 하기 때문에 두 데이터 셋을 합쳐준다.
pd.concat([학습 데이터, 테스트 데이터]) : 변수가 같은 상황에서 데이터를 위아래로 합쳐준다.
reset_index(drop=True) : 원본 인덱스를 제거해주고 새로운 인덱스를 부여해준다.
→ drop(columns=[’예측 레이블 변수’], inplace=True) : 예측 레이블만 제거
all_data = pd.concat([train_data,test_data]).reset_index(drop=True) data = all_data.drop(['예측 레이블 변수'], inplace=False)
Python
복사
3-1. 변수 형태 변형해주기
 문자형으로 되어 있는 변수에서 분석에 용이하게 새로운 변수를 만들어 낼 때
Series.str.split(’구분 지을 문자’, expand=True)
nan → 0, -inf → 최솟값 , +inf → 최댓값으로 변경해주는 함수
np.nan_to_num()
수치형 변수 → 범주형 변수로 만들어주기 (범위 지정해주기)
data['새 범주형 변수 이름'] = '' data.loc[data['기존 수치형 변수'].between(첫번째 시작 범위,첫번째 끝 범위,'left'),'새 범주형 변수 이름'] = '첫번째 범주 이름' data.loc[data['기존 수치형 변수'].between(두번째 시작 범위,두번째 끝 범위,'both'),'새 범주형 변수 이름'] = '두번째 범주 이름' data.loc[data['기존 수치형 변수'].between(세번째 시작 범위,세번째 끝 범위,'right'),'새 범주형 변수 이름'] = '세번째 범주 이름' data.loc[data['기존 수치형 변수'].between(네번째 시작 범위,네번째 끝 범위,'right'),'새 범주형 변수 이름'] = '네번째 범주 이름' data.loc[data['기존 수치형 변수'].between(다섯번째 시작 범위,다섯번째 끝 범위,'right'),'새 범주형 변수 이름'] = '다섯번째 범주 이름' # 분석에 용이하게 카테고리형으로 변환 data['새 범주형 변수 이름'] = data['새 범주형 변수 이름'].astype('category')
Python
복사
모델 훈련에 용이하게 불린 → 정수로 변형
3-2. 결측치 처리하기
범주형 변수의 결측치 처리하기
최빈값(mode) 으로 대치하기
data['범주형 변수'] = data['범주형 변수'].fillna(data['범주형 변수'].mode()[0])
Python
복사
수치형 변수의 결측치 처리하기
중앙값(median) 으로 대치하기 : 주로 왜도가 있을 경우 사용
data['수치형 변수'] = data['수치형 변수'].fillna(data['수치형 변수'].median())
Python
복사