[WEEK_05] 학습일지05. Python EDA

ardor924·2023년 8월 16일
0
post-thumbnail

해당 게시글은 패스트캠퍼스에서 진행하는 AI 부트캠프에서 학습한내용과 교육과정을 토대로 작성했습니다.

AI 부트캠프 5주차 학습일지

학습내용 리마인드

이번 5주차는 이제 파이썬 기초지식에 numpy , pandas, pyplot, seaborn등을 사용하여
데이터를 처리하고 활용하는 단계에 대한 지식을 학습하는 기간이었다.
이번 주차에 학습한 내용중 생각을 정리할 용도로 학습내용을 정리하려고 한다.

00. EDA 항시사용 모듈

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

EDA 학습하면서 이 4가지 모듈들은 언제나 쓰이니 외워두도록하자.

01. Numpy

1.1 Array creation

Numpy 에서는 array를 사용하여 각종 다양한 연산을 할수 있다.
array는 일반적인 리스트와는 조금 차이가 있으며 기존 파이썬 리스트에서 지원하지 않는 많은 기능을 사용할수 있어서 기존 리스트보다 numpy에 최적화 되어있다고 볼수있다.
array를 만드는 방법은

  1. 파이썬 list를 numpy array로 변환 하는 방법
  2. numpy함수로 array생성하는 방법

이 두가지가 있다.

아래는 첫번째 방법인 파이썬 list를 numpy array로 변환 하는 방법의 예시이다.

data1 = [1,2,3,4]
arr1 = np.array(data1)

다음으로 두번째 방법인 numpy함수로 array생성하는 방법이다.
여러가지 array생성 함수가 있지만 자주쓰는 몇개만 사용해보자.

  1. np.arrange(시작값,마지막값,size=(행,열))
  2. np.random.randint(low,hight,size=(,))
  3. np.random.randn(,)
  4. np.zeros(만들갯수)
  5. np.ones(만들갯수)
  6. np.empty(만들갯수)

개인적으로는 이렇게 5개를 많이 사용하는편이다.

예시 :

1번 
arr_type_1 = np.arrange(1,100).reshape(`11`,`9`)
2번
arr_type_2 = np.random.randint(0,100,size=(11,9))
3번
arr_type_3 = np.random.randn(3,5)
4번
arr_type_4 = np.zeros(3)

결과 :

1번 
array([[ 1,  2,  3,  4,  5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14, 15, 16, 17, 18],
       [19, 20, 21, 22, 23, 24, 25, 26, 27],
       [28, 29, 30, 31, 32, 33, 34, 35, 36],
       [37, 38, 39, 40, 41, 42, 43, 44, 45],
       [46, 47, 48, 49, 50, 51, 52, 53, 54],
       [55, 56, 57, 58, 59, 60, 61, 62, 63],
       [64, 65, 66, 67, 68, 69, 70, 71, 72],
       [73, 74, 75, 76, 77, 78, 79, 80, 81],
       [82, 83, 84, 85, 86, 87, 88, 89, 90],
       [91, 92, 93, 94, 95, 96, 97, 98, 99]])
2번
array([[79,  2, 14, 84, 38,  9, 79, 41, 46],
       [89, 19, 19, 23, 40, 95, 41, 84, 62],
       [70, 20, 55, 90, 24, 43, 58, 64, 30],
       [27, 50,  7, 32,  2, 69, 38, 84, 24],
       [36, 66, 53, 94, 31, 49,  7, 77, 18],
       [67, 30, 78, 23, 14, 26, 16, 17, 65],
       [54, 31, 25, 20, 69, 48, 92, 98, 30],
       [12, 83, 66, 53, 16, 35, 91, 18, 47],
       [70, 88, 35, 78, 90, 28, 27, 85, 51],
       [50, 46, 13, 43, 90, 74, 79, 43, 13],
       [55, 31, 23, 82, 47, 52, 31, 55, 16]])
3번
array([[-0.83207233,  0.54343997,  0.74756898, -0.68328491,  0.83766301],
       [ 1.2259849 ,  1.74039882,  1.00232282,  1.43266058, -0.87109985],
       [ 1.20109666,  0.75971307,  0.00900885,  0.40954166, -1.44702385]])44번
