데이터 분석/Python - pandas

[이론] 연속형과 비연속

toraa 2025. 1. 14. 13:18

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')

인덱스가 동일하기 때문에 연결시켜서 활용가능