2020. 4. 17. 14:32ㆍ노트/Python : 프로그래밍
이항변수화(바이너라이저)
- 이항변수화: 연속형변수 기준이하 -> 0 , 기준초과 -> 1
확률변수 X가 이항분포를 따른다고 했을 때, 0또는 1값을 갖는 이항변수화가 필요함.
- 베르누이 시행: 성공(1), 실패(0) 두가지 경우만 존재
성공확률이 p인 베르누이 시행을 n번 수행 했을 때,
성공하는 횟수를 x라고 하면, 확률변수 x는 모수 n과 p인 이항분포를 따른다.
예시
주사위 : 3 3이 나올 확률(성공) : 1/6 실패 : 5/6 A,B,C,D A만성공, B만성공, C만성공, D만 성공 A만성공: 1/6*5/6*5/6*5/6 =0.09 B만성공: 1/6*5/6*5/6*5/6 =0.09 C만성공: 1/6*5/6*5/6*5/6 =0.09 D만성공: 1/6*5/6*5/6*5/6 =0.09 0.09*4 = 0.36 성공확률(p)*시나리오수(n)
|
코드
# 이항변수화 함수 (Binarizer)
from sklearn.preprocessing import Binarizer
import numpy as np
data = np.array([[10,-10,2],
[5,0,6],
[0,7,4]])
data
bina=Binarizer(5).fit(data) # 5 이하=0, 5 초과 =1
bina.transform(data)
# 이항변수화 함수 (Binarize)
from sklearn.preprocessing import binarize
binarize(data, threshold=5, copy = False)
#copy = True (default)
#copy = false : 원본데이터로 binarize, 원본 변경
바이너라이저 : 연속형 변수를 이항변수화
원핫 인코더 : 범주형 변수를 이항변수화
연령대: 20대 -> 0 , 30대 -> 1 , 40대 -> 2 성별: 남 -> 0, 여-> 1 학점: A:0, B:1, C:2, D:3, F:4 20대 여 B => 100 01 01000 30대 남 D => 010 10 00010 학점 01234 10000(A) 01000(B) ... 00001(F) |
원핫인코딩 참고
2020/04/04 - [스킬/Python : 프로그래밍] - [파이썬] 데이터 변형 | 원핫인코딩
이산화 (디짓타이즈)
np.digitize함수, np.where함수: 연속형 변수 -> 이산화
이항변수화(바이너라이저) : 0 또는 1 값을 갖는 변수를 만드는 것
이산(형)화 : 연속형 변수를 2개 이상의 범주를 갖는 변수로 변환
ex) 점수: 75 ->A/B/C/D/F(범주=category)
예시데이터
import pandas as pd
df = pd.DataFrame({'C1': np.random.randn(20),
'C2':['a','a','a','a','a','a','a','a','a','a'
,'b','b','b','b','b','b','b','b','b','b']})
df
C1 C2
0 -1.743372 a
1 0.266070 a
2 2.384967 a
3 1.123691 a
4 1.672622 a
5 0.099149 a
6 1.397996 a
7 -0.271248 a
8 0.613204 a
9 -0.267317 a
10 -0.549309 b
11 0.132708 b
12 -0.476142 b
13 1.308473 b
14 0.195013 b
15 0.400210 b
16 -0.337632 b
17 1.256472 b
18 -0.731970 b
19 0.660232 b
df.C1.max()
>>> 2.384967330711097
df.C1.min()
>>> -1.7433722958989073
#10개 구간으로 균등하게 나눔
bins=np.linspace(df.C1.min(), df.C1.max(),10)
bins
>>>
array([-1.7433723 , -1.28466789, -0.82596349, -0.36725909, 0.09144532,
0.55014972, 1.00885412, 1.46755852, 1.92626293, 2.38496733])
df['C1_bin']=np.digitize(df['C1'],bins)
df
>>>
C1 C2 C1_bin
0 -1.743372 a 1
1 0.266070 a 5
2 2.384967 a 10
3 1.123691 a 7
4 1.672622 a 8
5 0.099149 a 5
6 1.397996 a 7
7 -0.271248 a 4
8 0.613204 a 6
9 -0.267317 a 4
10 -0.549309 b 3
11 0.132708 b 5
12 -0.476142 b 3
13 1.308473 b 7
14 0.195013 b 5
15 0.400210 b 5
16 -0.337632 b 4
17 1.256472 b 7
18 -0.731970 b 3
19 0.660232 b 6
이산화 하면 다음과 같이 그룹화하여 활용할 수 있음
df.groupby('C1_bin')['C1'].size()
>>>
C1_bin
1 1
3 3
4 3
5 5
6 2
7 4
8 1
10 1
Name: C1, dtype: int64
df.groupby('C1_bin')['C1'].mean()
>>>
C1_bin
1 -1.743372
3 -0.585807
4 -0.292066
5 0.218630
6 0.636718
7 1.271658
8 1.672622
10 2.384967
Name: C1, dtype: float64
df.groupby('C1_bin')['C2'].value_counts()
>>>
C1_bin C2
1 a 1
3 b 3
4 a 2
b 1
5 b 3
a 2
6 a 1
b 1
7 a 2
b 2
8 a 1
10 a 1
Name: C2, dtype: int64
연속성 데이터 개별화
#실수 데이터 -> 카테고리화
- cut(실수 값의 경계지정),
- qcut(똑같은 구간으로 나눔)
ages = [0,2,10,21,23,37,31,61,20,42,32,100]
bins = [1,15,25,35,60,99]
labels=["미성년자","청년","중년","장년","노년"]
cuts=pd.cut(ages,bins,labels=labels)
cuts
>>>
[NaN, 미성년자, 미성년자, 청년, 청년, ..., 노년, 청년, 장년, 중년, NaN]
Length: 12
Categories (5, object): [미성년자 < 청년 < 중년 < 장년 < 노년]
cuts.categories
>>>Index(['미성년자', '청년', '중년', '장년', '노년'], dtype='object')
cuts.codes
>>>array([-1, 0, 0, 1, 1, 3, 2, 4, 1, 3, 2, -1], dtype=int8)
qcut=pd.qcut(ages,4,labels=["Q1","Q2","Q3","Q4"])
qcut
>>>
[Q1, Q1, Q1, Q2, Q2, ..., Q4, Q2, Q4, Q3, Q4]
Length: 12
Categories (4, object): [Q1 < Q2 < Q3 < Q4]
pd.value_counts(qcut)
>>>
Q4 3
Q3 3
Q2 3
Q1 3
dtype: int64
참고
파이썬 라이브러리를 활용한 데이터 분석(2판) p284 ~ p287
'노트 > Python : 프로그래밍' 카테고리의 다른 글
[텐서플로우] 다중 선형 회귀를 이용한 당뇨병 분류기 파이썬 코드 (0) | 2020.04.18 |
---|---|
[케라스] 암 분류기 , 당뇨병 분류기 파이썬 코드 (0) | 2020.04.18 |
[케라스] Keras 모델 생성 기본 구조 (0) | 2020.04.17 |
[텐서플로우] 다중회귀분석 (Multi-variable Linear Regression) 파이썬 코드 (0) | 2020.04.17 |
[텐서플로우] 로지스틱 회귀(Logistic Regression) 분류 파이썬 코드 (0) | 2020.04.16 |