본문 바로가기
AI/데이터 사이언스

[AI 부트캠프] DAY 22 - 파이썬 EDA 2

by HOHHOH 2023. 8. 17.

[오늘의 일지]

파이썬 온라인 녹화 강의 - Numpy와 Pandas 복습, Matplotlib과 Seaborn 수업 듣기

[상세 내용]

파이썬 EDA

Numpy, Pandas 복습

- 어제 배운 부분은 다시 생각하면서 복습했고 새롭게 나온 함수들만 정리해 봤습니다.

 

[AI 부트캠프] DAY 21 - 파이썬 EDA 1

[오늘의 일지] 파이썬 EDA 실시간 강의 - Numpy, Pandas [상세 내용] 파이썬 EDA EDA - 정의 : 우선 수업을 듣기에 앞서서 EDA란 단어를 몰라서 찾아봤습니다. EDA는 Exploratory Data Analysis의 약어로 탐색적 데

odds-endz.com

 

- Numpy의 집계함수 : 사실 이 부분은 판다스를 배울 때 나온 부분인데 넘파이에서 사용할 수 있는 함수이니 정리하겠습니다.

# .sum( ) : 모든 요소의 합
# .min( ) : 모든 요소 중 최소값
# .max( ) : 모든 요소 중 최대값
# .argmax( ) : 모든 요소 중 최대값의 인덱스
# .cumsum( ) : 모든 요소의 누적합

# a 배열 생성 & 출력
# 0부터 8미만까지 출력하고 (2,4) 크기로 재가공하고 제곱하여 출력 
a = np.arange(8).reshape(2, 4)**2
print(a)
>>>
[[ 0  1  4  9]
 [16 25 36 49]]
 
 # 모든 요소의 합
print(a.sum())
>>>140

# 모든 요소 중 최소값
print(a.min())
>>>0

# 모든 요소 중 최대값
print(a.max())
>>>49

# 모든 요소 중 최대값의 인덱스
print(a.argmax())
>>>7

# 모든 요소의 누적합 
# 14 = 0 + 1 + 4 + 9
print(a.cumsum())
>>>
[  0   1   5  14  30  55  91 140]

# 정렬 함수
a = np.random.rand(3, 2)
print(a)
>>>
[[0.8460771  0.20811466]
 [0.85729965 0.22188061]
 [0.47487175 0.56778263]]

# 그냥 정렬 (오름차순 정렬만 지원합니다)
np.sort(a, axis=0) # 차이 ?

# 만약에 내림차순을 하겠다?
# np.sort(mat2, axis=0)[::-1]
>>>
array([[0.47487175, 0.20811466],
       [0.8460771 , 0.22188061],
       [0.85729965, 0.56778263]])

# index를 정렬
np.argsort(a, axis=0)
>>>
array([[2, 0],
       [0, 1],
       [1, 2]])

 

- 집계함수를 사용할 때 axis 값을 을 매개변수로 입력하면 행과 열만 각각 따로 적용할 수 있다

#.sum( ), .min( ), .max( ), .cumsum( )과 같은 연산에 axis 값을 입력하면, 축을 기준으로도 연산 가능
# axis = 0 (열 기준)
# axis = 1 (행 기준)

# b 배열 생성 & 출력
b = np.arange(12).reshape(3, 4)
print(b)
>>>
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
 
 # axis = 0은 열 기준으로 연산
print(b.sum(axis=0))
>>>
[12 15 18 21]

# axis = 1은 행 기준으로 연산
print(b.sum(axis=1))
>>>
[ 6 22 38]

 

- Numpy 크기 변경

# .ravel : 1차원으로 변경
# .reshape : 지정한 차원으로 변경
# .T : 전치(Transpose) 변환

# a 배열 생성 & shape 출력
a = np.arange(12).reshape(3,4)
print(a)
print(a.shape)
>>>
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
(3, 4)

# .ravel : 모든 원소를 1차원으로 변경
print(a.ravel())
print(a.reshape(-1))
>>>
[ 0  1  2  3  4  5  6  7  8  9 10 11]
[ 0  1  2  3  4  5  6  7  8  9 10 11]

# .reshape : 지정한 차원으로 변경
# [3,4] => [2,6]로 변경
print(a.reshape(2,6))
>>>
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]]
 
 # .T : [3,4]의 전치(transpose)변환으로 [4,3] 출력
print(a.T)
print(a.T.shape)
>>>
[[ 0  4  8]
 [ 1  5  9]
 [ 2  6 10]
 [ 3  7 11]]
(4, 3)

 

- Numpy 데이터 합치기

# np.vstack() 와 np.hstack()를 통해 데이터를 합치기
# np.vstack(): axis=0(열) 기준으로 쌓음
# np.hstack(): axis=1(행) 기준으로 쌓음

# a 배열 생성 & 출력 
a = np.array([1, 2, 3, 4]).reshape(2, 2)
print(a)
>>>
[[1 2]
 [3 4]]
 
 # b 배열 생성 & 출력
b = np.array([5, 6, 7, 8]).reshape(2, 2)
print(b)
>>>
[[5 6]
 [7 8]]
 
 # [2,2] => [4,2]
# np.vstack(): axis=0(열) 기준으로 쌓음
print(np.vstack((a,b)))
>>>
[[1 2]
 [3 4]
 [5 6]
 [7 8]]
 
