์ˆ˜. 8์›” 6th, 2025

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

ํŒŒ์ด์ฌ์€ ๊ทธ ์ž์ฒด๋กœ๋„ ๊ฐ•๋ ฅํ•œ ์–ธ์–ด์ด์ง€๋งŒ, ์ˆ˜๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ๋งŒ๋“ค์–ด ๋†“์€ ‘๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ’ ๋•๋ถ„์— ๋จธ์‹ ๋Ÿฌ๋‹ ๋ถ„์•ผ์—์„œ ๋…๋ณด์ ์ธ ์œ„์น˜๋ฅผ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์€ ๋ณต์žกํ•œ ๊ณ„์‚ฐ์ด๋‚˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, ๋ชจ๋ธ ๊ตฌํ˜„ ๋“ฑ์„ ๋ช‡ ์ค„์˜ ์ฝ”๋“œ๋กœ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ‘๋งˆ๋ฒ• ์ง€ํŒก์ด’ ๊ฐ™์€ ์กด์žฌ์ฃ ! โœจ

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


๐Ÿ“š ๋ชฉ์ฐจ

  1. ๋ฐ์ดํ„ฐ ์ค€๋น„ ๋ฐ ์กฐ์ž‘์˜ ํ•ต์‹ฌ: NumPy์™€ Pandas
    • ๋„˜ํŒŒ์ด(NumPy): ์ˆซ์ž ๊ณ„์‚ฐ์˜ ๋ฒ ์ด์Šค์บ ํ”„
    • ํŒ๋‹ค์Šค(Pandas): ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์˜ ๋งŒ๋Šฅ ์นผ
  2. ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋Š” ๋ˆˆ: ์‹œ๊ฐํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ Matplotlib์™€ Seaborn
    • ๋งทํ”Œ๋กฏ๋ฆฝ(Matplotlib): ๊ทธ๋ž˜ํ”„์˜ ๊ธฐ๋ณธ ์ค‘์˜ ๊ธฐ๋ณธ
    • ์”จ๋ณธ(Seaborn): ํ†ต๊ณ„ ์‹œ๊ฐํ™”์˜ ์˜ˆ์ˆ ๊ฐ€
  3. ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ๋ง์˜ ์‹ฌ์žฅ: Scikit-learn
    • ์‚ฌ์ดํ‚ท๋Ÿฐ(Scikit-learn): ๋จธ์‹ ๋Ÿฌ๋‹ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋ณด๋ฌผ์ฐฝ๊ณ 
  4. ๋”ฅ๋Ÿฌ๋‹์˜ ๊ฑฐ์ธ๋“ค: TensorFlow/Keras์™€ PyTorch
    • ํ…์„œํ”Œ๋กœ์šฐ/์ผ€๋ผ์Šค(TensorFlow/Keras): ๊ตฌ๊ธ€์˜ ๋”ฅ๋Ÿฌ๋‹ ํ”„๋ ˆ์ž„์›Œํฌ
    • ํŒŒ์ดํ† ์น˜(PyTorch): ํŽ˜์ด์Šค๋ถ์˜ ์œ ์—ฐํ•œ ๋”ฅ๋Ÿฌ๋‹ ํ”„๋ ˆ์ž„์›Œํฌ
  5. ๊ทธ ์™ธ ์•Œ์•„๋‘๋ฉด ์œ ์šฉํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • ์‚ฌ์ดํŒŒ์ด(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

๋‹ต๊ธ€ ๋‚จ๊ธฐ๊ธฐ

์ด๋ฉ”์ผ ์ฃผ์†Œ๋Š” ๊ณต๊ฐœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•„์ˆ˜ ํ•„๋“œ๋Š” *๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค