🔷 1. Numpy (Numerical Python)
✅ 1-1. Numpy 배열 생성
import numpy as np
# 리스트로부터 배열 생성
arr1 = np.array([1, 2, 3, 4, 5])
# 2차원 배열 생성
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
# 0으로 채운 배열
zeros = np.zeros((3, 3))
# 1로 채운 배열
ones = np.ones((2, 4))
# 랜덤 값 배열 (0~1 사이)
random_arr = np.random.rand(3, 3)
print(arr1, arr2, zeros, ones, random_arr)
✅ 1-2. 배열 속성 확인
print(arr2.shape) # 배열의 차원 (2행 3열)
print(arr2.ndim) # 배열의 차원 수 (2차원)
print(arr2.size) # 배열의 총 원소 개수 (6개)
print(arr2.dtype) # 배열의 데이터 타입 (int, float 등)
✅ 1-3. 배열 연산 (벡터 연산)
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(a + b) # 요소별 덧셈 → [5, 7, 9]
print(a - b) # 요소별 뺄셈 → [-3, -3, -3]
print(a * b) # 요소별 곱셈 → [4, 10, 18]
print(a / b) # 요소별 나눗셈 → [0.25, 0.4, 0.5]
✅ 1-4. 행렬 연산
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
print(A @ B) # 행렬 곱 (또는 np.dot(A, B))
print(A.T) # 전치 행렬 (Transpose)
print(np.linalg.inv(A)) # 역행렬
✅ 1-5. 배열 인덱싱 & 슬라이싱
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr[0, 1]) # 첫 번째 행, 두 번째 열 → 2
print(arr[:, 1]) # 두 번째 열 전체 → [2, 5, 8]
print(arr[1, :]) # 두 번째 행 전체 → [4, 5, 6]
print(arr[0:2, 1:3]) # 특정 영역 → [[2, 3], [5, 6]]
✅ 1-6. 통계 연산
data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(np.mean(data)) # 전체 평균
print(np.mean(data, axis=0)) # 열 평균
print(np.mean(data, axis=1)) # 행 평균
print(np.std(data)) # 표준편차
print(np.max(data)) # 최대값
print(np.min(data)) # 최소값
✅ 1-7. NaN 값 처리
data = np.array([1, 2, np.nan, 4, 5])
print(data.isnull()) # 결측치 여부 확인 (True = NaN)
print(data.notnull()) # 결측치가 아닌 경우 (True = 값이 존재)
print(data.isnull().sum()) # 각 열별 결측치 개수 확인
🔶 2. Pandas (데이터 프레임 조작)
✅ 2-1. 데이터 프레임 생성
import pandas as pd
# 딕셔너리를 사용한 데이터프레임 생성
data = {"Name": ["Alice", "Bob", "Charlie"], "Age": [25, 30, 35], "Score": [85, 90, 95]}
df = pd.DataFrame(data)
print(df)
✅ 2-2. CSV 파일 읽고 쓰기
df.to_csv("data.csv", index=False) # CSV 파일 저장
df2 = pd.read_csv("data.csv") # CSV 파일 읽기
✅ 2-3. 데이터 조회
print(df.head()) # 상위 5개 행 출력
print(df.tail()) # 하위 5개 행 출력
print(df.info()) # 데이터프레임 정보 출력
print(df.describe()) # 기초 통계 정보 출력
✅ 2-4. 특정 행/열 선택
print(df["Name"]) # 특정 열 선택
print(df.loc[0]) # 특정 행 선택 (라벨 기반)
print(df.iloc[1]) # 특정 행 선택 (인덱스 기반)
print(df.loc[df["Age"] > 25]) # 조건을 만족하는 행 선택
✅ 2-5. 데이터 정렬
df_sorted = df.sort_values(by="Age", ascending=False)
print(df_sorted)
✅ 2-6. 결측치 처리
df_grouped = df.groupby("Age").mean()
print(df_grouped)
✅ 2-7. 데이터 그룹화
df_grouped = df.groupby("Age").mean()
print(df_grouped)
✅ 2-8. apply() 함수 사용
df["Score_Squared"] = df["Score"].apply(lambda x: x**2)
print(df)
🚀 정리
Numpy | 고속 수학 연산, 배열 처리 |
Pandas | 데이터 프레임 조작, 결측치 처리 |
- Numpy는 수치 계산, Pandas는 데이터 프레임 조작 을 담당하므로,
두 개를 함께 사용하면 효율적인 데이터 분석이 가능 합니다.
🔷 3. 행렬 연산 (Numpy & Pandas)
✅ 3-1. 행렬의 기본 연산
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
# 행렬 덧셈 & 뺄셈
print(A + B)
print(A - B)
# 요소별 곱셈
print(A * B)
# 요소별 나눗셈
print(A / B)
✅ 3-2. 행렬 곱 (@ 연산자 또는 np.dot())
C = np.array([[1, 2, 3], [4, 5, 6]])
D = np.array([[7, 8], [9, 10], [11, 12]])
# 행렬 곱 (2x3 행렬 * 3x2 행렬 → 2x2 행렬)
print(C @ D)
print(np.dot(C, D))
✅ 3-3. 행렬 전치 (transpose() or .T)
E = np.array([[1, 2], [3, 4], [5, 6]])
# 전치 행렬 (행과 열을 바꿈)
print(E.T)
print(np.transpose(E))
✅ 3-4. 역행렬 (np.linalg.inv())
F = np.array([[4, 7], [2, 6]])
# 역행렬 계산
F_inv = np.linalg.inv(F)
print(F_inv)
# 검증 (A * A_inv = 단위 행렬)
print(np.dot(F, F_inv)) # 단위 행렬 (Identity Matrix)
✅ 3-5. 행렬식 (np.linalg.det())
det_F = np.linalg.det(F)
print("행렬식:", det_F)
✅ 3-6. 고유값 & 고유벡터 (np.linalg.eig())
eigenvalues, eigenvectors = np.linalg.eig(F)
print("고유값:", eigenvalues)
print("고유벡터:", eigenvectors)
🔷 4. 행렬의 차원 변환
✅ 4-1. 배열 크기 변경 (reshape())
arr = np.array([1, 2, 3, 4, 5, 6])
# 1차원 배열을 2x3 행렬로 변경
arr_reshaped = arr.reshape(2, 3)
print(arr_reshaped)
✅ 4-2. 차원 추가 (np.newaxis, expand_dims())
arr = np.array([1, 2, 3])
# 1차원 배열을 (3, 1) 형태로 변경
arr_col = arr[:, np.newaxis]
# 또는
arr_col = np.expand_dims(arr, axis=1)
print(arr_col)
✅ 4-3. 차원 축소 (squeeze())
arr_3d = np.array([[[1], [2], [3]]])
# 불필요한 차원 제거 (3차원 → 1차원)
arr_squeezed = np.squeeze(arr_3d)
print(arr_squeezed)
✅ 4-4. 배열 합치기 (concatenate(), vstack(), hstack())
arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])
# 행 방향으로 합치기 (수직 결합)
vertical_stack = np.vstack((arr1, arr2))
# 열 방향으로 합치기 (수평 결합)
horizontal_stack = np.hstack((arr1, arr2))
print(vertical_stack)
print(horizontal_stack)
✅ 4-5. 배열 나누기 (split())
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
# 두 개의 2열짜리 행렬로 분할
split_arr = np.hsplit(arr, 2)
print(split_arr)
🔷 5. 결측치(NaN) 처리
✅ 5-1. 결측치(NaN) 확인
import numpy as np
import pandas as pd
# 결측치가 포함된 데이터 생성
data = pd.DataFrame({
"Name": ["Alice", "Bob", "Charlie", "David"],
"Age": [25, np.nan, 30, 35],
"Score": [85, 90, np.nan, 95]
})
print(data.isnull()) # 결측치 여부 확인 (True = NaN)
print(data.notnull()) # 결측치가 아닌 경우 (True = 값이 존재)
print(data.isnull().sum()) # 각 열별 결측치 개수 확인
✅ 5-2. 결측치 제거 (dropna())
# NaN이 포함된 행 삭제
cleaned_data = data.dropna()
print(cleaned_data)
# NaN이 포함된 열 삭제
cleaned_columns = data.dropna(axis=1)
print(cleaned_columns)
✅ 5-3. 결측치 대체 (fillna())
# NaN을 특정 값(예: 0)으로 대체
data_filled = data.fillna(0)
# NaN을 평균값으로 대체
data["Age"].fillna(data["Age"].mean(), inplace=True)
# NaN을 중간값으로 대체
data["Score"].fillna(data["Score"].median(), inplace=True)
print(data)
✅ 5-4. 결측치 보간 (interpolate())
# 결측치를 선형 보간법으로 채우기
data_interpolated = data.interpolate()
print(data_interpolated)
✅ 5-5. 특정 조건에 따라 결측치 처리
# Score가 80 미만인 경우 NaN으로 변경
data.loc[data["Score"] < 80, "Score"] = np.nan
print(data)
✅ 5-6. 결측치가 있는 행을 필터링
# Age 또는 Score에 NaN이 포함된 행 제거
filtered_data = data.dropna(subset=["Age", "Score"])
print(filtered_data)
🔷 📌 정리
기능함수
행렬 연산 | +, -, *, /, @, dot() |
전치 행렬 | .T, transpose() |
역행렬 | linalg.inv() |
행렬식 | linalg.det() |
고유값, 고유벡터 | linalg.eig() |
차원 변경 | reshape(), expand_dims(), squeeze() |
배열 합치기 | concatenate(), vstack(), hstack() |
배열 나누기 | split(), hsplit() |
결측치 확인 | isnull(), notnull(), isna() |
결측치 삭제 | dropna() |
결측치 대체 | fillna(), interpolate() |
'DS > DS2' 카테고리의 다른 글
이론 1 (0) | 2025.02.25 |
---|---|
데이터 분석에 필요한 Python 기본 문법 (0) | 2025.02.21 |
메소드 정리 (0) | 2025.02.20 |