array([0., 0., 0.])

참고로 pseudo random 이라는것이 있는데 풀이하자면 유사랜덤 정도의 의미가 되겠다.
이 pseudo random은 특정 seed를 고정해서 사용하면 랜덤이라고 하더라도 고정된 랜덤값을 사용할수 있다.

사용예시 :

# 시드 고정 
np.random.seed(11)
# 랜덤 어레이 생성
arr_randomn = np.random.randn(3,5)

입력 :

	arr_randomn

결과 :

array([[-1.27147013, -0.36504469,  0.39154076, -0.318382  ,  0.4417959 ],
       [-0.55436174,  1.5023821 , -0.08958725,  0.12593849, -0.47256745],
       [ 0.92555968, -0.13389511,  0.0114951 , -0.77089861,  1.97127672]])

결과는 임의의 값 11로 시드를 고정해놓았기 때문에 몇번을 출력해도 매번 같은값을 출력할수 있다.

1.2 Universal Function

한마디로 array 연산을 가능하게 한다.
예를 들어 파이썬의 일반 리스트끼리의 연산을 수행한경우라면
예시:

L1 = [1,1,1,1]
L2 = [9,9,9,9]
result = L1+L2
result 

결과 :

[1, 1, 1, 1, 9, 9, 9, 9]

이처럼 기존 파이썬의 리스트의 경우 연산시 리스트가합쳐져서 출력된다.
numpy에서 array연산을 한다면
예시:

v1 = np.array([1,1,1,1])
v2 = np.array([9,9,9,9])
result = v1+v2
result

결과 :

array([10, 10, 10, 10])

이처럼 array끼리 연산이 가능하다

추가로 1차원과 2차원간에 연산도 가능하다
예시:

L1 = [1,1,1,1]

L2 = [
        [9,9,9,9],
        [19,19,19,19]
     ]

result = L1+L2
result

결과 :

array([[10, 10, 10, 10],
       [20, 20, 20, 20]])

참고로 열의 갯수가 안맞는등 형태가 다른경우 연산시 에러가 생긴다.
예시:

FL1 = [1,1,1,1]
FL2 = [
        [9,9,9,9],
        [19,19,19]
      ]


FV1 = np.array(FL1)
FV2 = np.array(FL2)


result = FV1+FV2
result

결과 :

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
      2 FL2 = [
      3         [9,9,9,9],
      4         [19,19,19]
      5       ]
      8 FV1 = np.array(FL1)
----> 9 FV2 = np.array(FL2)
     12 result = FV1+FV2
     13 result

ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (2,) + inhomogeneous part.

1.3 Fancy Indexing

numpy의 array를 기존의 파일썬 indexing보다 확장한 형태로 지원한다
형식 : 배열[행,열]

다음은 기본 파이썬의 인덱싱과의 차이이다.

기본인덱싱
예제 : 다음 배열의 3행의 3열에 있는 값을 구하시오

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

입력 :

arr2[2][2]

결과 :

4

Fancy Indexing
예시 :

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

입력 :

arr2[2,2]

결과 :

4

슬라이싱도 확장된 형태로 지원 가능하다.

예제 : 다음 배열의 1행 부터 3행까지의 5열에 있는 값을 모두 구하시오

예시 :

arr2  = np.array([
                    [1,2,3,4,5],
                    [6,7,8,9,10],
                    [11,12,13,14,15],
                    [16,17,18,19,20],
                    [21,22,23,24,25],
                    [26,27,28,29,30]
                ])

입력 :

arr2[0:3,4]

결과 :

array([ 5, 10, 15])

또한 numpy에서 mask를 사용해 필터링을 할수도 있다.

예제 : 1행~4행의 숫자중 3열에 있는 12 이하의 짝수를 구하라

예시 :

arr2  = np.array([
                    [1,2,3,4,5],
                    [6,7,8,9,10],
                    [11,12,13,14,15],
                    [16,17,18,19,20],
                    [21,22,23,24,25],
                    [26,27,28,29,30]
                ])

입력 :

arr1_4 = arr2[0:4,:]

mask = (arr1_4[:,2] <= 12)  & (arr1_4[:,2] % 2 == 0)

