ASAC 빅데이터 분석가 7기/ASAC 일일 기록

ASAC 빅데이터 분석가 과정 10일차 - 1 (24.12.17)

junslee 2024. 12. 17. 09:14

1. 기존에 했던 문제들 이해

2. 이해를 바탕으로 본인 & 괜찮아독 하는 코드 버전으로 정리!!

(수업, 본인 , 구글, gpt 등) : 본인이 잘 읽히거나 따라하려는 코드 스타일로 정리&이해"

==>코드를 보면, 코드가 머릿속에서 어떻게 구체적으로 돌아갈지 떠올라야 할 정도!!

&& 알고리즘 쪽이 머리 속에서 아이디어와 코드!!

3. 생각(아이디어)~~ 코드 : 연습!!

 

1. 머릿속에서 풀려는 계획!!

--> 이동 : 리스트/ 딕셔너리

--> 지시사항 받으면,,

     아웃 바운드면 pass

     인이면,, 그 지시사항대로 움직이고,,


03_pandas

00_code

01_numpy

## 지금 부터의 방향 : 파이썬을 활용해서
                                   내가 원하는 데이터를 가지고 오고 /수집
                                   원하는대로 전처리/가공/변형!!!
                                   결과들에 대한 표/시각화/그래프 등
                                   EDA : ML(정말 중요한 역할)
                                             DL(ML보다는 중요도가 낮기는 함)
-----------------------------------------------------
주어진 데이터/수집한 데이터 : "데이터를 핸들링" with 파이썬
+++ 기본적인 파이썬 문법
+++ 파이썬 계열에서 주로 데이터를 다루는 자료형 : DF
+++ 기저 : numpy
===> 내가 최대한 구현을 하는 것이 아니라
         있는 기능을 잘 어떻게 사용해서
         "원하는 결과/조작"을 할 것인가!!!!!


쌩 파이썬이 아니라 "다른 사람들이 만들어서 패포한 패키지들!!!"
==> 버전에 대한 이슈들이 상당함!!!
최근에는 좀 안정화가 되었는데,,종종 바뀌는 것들이 있음!!!
DL : 버전 이슈가 상당히 심함!!!--> 일하는데 반 이상 차지하는 경우도 있음!!


Numpy : 데이터를 처리하는 가장 파이썬에 기본이 되는 패키지!!!
==> Numerical Python : 수치 연산
        + pandas , scikit-learn, tf/pytroch etc
==> numpy : 파이썬의 기본적인 자료형을 개선하고자
                      Array 자료형을 만들었음!!!!
                      ==> 수치연산을 위한 벡터연산 가능한 자료형!!!!


ananconda 로 설치하면 : numpy, panasd 기본적으로 설치가 되어 있음.
==> 그냥 불러오기만 하면 됨!!!
colab에서도 이미 설치가 되어 있음!!!

==> colab이 관리하는 버전과 anaconda 관리하는 버전이 달라요!!!!!
==> colab : 갑자기 버전을 하는 경우가 있음;;;코드가 안 돌아요;;


import numpy as np
import pandas as pd

 

# 내가 사용하는 패키지의 버전

pd.__version__
'2.2.2'
np.__version__
'1.26.4'

==> np는 대략 1.X 버전을 사용하는구나!!!!
==> pd는 지금 기준 2.X --> 버전 이슈가 생길 수 있음...마이너 버전에서도
                                            변경이 좀 있을 수 있음!!!!!
                                 2.2~~~


 

numpy를 만들게 이유!!!
==> 수치연산을 파이썬에서 하자!!!!
==> 기존의 파이썬 자료형: 리스트,튜플, dict etc 가진 뭔가 수치연산에 있어서 불편함!!!
==> 수치연산 : 벡터연산!!!!!!!!!
                         하려는 연산/모델을 표현하는 가장 기본적인 규칙적 방법!!
                         수식의 기반을 선형대수에 벡터/행렬/tensor etc:추상화
                          ==> 논문상에 있는 추상화된 수식을 그대로 코드화!!!
==> 모든 원소에 일괄되게 기능을 적용하는 벡터연산이 핵심!!!!!
but 쌩 파이썬에는 이러한 기능의 자료형이 없음!!!!

