KR_ExternalLibrary - somaz94/python-study GitHub Wiki

Python ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ


์†Œ๊ฐœ

ํŒŒ์ด์ฌ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํŒŒ์ด์ฌ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ํฌํ•จ๋˜์ง€ ์•Š์€ ๋ณ„๋„์˜ ํŒจํ‚ค์ง€๋กœ, ํŠน์ • ๊ธฐ๋Šฅ์„ ๋” ํšจ์œจ์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ํŠน์ˆ˜ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์€ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋ฅผ ํ†ตํ•ด ์„ค์น˜ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

โœ… ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ ์ด์ :

  • ๊ฐœ๋ฐœ ์‹œ๊ฐ„ ๋‹จ์ถ• ๋ฐ ์ฝ”๋“œ ์–‘ ๊ฐ์†Œ
  • ์ „๋ฌธ๊ฐ€๋“ค์ด ์ตœ์ ํ™”ํ•œ ์ฝ”๋“œ ํ™œ์šฉ ๊ฐ€๋Šฅ
  • ํŠน์ˆ˜ ๋ถ„์•ผ(๋ฐ์ดํ„ฐ ๊ณผํ•™, ์›น ๊ฐœ๋ฐœ ๋“ฑ)์˜ ๋ณต์žกํ•œ ๊ธฐ๋Šฅ ์‰ฝ๊ฒŒ ๊ตฌํ˜„
  • ์ปค๋ฎค๋‹ˆํ‹ฐ ์ง€์›๊ณผ ์ง€์†์ ์ธ ๊ฐœ์„ 


1๏ธโƒฃ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž

pip

ํŒŒ์ด์ฌ์˜ ๊ธฐ๋ณธ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋กœ, ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋„๊ตฌ๋‹ค.

# ํŒจํ‚ค์ง€ ์„ค์น˜
pip install package_name

# ํŠน์ • ๋ฒ„์ „ ์„ค์น˜
pip install package_name==1.0.4

# ๋ฒ„์ „ ๋ฒ”์œ„ ์ง€์ •
pip install "package_name>=1.0.0,<2.0.0"

# ํŒจํ‚ค์ง€ ์ œ๊ฑฐ
pip uninstall package_name

# ํŒจํ‚ค์ง€ ์—…๊ทธ๋ ˆ์ด๋“œ
pip install --upgrade package_name

# ์„ค์น˜๋œ ํŒจํ‚ค์ง€ ๋ชฉ๋ก
pip list

# ํŒจํ‚ค์ง€ ์ •๋ณด ํ™•์ธ
pip show package_name

# requirements.txt์—์„œ ์ผ๊ด„ ์„ค์น˜
pip install -r requirements.txt

โœ… pip ๊ณ ๊ธ‰ ํ™œ์šฉ๋ฒ•:

  • ์บ์‹œ ์‚ฌ์šฉ: pip install --cache-dir ./pip-cache package_name
  • ํŠน์ • ์ธ๋ฑ์Šค ์‚ฌ์šฉ: pip install -i https://pypi.org/simple/ package_name
  • ์˜์กด์„ฑ ๋‹ค์ด์–ด๊ทธ๋žจ: pip install pipdeptree ํ›„ pipdeptree ์‹คํ–‰
  • pip ์ž์ฒด ์—…๊ทธ๋ ˆ์ด๋“œ: python -m pip install --upgrade pip
  • ํœ  ํŒจํ‚ค์ง€ ์„ค์น˜ ์šฐ์„ : pip install --prefer-binary package_name

virtualenv์™€ venv

ํ”„๋กœ์ ํŠธ๋ณ„ ๊ฒฉ๋ฆฌ๋œ ํŒŒ์ด์ฌ ํ™˜๊ฒฝ์„ ๋งŒ๋“ค์–ด ์˜์กด์„ฑ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•œ๋‹ค.

# ๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑ (virtualenv ์‚ฌ์šฉ)
pip install virtualenv  # ๋จผ์ € virtualenv ์„ค์น˜
virtualenv venv_name    # ๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑ

# ๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑ (Python ๋‚ด์žฅ venv ๋ชจ๋“ˆ ์‚ฌ์šฉ)
python -m venv venv_name

# ๊ฐ€์ƒํ™˜๊ฒฝ ํ™œ์„ฑํ™” (Linux/Mac)
source venv_name/bin/activate

# ๊ฐ€์ƒํ™˜๊ฒฝ ํ™œ์„ฑํ™” (Windows)
venv_name\Scripts\activate

# ๊ฐ€์ƒํ™˜๊ฒฝ ๋น„ํ™œ์„ฑํ™”
deactivate

# ํ˜„์žฌ ๊ฐ€์ƒํ™˜๊ฒฝ์˜ ํŒจํ‚ค์ง€ ๋ชฉ๋ก ์ €์žฅ
pip freeze > requirements.txt

โœ… ๊ฐ€์ƒํ™˜๊ฒฝ ๋ชจ๋ฒ” ์‚ฌ๋ก€:

  • ํ”„๋กœ์ ํŠธ๋ณ„๋กœ ๋ณ„๋„์˜ ๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑ
  • ๊ฐœ๋ฐœ/ํ…Œ์ŠคํŠธ/๋ฐฐํฌ ํ™˜๊ฒฝ ๋™์ผํ•˜๊ฒŒ ๊ตฌ์„ฑ
  • requirements.txt๋กœ ์˜์กด์„ฑ ๋ช…์‹œ
  • ๊ณต์œ  ์‹œ ๊ฐ€์ƒํ™˜๊ฒฝ ํด๋”(.venv, venv ๋“ฑ)๋Š” gitignore์— ์ถ”๊ฐ€
  • ๊ฐ€์ƒํ™˜๊ฒฝ ๊ฒฝ๋กœ์— ๊ณต๋ฐฑ์ด๋‚˜ ํŠน์ˆ˜๋ฌธ์ž ํ”ผํ•˜๊ธฐ

conda

๋ฐ์ดํ„ฐ ๊ณผํ•™ ๋ถ„์•ผ์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ํŒจํ‚ค์ง€ ๋ฐ ํ™˜๊ฒฝ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์ด๋‹ค.

