파이썬에서 데이터프레임은 자체적으로 지원하지 않기 때문에, 데이터를 분석하는 분석가 입장에서는 판다스 객체를 따로 배워야한다. 판다스 객체를 핸들링하는 방법이 여러가지 있는데, 어떤 메소드들이 있고, R과 SQL에 익숙한 사용자들이 비교하기 쉽게 이해하는게 기억에 쉬울 것 같아 아래의 컨텐츠를 작성했다.



Pandas Series 객체

Pandas Series는 인덱싱된 1차원의 배열이다. 

리스트나 배열로 부터 만들 수 있다. 앞에 인덱싱이 있기 때문에, 데이터프레임처럼 생겼는데 사실은 1차원이다. 


1
2
3
4
5
6
7
8
9
10
import pandas as pd
data = pd.Series([1,5,4,3,2])
data

--출력결과--
0    1
1    5
2    4
3    3
4    2
dtype: int64
cs


pd.Series.values : 이 시리즈에서 인덱싱을 제외하고 value값만 찾고싶으면 pd.Series.values 함수를 사용한다.

pd.Series.index : 마찬가지로, 시리즈에서 인덱싱을 출력하고 싶으면 pd.Series.index을 이용한다.

Indexing and Slicing: NumPy 배열, 리스트처럼 인덱싱이 가능하다.




판다스 데이터프레임 조작을 위한 코드 정리 (SQL과 R과의 비교)


SELECT

Dataframe.column :시리즈로 출력

Dataframe['columns']

Dataframe[['columns']]: 출력하고자 하는 컬럼이 2개 이상일 때는, 2개 이상의 컬럼을 리스트로 묶어줘서 파라미터로 넣어주어야한다. 이는 데이터프레임 형식으로 출력된다.


select 문에서의 출력컬럼의 정의

예를 들어, SELECT Age, Multiple, Age * Multiple as Age_Multi FROM Demographic 이라는 SQL식이 있다고하자. 이런것과 마찬가지로 파이썬에서 바로 연산이 가능하다. 즉, 행별로 곱한 출력한 값이 나타난다

1
2
3
dataset['Age*Class'= dataset.Age * dataset.Pclass
 
 
cs




WHERE (equiv 조건)

df[df['찾는칼럼명']== 찾고자하는 변수]

2개 이상의 조건절

df[(df['찾는 칼럼명'] == 찾고자하는 변수) & or | (df['찾는 칼럼명'] == 찾고자하는 변수)) 


위의 조건절을 non-equivalent하게 찾고자한다면, ==대신에 ><등 의 부등식을 사용하면된다


pd.where(condition, other, inplace)

inplace: 매개변수를 True을 설정하면 호출된 데이터프레임 자체를 수정하고, 아무런 값도 반환하지 않는다.



loc을 이용한 데이터 조건활용

df.loc[데이터 조건절, '출력하고자하는 데이터 컬럼명']



GROUP BY

df.groupby('칼럼명', as_index=False)

as_index: 그룹으로 출력된 행들을 인덱스를 붙이고자할 때, as_index = False 인경우는, SQL style 처럼 그룹화된 결과를 출력하고자 할 때


GROUP BY value count

month_users.groupby(['serviceId']).size()


ORDER BY

df.sort_values(by='정렬할 칼럼명', ascending = True/False)



Pandas describe function


example

df.describe()

include = 'all' : 결과내 낼 수 있는 모든 변수들을 출력


Count(distinct): 

pd['column'].value_counts() : 카테고리 변수의 각 변수값이 몇 개가 있는지 확인할 수 있음


WHERE 

ex)

df[df.컬럼 == '벨류']


Delete

df.drop('삭제하고자하는 칼럼명, axis=1)

axis=0으로 지정하면 인덱스를 날리는거고, axis는 컬럼을 날리는 것






R과 비교

1. R: colnames(df)

Python: print(df.columns.values)


2. R: head(df)

Python: df.head(숫자)

숫자: head출력시, 앞에서부터 출력되는 행의 수


3. 데이터 구조 

데이터프레임의 구조, 데이터타입을 볼 때

R: str(df)

Python: df.info()


4. 데이터 요약 (통계량의 요약)

R: summary(df)

Python: df.describe(parameter)

1) include= All

2) include = ['O'] : 카테고리 변수에대한 빈도를 포함해서 보여줌


5. 히스토그램

R: hist(칼럼명, breaks=나눌 조각수)


Python


