상세 컨텐츠

본문 제목

[ Python ] 데이터 분석을 위한 패키지 - Pandas

Study/Finance Data Analytics

by bing_su 2023. 11. 7. 03:17

본문

반응형
SMALL

파이썬으로 데이터 분석을 하기 위한 필수 패키지 삼대장이 있다. 바로 Pandas, Numpy, 그리고 Matplotlib이다. 세 개의 패키지 모두 아나콘다를 설치했다면 추가 설치 없이 사용할 수 있다. 그러나 아나콘다가 아닌 다른 에디터(Pycharm, Visual Studio Code 등)를 사용하는 경우에는 추가로 패키지 설치가 필요한 경우가 있을 수 있으니 잘 알아보고 설치한 후 실습을 진행하자. (설치 command도 실습 과정에 명시해 드릴 예정이라 일단 실습 따라오시면 될 듯!)

[ 판다스(Pandas) ]

판다스(Pandas)는 파이썬 데이터 처리를 위한 라이브러리다. 파이썬을 이용한 데이터 분석 작업에서 필수적인 라이브러리로 알려져 있다. 아래의 링크는 Pandas 공식 문서가 있는 사이트니 참고하도록 하자.

Pandas 공식 사이트: https://pandas.pydata.org/pandas-docs/stable/

 

pandas documentation — pandas 2.1.2 documentation

API reference The reference guide contains a detailed description of the pandas API. The reference describes how the methods work and which parameters can be used. It assumes that you have an understanding of the key concepts.

pandas.pydata.org

- Pandas 라이브러리 개요

  • 2010년에 오픈소스로 공개된 이후, 다양한 데이터를 효율적으로 처리할 수 있는 방대한 라이브러리로 성장함
  • 데이터 가공에 필요한 다양한 기능을 제공하며, 주요 부분이 C++로 작성되어 있어 처리 속도가 매우 빠르다.

아나콘다를 설치했거나 Google Colab을 사용할 경우, Pandas가 기본적으로 포함되어 있다. 그러나 이러한 경우가 아니라면 아래의 명령어를 통해 Pandas를 별도로 설치할 수 있다.

pip install pandas

pandas 버전 확인

ipython 쉘을 실행하여 pandas 버전을 확인하면 위와 같다. Pandas의 경우 pd의 명칭으로 import 하는 것이 관례다.

import pandas as pd

Pandas는 아래의 두 가지의 구조화된 데이터를 사용한다.

  • 시리즈(Series): 1차원 배열 
  • 데이터프레임(DataFrame): 2차원 배열

이 중 행과 열로 이루어진 2차원 구조의 데이터프레임이 가장 많이 사용된다. 실습은 주피터 노트북을 활용하여 진행할 예정이다. (본인 편한 환경에서 실습하시면 될 듯)

1) 시리즈(Series)

시리즈(Series)는 데이터가 순차적으로 나열된 1차원 배열의 형태를 나타낸다. 시리즈 데이터는 인덱스(index)와 값(value)으로 구성되며, 이 둘은 서로 매칭되는 관계에 있다. 키(key)와 값(value)의 쌍(pair)으로 구성된 딕셔너리(dictionary)와 구조가 유사하다고 볼 수 있다. 아래의 실습을 통해 확인해 보자. 

import pandas as pd  # pandas 패키지를 pd라는 명칭으로 import 함.
# 값(가격)에 해당하는 인덱스(상품)를 부여하는 배열 sr 생성.
sr = pd.Series([17000, 18000, 1000, 5000],
               index = ["피자", "치킨", "콜라", "맥주"])
print("시리즈 출력:")
print('-'*15)
print(sr)

# 실행 화면
시리즈 출력:
---------------
피자    17000
치킨    18000
콜라     1000
맥주     5000
dtype: int64