# ํŒจํ‚ค์ง€ ์„ค์น˜
conda install package_name

# ํŠน์ • ์ฑ„๋„์—์„œ ์„ค์น˜
conda install -c conda-forge package_name

# ํ™˜๊ฒฝ ์ƒ์„ฑ
conda create -n env_name python=3.9

# ํ™˜๊ฒฝ ํ™œ์„ฑํ™”
conda activate env_name

# ํ™˜๊ฒฝ ๋น„ํ™œ์„ฑํ™”
conda deactivate

# ์„ค์น˜๋œ ํŒจํ‚ค์ง€ ๋ชฉ๋ก
conda list

# ํ™˜๊ฒฝ ๋‚ด๋ณด๋‚ด๊ธฐ
conda env export > environment.yml

# ํ™˜๊ฒฝ ๊ฐ€์ ธ์˜ค๊ธฐ
conda env create -f environment.yml

โœ… conda์˜ ์žฅ์ :

  • ํŒŒ์ด์ฌ ํŒจํ‚ค์ง€๋ฟ ์•„๋‹ˆ๋ผ C/C++ ๋“ฑ ๋น„-ํŒŒ์ด์ฌ ์˜์กด์„ฑ๋„ ๊ด€๋ฆฌ
  • ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒจํ‚ค์ง€ ์ œ๊ณต์œผ๋กœ ์ปดํŒŒ์ผ ๋ฌธ์ œ ๊ฐ์†Œ
  • ํ™˜๊ฒฝ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์ด ํ†ตํ•ฉ๋˜์–ด ์žˆ์Œ
  • ๊ณผํ•™ ๊ณ„์‚ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ตœ์ ํ™”

poetry

ํ˜„๋Œ€์ ์ธ Python ํŒจํ‚ค์ง€ ๋ฐ ์˜์กด์„ฑ ๊ด€๋ฆฌ ๋„๊ตฌ๋‹ค.

# Poetry ์„ค์น˜
pip install poetry

# ์ƒˆ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ
poetry new project-name

# ๊ธฐ์กด ํ”„๋กœ์ ํŠธ์— Poetry ์ถ”๊ฐ€
cd project-name
poetry init

# ํŒจํ‚ค์ง€ ์ถ”๊ฐ€
poetry add package-name
poetry add package-name==1.0.0
poetry add package-name@^2.0.0

# ๊ฐœ๋ฐœ ์˜์กด์„ฑ ์ถ”๊ฐ€
poetry add --dev pytest

# ์˜์กด์„ฑ ์„ค์น˜
poetry install

# ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰
poetry run python script.py

# ๊ฐ€์ƒํ™˜๊ฒฝ ์‰˜ ์ง„์ž…
poetry shell

โœ… Poetry ํŠน์ง•:

  • ์˜์กด์„ฑ ํ•ด๊ฒฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐœ์„ 
  • ๋ฝ ํŒŒ์ผ๋กœ ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ํ™˜๊ฒฝ ๋ณด์žฅ
  • ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ๊ณผ ํŒจํ‚ค์ง€ ๊ฒŒ์‹œ ๊ธฐ๋Šฅ ํ†ตํ•ฉ
  • pyproject.toml์„ ์‚ฌ์šฉํ•œ ํ˜„๋Œ€์  ํŒจํ‚ค์ง€ ๊ตฌ์„ฑ

2๏ธโƒฃ ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋ฐ ๊ณผํ•™ ๊ณ„์‚ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

NumPy

import numpy as np

# ๋ฐฐ์—ด ์ƒ์„ฑ
arr = np.array([1, 2, 3, 4, 5])
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# ํŠน์ˆ˜ ๋ฐฐ์—ด ์ƒ์„ฑ
zeros = np.zeros((3, 4))      # 0์œผ๋กœ ์ฑ„์›Œ์ง„ 3x4 ๋ฐฐ์—ด
ones = np.ones((2, 3))        # 1๋กœ ์ฑ„์›Œ์ง„ 2x3 ๋ฐฐ์—ด
rng = np.arange(0, 10, 0.5)   # 0๋ถ€ํ„ฐ 10๊นŒ์ง€ 0.5 ๊ฐ„๊ฒฉ ๋ฐฐ์—ด
linsp = np.linspace(0, 1, 5)  # 0๋ถ€ํ„ฐ 1๊นŒ์ง€ 5๊ฐœ ๊ท ๋“ฑ ๋ถ„ํ•  ๋ฐฐ์—ด
rand = np.random.random((2, 2))  # 0~1 ์‚ฌ์ด ๋‚œ์ˆ˜ 2x2 ๋ฐฐ์—ด

# ๋ฐฐ์—ด ์—ฐ์‚ฐ (์š”์†Œ๋ณ„)
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(a + b)         # [5, 7, 9]
print(a * b)         # [4, 10, 18]
print(a ** 2)        # [1, 4, 9]
print(np.sin(a))     # ์‚ฌ์ธ ํ•จ์ˆ˜ ์ ์šฉ

# ํ–‰๋ ฌ ์—ฐ์‚ฐ
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
print(np.dot(a, b))  # ํ–‰๋ ฌ ๊ณฑ
print(a @ b)         # ํ–‰๋ ฌ ๊ณฑ (Python 3.5+)
print(np.linalg.inv(a))  # ์—ญํ–‰๋ ฌ
print(np.linalg.det(a))  # ํ–‰๋ ฌ์‹

# ํ†ต๊ณ„ ํ•จ์ˆ˜
data = np.array([1, 2, 3, 4, 5])
print(np.mean(data))    # ํ‰๊ท 
print(np.median(data))  # ์ค‘์•™๊ฐ’
print(np.std(data))     # ํ‘œ์ค€ํŽธ์ฐจ
print(np.var(data))     # ๋ถ„์‚ฐ
print(np.max(data))     # ์ตœ๋Œ“๊ฐ’
print(np.min(data))     # ์ตœ์†Ÿ๊ฐ’
print(np.sum(data))     # ํ•ฉ๊ณ„

