์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿ Python ๋ฐ์ดํ„ฐ ์‚ฌ์ด์–ธ์Šค ์™„์ „์ •๋ณต! Pandas, NumPy, Matplotlib์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋งˆ์Šคํ„ฐํ•˜๊ธฐ

๐Ÿ Python ๋ฐ์ดํ„ฐ ์‚ฌ์ด์–ธ์Šค ์™„์ „์ •๋ณต! Pandas, NumPy, Matplotlib์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋งˆ์Šคํ„ฐํ•˜๊ธฐ

์นœ๊ตฌ์ฒ˜๋Ÿผ ์‰ฝ๊ฒŒ ๋ฐฐ์šฐ๋Š” ๋ฐ์ดํ„ฐ ๋ถ„์„์˜ ๋ชจ๋“  ๊ฒƒ ๐Ÿ“Šโœจ

์•ˆ๋…•! ๐Ÿ‘‹ ๋ฐ์ดํ„ฐ ๋ถ„์„์— ๊ด€์‹ฌ ์žˆ๋Š” ์นœ๊ตฌ๋“ค ๋ชจ๋‘ ํ™˜์˜ํ•ด! ์š”์ฆ˜ ๋ฐ์ดํ„ฐ ์‚ฌ์ด์–ธ์Šค๊ฐ€ ์ •๋ง ํ•ซํ•˜์ž–์•„? ๊ทผ๋ฐ ๋ง‰์ƒ ์‹œ์ž‘ํ•˜๋ ค๋‹ˆ๊นŒ ๋ญ๋ถ€ํ„ฐ ํ•ด์•ผ ํ• ์ง€ ๋ง‰๋ง‰ํ•˜์ง€ ์•Š์•„? ๊ฑฑ์ • ๋งˆ! ์˜ค๋Š˜์€ Python์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ถ„์„์„ ์‹œ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•„์ฃผ ์‰ฝ๊ณ  ์žฌ๋ฏธ์žˆ๊ฒŒ ์•Œ๋ ค์ค„๊ฒŒ. ๐Ÿš€

์ด ๊ธ€์—์„œ๋Š” ๋ฐ์ดํ„ฐ ๋ถ„์„์˜ 3๋Œ€์žฅ์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” Pandas, NumPy, Matplotlib์„ ์ค‘์‹ฌ์œผ๋กœ ์‹ค์ „์—์„œ ๋ฐ”๋กœ ์จ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋‚ด์šฉ๋“ค์„ ๋‹ค๋ฃฐ ๊ฑฐ์•ผ. ์ด๋ก ๋งŒ ์ฃผ๊ตฌ์žฅ์ฐฝ ๋Š˜์–ด๋†“๋Š” ๊ฑด ์žฌ๋ฏธ์—†์œผ๋‹ˆ๊นŒ, ์‹ค์ œ ์˜ˆ์ œ์™€ ํ•จ๊ป˜ ์นœ๊ตฌํ•œํ…Œ ์„ค๋ช…ํ•˜๋“ฏ์ด ํŽธํ•˜๊ฒŒ ํ’€์–ด๊ฐˆ๊ฒŒ! ๐Ÿ˜Š

๐ŸŽฏ ์™œ Python์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ถ„์„์„ ํ•ด์•ผ ํ• ๊นŒ?

๋จผ์ € ์ด์•ผ๊ธฐํ•ด๋ณผ ๊ฑด, ์™œ ํ•˜ํ•„ Python์ด๋ƒ๋Š” ๊ฑฐ์•ผ. R๋„ ์žˆ๊ณ , Excel๋„ ์žˆ๊ณ , ๋‹ค๋ฅธ ๋„๊ตฌ๋“ค๋„ ๋งŽ์€๋ฐ ๋ง์ด์•ผ.

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

๐Ÿ“š ํ’๋ถ€ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

Pandas, NumPy, Matplotlib ๊ฐ™์€ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋“ค์ด ์ด๋ฏธ ๋‹ค ์ค€๋น„๋˜์–ด ์žˆ์–ด. ๋ฐ”ํ€ด๋ฅผ ๋‹ค์‹œ ๋ฐœ๋ช…ํ•  ํ•„์š”๊ฐ€ ์—†์ง€!

๐Ÿ‘ฅ ๊ฑฐ๋Œ€ํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ

๋ง‰ํžˆ๋Š” ๋ถ€๋ถ„์ด ์žˆ์œผ๋ฉด ๊ตฌ๊ธ€๋ง๋งŒ ํ•ด๋„ ๋‹ต์ด ๋‚˜์™€. Stack Overflow์— ์งˆ๋ฌธํ•˜๋ฉด ์นœ์ ˆํ•œ ๊ฐœ๋ฐœ์ž๋“ค์ด ๋„์™€์ค˜!

๐ŸŽ“ ๋ฐฐ์šฐ๊ธฐ ์‰ฌ์šด ๋ฌธ๋ฒ•

์˜์–ด ๋ฌธ์žฅ์ฒ˜๋Ÿผ ์ฝํžˆ๋Š” ์ง๊ด€์ ์ธ ๋ฌธ๋ฒ• ๋•๋ถ„์— ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ดˆ๋ณด์ž๋„ ๊ธˆ๋ฐฉ ์ตํž ์ˆ˜ ์žˆ์–ด.

๐Ÿ’ผ ์ทจ์—… ์‹œ์žฅ์˜ ๊ฐ•์ž

๋ฐ์ดํ„ฐ ๋ถ„์„๊ฐ€, ๋ฐ์ดํ„ฐ ์‚ฌ์ด์–ธํ‹ฐ์ŠคํŠธ ์ฑ„์šฉ ๊ณต๊ณ ๋ฅผ ๋ณด๋ฉด Python ์Šคํ‚ฌ์ด ๊ฑฐ์˜ ํ•„์ˆ˜์•ผ. ์ปค๋ฆฌ์–ด์—๋„ ๋„์›€์ด ๋ผ!

Python Data Science Pandas ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ NumPy ์ˆ˜์น˜ ์—ฐ์‚ฐ Matplotlib ์‹œ๊ฐํ™”

๐Ÿ”ข NumPy: ์ˆซ์ž ๊ณ„์‚ฐ์˜ ์Šˆํผํžˆ์–ด๋กœ

์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ? ์ฒซ ๋ฒˆ์งธ ์ฃผ์ธ๊ณต์€ ๋ฐ”๋กœ NumPy์•ผ! ๐Ÿ“

NumPy๋Š” 'Numerical Python'์˜ ์ค„์ž„๋ง์ธ๋ฐ, ์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์ˆซ์ž ๊ณ„์‚ฐ์— ํŠนํ™”๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์•ผ. "๊ทธ๋ƒฅ Python์œผ๋กœ ๊ณ„์‚ฐํ•˜๋ฉด ๋˜๋Š” ๊ฑฐ ์•„๋‹ˆ์•ผ?"๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, NumPy๋Š” ์ผ๋ฐ˜ Python๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์ด์•ผ. ํŠนํžˆ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ๊ทธ ์ฐจ์ด๊ฐ€ ํ™• ๋А๊ปด์ ธ!

๐Ÿš€ NumPy์˜ ํ•ต์‹ฌ: ndarray

NumPy์˜ ์‹ฌ์žฅ์€ ๋ฐ”๋กœ ndarray(n-dimensional array)๋ผ๋Š” ๋‹ค์ฐจ์› ๋ฐฐ์—ด์ด์•ผ. ์ด๊ฒŒ ๋ญ๋ƒ๋ฉด, ์—‘์…€ ์‹œํŠธ์ฒ˜๋Ÿผ ํ–‰๊ณผ ์—ด๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ์ธ๋ฐ, 2์ฐจ์›๋ฟ๋งŒ ์•„๋‹ˆ๋ผ 3์ฐจ์›, 4์ฐจ์›... ์›ํ•˜๋Š” ๋งŒํผ ์ฐจ์›์„ ๋Š˜๋ฆด ์ˆ˜ ์žˆ์–ด.

์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊ฒŒ:

import numpy as np

# 1์ฐจ์› ๋ฐฐ์—ด (๋ฒกํ„ฐ)
arr1 = np.array([1, 2, 3, 4, 5])
print(arr1)  # [1 2 3 4 5]

# 2์ฐจ์› ๋ฐฐ์—ด (ํ–‰๋ ฌ)
arr2 = np.array([[1, 2, 3], 
                 [4, 5, 6]])
print(arr2)
# [[1 2 3]
#  [4 5 6]]

# 3์ฐจ์› ๋ฐฐ์—ด (ํ…์„œ)
arr3 = np.array([[[1, 2], [3, 4]], 
                 [[5, 6], [7, 8]]])
print(arr3.shape)  # (2, 2, 2)
๐Ÿ’ก ๊ฟ€ํŒ: NumPy ๋ฐฐ์—ด์€ ๊ฐ™์€ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋งŒ ๋‹ด์„ ์ˆ˜ ์žˆ์–ด. ์ด๊ฒŒ ์ œ์•ฝ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ, ๋•๋ถ„์— ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ด ์ข‹๊ณ  ๊ณ„์‚ฐ ์†๋„๊ฐ€ ๋นจ๋ผ์ ธ! ์ผ๋ฐ˜ Python ๋ฆฌ์ŠคํŠธ๋ณด๋‹ค 10๋ฐฐ์—์„œ 100๋ฐฐ๊นŒ์ง€ ๋น ๋ฅผ ์ˆ˜ ์žˆ์–ด. ๐Ÿƒโ€โ™‚๏ธ๐Ÿ’จ

๐ŸŽฒ NumPy๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ‹์ง„ ๊ฒƒ๋“ค

NumPy๊ฐ€ ์ง„์งœ ๋น›์„ ๋ฐœํ•˜๋Š” ์ˆœ๊ฐ„์€ ๋ฐ”๋กœ ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•  ๋•Œ์•ผ. ๋ฐ˜๋ณต๋ฌธ ์—†์ด๋„ ๋ฐฐ์—ด ์ „์ฒด์— ์—ฐ์‚ฐ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ฑฐ๋“ !

