Data Science/Study 자료

멀티캠퍼스 2주차 -2

낭만장도리 2024. 1. 4. 09:01

복습 

가상환경 

             virtualenv                                               conda                                  pipenv

생성      virtualenv venv             conda create~  -n myenv python = 버전

 

접속    mac/window (PowerShell, Git Bash) / conda actuvate myenv

           source venv/ Scripts/activate

 

필요한 라이브러리 설치 

pip install 라이브러리명 /                             conda install 라이브러리 

 

해제   deactivate                                         conda deactivate  

 

MAC의 경우 환경변수 파일을 열어서 수동으로 세팅

Vi편집기를 통해서 세팅 

터미널  - vi~/.zshrc

 

vi main.py

 

i : insert 

:wq(저장)

 

 

 

Numpy

  • 선형대수, 행렬 수치연산과 관련된 라이브러리
  • 통계 포커싱두고 공부 > 응용,해석을 위주로 공부를 해야함 (원리x)
In [ ]:
import numpy as np # 넘파이 라이브러리 불러오기

print(np.__version__)
1.26.2
In [ ]:
num1 = [1, 2, 3, 4]
num2 = [3, 4, 5, 6]

#넘파이의 배열로 만들어준다
In [ ]:
arr1 = np.array(num1)
arr2 = np.array(num2)
arr1
Out[ ]:
array([1, 2, 3, 4])
In [ ]:
arr2
Out[ ]:
array([3, 4, 5, 6])
In [ ]:
arr1 + arr2
Out[ ]:
array([ 4,  6,  8, 10])
In [ ]:
#핵심은 np.array 같은 변환 명령어
In [ ]:
data1 = [0,1,2,3,4,5]
a1 = np.array(data1)
a1
Out[ ]:
array([0, 1, 2, 3, 4, 5])
In [ ]:
a1.dtype #넘파이는 비트 타입으로 int가 표기됨 (메모리 관리)
Out[ ]:
dtype('int64')
In [ ]:
np.array([0.5,2,0.01,8]).dtype
Out[ ]:
dtype('float64')

Numpy 배열 생성

  • 1차원, 2차원, 3차원..배열생성
In [ ]:
np.arange(0,10,2)
Out[ ]:
array([0, 2, 4, 6, 8])
In [ ]:
np.arange(1,10) #반복문 for range와 비슷
Out[ ]:
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
In [ ]:
np.arange(10) #1차원배열
Out[ ]:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [ ]:
np.arange(12).reshape(4,3)
Out[ ]:
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])
In [ ]:
np.arange(12).reshape(4, 1, 3)
Out[ ]:
array([[[ 0,  1,  2]],

       [[ 3,  4,  5]],

       [[ 6,  7,  8]],

       [[ 9, 10, 11]]])
In [ ]:
np.arange(12).reshape(2, 2, 3)
Out[ ]:
array([[[ 0,  1,  2],
        [ 3,  4,  5]],

       [[ 6,  7,  8],
        [ 9, 10, 11]]])
In [ ]:
b1 = np.arange(12).reshape(2, 2, 3)
b1.shape  #차원확인,튜플형태
Out[ ]:
(2, 2, 3)
In [ ]:
b2 = np.arange(5)
b2.shape #1차원 확인
Out[ ]:
(5,)
In [ ]:
#범위의 시작과 끝을 정하고 배열 생성
np.linspace(0,10,5) #(처음인덱스, 끝인덱스, 원하는원소갯수)
Out[ ]:
array([ 0. ,  2.5,  5. ,  7.5, 10. ])
In [ ]:
np.linspace(0, np.pi, 20)
Out[ ]:
array([0.        , 0.16534698, 0.33069396, 0.49604095, 0.66138793,
       0.82673491, 0.99208189, 1.15742887, 1.32277585, 1.48812284,
       1.65346982, 1.8188168 , 1.98416378, 2.14951076, 2.31485774,
       2.48020473, 2.64555171, 2.81089869, 2.97624567, 3.14159265])
In [ ]:
np.zeros(10)
Out[ ]:
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
In [ ]:
np.zeros((2,2))
Out[ ]:
array([[0., 0.],
       [0., 0.]])