딕셔너리와 시리즈의 구조가 유사하여 딕셔너리를 시리즈로 변환하는 방법도 자주 활용된다. 이 과정은 Pandas의 Series() 함수를 통해 간단히 수행할 수 있으며, 변환하고자 하는 딕셔너리를 Series() 함수의 인자로 전달하면 된다. 아래의 실습을 통해 살펴보자.

import pandas as pd

# 값(가격)에 해당하는 key(상품)를 부여하는 딕셔너리 생성
dict = {"피자":17000, "치킨":18000, "콜라":1000, "맥주":5000}

# 딕셔너리를 시리즈로 변환
sr = pd.Series(dict)

print("시리즈 출력:")
print('-'*15)
print(sr)

# 실행 화면
시리즈 출력:
---------------
피자    17000
치킨    18000
콜라     1000
맥주     5000
dtype: int64

딕셔너리에서 각 key는 시리즈의 index로, 해당 key의 value는 시리즈의 데이터 값으로 설정되는 것을 확인할 수 있다. 

 

아래와 같이 시리즈의 값(values)과 인덱스(index)를 따로 출력할 수도 있다.

import pandas as pd
sr = pd.Series([17000, 18000, 1000, 5000],
               index = ["피자", "치킨", "콜라", "맥주"])
# 시리즈의 값을 출력하는 구문
print("시리즈의 값: {}".format(sr.values))
# 시리즈의 인덱스를 출력하는 구문
print("시리즈의 인덱스: {}".format(sr.index))

# 출력 화면
시리즈의 값: [17000 18000  1000  5000]
시리즈의 인덱스: Index(['피자', '치킨', '콜라', '맥주'], dtype='object')

 

※ 시리즈 인덱스

index는 Pandas에서 데이터의 순서와 주소를 관리하는 핵심적인 기능을 수행한다.

  • 정수형 위치 인덱스(Integer Position Index): 데이터의 위치를 나타내는 기본적인 index다. index 설정을 안 하면 해당 인덱스가 사용된다. 0부터 시작하는 정수값을 사용한다. 
  • 인덱스 이름(Index Name) 또는 인덱스 라벨(Index Label): 데이터의 위치뿐만 아니라 의미를 부여하는 라벨이다. 사용자가 직접 정의할 수 있으며 문자열, 날짜 등 다양한 형태로 지정할 수 있다.   
import pandas as pd

# 리스트 데이터 정의
list = [10, 20, 30, 40, 50]
# 리스트를 시리즈로 변환
sr = pd.Series(list)

print("시리즈 출력:")
print('-'*15)
print(sr)

# 출력 화면
시리즈 출력:
---------------
0    10
1    20
2    30
3    40
4    50
dtype: int64

 

인덱스를 활용하여 특정 원소에 접근할 수도 있다. 하나의 원소, 또는 여러 원소를 선택할 수 있으며 접근 방법은 파이썬의 리스트와 동일하다. (인덱스 사용 or 슬라이싱 기법 적용)

참고) 리스트 문법 내용: https://bing-su-b.tistory.com/66

 

[ Python 기초 문법 ] - 자료형(3) - 리스트 자료형

이번에 다룰 자료형은 리스트(List)이다. [ 리스트를 만들고 사용하는 방법 ] 리스트를 만들 때는 대괄호([ ])로 감싸고 각 요소는 쉼표(,)로 구분한다. 리스트명 = [ 요소1, 요소2, 요소3, … ] 여러 리

bing-su-b.tistory.com

import pandas as pd

# 리스트 데이터 정의
list = [10, 20, 30, 40, 50]
# 리스트를 시리즈로 변환
sr = pd.Series(list)

# 단일 원소 선택: 시리즈의 첫 번째 원소를 선택
print(sr[0])
print()
# 다중 원소 선택: 시리즈의 두 번째부터 네 번째 원소까지를 선택
print(sr[1:4])

# 출력 화면
10

1    20
2    30
3    40
dtype: int64

2) 데이터프레임(DataFrame)