1๏ธโƒฃ ๋ธŒ๋กœ๋“œ์บ์ŠคํŒ… (Broadcasting)

ํฌ๊ธฐ๊ฐ€ ๋‹ค๋ฅธ ๋ฐฐ์—ด๋ผ๋ฆฌ๋„ ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•ด. NumPy๊ฐ€ ์•Œ์•„์„œ ํฌ๊ธฐ๋ฅผ ๋งž์ถฐ์ฃผ๊ฑฐ๋“ !

# ๋ฐฐ์—ด์— ์Šค์นผ๋ผ ๊ฐ’ ๋”ํ•˜๊ธฐ
arr = np.array([1, 2, 3, 4, 5])
result = arr + 10
print(result)  # [11 12 13 14 15]

# 2์ฐจ์› ๋ฐฐ์—ด๊ณผ 1์ฐจ์› ๋ฐฐ์—ด ์—ฐ์‚ฐ
matrix = np.array([[1, 2, 3],
                   [4, 5, 6]])
vector = np.array([10, 20, 30])
result = matrix + vector
print(result)
# [[11 22 33]
#  [14 25 36]]

2๏ธโƒฃ ์œ ๋‹ˆ๋ฒ„์„ค ํ•จ์ˆ˜ (Universal Functions)

์ˆ˜ํ•™ ํ•จ์ˆ˜๋“ค์„ ๋ฐฐ์—ด ์ „์ฒด์— ํ•œ ๋ฒˆ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์–ด. ๋ฐ˜๋ณต๋ฌธ ์“ธ ํ•„์š” ์—†์ด ๋ง์ด์•ผ!

# ์ œ๊ณฑ๊ทผ ๊ณ„์‚ฐ
arr = np.array([1, 4, 9, 16, 25])
sqrt_arr = np.sqrt(arr)
print(sqrt_arr)  # [1. 2. 3. 4. 5.]

# ์‚ผ๊ฐํ•จ์ˆ˜
angles = np.array([0, 30, 45, 60, 90])
radians = np.deg2rad(angles)
sin_values = np.sin(radians)
print(sin_values)  # [0.   0.5  0.71 0.87 1.  ]

# ์ง€์ˆ˜ํ•จ์ˆ˜
arr = np.array([1, 2, 3])
exp_arr = np.exp(arr)
print(exp_arr)  # [ 2.72  7.39 20.09]

3๏ธโƒฃ ํ†ต๊ณ„ ํ•จ์ˆ˜

ํ‰๊ท , ํ‘œ์ค€ํŽธ์ฐจ, ์ตœ๋Œ“๊ฐ’, ์ตœ์†Ÿ๊ฐ’ ๋“ฑ ํ†ต๊ณ„ ๊ณ„์‚ฐ๋„ ํ•œ ์ค„์ด๋ฉด ๋!

data = np.array([23, 45, 67, 12, 89, 34, 56, 78])

print(f"ํ‰๊ท : {np.mean(data)}")           # 50.5
print(f"์ค‘์•™๊ฐ’: {np.median(data)}")       # 50.5
print(f"ํ‘œ์ค€ํŽธ์ฐจ: {np.std(data)}")        # 24.36
print(f"์ตœ๋Œ“๊ฐ’: {np.max(data)}")          # 89
print(f"์ตœ์†Ÿ๊ฐ’: {np.min(data)}")          # 12
print(f"ํ•ฉ๊ณ„: {np.sum(data)}")            # 404

โŒ ์ผ๋ฐ˜ Python ๋ฐฉ์‹

data = [1, 2, 3, 4, 5]
result = []
for num in data:
    result.append(num * 2)
print(result)
# [2, 4, 6, 8, 10]

์ฝ”๋“œ๊ฐ€ ๊ธธ๊ณ  ๋А๋ ค์š” ๐Ÿ˜ข

โœ… NumPy ๋ฐฉ์‹

data = np.array([1, 2, 3, 4, 5])
result = data * 2
print(result)
# [2 4 6 8 10]

๊ฐ„๊ฒฐํ•˜๊ณ  ๋นจ๋ผ์š”! ๐Ÿš€

๐Ÿผ Pandas: ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์˜ ๋งŒ๋Šฅ ๋„๊ตฌ

์ž, ์ด์ œ ๋‘ ๋ฒˆ์งธ ์ฃผ์ธ๊ณต Pandas๋ฅผ ๋งŒ๋‚˜๋ณผ ์‹œ๊ฐ„์ด์•ผ! ๐ŸŽ‰

Pandas๋Š” 'Panel Data'์˜ ์ค„์ž„๋ง์ธ๋ฐ, ํ‘œ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐ ์ตœ์ ํ™”๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์•ผ. Excel์„ Python์œผ๋กœ ์˜ฎ๊ฒจ๋†“์€ ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์›Œ. ๊ทผ๋ฐ Excel๋ณด๋‹ค ํ›จ์”ฌ ๊ฐ•๋ ฅํ•˜๊ณ  ์ž๋™ํ™”ํ•˜๊ธฐ ์ข‹์ง€!

์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•œ๋‹ค๊ฑฐ๋‚˜, ๊ฑฐ๋ž˜ ๋‚ด์—ญ์„ ์ •๋ฆฌํ•  ๋•Œ Pandas๋งŒ ํ•œ ๊ฒŒ ์—†์–ด. ์‹ค์ œ๋กœ ๋งŽ์€ ๋ฐ์ดํ„ฐ ๋ถ„์„๊ฐ€๋“ค์ด ์—…๋ฌด์˜ 80%๋ฅผ Pandas๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค๊ณ  ํ•ด!

๐Ÿ“Š Pandas์˜ ๋‘ ๊ฐ€์ง€ ํ•ต์‹ฌ ๊ตฌ์กฐ

1. Series (์‹œ๋ฆฌ์ฆˆ)

1์ฐจ์› ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์•ผ. ์—‘์…€์˜ ํ•œ ์—ด์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ผ. ๊ฐ ๋ฐ์ดํ„ฐ์— ์ธ๋ฑ์Šค(๋ผ๋ฒจ)๋ฅผ ๋ถ™์ผ ์ˆ˜ ์žˆ์–ด์„œ ๋”•์…”๋„ˆ๋ฆฌ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด.

import pandas as pd

# ์‹œ๋ฆฌ์ฆˆ ์ƒ์„ฑ
scores = pd.Series([85, 90, 78, 92, 88], 
                   index=['์ฒ ์ˆ˜', '์˜ํฌ', '๋ฏผ์ˆ˜', '์ง€์˜', '๋™ํ˜„'])
print(scores)
# ์ฒ ์ˆ˜    85
# ์˜ํฌ    90
# ๋ฏผ์ˆ˜    78
# ์ง€์˜    92
# ๋™ํ˜„    88

# ํŠน์ • ํ•™์ƒ ์ ์ˆ˜ ์กฐํšŒ
print(scores['์˜ํฌ'])  # 90

# ํ‰๊ท  ์ ์ˆ˜
print(scores.mean())  # 86.6

2. DataFrame (๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„)

2์ฐจ์› ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์•ผ. ์—‘์…€ ์‹œํŠธ ์ „์ฒด๋ผ๊ณ  ๋ณด๋ฉด ๋ผ. ์—ฌ๋Ÿฌ ๊ฐœ์˜ Series๊ฐ€ ๋ชจ์—ฌ์„œ ๋งŒ๋“ค์–ด์ง„ ๊ฑฐ์ง€!

# ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„ ์ƒ์„ฑ
data = {
    '์ด๋ฆ„': ['์ฒ ์ˆ˜', '์˜ํฌ', '๋ฏผ์ˆ˜', '์ง€์˜', '๋™ํ˜„'],
    '์ˆ˜ํ•™': [85, 90, 78, 92, 88],
    '์˜์–ด': [88, 85, 92, 89, 91],
    '๊ณผํ•™': [90, 88, 85, 95, 87]
}
df = pd.DataFrame(data)
print(df)
#    ์ด๋ฆ„  ์ˆ˜ํ•™  ์˜์–ด  ๊ณผํ•™
# 0  ์ฒ ์ˆ˜  85  88  90
# 1  ์˜ํฌ  90  85  88
# 2  ๋ฏผ์ˆ˜  78  92  85
# 3  ์ง€์˜  92  89  95
# 4  ๋™ํ˜„  88  91  87

๐ŸŽฏ Pandas๋กœ ๋ฐ์ดํ„ฐ ๋‹ค๋ฃจ๊ธฐ

Pandas์˜ ์ง„์งœ ๋งค๋ ฅ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ž์œ ์ž์žฌ๋กœ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑฐ์•ผ. ํ•„ํ„ฐ๋ง, ์ •๋ ฌ, ๊ทธ๋ฃนํ™”, ๋ณ‘ํ•ฉ... ๋ญ๋“ ์ง€ ๊ฐ€๋Šฅํ•ด!

๐Ÿ“ฅ ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

CSV, Excel, JSON, SQL ๋“ฑ ๋‹ค์–‘ํ•œ ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ์–ด.

# CSV ํŒŒ์ผ ์ฝ๊ธฐ
df = pd.read_csv('data.csv')

# Excel ํŒŒ์ผ ์ฝ๊ธฐ
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')

# JSON ํŒŒ์ผ ์ฝ๊ธฐ
df = pd.read_json('data.json')

# ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ฝ๊ธฐ
import sqlite3
conn = sqlite3.connect('database.db')
df = pd.read_sql('SELECT * FROM users', conn)

๐Ÿ” ๋ฐ์ดํ„ฐ ํƒ์ƒ‰ํ•˜๊ธฐ

๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜์Œ ๋ฐ›์•˜์„ ๋•Œ ๊ฐ€์žฅ ๋จผ์ € ํ•ด์•ผ ํ•  ์ผ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฑฐ์•ผ!

# ์ฒ˜์Œ 5๊ฐœ ํ–‰ ๋ณด๊ธฐ
print(df.head())

