์๋ ํ์ธ์! ๋ฐ์ดํฐ ๊ณผํ๊ณผ ๋จธ์ ๋ฌ๋์ ๋ํ ๊ด์ฌ์ด ๋จ๊ฑฐ์ด ์์ฆ, ์ด ๋ถ์ผ์ ๋ฐ์ ๋ค์ด๋ ค๋ ๋ถ๋ค์ด๋ผ๋ฉด “์ด๋ค ๋๊ตฌ๋ฅผ ์ฌ์ฉํด์ผ ํ ๊น?” ํ๋ ๊ณ ๋ฏผ์ ํ ๋ฒ์ฏค ํด๋ณด์ จ์ ๊ฒ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ต์ ์ค์ฌ์๋ ๋ฐ๋ก ํ์ด์ฌ(Python)์ด ์์ต๋๋ค. ๐
ํ์ด์ฌ์ ๊ทธ ์์ฒด๋ก๋ ๊ฐ๋ ฅํ ์ธ์ด์ด์ง๋ง, ์๋ง์ ๊ฐ๋ฐ์๋ค์ด ๋ง๋ค์ด ๋์ ‘๋ผ์ด๋ธ๋ฌ๋ฆฌ’ ๋๋ถ์ ๋จธ์ ๋ฌ๋ ๋ถ์ผ์์ ๋ ๋ณด์ ์ธ ์์น๋ฅผ ์ฐจ์งํ๊ณ ์์ต๋๋ค. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๋ณต์กํ ๊ณ์ฐ์ด๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ, ๋ชจ๋ธ ๊ตฌํ ๋ฑ์ ๋ช ์ค์ ์ฝ๋๋ก ๊ฐํธํ๊ฒ ์ํํ ์ ์๊ฒ ๋์์ฃผ๋ ‘๋ง๋ฒ ์งํก์ด’ ๊ฐ์ ์กด์ฌ์ฃ ! โจ
์ด ๊ธ์์๋ ๋จธ์ ๋ฌ๋ ์ฌ์ ์ ์์ํ๋ ์ฌ๋ฌ๋ถ์ด ๋ฐ๋์ ์์์ผ ํ ํ์ ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๊ฐ ์ญํ ๋ณ๋ก ๋๋์ด ์์ธํ ์ค๋ช ํด ๋๋ฆด ๊ฑฐ์์. ์์ ์ฝ๋์ ํจ๊ป ์ค์ ์ด๋ป๊ฒ ํ์ฉ๋๋์ง ์์๋ณด๊ณ , ์ด๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ์ค์ํ์ง ๋ช ํํ๊ฒ ์ดํดํ์ค ์ ์๋๋ก ๋์๋๋ฆฌ๊ฒ ์ต๋๋ค!
๐ ๋ชฉ์ฐจ
- ๋ฐ์ดํฐ ์ค๋น ๋ฐ ์กฐ์์ ํต์ฌ: NumPy์ Pandas
- ๋ํ์ด(NumPy): ์ซ์ ๊ณ์ฐ์ ๋ฒ ์ด์ค์บ ํ
- ํ๋ค์ค(Pandas): ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ๋ง๋ฅ ์นผ
- ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ ๋: ์๊ฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ Matplotlib์ Seaborn
- ๋งทํ๋กฏ๋ฆฝ(Matplotlib): ๊ทธ๋ํ์ ๊ธฐ๋ณธ ์ค์ ๊ธฐ๋ณธ
- ์จ๋ณธ(Seaborn): ํต๊ณ ์๊ฐํ์ ์์ ๊ฐ
- ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ๋ง์ ์ฌ์ฅ: Scikit-learn
- ์ฌ์ดํท๋ฐ(Scikit-learn): ๋จธ์ ๋ฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ณด๋ฌผ์ฐฝ๊ณ
- ๋ฅ๋ฌ๋์ ๊ฑฐ์ธ๋ค: TensorFlow/Keras์ PyTorch
- ํ ์ํ๋ก์ฐ/์ผ๋ผ์ค(TensorFlow/Keras): ๊ตฌ๊ธ์ ๋ฅ๋ฌ๋ ํ๋ ์์ํฌ
- ํ์ดํ ์น(PyTorch): ํ์ด์ค๋ถ์ ์ ์ฐํ ๋ฅ๋ฌ๋ ํ๋ ์์ํฌ
- ๊ทธ ์ธ ์์๋๋ฉด ์ ์ฉํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ์ฌ์ดํ์ด(SciPy): ๊ณผํ ๊ณ์ฐ์ ์ ๋ฌธ๊ฐ
- ์ฃผํผํฐ ๋ ธํธ๋ถ/๋ฉ(Jupyter Notebook/Lab): ๋ํํ ๊ฐ๋ฐ ํ๊ฒฝ
1. ๐ ๋ฐ์ดํฐ ์ค๋น ๋ฐ ์กฐ์์ ํต์ฌ: NumPy์ Pandas
๋จธ์ ๋ฌ๋ ํ๋ก์ ํธ์ ์ฒซ ๋จ์ถ๋ ์ธ์ ๋ ‘๋ฐ์ดํฐ’์ ๋๋ค. ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๋ถ๋ฌ์ค๊ณ , ์ ๋ฆฌํ๊ณ , ๋ณํํ๋ ๋ฅ๋ ฅ์ ํ๋ก์ ํธ ์ฑ๊ณต์ 8ํ ์ ์ฐจ์งํ๋ค๊ณ ํด๋ ๊ณผ์ธ์ด ์๋๋๋ค. ์ด ๊ณผ์ ์์ ๋น์ ๋ฐํ๋ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ฐ๋ก NumPy์ Pandas์ ๋๋ค.
1.1. ๋ํ์ด(NumPy): ์ซ์ ๊ณ์ฐ์ ๋ฒ ์ด์ค์บ ํ ๐๏ธ
-
๋ฌด์์ธ๊ฐ์? ๋ํ์ด(Numerical Python)๋ ํ์ด์ฌ์์ ๊ณ ์ฑ๋ฅ ์์น ๊ณ์ฐ์ ์ํด ๋ง๋ค์ด์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ํนํ ๋ค์ฐจ์ ๋ฐฐ์ด(N-dimensional array,
ndarray
) ๊ฐ์ฒด๋ฅผ ํจ์จ์ ์ผ๋ก ๋ค๋ฃฐ ์ ์๊ฒ ํด์ฃผ๋ฉฐ, ๊ฑฐ์ ๋ชจ๋ ๊ณผํ ๊ณ์ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ธฐ๋ฐ์ด ๋ฉ๋๋ค. ๋น์ ์ด ์๊ฒ ๋ ๊ฑฐ์ ๋ชจ๋ ML ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ด๋ถ์ ์ผ๋ก ๋ํ์ด ๋ฐฐ์ด์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค! -
์ ์ค์ํ๊ฐ์? ์ผ๋ฐ ํ์ด์ฌ ๋ฆฌ์คํธ๋ณด๋ค ํจ์ฌ ๋น ๋ฅด๊ณ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ ์ ๋๋ค. ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ์ ๋ค๋ฃจ๊ฑฐ๋ ํ๋ ฌ ์ฐ์ฐ, ์ ํ ๋์ํ ๋ฑ ๋ณต์กํ ์ํ ์ฐ์ฐ์ด ํ์ํ ๋จธ์ ๋ฌ๋์์ ์์ด์๋ ์ ๋ ์กด์ฌ์ ๋๋ค. ๋ง์น ์์ ์์ ๋ฐฉ๋ํ ์ซ์๋ค์ ๋ค๋ฃจ๋ฏ, ๋ํ์ด๋ ํ์ด์ฌ์์ ์ซ์๋ฅผ ๋ค๋ฃจ๋ ๋ฐ ์ต์ ํ๋์ด ์์ต๋๋ค.
-
์ฃผ์ ๊ธฐ๋ฅ:
- ๋น ๋ฅธ ๋ค์ฐจ์ ๋ฐฐ์ด(ndarray) ์์ฑ ๋ฐ ์กฐ์
- ์ํ ํจ์ (์ผ๊ฐ ํจ์, ๋ก๊ทธ ํจ์ ๋ฑ)
- ์ ํ ๋์ (ํ๋ ฌ ๊ณฑ์ , ์ญํ๋ ฌ, ๊ณ ์ ๊ฐ ๋ฑ)
- ํธ๋ฆฌ์ ๋ณํ, ๋์ ์์ฑ ๋ฑ
-
๊ฐ๋จํ ์์:
import numpy as np # ๋ํ์ด๋ฅผ 'np'๋ก ์ค์ฌ์ ๋ถ๋ฅด๋ ๊ฒ์ด ๊ด๋ก์ ๋๋ค. # 1. ๋ํ์ด ๋ฐฐ์ด ์์ฑํ๊ธฐ data = np.array([1, 2, 3, 4, 5]) print(f"1D ๋ฐฐ์ด: {data}") # ์ถ๋ ฅ: 1D ๋ฐฐ์ด: [1 2 3 4 5] # 2. 2์ฐจ์ ๋ฐฐ์ด (ํ๋ ฌ) ์์ฑํ๊ธฐ matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print(f"2D ๋ฐฐ์ด:\n{matrix}") # ์ถ๋ ฅ: # 2D ๋ฐฐ์ด: # [[1 2 3] # [4 5 6] # [7 8 9]] # 3. ๋ฐฐ์ด ์ฐ์ฐ (๋ธ๋ก๋์บ์คํ ) data_plus_5 = data + 5 print(f"๋ฐฐ์ด์ 5 ๋ํ๊ธฐ: {data_plus_5}") # ์ถ๋ ฅ: ๋ฐฐ์ด์ 5 ๋ํ๊ธฐ: [ 6 7 8 9 10] # 4. ํ๋ ฌ ๊ณฑ์ matrix_a = np.array([[1, 2], [3, 4]]) matrix_b = np.array([[5, 6], [7, 8]]) dot_product = np.dot(matrix_a, matrix_b) # ๋๋ matrix_a @ matrix_b print(f"ํ๋ ฌ ๊ณฑ์ ๊ฒฐ๊ณผ:\n{dot_product}") # ์ถ๋ ฅ: # ํ๋ ฌ ๊ณฑ์ ๊ฒฐ๊ณผ: # [[19 22] # [43 50]]
1.2. ํ๋ค์ค(Pandas): ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ๋ง๋ฅ ์นผ ๐ช
-
๋ฌด์์ธ๊ฐ์? ํ๋ค์ค(Pandas)๋ ํ์ด์ฌ์์ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์กฐํํ๊ณ ๋ถ์ํ๋ ๋ฐ ํนํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ์คํ๋ ๋์ํธ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ๊ณผ ์ ์ฌํ
DataFrame
์ด๋ผ๋ ๊ฐ๋ ฅํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํ๋ฉฐ, ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์์ฝ๊ฒ ์กฐ์, ์ ์ , ๋ถ์ํ ์ ์์ต๋๋ค. ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ ํ์ต ์ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ(๊ฒฐ์ธก์น ์ฒ๋ฆฌ, ๋ฐ์ดํฐ ๋ณํฉ ๋ฑ)๋ ํ๋ค์ค๊ฐ ์์ผ๋ฉด ๊ฑฐ์ ๋ถ๊ฐ๋ฅํ๋ค๊ณ ํ ์ ์์ต๋๋ค. -
์ ์ค์ํ๊ฐ์? ์ ํ ๋ฐ์ดํฐ(ํ ์ด๋ธ ํํ์ ๋ฐ์ดํฐ)๋ฅผ ๋ค๋ฃจ๋ ๋ฐ ์์ด์๋ ํ๋ค์ค๋งํผ ํธ๋ฆฌํ๊ณ ๊ฐ๋ ฅํ ๋๊ตฌ๊ฐ ์์ต๋๋ค. CSV, Excel, SQL ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฑ ๋ค์ํ ํ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ๋ถ๋ฌ์ค๊ณ ์ ์ฅํ ์ ์์ผ๋ฉฐ, ๋ณต์กํ ๋ฐ์ดํฐ ์กฐ์๋ ์ง๊ด์ ์ธ ์ฝ๋๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ ๋ถ์๊ฐ์ ๋จธ์ ๋ฌ๋ ์์ง๋์ด์ ํ์ ๋๊ตฌ์ ๋๋ค!
-
์ฃผ์ ๊ธฐ๋ฅ:
DataFrame
๊ณผSeries
๊ฐ์ฒด๋ฅผ ์ด์ฉํ ๋ฐ์ดํฐ ๊ตฌ์กฐํ- CSV, Excel, SQL ๋ฑ ๋ค์ํ ํ์ผ ํ์์ ๋ฐ์ดํฐ ๋ก๋ ๋ฐ ์ ์ฅ
- ๊ฒฐ์ธก์น(NaN) ์ฒ๋ฆฌ, ๋ฐ์ดํฐ ๋ณํฉ, ๊ทธ๋ฃนํ, ํผ๋ฒ ํ ์ด๋ธ ๋ฑ
- ๋ฐ์ดํฐ ํํฐ๋ง, ์ ๋ ฌ, ํต๊ณ ๊ณ์ฐ
-
๊ฐ๋จํ ์์:
import pandas as pd # ํ๋ค์ค๋ฅผ 'pd'๋ก ์ค์ฌ์ ๋ถ๋ฅด๋ ๊ฒ์ด ๊ด๋ก์ ๋๋ค. # 1. ๋์ ๋๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ DataFrame ์์ฑํ๊ธฐ data = { '์ด๋ฆ': ['์ฒ ์', '์ํฌ', '๋ฏผ์', '์์ง'], '๋์ด': [25, 30, 22, 28], '๋์': ['์์ธ', '๋ถ์ฐ', '์์ธ', '์ ์ฃผ'], '์ ์': [85, 92, 78, 95] } df = pd.DataFrame(data) print("์๋ณธ DataFrame:\n", df) # ์ถ๋ ฅ: # ์๋ณธ DataFrame: # ์ด๋ฆ ๋์ด ๋์ ์ ์ # 0 ์ฒ ์ 25 ์์ธ 85 # 1 ์ํฌ 30 ๋ถ์ฐ 92 # 2 ๋ฏผ์ 22 ์์ธ 78 # 3 ์์ง 28 ์ ์ฃผ 95 # 2. ํน์ ์ปฌ๋ผ ์ ํํ๊ธฐ print("\n'๋์ด' ์ปฌ๋ผ๋ง ์ ํ:\n", df['๋์ด']) # ์ถ๋ ฅ: # '๋์ด' ์ปฌ๋ผ๋ง ์ ํ: # 0 25 # 1 30 # 2 22 # 3 28 # Name: ๋์ด, dtype: int64 # 3. ์กฐ๊ฑด์ ๋ง๋ ๋ฐ์ดํฐ ํํฐ๋ง (์์ธ์ ์ฌ๋ ์ฌ๋๋ง) seoul_people = df[df['๋์'] == '์์ธ'] print("\n์์ธ์ ์ฌ๋ ์ฌ๋๋ค:\n", seoul_people) # ์ถ๋ ฅ: # ์์ธ์ ์ฌ๋ ์ฌ๋๋ค: # ์ด๋ฆ ๋์ด ๋์ ์ ์ # 0 ์ฒ ์ 25 ์์ธ 85 # 2 ๋ฏผ์ 22 ์์ธ 78 # 4. ์๋ก์ด ์ปฌ๋ผ ์ถ๊ฐ (์ ์ ๋ฑ๊ธ) df['์ ์ ๋ฑ๊ธ'] = df['์ ์'].apply(lambda x: 'A' if x >= 90 else 'B' if x >= 80 else 'C') print("\n์ ์ ๋ฑ๊ธ ์ปฌ๋ผ ์ถ๊ฐ ํ:\n", df) # ์ถ๋ ฅ: # ์ ์ ๋ฑ๊ธ ์ปฌ๋ผ ์ถ๊ฐ ํ: # ์ด๋ฆ ๋์ด ๋์ ์ ์ ์ ์ ๋ฑ๊ธ # 0 ์ฒ ์ 25 ์์ธ 85 B # 1 ์ํฌ 30 ๋ถ์ฐ 92 A # 2 ๋ฏผ์ 22 ์์ธ 78 C # 3 ์์ง 28 ์ ์ฃผ 95 A
2. ๐ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ ๋: ์๊ฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ Matplotlib์ Seaborn
๋ฐ์ดํฐ๋ฅผ ์ดํดํ๊ณ ๋ถ์ํ๋ ๋ฐ ์์ด ์๊ฐํ๋ ์ ํ์ด ์๋ ํ์์ ๋๋ค. ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ํ๋ก ๊ทธ๋ ค๋ณด๋ฉด ์ซ์๋ง์ผ๋ก๋ ์๊ธฐ ํ๋ค์๋ ํจํด, ์ด์์น, ๊ด๊ณ ๋ฑ์ ํ๋์ ํ์ ํ ์ ์์ต๋๋ค. ๋งทํ๋กฏ๋ฆฝ๊ณผ ์จ๋ณธ์ ์ด ์ค์ํ ์ญํ ์ ์ํํ๋ ํ์ด์ฌ์ ๋ํ์ ์ธ ์๊ฐํ ๋๊ตฌ์ ๋๋ค.
2.1. ๋งทํ๋กฏ๋ฆฝ(Matplotlib): ๊ทธ๋ํ์ ๊ธฐ๋ณธ ์ค์ ๊ธฐ๋ณธ ๐จ
-
๋ฌด์์ธ๊ฐ์? ๋งทํ๋กฏ๋ฆฝ(Matplotlib)์ ํ์ด์ฌ์์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ 2D ํ๋กํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ์ ๊ทธ๋ํ, ์ฐ์ ๋, ๋ง๋ ๊ทธ๋ํ, ํ์คํ ๊ทธ๋จ ๋ฑ ๊ฑฐ์ ๋ชจ๋ ์ข ๋ฅ์ ์ ์ ์ธ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆด ์ ์์ต๋๋ค. ์ธ๋ถ์ ์ธ ์ค์ ์ ํตํด ๊ทธ๋ฆผ์ ๋ชจ๋ ์์๋ฅผ ์ฌ์ฉ์๊ฐ ์ํ๋ ๋๋ก ์ปค์คํฐ๋ง์ด์งํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
-
์ ์ค์ํ๊ฐ์? ์๊ฐํ์ ‘๊ทผ๋ณธ’์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ๊ณ ๊ธ ์๊ฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค๋ ๋๋ถ๋ถ ๋งทํ๋กฏ๋ฆฝ์ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ก๊ธฐ ๋๋ฌธ์, ๋งทํ๋กฏ๋ฆฝ์ ๊ธฐ๋ณธ๊ธฐ๋ฅผ ๋ค์ ธ๋๋ฉด ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ดํดํ๋ ๋ฐ๋ ํฐ ๋์์ด ๋ฉ๋๋ค. ๋ฐ์ดํฐ ํ์ ๋จ๊ณ์์ ๋ฐ์ดํฐ๋ฅผ ์๊ฐ์ ์ผ๋ก ์ดํดํ๋ ๋ฐ ํ์์ ์ ๋๋ค.
-
์ฃผ์ ๊ธฐ๋ฅ:
- ๋ค์ํ ์ข ๋ฅ์ 2D ๊ทธ๋ํ (Line, Scatter, Bar, Histogram, Boxplot ๋ฑ)
- ์๋ธํ๋กฏ(subplot)์ ์ด์ฉํ ์ฌ๋ฌ ๊ทธ๋ํ ํ ๋ฒ์ ๊ทธ๋ฆฌ๊ธฐ
- ๊ทธ๋ํ์ ์ ๋ชฉ, ์ถ ๋ผ๋ฒจ, ๋ฒ๋ก, ์์, ์คํ์ผ ๋ฑ ์ธ๋ถ ์ค์ ๊ฐ๋ฅ
-
๊ฐ๋จํ ์์:
import matplotlib.pyplot as plt # ๋งทํ๋กฏ๋ฆฝ์ ์๋ธ๋ชจ๋์ 'plt'๋ก ์ค์ฌ์ ๋ถ๋ฆ ๋๋ค. import numpy as np # 1. ๊ฐ๋จํ ์ ๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ x = np.arange(0, 10, 0.5) # 0๋ถํฐ 9.5๊น์ง 0.5 ๊ฐ๊ฒฉ์ผ๋ก ์ซ์ ์์ฑ y = np.sin(x) # x ๊ฐ์ ๋ํ ์ฌ์ธ(sin) ๊ฐ ๊ณ์ฐ plt.figure(figsize=(8, 4)) # ๊ทธ๋ํ ํฌ๊ธฐ ์ค์ plt.plot(x, y, color='blue', linestyle='--', marker='o') # x, y ๊ฐ์ผ๋ก ์ ๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ plt.title('์ฌ์ธ ํจ์ ๊ทธ๋ํ') # ๊ทธ๋ํ ์ ๋ชฉ plt.xlabel('X ์ถ') # X์ถ ๋ผ๋ฒจ plt.ylabel('Y ์ถ (sin(x))') # Y์ถ ๋ผ๋ฒจ plt.grid(True) # ๊ทธ๋ฆฌ๋ ํ์ plt.show() # ๊ทธ๋ํ ๋ณด์ฌ์ฃผ๊ธฐ # 2. ์ฐ์ ๋์ ๋ง๋ ๊ทธ๋ํ categories = ['A', 'B', 'C', 'D'] values = [20, 35, 30, 40] plt.figure(figsize=(10, 5)) plt.subplot(1, 2, 1) # 1ํ 2์ด ์ค ์ฒซ ๋ฒ์งธ ์นธ plt.scatter(categories, values, color='red', s=100) # ์ฐ์ ๋ plt.title('์นดํ ๊ณ ๋ฆฌ๋ณ ๊ฐ (์ฐ์ ๋)') plt.subplot(1, 2, 2) # 1ํ 2์ด ์ค ๋ ๋ฒ์งธ ์นธ plt.bar(categories, values, color='green') # ๋ง๋ ๊ทธ๋ํ plt.title('์นดํ ๊ณ ๋ฆฌ๋ณ ๊ฐ (๋ง๋ ๊ทธ๋ํ)') plt.tight_layout() # ๊ทธ๋ํ ๊ฐ ๊ฐ๊ฒฉ ์๋ ์กฐ์ plt.show()
2.2. ์จ๋ณธ(Seaborn): ํต๊ณ ์๊ฐํ์ ์์ ๊ฐ ๐
-
๋ฌด์์ธ๊ฐ์? ์จ๋ณธ(Seaborn)์ ๋งทํ๋กฏ๋ฆฝ์ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ง ํต๊ณ ๋ฐ์ดํฐ ์๊ฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ๋ ๋ณต์กํ๊ณ ์๋ฆ๋ค์ด ํต๊ณ ๊ทธ๋ํ๋ฅผ ๋ช ์ค์ ์ฝ๋๋ก ์ฝ๊ฒ ๊ทธ๋ฆด ์ ์๊ฒ ํด์ค๋๋ค. ํนํ ๋ฐ์ดํฐํ๋ ์(Pandas DataFrame)๊ณผ ์ฐ๋ํ์ฌ ์ฌ์ฉํ๊ธฐ ํธ๋ฆฌํ๋ฉฐ, ํต๊ณ ๋ชจ๋ธ์ ์๊ฐํ๋ฅผ ์ํ ๊ณ ์์ค ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
-
์ ์ค์ํ๊ฐ์? ๋งทํ๋กฏ๋ฆฝ๋ณด๋ค ๋ ์์๊ณ ์ ๋ณด๋์ด ๋ง์ ๊ทธ๋ํ๋ฅผ ์ฝ๊ฒ ๊ทธ๋ฆด ์ ์์ต๋๋ค. ๋ฐ์ดํฐ์ ๋ด์ ๋ณ์ ๊ฐ ๊ด๊ณ๋ฅผ ํ์ํ๊ฑฐ๋, ํต๊ณ์ ๋ถํฌ๋ฅผ ์๊ฐํํ ๋ ํนํ ๊ฐ๋ ฅํฉ๋๋ค. ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ ํ์ต ์ ์ ๋ฐ์ดํฐ์ ํน์ฑ์ ํ์ (EDA, ํ์์ ๋ฐ์ดํฐ ๋ถ์)ํ๋ ๋ฐ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
-
์ฃผ์ ๊ธฐ๋ฅ:
- ๋ฐ์ดํฐ์ ๊ธฐ๋ฐ์ ๊ณ ์์ค API (Pandas DataFrame๊ณผ ์ฐ๋ ์ฉ์ด)
- ๋ค์ํ ํต๊ณ ํ๋กฏ (์ฐ์ ๋ ํ๋ ฌ, ๋ฐ์ด์ฌ๋ฆฐ ํ๋กฏ, ๋ฐ์ค ํ๋กฏ, ํํธ๋งต ๋ฑ)
- ๋ค๋ณ๋ ๋ฐ์ดํฐ ๋ถ์์ ์ํ ๊ธฐ๋ฅ (๋ณ์ ๊ฐ ๊ด๊ณ, ๋ถํฌ ์๊ฐํ)
- ์๋ฆ๋ค์ด ๊ธฐ๋ณธ ์คํ์ผ๊ณผ ์์ ํ๋ ํธ ์ ๊ณต
-
๊ฐ๋จํ ์์:
import seaborn as sns import matplotlib.pyplot as plt import pandas as pd # ์จ๋ณธ ๋ด์ฅ ๋ฐ์ดํฐ์ ๋ถ๋ฌ์ค๊ธฐ (์: ํ์ดํ๋ ๋ฐ์ดํฐ์ ) titanic = sns.load_dataset('titanic') print("ํ์ดํ๋ ๋ฐ์ดํฐ์ ์ผ๋ถ:\n", titanic.head()) # 1. ๋ฒ์ฃผํ ๋ฐ์ดํฐ์ ๋ถํฌ ์๊ฐํ (ํ์น ๋ฑ๊ธ๋ณ ์์กด ์ฌ๋ถ) plt.figure(figsize=(6, 4)) sns.countplot(x='pclass', hue='survived', data=titanic) plt.title('ํ์น ๋ฑ๊ธ๋ณ ์์กด์/์ฌ๋ง์ ์') plt.show() # 2. ๋ ์ฐ์ํ ๋ณ์ ๊ฐ์ ๊ด๊ณ ์๊ฐํ (์ฐ์ ๋) - ๋์ด์ ์ด์ plt.figure(figsize=(8, 6)) sns.scatterplot(x='age', y='fare', hue='survived', data=titanic, alpha=0.6) plt.title('๋์ด์ ์ด์์ ๋ฐ๋ฅธ ์์กด ์ฌ๋ถ') plt.show() # 3. ๋ฐ์ดํฐํ๋ ์์ ์๊ด๊ด๊ณ ํํธ๋งต (์ซ์ํ ๋ณ์๋ง ์ ํ) plt.figure(figsize=(8, 6)) correlation_matrix = titanic.corr(numeric_only=True) # ์ซ์ํ ์ปฌ๋ผ๋ง ์๊ด๊ด๊ณ ๊ณ์ฐ sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', fmt=".2f") plt.title('ํ์ดํ๋ ๋ฐ์ดํฐ์ ์๊ด๊ด๊ณ ํํธ๋งต') plt.show()
3. ๐ง ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ๋ง์ ์ฌ์ฅ: Scikit-learn
์ด์ ๋ฐ์ดํฐ๋ฅผ ์ค๋นํ๊ณ ํ์ํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ ์ผ๋, ์ค์ ๋ก ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ๋ง๋ค์ด ๋ณผ ์ฐจ๋ก์ ๋๋ค! ๋จธ์ ๋ฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ‘์งํฉ์ฒด’๋ผ๊ณ ํ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ฐ๋ก Scikit-learn์ ๋๋ค.
3.1. ์ฌ์ดํท๋ฐ(Scikit-learn): ๋จธ์ ๋ฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ณด๋ฌผ์ฐฝ๊ณ ๐
-
๋ฌด์์ธ๊ฐ์? ์ฌ์ดํท๋ฐ(Scikit-learn)์ ํ์ด์ฌ์์ ๊ฐ์ฅ ์ธ๊ธฐ ์๊ณ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋จธ์ ๋ฌ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ๋ถ๋ฅ(Classification), ํ๊ท(Regression), ๊ตฐ์ง(Clustering), ์ฐจ์ ์ถ์(Dimensionality Reduction) ๋ฑ ๋ค์ํ ๋จธ์ ๋ฌ๋ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ ๋๊ตฌ, ๋ชจ๋ธ ํ๊ฐ ๋๊ตฌ ๋ฑ์ ์ ๊ณตํฉ๋๋ค. ์ผ๊ด๋ API๋ฅผ ๊ฐ์ง๊ณ ์์ด ์ฌ์ฉ๋ฒ์ ํ ๋ฒ ์ตํ๋ฉด ๋ค์ํ ์๊ณ ๋ฆฌ์ฆ์ ์ฝ๊ฒ ์ ์ฉํ ์ ์์ต๋๋ค.
-
์ ์ค์ํ๊ฐ์? ๋จธ์ ๋ฌ๋์ ‘ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ’๋ผ๊ณ ๋ถ๋ฆด ๋งํผ ๊ฐ๋ ฅํ๊ณ ํธ๋ฆฌํฉ๋๋ค. ๋ณต์กํ ์ํ์ ๋ฐฐ๊ฒฝ์ ๋ชฐ๋ผ๋ ๊ธฐ๋ณธ์ ์ธ ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ์ฝ๊ฒ ๊ตฌํํ๊ณ ํ ์คํธํ ์ ์๊ฒ ํด์ค๋๋ค. ์ค์ ์๋น์ค์ ์ ์ฉ๋๋ ๋ง์ ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ๋ค์ด ์ฌ์ดํท๋ฐ์ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋ฐ๋ฉ๋๋ค.
-
์ฃผ์ ๊ธฐ๋ฅ:
- ๋ถ๋ฅ: ๋ก์ง์คํฑ ํ๊ท, SVM, ๊ฒฐ์ ํธ๋ฆฌ, ๋๋ค ํฌ๋ ์คํธ, K-NN ๋ฑ
- ํ๊ท: ์ ํ ํ๊ท, ๋ผ์, ๋ฆฟ์ง, ๊ฒฐ์ ํธ๋ฆฌ ํ๊ท ๋ฑ
- ๊ตฐ์ง: K-ํ๊ท , DBSCAN ๋ฑ
- ์ฐจ์ ์ถ์: PCA (์ฃผ์ฑ๋ถ ๋ถ์)
- ๋ชจ๋ธ ์ ํ: ๊ต์ฐจ ๊ฒ์ฆ, ๊ทธ๋ฆฌ๋ ์์น, ํ์ต ๊ณก์ ๋ฑ
- ์ ์ฒ๋ฆฌ: ๋ฐ์ดํฐ ์ค์ผ์ผ๋ง, ์ธ์ฝ๋ฉ, ๊ฒฐ์ธก์น ์ฒ๋ฆฌ ๋ฑ
-
๊ฐ๋จํ ์์ (์ ํ ํ๊ท ๋ชจ๋ธ):
from sklearn.linear_model import LinearRegression # ์ ํ ํ๊ท ๋ชจ๋ธ from sklearn.model_selection import train_test_split # ํ๋ จ/ํ ์คํธ ๋ฐ์ดํฐ ๋ถ๋ฆฌ from sklearn.metrics import mean_squared_error # ๋ชจ๋ธ ํ๊ฐ ์งํ import numpy as np import matplotlib.pyplot as plt # 1. ๊ฐ์์ ๋ฐ์ดํฐ ์์ฑ (์ง ํฌ๊ธฐ์ ๋ฐ๋ฅธ ๊ฐ๊ฒฉ ์์ธก) # feature (๋ ๋ฆฝ ๋ณ์): ์ง ํฌ๊ธฐ (ํ๋ฐฉ๋ฏธํฐ) X = np.array([50, 60, 70, 80, 90, 100, 110, 120]).reshape(-1, 1) # target (์ข ์ ๋ณ์): ์ง ๊ฐ๊ฒฉ (์ต ์) y = np.array([2.5, 3.0, 3.8, 4.5, 5.2, 5.8, 6.5, 7.0]) # 2. ๋ฐ์ดํฐ๋ฅผ ํ๋ จ ์ธํธ์ ํ ์คํธ ์ธํธ๋ก ๋ถ๋ฆฌ (๋ชจ๋ธ ๊ฒ์ฆ์ ์ํจ) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 3. ์ ํ ํ๊ท ๋ชจ๋ธ ๊ฐ์ฒด ์์ฑ model = LinearRegression() # 4. ๋ชจ๋ธ ํ๋ จ (ํ์ต) model.fit(X_train, y_train) # 5. ํ ์คํธ ๋ฐ์ดํฐ๋ก ์์ธก y_pred = model.predict(X_test) # 6. ๋ชจ๋ธ ํ๊ฐ mse = mean_squared_error(y_test, y_pred) print(f"ํ๊ท ์ ๊ณฑ ์ค์ฐจ (MSE): {mse:.2f}") # ์ถ๋ ฅ: ํ๊ท ์ ๊ณฑ ์ค์ฐจ (MSE): 0.01 # 7. ์์ธก ๊ฒฐ๊ณผ ์๊ฐํ plt.figure(figsize=(8, 6)) plt.scatter(X, y, color='blue', label='์ค์ ๋ฐ์ดํฐ') plt.plot(X, model.predict(X), color='red', linewidth=2, label='ํ๊ท์ ') plt.xlabel('์ง ํฌ๊ธฐ (ํ๋ฐฉ๋ฏธํฐ)') plt.ylabel('์ง ๊ฐ๊ฒฉ (์ต ์)') plt.title('์ง ํฌ๊ธฐ์ ๋ฐ๋ฅธ ๊ฐ๊ฒฉ ์์ธก (์ ํ ํ๊ท)') plt.legend() plt.grid(True) plt.show()
4. ๐ ๋ฅ๋ฌ๋์ ๊ฑฐ์ธ๋ค: TensorFlow/Keras์ PyTorch
์ต๊ทผ ๋ช ๋ ๊ฐ ์ธ๊ณต์ง๋ฅ ๋ถ์ผ์ ํ๋ช ์ ์ด๋๊ณ ์๋ ๋ฅ๋ฌ๋์ ์ด๋ฏธ์ง, ์์ฑ, ํ ์คํธ ๋ฑ ๋น์ ํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์์ ์๋์ ์ธ ์ฑ๋ฅ์ ๋ณด์ฌ์ค๋๋ค. ๋ณต์กํ ์ ๊ฒฝ๋ง์ ๊ตฌ์ถํ๊ณ ํ์ต์ํค๋ ๋ฐ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ฐ๋ก TensorFlow/Keras์ PyTorch์ ๋๋ค.
4.1. ํ ์ํ๋ก์ฐ/์ผ๋ผ์ค(TensorFlow/Keras): ๊ตฌ๊ธ์ ๋ฅ๋ฌ๋ ํ๋ ์์ํฌ ๐
-
๋ฌด์์ธ๊ฐ์? ํ ์ํ๋ก์ฐ(TensorFlow)๋ ๊ตฌ๊ธ์์ ๊ฐ๋ฐํ ์คํ์์ค ๋ฅ๋ฌ๋ ํ๋ ์์ํฌ์ ๋๋ค. ์ ์ฐํ๊ณ ๊ฐ๋ ฅํ ์ ์์ค(low-level) API๋ฅผ ์ ๊ณตํ์ฌ ๋ณต์กํ ์ ๊ฒฝ๋ง ๋ชจ๋ธ์ ๊ตฌ์ถํ๊ณ ํ๋ จํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ํ์ง๋ง ์ด๋ณด์์๊ฒ๋ ๋ค์ ๋ณต์กํ๊ฒ ๋๊ปด์ง ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ณต์ก์ฑ์ ํด๊ฒฐํ๊ธฐ ์ํด ํ ์ํ๋ก์ฐ ์์ ๊ตฌ์ถ๋ ๊ณ ์์ค(high-level) API๊ฐ ๋ฐ๋ก ์ผ๋ผ์ค(Keras)์ ๋๋ค. ์ผ๋ผ์ค๋ ์ง๊ด์ ์ด๊ณ ์ฌ์ฉํ๊ธฐ ์ฌ์ด ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ์ฌ ๋ฅ๋ฌ๋ ๋ชจ๋ธ์ ๋น ๋ฅด๊ณ ์ฝ๊ฒ ๊ตฌํํ ์ ์๊ฒ ํด์ค๋๋ค. ํ์ฌ๋ ํ ์ํ๋ก์ฐ์ ํต์ฌ API๋ก ํตํฉ๋์ด ์์ต๋๋ค.
-
์ ์ค์ํ๊ฐ์? ๋ฅ๋ฌ๋ ๋ถ์ผ์์ ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ํ๋ ์์ํฌ ์ค ํ๋์ ๋๋ค. ๋ฐฉ๋ํ ์ปค๋ฎค๋ํฐ์ ์๋ฃ, ๊ตฌ๊ธ์ ๊ฐ๋ ฅํ ์ง์์ ๋ฐ์ต๋๋ค. ํนํ ํ๋ก๋์ ํ๊ฒฝ์์์ ๋ฐฐํฌ์ ํ์ฅ์ ๊ฐ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด๋ฏธ์ง ์ธ์, ์์ฐ์ด ์ฒ๋ฆฌ ๋ฑ ๋ค์ํ ๋ฅ๋ฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ํ์์ ์ ๋๋ค.
-
์ฃผ์ ๊ธฐ๋ฅ (Keras ๊ธฐ์ค):
- ์ง๊ด์ ์ธ ์ ๊ฒฝ๋ง ๋ชจ๋ธ ์ ์ (Sequential API, Functional API)
- ๋ค์ํ ๋ ์ด์ด (Dense, Convolutional, Recurrent ๋ฑ) ๋ฐ ํ์ฑํ ํจ์
- ์์ค ํจ์(loss function), ์ตํฐ๋ง์ด์ (optimizer), ํ๊ฐ ์งํ
- GPU/TPU ๊ฐ์ ์ง์
-
๊ฐ๋จํ ์์ (์์ฃผ ๊ธฐ๋ณธ์ ์ธ ์ ๊ฒฝ๋ง ๋ชจ๋ธ ์ ์):
import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers # 1. Sequential API๋ฅผ ์ด์ฉํ ๋ชจ๋ธ ์ ์ # ๊ฐ์ฅ ๊ฐ๋จํ ํํ์ ์ ๊ฒฝ๋ง (์ ๋ ฅ -> ์๋์ธต -> ์ถ๋ ฅ) model = keras.Sequential([ layers.Input(shape=(784,)), # ์ ๋ ฅ์ธต: 784๊ฐ์ ํน์ฑ (์: 28x28 ์ด๋ฏธ์ง ํํํ) layers.Dense(128, activation='relu'), # ์ฒซ ๋ฒ์งธ ์๋์ธต: 128๊ฐ์ ๋ด๋ฐ, ReLU ํ์ฑํ ํจ์ layers.Dropout(0.2), # ๊ณผ์ ํฉ ๋ฐฉ์ง๋ฅผ ์ํ ๋๋กญ์์ layers.Dense(10, activation='softmax') # ์ถ๋ ฅ์ธต: 10๊ฐ์ ํด๋์ค (์: 0~9 ์ซ์), Softmax ํ์ฑํ ํจ์ ]) # 2. ๋ชจ๋ธ ์ปดํ์ผ (์์ค ํจ์, ์ตํฐ๋ง์ด์ , ํ๊ฐ ์งํ ์ค์ ) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # 3. ๋ชจ๋ธ ์์ฝ ์ ๋ณด ์ถ๋ ฅ model.summary() # ์ถ๋ ฅ ์์: # Model: "sequential" # _________________________________________________________________ # Layer (type) Output Shape Param # # ================================================================= # dense (Dense) (None, 128) 100480 # _________________________________________________________________ # dropout (Dropout) (None, 128) 0 # _________________________________________________________________ # dense_1 (Dense) (None, 10) 1290 # ================================================================= # Total params: 101,770 # Trainable params: 101,770 # Non-trainable params: 0 # _________________________________________________________________ print("\n๊ฐ๋จํ ๋ฅ๋ฌ๋ ๋ชจ๋ธ์ด ์ ์๋์์ต๋๋ค. ์ค์ ํ์ต์๋ ๋ฐ์ดํฐ๊ฐ ํ์ํฉ๋๋ค.")
4.2. ํ์ดํ ์น(PyTorch): ํ์ด์ค๋ถ์ ์ ์ฐํ ๋ฅ๋ฌ๋ ํ๋ ์์ํฌ ๐ฅ
-
๋ฌด์์ธ๊ฐ์? ํ์ดํ ์น(PyTorch)๋ ํ์ด์ค๋ถ(Meta)์์ ๊ฐ๋ฐํ ์คํ์์ค ๋ฅ๋ฌ๋ ํ๋ ์์ํฌ์ ๋๋ค. ํ ์ํ๋ก์ฐ์ ํจ๊ป ๋ฅ๋ฌ๋ ๋ถ์ผ์ ์๋ ์ฐ๋งฅ์ ์ด๋ฃน๋๋ค. ‘ํ์ด์ฌ์ค๋ฌ์ด(Pythonic)’ ์ค๊ณ๋ก ๋ฐฐ์ฐ๊ธฐ ์ฝ๊ณ , ๋์ ๊ณ์ฐ ๊ทธ๋ํ(dynamic computation graph)๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ์ ๋์ฑ ์ ์ฐํ๊ฒ ๊ตฌ์ถํ๊ณ ๋๋ฒ๊น ํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค. ์ฐ๊ตฌ ๋ฐ ํ๋กํ ํ์ ๊ฐ๋ฐ์ ํนํ ๊ฐ์ ์ ๋ณด์ ๋๋ค.
-
์ ์ค์ํ๊ฐ์? ์ ์ฐ์ฑ๊ณผ ์ฌ์ฉ ํธ์์ฑ ๋๋ถ์ ์ฐ๊ตฌ ์ปค๋ฎค๋ํฐ์ ์คํํธ์ ์์ ๋น ๋ฅด๊ฒ ์ฑํ๋๊ณ ์์ต๋๋ค. ํ ์ํ๋ก์ฐ์ ๋ง์ฐฌ๊ฐ์ง๋ก GPU ๊ฐ์์ ์ง์ํ์ฌ ๋๊ท๋ชจ ๋ฅ๋ฌ๋ ๋ชจ๋ธ ํ์ต์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ํ ์คํธ, ์์ฑ, ์ด๋ฏธ์ง ๋ฑ ๋ค์ํ ๋ฅ๋ฌ๋ ์์ฉ ๋ถ์ผ์์ ํ๋ฐํ ์ฌ์ฉ๋ฉ๋๋ค.
-
์ฃผ์ ๊ธฐ๋ฅ:
- ํ ์(Tensor): NumPy ๋ฐฐ์ด๊ณผ ์ ์ฌํ๋ GPU ๊ฐ์ ์ง์
- Autograd: ์๋ ๋ฏธ๋ถ ๊ธฐ๋ฅ (์ญ์ ํ ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ์ ํ์)
- nn ๋ชจ๋: ์ ๊ฒฝ๋ง ๋ ์ด์ด ๋ฐ ์์ค ํจ์
- optim ๋ชจ๋: ๋ค์ํ ์ต์ ํ ์๊ณ ๋ฆฌ์ฆ
- ๋์ ๊ณ์ฐ ๊ทธ๋ํ: ๋ฐํ์์ ๋ชจ๋ธ ๊ตฌ์กฐ ๋ณ๊ฒฝ ๊ฐ๋ฅ
-
๊ฐ๋จํ ์์ (ํ ์ ์์ฑ ๋ฐ ๊ธฐ๋ณธ ์ฐ์ฐ):
import torch # 1. ํ ์(Tensor) ์์ฑํ๊ธฐ # NumPy ๋ฐฐ์ด๊ณผ ์ ์ฌํ์ง๋ง GPU์์ ์ฐ์ฐ ๊ฐ๋ฅ x = torch.tensor([[1., 2.], [3., 4.]]) print(f"ํ ์ x:\n{x}") # ์ถ๋ ฅ: # ํ ์ x: # tensor([[1., 2.], # [3., 4.]]) # 2. ํ ์์ 5 ๋ํ๊ธฐ y = x + 5 print(f"ํ ์ x์ 5 ๋ํ๊ธฐ:\n{y}") # ์ถ๋ ฅ: # ํ ์ x์ 5 ๋ํ๊ธฐ: # tensor([[6., 7.], # [8., 9.]]) # 3. ํ๋ ฌ ๊ณฑ์ matrix_a = torch.tensor([[1, 2], [3, 4]]) matrix_b = torch.tensor([[5, 6], [7, 8]]) result_matrix = torch.matmul(matrix_a, matrix_b) print(f"ํ๋ ฌ ๊ณฑ์ ๊ฒฐ๊ณผ:\n{result_matrix}") # ์ถ๋ ฅ: # ํ๋ ฌ ๊ณฑ์ ๊ฒฐ๊ณผ: # tensor([[19, 22], # [43, 50]]) # 4. GPU ์ฌ์ฉ ๊ฐ๋ฅ ์ฌ๋ถ ํ์ธ ๋ฐ ํ ์๋ฅผ GPU๋ก ์ด๋ if torch.cuda.is_available(): print("\nGPU ์ฌ์ฉ ๊ฐ๋ฅ!") device = torch.device("cuda") x_gpu = x.to(device) print(f"GPU๋ก ์ด๋๋ ํ ์ x_gpu:\n{x_gpu}") else: print("\nGPU ์ฌ์ฉ ๋ถ๊ฐ๋ฅ. CPU์์ ์คํ๋ฉ๋๋ค.")
5. โจ ๊ทธ ์ธ ์์๋๋ฉด ์ ์ฉํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
์์ ์ธ๊ธ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ด ๋จธ์ ๋ฌ๋์ ‘ํต์ฌ’์ด๋ผ๋ฉด, ์ด์ ์๊ฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ํน์ ์ํฉ์์ ๋งค์ฐ ์ ์ฉํ๊ฒ ์ฐ์ด๊ฑฐ๋, ๋จธ์ ๋ฌ๋ ๊ฐ๋ฐ ํ๊ฒฝ ์์ฒด๋ฅผ ํธ๋ฆฌํ๊ฒ ๋ง๋ค์ด์ฃผ๋ ์ญํ ์ ํฉ๋๋ค.
5.1. ์ฌ์ดํ์ด(SciPy): ๊ณผํ ๊ณ์ฐ์ ์ ๋ฌธ๊ฐ ๐ฌ
-
๋ฌด์์ธ๊ฐ์? ์ฌ์ดํ์ด(SciPy, Scientific Python)๋ ๋ํ์ด ๊ธฐ๋ฐ ์์ ๊ตฌ์ถ๋ ๊ณผํ ๋ฐ ๊ณตํ ๊ณ์ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์งํฉ์ฒด์ ๋๋ค. ์ ํ ๋์, ์ต์ ํ, ์ ํธ ์ฒ๋ฆฌ, ์ด๋ฏธ์ง ์ฒ๋ฆฌ, ํต๊ณ, ํธ๋ฆฌ์ ๋ณํ ๋ฑ ๋ค์ํ ๊ณ ๊ธ ์ํ ๋ฐ ๊ณผํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์ฌ์ดํท๋ฐ์ ์ผ๋ถ ๊ธฐ๋ฅ๋ ๋ด๋ถ์ ์ผ๋ก ์ฌ์ดํ์ด๋ฅผ ํ์ฉํฉ๋๋ค.
-
์ ์ค์ํ๊ฐ์? ์ง์ ์ ์ผ๋ก ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ๊ตฌ์ถํ๋ ๋ฐ ์ฌ์ฉํ๊ธฐ๋ณด๋ค๋, ํต๊ณ ๋ถ์์ด๋ ํน์ ์ข ๋ฅ์ ์ ์ฒ๋ฆฌ, ํน์ ๋ณต์กํ ์ํ์ ์ต์ ํ๊ฐ ํ์ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค. ๋จธ์ ๋ฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ๊น์ ์๋ฆฌ๋ฅผ ์ดํดํ๊ณ ์ถ๊ฑฐ๋, ํน์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ํ์ ๊ธฐ๋ฒ์ ์ ์ฉํด์ผ ํ ๋ ํฐ ๋์์ด ๋ฉ๋๋ค.
-
๊ฐ๋จํ ์์ (์ต์ ํ):
from scipy.optimize import minimize # ์ต์ํํ ํจ์ ์ ์ (์: f(x) = x^2 - 4x + 5) def objective_function(x): return x**2 - 4*x + 5 # ์ด๊ธฐ ์ถ์ ๊ฐ x0 = 0 # ํจ์ ์ต์ํ result = minimize(objective_function, x0) print(f"ํจ์๋ฅผ ์ต์ํํ๋ x ๊ฐ: {result.x[0]:.2f}") # ์ถ๋ ฅ: ํจ์๋ฅผ ์ต์ํํ๋ x ๊ฐ: 2.00 print(f"์ต์๊ฐ: {result.fun:.2f}") # ์ถ๋ ฅ: ์ต์๊ฐ: 1.00
5.2. ์ฃผํผํฐ ๋ ธํธ๋ถ/๋ฉ(Jupyter Notebook/Lab): ๋ํํ ๊ฐ๋ฐ ํ๊ฒฝ ๐
-
๋ฌด์์ธ๊ฐ์? ์ฃผํผํฐ(Jupyter)๋ ํ์ด์ฌ ์ฝ๋๋ฅผ ํฌํจํ์ฌ ๋งํฌ๋ค์ด ํ ์คํธ, ์ด๋ฏธ์ง, ๊ทธ๋ํ ๋ฑ์ ํ๋์ ๋ฌธ์(.ipynb)์ ํตํฉํ์ฌ ์์ฑํ๊ณ ์คํํ ์ ์๋ ์น ๊ธฐ๋ฐ์ ๋ํํ ๊ฐ๋ฐ ํ๊ฒฝ์ ๋๋ค. ์ฃผํผํฐ ๋ ธํธ๋ถ(Jupyter Notebook)์ด ์์กฐ์ด๋ฉฐ, ์ฃผํผํฐ ๋ฉ(Jupyter Lab)์ ๋ ๋ฐ์ ๋ ํํ์ ํตํฉ ๊ฐ๋ฐ ํ๊ฒฝ์ ๋๋ค.
-
์ ์ค์ํ๊ฐ์? ๋จธ์ ๋ฌ๋ ๊ฐ๋ฐ ๊ณผ์ ์์ ๋ฐ์ดํฐ ํ์, ๋ชจ๋ธ ๊ฐ๋ฐ, ๊ฒฐ๊ณผ ์๊ฐํ ๋ฐ ๋ฌธ์ํ์ ์ด๋ฅด๊ธฐ๊น์ง ๋ชจ๋ ๋จ๊ณ๋ฅผ ํ ๊ณณ์์ ํจ์จ์ ์ผ๋ก ์งํํ ์ ์๊ฒ ํด์ค๋๋ค. ์ฝ๋๋ฅผ ํ ์ ์ฉ ์คํํ๋ฉฐ ๊ฒฐ๊ณผ๋ฅผ ์ฆ์ ํ์ธํ๊ณ ์์ ํ ์ ์์ด ๋งค์ฐ ํธ๋ฆฌํฉ๋๋ค. ๊ต์ก ๋ฐ ์ฐ๊ตฌ ๋ถ์ผ์์๋ ์๋์ ์ผ๋ก ๋ง์ด ์ฌ์ฉ๋ฉ๋๋ค.
-
ํ์ฉ ์์:
- ๋ฐ์ดํฐ ๋ก๋ ๋ฐ ์ ์ฒ๋ฆฌ ๊ณผ์ ์ ๊ฐ ๋จ๊ณ๋ฅผ ๊ธฐ๋กํ๊ณ ๊ณต์
- ๋ชจ๋ธ ํ์ต ๊ณผ์ ์ ์ค๊ฐ ๊ฒฐ๊ณผ ๋ฐ ๊ทธ๋ํ ์๊ฐํ
- ๋ชจ๋ธ ์ฑ๋ฅ ํ๊ฐ ๋ฐ ๋ณด๊ณ ์ ์์ฑ
- ์์ด๋์ด๋ฅผ ๋น ๋ฅด๊ฒ ํ๋กํ ํ์ดํํ๊ณ ์คํ
(์ฃผํผํฐ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ๊ธฐ๋ณด๋ค๋ ๊ฐ๋ฐ ํ๊ฒฝ์ด๋ฏ๋ก ๋ณ๋์ ์ฝ๋ ์์ ๋์ ์ค๋ช ์ ์์ฃผ๋ก ์ ๊ณตํฉ๋๋ค.)
๋งบ์๋ง ๐
์ง๊ธ๊น์ง ๋จธ์ ๋ฌ๋์ ์ํ ํ์ ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ํต์ฌ์ ์ธ ๋ด์ฉ๊ณผ ํจ๊ป ์ดํด๋ณด์์ต๋๋ค.
- NumPy์ Pandas๋ก ๋ฐ์ดํฐ๋ฅผ ์์ ์์ฌ๋ก ๋ค๋ฃจ๊ณ ,
- Matplotlib์ Seaborn์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์๋ฆ๋ต๊ฒ ์๊ฐํํ๋ฉฐ,
- Scikit-learn์ผ๋ก ๋ค์ํ ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ์ฝ๊ฒ ๊ตฌ์ถํ๊ณ ,
- TensorFlow/Keras์ PyTorch๋ก ๋ฅ๋ฌ๋์ ๋ณต์กํ ์ธ๊ณ์ ๋์ ํ ์ ์์ต๋๋ค.
์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๊ฐ๊ฐ์ ์ญํ ์ด ๋ช ํํ๋ฉฐ, ์๋ก ์ ๊ธฐ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ๋จธ์ ๋ฌ๋ ํ์ดํ๋ผ์ธ์ ๊ฐ ๋จ๊ณ๋ฅผ ํจ์จ์ ์ผ๋ก ์ํํ ์ ์๊ฒ ๋์์ค๋๋ค.
์ด ๊ธ์ ํตํด ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ฌด์์ด๊ณ ์ ์ค์ํ์ง, ๊ทธ๋ฆฌ๊ณ ์ด๋ป๊ฒ ํ์ฉ๋๋์ง์ ๋ํ ๊ธฐ๋ณธ์ ์ธ ๊ทธ๋ฆผ์ ๊ทธ๋ฆด ์ ์์ผ์ จ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ํ์ง๋ง ์ด๋ก ๋ง์ผ๋ก๋ ๋ถ์กฑํฉ๋๋ค! ๐ ์ง๊ธ ๋ฐ๋ก ํ์ด์ฌ ํ๊ฒฝ์ ์ค์ ํ๊ณ , ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์ง์ ์ค์นํ์ฌ ์์ ์ฝ๋๋ฅผ ์คํํด ๋ณด์ธ์. ์์ ํ๋ก์ ํธ๋ถํฐ ์์ํ์ฌ ์ ์ง์ ์ผ๋ก ๋ณต์กํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ๋๊ฐ๋ฉด์ ์ต์ํด์ง๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ ํ์ต ๋ฐฉ๋ฒ์ ๋๋ค.
๋จธ์ ๋ฌ๋ ํ์ต ์ฌ์ ์ ์ด ๊ธ์ด ํ๋ฅญํ ๋์นจ๋ฐ์ด ๋๊ธฐ๋ฅผ ๋ฐ๋ผ๋ฉฐ, ์ฌ๋ฌ๋ถ์ ๋ฉ์ง ๋ฐ์ดํฐ ๊ณผํ ์ปค๋ฆฌ์ด๋ฅผ ์์ํฉ๋๋ค! ๐ช ๊ถ๊ธํ ์ ์ด ์๋ค๋ฉด ์ธ์ ๋ ์ง ์ง๋ฌธํด ์ฃผ์ธ์! D