# ์ฐจ์› ์กฐ์ž‘
arr = np.array([1, 2, 3, 4, 5, 6])
arr_reshaped = arr.reshape(2, 3)  # 2x3 ํ–‰๋ ฌ๋กœ ์žฌ๊ตฌ์„ฑ
arr_transposed = arr_reshaped.T  # ์ „์น˜

โœ… NumPy ํŠน์ง• ๋ฐ ์žฅ์ :

  • ๋‹ค์ฐจ์› ๋ฐฐ์—ด ๊ฐ์ฒด๋กœ ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ
  • ๋น ๋ฅธ ๋ฐฐ์—ด ์—ฐ์‚ฐ๊ณผ ๋ธŒ๋กœ๋“œ์บ์ŠคํŒ… ๊ธฐ๋Šฅ
  • ์„ ํ˜•๋Œ€์ˆ˜, ํ‘ธ๋ฆฌ์— ๋ณ€ํ™˜ ๋“ฑ ์ˆ˜ํ•™ ํ•จ์ˆ˜ ์ œ๊ณต
  • C/C++๋กœ ๊ตฌํ˜„๋˜์–ด ํŒŒ์ด์ฌ๋ณด๋‹ค ๋น ๋ฅธ ์„ฑ๋Šฅ
  • ๋งŽ์€ ๊ณผํ•™ ๊ณ„์‚ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ธฐ๋ฐ˜

pandas

import pandas as pd
import numpy as np

# Series ์ƒ์„ฑ (1์ฐจ์› ๋ฐ์ดํ„ฐ)
s = pd.Series([1, 3, 5, np.nan, 6, 8])
print(s)