import seaborn as sns

graph = sns.FacetGrid(dataframe, col = '컬럼명') : 여러개의 플롯을 동시에 표현할 때 사용, col = 컬럼별 데이터를 서브셋하여 나눠서 플로팅할 경우

2) Map

graph.map(function, *'플롯할 데이터의 컬럼명', bins= '숫자)

3) add_legend()

graph.add_leggend(): 레전드 추가


참고로 '*' asterisk은 인자를 입력할 때, 임의의 숫자대로 입력이 가능한 상태이다. 예를 들어 def save_rank(*arg): print(args)에 인자를 save_rank('a','b','c')이렇게 넣으면 하나씩 맞춰서 출력한다. 이 기능을 unpacking이라고 한다. 리스트에 있는 값들을 하나씩, 두개씩, 또는 임의의 개수 대로 입력하고자할 때 사용한다.






Pandas 기타 함수

pd.cut() : 정렬된 데이터들을 X개의 구간으로 나누고자할 때 해당함수를 사용한다. 데이터가 연속형 데이터일 때, 사용하기 좋다. 순서일 때도 사용할수는 있기는 하다. 사용을 pd.cut(array-like data, bins=자르고자 하는 구간 수)


Pandas_series.mode(): 범주형 변수인 경우에 시리즈로 나타낸다음, '.mode()' 속성을 입력하면, 해당 리턴은 범주형 변수의 카테고리가 리턴이 된다.

반응형

'Data science' 카테고리의 다른 글

Reshape and Pivot table  (0) 2019.03.08
SVM (Support Vector machine)  (0) 2019.02.23
Decision Tree (의사결정나무)  (2) 2019.02.15
Category data handling  (0) 2019.02.14
kNN model (k-Nearest neighbor model)  (0) 2019.02.13





대부분 우리가 알고있는 데이터의 형태는 Label encoding이다. 예를 들어서, 나라이름과 같이 나라이름이 명시적으로 기록되어있는 경우가 Label encoding이다. 그러나 이는 분석 단계에서는 Label encoding은 String dtype으로 분석 단계에서 계산하기에는 어렵다. 계산가능한 타입으로 만들어야 분석에서 사용할 수 있기 때문이다.


결과변수가 array 형태를 원한다면 sklearn.preprocessing 을 이용한다.


카테고리의 개수만큼 만들지말고 ,N-1개 만큼 만드는것을 추천한다. 추후에 선형회귀 등을 돌릴 때 변수를 N개로 만들면, 

n개에 대한 식이 생겨서 다중공선성이 생깄다. 예를 들어 3변수를 만들면,  x1+x2+x3 = 1이라는 식이 있기에 공선성이 생길수밖에 없다.



Mapping


이 방식의 문제는 각 카테고리변수를 서열척도로 변경하여 각각 1,2,3,4에 매핑한다는 것이다. 그렇기에 1에 매핑된 범주형변수는 2에 매핑한 변수보다 1/2이 크기가 작다고 머신러닝이 계산할 수 있다. 그렇기에 원 -핫인코딩을 하는 것이 권장된다.

1
2
3
4
housing_cat = housing["ocean_proximity"]
housing_cat_encode, housing_categories = housing_cat.factorize()
housing_cat_encode # array([0, 0, 1, ..., 2, 0, 3])
housing_categories  # Index(['<1H OCEAN', 'NEAR OCEAN', 'INLAND', 'NEAR BAY', 'ISLAND'], dtype='object')
cs






Pandas 내부의 함수를 이용한 변환



컬럼수준에서 One-hot encoding을 원한다면, Pandas의 get_dummies 을 이용한다.


get_dummies(data)

data는 array, series, dataframe모두 가능하다.

return 값도 데이터 프레임의 형식을 갖는다.



Example)

1
2
3
4
5
6
7
8
# 성별(SEX)컬럼을 one hot encoding한다
one_hot = pd.get_dummies(df['sex'])
 
# 원래 있던 칼럼을 삭제한다.
df = df.drop('sex',axis = 1)
 
# 원래 잇던 테이블에 새로만든 one_hot 데이터프레임을 조인한다. (SQL 조인과 관계없이 순차적으로 column bind)하는 것
df = df.join(one_hot)

cs


여러개 컬럼을 동시에 one-hot encoding

1
2
3
4
onehot_df = pd.get_dummies(df, columns=['nation''genre','limited_age'], drop_first=True)
len(onehot_df.columns) # 컬럼의 개수가 늘어난 것을 알 수 있다.
 
 
cs