데이터프레임은 같은 길이를 가진 1차원 배열, 즉, 원소의 개수가 동일한 여러 시리즈로 이루어져 있다. 각 시리즈는 모여 데이터프레임의 열을 구성하기 된다. 즉 데이터프레임은 행과 열을 가지는 자료구조라고 할 수 있다. 이차원 배열을 pandas의 DataFrame() 함수를 이용하여 데이터프레임으로 변환할 수 있다. 

import pandas as pd

values = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]  # 구성 요소 - 값
index = ['one', 'two', 'three']  # 구성 요소 - 행 인덱스
columns = ['A', 'B', 'C']  # 구성 요소 - 열 이름
# 값, 인덱스, 열을 구성 요소로 하는 데이터프레임 df 생성.
df = pd.DataFrame(values, index=index, columns=columns)

print("데이터프레임 출력:")
print('-'*18)
print(df)

# 출력 화면
데이터프레임 출력:
------------------
       A  B  C
one    1  2  3
two    4  5  6
three  7  8  9

아래와 같은 코드를 활용하면 생성된 데이터프레임에서 인덱스(index), 열(columns), 값(values)의 구성 요소를 각각 출력할 수 있다.

import pandas as pd

values = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
index = ['one', 'two', 'three']
columns = ['A', 'B', 'C']

df = pd.DataFrame(values, index=index, columns=columns)
# 데이터프레임의 인덱스를 출력하는 구문
print("데이터프레임의 인덱스: {}".format(df.index))
# 데이터프레임의 열을 출력하는 구문
print("데이터프레임의 열 이름: {}".format(df.columns))
# 데이터프레임의 값을 출력하는 구문
print("데이터프레임의 값:")
print('-'*18)
print(df.values)

# 출력 화면
데이터프레임의 인덱스: Index(['one', 'two', 'three'], dtype='object')
데이터프레임의 열 이름: Index(['A', 'B', 'C'], dtype='object')
데이터프레임의 값:
------------------
[[1 2 3]
 [4 5 6]
 [7 8 9]]

 3) 데이터프레임의 생성

데이터프레임은 리스트(List), 시리즈(Series), 딕셔너리(dict), Numpy 패키지의 ndarrays, 또 다른 데이터프레임으로부터 생성할 수 있다. 일단 여기서는 리스트와 딕셔너리를 사용하여 데이터프레임을 생성해보고자 한다.

(1) 이중 리스트로 데이터프레임 생성

# 리스트로 데이터프레임 생성
import pandas as pd
data = [
    ['1000', 'Steve', 90.72],
    ['1001', 'James', 78.09],
    ['1002', 'Yuri', 98.43],
    ['1003', 'Jane', 64.19],
    ['1004', 'Tony', 81.30],
    ['1005', 'Judy', 99.14]
]

df = pd.DataFrame(data)
print(df)

# 출력 화면
      0      1      2
0  1000  Steve  90.72
1  1001  James  78.09
2  1002   Yuri  98.43
3  1003   Jane  64.19
4  1004   Tony  81.30
5  1005   Judy  99.14

생성된 데이터프레임에 열(columns)을 지정할 수도 있다. 열 이름을 지정하고 출력해 보자.

import pandas as pd
data = [
    ['1000', 'Steve', 90.72],
    ['1001', 'James', 78.09],
    ['1002', 'Yuri', 98.43],
    ['1003', 'Jane', 64.19],
    ['1004', 'Tony', 81.30],
    ['1005', 'Judy', 99.14]
]

df = pd.DataFrame(data, columns=['학번', '이름', '점수'])
print(df)

# 출력 화면
     학번     이름     점수
0  1000  Steve  90.72
1  1001  James  78.09
2  1002   Yuri  98.43
3  1003   Jane  64.19
4  1004   Tony  81.30
5  1005   Judy  99.14

(2) 딕셔너리(dictionary)를 이용하여 데이터프레임 생성