# DataFrame ์ƒ์„ฑ (2์ฐจ์› ๋ฐ์ดํ„ฐ)
dates = pd.date_range('20230101', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
print(df)

# ๋”•์…”๋„ˆ๋ฆฌ๋กœ๋ถ€ํ„ฐ DataFrame ์ƒ์„ฑ
data = {
    '์ด๋ฆ„': ['๊น€์ฒ ์ˆ˜', '์ด์˜ํฌ', '๋ฐ•์ง€๋ฏผ'],
    '๋‚˜์ด': [25, 28, 22],
    '์„ฑ๋ณ„': ['๋‚จ', '์—ฌ', '๋‚จ']
}
df = pd.DataFrame(data)
print(df)

# ํŒŒ์ผ ์ฝ๊ณ  ์“ฐ๊ธฐ
# df.to_csv('data.csv')                   # CSV ํŒŒ์ผ๋กœ ์ €์žฅ
# df.to_excel('data.xlsx', sheet_name='Sheet1')  # Excel ํŒŒ์ผ๋กœ ์ €์žฅ
# csv_df = pd.read_csv('data.csv')        # CSV ํŒŒ์ผ ์ฝ๊ธฐ
# excel_df = pd.read_excel('data.xlsx')   # Excel ํŒŒ์ผ ์ฝ๊ธฐ

# ๋ฐ์ดํ„ฐ ์กฐํšŒ
print(df.head(2))      # ์ฒ˜์Œ 2ํ–‰
print(df.tail(2))      # ๋งˆ์ง€๋ง‰ 2ํ–‰
print(df['์ด๋ฆ„'])      # ํŠน์ • ์—ด ์„ ํƒ
print(df[0:2])         # ํ–‰ ์Šฌ๋ผ์ด์‹ฑ
print(df.loc[0])       # ํŠน์ • ํ–‰ ์„ ํƒ (๋ ˆ์ด๋ธ” ๊ธฐ์ค€)
print(df.iloc[1:3, 0:2])  # ํ–‰/์—ด ์Šฌ๋ผ์ด์‹ฑ (์œ„์น˜ ๊ธฐ์ค€)

# ๋ฐ์ดํ„ฐ ํ•„ํ„ฐ๋ง
print(df[df['๋‚˜์ด'] > 25])    # ์กฐ๊ฑด์— ๋งž๋Š” ํ–‰ ์„ ํƒ
print(df[(df['๋‚˜์ด'] > 22) & (df['์„ฑ๋ณ„'] == '๋‚จ')])  # ๋ณตํ•ฉ ์กฐ๊ฑด

# ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ
df['์ถœ์ƒ๋…„๋„'] = 2023 - df['๋‚˜์ด']  # ์ƒˆ ์—ด ์ถ”๊ฐ€
df = df.drop(columns=['์ถœ์ƒ๋…„๋„'])  # ์—ด ์‚ญ์ œ
df = df.rename(columns={'๋‚˜์ด': '์—ฐ๋ น'})  # ์—ด ์ด๋ฆ„ ๋ณ€๊ฒฝ
df['์—ฐ๋ น'] = df['์—ฐ๋ น'] + 1   # ๊ฐ’ ์ˆ˜์ •

# ๊ทธ๋ฃนํ™” ๋ฐ ์ง‘๊ณ„
grouped = df.groupby('์„ฑ๋ณ„')
print(grouped['์—ฐ๋ น'].mean())   # ์„ฑ๋ณ„ ๊ธฐ์ค€ ํ‰๊ท  ์—ฐ๋ น
print(grouped.size())           # ์„ฑ๋ณ„ ๊ธฐ์ค€ ๊ฐœ์ˆ˜

# ๊ฒฐ์ธก์น˜ ์ฒ˜๋ฆฌ
df_with_na = df.copy()
df_with_na.loc[1, '์—ฐ๋ น'] = None
print(df_with_na.isna().sum())   # ์—ด๋ณ„ ๊ฒฐ์ธก์น˜ ๊ฐœ์ˆ˜
df_filled = df_with_na.fillna(0)  # ๊ฒฐ์ธก์น˜ 0์œผ๋กœ ์ฑ„์šฐ๊ธฐ
df_dropped = df_with_na.dropna()  # ๊ฒฐ์ธก์น˜ ์žˆ๋Š” ํ–‰ ์‚ญ์ œ

โœ… pandas ํ•ต์‹ฌ ๊ธฐ๋Šฅ:

  • ๋ฐ์ดํ„ฐ ์ •์ œ ๋ฐ ์ „์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ ์ œ๊ณต
  • SQL๊ณผ ์œ ์‚ฌํ•œ ๋ฐ์ดํ„ฐ ์กฐ์ž‘ ๊ธฐ๋Šฅ
  • ๋‹ค์–‘ํ•œ ํŒŒ์ผ ํ˜•์‹ ์ž…์ถœ๋ ฅ ์ง€์›
  • ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ํŠนํ™” ๊ธฐ๋Šฅ
  • ๊ฒฐ์ธก์น˜, ์ด์ƒ์น˜ ์ฒ˜๋ฆฌ ๋ฐ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ ๋„๊ตฌ

matplotlib

import matplotlib.pyplot as plt
import numpy as np

# ๊ธฐ๋ณธ ์„  ๊ทธ๋ž˜ํ”„
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.figure(figsize=(10, 6))
plt.plot(x, y, label='sin(x)')
plt.title('์‚ฌ์ธ ํ•จ์ˆ˜ ๊ทธ๋ž˜ํ”„')
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.grid(True)
plt.legend()
# plt.savefig('sin_graph.png')  # ์ด๋ฏธ์ง€๋กœ ์ €์žฅ
# plt.show()

# ์—ฌ๋Ÿฌ ๊ทธ๋ž˜ํ”„ ๊ทธ๋ฆฌ๊ธฐ
plt.figure(figsize=(10, 6))
plt.plot(x, np.sin(x), 'b-', label='sin(x)')  # ํŒŒ๋ž€์ƒ‰ ์‹ค์„ 
plt.plot(x, np.cos(x), 'r--', label='cos(x)')  # ๋นจ๊ฐ„์ƒ‰ ์ ์„ 
plt.title('์‚ผ๊ฐํ•จ์ˆ˜ ๊ทธ๋ž˜ํ”„')
plt.legend()
# plt.show()

# ์„œ๋ธŒํ”Œ๋กฏ (์—ฌ๋Ÿฌ ๊ทธ๋ž˜ํ”„ ๋ฐฐ์น˜)
plt.figure(figsize=(12, 8))

plt.subplot(2, 2, 1)  # 2x2 ๊ทธ๋ฆฌ๋“œ์˜ ์ฒซ ๋ฒˆ์งธ
plt.plot(x, np.sin(x))
plt.title('sin(x)')

plt.subplot(2, 2, 2)  # 2x2 ๊ทธ๋ฆฌ๋“œ์˜ ๋‘ ๋ฒˆ์งธ
plt.plot(x, np.cos(x))
plt.title('cos(x)')

plt.subplot(2, 2, 3)  # 2x2 ๊ทธ๋ฆฌ๋“œ์˜ ์„ธ ๋ฒˆ์งธ
plt.plot(x, np.sin(2*x))
plt.title('sin(2x)')

plt.subplot(2, 2, 4)  # 2x2 ๊ทธ๋ฆฌ๋“œ์˜ ๋„ค ๋ฒˆ์งธ
plt.plot(x, np.cos(2*x))
plt.title('cos(2x)')

plt.tight_layout()  # ๋ ˆ์ด์•„์›ƒ ์ž๋™ ์กฐ์ •
# plt.show()

# ๋‹ค์–‘ํ•œ ์ฐจํŠธ ์œ ํ˜•
plt.figure(figsize=(15, 10))

# ๋ง‰๋Œ€ ๊ทธ๋ž˜ํ”„
plt.subplot(2, 3, 1)
categories = ['A', 'B', 'C', 'D']
values = [3, 7, 2, 5]
plt.bar(categories, values)
plt.title('๋ง‰๋Œ€ ๊ทธ๋ž˜ํ”„')

# ์ˆ˜ํ‰ ๋ง‰๋Œ€ ๊ทธ๋ž˜ํ”„
plt.subplot(2, 3, 2)
plt.barh(categories, values)
plt.title('์ˆ˜ํ‰ ๋ง‰๋Œ€ ๊ทธ๋ž˜ํ”„')

# ์‚ฐ์ ๋„
plt.subplot(2, 3, 3)
x = np.random.rand(50)
y = np.random.rand(50)
colors = np.random.rand(50)
sizes = 1000 * np.random.rand(50)
plt.scatter(x, y, c=colors, s=sizes, alpha=0.5)
plt.title('์‚ฐ์ ๋„')

# ํžˆ์Šคํ† ๊ทธ๋žจ
plt.subplot(2, 3, 4)
data = np.random.randn(1000)
plt.hist(data, bins=30)
plt.title('ํžˆ์Šคํ† ๊ทธ๋žจ')

# ํŒŒ์ด ์ฐจํŠธ
plt.subplot(2, 3, 5)
plt.pie(values, labels=categories, autopct='%1.1f%%')
plt.title('ํŒŒ์ด ์ฐจํŠธ')

# ๋ฐ•์Šค ํ”Œ๋กฏ
plt.subplot(2, 3, 6)
data = [np.random.normal(0, std, 100) for std in range(1, 5)]
plt.boxplot(data)
plt.title('๋ฐ•์Šค ํ”Œ๋กฏ')

plt.tight_layout()
# plt.show()

โœ… matplotlib ๊ธฐ๋Šฅ:

  • ๋‹ค์–‘ํ•œ ์ฐจํŠธ ๋ฐ ์‹œ๊ฐํ™” ์ƒ์„ฑ
  • ์„ธ๋ถ€์ ์ธ ์Šคํƒ€์ผ ๋ฐ ๋ ˆ์ด์•„์›ƒ ์ œ์–ด
  • ๊ณ ํ’ˆ์งˆ ์ถœํŒ๋ฌผ ์ˆ˜์ค€์˜ ๊ทธ๋ž˜ํ”ฝ ์ œ์ž‘
  • ๋‹ค์–‘ํ•œ ์ถœ๋ ฅ ํ˜•์‹(PNG, PDF, SVG ๋“ฑ) ์ง€์›
  • Pandas, NumPy์™€ ์ž˜ ํ†ตํ•ฉ๋จ

seaborn

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

# ํ…Œ๋งˆ ์„ค์ •
sns.set_theme(style="whitegrid")  # ์Šคํƒ€์ผ ์„ค์ •

# ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ
tips = sns.load_dataset('tips')  # seaborn ๋‚ด์žฅ ๋ฐ์ดํ„ฐ
iris = sns.load_dataset('iris')  # ๋‹ค๋ฅธ ๋‚ด์žฅ ๋ฐ์ดํ„ฐ

# ๊ธฐ๋ณธ ๊ทธ๋ž˜ํ”„
plt.figure(figsize=(15, 10))

# ๋ง‰๋Œ€ ๊ทธ๋ž˜ํ”„ (์นด์šดํŠธํ”Œ๋กฏ)
plt.subplot(2, 3, 1)
sns.countplot(x='day', data=tips)
plt.title('์š”์ผ๋ณ„ ์†๋‹˜ ์ˆ˜')

# ์‚ฐ์ ๋„ (์Šค์บํ„ฐํ”Œ๋กฏ)
plt.subplot(2, 3, 2)
sns.scatterplot(x='total_bill', y='tip', hue='time', data=tips)
plt.title('๊ณ„์‚ฐ์„œ์™€ ํŒ์˜ ๊ด€๊ณ„')

# ํšŒ๊ท€์„  ํฌํ•จ ์‚ฐ์ ๋„
plt.subplot(2, 3, 3)
sns.regplot(x='total_bill', y='tip', data=tips)
plt.title('ํšŒ๊ท€์„  ํฌํ•จ ์‚ฐ์ ๋„')

# ๋‹ค๋ณ€๋Ÿ‰ ์‚ฐ์ ๋„ ๋งคํŠธ๋ฆญ์Šค
plt.figure(figsize=(10, 8))
sns.pairplot(iris, hue='species')
plt.suptitle('๋ถ“๊ฝƒ ๋ฐ์ดํ„ฐ ๋‹ค๋ณ€๋Ÿ‰ ๋ถ„์„', y=1.02)
# plt.show()

# ํžˆํŠธ๋งต
plt.figure(figsize=(10, 8))
corr = iris.drop('species', axis=1).corr()
sns.heatmap(corr, annot=True, cmap='coolwarm')
plt.title('์ƒ๊ด€๊ด€๊ณ„ ํžˆํŠธ๋งต')
# plt.show()

# ๋ฐ”์ด์˜ฌ๋ฆฐ ํ”Œ๋กฏ
plt.figure(figsize=(12, 6))
sns.violinplot(x='day', y='total_bill', hue='sex', data=tips, split=True)
plt.title('์š”์ผ๋ณ„ ๊ณ„์‚ฐ์„œ ๊ธˆ์•ก ๋ถ„ํฌ (์„ฑ๋ณ„ ๊ตฌ๋ถ„)')
# plt.show()

# ๋ถ„ํฌ๋„ ํ”Œ๋กฏ
plt.figure(figsize=(12, 6))
sns.kdeplot(data=tips, x='total_bill', hue='time', fill=True, common_norm=False)
plt.title('์‹œ๊ฐ„๋Œ€๋ณ„ ๊ณ„์‚ฐ์„œ ๊ธˆ์•ก ๋ถ„ํฌ')
# plt.show()

โœ… seaborn ์žฅ์ :

  • matplotlib๋ณด๋‹ค ๋” ๋ฏธํ•™์ ์ด๊ณ  ํ†ต๊ณ„์ ์ธ ์‹œ๊ฐํ™”
  • ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„ ๊ธฐ๋ฐ˜ ์ง๊ด€์ ์ธ API
  • ๋ณต์žกํ•œ ์‹œ๊ฐํ™”๋ฅผ ๊ฐ„๋‹จํžˆ ์ƒ์„ฑ
  • ๋‹ค๋ณ€๋Ÿ‰ ๋ฐ์ดํ„ฐ ํƒ์ƒ‰์— ์ตœ์ ํ™”
  • ํ†ต๊ณ„์  ๊ด€๊ณ„ ํƒ์ƒ‰์„ ์œ„ํ•œ ํŠนํ™” ๊ธฐ๋Šฅ

3๏ธโƒฃ ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

Faker

from faker import Faker

# ๋‹ค์–‘ํ•œ ์–ธ์–ด ์ง€์›
fake_ko = Faker('ko_KR')    # ํ•œ๊ตญ์–ด
fake_en = Faker('en_US')    # ์˜์–ด(๋ฏธ๊ตญ)
fake_jp = Faker('ja_JP')    # ์ผ๋ณธ์–ด

# ์‹œ๋“œ ์„ค์ • (์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ)
Faker.seed(1234)
fake = Faker('ko_KR')

# ๊ฐœ์ธ ์ •๋ณด ์ƒ์„ฑ
print(fake.name())           # ์ด๋ฆ„
print(fake.address())        # ์ฃผ์†Œ
print(fake.postcode())       # ์šฐํŽธ๋ฒˆํ˜ธ
print(fake.phone_number())   # ์ „ํ™”๋ฒˆํ˜ธ
print(fake.email())          # ์ด๋ฉ”์ผ
print(fake.company())        # ํšŒ์‚ฌ๋ช…
print(fake.job())            # ์ง์—…

# ์ธํ„ฐ๋„ท ๊ด€๋ จ ๋ฐ์ดํ„ฐ
print(fake.user_name())      # ์‚ฌ์šฉ์ž ์ด๋ฆ„
print(fake.password())       # ๋น„๋ฐ€๋ฒˆํ˜ธ
print(fake.ipv4())           # IPv4 ์ฃผ์†Œ
print(fake.url())            # URL
print(fake.user_agent())     # ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ

# ๋‚ ์งœ/์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ
print(fake.date_of_birth(minimum_age=20, maximum_age=80))  # ์ƒ๋…„์›”์ผ
print(fake.date_this_decade())       # ์ด๋ฒˆ 10๋…„ ๋‚ด ๋‚ ์งœ
print(fake.future_date())            # ๋ฏธ๋ž˜ ๋‚ ์งœ
print(fake.time())                   # ์‹œ๊ฐ„

# ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ
print(fake.text(max_nb_chars=200))   # ํ…์ŠคํŠธ ์ƒ์„ฑ
print(fake.paragraph())              # ๋ฌธ๋‹จ ์ƒ์„ฑ
print(fake.sentence())               # ๋ฌธ์žฅ ์ƒ์„ฑ

# ์ปค์Šคํ…€ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ๊ธฐ
from faker.providers import BaseProvider

class MyProvider(BaseProvider):
    def korean_food(self):
        foods = ['๊น€์น˜์ฐŒ๊ฐœ', '๋œ์žฅ์ฐŒ๊ฐœ', '๋น„๋น”๋ฐฅ', '๋ถˆ๊ณ ๊ธฐ', '๊น€๋ฐฅ', '๋–ก๋ณถ์ด', '์‚ผ๊ฒน์‚ด']
        return self.random_element(foods)

# ํ”„๋กœ๋ฐ”์ด๋” ์ถ”๊ฐ€
fake.add_provider(MyProvider)
print(fake.korean_food())

# ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ ์˜ˆ์ œ
users = [
    {
        'id': i,
        'name': fake.name(),
        'email': fake.email(),
        'address': fake.address(),
        'phone': fake.phone_number(),
        'join_date': fake.date_this_year()
    }
    for i in range(1, 51)  # 50๋ช… ๋ฐ์ดํ„ฐ ์ƒ์„ฑ
]

โœ… Faker ํ™œ์šฉ ๋ถ„์•ผ:

  • ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ
  • ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ ์‹ค์ œ๊ฐ™์€ ๋ฐ์ดํ„ฐ ์‚ฌ์šฉ
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ๋“œ ๋ฐ์ดํ„ฐ ์ค€๋น„
  • ๋ฐ์ดํ„ฐ ์ต๋ช…ํ™”
  • ๋‹ค๊ตญ์–ด ์ง€์›์œผ๋กœ ๋‹ค์–‘ํ•œ ์ง€์—ญ์˜ ๋ฐ์ดํ„ฐ ํ˜•์‹ ์ œ๊ณต

SymPy

import sympy as sp

# ๊ธฐ๋ณธ ๋Œ€์ˆ˜ ์—ฐ์‚ฐ
x, y, z = sp.symbols('x y z')  # ๊ธฐํ˜ธ ๋ณ€์ˆ˜ ์ •์˜
expr = x**2 + 2*x*y + y**2
print(expr)

# ์‹ ์ „๊ฐœ ๋ฐ ์ธ์ˆ˜๋ถ„ํ•ด
expanded = sp.expand((x + y)**3)
print(expanded)
factored = sp.factor(x**3 - y**3)
print(factored)

# ๋ฐฉ์ •์‹ ํ’€๊ธฐ
eq1 = sp.Eq(x**2, 4)  # x^2 = 4
solution = sp.solve(eq1, x)
print(solution)  # [-2, 2]

# ์—ฐ๋ฆฝ๋ฐฉ์ •์‹
eq1 = sp.Eq(x + y, 6)
eq2 = sp.Eq(x - y, 4)
solution = sp.solve((eq1, eq2), (x, y))
print(solution)  # {x: 5, y: 1}

# ํ–‰๋ ฌ ์—ฐ์‚ฐ
A = sp.Matrix([[1, 2], [3, 4]])
B = sp.Matrix([[5, 6], [7, 8]])
print(A + B)  # ํ–‰๋ ฌ ๋ง์…ˆ
print(A * B)  # ํ–‰๋ ฌ ๊ณฑ์…ˆ
print(A.det())  # ํ–‰๋ ฌ์‹
print(A.inv())  # ์—ญํ–‰๋ ฌ
print(A.eigenvals())  # ๊ณ ์œ ๊ฐ’

# ๋ฏธ๋ถ„
f = x**3 + 2*x**2 - 5*x + 3
derivative = sp.diff(f, x)
print(derivative)  # 3*x^2 + 4*x - 5

# ๋ถ€๋ถ„ ๋ฏธ๋ถ„
f_multi = x**2 * y + y**2 * z
df_dx = sp.diff(f_multi, x)
df_dy = sp.diff(f_multi, y)
print(df_dx)  # 2*x*y
print(df_dy)  # x^2 + 2*y*z

# ์ ๋ถ„
integral = sp.integrate(x**2, x)
print(integral)  # x^3/3

# ์ •์ ๋ถ„
def_integral = sp.integrate(x**2, (x, 0, 1))
print(def_integral)  # 1/3

# ๊ทนํ•œ
limit_expr = sp.limit((sp.sin(x))/x, x, 0)
print(limit_expr)  # 1

# ๊ธ‰์ˆ˜ ์ „๊ฐœ
series = sp.series(sp.exp(x), x, 0, 5)
print(series)  # ํ…Œ์ผ๋Ÿฌ ๊ธ‰์ˆ˜ ์ „๊ฐœ

# ๋ผํ”Œ๋ผ์Šค ๋ณ€ํ™˜
t = sp.symbols('t', positive=True)
s = sp.symbols('s')
f_t = t**2
F_s = sp.laplace_transform(f_t, t, s)
print(F_s)  # (2/s^3, s, True)

# ๋ฏธ๋ถ„๋ฐฉ์ •์‹ ํ’€๊ธฐ
f = sp.Function('f')
diffeq = sp.Eq(f(x).diff(x, 2) + f(x), 0)
solution = sp.dsolve(diffeq, f(x))
print(solution)

โœ… SymPy ํ•ต์‹ฌ ํŠน์ง•:

  • ๊ธฐํ˜ธ ์ˆ˜ํ•™ ์—ฐ์‚ฐ์„ ์œ„ํ•œ ํฌ๊ด„์ ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • ๋ฐฉ์ •์‹, ๋ฏธ๋ถ„, ์ ๋ถ„, ํ–‰๋ ฌ ๋“ฑ ๋‹ค์–‘ํ•œ ์ˆ˜ํ•™ ๊ธฐ๋Šฅ
  • ์ˆ˜์‹์˜ ์ •ํ™•ํ•œ ํ•ด ๊ณ„์‚ฐ (๊ทผ์‚ฌ์น˜๊ฐ€ ์•„๋‹Œ)
  • LaTeX ์ถœ๋ ฅ ์ง€์›์œผ๋กœ ์ˆ˜ํ•™ ๋ฌธ์„œ ์ž‘์„ฑ์— ์œ ์šฉ
  • ์œ ์šฉํ•œ ๊ฒฐ๊ณผ ๋‹จ์ˆœํ™” ๋ฐ ๋ณ€ํ™˜ ๊ธฐ๋Šฅ

4๏ธโƒฃ ์›น ๊ฐœ๋ฐœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

requests

import requests

# ๊ธฐ๋ณธ GET ์š”์ฒญ
response = requests.get('https://api.github.com/events')
print(response.status_code)    # ์ƒํƒœ ์ฝ”๋“œ (200, 404 ๋“ฑ)
print(response.headers)        # ์‘๋‹ต ํ—ค๋”
print(response.encoding)       # ์ธ์ฝ”๋”ฉ
print(response.text[:100])     # ์‘๋‹ต ๋‚ด์šฉ (์ฒ˜์Œ 100์ž)
print(response.json())         # JSON ์‘๋‹ต ํŒŒ์‹ฑ

# URL ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ
params = {'q': 'python', 'sort': 'stars'}
response = requests.get('https://api.github.com/search/repositories', params=params)
print(response.url)  # ์ตœ์ข… URL ์ถœ๋ ฅ

# ์ปค์Šคํ…€ ํ—ค๋”
headers = {'User-Agent': 'my-app/0.0.1'}
response = requests.get('https://api.github.com/user', headers=headers)

# POST ์š”์ฒญ
data = {'username': 'user', 'password': 'pass'}
response = requests.post('https://httpbin.org/post', data=data)

# JSON POST ์š”์ฒญ
json_data = {'name': 'user', 'repos': ['repo1', 'repo2']}
response = requests.post('https://httpbin.org/post', json=json_data)

# ํŒŒ์ผ ์—…๋กœ๋“œ
# files = {'file': open('report.pdf', 'rb')}
# response = requests.post('https://httpbin.org/post', files=files)

# ์„ธ์…˜ ์‚ฌ์šฉ (์ฟ ํ‚ค ์œ ์ง€)
session = requests.Session()
session.get('https://httpbin.org/cookies/set/sessioncookie/123456789')
response = session.get('https://httpbin.org/cookies')
print(response.json())

# ํƒ€์ž„์•„์›ƒ ์„ค์ •
try:
    response = requests.get('https://httpbin.org/delay/5', timeout=3)
except requests.exceptions.Timeout:
    print("์š”์ฒญ์ด ํƒ€์ž„์•„์›ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.")

# ์—๋Ÿฌ ์ฒ˜๋ฆฌ
try:
    response = requests.get('https://httpbin.org/status/500')
    response.raise_for_status()  # 4XX, 5XX ์—๋Ÿฌ ์‹œ ์˜ˆ์™ธ ๋ฐœ์ƒ
except requests.exceptions.HTTPError as err:
    print(f"HTTP ์—๋Ÿฌ ๋ฐœ์ƒ: {err}")

โœ… requests ์ฃผ์š” ๊ธฐ๋Šฅ:

  • ๊ฐ„๊ฒฐํ•˜๊ณ  ์ง๊ด€์ ์ธ HTTP ์š”์ฒญ API
  • ์ž๋™ JSON ํŒŒ์‹ฑ ๋ฐ ์ธ์ฝ”๋”ฉ ์ฒ˜๋ฆฌ
  • ์„ธ์…˜ ๋ฐ ์ฟ ํ‚ค ์ง€์›
  • ํŒŒ์ผ ์—…๋กœ๋“œ ๋ฐ ๋‹ค์šด๋กœ๋“œ ๊ธฐ๋Šฅ
  • ์ธ์ฆ, ํ”„๋ก์‹œ, ํƒ€์ž„์•„์›ƒ ๋“ฑ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ ์ œ๊ณต

Flask

from flask import Flask, request, jsonify, render_template, redirect, url_for

# ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒ์„ฑ
app = Flask(__name__)

# ๊ธฐ๋ณธ ๋ผ์šฐํŠธ
@app.route('/')
def home():
    return 'Hello, Flask!'

# ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ๋ผ์šฐํŠธ
@app.route('/user/<username>')
def show_user(username):
    return f'User: {username}'

# ํƒ€์ž… ๋ณ€ํ™˜ (์ •์ˆ˜)
@app.route('/post/<int:post_id>')
def show_post(post_id):
    return f'Post ID: {post_id}'

# ์—ฌ๋Ÿฌ HTTP ๋ฉ”์„œ๋“œ ์ฒ˜๋ฆฌ
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form.get('username')
        password = request.form.get('password')
        # ๋กœ๊ทธ์ธ ๋กœ์ง ์ฒ˜๋ฆฌ
        return f'๋กœ๊ทธ์ธ ์‹œ๋„: {username}'
    else:
        return '''
            <form method="post">
                <input type="text" name="username">
                <input type="password" name="password">
                <input type="submit" value="Login">
            </form>
        '''

# JSON ์‘๋‹ต
@app.route('/api/data')
def get_data():
    data = {
        'name': 'John',
        'age': 30,
        'items': ['item1', 'item2']
    }
    return jsonify(data)

# ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ
@app.route('/search')
def search():
    query = request.args.get('q', '')
    return f'๊ฒ€์ƒ‰์–ด: {query}'

# ํ…œํ”Œ๋ฆฟ ๋ Œ๋”๋ง
@app.route('/hello/<name>')
def hello(name):
    # ์‹ค์ œ๋กœ๋Š” templates/hello.html ํŒŒ์ผ ํ•„์š”
    # return render_template('hello.html', name=name)
    return f'<h1>Hello, {name}!</h1>'

# ๋ฆฌ๋‹ค์ด๋ ‰์…˜
@app.route('/redirect')
def redirect_example():
    return redirect(url_for('home'))

# ์—๋Ÿฌ ํ•ธ๋“ค๋Ÿฌ
@app.errorhandler(404)
def page_not_found(e):
    return '404 - ํŽ˜์ด์ง€๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค', 404

# ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰
if __name__ == '__main__':
    # app.run(debug=True)
    pass  # ์‹ค์ œ ์‹คํ–‰์„ ๋ง‰๊ธฐ ์œ„ํ•ด pass ์‚ฌ์šฉ

โœ… Flask ํŠน์ง•:

  • ๋งˆ์ดํฌ๋กœ ์›น ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋งŒ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ œ๊ณต
  • ์‰ฌ์šด ํ•™์Šต ๊ณก์„ ๊ณผ ์ง๊ด€์ ์ธ ๊ตฌ์กฐ
  • ํ™•์žฅ์„ฑ์ด ๋›ฐ์–ด๋‚˜ ํ•„์š”์— ๋”ฐ๋ผ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ
  • ๊ฐœ๋ฐœ ์„œ๋ฒ„ ๋ฐ ๋””๋ฒ„๊ฑฐ ๋‚ด์žฅ
  • RESTful API ๊ฐœ๋ฐœ์— ์ ํ•ฉ

5๏ธโƒฃ ๊ธฐ๊ณ„ํ•™์Šต ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

scikit-learn

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA

# ๋ฐ์ดํ„ฐ์…‹ ๋กœ๋“œ
iris = datasets.load_iris()
X = iris.data
y = iris.target

# ๋ฐ์ดํ„ฐ ๋ถ„ํ• 
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=42)

# ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ (์Šค์ผ€์ผ๋ง)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

# ๋ชจ๋ธ ์ดˆ๊ธฐํ™”
models = {
    'Logistic Regression': LogisticRegression(max_iter=1000),
    'Decision Tree': DecisionTreeClassifier(),
    'Random Forest': RandomForestClassifier(),
    'SVM': SVC()
}

# ๋ชจ๋ธ ํ•™์Šต ๋ฐ ํ‰๊ฐ€
results = {}
for name, model in models.items():
    # ๋ชจ๋ธ ํ•™์Šต
    model.fit(X_train_scaled, y_train)
    
    # ์˜ˆ์ธก
    y_pred = model.predict(X_test_scaled)
    
    # ํ‰๊ฐ€
    accuracy = accuracy_score(y_test, y_pred)
    report = classification_report(y_test, y_pred)
    
    results[name] = {
        'accuracy': accuracy,
        'report': report
    }
    
    print(f"๋ชจ๋ธ: {name}")
    print(f"์ •ํ™•๋„: {accuracy:.4f}")
    print(f"๋ถ„๋ฅ˜ ๋ณด๊ณ ์„œ:\n{report}\n")

# ๋น„์ง€๋„ ํ•™์Šต ์˜ˆ์ œ - K-means ํด๋Ÿฌ์Šคํ„ฐ๋ง
kmeans = KMeans(n_clusters=3, random_state=42)
clusters = kmeans.fit_predict(X)