# ๋งˆ์ง€๋ง‰ 5๊ฐœ ํ–‰ ๋ณด๊ธฐ
print(df.tail())

# ๋ฐ์ดํ„ฐ ์ •๋ณด ํ™•์ธ
print(df.info())

# ๊ธฐ์ˆ  ํ†ต๊ณ„๋Ÿ‰ ํ™•์ธ
print(df.describe())

# ๋ฐ์ดํ„ฐ ํฌ๊ธฐ ํ™•์ธ
print(df.shape)  # (ํ–‰ ์ˆ˜, ์—ด ์ˆ˜)

# ์—ด ์ด๋ฆ„ ํ™•์ธ
print(df.columns)

# ๊ฒฐ์ธก์น˜ ํ™•์ธ
print(df.isnull().sum())

๐ŸŽจ ๋ฐ์ดํ„ฐ ์„ ํƒํ•˜๊ธฐ

์›ํ•˜๋Š” ํ–‰์ด๋‚˜ ์—ด๋งŒ ๊ณจ๋ผ์„œ ๋ณผ ์ˆ˜ ์žˆ์–ด. ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ, ์ƒํ™ฉ์— ๋งž๊ฒŒ ์“ฐ๋ฉด ๋ผ!

# ํŠน์ • ์—ด ์„ ํƒ
ages = df['๋‚˜์ด']
names_ages = df[['์ด๋ฆ„', '๋‚˜์ด']]

# ํŠน์ • ํ–‰ ์„ ํƒ (์ธ๋ฑ์Šค ๊ธฐ์ค€)
first_row = df.iloc[0]
first_three = df.iloc[0:3]

# ํŠน์ • ํ–‰ ์„ ํƒ (๋ผ๋ฒจ ๊ธฐ์ค€)
row = df.loc[0]

# ์กฐ๊ฑด์œผ๋กœ ํ•„ํ„ฐ๋ง
adults = df[df['๋‚˜์ด'] >= 20]
high_scorers = df[df['์ ์ˆ˜'] > 80]

# ์—ฌ๋Ÿฌ ์กฐ๊ฑด ์กฐํ•ฉ
result = df[(df['๋‚˜์ด'] >= 20) & (df['์ ์ˆ˜'] > 80)]

# ํŠน์ • ๊ฐ’ ํฌํ•จ ์—ฌ๋ถ€
seoul_people = df[df['์ง€์—ญ'].isin(['์„œ์šธ', '๊ฒฝ๊ธฐ'])]

๐Ÿ”ง ๋ฐ์ดํ„ฐ ๊ฐ€๊ณตํ•˜๊ธฐ

๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•˜๊ธฐ ์ข‹์€ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…์ด์•ผ. ์‹ค๋ฌด์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ํ•˜๋Š” ์ž‘์—… ์ค‘ ํ•˜๋‚˜์ง€!

# ์ƒˆ๋กœ์šด ์—ด ์ถ”๊ฐ€
df['์ด์ '] = df['์ˆ˜ํ•™'] + df['์˜์–ด'] + df['๊ณผํ•™']
df['ํ‰๊ท '] = df['์ด์ '] / 3

# ์—ด ์ด๋ฆ„ ๋ณ€๊ฒฝ
df = df.rename(columns={'์ด๋ฆ„': 'name', '๋‚˜์ด': 'age'})

# ๊ฒฐ์ธก์น˜ ์ฒ˜๋ฆฌ
df = df.dropna()  # ๊ฒฐ์ธก์น˜๊ฐ€ ์žˆ๋Š” ํ–‰ ์‚ญ์ œ
df = df.fillna(0)  # ๊ฒฐ์ธก์น˜๋ฅผ 0์œผ๋กœ ์ฑ„์šฐ๊ธฐ
df['๋‚˜์ด'] = df['๋‚˜์ด'].fillna(df['๋‚˜์ด'].mean())  # ํ‰๊ท ์œผ๋กœ ์ฑ„์šฐ๊ธฐ

# ์ค‘๋ณต ์ œ๊ฑฐ
df = df.drop_duplicates()

# ๋ฐ์ดํ„ฐ ํƒ€์ž… ๋ณ€ํ™˜
df['๋‚˜์ด'] = df['๋‚˜์ด'].astype(int)
df['๋‚ ์งœ'] = pd.to_datetime(df['๋‚ ์งœ'])

# ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ
df['์ด๋ฆ„'] = df['์ด๋ฆ„'].str.upper()  # ๋Œ€๋ฌธ์ž๋กœ
df['์ด๋ฉ”์ผ'] = df['์ด๋ฉ”์ผ'].str.lower()  # ์†Œ๋ฌธ์ž๋กœ
df['์ „ํ™”๋ฒˆํ˜ธ'] = df['์ „ํ™”๋ฒˆํ˜ธ'].str.replace('-', '')  # ํ•˜์ดํ”ˆ ์ œ๊ฑฐ

๐Ÿ“ˆ ๋ฐ์ดํ„ฐ ์ง‘๊ณ„ํ•˜๊ธฐ

๊ทธ๋ฃน๋ณ„๋กœ ํ†ต๊ณ„๋ฅผ ๋‚ด๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์•ฝํ•  ๋•Œ ์‚ฌ์šฉํ•ด. ์—‘์…€์˜ ํ”ผ๋ฒ— ํ…Œ์ด๋ธ”๊ณผ ๋น„์Šทํ•œ ๊ธฐ๋Šฅ์ด์•ผ!

# ๊ทธ๋ฃน๋ณ„ ํ‰๊ท 
df.groupby('์ง€์—ญ')['๋งค์ถœ'].mean()

# ์—ฌ๋Ÿฌ ํ†ต๊ณ„๋Ÿ‰ ํ•œ ๋ฒˆ์—
df.groupby('๋ถ€์„œ').agg({
    '๊ธ‰์—ฌ': ['mean', 'min', 'max'],
    '๋‚˜์ด': 'mean',
    '์ง์›์ˆ˜': 'count'
})

# ํ”ผ๋ฒ— ํ…Œ์ด๋ธ”
pivot = df.pivot_table(
    values='๋งค์ถœ',
    index='์ง€์—ญ',
    columns='์ œํ’ˆ',
    aggfunc='sum'
)

# ํฌ๋กœ์Šคํƒญ
pd.crosstab(df['์„ฑ๋ณ„'], df['์ง๊ธ‰'])
โš ๏ธ ์ฃผ์˜์‚ฌํ•ญ: Pandas๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•ด. ๋ฐ์ดํ„ฐ๊ฐ€ ๋„ˆ๋ฌด ํฌ๋ฉด (์ˆ˜๋ฐฑ๋งŒ ํ–‰ ์ด์ƒ) ์ปดํ“จํ„ฐ๊ฐ€ ๋ฒ„๋ฒ…๊ฑฐ๋ฆด ์ˆ˜ ์žˆ์–ด. ๊ทธ๋Ÿด ๋• ์ฒญํฌ(chunk) ๋‹จ์œ„๋กœ ์ฝ๊ฑฐ๋‚˜, Dask ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ณ ๋ คํ•ด๋ด!

๐Ÿ“Š Matplotlib: ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•˜๊ธฐ

๋งˆ์ง€๋ง‰ ์ฃผ์ธ๊ณต์€ Matplotlib์ด์•ผ! ๐ŸŽจ

"๋ฐฑ๋ฌธ์ด ๋ถˆ์—ฌ์ผ๊ฒฌ"์ด๋ผ๋Š” ๋ง ๋“ค์–ด๋ดค์ง€? ์ˆซ์ž๋กœ๋งŒ ๊ฐ€๋“ํ•œ ํ‘œ๋ฅผ ๋ณด๋Š” ๊ฒƒ๋ณด๋‹ค ๊ทธ๋ž˜ํ”„ ํ•˜๋‚˜๊ฐ€ ํ›จ์”ฌ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์›Œ. Matplotlib์€ Python์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ด๋Š” ์‹œ๊ฐํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์•ผ. ๋…ผ๋ฌธ, ๋ณด๊ณ ์„œ, ํ”„๋ ˆ์  ํ…Œ์ด์…˜์— ๋“ค์–ด๊ฐ€๋Š” ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด!

๐ŸŽจ Matplotlib ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

Matplotlib์€ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด. MATLAB ์Šคํƒ€์ผ์˜ ๊ฐ„๋‹จํ•œ ๋ฐฉ์‹๊ณผ, ๊ฐ์ฒด ์ง€ํ–ฅ ๋ฐฉ์‹์ด์•ผ. ์ฒ˜์Œ์—” ๊ฐ„๋‹จํ•œ ๋ฐฉ์‹์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒŒ ์ข‹์•„!

import matplotlib.pyplot as plt
import numpy as np

# ๊ฐ„๋‹จํ•œ ์„  ๊ทธ๋ž˜ํ”„
x = np.linspace(0, 10, 100)
y = np.sin(x)

plt.plot(x, y)
plt.title('์‚ฌ์ธ ํ•จ์ˆ˜')
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.grid(True)
plt.show()

๐Ÿ“ˆ ๋‹ค์–‘ํ•œ ๊ทธ๋ž˜ํ”„ ์ข…๋ฅ˜

์ƒํ™ฉ์— ๋งž๋Š” ๊ทธ๋ž˜ํ”„๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒŒ ์ค‘์š”ํ•ด. ๋ฐ์ดํ„ฐ์˜ ํŠน์„ฑ๊ณผ ์ „๋‹ฌํ•˜๊ณ  ์‹ถ์€ ๋ฉ”์‹œ์ง€์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ณจ๋ผ์•ผ ํ•ด!

๐Ÿ“‰ ์„  ๊ทธ๋ž˜ํ”„ (Line Plot)

์‹œ๊ฐ„์— ๋”ฐ๋ฅธ ๋ณ€ํ™”๋ฅผ ๋ณด์—ฌ์ค„ ๋•Œ ์ตœ๊ณ ! ์ฃผ๊ฐ€ ๋ณ€๋™, ์˜จ๋„ ๋ณ€ํ™”, ์„ฑ์žฅ ์ถ”์ด ๋“ฑ์— ์‚ฌ์šฉํ•ด.