파이썬 자료구조 중 하나인 딕셔너리(dictionary)를 통해서도 데이터프레임을 생성할 수 있다. 딕셔너리의 key는 데이터프레임의 열 이름으로 저장되고, value에 해당하는 리스트는 시리즈로 변환되어 데이터프레임의 열을 형성한다. 이때 DataFrame() 함수의 인자로는 열의 데이터를 나타내는 여러 개의 리스트를 원소로 가지는 딕셔너리를 지정하면 된다.

# 딕셔너리로 데이터프레임 생성
import pandas as pd
data = {
    '학번' : ['1000', '1001', '1002', '1003', '1004', '1005'],
    '이름' : ['Steve', 'James', 'Yuri', 'Jane', 'Tony', 'Judy'],
    '점수' : [90.72, 78.09, 98.43, 64.19, 81.30, 99.14]
}

df = pd.DataFrame(data)
print(df)

# 출력 화면
     학번     이름     점수
0  1000  Steve  90.72
1  1001  James  78.09
2  1002   Yuri  98.43
3  1003   Jane  64.19
4  1004   Tony  81.30
5  1005   Judy  99.14

 

4) 데이터프레임 조회하기

아래의 명령어는 데이터프레임에서 원하는 구간만 확인하기 위한 명령어로서 유용하게 사용된다.

  • df.head(n) : 앞부분을 n개만 보기
  • df.tail(n) : 뒷부분을 n개만 보기
  • df['열이름'] : 해당되는 열을 확인함

위에서 사용한 데이터프레임을 그대로 사용하여 실습을 진행하자.

''' 앞 부분을 3개만 봄. '''
print(df.head(3))  

# 출력 화면
     학번     이름     점수
0  1000  Steve  90.72
1  1001  James  78.09
2  1002   Yuri  98.43

''' 뒷 부분을 3개만 봄. '''
print(df.tail(3))

# 출력 화면
     학번    이름     점수
3  1003  Jane  64.19
4  1004  Tony  81.30
5  1005  Judy  99.14

''' 학번에 해당되는 열을 보기 '''
print(df['학번'])

# 출력 화면
0    1000
1    1001
2    1002
3    1003
4    1004
5    1005
Name: 학번, dtype: object

5) 외부 데이터 읽기

Pandas는 CSV, 텍스트 Excel, SQL, HTML, JSON 등 다양한 데이터 파일을 읽고 데이터프레임을 생성할 수 있다. 이를 통해 외부 데이터를 Pandas의 데이터프레임 형태로 가져온 후, Pandas가 제공하는 다양한 데이터 처리 및 분석 기능을 활용할 수 있다. 또한, 데이터프레임을 다양한 형태의 파일로 저장하는 것도 가능하다.

 

Pandas가 지원하는 주요 입출력(I/O) 기능은 다음과 같다.

  • CSV 파일: read_csv() 함수를 사용하여 CSV 파일을 읽어 데이터프레임으로 변환 가능. to_csv() 함수를 사용하여 데이터프레임을 CSV 파일로 저장할 수 있다.
  • Excel 파일: read_excel() 함수로 Excel 파일을 읽고, to_excel() 함수로 데이터프레임을 Excel 파일로 저장.
  • HTML 파일: 웹 페이지의 테이블을 읽어오기 위해 read_html() 함수를 사용할 수 있고, to_html() 함수로 데이터프레임을HTML 파일로 저장할 수 있다.
  • SQL 데이터베이스: read_sql() 함수를사용하여 SQL 쿼리 결과를 데이터프레임으로 가져올 수 있고, to_sql() 함수로데이터프레임을 SQL 데이터베이스 테이블로 저장할 수 있다.
  • JSON 파일: read_json() 함수로 JSON 파일을 읽어 데이터프레임으로 변환하고, to_json() 함수로 데이터프레임을 JSON 형식으로 저장할 수 있다.

이 외에도 Pandas는 Parquet, Msgpack, HDF5, SAS, Stata, SPSS 등 다양한 형태의 데이터 소스를 지원한다. 자세한 사용 방법과 옵션은 Pandas 공식 문서를 참고하자.