# ์ฐจ์› ์ถ•์†Œ - PCA
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)

# ์‹œ๊ฐํ™” (ํด๋Ÿฌ์Šคํ„ฐ๋ง ๊ฒฐ๊ณผ)
plt.figure(figsize=(12, 5))

# ์‹ค์ œ ํด๋ž˜์Šค
plt.subplot(1, 2, 1)
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap='viridis')
plt.title('์‹ค์ œ ํด๋ž˜์Šค')

# K-means ํด๋Ÿฌ์Šคํ„ฐ
plt.subplot(1, 2, 2)
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=clusters, cmap='viridis')
plt.title('K-means ํด๋Ÿฌ์Šคํ„ฐ๋ง')

# plt.savefig('clustering.png')
# plt.show()

โœ… scikit-learn ์žฅ์ :

  • ํฌ๊ด„์ ์ธ ๋จธ์‹ ๋Ÿฌ๋‹ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ œ๊ณต
  • ์ผ๊ด€๋œ API๋กœ ์‰ฌ์šด ๋ชจ๋ธ ๊ต์ฒด ๋ฐ ๋น„๊ต
  • ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ, ๋ชจ๋ธ ์„ ํƒ, ํ‰๊ฐ€ ๋„๊ตฌ ํ†ตํ•ฉ
  • ์ž˜ ๋ฌธ์„œํ™”๋œ API์™€ ํ™œ๋ฐœํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ
  • NumPy, SciPy, pandas์™€ ํ†ตํ•ฉ

