[이론] 연속형과 비연속
pandas 심화 이론
1. 연속형과 비연속형
2. 문자열과 날짜형
3. 반복적 기능 적용
1. 연속형 변수의 이산, 범주
cut(): 값을 이산 간격으로 분류(등간격)
qcut(): 분위수 기반 이산화(등비율)
import pandas as pd
df_hc = pd.read_csv('data/국민건강보험공단_건강검진정보(샘플).csv', index_col=0)
df_hc
머신러닝 모델은 입력이 숫자만 들어감 (문자를 숫자로 바꿔서 학습시킴)
문자열 타입을 숫로 바꿔야할 때도 있음
df_hc.dtypes
성별 object
연령대코드(5세단위) int64
신장(5cm단위) int64
수축기혈압 float64
이완기혈압 float64
체중(5kg단위) int64
허리둘레 float64
식전혈당(공복혈당) float64
총콜레스테롤 float64
혈색소 float64
흡연상태 object
음주여부 object
지역명 object
dtype: object
cut() 을 활용한 연속형 데이터를 등간격으로 구간화
특정 데이터를 간격으로 구간을 형성
cut(x,bins,labels)
x : 간격을 진행할 배열
bins : 간격을 의미
labels : 각 간격에 들어갈 라벨 입력
# 등간격으로 구간화하기
arr = df_hc['수축기혈압'].to_numpy()
df_hc['수축기혈압_구분'] = pd.cut(arr, bins=3, labels = ['저','중','고'])
df_hc['수축기혈압_구분']
가입자일련번호
1692 저
3762511 저
668704 중
1225411 저
4342771 저
..
2563013 중
2044421 중
2629445 중
2376225 중
974076 저
Name: 수축기혈압_구분, Length: 100000, dtype: category
Categories (3, object): ['저' < '중' < '고']
to_numpy() 함수로 배열로 바꿔준 후, 배열값을 cut함수 x인자에 넣어줌
등구간의 불균형이 생길 수 있는 문제점이 발생할 수 있음
df_hc['수축기혈압_구분'].value_counts()
수축기혈압_구분
저 58155
중 41096
고 198
Name: count, dtype: int64
value_counts() : 고유항목의 개수를 출력
qcut()을 활용한 연속형 데이터의 등비율 구간화
데이터 분포의 비율을 고려할거면 qcut()함수를 사용해야함
rr = df_hc['수축기혈압'].to_numpy()
df_hc['수축기혈압_구분'] = pd.qcut(arr, q=3, labels=['저','중','고'])
df_hc['수축기혈압_구분'].value_counts()
수축기혈압_구분
저 34856
고 33033
중 31560
Name: count, dtype: int64
▷ 결과가 category타입으로 나옴 (문자열처럼 사용된다 생각하기)
▷ 관측치 불균형 문제가 없음
특정 구간을 지정해서 자르기 : 명확한 값을 지정해서 구간화
cg = [0, 90, 140, 1000]
labels = ['저혈압', '정상', '고혈압']
df_hc['수축기혈압_구분'] = pd.cut(df_hc['수축기혈압'], bins=cg, labels = labels)
df_hc['수축기혈압_구분'].value_counts()
수축기혈압_구분
정상 88900
고혈압 9804
저혈압 745
Name: count, dtype: int64
2. 비연속형 데이터의 반환
factorize(): 비연속 데이터를 수치화(순서 인코딩)
get_dummies(): 비연속 데이터를 더미 변수로 생성
factorize() 을 활용한 비연속형 데이터를 순서값으로 인코딩
import pandas as pd
df_hc = pd.read_csv('data/국민건강보험공단_건강검진정보(샘플).csv', index_col=0)
df_hc
factorize()는 (인코딩값, 인덱스목록)의 튜플을 반환
enc, index = pd.factorize(df_hc['흡연상태'])
print(enc)
print(index)
[0 1 1 ... 0 1 1]
Index(['금연', '비흡연', '흡연'], dtype='object')
factorize() : 기본적으로 인코딩해주는 함수
결과가 (인코딩값, 인코딩 순서에 관한 정보)가 반
df_hc['흡연상태'] = pd.factorize(df_hc['흡연상태'])[0]
df_hc['흡연상태']
가입자일련번호
1692 0
3762511 1
668704 1
1225411 1
4342771 1
..
2563013 1
2044421 1
2629445 0
2376225 1
974076 1
Name: 흡연상태, Length: 100000, dtype: int64
get_dummies() : 비연속형 데이터 bool 값으로 인코딩 (원-핫 인코딩 유사)
: 관측치가 가지고 있는 범주는 True 나머지 범주는 False 표기
df_hc = pd.read_csv('data/국민건강보험공단_건강검진정보(샘플).csv', index_col=0)
dum = pd.get_dummies(df_hc['흡연상태'])
dum
0또는 1로 표기
dum = pd.get_dummies(df_hc['흡연상태'], dtype='int')
dum
▷ one-hot 인코딩 : 관측치가 가지고 있는 범주는 1 나머지 범주는 0 표기
concat또는 merge(join)로 결합
pd.concat([df_hc,dum], axis = 1)
df_hc.join(dum, how='left')
인덱스가 동일하기 때문에 연결시켜서 활용가능