months = ['1์›”', '2์›”', '3์›”', '4์›”']
sales = [150, 200, 180, 250]

plt.plot(months, sales, 
         marker='o', 
         linewidth=2, 
         color='blue')
plt.title('์›”๋ณ„ ๋งค์ถœ ์ถ”์ด')
plt.show()

๐Ÿ“Š ๋ง‰๋Œ€ ๊ทธ๋ž˜ํ”„ (Bar Chart)

์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ๋น„๊ต์— ์™„๋ฒฝํ•ด! ์ง€์—ญ๋ณ„ ๋งค์ถœ, ์ œํ’ˆ๋ณ„ ํŒ๋งค๋Ÿ‰ ๋“ฑ์„ ๋น„๊ตํ•  ๋•Œ ์จ.

products = ['A', 'B', 'C', 'D']
sales = [120, 95, 150, 80]

plt.bar(products, sales, 
        color='skyblue')
plt.title('์ œํ’ˆ๋ณ„ ํŒ๋งค๋Ÿ‰')
plt.ylabel('ํŒ๋งค๋Ÿ‰')
plt.show()

๐Ÿฅง ์› ๊ทธ๋ž˜ํ”„ (Pie Chart)

์ „์ฒด์—์„œ ๊ฐ ๋ถ€๋ถ„์ด ์ฐจ์ง€ํ•˜๋Š” ๋น„์œจ์„ ๋ณด์—ฌ์ค„ ๋•Œ ์ข‹์•„. ์‹œ์žฅ ์ ์œ ์œจ, ์˜ˆ์‚ฐ ๋ฐฐ๋ถ„ ๋“ฑ์— ์‚ฌ์šฉํ•ด.

labels = ['A', 'B', 'C', 'D']
sizes = [30, 25, 20, 25]

plt.pie(sizes, 
        labels=labels, 
        autopct='%1.1f%%',
        startangle=90)
plt.title('์‹œ์žฅ ์ ์œ ์œจ')
plt.show()

๐Ÿ“ฆ ํžˆ์Šคํ† ๊ทธ๋žจ (Histogram)

๋ฐ์ดํ„ฐ์˜ ๋ถ„ํฌ๋ฅผ ํ™•์ธํ•  ๋•Œ ํ•„์ˆ˜! ๋‚˜์ด ๋ถ„ํฌ, ์ ์ˆ˜ ๋ถ„ํฌ ๋“ฑ์„ ๋ณผ ๋•Œ ์‚ฌ์šฉํ•ด.

data = np.random.randn(1000)

plt.hist(data, 
         bins=30, 
         color='green', 
         alpha=0.7)
plt.title('๋ฐ์ดํ„ฐ ๋ถ„ํฌ')
plt.xlabel('๊ฐ’')
plt.ylabel('๋นˆ๋„')
plt.show()

๐Ÿ”ต ์‚ฐ์ ๋„ (Scatter Plot)

๋‘ ๋ณ€์ˆ˜ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ํŒŒ์•…ํ•  ๋•Œ ์ตœ๊ณ ! ํ‚ค์™€ ๋ชธ๋ฌด๊ฒŒ, ๊ณต๋ถ€ ์‹œ๊ฐ„๊ณผ ์„ฑ์  ๋“ฑ์˜ ์ƒ๊ด€๊ด€๊ณ„๋ฅผ ๋ณผ ๋•Œ ์จ.

x = np.random.rand(50)
y = 2 * x + np.random.randn(50) * 0.1

plt.scatter(x, y, 
            alpha=0.6, 
            color='red')
plt.title('์ƒ๊ด€๊ด€๊ณ„ ๋ถ„์„')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

๐Ÿ“ฆ ๋ฐ•์Šค ํ”Œ๋กฏ (Box Plot)

๋ฐ์ดํ„ฐ์˜ ๋ถ„ํฌ์™€ ์ด์ƒ์น˜๋ฅผ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ์–ด. ํ†ต๊ณ„ ๋ถ„์„ํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉํ•ด.

data = [np.random.normal(0, std, 100) 
        for std in range(1, 4)]

plt.boxplot(data, 
            labels=['A', 'B', 'C'])
plt.title('๊ทธ๋ฃน๋ณ„ ๋ถ„ํฌ ๋น„๊ต')
plt.show()

๐ŸŽจ ๊ทธ๋ž˜ํ”„ ๊พธ๋ฏธ๊ธฐ

๊ธฐ๋ณธ ๊ทธ๋ž˜ํ”„๋„ ์ข‹์ง€๋งŒ, ์กฐ๊ธˆ๋งŒ ๊พธ๋ฉฐ์ฃผ๋ฉด ํ›จ์”ฌ ์ „๋ฌธ์ ์œผ๋กœ ๋ณด์—ฌ! ์ƒ‰์ƒ, ์Šคํƒ€์ผ, ๋ ˆ์ด๋ธ” ๋“ฑ์„ ์กฐ์ •ํ•ด์„œ ๋ณด๊ธฐ ์ข‹์€ ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.

๐ŸŒˆ ์ƒ‰์ƒ๊ณผ ์Šคํƒ€์ผ

# ์ƒ‰์ƒ ์ง€์ • ๋ฐฉ๋ฒ•
plt.plot(x, y, color='red')  # ์ด๋ฆ„์œผ๋กœ
plt.plot(x, y, color='#FF5733')  # ํ—ฅ์Šค ์ฝ”๋“œ๋กœ
plt.plot(x, y, color=(0.1, 0.2, 0.5))  # RGB ํŠœํ”Œ๋กœ

# ์„  ์Šคํƒ€์ผ
plt.plot(x, y, linestyle='--')  # ์ ์„ 
plt.plot(x, y, linestyle='-.')  # ์ผ์ ์‡„์„ 
plt.plot(x, y, linestyle=':')   # ์ ์„ 

# ๋งˆ์ปค ์Šคํƒ€์ผ
plt.plot(x, y, marker='o')  # ์›
plt.plot(x, y, marker='s')  # ์‚ฌ๊ฐํ˜•
plt.plot(x, y, marker='^')  # ์‚ผ๊ฐํ˜•

# ํ•œ ๋ฒˆ์— ์ง€์ •
plt.plot(x, y, 'ro--', linewidth=2, markersize=8)

๐Ÿ“ ํ…์ŠคํŠธ์™€ ์ฃผ์„

# ์ œ๋ชฉ๊ณผ ์ถ• ๋ ˆ์ด๋ธ”
plt.title('๋ฉ‹์ง„ ๊ทธ๋ž˜ํ”„', fontsize=16, fontweight='bold')
plt.xlabel('X์ถ•', fontsize=12)
plt.ylabel('Y์ถ•', fontsize=12)

# ๋ฒ”๋ก€
plt.plot(x, y1, label='๋ฐ์ดํ„ฐ 1')
plt.plot(x, y2, label='๋ฐ์ดํ„ฐ 2')
plt.legend(loc='upper right')

# ํ…์ŠคํŠธ ์ถ”๊ฐ€
plt.text(5, 10, '์ค‘์š”ํ•œ ํฌ์ธํŠธ!', fontsize=12)

# ์ฃผ์„ ํ™”์‚ดํ‘œ
plt.annotate('์ตœ๋Œ“๊ฐ’', 
             xy=(7, 15), 
             xytext=(8, 17),
             arrowprops=dict(arrowstyle='->'))

๐ŸŽฏ ์—ฌ๋Ÿฌ ๊ทธ๋ž˜ํ”„ ํ•œ ๋ฒˆ์—

# ์„œ๋ธŒํ”Œ๋กฏ ์ƒ์„ฑ
fig, axes = plt.subplots(2, 2, figsize=(12, 10))

# ๊ฐ ์„œ๋ธŒํ”Œ๋กฏ์— ๊ทธ๋ž˜ํ”„ ๊ทธ๋ฆฌ๊ธฐ
axes[0, 0].plot(x, y1)
axes[0, 0].set_title('๊ทธ๋ž˜ํ”„ 1')

axes[0, 1].bar(categories, values)
axes[0, 1].set_title('๊ทธ๋ž˜ํ”„ 2')

axes[1, 0].scatter(x, y2)
axes[1, 0].set_title('๊ทธ๋ž˜ํ”„ 3')

axes[1, 1].hist(data, bins=20)
axes[1, 1].set_title('๊ทธ๋ž˜ํ”„ 4')

plt.tight_layout()  # ๋ ˆ์ด์•„์›ƒ ์ž๋™ ์กฐ์ •
plt.show()
โœจ ํ”„๋กœ ํŒ: Seaborn์ด๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋” ์˜ˆ์œ ๊ทธ๋ž˜ํ”„๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด! Seaborn์€ Matplotlib์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์ ธ์„œ ํ˜ธํ™˜์„ฑ๋„ ์™„๋ฒฝํ•ด. import seaborn as sns๋กœ ๋ถˆ๋Ÿฌ์™€์„œ sns.set_style('whitegrid') ๊ฐ™์€ ๋ช…๋ น์–ด๋กœ ์Šคํƒ€์ผ์„ ๋ฐ”๊ฟ”๋ด!

๐Ÿ”ฅ ์‹ค์ „ ํ”„๋กœ์ ํŠธ: ์„ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ

์ด์ œ ๋ฐฐ์šด ๊ฑธ ๋‹ค ํ•ฉ์ณ์„œ ์‹ค์ „ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•ด๋ณผ๊นŒ? ๊ฐ€์ƒ์˜ ์˜จ๋ผ์ธ ์‡ผํ•‘๋ชฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•ด๋ณด์ž! ๐Ÿ›’