링크: https://pandas.pydata.org/docs/user_guide/io.html

 

IO tools (text, CSV, HDF5, …) — pandas 2.2.2 documentation

The pandas I/O API is a set of top level reader functions accessed like pandas.read_csv() that generally return a pandas object. The corresponding writer functions are object methods that are accessed like DataFrame.to_csv(). Below is a table containing av

pandas.pydata.org

이번 실습에서는 csv 파일을 읽을 것이다. 아래의 파일을 통해 실습을 진행하자.

test.csv
0.00MB

 

해당 파일을 아래와 같이 실습 파일이 있는 경로에 저장하자.

일반적으로 주피터 노트북 파일은  'C:\Users\사용자명' 경로에 저장되므로 해당 경로에 저장하면 된다.

저장을 끝내고 아래의 코드로 실습을 진행하면 결과가 아래와 같이 뜬다.

import pandas as pd
# csv 파일을 읽어 와서 df에 저장.
df = pd.read_csv('test.csv')
# 저장된 데이터프레임 출력
print(df)

# 출력 화면
     학번     이름     점수
0  1000  Steve  90.72
1  1001  James  78.09
2  1002   Yuri  98.43
3  1003   Jane  64.19
4  1004   Tony  81.30
5  1005   Judy  99.14

csv 파일을 읽어와 데이터프레임을 생성하면 위와 같이 인덱스가 자동을 부여되는 것을 확인할 수 있다. 파일에 열 이름이 있는 경우 자동으로 인식하며, 없는 경우에는 header=None 옵션을 사용하여 처리할 수 있다. 또한, 특정 열을 데이터프레임의 인덱스로 지정하고자 할 때는 index_col 매개변수를 사용하면 된다.

 

이제 인덱스를 출력하는 실습도 진행해 보자.

# df 데이터프레임의 인덱스 출력
print(df.index)

# 출력 화면
RangeIndex(start=0, stop=6, step=1)  # 시작 번호: 0, 끝 번호: 6, 1씩 증가

[ 넘파이(Numpy) ]

넘파이(Numpy)는 수치 데이터를 다루는 파이썬 패키지다. Numpy의 핵심이라고 불리는 다차원 행렬 자료구조인 ndarray를 통해 벡터 및 행렬을 사용하는 선형대수 계산에서 해당 패키지가 주로 사용된다. Numpy는 편의성만이 아닌, 속도 면에서도 순수 파이썬에 비해 압도적으로 빠르다는 장점이 있다.

 

아나콘다를 설치하지 않았다면 아래의 명령어를 통해 Numpy를 별도로 설치할 수 있다.

pip install numpy

numpy 버전 확인

ipython 쉘을 실행하여 numpy 버전을 확인하면 위와 같다. Numpy의 경우 np의 명칭으로 import 하는 것이 관례다.

import numpy as np

1) np.array()

Numpy에서의 핵심은 ndarray(n차원 배열) 객체다. np.array()는 리스트, 튜플, 배열로부터 ndarray 객체를 생성한다. 파이썬 자료구조 중 하나인 리스트를 활용하여 1차원 배열을 생성하는 실습을 진행해 보자.

import numpy as np  # numpy 패키지를 np라는 명칭으로 import 함.
# 1차원 배열을 저장하는 vec 생성.
vec = np.array([1, 2, 3, 4, 5])
print(vec)

# 출력 화면
[1 2 3 4 5]

2차원 배열을 생성할 수도 있다. 주의할 점은 array() 안에는 하나의 리스트만 들어가므로 이 경우에는 리스트의 리스트를 넣어야 한다. 아래의 실습을 진행하며 이해해 보자.

import numpy as np
mat = np.array([[10, 20, 30], [60, 70, 80]])
print(mat)

# 출력 화면
[[10 20 30]
 [60 70 80]]

아래의 코드로 두 배열의 타입을 확인할 수 있다. 

import numpy as np
vec = np.array([1, 2, 3, 4, 5])
mat = np.array([[10, 20, 30], [60, 70, 80]])