In [ ]:
np.ones(10)
Out[ ]:
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
In [ ]:
np.ones((2,2))
Out[ ]:
array([[1., 1.],
       [1., 1.]])

NumPy 기초 문법 배우는 이유

  • 문과생 : 데이터분석가, 기초문법 있구나 ! 끝
  • 이공계 : 수치연산, 배열, 수식을 활용해서 문제 풀이
    • 클래스, 딥러닝클래스, Numpy를 활용해서 딥러닝 알고리즘을 적용해서 클래스 & 라이브러리
    • 밑바닥부터 시작하는 딥러닝3
In [ ]:
# 단위행렬
arr_I = np.eye(3)
arr_I
Out[ ]:
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])
In [ ]:
arr_I.shape
Out[ ]:
(3, 3)
In [ ]:
np.array(['1.5','0.62']) # U4 유니코드, 데이터 형변환
Out[ ]:
array(['1.5', '0.62'], dtype='<U4')

데이터 형변환

In [ ]:
# astype() #판다스에도 사용
arr = np.array(['1.5','0.62']) #문자로 들어갔을때
num_arr = arr.astype(float)  #한꺼번에 처리할때 유용
num_arr.dtype
Out[ ]:
dtype('float64')
In [ ]:
np.array(['1.5','0.62'],dtype = float) #처음에 넣을때 이렇게 넣어주면 좋음
Out[ ]:
array([1.5 , 0.62])
In [ ]:
num_f1 = np.array([10,21,0.549,4.75,5.98])
num_f1 = num_f1.astype(int)
num_f1
Out[ ]:
array([10, 21,  0,  4,  5])
In [ ]:
num_f1 = np.array([10,21,0.549,4.75,5.98])
num_f1 = num_f1.astype(float)
num_f1
Out[ ]:
array([10.   , 21.   ,  0.549,  4.75 ,  5.98 ])
In [ ]:
# p .224
#난수 = 무작위로 숫자를 추출

np.random.rand(2,3)#()배열의 크기 #0~1사이의 실수 난수를 갖음
Out[ ]:
array([[0.32115698, 0.93642616, 0.07870425],
       [0.85189278, 0.15882247, 0.33017485]])
In [ ]:
np.random.randint(2,10) #범위를 줌
Out[ ]:
3
In [ ]:
np.random.randint(1,100, 10)
Out[ ]:
array([24, 90, 24, 38, 14, 39, 83, 48, 43, 94])

로또번호 뽑기

In [ ]:
def lotto(n):  # n개를 받아드릴 함수
    numbers = []  # 로또 번호를 담아줄 빈 리스트 생성

    while len(numbers) < n:  # 횟수 n번을 반복해 줄 반복문
        num = np.random.randint(1, 45) # 랜덤한 숫자 뽑기
        if num not in numbers:  # 중복되는 숫자가 있는지 체크
            numbers.append(num) #없다면 리스트에 추가

    return numbers #반복구문을 완료한 리스트를 리턴
In [ ]:
print(lotto(7))
[1, 25, 30, 41, 21, 8, 34]
In [ ]:
#황유진
# 로또 번호 추첨기 만들어보기

# 조건1: 보너스숫자와 로또 메인 번호는 겹치지 않아야
# 조건2: 로또번호 내에서도 겹치는 숫자 없어야
# 조건3: 로또 번호(보너스 제외)는 오름차순으로 정렬되어야

lotto = np.random.randint(1, 46, size=(6, ))
bonus = np.random.randint(1, 46)
lotto = np.sort(lotto)   # 조건3

# way1
if bonus not in lotto:
    if np.unique(lotto).size == len(lotto):   # 2, 3, 3, 6, 10, 22 고유값 2, 3, 6, 10, 22
        print(f'이번 주 로또 당첨번호는 {lotto} + 보너스번호 {bonus}')

# way2
if bonus not in lotto:
    if np.unique(lotto).size == len(lotto):
        print(f'이번 주 로또 당첨번호는', end=' ')
        for i in range(6):
            print(lotto[i], end=' ')
            if i == 5:
                print(f'+ 보너스번호 ', bonus)