쌩파이썬 : 리스트 --> 값을 모아둔다!!!!!! 벡터와 유사항!!!
                                   모든 값에 일괄 적용하는 기능 : 벡터연산X
                  ==> for문 사용해서 모든 값을 롤링하면서~~~~~~

x = [ 1,2,3]:   [1+1, 2+1, 3+1]
x = [8,6,4,5,3,2] : [8+1, 6+1, 4+1, 5+1, 3+1, 2+1]
==> x + 1

a = [100,200,300,400,500]
a
[100, 200, 300, 400, 500]

쌩파이썬 리스트로 5개 원소의 값을 모아둠!!
==> 모든 원소에 +10을 하고 싶다!!!!!!!

# m1) 그냥 돌리기
b = []
for i in a:
    b.append(i+10)
b
[110, 210, 310, 410, 510]
# m2) LC
[ i+10 for i in a]
[110, 210, 310, 410, 510]
a + 10
TypeError
# m3) numpy의 array자료형은 벡터연산이 된다고 하더라!!!!
# ==> 외부 패키지를 설치 & 불러다 사용!!!
a_arr = np.array( a )
a_arr
array([100, 200, 300, 400, 500])
b = []
for i in a_arr:
    b.append(i+10)
b
[110, 210, 310, 410, 510]
a_arr + 10
array([110, 210, 310, 410, 510])

 

==> 벡터 연산이 기본적으로 "기능중심의 표현!!!"
       코드작성을 "기능 중심"으로 코드 작성을 하고자 할 때!!!!!
==> 데이터 처리/표현/가공 : 기능 중심으로 코드구현이 간결해짐!!!
*** 데이터/여러 패키지의 기본이 되는 pkg임!!!!

 

# ex)

x = [1,2,3,4,5]
y = [10,20,30,40,50]
# --> (1+10, 2+20, 3+30, 4+40, 5+50)
# ==> 벡터적으로 표현 : x + y (두 벡터의 합)

# m1) 쌩 파이썬
z = []
for i in range( len(a)):
    z.append( x[i]+ y[i])
    # 임의의 i번째 원소에 대해서....
z
[11, 22, 33, 44, 55]

# m2) LC
[x[i]+ y[i] for i in range( len(a))]
[11, 22, 33, 44, 55]

# m3) numpy의 array 자료형
x_arr = np.array(x)
y_arr = np.array(y)
x_arr
array([1, 2, 3, 4, 5])
y_arr
array([10, 20, 30, 40, 50])
x_arr + y_arr
array([11, 22, 33, 44, 55])

# 참고) 벡터연산이 그럼 나하고 뭔 상관??
==> 데이터를 핸들링 하는 과정에서..
       고려의 요소가 개별 원소의 값 중심 아니라..
       줄 단위(row, col)으로 무엇을 할지에 대한 "기능 중심"생각!!
     : 그 기능 중심의 아이디어를 그냥 그대로 코드화!!!!
     : 개별 원소를 도는 과정은 중요한 대상이 아님!!!
==> 내가 할 역할 : 기능을 줄 단위로 무엇을 할지 중심 사고!!!!
                              사고를 그대로 코드화!!!!!


numpy는 수치연산을 위해서 개발한 자료형!!!
==> 비슷한 종류들을 대상을 해야,,,효율성!!!!!!!통일성!!!!
==> 엄격하게 사용을 해야 잘 동작을 함!!!! and
+++ 파이썬에서 사용을 하고 있음 : or
--------> numpy는 값들에 대해서 절충안!!!!

쌩파이썬의 리스트 : 값들을 모아두는 것!!!
                                 값 --> 숫자, 문자, 리스트, dict ,etc
                                 ++ 차원에 대한 정보를 가지고 있지 않음!!
                                 ++ 일괄 적용하는 벡터연산XX

 

m = [
    [1,2,3],
    [4,5,6]
]
m[가로줄][세로줄]

 

numpy의 array     : 값들을 모아두는 것!!!
                               값 --> 숫자, 문자, 리스트, dict ,etc
                              : +++ 차원에 대한 생성 : 오/열/값 종류 --> 차원으로 인식!!!
                              + 기능을 부여하면 : 기본적으로 모든 값에 일괄적용!!!
                                                              (벡터연산을 기본 내제!!!)