์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ๋„ ์ด๋Ÿฐ ์‹์œผ๋กœ ์‚ฌ์šฉ์ž ํ–‰๋™ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์–ด. ์–ด๋–ค ์žฌ๋Šฅ์ด ์ธ๊ธฐ ์žˆ๋Š”์ง€, ์–ด๋А ์‹œ๊ฐ„๋Œ€์— ๊ฑฐ๋ž˜๊ฐ€ ๋งŽ์€์ง€ ๋“ฑ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์ง€!

๐Ÿ“ฆ ํ”„๋กœ์ ํŠธ: ์‡ผํ•‘๋ชฐ ๋งค์ถœ ๋ฐ์ดํ„ฐ ๋ถ„์„

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

# 1๋‹จ๊ณ„: ๋ฐ์ดํ„ฐ ์ƒ์„ฑ (์‹ค์ œ๋กœ๋Š” CSV ํŒŒ์ผ์„ ์ฝ์–ด์˜ฌ ๊ฑฐ์•ผ)
np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=365, freq='D')
sales = np.random.randint(100, 500, size=365) + \
        50 * np.sin(np.arange(365) * 2 * np.pi / 365)  # ๊ณ„์ ˆ์„ฑ ์ถ”๊ฐ€

df = pd.DataFrame({
    '๋‚ ์งœ': dates,
    '๋งค์ถœ': sales.astype(int),
    '๋ฐฉ๋ฌธ์ž์ˆ˜': np.random.randint(500, 2000, size=365),
    '์นดํ…Œ๊ณ ๋ฆฌ': np.random.choice(['์˜๋ฅ˜', '์ „์ž์ œํ’ˆ', '์‹ํ’ˆ', '๋„์„œ'], size=365)
})

# 2๋‹จ๊ณ„: ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ
df['์š”์ผ'] = df['๋‚ ์งœ'].dt.day_name()
df['์›”'] = df['๋‚ ์งœ'].dt.month
df['์ „ํ™˜์œจ'] = (df['๋งค์ถœ'] / df['๋ฐฉ๋ฌธ์ž์ˆ˜'] * 100).round(2)

# 3๋‹จ๊ณ„: ๊ธฐ๋ณธ ํ†ต๊ณ„ ํ™•์ธ
print("=== ๊ธฐ๋ณธ ํ†ต๊ณ„ ===")
print(df.describe())
print(f"\n์ด ๋งค์ถœ: {df['๋งค์ถœ'].sum():,}์›")
print(f"ํ‰๊ท  ์ผ ๋งค์ถœ: {df['๋งค์ถœ'].mean():.0f}์›")
print(f"์ตœ๊ณ  ๋งค์ถœ์ผ: {df.loc[df['๋งค์ถœ'].idxmax(), '๋‚ ์งœ'].strftime('%Y-%m-%d')}")

# 4๋‹จ๊ณ„: ์›”๋ณ„ ๋งค์ถœ ๋ถ„์„
monthly_sales = df.groupby('์›”')['๋งค์ถœ'].agg(['sum', 'mean', 'count'])
print("\n=== ์›”๋ณ„ ๋งค์ถœ ===")
print(monthly_sales)

# 5๋‹จ๊ณ„: ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ๋ถ„์„
category_sales = df.groupby('์นดํ…Œ๊ณ ๋ฆฌ')['๋งค์ถœ'].sum().sort_values(ascending=False)
print("\n=== ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ๋งค์ถœ ===")
print(category_sales)

# 6๋‹จ๊ณ„: ์‹œ๊ฐํ™”
fig, axes = plt.subplots(2, 2, figsize=(15, 12))

# 6-1. ์ผ๋ณ„ ๋งค์ถœ ์ถ”์ด
axes[0, 0].plot(df['๋‚ ์งœ'], df['๋งค์ถœ'], linewidth=1, alpha=0.7)
axes[0, 0].set_title('์ผ๋ณ„ ๋งค์ถœ ์ถ”์ด', fontsize=14, fontweight='bold')
axes[0, 0].set_xlabel('๋‚ ์งœ')
axes[0, 0].set_ylabel('๋งค์ถœ (์›)')
axes[0, 0].grid(True, alpha=0.3)

# 6-2. ์›”๋ณ„ ํ‰๊ท  ๋งค์ถœ
monthly_sales['mean'].plot(kind='bar', ax=axes[0, 1], color='skyblue')
axes[0, 1].set_title('์›”๋ณ„ ํ‰๊ท  ๋งค์ถœ', fontsize=14, fontweight='bold')
axes[0, 1].set_xlabel('์›”')
axes[0, 1].set_ylabel('ํ‰๊ท  ๋งค์ถœ (์›)')
axes[0, 1].tick_params(axis='x', rotation=0)

# 6-3. ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ๋งค์ถœ ๋น„์ค‘
axes[1, 0].pie(category_sales, 
               labels=category_sales.index, 
               autopct='%1.1f%%',
               startangle=90,
               colors=['#ff9999', '#66b3ff', '#99ff99', '#ffcc99'])
axes[1, 0].set_title('์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ๋งค์ถœ ๋น„์ค‘', fontsize=14, fontweight='bold')

# 6-4. ๋งค์ถœ๊ณผ ๋ฐฉ๋ฌธ์ž์ˆ˜ ์ƒ๊ด€๊ด€๊ณ„
axes[1, 1].scatter(df['๋ฐฉ๋ฌธ์ž์ˆ˜'], df['๋งค์ถœ'], alpha=0.5, color='purple')
axes[1, 1].set_title('๋ฐฉ๋ฌธ์ž์ˆ˜ vs ๋งค์ถœ', fontsize=14, fontweight='bold')
axes[1, 1].set_xlabel('๋ฐฉ๋ฌธ์ž์ˆ˜')
axes[1, 1].set_ylabel('๋งค์ถœ (์›)')
axes[1, 1].grid(True, alpha=0.3)

# ์ƒ๊ด€๊ณ„์ˆ˜ ํ‘œ์‹œ
correlation = df['๋ฐฉ๋ฌธ์ž์ˆ˜'].corr(df['๋งค์ถœ'])
axes[1, 1].text(0.05, 0.95, f'์ƒ๊ด€๊ณ„์ˆ˜: {correlation:.3f}',
                transform=axes[1, 1].transAxes,
                verticalalignment='top',
                bbox=dict(boxstyle='round', facecolor='wheat', alpha=0.5))

plt.tight_layout()
plt.savefig('sales_analysis.png', dpi=300, bbox_inches='tight')
plt.show()

print("\n๋ถ„์„ ์™„๋ฃŒ! ๊ทธ๋ž˜ํ”„๊ฐ€ ์ €์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.")
๐Ÿ’ก ์‹ค๋ฌด ํŒ: ์ด๋Ÿฐ ๋ถ„์„์„ ์ •๊ธฐ์ ์œผ๋กœ ์ž๋™ํ™”ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด? Jupyter Notebook์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , ์Šค์ผ€์ค„๋Ÿฌ(์˜ˆ: cron, Task Scheduler)๋กœ ์ฃผ๊ธฐ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋ฉด ๋ผ. ๊ทธ๋Ÿฌ๋ฉด ๋งค์ผ ์•„์นจ ์ตœ์‹  ๋ถ„์„ ๋ฆฌํฌํŠธ๋ฅผ ๋ฐ›์•„๋ณผ ์ˆ˜ ์žˆ์–ด! ๐Ÿ“ง

๐Ÿš€ ๋” ๋‚˜์•„๊ฐ€๊ธฐ: ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ๋“ค

๊ธฐ๋ณธ์„ ๋งˆ์Šคํ„ฐํ–ˆ๋‹ค๋ฉด ์ด์ œ ํ•œ ๋‹จ๊ณ„ ๋” ๋‚˜์•„๊ฐ€๋ณผ๊นŒ? ์‹ค๋ฌด์—์„œ ์ •๋ง ์œ ์šฉํ•œ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ๋“ค์„ ์†Œ๊ฐœํ• ๊ฒŒ!

๐Ÿ”— ๋ฐ์ดํ„ฐ ๋ณ‘ํ•ฉ (Merge & Join)

์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์„ ํ•ฉ์น˜๋Š” ๊ธฐ๋Šฅ์ด์•ผ. SQL์˜ JOIN๊ณผ ๋น„์Šทํ•ด!

# ๋‘ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„ ๋ณ‘ํ•ฉ
df1 = pd.DataFrame({
    '๊ณ ๊ฐID': [1, 2, 3],
    '์ด๋ฆ„': ['์ฒ ์ˆ˜', '์˜ํฌ', '๋ฏผ์ˆ˜']
})
df2 = pd.DataFrame({
    '๊ณ ๊ฐID': [1, 2, 4],
    '๊ตฌ๋งค์•ก': [10000, 20000, 15000]
})

# Inner Join
merged = pd.merge(df1, df2, on='๊ณ ๊ฐID', how='inner')

# Left Join
merged = pd.merge(df1, df2, on='๊ณ ๊ฐID', how='left')

# ์ธ๋ฑ์Šค ๊ธฐ์ค€ ๋ณ‘ํ•ฉ
combined = df1.join(df2, lsuffix='_left', rsuffix='_right')

๐Ÿ”„ ๋ฐ์ดํ„ฐ ์žฌ๊ตฌ์กฐํ™” (Pivot & Melt)

๋ฐ์ดํ„ฐ์˜ ํ˜•ํƒœ๋ฅผ ๋ฐ”๊พธ๋Š” ๊ธฐ๋Šฅ์ด์•ผ. ๋„“์€ ํ˜•์‹ โ†” ๊ธด ํ˜•์‹ ๋ณ€ํ™˜!

# Wide to Long (melt)
df_long = pd.melt(df, 
                  id_vars=['์ด๋ฆ„'], 
                  value_vars=['์ˆ˜ํ•™', '์˜์–ด'],
                  var_name='๊ณผ๋ชฉ',
                  value_name='์ ์ˆ˜')

# Long to Wide (pivot)
df_wide = df_long.pivot(
    index='์ด๋ฆ„',
    columns='๊ณผ๋ชฉ',
    values='์ ์ˆ˜'
)

โฐ ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ

๋‚ ์งœ/์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ๋“ค!

