Ver3.0 ๐ Python ๋ฐ์ดํฐ ์ฌ์ด์ธ์ค ์์ ์ ๋ณต! Pandas, NumPy, Matplotlib์ผ๋ก ๋ฐ์ดํฐ ๋ถ์ ๋ง์คํฐํ๊ธฐ

๐ Python ๋ฐ์ดํฐ ์ฌ์ด์ธ์ค ์์ ์ ๋ณต! Pandas, NumPy, Matplotlib์ผ๋ก ๋ฐ์ดํฐ ๋ถ์ ๋ง์คํฐํ๊ธฐ
์น๊ตฌ์ฒ๋ผ ์ฝ๊ฒ ๋ฐฐ์ฐ๋ ๋ฐ์ดํฐ ๋ถ์์ ๋ชจ๋ ๊ฒ ๐โจ
์๋
! ๐ ๋ฐ์ดํฐ ๋ถ์์ ๊ด์ฌ ์๋ ์น๊ตฌ๋ค ๋ชจ๋ ํ์ํด! ์์ฆ ๋ฐ์ดํฐ ์ฌ์ด์ธ์ค๊ฐ ์ ๋ง ํซํ์์? ๊ทผ๋ฐ ๋ง์ ์์ํ๋ ค๋๊น ๋ญ๋ถํฐ ํด์ผ ํ ์ง ๋ง๋งํ์ง ์์? ๊ฑฑ์ ๋ง! ์ค๋์ Python์ผ๋ก ๋ฐ์ดํฐ ๋ถ์์ ์์ํ๋ ๋ฐฉ๋ฒ์ ์์ฃผ ์ฝ๊ณ ์ฌ๋ฏธ์๊ฒ ์๋ ค์ค๊ฒ. ๐
์ด ๊ธ์์๋ ๋ฐ์ดํฐ ๋ถ์์ 3๋์ฅ์ด๋ผ๊ณ ๋ถ๋ฆฌ๋ Pandas, NumPy, Matplotlib์ ์ค์ฌ์ผ๋ก ์ค์ ์์ ๋ฐ๋ก ์จ๋จน์ ์ ์๋ ๋ด์ฉ๋ค์ ๋ค๋ฃฐ ๊ฑฐ์ผ. ์ด๋ก ๋ง ์ฃผ๊ตฌ์ฅ์ฐฝ ๋์ด๋๋ ๊ฑด ์ฌ๋ฏธ์์ผ๋๊น, ์ค์ ์์ ์ ํจ๊ป ์น๊ตฌํํ
์ค๋ช
ํ๋ฏ์ด ํธํ๊ฒ ํ์ด๊ฐ๊ฒ! ๐
๐ฏ ์ Python์ผ๋ก ๋ฐ์ดํฐ ๋ถ์์ ํด์ผ ํ ๊น?
๋จผ์ ์ด์ผ๊ธฐํด๋ณผ ๊ฑด, ์ ํํ Python์ด๋๋ ๊ฑฐ์ผ. R๋ ์๊ณ , Excel๋ ์๊ณ , ๋ค๋ฅธ ๋๊ตฌ๋ค๋ ๋ง์๋ฐ ๋ง์ด์ผ.
์์งํ ๋งํ๋ฉด Python์ ๋ฐ์ดํฐ ๋ถ์๊ณ์ ์ค์์ค ์๋ฏธ ๋์ดํ ๊ฐ์ ์กด์ฌ์ผ. ๐ช ๋ฐ์ดํฐ ๋ถ์๋ฟ๋ง ์๋๋ผ ์น ๊ฐ๋ฐ, ์๋ํ, ๋จธ์ ๋ฌ๋, ๋ฅ๋ฌ๋๊น์ง ๋ค ํ ์ ์๊ฑฐ๋ . ํ ๋ฒ ๋ฐฐ์๋๋ฉด ์ ๋ง ๋ค์ํ ๋ถ์ผ์์ ํ์ฉํ ์ ์์ด์ ๊ฐ์ฑ๋น๊ฐ ๋๋ด์ค๋ค๊ณ !
๐ ํ๋ถํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
Pandas, NumPy, Matplotlib ๊ฐ์ ๊ฐ๋ ฅํ ๋๊ตฌ๋ค์ด ์ด๋ฏธ ๋ค ์ค๋น๋์ด ์์ด. ๋ฐํด๋ฅผ ๋ค์ ๋ฐ๋ช ํ ํ์๊ฐ ์์ง!
๐ฅ ๊ฑฐ๋ํ ์ปค๋ฎค๋ํฐ
๋งํ๋ ๋ถ๋ถ์ด ์์ผ๋ฉด ๊ตฌ๊ธ๋ง๋ง ํด๋ ๋ต์ด ๋์. Stack Overflow์ ์ง๋ฌธํ๋ฉด ์น์ ํ ๊ฐ๋ฐ์๋ค์ด ๋์์ค!
๐ ๋ฐฐ์ฐ๊ธฐ ์ฌ์ด ๋ฌธ๋ฒ
์์ด ๋ฌธ์ฅ์ฒ๋ผ ์ฝํ๋ ์ง๊ด์ ์ธ ๋ฌธ๋ฒ ๋๋ถ์ ํ๋ก๊ทธ๋๋ฐ ์ด๋ณด์๋ ๊ธ๋ฐฉ ์ตํ ์ ์์ด.
๐ผ ์ทจ์ ์์ฅ์ ๊ฐ์
๋ฐ์ดํฐ ๋ถ์๊ฐ, ๋ฐ์ดํฐ ์ฌ์ด์ธํฐ์คํธ ์ฑ์ฉ ๊ณต๊ณ ๋ฅผ ๋ณด๋ฉด Python ์คํฌ์ด ๊ฑฐ์ ํ์์ผ. ์ปค๋ฆฌ์ด์๋ ๋์์ด ๋ผ!
๐ข 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๋ก ํ ์ ์๋ ๋ฉ์ง ๊ฒ๋ค
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['์ง๊ธ'])
๐ 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()
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๋ถ์ ์๋ฃ! ๊ทธ๋ํ๊ฐ ์ ์ฅ๋์์ต๋๋ค.")
๐ ๋ ๋์๊ฐ๊ธฐ: ๊ณ ๊ธ ๊ธฐ๋ฅ๋ค
๊ธฐ๋ณธ์ ๋ง์คํฐํ๋ค๋ฉด ์ด์ ํ ๋จ๊ณ ๋ ๋์๊ฐ๋ณผ๊น? ์ค๋ฌด์์ ์ ๋ง ์ ์ฉํ ๊ณ ๊ธ ๊ธฐ๋ฅ๋ค์ ์๊ฐํ ๊ฒ!
๐ ๋ฐ์ดํฐ ๋ณํฉ (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: ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ์๋ฌ
์ฆ์: ํฐ 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
๐ ์ถํํด! ์ด์ ๋น์ ๋ ๋ฐ์ดํฐ ์ฌ์ด์ธํฐ์คํธ์ ๊ธธ์ ๊ฑท๊ณ ์์ด! ๐
๊ถ๊ธํ ์ ์ด ์๊ฑฐ๋ ๋ ๋ฐฐ์ฐ๊ณ ์ถ๋ค๋ฉด ์ฌ๋ฅ๋ท์์ ๋ค์ํ ์ ๋ฌธ๊ฐ๋ค๊ณผ ์ํตํด๋ด.
ํจ๊ป ์ฑ์ฅํ๋ ์ฆ๊ฑฐ์์ ๋๋ ์ ์์ ๊ฑฐ์ผ! ๐ช๐
์ด ๊ธ์ด ๋์์ด ๋์๋ค๋ฉด, ์ฌ๋ฅ๋ท์์ ๋ ๋ง์ ์ง์์ ํํํด๋ณด์ธ์! ๐
๋ฐ์ดํฐ ๋ถ์์ ์ฌ์ ์ ์ด์ ์์์
๋๋ค. ํ์ดํ
! ๐ช
๊ด๋ จ ํค์๋
๋๊ธ 0
์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.

๋๊ธ ์์ฑ
์ด ๊ธ์ ๋ํ ์ฌ๋ฌ๋ถ์ ์๊ฐ์ ๋ค๋ ค์ฃผ์ธ์
๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค
๋๊ธ์ ์์ฑํ๋ ค๋ฉด ๋จผ์ ๋ก๊ทธ์ธํด์ฃผ์ธ์.