데이터 탐색과 전처리를 위한 주요 파이썬 모듈

2019-05-23

Data_Preprocessing_Studynotes_(20190522)

study program : https://www.fastcampus.co.kr/data_camp_ppc

[학습기록]

1. 피쳐타입에 따른 적절한 모델선정 가이드라인

모든 데이터에 맞는다고 보장하는 자료는 아니지만 통상적으로 아래 그림과 같은 가이드라인을 적용하는 것이 바람직하다.

1

  • 회귀모형은 혼합형 변수를 사용할 경우 부적합하다

  • 의사결정나무가 데이터유형에 별 영향을 받지 않는 이유는 모든 데이터를 이진화하기 때문이다.

  • 나이브 베이즈 모델은 변수유형에 매우 민감하다. 반면에 신경망은 둔감하다.

  • 회귀모델과 knn은 변수 스케일에 영향을 많이 받기 때문에 혼합형 모델에 적합하지 않는다.

  • 나이브 베이즈 모형도 가능하면 모든 변수가 동일한 확률분포를 가정하는 것이 좋다.

  • 아래의 그림에서 시간복잡도가 곧 피쳐수, 클래스 복잡도를 의미한다.

2

2. 혼합형 피처들에 적절하지 않는 ‘회귀모델’

  • 혼합형 피쳐들의 경우에는 대부분의 경우 피쳐간의 스케일차이가 크게 발생한다. 그래서 피쳐의 스케일에 따라 가중치 w값이 크게 달라지며 이에 따라 예측 안정성이 크게 떨어진다. 다시말해서 가중치 w의 범위가 너무 커진다.

  • 다항회귀 모델은 변수 간 연산결과를 사용하므로 혼합형 피처에 대해서 더더욱 부적절하다고 할 수 있다. 다만 정수형 피쳐와 연속형 피쳐는 같이 사용해도 괜찮다.

3. 혼합형 피처들에 적절하지 않는 ‘나이브베이즈 모델’

  • 예를들어서 베르누이 분포는 연속형 값을 가지는 확률분포 추정에 아예 사용할 수 없으며, 가우시안 분포는 이산형 값을 가지는 확률분포 추정에 적합하지 않은 분포다.

  • 또한 나이브베이즈는 조건부 확률을 추정할때 하나의 확률분포만 가정한다. 따라서 피쳐가 혼합되어 있는 경우에는 나이브 베이즈가 우수한 성능을 보이기 어렵다.

4. 혼합형 피처들에 적절하지 않는 ‘k-NN’

  • 단일 유사도 척도(거리척도)를 사용해서 이웃을 정의하기 때문에 스케일차이가 서로 큰 혼합형 변수에 적절하지 않다.

5. list VS ndarray

  • list는 서로 다른 데이터 타입의 요소를 담을 수 있지만 반면에 ndarray는 서로다른 데이터타입의 요소를 담을수는 없다.

  • list보다 ndarray가 연산시 속도가 훨씬 빠르다.

  • 그냥 리스트랑 정수 비교 연산은 불가하지만 np.array는 정수랑 비교연산이 가능하다.

6. array 사본생성 및 재구조화

  • array 슬라이스는 array data의 copy된 형태가 아니라 view를 반환함

ex)

x = np.array([0,1,2,3,4,5,6,7,8,9])
print("x : ", x, '\n')

x_sub = x[:2]
# 배열사본 생성
print('x_sub : ', x_sub, '\n')

x_sub[0] = 20
print('x_sub : ', x_sub, '\n')

print("x : ", x)
# 사본(x_sub)의 0번째 요소를 20으로 바꾸면 원본(x)도 바뀐다.
x :  [0 1 2 3 4 5 6 7 8 9] 

x_sub :  [0 1] 

x_sub :  [20  1] 

x :  [20  1  2  3  4  5  6  7  8  9]
  • 그래서 사용자가 copy된 형태를 쓸 수 있도록 나온것이 copy() 메서드이다.
x = np.array([0,1,2,3,4,5,6,7,8,9])
print("x : ", x, '\n')

x_copy = x.copy()
print('x_copy : ', x_copy, '\n')

x_copy[0] = 20
print('x_copy : ', x_copy, '\n')