# ๋‚ ์งœ ์ธ๋ฑ์Šค ์„ค์ •
df['๋‚ ์งœ'] = pd.to_datetime(df['๋‚ ์งœ'])
df = df.set_index('๋‚ ์งœ')

# ๋ฆฌ์ƒ˜ํ”Œ๋ง (์ผ๋ณ„ โ†’ ์›”๋ณ„)
monthly = df.resample('M').sum()

# ์ด๋™ ํ‰๊ท 
df['MA7'] = df['๋งค์ถœ'].rolling(window=7).mean()

# ์‹œ์ฐจ ์ƒ์„ฑ
df['์ „์ผ๋งค์ถœ'] = df['๋งค์ถœ'].shift(1)
df['์ฆ๊ฐ'] = df['๋งค์ถœ'] - df['์ „์ผ๋งค์ถœ']

๐ŸŽฏ Apply ํ•จ์ˆ˜ ํ™œ์šฉ

๋ณต์žกํ•œ ์—ฐ์‚ฐ์„ ํ–‰์ด๋‚˜ ์—ด์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์–ด!

# ํ•จ์ˆ˜ ์ •์˜
def grade(score):
    if score >= 90:
        return 'A'
    elif score >= 80:
        return 'B'
    elif score >= 70:
        return 'C'
    else:
        return 'D'

# ์—ด์— ํ•จ์ˆ˜ ์ ์šฉ
df['ํ•™์ '] = df['์ ์ˆ˜'].apply(grade)

# ๋žŒ๋‹ค ํ•จ์ˆ˜ ์‚ฌ์šฉ
df['์ œ๊ณฑ'] = df['์ˆซ์ž'].apply(lambda x: x**2)

# ํ–‰ ์ „์ฒด์— ํ•จ์ˆ˜ ์ ์šฉ
df['ํ•ฉ๊ณ„'] = df.apply(lambda row: row['์ˆ˜ํ•™'] + row['์˜์–ด'], axis=1)

๐ŸŽ“ ํ•™์Šต ๋กœ๋“œ๋งต๊ณผ ์ถ”์ฒœ ์ž๋ฃŒ

"์–ด๋””์„œ๋ถ€ํ„ฐ ์–ด๋–ป๊ฒŒ ๊ณต๋ถ€ํ•ด์•ผ ํ•˜์ง€?" ๊ณ ๋ฏผ๋˜์ง€? ๋‚ด๊ฐ€ ์ถ”์ฒœํ•˜๋Š” ํ•™์Šต ์ˆœ์„œ๋ฅผ ์•Œ๋ ค์ค„๊ฒŒ! ๐Ÿ“š

1๋‹จ๊ณ„: Python ๊ธฐ์ดˆ ๋‹ค์ง€๊ธฐ (2-4์ฃผ)

๋ณ€์ˆ˜, ์ž๋ฃŒํ˜•, ์กฐ๊ฑด๋ฌธ, ๋ฐ˜๋ณต๋ฌธ, ํ•จ์ˆ˜ ๋“ฑ Python ๊ธฐ๋ณธ ๋ฌธ๋ฒ•์„ ์ตํ˜€. ์ด๊ฒŒ ํƒ„ํƒ„ํ•ด์•ผ ๋‚˜์ค‘์— ํŽธํ•ด!
์ถ”์ฒœ ์ž๋ฃŒ: ์ ํ”„ ํˆฌ ํŒŒ์ด์ฌ, Python ๊ณต์‹ ํŠœํ† ๋ฆฌ์–ผ

2๋‹จ๊ณ„: NumPy ๋งˆ์Šคํ„ฐํ•˜๊ธฐ (1-2์ฃผ)

๋ฐฐ์—ด ์ƒ์„ฑ, ์ธ๋ฑ์‹ฑ, ์Šฌ๋ผ์ด์‹ฑ, ๋ธŒ๋กœ๋“œ์บ์ŠคํŒ…, ์ˆ˜ํ•™ ์—ฐ์‚ฐ ๋“ฑ์„ ์—ฐ์Šตํ•ด.
์ถ”์ฒœ ์ž๋ฃŒ: NumPy ๊ณต์‹ ๋ฌธ์„œ, DataCamp NumPy ์ฝ”์Šค

3๋‹จ๊ณ„: Pandas ์ •๋ณตํ•˜๊ธฐ (3-4์ฃผ)

Series, DataFrame, ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ/์“ฐ๊ธฐ, ํ•„ํ„ฐ๋ง, ๊ทธ๋ฃนํ™”, ๋ณ‘ํ•ฉ ๋“ฑ์„ ์‹ค์Šตํ•ด.
์ถ”์ฒœ ์ž๋ฃŒ: Pandas ๊ณต์‹ ๋ฌธ์„œ, "Python for Data Analysis" ์ฑ…

4๋‹จ๊ณ„: Matplotlib ์ตํžˆ๊ธฐ (1-2์ฃผ)

๋‹ค์–‘ํ•œ ๊ทธ๋ž˜ํ”„ ์ข…๋ฅ˜, ์Šคํƒ€์ผ๋ง, ์„œ๋ธŒํ”Œ๋กฏ ๋“ฑ์„ ์—ฐ์Šตํ•ด.
์ถ”์ฒœ ์ž๋ฃŒ: Matplotlib ๊ณต์‹ ๊ฐค๋Ÿฌ๋ฆฌ, Seaborn ํŠœํ† ๋ฆฌ์–ผ

5๋‹จ๊ณ„: ์‹ค์ „ ํ”„๋กœ์ ํŠธ (๊ณ„์†)

Kaggle ๋ฐ์ดํ„ฐ์…‹์œผ๋กœ ์‹ค์ œ ๋ถ„์„ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•ด๋ด. ํฌํŠธํด๋ฆฌ์˜ค๋„ ๋งŒ๋“ค๊ณ !
์ถ”์ฒœ ์ž๋ฃŒ: Kaggle Learn, ๊ณต๊ณต๋ฐ์ดํ„ฐํฌํ„ธ

๋ฐ์ดํ„ฐ ์‚ฌ์ด์–ธ์Šค ํ•™์Šต ๋กœ๋“œ๋งต 1๋‹จ๊ณ„ Python ๊ธฐ์ดˆ 2๋‹จ๊ณ„ NumPy 3๋‹จ๊ณ„ Pandas 4๋‹จ๊ณ„ Matplotlib 5๋‹จ๊ณ„ ์‹ค์ „ ํ•™์Šต ํŒ โœ“ ๋งค์ผ ์กฐ๊ธˆ์”ฉ ์—ฐ์Šต โœ“ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋กœ ์‹ค์Šต โœ“ ์ปค๋ฎค๋‹ˆํ‹ฐ ํ™œ์šฉ โœ“ ํ”„๋กœ์ ํŠธ ํฌํŠธํด๋ฆฌ์˜ค โœ“ ๊พธ์ค€ํ•จ์ด ํ•ต์‹ฌ! ์ถ”์ฒœ ๋„๊ตฌ โœ“ Jupyter Notebook โœ“ Google Colab โœ“ VS Code โœ“ Anaconda โœ“ GitHub ํ•™์Šต ์ž๋ฃŒ โœ“ Kaggle Learn โœ“ DataCamp โœ“ ๊ณต์‹ ๋ฌธ์„œ โœ“ YouTube ๊ฐ•์˜ โœ“ ์žฌ๋Šฅ๋„ท ๊ฐ•์˜ ์ฃผ์˜์‚ฌํ•ญ โœ“ ๋„ˆ๋ฌด ๋งŽ์€ ์ž๋ฃŒ X โœ“ ์ด๋ก ๋งŒ ๊ณต๋ถ€ X โœ“ ์™„๋ฒฝ์ฃผ์˜ ๋ฒ„๋ฆฌ๊ธฐ โœ“ ๋น„๊ตํ•˜์ง€ ์•Š๊ธฐ โœ“ ํฌ๊ธฐํ•˜์ง€ ์•Š๊ธฐ!

๐Ÿ’ช ์‹ค๋ฌด์—์„œ ์ž์ฃผ ๋งŒ๋‚˜๋Š” ๋ฌธ์ œ์™€ ํ•ด๊ฒฐ๋ฒ•

์ด๋ก ์€ ์™„๋ฒฝํ•œ๋ฐ ์‹ค์ „์—์„œ ๋ง‰ํžˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„. ๋‚ด๊ฐ€ ๊ฒช์—ˆ๋˜ ๋ฌธ์ œ๋“ค๊ณผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๊ณต์œ ํ• ๊ฒŒ! ๐Ÿ”ง

โš ๏ธ ๋ฌธ์ œ 1: ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ์—๋Ÿฌ

์ฆ์ƒ: ํฐ CSV ํŒŒ์ผ์„ ์ฝ์œผ๋ ค๊ณ  ํ•˜๋ฉด "MemoryError" ๋ฐœ์ƒ

ํ•ด๊ฒฐ๋ฒ•:

# ์ฒญํฌ ๋‹จ์œ„๋กœ ์ฝ๊ธฐ
chunk_size = 10000
chunks = []
for chunk in pd.read_csv('big_file.csv', chunksize=chunk_size):
    # ํ•„์š”ํ•œ ์ฒ˜๋ฆฌ
    processed = chunk[chunk['๊ธˆ์•ก'] > 10000]
    chunks.append(processed)
df = pd.concat(chunks, ignore_index=True)

# ๋˜๋Š” ํ•„์š”ํ•œ ์—ด๋งŒ ์ฝ๊ธฐ
df = pd.read_csv('big_file.csv', usecols=['์ด๋ฆ„', '๊ธˆ์•ก', '๋‚ ์งœ'])

# ๋ฐ์ดํ„ฐ ํƒ€์ž… ์ตœ์ ํ™”
df['๊ธˆ์•ก'] = df['๊ธˆ์•ก'].astype('int32')  # int64 ๋Œ€์‹ 
df['์นดํ…Œ๊ณ ๋ฆฌ'] = df['์นดํ…Œ๊ณ ๋ฆฌ'].astype('category')  # ๋ฉ”๋ชจ๋ฆฌ ์ ˆ์•ฝ