a = [1,2,3, ["a","b","c",[1,2,3]]]
a
[1, 2, 3, ['a', 'b', 'c', [1, 2, 3]]]
test_arr = np.array(a)
test_arr

 

ValueError
test_arr = np.array( [1,2,3,"a","b","c"])
test_arr
array(['1', '2', '3', 'a', 'b', 'c'], dtype='<U21')
type(test_arr)
numpy.ndarray
test_arr.dtype
dtype('<U21')
# --> array에서는 형식들을 딱 맞춰서 사용하는 편임!!!
test_arr2 = np.array([ 1,2,3,4,5])
test_arr2
array([1, 2, 3, 4, 5])

1) 이 ARRAY의 개별 값들의 자료형!!!!
2) 이 ARRAY의 차원에 대한 정보!!!!!
3) 어떤 모양으로 이루어져 있는지....

test_arr2
array([1, 2, 3, 4, 5])
test_arr2.dtype
dtype('int64')
test_arr2 + 1
array([2, 3, 4, 5, 6])
test_arr2 * 100
array([100, 200, 300, 400, 500])
test_arr2.ndim
1
test_arr2.shape
(5,)

# 참고) 2차원에 대한 평면/ 행렬

test = [
    [1,2,3],
    [4,5,6]
]
test
[[1, 2, 3], [4, 5, 6]]
len(test)
2
test_arr = np.array(test)
test_arr
array([[1, 2, 3],
       [4, 5, 6]])
test_arr.dtype
dtype('int64')
test_arr.ndim
2
test_arr.shape
(2,3)

len(test_arr)
# ===> 2차원의 자료형이지만,,
#      파이썬의 입장에서 큰 틀 기준으로 : 2개 원소!!
#      2차원의 가로줄의 수
#      len(DF): 가로줄수 == 데이터의 수
2
test_arr.shape[0]
2
# 참고) test에서 1번 가로줄, 2번 세로줄 :2값을 접근하기 위해서..
test[0][1]
2
# 차원이 있는 array에 해보겠습니다.
test_arr[0][1]
2
test_arr[0, 1] # --> 차원에 대한 양식이 있어서,,,,가로/세로 인덱스로 바로 접근!!!
2
test[0,1] # --> 쌩파이썬은 한 큐에 못가고, 하나씩 순차적으로 접근!!!!
TypeError

# array에서 개별 값에 대한 접근!!!
# ==> 리스트 : 정수인덱스, 슬라이싱(여러개 &규칙)
#                      여러개의 규칙이 없다;;;;;LC 우회루틑!!!!
a = [10,20,30,40,50]
a_arr = np.array(a)
a
[10, 20, 30, 40, 50]
a_arr
array([10, 20, 30, 40, 50])
a[0]
10
a_arr[0]
10
a[:3]
array([10, 20, 30])

# cf) a의 원소 중에서 0,1,3번째만 원소만 보자!!!!!
a[ [0,1,3]]
TypeError
a_arr[ [0,1,3]] # --> 인덱스 자리에 내가 보고자하는 것들 리스트업!!!
#                        --> 덩어리로 인덱스 안에 던질 수 있다!!!!!

# ==> numpy 기반의 값에 대한 접근
#      : 쌩 파이썬의 방법을 모두 사용이 가능함!!!
#       + 차원에 대한 정보를 바탕으로 직접 접근도 가능함!!!
#       + 여러개에 대한 덩어리 접근도 가능함!!!!!
array([10, 20, 40])

# 참고) 강제로 개별 값에 대한 타입을 변경할 때!!!!
b = [1,2,3]
b_arr = np.array(b)
b_arr
array([1, 2, 3])
b_arr = np.array( b, dtype=np.string_)
b_arr
# numpy가 자체적으로 만들어둔 자료타입!!!!
array([b'1', b'2', b'3'], dtype='|S1')

# ref) https://numpy.org/doc/stable/reference/arrays.dtypes.html

 

Data type objects (dtype) — NumPy v2.2 Manual