# [2,2] => [2,4]
# np.hstack(): axis=1(행) 기준으로 쌓음
print(np.hstack((a,b)))
>>>
[[1 2 5 6]
 [3 4 7 8]]

 

- Numpy 데이터 쪼개기

# np.hsplit( )을 통해 숫자1개가 들어갈 경우, X개로 등분
# np.hsplit( )을 통해 리스트로 넣을 경우, axis=1 기준 인덱스로 데이터를 분할
# a 배열 생성 & 출력 
a = np.arange(12).reshape(2, 6)
print(a)
>>>
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]]
 
 # [2,6] => [2,2] 데이터 3개로 등분
print(np.hsplit(a, 3))
>>>
[array([[0, 1],
       [6, 7]]), 
 array([[2, 3],
       [8, 9]]), 
 array([[ 4,  5],
       [10, 11]])]

# [2,6] => [:, :3], [:, 3:4], [:, 4:]로 분할
# a를 3번째 열 ~ 4번째 열 미만 기준으로 분할하여 3개의 array를 반환
print(a)
print(np.hsplit(a, (3,4)))
>>>
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]]
[array([[0, 1, 2],
       [6, 7, 8]]),
 array([[3],
       [9]]),
 array([[ 4,  5],
        [10, 11]])]

 

- 참고 자료(범용함수)

 

Universal functions (ufunc) — NumPy v1.18 Manual

Universal functions (ufunc) A universal function (or ufunc for short) is a function that operates on ndarrays in an element-by-element fashion, supporting array broadcasting, type casting, and several other standard features. That is, a ufunc is a “vecto

numpy.org

 

- Pandas 불리언 인덱싱 +. isin()

# .isin( ) : 각각의 요소가 데이터프레임 또는 시리즈에 존재하는지 파악하여 True/False 값 반환#
# 불리언 인덱싱 + .isin( ) : 데이터의 특정 범위만 추출

# 데이터 내용 확인
titanic.head(2)
>>>
	PassengerId	Survived	Pclass	Name	Sex	Age	SibSp	Parch	Ticket	Fare	Cabin	Embarked
0	1	0	3	Braund, Mr. Owen Harris	male	22.0	1	0	A/5 21171	7.2500	NaN	S
1	2	1	1	Cumings, Mrs. John Bradley (Florence Briggs Th...	female	38.0	1	0	PC 17599	71.2833	C85	C

# .isin 함수는 각각의 요소가 데이터프레임 또는 시리즈에 존재하는지 파악하여 True/False 값 반환
# Pclass 변수의 값이 1일 경우, True/False 값 반환
titanic["Pclass"].isin([1])
>>>
0      False
1       True
2      False
3       True
4      False
       ...  
886    False
887     True
888    False
889     True
890    False
Name: Pclass, Length: 891, dtype: bool

# .isna( ) : 결측 값은 True 반환, 그 외에는 False 반환
# .notna( ) : 결측 값은 False 반환, 그 외에는 True 반환

# 결측 값 파악을 위한 데이터 확인
passenger.head(7)
>>>

	Sex	Age
0	male	22.0
1	female	38.0
2	female	26.0
3	female	35.0
4	male	35.0
5	male	NaN
6	male	54.0

# .isna( ) : 결측 값은 True 반환, 그 외에는 False 반환
# .isna 함수는 데이터프레임 내에 결측 값을 확인하기 위해 사용
# 5번째 행 True 출력
passenger["Age"].isna()[0:7]
>>>
0    False
1    False
2    False
3    False
4    False
5     True
6    False
Name: Age, dtype: bool

# .notna( ) : 결측 값은 False 반환, 그 외에는 True 반환
# .notna 함수는 누락되지 않은 값을 찾기 위해 사용
# 5번째 행 False 출력
passenger["Age"].notna()[0:7]
>>>
0     True
1     True
2     True
3     True
4     True
5    False
6     True
Name: Age, dtype: bool

 

- Pandas 결측치 제거

# .dropna( ) == .dropna(axis=0) : 결측 값이 들어있는 행 전체 삭제
# .dropna(axis=1) : 결측 값이 들어있는 열 전체 삭제
# .notna( ) : 결측 값은 False 반환, 그 외에는 True 반환

 

- Pandas 행과 열 추가와 삭제

# 행과 열 추가
# 행 추가 : DataFrame.loc[‘새로운 행 이름‘] = 데이터 값
# 열 추가 : DataFrame 객체[‘추가하려는 열 이름‘] = 데이터 값

# 행과 열 삭제
# 행 삭제 : DataFrame.drop(index, axis = 0)
# 열 삭제 : DataFrame.drop(변수명, axis = 1)

 

Matplotlib과 Seaborn의 정리는 양이 많아서 내일 정리해 보도록 하겠습니다.

 

[마무리]

 EDA 파트를 배우기 시작하면서 처음으로 Maplotlib과 Seaborn이라는 라이브러리를 통해서 데이터를 시각화하는 과정을 배웠습니다. 이제는 진짜로 이 라이브러리들만 잘 활용한다면 데이터 사이언스라는 분야에서 여러 가지 일들을 수행할 수도 있는 능력을 키울 수 있겠다는 느낌을 받았습니다. 오늘은 비록 Numpy와 Pandas의 나머지 부분을 정리했지만 내일 정리할  Maplotlib과 Seaborn를 통해서 데이터의 시각화를 제대로 느낄 수 있을 것입니다.

반응형

댓글