์ฃผ์š” ํŒ

โœ… ๋ชจ๋ฒ” ์‚ฌ๋ก€:

  • pip ์„ค์น˜ ์ „ ๊ฐ€์ƒํ™˜๊ฒฝ ์‚ฌ์šฉ ๊ถŒ์žฅ
  • requirements.txt๋กœ ์˜์กด์„ฑ ๊ด€๋ฆฌ
  • Faker ์‚ฌ์šฉ ์‹œ seed ์„ค์ •์œผ๋กœ ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ
  • SymPy ์‚ฌ์šฉ ์‹œ Fraction์œผ๋กœ ์ •ํ™•ํ•œ ๋ถ„์ˆ˜ ๊ณ„์‚ฐ
  • NumPy, pandas ๋“ฑ ๊ณ„์‚ฐ ์ง‘์•ฝ์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ตœ์‹  ๋ฒ„์ „ ์‚ฌ์šฉ
  • ์›น ๊ฐœ๋ฐœ ์‹œ Flask ๋””๋ฒ„๊ทธ ๋ชจ๋“œ๋Š” ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋งŒ ํ™œ์„ฑํ™”
  • scikit-learn ๋ชจ๋ธ ์ €์žฅ ์‹œ joblib ์‚ฌ์šฉ ๊ถŒ์žฅ
  • matplotlib ์‹œ๊ฐํ™” ์‹œ plt.figure()๋กœ ํฌ๊ธฐ ๋ช…์‹œ์  ์„ค์ •
  • ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ ์‹œ ๋ฒ„์ „ ํ˜ธํ™˜์„ฑ ํ™•์ธ
  • ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์‹œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๋ชจ๋‹ˆํ„ฐ๋ง


โš ๏ธ **GitHub.com Fallback** โš ๏ธ