arr1_4[mask,2] 

결과 :

array([8])

1.4 Numpy 함수

기본적으로 수학함수와 집계함수를 사용할수 있고

수학함수에는

#절대값
np.abs(arr)
#제곱	
np.square(arr)
#제곱근	
np.sqrt(arr)

집계함수에는

#합계
np.sum(arr,axis=0)
#표준편차
np.std(arr,axis=0)
#평균
np.mean(arr,axis=0)
#4분위 최소값
np.min(arr,axis=0)
#4분위 최대값
np.max(arr,axis=0)
#정렬
np.sort(arr,axis=0)

집계함수의 인덱스 출력에는

np.argmin()
np.argmax()
np.argsort()

를 주로 사용한다.

02. Pandas

판다스는 1차원과 2차원 배열을 사용할수 있다.

1차원의 경우 Series, 2차원의경우 DataFrame을 사용한다.

먼저 1차원인 Series를 사용해보자.

입력 :

s = pd.Series([1,2,3,4,5])
s

출력 :

0    1
1    2
2    3
3    4
4    5
dtype: int64

다음은 2차원인 DataFrame의 예시이다.

입력 :

df = pd.DataFrame([
                    [1,2,3,4,5],
                    [6,7,8,9,10],
                    [11,12,13,14,15],
                    [26,27,28,29,20],
                    [21,22,23,24,25],
                    [26,27,28,29,30],
                    [31,32,33,34,35],
                    [36,37,38,39,40]
                  ])

df

출력 :


	0	1	2	3	4
0	1	2	3	4	5
1	6	7	8	9	10
2	11	12	13	14	15
3	26	27	28	29	20
4	21	22	23	24	25
5	26	27	28	29	30
6	31	32	33	34	35
7	36	37	38	39	40

차이점이라면
Series는 1차원 배열로 행만 존재하며,
DataFrame은 2차원 배열로 행과 열을 출력할수 있다.

2.1 데이터 프레임 생성

데이터 프레임은 생성해놓은 리스트를 그대로 사용하는 방법과
새로운 데이터 프레임을 생성하는 방법이 있다.

다음은 데이터 프레임 생성 예제이다.

예제 : 전체 행의 갯수가 5행이고, 컬럼값 "A" "B" "C" "D" 의 4열짜리 데이터프레임을 만들라

입력 :

df = pd.DataFrame(
                    data=np.arange(1,21).reshape(5,4),
                    columns=["A", "B" ,"C" ,"D"]
                 )
df

출력 :


	A	B	C	D
0	1	2	3	4
1	5	6	7	8
2	9	10	11	12
3	13	14	15	16
4	17	18	19	20

위와 같이 데이터 프레임을 생성할수있고
옵션으로 컬럼과 인덱스를 변경할수도 있다.
컬럼값과 인덱스값을 직접 입력하는것 외에도 규칙을 만들어 연속적인 컬럼/인덱스 값을 생성하는것도 가능하다.

다음은 연속적으로 인덱스값을 넣어서 데이터 프레임을 생성한 예제이다.

예제 : 8개의 행을 가진 인덱스가 2016.03.01 부터 2017.12.31 까지의 3개월 학기단위이며, 컬럼값이 "A" ,"B" ,"C", "D", "E", "F" 로 6개있는 데이터 프레임을 만들어라

입력 :

df = pd.DataFrame(
                    data=np.random.randint(0,41,size=(8,6)),
                    index=pd.date_range(start='2016.06.30', periods=8,freq='6BM'),
                    columns=["A", "B", "C" ,"D" ,"E", "F"]                    
                 )
df

출력 :

# 학기별 성적 분포(더미)
			A	B	C	D	E	F
2016-06-30	4	25	3	19	23	39
2016-12-30	28	14	23	8	25	26
2017-06-30	8	39	38	4	7	0
2017-12-29	11	6	19	5	24	0
2018-06-29	34	9	14	38	4	9
2018-12-31	23	35	3	8	19	1
2019-06-28	0	16	31	29	28	7
2019-12-31	23	10	35	0	7	23
profile
오늘도 꾸준히 무언가를 개발하는중...

0개의 댓글

관련 채용 정보