반응형

'Data science' 카테고리의 다른 글

Reshape and Pivot table  (0) 2019.03.08
SVM (Support Vector machine)  (0) 2019.02.23
Decision Tree (의사결정나무)  (2) 2019.02.15
Pandas Dataframe Manipulation  (0) 2019.02.14
kNN model (k-Nearest neighbor model)  (0) 2019.02.13

KNN

:비선형 기법. 지도학습기법. 

결정 분계선(Decision boundary)을 정의하기위해서, 이 결정분계선이 피쳐들의 선형결합이어야 한다는 가정을 필요로 하지 않는다.  또한, 인스턴스 기반 학습(instance-based learning, memory-based learning)이기 때문에, 모수가 없다(주석 참고). 그렇기 때문에, 이전에는 아무런 학습 작업이 없고, 모형에 대한 아무런 파라미터가 없어서 게으른 학습(Lazy learning)이라고도 불린다. 따로 모집단을 추론하지 않고, 필요도 없으니 비모수적(non-parameteric) 인 방법이며 분류와, 회귀(regression)을 위한 방법이다. 또한 레이블이 있는 상태에서 분류를 하기 때문에, 지도학습모델이다. 레이블이 있는 상태에서, 모델에대한 평가를 할 수 있다. 가령, 원래 클레스가 3개가 있다고 했을 때, 새로운 unseen data가 들어왔을 때, 이 새로운 데이터가 어느 그룹으로 결정될지 알 수 있기 때문에, 지도학습이다. 


어떤 도서에서는 기계학습의 정의는 '어떤 Task을 반복적으로 시행되었을 때, 퍼포먼스가 증가하는 학습 방식'이라고 정의해 놓는 책도있지만, KNN 은 이러한 점진적인 개선이 이루어지 않는 모델로 보인다. [알고리즘으로 배우는 인공지능, 머신러닝, 딥러닝 입문]



kNN은 새로운 데이터가 어느 그룹에 속하는지 분류하기 위해, 그 데이터에 가장 가까이에 있는 학습된 데이터가 속한 그룹을 알아보는 것이다. 즉, 거리계산을 통해서, 유사도를 평가해서 새로운 변수를 평가한다는 것이다. 즉, 변수가 유사한 것 끼리 묶는다는 것인데, 이 변수들을 Feature space라고 한다. K는  알고리즘이 얼마나 많은 이웃을 검사해야하는지를 정하는데, 만일 K가 7이었다면, 7개의 가까운 점을 검사하는 것이다. 또한 7개가 모두 똑같은 가중 값을 갖는다. 또한, k가 짝수이면 안된다. k가 짝수이면, 안되고 홀수여야한다. 짝수를 지양한다. 


Common Distance Metrics:



유클리드 거리(Euclidean distance): 연속형 분포일 때 사용. 



해밍 거리(Hamming distance): overlap metric. 겹치는 것들이 있는 변수들일 때 활용한다. 

e.g) SNS와 MMS는 거리가 2이며, Hole과 Hale은 거리가 1이다.


Discrete Metric (Boolean metric): X=Y이면, 거리가 0, 다르면 1 이런식이다.






 - kNN regression: 종속변수가 자료의 특성중에 하나 일 때, 종속변수는 k개의 근접한 이웃들의 값의 평균값

 - kNN classificaion: 종속변수(output)이 class일 경우에는 분류분석





(Source:http://2.bp.blogspot.com/-EK4tA2525EM/U-c6Q4jJuwI/AAAAAAAADjw/hdqRXuunpnQ/s1600/ knn.png)



kNN은 인스턴스 기반의 러닝 또는 메모리 기반 러닝이라고도 한다. 왜냐하면, 학습을 미리 하지 않고 미뤄두고 있다가 새로운 데이터의 테스크 요청이 오면 그때  분류를 시작하기 때문이다. 즉, 학습에 필요한 데이터를 메모리에 기억만 하고, 인스턴스가 발생할 때, 일반화하는 일을 시작한다. 이렇게 KNN 모델을 만드려면 3가지가 필요한데, 1) Feature space(training data), 2) Distance metrics, 3) Value of K이다. 이는 KNN모델을 만들 때, 파마리터가 되기도 할 것이다. Feature space는 변수들을 고정된 개수의 백더로 만드는 것이고, Distance metric은 거리를 측정하는 방식들을 의미하며, K는 몇개를 뽑을 것인지를 정해야한다는 것이다.