print("vec의 타입 :", type(vec))
print("mat의 타입 :", type(mat))

# 출력 화면
vec의 타입 : <class 'numpy.ndarray'>
mat의 타입 : <class 'numpy.ndarray'>

 vec과 mat 둘 다 numpy의 ndarray 객체로 생성된 배열이므로 동일하게 타입이 numpy.ndarray라고 나온다.

 

Numpy 배열에는 축의 개수(ndim)와 크기(shape)라는 개념이 존재하는데, 배열의 크기를 정확히 숙지하는 것이 딥 러닝에서는 매우 중요하다. 축의 개수와 크기가 어떤 의미를 가지는지에 대해서는 머신 러닝을 다루며 벡터와 행렬 연산을 설명할 때 자세히 설명하도록 하겠다. 축의 개수와 크기의 출력은 아래와 같은 코드로 할 수 있다.

import numpy as np
vec = np.array([1, 2, 3, 4, 5])
mat = np.array([[10, 20, 30], [60, 70, 80]])

print("vec의 축의 개수 :", vec.ndim)
print("vec의 크기(shape) :", vec.shape)
print("mat의 축의 개수 :", mat.ndim)
print("mat의 크기(shape) :", mat.shape)

# 출력 화면
vec의 축의 개수 : 1
vec의 크기(shape) : (5,)
mat의 축의 개수 : 2
mat의 크기(shape) : (2, 3)

2) ndarray의 초기화

리스트를 활용하는 방법 외에 ndarray를 만드는 다양한 다른 방법 또한 존재한다. 따라서 이번에는 다양한 배열을 생성하는 방법에 대해 다룰 예정이다.

 

- np.zeros() : 배열의 모든 원소에 0을 삽입한다.

# 모든 값이 0인 2*3 배열 생성
import numpy as np
zero_mat = np.zeros((2, 3))
print(zero_mat)

# 출력 결과
[[0. 0. 0.]
 [0. 0. 0.]]

 

- np.ones() : 배열의 모든 원소에 1을 삽입한다.

# 모든 값이 1인 2*3 배열 생성.
import numpy as np
one_mat = np.ones((2, 3))
print(one_mat)

# 출력 화면
[[1. 1. 1.]
 [1. 1. 1.]]

 

- np.full() : 배열에 사용자가 저장한 값을 삽입한다.

# 모든 값이 특정 상수(7)인 2*2 배열 생성.
import numpy as np
same_value_mat = np.full((2, 2), 7)
print(same_value_mat)

 

- np.eye() : 주대각성분이 1이고 나머지는 0인 2차원 배열을 생성한다.

# 대각선 값이 1이고 나머지 값이 0인 2차원 배열을 생성.
import numpy as np
eye_mat = np.eye(3)
print(eye_mat)

# 출력 화면
[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]

 

- np.random.random() : 임의의 값을 가지는 배열을 생성한다.

# 임의의 값으로 채워진 2*2 배열 생성
import numpy as np
random_mat = np.random.random((2, 2))
print(random_mat)

# 출력 화면
[[0.94639864 0.91739953]
 [0.4739559  0.28905063]]

 

이 외에도 Numpy에는 배열을 만드는 방법이 존재하므로 필요한 방법을 사용하여 배열을 생성할 수 있다.

3) np.arange()

- np.arange(n) : 0부터 (n-1)까지의 값을 가지는 배열을 생성한다.

# 0부터 9까지의 값을 가지는 배열을 생성한다.
import numpy as np
range_vec = np.arange(10)
print(range_vec)

# 출력 결과
[0 1 2 3 4 5 6 7 8 9]

 

- np.arange(i, j, k) : i부터 (j-1)까지 k씩 증가하는 배열을 생성한다.

# 1부터 9까지 +2씩 적용되는 범위
import numpy as np
n = 2
range_n_step_vec = np.arange(1, 10, n)
print(range_n_step_vec)