이번 주 로또 당첨번호는 [ 7 16 25 40 43 45] + 보너스번호 22
이번 주 로또 당첨번호는 7 16 25 40 43 45 + 보너스번호  22
In [ ]:
#임예원(GPT)
def generate_lotto_numbers():
    # 1부터 45까지의 숫자 중에서 6개를 무작위로 선택
    lotto_numbers = np.random.choice(range(1, 46), size=6, replace=False)

    # 선택된 숫자들을 정렬
    lotto_numbers.sort()

    return lotto_numbers

if __name__ == "__main__":
    # 로또 번호 생성 및 출력
    lotto_result = generate_lotto_numbers()
    print("로또 번호: ", lotto_result)
로또 번호:  [ 7 11 13 14 32 44]

배열의 연산

  • p.225
In [ ]:
arr1 = np.array([10, 20, 30, 40])
arr2 = np.array([1, 2, 3, 4])

print(arr1 + arr2)
print(arr1 - arr2)
print(arr1 * arr2)
print(arr1 / arr2)
[11 22 33 44]
[ 9 18 27 36]
[ 10  40  90 160]
[10. 10. 10. 10.]

비교연산

In [ ]:
arr1 > 20
Out[ ]:
array([False, False,  True,  True])

통계연산

  • NumPy, 합, 편균, 표준편차, 분산, 최솟값, 최댓값, 누적합, 누적 곱 메서드가 존재한다. -기술통계량 (Descriptive Statistics) : 현재 데이터 상태를 표현(=묘사)한다.
  • 통계 : 평균이 전부다!
In [ ]:
arr3 =np.arange(5)
arr3
Out[ ]:
array([0, 1, 2, 3, 4])
In [ ]:
arr3.sum()  #전체합
Out[ ]:
10
In [ ]:
arr3.mean()  #평균
Out[ ]:
2.0
In [ ]:
arr3.std() #표준편차   루트분산
Out[ ]:
1.4142135623730951
In [ ]:
arr3.var() #분산(평균 - 각값 의 제곱의 평균)
Out[ ]:
2.0

누적합과 누적곱

  • cumsum() : 누적합
  • cumprod() : 누적곱
In [ ]:
arr4 = np.arange(1, 5)
arr4
Out[ ]:
array([1, 2, 3, 4])
In [ ]:
arr4.cumsum()
Out[ ]:
array([ 1,  3,  6, 10])
In [ ]:
arr4.cumprod()
Out[ ]:
array([ 1,  2,  6, 24])

행렬연산

  • 선형대수 (linear algebra)를 위한 2차원 배열 연산도 지원
  • p.229 행렬곱, 전치행렬, 역행렬, 행렬식 사용 예시
In [ ]:
A = np.array([0,1,2,3]).reshape(2,2)
A
Out[ ]:
array([[0, 1],
       [2, 3]])
In [ ]:
B = np.array([3,2,0,1]).reshape(2,2)
B
Out[ ]:
array([[3, 2],
       [0, 1]])
In [ ]:
A.dot(B)
Out[ ]:
array([[0, 1],
       [6, 7]])
In [ ]:
A.transpose() #전치행렬
Out[ ]:
array([[0, 2],
       [1, 3]])

배열의 인덱싱과 슬라이싱

  • string, list,tuple과 동일한 방법으로 접근
In [ ]:
a1 = np.array([0, 10, 20, 30, 40, 50])
In [ ]:
a1
Out[ ]:
array([ 0, 10, 20, 30, 40, 50])
In [ ]:
a1[4] #인덱싱으로 불러옴
Out[ ]:
40
In [ ]:
#50 을 70으로 변경
a1[5] = 70
a1
Out[ ]:
array([ 0, 10, 20, 30, 40, 70])
In [ ]:
#리스트 통해서 추출
a1 [[0,2,4]] #인덱스 번호
Out[ ]:
array([ 0, 20, 40])
In [ ]:
a1[:3]
Out[ ]:
array([ 0, 10, 20])

이차원 배열 인덱싱 슬라이싱