โš ๏ธ ๋ฌธ์ œ 2: ํ•œ๊ธ€ ์ธ์ฝ”๋”ฉ ๋ฌธ์ œ

์ฆ์ƒ: CSV ํŒŒ์ผ์„ ์ฝ์œผ๋ฉด ํ•œ๊ธ€์ด ๊นจ์ ธ์„œ ๋‚˜์˜ด

ํ•ด๊ฒฐ๋ฒ•:

# ์ธ์ฝ”๋”ฉ ์ง€์ •
df = pd.read_csv('data.csv', encoding='utf-8')
# ๋˜๋Š”
df = pd.read_csv('data.csv', encoding='cp949')
# ๋˜๋Š”
df = pd.read_csv('data.csv', encoding='euc-kr')

# ์ธ์ฝ”๋”ฉ ์ž๋™ ๊ฐ์ง€
import chardet
with open('data.csv', 'rb') as f:
    result = chardet.detect(f.read())
    encoding = result['encoding']
df = pd.read_csv('data.csv', encoding=encoding)

โš ๏ธ ๋ฌธ์ œ 3: ๋‚ ์งœ ํ˜•์‹ ํŒŒ์‹ฑ ์‹คํŒจ

์ฆ์ƒ: ๋‚ ์งœ ์—ด์ด ๋ฌธ์ž์—ด๋กœ ์ธ์‹๋˜์–ด ์‹œ๊ณ„์—ด ๋ถ„์„์ด ์•ˆ ๋จ

ํ•ด๊ฒฐ๋ฒ•:

# ์ฝ์„ ๋•Œ ๋‚ ์งœ๋กœ ํŒŒ์‹ฑ
df = pd.read_csv('data.csv', parse_dates=['๋‚ ์งœ'])

# ์ฝ์€ ํ›„ ๋ณ€ํ™˜
df['๋‚ ์งœ'] = pd.to_datetime(df['๋‚ ์งœ'])

# ํ˜•์‹ ์ง€์ •
df['๋‚ ์งœ'] = pd.to_datetime(df['๋‚ ์งœ'], format='%Y-%m-%d')

# ์—๋Ÿฌ ๋ฌด์‹œ
df['๋‚ ์งœ'] = pd.to_datetime(df['๋‚ ์งœ'], errors='coerce')  # ์‹คํŒจ์‹œ NaT

โš ๏ธ ๋ฌธ์ œ 4: ๊ทธ๋ž˜ํ”„ ํ•œ๊ธ€ ๊นจ์ง

์ฆ์ƒ: Matplotlib ๊ทธ๋ž˜ํ”„์—์„œ ํ•œ๊ธ€์ด ๋„ค๋ชจ๋กœ ํ‘œ์‹œ๋จ

ํ•ด๊ฒฐ๋ฒ•:

import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

# Windows
plt.rcParams['font.family'] = 'Malgun Gothic'
# Mac
plt.rcParams['font.family'] = 'AppleGothic'
# Linux
plt.rcParams['font.family'] = 'NanumGothic'

# ๋งˆ์ด๋„ˆ์Šค ๊ธฐํ˜ธ ๊นจ์ง ๋ฐฉ์ง€
plt.rcParams['axes.unicode_minus'] = False

# ๋˜๋Š” ํฐํŠธ ๊ฒฝ๋กœ ์ง์ ‘ ์ง€์ •
font_path = 'C:/Windows/Fonts/malgun.ttf'
font_prop = fm.FontProperties(fname=font_path)
plt.title('ํ•œ๊ธ€ ์ œ๋ชฉ', fontproperties=font_prop)

๐ŸŒŸ ์‹ค์ „ ํ™œ์šฉ ์‚ฌ๋ก€

์ด๋ก ๋งŒ ์•Œ๋ฉด ๋ญํ•ด, ์‹ค์ œ๋กœ ์–ด๋””์— ์“ฐ๋Š”์ง€ ์•Œ์•„์•ผ์ง€! ๋‹ค์–‘ํ•œ ๋ถ„์•ผ์—์„œ ์–ด๋–ป๊ฒŒ ํ™œ์šฉ๋˜๋Š”์ง€ ๋ณผ๊นŒ? ๐ŸŽฏ

๐Ÿ“ˆ ๊ธˆ์œต ๋ฐ์ดํ„ฐ ๋ถ„์„

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

๐Ÿ›’ ์ด์ปค๋จธ์Šค ๋ถ„์„

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

๐Ÿฅ ์˜๋ฃŒ ๋ฐ์ดํ„ฐ ๋ถ„์„

ํ™˜์ž ๋ฐ์ดํ„ฐ ๋ถ„์„, ์งˆ๋ณ‘ ์˜ˆ์ธก, ์ž„์ƒ์‹œํ—˜ ๊ฒฐ๊ณผ ๋ถ„์„ ๋“ฑ์— ํ™œ์šฉ๋ผ. ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ์— ์ฃผ์˜ํ•˜๋ฉด์„œ ์˜๋ฏธ ์žˆ๋Š” ์ธ์‚ฌ์ดํŠธ๋ฅผ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ์–ด!

๐Ÿ“ฑ ์†Œ์…œ ๋ฏธ๋””์–ด ๋ถ„์„

์‚ฌ์šฉ์ž ํ–‰๋™ ๋ถ„์„, ํŠธ๋ Œ๋“œ ํŒŒ์•…, ๊ฐ์„ฑ ๋ถ„์„ ๋“ฑ์— ์‚ฌ์šฉ๋ผ. ์–ด๋–ค ์ฝ˜ํ…์ธ ๊ฐ€ ์ธ๊ธฐ ์žˆ๋Š”์ง€, ์–ธ์ œ ํฌ์ŠคํŒ…ํ•˜๋ฉด ์ข‹์€์ง€ ์•Œ ์ˆ˜ ์žˆ์–ด!

๐ŸŽฎ ๊ฒŒ์ž„ ๋ฐ์ดํ„ฐ ๋ถ„์„

ํ”Œ๋ ˆ์ด์–ด ์ดํƒˆ ์˜ˆ์ธก, ๊ฒŒ์ž„ ๋ฐธ๋Ÿฐ์Šค ์กฐ์ •, ์ธ์•ฑ ๊ตฌ๋งค ํŒจํ„ด ๋ถ„์„ ๋“ฑ์— ํ™œ์šฉ๋ผ. ๊ฒŒ์ž„์„ ๋” ์žฌ๋ฏธ์žˆ๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐ ๋„์›€์ด ๋ผ!

๐ŸŒ ์›น ๋กœ๊ทธ ๋ถ„์„

์›น์‚ฌ์ดํŠธ ํŠธ๋ž˜ํ”ฝ ๋ถ„์„, ์‚ฌ์šฉ์ž ๊ฒฝ๋กœ ์ถ”์ , A/B ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ๋ถ„์„ ๋“ฑ์— ์‚ฌ์šฉ๋ผ. ์›น์‚ฌ์ดํŠธ ๊ฐœ์„ ์— ํ•„์ˆ˜์ ์ด์•ผ!

๐ŸŽ ๋ณด๋„ˆ์Šค: ์œ ์šฉํ•œ ํŒ๊ณผ ํŠธ๋ฆญ

๋งˆ์ง€๋ง‰์œผ๋กœ ์‹ค๋ฌด์—์„œ ์ •๋ง ์œ ์šฉํ•œ ๊ฟ€ํŒ๋“ค์„ ๊ณต์œ ํ• ๊ฒŒ! ์ด๊ฑฐ ์•Œ๋ฉด ์ž‘์—… ์†๋„๊ฐ€ 2๋ฐฐ๋Š” ๋นจ๋ผ์ ธ! โšก

โœจ Pandas ์ฒด์ด๋‹ (Method Chaining)

์—ฌ๋Ÿฌ ์ž‘์—…์„ ํ•œ ์ค„๋กœ ์—ฐ๊ฒฐํ•ด์„œ ๊น”๋”ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด!

# ๊ธฐ์กด ๋ฐฉ์‹
df = pd.read_csv('data.csv')
df = df[df['๋‚˜์ด'] >= 20]
df = df.dropna()
df = df.sort_values('์ ์ˆ˜', ascending=False)
df = df.reset_index(drop=True)

# ์ฒด์ด๋‹ ๋ฐฉ์‹
df = (pd.read_csv('data.csv')
      .query('๋‚˜์ด >= 20')
      .dropna()
      .sort_values('์ ์ˆ˜', ascending=False)
      .reset_index(drop=True))
# ํ›จ์”ฌ ๊น”๋”ํ•˜์ง€? ๐Ÿ˜Ž

โœจ ์กฐ๊ฑด๋ถ€ ์—ด ์ƒ์„ฑ

๋ณต์žกํ•œ ์กฐ๊ฑด์œผ๋กœ ์ƒˆ๋กœ์šด ์—ด์„ ๋งŒ๋“ค ๋•Œ ์œ ์šฉํ•ด!

# np.where ์‚ฌ์šฉ
df['๋“ฑ๊ธ‰'] = np.where(df['์ ์ˆ˜'] >= 90, 'A',
             np.where(df['์ ์ˆ˜'] >= 80, 'B',
             np.where(df['์ ์ˆ˜'] >= 70, 'C', 'D')))

# np.select ์‚ฌ์šฉ (๋” ๊น”๋”!)
conditions = [
    df['์ ์ˆ˜'] >= 90,
    df['์ ์ˆ˜'] >= 80,
    df['์ ์ˆ˜'] >= 70
]
choices = ['A', 'B', 'C']
df['๋“ฑ๊ธ‰'] = np.select(conditions, choices, default='D')

โœจ ๋น ๋ฅธ ๋ฐ์ดํ„ฐ ํƒ์ƒ‰

๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ํŒŒ์•…ํ•˜๋Š” ์›๋ผ์ด๋„ˆ๋“ค!