# 출력 화면
[1 3 5 7 9]

4) np.reshape()

np.reshape()은 내부 데이터는 변경하지 않으면서 배열의 구조를 바꾼다. 0부터 29까지의 숫자를 생성하는 arange(30)을 수행한 후, 원소의 개수가 30개이므로 5행 6열의 행렬로 변경하는 실습을 진행해 보자.

import numpy as np
reshape_mat = np.array(np.arange(30)).reshape((5, 6))
print(reshape_mat)

# 출력 화면
[[ 0  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]]

5) Numpy 슬라이싱

ndarray를 통해 만든 다차원 배열은 파이썬의 자료구조인 리스트(List)처럼 슬라이싱(slicing) 기능을 지원한다. 슬라이싱 기능을 사용하여 특정 행이나 열들의 원소들을 접근할 수 있다.

''' 2*3 행렬 생성 '''
import numpy as np
mat = np.array([[1, 2, 3], [4, 5, 6]])
print(mat)

# 출력 결과
[[1 2 3]
 [4 5 6]]
 
 ''' 첫번째 행 출력 '''
import numpy as np
mat = np.array([[1, 2, 3], [4, 5, 6]])
slicing_mat = mat[0, :]
print(slicing_mat)

# 출력 결과
[1, 2, 3]

''' 두번째 열 출력 '''
import numpy as np
mat = np.array([[1, 2, 3], [4, 5, 6]])
slicing_mat = mat[:, 1]
print(slicing_mat)

# 출력 결과
[2, 5]

기존의 슬라이싱과 동일하게 진행하면 된다. 슬라이싱 까먹으신 분들은 이 링크 참고해 주세요.

6) Numpy 정수 인덱싱(integer indexing)

슬라이싱을 사용하면 배열로부터 부분 배열을 추출할 수 있지만, 연속적이지 않은 원소로 배열을 만들고 싶을 때는 슬라이싱만으로는 만들 수 없다. 예를 들면 2행 2열의 원소와 5행 5열의 원소를 뽑아서 하나의 배열로 만들고자 하는 경우다. 이런 경우에는 인덱싱을 이용하여 배열을 구성할 수 있다. 인덱싱은 원하는 위치의 원소들을 뽑을 수 있다.

''' 2*3 행렬 생성. '''
import numpy as np
mat = np.array([[1, 2], [4, 5], [7, 8]])
print(mat)

# 출력 화면
[[1 2]
 [4 5]
 [7 8]]
 
 ''' 특정 위치(1행 0열)의 원소(4) 가져오기 '''
import numpy as np
mat = np.array([[1, 2], [4, 5], [7, 8]])
print(mat[1, 0])

# 출력 화면
4

''' 특정 위치 원소 두 개를 가져와 새로운 배열 생성 '''
# mat[[2행, 1행], [0열, 1열]]
import numpy as np
mat = np.array([[1, 2], [4, 5], [7, 8]])
indexing_mat = mat[[2, 1], [0, 1]]
print(indexing_mat)

# 출력 화면
[7, 5]

7) Numpy 연산

Numpy를 사용하면 배열간 연산을 손쉽게 수행할 수 있다. 사칙연산자(+, -, *, /)를 사용할 수 있거나 np.add(), np.subtract(), np.multiply(), np.divide()를 사용할 수 있다. 해당 연산자를 사용하면 요소별 연산이 수행된다. 아래의 실습을 통해 Numpy 연산에 대해 이해해 보자.

''' 덧셈(add) 연산 수행 '''
import numpy as np
x = np.array([1, 2, 3])
y = np.array([4, 5, 6])
result1 = x + y
result2 = np.add(x, y)
print(result1)
print(result2)

# 출력 화면
[5 7 9]
[5 7 9]

''' 뺼셈(subtract) 연산 수행 '''
result1 = x - y
result2 = np.subtract(x, y)
print(result1)
print(result2)

# 출력 화면
[-3 -3 -3]
[-3 -3 -3]

