본문 바로가기

DS/DS2

Numpy, Pandas

🔷 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