In [ ]:
a2 = np.arange(10,100,10).reshape(3,3)
a2
Out[ ]:
array([[10, 20, 30],
       [40, 50, 60],
       [70, 80, 90]])
In [ ]:
a2[2,1] #중요함
Out[ ]:
80
In [ ]:
a2[2,2] = 95
In [ ]:
a2
Out[ ]:
array([[10, 20, 30],
       [40, 50, 60],
       [70, 80, 95]])
In [ ]:
a2[0] = [30,20,10]
a2
Out[ ]:
array([[30, 20, 10],
       [40, 50, 60],
       [70, 80, 95]])
In [ ]:
a2[0] = np.array([30, 20, 10])  #정석
In [ ]:
a2
Out[ ]:
array([[30, 20, 10],
       [40, 50, 60],
       [70, 80, 95]])
In [ ]:
a2[0] = np.array([30, 20, 10, 1]) #에러 확인용
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[131], line 1
----> 1 a2[0] = np.array([30, 20, 10, 1])

ValueError: could not broadcast input array from shape (4,) into shape (3,)
  • 2차원 배열의 행과 열 위치 지정해거 원소 추출 + (행의 위치1, 열의 위치1)/행의 위치2, 열의 위치2
In [ ]:
a2[[0,2],[0,1]]     #[0,0], [2,1]로 이해 해야함
Out[ ]:
array([30, 80])
In [ ]:
a2
Out[ ]:
array([[30, 20, 10],
       [40, 50, 60],
       [70, 80, 95]])

배열의 조건문

-pandas 문법과 유사

In [ ]:
a = np.array([1,2,3,4,5,6])
a
Out[ ]:
array([1, 2, 3, 4, 5, 6])
In [ ]:
[a>3]
Out[ ]:
[array([False, False, False,  True,  True,  True])]
In [ ]:
a[a!=3] #불린을 통한 트루 값을 가져온다
Out[ ]:
array([1, 2, 4, 5, 6])

배열의 슬라이싱 p.234

In [ ]:
b1 = np.array([0,1,2,3,4,5])
b1[1:4]
Out[ ]:
array([1, 2, 3])
In [ ]:
b1[:3]
Out[ ]:
array([0, 1, 2])
In [ ]:
b1[0:4:2]
Out[ ]:
array([0, 2])
In [ ]:
#p.235
In [ ]:
b1[2:5] = np.array([25,35,45])
In [ ]:
b1
Out[ ]:
array([ 0,  1, 25, 35, 45,  5])
In [ ]:
b1[3:6] = 60
b1
Out[ ]:
array([ 0,  1, 25, 60, 60, 60])
In [ ]:
b2 = np.arange(10,100,10).reshape(3,3)
b2
Out[ ]:
array([[10, 20, 30],
       [40, 50, 60],
       [70, 80, 90]])
In [ ]:
b2[1:3,1:3]
Out[ ]:
array([[50, 60],
       [80, 90]])
In [ ]:
b2[1:,1:]
Out[ ]:
array([[50, 60],
       [80, 90]])
In [ ]:
b2[1][0:2]
Out[ ]:
array([40, 50])

NumPy 조건문

  • np.where : 단일 조건문
  • np.select : 다중 조건문
  • 판다스에서 응용가능
In [ ]:
arr = np.arange(10)
arr
Out[ ]:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [ ]:
#0, 1, 2, 3, 4, 50, 60, 70, 80, 90
In [ ]:
np.where(arr < 5,arr,arr*10)
Out[ ]:
array([ 0,  1,  2,  3,  4, 50, 60, 70, 80, 90])
In [ ]:
arr = np.arange(10)
arr
Out[ ]:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [ ]:
#100, 101, 2, 3, 4, 5, 12, 14, 16, 18
#조건1 2미만일때는 100을 더해라
#조건2 5초과 일떄는 곱하기 2를 해줘라

#조건식과 대응 되는 결과를 리스트로 만들기
cond_list = [arr > 5, arr < 2]
choice_list = [arr * 2, arr + 100]

np.select(cond_list, choice_list,default = arr)
Out[ ]:
array([100, 101,   2,   3,   4,   5,  12,  14,  16,  18])