''' 곱셈(multiply) 연산 수행 '''
result1 = result1 * x
result2 = np.multiply(result2, x)
print(result1)
print(result2)

# 출력 화면
[-3 -6 -9]
[-3 -6 -9]

''' 나눗셈(divide) 연산 수행 '''
result1 = result1 / x
result2 = np.divide(result2, x)
print(result1)
print(result2)

# 출력 화면
[-3. -3. -3.]
[-3. -3. -3.]

위에서 *를 통해 수행한 것은 요소별 곱을 수행한 결과다. Numpy에서 벡터와 행렬곱을 수행하기 위해서는 dot() 함수를 사용해야 한다. 아래의 실습을 진행해 보자.

import numpy as np
mat1 = np.array([[1, 2], [3, 4]])
mat2 = np.array([[5, 6], [7, 8]])
mat3 = np.dot(mat1, mat2)
print(mat3)

# 출력 화면
[[19 22]
 [43 50]]

[ 맷플롯립(Matplotlib) ]

맷플롯립(Matplotlib)은 데이터를 차트(chart)나 플롯(plot)으로 시각화하는 패키지다. 데이터 분석 이전이나 후에 데이터 이해를 위한 시각화로 해당 패키지를 사용할 수 있다.

 

아나콘다를 설치하지 않았다면 아래의 명령어를 통해 Matplotlib을 별도로 설치할 수 있다.

pip install matplotlib

matplotlib 버전 확인

ipython 쉘을 실행하여 matplotlib 버전을 확인하면 위와 같다. 아래 코드와 같이 Matplotlib의 경우 주요 모듈인 pyplot을 관례상 plt라는 명칭으로 임포트 한다.

import matplotlib.pyplot as plt

1) 라인 플롯 그리기

matplotlib.pyplot 모듈의 함수들을 사용하여 실습을 진행할 예정이다. plot() 함수는 라인 플롯을 그리는 기능을 수행한다. plot() 함수에 x축과 y축 값을 기재하고 show() 함수를 통해 그래프가 화면에 나타나도록 해 보자. title() 함수를 사용하면 그래프의 제목을 지정할 수 있다. 참고로 주피터 노트북에서는 show() 함수를 사용하지 않아도 그래프가 자동으로 랜더링 되므로 그래프가 시각화된다. 그러나 다른 개발 환경에서 사용할 때도 있으므로 show()를 코드에 삽입하여 실습을 진행할 예정이다.

import matplotlib.pyplot as plt
plt.title('test')
plt.plot([1, 2, 3, 4], [2, 4, 8, 6])
plt.show()

실습 결과 화면

2) 축 레이블 삽입

x축과 y축 각각에 축이름을 삽입하고 싶다면 xlabel('label_name')과 ylabel('label_name')을 사용하면 된다. 위의 실습에서 사용한 그래프에 hours와 score라는 축이름을 각각 추가해 보자.

import matplotlib.pyplot as plt
plt.title('test')
plt.plot([1, 2, 3, 4], [2, 4, 8, 6])
plt.xlabel('hours')
plt.ylabel('score')
plt.show()

실습 결과 화면

3) 라인 추가와 범례 삽입

다수의 plot을 하나의 그래프에 나타낼 수도 있다. 여러 개의 라인 플롯을 동시에 사용할 경우에는 각 선이 어떤 데이터를 나타내는지를 보여주기 위해 범례(legend)를 사용할 수 있다. 아래의 실습을 통해 해당 내용을 확인해 보자.

import matplotlib.pyplot as plt
plt.title('students')
plt.plot([1, 2, 3, 4], [2, 4, 8, 6])  # line_1
plt.plot([1.5, 2.5, 3.5, 4.5], [3, 5, 8, 10])  # line_2
plt.xlabel('hours')
plt.ylabel('score')
plt.legend(['A student', 'B student'])  # 범례 삽입
plt.show()

실습 결과 화면

반응형
LIST

관련글 더보기

댓글 영역