Data type objects (dtype) A data type object (an instance of numpy.dtype class) describes how the bytes in the fixed-size block of memory corresponding to an array item should be interpreted. It describes the following aspects of the data: Type of the data

numpy.org

str(1+2+3)
# ==> 사용하면서 강제적으로 형을 변환을 해야할 때 : casting
'6'
b_arr.astype(np.float64)
array([1., 2., 3.])
b_arr
array([b'1', b'2', b'3'], dtype='|S1')

 

==> astype같은 경우들은 바로 변경이 되지 않음!!
==> 재할당을 해야 함!!!!


# Numpy에 대한 인덱싱연습!!!!
==> 2차원 array에서 생성을 하고 값을 접근하겠습니다!!!
m1) 그냥 직접 값을 손수 치는 방법
m2) 벡터연산을 활용해서 구현하는 방법 : 규칙 & 보여드리기 용도

m = [
     [0,1,2,3,4,5],
     [10,11,12,13,14,15],
     [20,21,22,23,24,25],
     [30,31,32,33,34,35],
     [40,41,42,43,44,45],
     [50,51,52,53,54,55]
]
m
[[0, 1, 2, 3, 4, 5],
 [10, 11, 12, 13, 14, 15],
 [20, 21, 22, 23, 24, 25],
 [30, 31, 32, 33, 34, 35],
 [40, 41, 42, 43, 44, 45],
 [50, 51, 52, 53, 54, 55]]

list(range(0,6,1))
[0, 1, 2, 3, 4, 5]
np.arange(0,6,1)
array([0, 1, 2, 3, 4, 5])
np.arange(0,51,10)[:, np.newaxis] # 1차원에 축을 추가 2D
array([[ 0],
       [10],
       [20],
       [30],
       [40],
       [50]])
np.arange(0,51,10)[:, np.newaxis] + np.arange(0,6,1)
array([[ 0,  1,  2,  3,  4,  5],
       [10, 11, 12, 13, 14, 15],
       [20, 21, 22, 23, 24, 25],
       [30, 31, 32, 33, 34, 35],
       [40, 41, 42, 43, 44, 45],
       [50, 51, 52, 53, 54, 55]])
print(a.dtype)
int64
print(a.ndim)
2
print(a.shape)
(6, 6)

# 원하는 값에 대한 2차원에 대한 접근을 연습!!!!
==> 12값에 대한 접근을 하기 위해서..
쌩 파이썬의 입장에서는 : 순차적으로 가로줄 --> 몇 번째 세로줄

a[1][2]
12
a[1,2] # --> 바로 원하는 위치로 접근!!!!
12

 


# 2차원 numpy의 array의 접근
1) 쌩 파이썬의 입장 : 가로 접근 후 --> 세로 접근
    a[가로][세로]
2) ++ 원하는 포지션에 대한 직접 접근!!!
    a[ 가로, 세로]

 

# Q) 처음 줄의 주황색 : 3,4를 접근한다면!!!

a[0][3:5]
array([3, 4])
a[0, 3:5]
array([3, 4])

# Q) 붉은 새로줄에 접근

a[:,2]
# --> 내가 접근할 값의 가로 위치(들), 세로 위치(들)
array([ 2, 12, 22, 32, 42, 52])

 

# q) 초록색 부분
---> 가로 : 규칙 존재 & 여러개 값
                 2번째 가로줄 부터 퐁당퐁당 --> 간격2
---> 세로 : 규칙 존재 & 여러개 값
                 0번째 세로줄 부터 퐁당퐁당

 

a[2::2, ::2]
array([[20, 22, 24],
       [40, 42, 44]])

 


# Q) 오른쪽 하단

# ==> 가로 : 4번쨰 가로줄 부터~~~
# ==> 세로 : 4번째 세로줄 부터~~~
a[ 4:, 4:]
array([[44, 45],
       [54, 55]])

**** 불리언 인덱싱!!!!
인덱스 : 정수, 슬라이싱: 쌩 파이썬 리스트
              +++ 가로/세로 위치(들),리스트(주의!!!)
              +++ 조건식 들어감!!!

==> 불리언 인덱싱 : numpy의 array 자료형의 인덱스 자리[ ]안에
                                "조건식"이 들어갈 수 있음!!!