# ๊ฐ ์—ด์˜ ๊ณ ์œ ๊ฐ’ ๊ฐœ์ˆ˜
df.nunique()

# ๊ฐ ์—ด์˜ ๊ฒฐ์ธก์น˜ ๋น„์œจ
df.isnull().mean() * 100

# ์ˆ˜์น˜ํ˜• ์—ด๋งŒ ์„ ํƒ
df.select_dtypes(include=['number'])

# ๋ฌธ์ž์—ด ์—ด๋งŒ ์„ ํƒ
df.select_dtypes(include=['object'])

# ์ƒ๊ด€๊ด€๊ณ„ ํ–‰๋ ฌ
df.corr()

# ๊ฐ’ ๋นˆ๋„์ˆ˜
df['์นดํ…Œ๊ณ ๋ฆฌ'].value_counts()

# ๋ฐฑ๋ถ„์œจ๋กœ
df['์นดํ…Œ๊ณ ๋ฆฌ'].value_counts(normalize=True) * 100

โœจ ์„ฑ๋Šฅ ์ตœ์ ํ™”

๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌํ•  ๋•Œ ์†๋„๋ฅผ ๋†’์ด๋Š” ๋ฐฉ๋ฒ•๋“ค!

# iterrows ๋Œ€์‹  itertuples ์‚ฌ์šฉ (ํ›จ์”ฌ ๋น ๋ฆ„!)
for row in df.itertuples():
    print(row.์ด๋ฆ„, row.๋‚˜์ด)

# apply ๋Œ€์‹  ๋ฒกํ„ฐํ™” ์—ฐ์‚ฐ
# ๋А๋ฆผ
df['์ƒˆ์—ด'] = df['๊ธฐ์กด์—ด'].apply(lambda x: x * 2)
# ๋น ๋ฆ„
df['์ƒˆ์—ด'] = df['๊ธฐ์กด์—ด'] * 2

# query ๋ฉ”์„œ๋“œ ํ™œ์šฉ
# ๋А๋ฆผ
df[df['๋‚˜์ด'] > 20]
# ๋น ๋ฆ„
df.query('๋‚˜์ด > 20')

# eval ๋ฉ”์„œ๋“œ๋กœ ๋ณต์žกํ•œ ๊ณ„์‚ฐ
df.eval('์ƒˆ์—ด = ์—ด1 + ์—ด2 * ์—ด3')

๐ŸŽฏ ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ

์™€! ์—ฌ๊ธฐ๊นŒ์ง€ ์ฝ์—ˆ๋‹ค๋ฉด ์ •๋ง ๋Œ€๋‹จํ•ด! ๐Ÿ‘๐Ÿ‘๐Ÿ‘

Python ๋ฐ์ดํ„ฐ ์‚ฌ์ด์–ธ์Šค์˜ ํ•ต์‹ฌ์ธ NumPy, Pandas, Matplotlib์„ ๋ชจ๋‘ ์‚ดํŽด๋ดค์–ด. ์ฒ˜์Œ์—” ์–ด๋ ค์›Œ ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ํ•˜๋‚˜์”ฉ ๋”ฐ๋ผ ํ•˜๋‹ค ๋ณด๋ฉด ์–ด๋А์ƒˆ ๋ฐ์ดํ„ฐ ๋ถ„์„ ๊ณ ์ˆ˜๊ฐ€ ๋˜์–ด ์žˆ์„ ๊ฑฐ์•ผ!

๊ธฐ์–ตํ•ด, ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฑด ๊พธ์ค€ํ•œ ์—ฐ์Šต์ด์•ผ. ๋งค์ผ ์กฐ๊ธˆ์”ฉ์ด๋ผ๋„ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , ์‹ค์ œ ๋ฐ์ดํ„ฐ๋กœ ์‹ค์Šตํ•ด๋ด. ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ ๋ฐ์ดํ„ฐ ๋ถ„์„ ๊ด€๋ จ ์žฌ๋Šฅ์„ ๊ณต์œ ํ•˜๊ฑฐ๋‚˜ ๋ฐฐ์šฐ๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์•ผ! ๐Ÿ’ช

๐Ÿš€ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋‚˜์•„๊ฐ€๊ธฐ

์ด์ œ ๊ธฐ๋ณธ์„ ๋งˆ์Šคํ„ฐํ–ˆ์œผ๋‹ˆ, ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋‚˜์•„๊ฐˆ ์ค€๋น„๊ฐ€ ๋์–ด!

๐Ÿ“š ๋” ๋ฐฐ์šธ ๊ฒƒ๋“ค

โ€ข Seaborn (๊ณ ๊ธ‰ ์‹œ๊ฐํ™”)
โ€ข Scikit-learn (๋จธ์‹ ๋Ÿฌ๋‹)
โ€ข Plotly (์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ๊ทธ๋ž˜ํ”„)
โ€ข SQL (๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค)
โ€ข Jupyter Notebook (๋ถ„์„ ํ™˜๊ฒฝ)

๐Ÿ’ผ ์‹ค์ „ ํ”„๋กœ์ ํŠธ ์•„์ด๋””์–ด

โ€ข ์ฃผ์‹ ๊ฐ€๊ฒฉ ์˜ˆ์ธก
โ€ข ์˜ํ™” ์ถ”์ฒœ ์‹œ์Šคํ…œ
โ€ข ๋‚ ์”จ ๋ฐ์ดํ„ฐ ๋ถ„์„
โ€ข ์†Œ์…œ ๋ฏธ๋””์–ด ํŠธ๋ Œ๋“œ ๋ถ„์„
โ€ข ๋ถ€๋™์‚ฐ ๊ฐ€๊ฒฉ ์˜ˆ์ธก

๐ŸŒ ์ปค๋ฎค๋‹ˆํ‹ฐ ์ฐธ์—ฌ

โ€ข Kaggle ๋Œ€ํšŒ ์ฐธ๊ฐ€
โ€ข GitHub์— ์ฝ”๋“œ ๊ณต์œ 
โ€ข ๋ธ”๋กœ๊ทธ์— ๋ถ„์„ ๊ฒฐ๊ณผ ํฌ์ŠคํŒ…
โ€ข ์Šคํ„ฐ๋”” ๊ทธ๋ฃน ์ฐธ์—ฌ
โ€ข ์žฌ๋Šฅ๋„ท์—์„œ ์ง€์‹ ๊ณต์œ 

๐ŸŽ“ ์ž๊ฒฉ์ฆ ๋„์ „

โ€ข ๋ฐ์ดํ„ฐ ๋ถ„์„ ์ค€์ „๋ฌธ๊ฐ€ (ADsP)
โ€ข ๋ฐ์ดํ„ฐ ๋ถ„์„ ์ „๋ฌธ๊ฐ€ (ADP)
โ€ข Google Data Analytics
โ€ข Microsoft Certified: Data Analyst
โ€ข IBM Data Science Professional

๐Ÿ’ก ๋งˆ์ง€๋ง‰ ์กฐ์–ธ: ๋ฐ์ดํ„ฐ ๋ถ„์„์€ ๋‹จ์ˆœํžˆ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ์•ผ. ๋ฐ์ดํ„ฐ ๋’ค์— ์ˆจ๊ฒจ์ง„ ์ด์•ผ๊ธฐ๋ฅผ ์ฐพ์•„๋‚ด๊ณ , ๊ทธ๊ฑธ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์„ค๋“๋ ฅ ์žˆ๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ๊ฑฐ์•ผ. ๊ธฐ์ˆ ์  ์Šคํ‚ฌ๋„ ์ค‘์š”ํ•˜์ง€๋งŒ, ๋น„์ฆˆ๋‹ˆ์Šค ๊ฐ๊ฐ๊ณผ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ๋Šฅ๋ ฅ๋„ ํ•จ๊ป˜ ํ‚ค์›Œ๋‚˜๊ฐ€๊ธธ ๋ฐ”๋ผ! ๐Ÿ“Šโœจ

๐ŸŽ‰ ์ถ•ํ•˜ํ•ด! ์ด์ œ ๋‹น์‹ ๋„ ๋ฐ์ดํ„ฐ ์‚ฌ์ด์–ธํ‹ฐ์ŠคํŠธ์˜ ๊ธธ์„ ๊ฑท๊ณ  ์žˆ์–ด! ๐ŸŽ‰

๊ถ๊ธˆํ•œ ์ ์ด ์žˆ๊ฑฐ๋‚˜ ๋” ๋ฐฐ์šฐ๊ณ  ์‹ถ๋‹ค๋ฉด ์žฌ๋Šฅ๋„ท์—์„œ ๋‹ค์–‘ํ•œ ์ „๋ฌธ๊ฐ€๋“ค๊ณผ ์†Œํ†ตํ•ด๋ด.
ํ•จ๊ป˜ ์„ฑ์žฅํ•˜๋Š” ์ฆ๊ฑฐ์›€์„ ๋А๋‚„ ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ! ๐Ÿ’ช๐Ÿ˜Š

Happy Coding! ๐Ÿš€ ๋ฐ์ดํ„ฐ ๋ถ„์„์˜ ์„ธ๊ณ„์— ์˜ค์‹  ๊ฒƒ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค ๐Ÿ ๐Ÿ“Š ๐Ÿ“ˆ ๐Ÿ’ก ๐ŸŽฏ Keep Learning, Keep Growing! โœจ

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด, ์žฌ๋Šฅ๋„ท์—์„œ ๋” ๋งŽ์€ ์ง€์‹์„ ํƒํ—˜ํ•ด๋ณด์„ธ์š”! ๐ŸŒŸ
๋ฐ์ดํ„ฐ ๋ถ„์„์˜ ์—ฌ์ •์€ ์ด์ œ ์‹œ์ž‘์ž…๋‹ˆ๋‹ค. ํ™”์ดํŒ…! ๐Ÿ’ช

๋Œ“๊ธ€ ์ž‘์„ฑ

์ด ๊ธ€์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒ๊ฐ์„ ๋“ค๋ ค์ฃผ์„ธ์š”

๋Œ“๊ธ€ 0