print("x : ", x)
x :  [0 1 2 3 4 5 6 7 8 9] 

x_copy :  [0 1 2 3 4 5 6 7 8 9] 

x_copy :  [20  1  2  3  4  5  6  7  8  9] 

x :  [0 1 2 3 4 5 6 7 8 9]
  • 배열의 재구조화 (.reshape)는 주로 이미지 데이터를 가공할때 주로 쓴다.

7. Universal function

  • numpy 배열의 값에 반복된 연산을 빠르게 수행하는 것을 주목적으로 하는 함수다.

  • 빠른 element-wise 연산(브로드캐스팅 같은 연산)을 가능하게 한다.

  • 루프 대신에 universal function을 쓰면 약 400배 정도 더 빠른 연산을 할 수 있다.

  • 배열산술연산

ex)

x = np.arange(4)
print(x)

y = np.linspace(1,10,4)
print(y)

print(x + 5)
print(x + y)
[0 1 2 3]
[ 1.  4.  7. 10.]
[5 6 7 8]
[ 1.  5.  9. 13.]
  • 위의 배열산술연산이 이루어지는 방식과 유사하게 절댓값 및 지수로그 연산도 가능하다.

8. Bool logic

머신러닝에서는 특정조건을 만족하는 행이나 열을 가져올 수 있다.

bool logic 예시)

M = np.array([1,2,3,4,5,6])

M[M > 3]
array([4, 5, 6])

9. 결합 인덱싱

ex)

x = np.array([[0,1,2,3],
              [4,5,6,7],
              [8,9,10,11]])

print(x[2,[2,0,1]],'\n')

print(x[1:,[2,0,1]],'\n')
[10  8  9] 

[[ 6  4  5]
 [10  8  9]]

10. np.argsort

  • Numpy 정렬 알고리즘의 가장 유용한 기능 중 하나는 axis 인수 를 사용해 다차원 배열의 특정 행이나 열에 따라 정렬할 수 있다.

  • argsort는 주로 순위 계산할때 많이 쓴다. 또는 heapq, nlargest 함수도 쓸 수 있다.

  • 예를 들어서 이상치인지 아닌지, 어떤 특정한 특징인지

x = np.array([3,1,2])

np.argsort(x)

array([1, 2, 0], dtype=int64)

11. loc와 iloc

  • loc 인덱서 : ‘명시적인 인덱스’를 참조하는 인덱싱과 슬라이싱을 가능하게 함

  • iloc 인덱서 : ‘암묵적인 인덱스’를 참조하는 인덱시오가 슬라이싱을 가능하게 함

  • 아래 코드에서 data[1]은 ‘b’를 나타내는 것인가 아니면 ‘a’를 나타내는 것인가. 정답은 ‘a’이다. 명시적인 인덱스를 우선적용하기 때문이다. 이런 혼동을 막고자 나온 개념이 loc와 iloc이다.

data = pd.Series(['a','b','c'], index = [1,3,5])
print('data : ', '\n',data , '\n')

print(data.iloc[1], '\n')

print(data.iloc[1:3], '\n')

print(data.loc[3], '\n')

print(data.loc[3:5], '\n')
data :  
 1    a
3    b
5    c
dtype: object 

b 

3    b
5    c
dtype: object 

b 

3    b
5    c
dtype: object 

12. 집계함수(dataframe.describe())

기초통계량 활용방안

통상적으로 이를이용해서 데이터의 치우침을 많이 확인한다.

100개가 있으면 75개까지는 1이다.

  • 전부 양수이고 표준편차가 평균보다 크다면 최소한 일반적인 정규분포가 아니다. 이는 일부 데이터 치우침이 있거나 각각의 데이터 스케일 차이가 엄청나게 난다는 것이다.

=> 결론적으로 스케일링이 필요한 경우다.

13. Groupby

보통 조건부 통계량을 구할때 쓸 수 있다.(ex) 성별에 따른 평균키)

  • ex) 성별에 따른 키의 평균을 구한다고 할때

성별 = 조건(분할기준칼럼)

적용기준 칼럼 = 키

평균 = 집계함수, 통계량

14. 기타 참고사항

pd.DataFrame(,engine=’python’)은 한글 인코딩 관련 이슈를 해결할때 쓴다.