==> 의미 : 조건식에 대한 데이터 필터링!!!!
                  sql : where/ having
                  pandas에서 데이터 필터링을 할 때 그대로 적용
why? 벡터 연산을 기본을 하고 있어서 임!!!!

 

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

# 예) 5보다 작은 값들만 추리고 싶다!!!!!!
===> sql : where a <5, having a<5 etc.....
===> 쌩파이썬 : LC --> for if

 

test_arr < 5 # 원본의 갯수와 동일한 10개!!!
array([ True, True, True, True, False, False, False, False, False, False])
test_arr[ test_arr < 5 ]
# --> 인덱스 자리에 조건식!!!!!
#     조건식 : 모든 원소에 해당한느 조건이 맞는지 일괄 통보!!!(벡터연산)
# --> 인덱스 T/F : 해당 위치의 값을 보일지 / 말지 ==> 필터링!!!
array([1, 2, 3, 4])

*** 내가 원하는 조건에 맞는 데이터들만 추려서 ~~~~
     비교를 한다거나~~~~~~
==> 데이터를 분석을 하기 위해서는 여러 경우/ 디테일한 부분을 나눠가면서,,
        탐색을 하기에 필수적인 구문!!!!!!

 

# 참고) numpy가 수치연산  패키지!!!
==> 산수 계산에 대해서 특화가 된 친구!!!
+++ 특이한 연산들에 대해서 정의!!!!!
+++ 선형대수학에서 하는 여러 기능들을/ 함수들을 만들어둠!!!
==> 자세한 것들은 메뉴얼을 검색!!! + gpt etc!!!!

 

test_arr
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
sum(test_arr) # 파이썬의 sum함수에 numpyu의 array 자료형적용
55
test_arr.sum()  # numpy가 미리 만들어둔 sum 메서드/함수를 사용!!
# ==> 일반적으로 패키지들이 쌩파이썬보다는 원하는 기능으로 업그레이드!!
# ==> 동일한 기능이라고 하면,,,그 패키지가 만든 기능을 쓰는게 좋지않을까!!!
55

a =[
    [1,2,3],
    [4,5,6]
]
a_arr=np.array(a)
a_arr.ndim
2
a_arr
array([['1', '2', '3'],
       ['4', '5', '6']], dtype='<U21')

#### Numpy #####
1) 모든 원소에 대한 일괄 적용이 가능한 벡터연산을 기본을 하는 자료형!!!
     + 차원에 대한 정보도 활용할 수 있다!!!!
       (오/열/값 다 매칭/통일해서 해야만 차원의 정보가 생성됨!!)
2) 인덱스 자리에 많은 형식들을 지원을 함!!!
     어레이[정수]
     어레이[슬라이싱]
     *어레이[리스트] : 2d 이상의 array에서는 주의해야 함!!!
     *어레이[조건식] ==> 필터링에 대한 불리언 인덱싱!!!!
+++ 2차원의 array의 관점으로 본다면,,가로/세로 대해서 독립적으로 접근!!!
     어레이[가로, 세로]
     어레이[가로정수, 세로정수]
     어레이[가로슬라이싱, 세로슬라이싱]
     어레이[가로정수, 세로슬라이싱] : 혼재해서 사용이 가능함!!!!
     어레이[가로에 대한 조건식, 세로에 대한 조건식]
     ......

# 참고) 체크할 속성들
arr.ndim
arr.shape
arr.dtype

+++ 수치연산을 위한 친구들이 : 여러가지 계산함수들이 많이 있음!!
==> 공학용 계산 함수들이 좀 있는 패키지!!!!!

# 결론) 쌩 파이썬의 리스트 vs numpy의 array 자료형!!!
       ==> 여러개의 값을 다루는 관점을 유사함!!!!
              + 개별 원소에 대한 일괄적용이 되는 벡터연산!!!
              + 차원에 대한 부분도 추가 됨!!!
              + 인덱스 부분에서 유연함이 있다!!!!
      ==> 기능 중심으로 코드 구현이 용이하다!!!!!

 

# 참고) dl은 가야 numpy는 array를 볼 수 있음....거의 쓸 일이 없음!!!