K에 따른 Bias, Variance

분류분석인 경우, K가 3이면 가장 가까운 3점을 한 원안에 담는다. 이 원안에 같은 클레스인것이 많은 클레스로 New instance(문제)를 분류한다. 그러므로, 모델에서 K를 어떤 수로 정하느냐가 모델의 퍼포먼스를 결정한다. K가 너무 작으면 bias가 작을 수 있지만, variance는 클 수 있다. 왜냐하면, k가 작다는 것은, 노이즈에 민감하단 얘기고, 그렇게되면 너무 민감하게 모델이 적용되서 오버피팅이 될 수 있다. 따라서, 모든 개별 개별 하나의 인스턴스를 고려하기떄문에 Bias는 작고 Variance는 크다. 반대로, K가 너무 크면, Bias는 클 수 있지만, Variance는 작을 수 있다. 인접주변의 인스턴스를 모두 포함하기 때문에, 다른 클레스도 다 같은 군으로 분류할 수 있다. 이는 Bias가 크고, Variancer가 작다.



Notes

정규화: 퓨쳐들의 사이에 계산을 해야할 떄, distance의 scale을 정규화하여 사용하여야 한다.(Normalization) 만약 키와 소득이 피쳐라면, 키는 빼봤자 숫자가 100이하로 차이나서 별로 차이가 안나겠지만, 소득은 100만 1000만단위이기 떄문에 차이가 많이난다. 


Charateristics

1. 비교적 적용이 간편한 편이지만, 모델을 계산하는게 리소스를 너무 많이 잡아 먹을 수 있다. 왜나하면, 군집할 떄 모든 거리를 측정해야하기 때문에 컴퓨팅 파워가 필요할 수 있다. 

2. 트레이닝을 포함하지 않아, 비교적 유연한 방식의 분류기법이다.

3. 노이즈에 의해서 정확도가 급격히 낮아질 수 있다.

4. 고차원의 데이터인 경우(=피쳐수가 많을 경우) 계산량이 많아지고, 거리를 측정하기가 어려워서 퍼포먼스가 점점 안좋아 질 수 있다.

5. 큰 데이터세트(인스턴스가 많은) 경우에 사용할 경우, 계산량 많이 발생할 수 있다. 많은 데이터포인트(인스턴스)와 계산해야되기 때문에... (1번이랑 유사)

6. 범주형 변수에서 잘 작동하지 않을 수 있다. 범주형 변수의 거리를 측정하는게 애매모호 하다


K-Means clustering vs K-NN 비교

K라는 값이 같이 들어가서, 머신러닝에서 주로 혼동되는 개념이다. 비교는 아래와 같다


K-means 

KNN 

비지도학습(Unsupervised learning) 

지도학습(Supervised learning) 

Clustering method

Classification, Regression 

K: 원하는 클러스터링의 집합(군집 집합의 갯수)

K: 새롭게 문제가 주어졌을 때, 근접한 인스턴스들의 갯수

(이를 이용해서 분류, 예측문제를 해결한다)



Model evaluation metric


분류문제의 평가는 보통 Confusion matrix을 통한 계산값들을 평가한다

 

True  positive

True Negative 

Predictive Positive

TP 

FP

Predictive Negative

FN

TN








*Instance based learning: 명시적으로 일반화 하는 알고리즘이 아니라, 새로운 문제(인스턴스)가 들어왔을 때까지 다른 인스턴스들을메모리에 저장해놓는다. 

** Bias: 머신러닝 모델이 모든정보를 고려하지 않아서, 잘못된 학습을 하는 것. Traing set을 맞추지 못하는 것을 바이어스라고 부른다. (High bias: 너무 모델이 심플 .underfitted to training set)
*** Variance: 머신러닝 모델이 Test set을 맞추지 못하는 것이 variance라고 부른다. (High variance: 너무 모델이 복잡. overfitted to training set )
Feature space: 실제 데이터를 vector형태로 같은 고정된 길이의 벡터로 변환하여 만든 데이터


반응형

'Data science' 카테고리의 다른 글

Reshape and Pivot table  (0) 2019.03.08
SVM (Support Vector machine)  (0) 2019.02.23
Decision Tree (의사결정나무)  (2) 2019.02.15
Pandas Dataframe Manipulation  (0) 2019.02.14
Category data handling  (0) 2019.02.14

+ Recent posts