[파이썬] 데이터변형 | 이항변수화 , 이산화

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