[Python/Data] 기초 정리

Yumya's record·2025년 2월 25일

SKALA

목록 보기
4/25
post-thumbnail

🐣 파이썬 기초 문법 헷갈리는 것 + Data 기초 개념 위주 정리 🐣

파이썬 언어 특징

  1. 간결한 문법 : 가독성 중시
  2. 인터프리어 언어 : 컴파일을 하지 않고 실행하며, 한 줄씩 실행됨
  3. 다양한 프로그래밍 패러다임 지원 : 절차적, 객체지향적, 함수형 프로그래밍 지원
  4. 플랫폼 독립성
  5. 풍부한 라이브러리

파이썬 문법

불변, 가변

문자열은 불변 객체로, 인덱싱으로 변경 불가
리스트는 가변 객체로, 인덱싱으로 변경 가능

자료형

  • 튜플 : () 사용, 값 추가/변경 불가
  • 리스트 : [] 사용, 값 추가/변경 가능
  • 딕셔너리 : {key : value}
  • 집합 : set(), 중복 허용 X, 순서 보장 X
  • bool : True/False

변수

컴퓨터에 데이터가 저장되는 메모리 공간의 위치

명명 규칙

  • 영문(대소문자), _(언더바), 숫자 조합 가능
  • 특수문자, 공백, 예약어 X
  • 숫자로 시작 X
  • 대소문자 구분

type()

자료형 확인

x = 10
print(type(x)) # <class 'int'>

인덱스

0부터 시작

인덱싱

[start:end:step]에서 실제 범위는 start에서 end-1까지, end는 포함되지 않음

문자열 연결

문자열 + 정수 + 문자열 불가능 -> 문자열 + str(정수) + 문자열 가능

문자열 포맷팅

  • % : '키는 %.2f입니다.'%height
  • Format() : '키는 {}입니다.'.format(height)
  • f-string : f'키는 {height:.2f}입니다.

print()

  • print(내용1, 내용2, sep=구분자) -> 내용1 + 구분자 + 내용2
  • print(내용1, 내용2, end=문자) -> 내용1 + 내용2 + 문자

Null

= None, 빈 문자열을 의미

input()

키보드 입력

strip()

양쪽 공백 제거

반복문

for x in range(start, end, step):
	반복문...
    
for x in list:
	반복문...
    
while 조건:
	반복문...

for x, y in enumerate(list/set/tuple/dict/string):
	반복문 ...
# x = 인덱스, y = 값 

리스트

[]사용

functioncontent
append(원소)원소 추가
insert(인덱스, 원소)인덱스에 원소 추가
extend(리스트)리스트 확장
pop()마지막 원소 반환/제거
remove(원소)원소 제거
clear()리스트 초기화
index(원소)원소의 인덱스 반환
count(원소)원소의 개수 반환
sort(reverse=False/True)False : 오름차순, True : 내림차순

튜플

()사용, 값 추가/수정/삭제 X
tuple1 + tuple2 = tuple1과 tuple2가 더해진 tuple

딕셔너리

{key : value} 사용

dict[key] # value 접근
del dict[key] # key 삭제 (value도 같이 삭제)

함수

def 함수명 (매개변수) :
	...
    return 변수

함수명(입력값) # 함수 호출

가변 매개변수

  • *args : 리스트로 인식해 매개변수를 받아옴
  • **kwargs : 함수 호출 시 key=value 형태로 넘긴 인자들을 딕셔너리 형태로 받아옴

값에 의한 호출

def func(x):
	x = 100
    print(x)

x = 10
print(x) # 10
func(x) # 100
print(x) # 10

레퍼런스에 의한 호출

def func(x):
	x[0] = 100
    print(x)
x = [1, 2, 3]
print(x) # [1, 2, 3]
func(x) # [100, 2, 3]
print(x) # [100, 2, 3]

람다 함수

x = lambda a : a ** 2
x(5) # 25


배열.sort(key=lambda x:x[1]) # x[1] 기준 배열 정렬
list(map(lambda x : x ** 2, 리스트)) # 리스트의 모든 원소에 제곱 함수 매핑
list(filter(lambda x : x % 2 == 0, 리스트)) # 리스트에서 짝수인 원소만 추출

지역 변수

호출된 함수 내에서만 유효

전역 변수

하위의 모든 함수에서 유효

키워드 global

def func(x):
	global x # 공유 변수
    x = 100
    print(x)

x = 10
print(x) # 10
func(x) # 100 -> 공유 변수를 100으로 변경
print(x) # 100  -> 이후 호출 시 100

인스턴스 속성

객체(인스턴스)마다 개별적으로 가지는 변수, self.속성명 = 값 형태

class 클래스명:
	def __init(self, 속성1, 속성2):
    	self.속성1 = 속성1
        self.속성2 = 속성2

파일 입출력

# 방법 1
with open (파일, mode) as f: 
	# mode : r(read), w(write), a(add)
	# w, a mode에서 file이 존재하지 않을 경우 새로 생성
    # w : 덮어쓰기, a : 뒤에 추가
    
	f.write(content)   # content write
    content = f.read()   # file read
    f.writelines(list)   # list의 각 요소를 파일에 write
    lines = f.readlines()   # file의 모든 줄을 읽어 list로 변환
    # close 불필요


# 방법 2
f = open(파일, mode, encoding='utf-8')
f.write(content) # file write
f.close() # 파일을 열었다면 닫아야함

모듈

py 파일 생성해서 import

# 방법 1
import 패키지
패키지.함수() # 패키지 안의 함수 사용

# 방법 2
from 패키지 import 함수
함수() # 함수 사용

math

  • floor : 내림
  • ceil : 올림
  • round : 반올림
  • factorial: 팩토리얼
  • sin/cos/tan
  • pi : 3.14
  • pow : 제곱
  • sqrt : 제곱근
  • log10 : 밑이 10인 로그값

random

  • random : 0이상 1미만 실수, 난수
  • randrange(start, end, step) : start ~ end-1 이하 범위에서 start에 step을 더한 범위 내 정수 난수
  • randint(start, end) : start ~ end 사이 수
  • choice(리스트) : 리스트 내 무작위 요소
  • shuffle(리스트) : 리스트 요소 무작위 섞기

datetime

from datetime import datetime

today = datetime.now()
today.year # 년
today.month # 월
today.day # 일
today.hour # 시
today.minute # 분
today.second # 초
today.strftime('%Y/%m/%d %H:%M:%S') # 2025/02/25 17:53:00
today.strftime('%y-%m-%d %p %l %M') # 25-02-25 PM 17:53

객체

클래스로부터 생성
클래스의 속성과 메소드를 가진다.

클래스

객체에서 사용되는 속성과 메소드를 정의한 틀

속성

클래스와 객체에서 사용되는 변수

메소드

클래스와 객체에서 사용되는 함수

class Member:
	number = 100 # 클래스 속성 : 클래스 내 선언된 변수, 생성 시 값 할당할 필요 X
    
    def __init__(self, name, age):
    	self.name = name
        self.age = age
    def showMember(self):
    	print(f'이름 : {self.name}')
        print(f'나이 : {self.age}')

mem = Member('콩', 10)
mem.showMember() 
# 이름 : 콩
# 나이 : 10

클래스 상속

class Animal:
	def __init__(self, name):
    	self.name = name
    def printName(self):
    	print(self.name)

class Dog(Animal):
	def __init__(self, name, sound):
    	super().__init__(name) # 생성자 상속
        self.sound = sound
    def printSound(self):
    	print(self.sound)

dog = Dog('콩', '멍')
dog.printName() # 부모 클래스의 메서드 사용 가능
dog.printSound()

CSV

Comma-separated Values

ex) csv file
이름, 나이
콩, 10
달, 22
# csv 파일 읽기
import csv

f = open(파일, 'r', encoding='utf-8')
lines = csv.reader(f)
for line in lines:
	print(line)

ex) ['이름', '나이']
	['콩', '10'] # 점수도 문자형으로 인식
    ['달', '22']


# csv 파일 출력
for line in lines:
	for x in range(len(line)):
    	print(line[x]) 
        
ex) 이름
	나이
    콩
    10
    
    
f.close() # 파일 닫기


# 데이터 헤더 추출
header = next(lines) # 맨 첫줄(헤더) 읽어옴


# csv 파일 쓰기
import csv

file1 = open(파일, 'r', encoding='utf-8')
file2 = open(파일, 'w', encoding='utf-8', newline='') 
# newline : 파일을 읽고 쓸 때 줄바꿈을 어떻게 처리할지 설정

lines = csv.reader(file1) # 파일 읽기
wr = csv.writer(file2) # 파일 쓰기 객체
wr.writerow(리스트) # 한 줄 쓰기

Matplotlib

분석 데이터를 그래프나 차트로 시각화해주는 파이썬 패키지 라이브러리

import matplotlib.pyplot as plt

# 한글 폰트 설정
from matplotlib import rc

rc('font', family='Malgun Gothic')
font1 = {'size' : 크기, 'color' : 색상}


# 그래프
data=[20, 30, 40]
x=[1, 2, 3]

plt.plot(xdata, ydata, label=라벨 이름, color=색, linestyle=선 스타일, marker=점 모양)
# linestyle : '-', '--', '-.', ':'
# marker : 'o', 'x', 's', 'd'


# 선 그래프, label : 범례
plt.plot(x, data, label=라벨 이름) 

# 막대 그래프
plt.bar(x, y) 

# 산포 그래프
plt.scatter(x, y) 

# 파이 그래프, explode : 튀어나옴 정도, autopct : 값 표기 지정, shadow : 그림자, startangle : 시작 각도
plt.pie(값 리스트, explode=(튜플), labels=값 이름 리스트, autopct='%1.1f%%', shadow=True, startangle=90) 


plt.title(제목, fontdict=font1)
plt.xlabel(x축 이름)
plt.ylabel(y축 이름)

#x, y축 범위 설정
plt.xlim(시작, 끝)
plt.ylim(시작, 끝)
plt.xticks(list(range(시작, 끝, step)))
plt.yticks(list(range(시작, 끝, step)))

plt.grid(True/False) # 눈금 설정

plt.show() # 그래프 그리기


# 그래프 여러개 그리기
fig, axis = plt.subplots(nrows=1, ncols=2, figsize=(가로, 세로), sharex=True/False, sharey=True/False) 
#sharex, sharey : True 설정 시 축 범위 통일

ax=axis[0] # 첫번째 그래프
ax.scatter(x, y1)
ax.set_title(제목)

ax=axis[1] # 두번째 그래프
ax.scatter(x, y2)
ax.set_title(제목)

fig.suptitle(서브 제목)

plt.subplots_adjust(left=0.1, right=0.9, bottom=0.1, top=0.9, wspace=0.2, hspace=0.3) # 그래프 간격 조정

데이터 분석

데이터를 수집, 정리, 시각화, 해석해 의미있는 정보를 도출하는 과정
ex) 분석 -> 전략 수집/정책 제안/관리

중요성

  1. 데이터 기반 의사 결정
  2. 문제 해결 및 패턴 발견
  3. 미래 예측 및 트렌드 파악

Numpy

수치 계산 및 배열 연산을 위한 파이썬 라이브러리
다차원 배열을 빠르고(리스트보다 빠름), 메모리를 효율적으로 처리
반복문 없이도 배열 전체에 대한 연산 가능

import numpy as np

np.array([1, 2, 3]) # 1차원 배열
np.array([[1, 2], [3, 4]]) # 2차원 배열
np.zeros((행, 열)) # 모든 원소가 0인 배열
np.ones((행, 열)) # 모든 원소가 1인 배열
np.arange(start, end, step) # 일정한 step을 가지는 값을 생성한 배열, end는 범위에 포함X

인덱싱

배열[인덱스]

슬라이싱

배열[start:end:step] # end는 범위에 포함 X

산술 연산

배열 + 배열, 배열 * 배열 -> 각 원소의 연산 값을 구함, 즉 배열과 배열 간의 연산 가능

브로드캐스팅

서로 다른 크기의 배열 간에도 연산이 가능하도록 자동으로 크기를 맞춰줌

ex) 
[[1], [2], [3]] + [10, 20]
= [[1] + 10, [1] + 20],
  [[2] + 10, [2] + 20],
  [[3] + 10, [3] + 20]
= [[11, 21], [12, 22], [13, 23]]

통계 함수

배열 내 덧셈, 뺄셈, 곱셈, 나눗셈 등 기본 연산 가능

data=np.array([1, 2, 3])
data.mean() # 2
data.sum() # 6
data.max() # 3
data.min() # 1
data.sum(axis=0/1) # 0 : 열 기준, 1 : 행 기준 합계

Pandas

데이터를 효율적으로 분석하고, 조작할 수 있도록 도와주는 라이브러리
여러 Series가 결합된 2차원 데이터 구조
표 형태의 데이터를 다룰 때 사용

import pandas as pd

data={'name': ['A', 'B'], 'age': [25, 30]}

df = pd.DataFrame(data)

#	Name	Age
0	A		25
1	B		30


df = pd.read_csv(파일) # csv 파일 읽기
df.to_csv(output 파일, index=True/False) # 인덱스 저장/제외하고 파일 저장

df.head() # 상위 5개 행 출력
df.info() # 데이터 타입 및 결측치 확인
df.shape # 행, 열 개수
df.describe() # 요약 통계량

df[컬럼] # 특정 컬럼 출력
df[df[컬럼] > 18] # 조건 필터링

결측치 NaN

데이터에 값이 없는 것
결측치가 맞는지 확인 후 결측치를 다른 값으로 대체하거나 삭제

  • isnull() : 결측치 여부 확인
  • dropna() : 결측치가 있는 행/열 삭제
  • fillna(값) : 결측치를 특정 값으로 대체
  • ffill() : 앞의 값으로 채우기
  • bfill() : 뒤의 값으로 채우기
  • astype(자료형) : 채운 후 데이터 타입 변환
df.isnull().sum() # 각 컬럼별 결측치 개수 확인
df.dropna(subset=[컬럼]) # 특정 열에서 결측치가 있는 행만 삭제
df.dropna(axis=1) # 결측치가 있는 컬럼 자체 삭제
df.copy() # 복사
df[컬럼].fillna(df[컬럼].mean(), inplace=True) #결측치를 평균으로 채움
df.fillna(method='ffill') # 직전 값으로 채우기
df.fillna(method='bfill') # 다음 값으로 채우기
df[컬럼].fillna(df[컬럼].mean()).astype(자료형) # 결측치 대체 후 자료형 변경
df[df.isnull().any(axis=0/1)] # 결측치가 포함된 열/행만 출력

groupby()

특정 컬럼을 기준으로 데이터 그룹화
비슷한 데이터를 그룹으로 묶고, 다양한 방식으로 요약

df.groupby(컬럼)[컬럼2].mean() # 컬럼별 평균 컬럼1 출력
# mean/sum/count 함수 등 집계 함수 사용 가능

df.groupby(컬럼)[컬럼2].agg(['sum', 'mean', 'count']) # 컬럼별 컬럼1의 합계, 평균, 개수

df.groupby([컬럼1, 컬럼2])[컬럼3].mean() 
# 컬럼1과 컬럼2를 기준으로 그룹화해 컬럼3의 평균 계산 

Seaborn

python의 데이터 시각화 라이브러리
Matplotlib 위에서 동작, 통계적 데이터 시각화에 최적화, 데이터 분석 용이

import seaborn  as sns

sns.load_dataset(데이터셋) # 데이터셋 로드

sns.hisplot(data=데이터셋, x=x축 이름, bins=10) # 히스토그램
sns.boxplot(data=데이터셋, x=x축 이름, y=y축 이름) # 박스 플롯
sns.barplot(x=x축, y=y축, data=데이터셋) # 바
sns.scatterplot(data=데이터셋, x=x축, y=y축, hue='time') #산점도
# hue : 데이터를 그룹별로 나눠 색상을 다르게 표시

sns.barplot(x=x축, y=y축, data=데이터셋, palette=팔레트) # 색상 팔레트 적용

sns.set_style(스타일) # 스타일 적용
# 스타일 : whitegrid/darkgrid/dark/white/ticks 등

데이터 전처리

  1. 분석 및 모델링 성능 좌오
  2. 결측치 처리, 이상치 제거, 데이터 정규화/표준화 -> 더 나은 분석 결과 도출

기법

  • 정규화 : 데이터 범위를 일정한 범위(0~1)로 변환하는 과정
from sklearn.preprocessing import MinMasScaler

scaler = MinMaxScaler() # 크기 조정
df[[컬럼]] = scaler.fit_transform(df[[컬럼]])
  • 표준화 : 데이터를 평균이 0, 표준편차가 1인 분포로 변환
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
df[[컬럼]] = scaler.fit_transform(df[[컬럼]])
  • 이상치 처리 : 정체 데이터의 패턴에서 크게 벗어난 값
    • 제거
    • 대체 : 평균, 중앙값, 예측값
    • 변환 : 로그 변환 등

이상치

데이터에서 다른 값들과 동떨어진 극단적인 값
IQR(Interquartile)을 통해 데이터에서 중간 50%가 어디 있는지 확인

Q1 = df[컬럼].quantile(0.25) # 1사 분위수
Q2 = df[컬럼].quantile(0.75) # 3사 분위수
IQR = Q3 - Q1

lower_bound = Q1 - 1.5 * IQR # 하한선
upper_bound = Q3 + 1.5 * IQR # 상한선

outliers = df[(df[컬럼] < lower_bound) | (df[컬럼] >  upper_bound)] # 이상치 추출

Scikit-learn(사이킷런)

머신러닝을 쉽게 할 수 있도록 도와주는 라이브러리

작업

  • 데이터 전처리 : 데이터 정리, 변환을 통해 결측치 처리, 정규화
  • 지도 학습 : 입력, 정답이 있는 학습 -> 분류
  • 비지도 학습 : 정답 없이 패턴 찾기 -> 그룹화
  • 모델 평가 : 정확도, 오차(MSE) 계산

기능

  • 데이터 전처리 : 결측치 처리, 정규화 - StandardScaler()
  • 모델 선택 : 가장 좋은 모델 찾기 - GridSearchCV()
  • 머신러닝 알고리즘 : ML모델 제공 - RandomForestClassifier()
  • 모델 평가 : 정확도, F1-Score 계산 - accuracy_score()

데이터 정제

과정

  1. 데이터 분석 : 오류 파악, 데이터 추출
  2. 세분화 : 작업 단위로 분할
  3. 표준화 : 통일된 표기로 변환
  4. 우선순위 설정 : 요구사항 분석 후 시스템 설계 수행
  5. 오류 검출, 수정 : 특이값, 불일치값, 결측치 검출
  6. 무결성 체크 : 개체, 도메인, 참고, 사용자 정의로 구분, 속성간 불일치 값 파악, 중복 레코드 검사

머신러닝

  • 지도학습 : 정답이 있는 데이터를 사용해 모델 학습 - 회귀분석, 분류
  • 비지도 학습 : 정답이 없는 데이터에서 패턴이나 구조 발견 - 클러스터링, 차원 축소

회귀 분석

변수 간의 관게를 모델링하는 통계적 방법
예측을 목표로 하는 통계 분석
ex) 선형 회귀, 다중 회귀(여러 독립변수 사용), 로지스틱 회귀

비선형 회귀 분석

직선의 회귀선을 곡선으로 변환해 더 정확하게 데이터 예측
상대적으로 더 작은 잔차를 이용해 데이터 변화의 추세를 정교하게 데이터 변화를 예측

잔차

실제 관측값과 예측값의 사이

선형 회귀

독립변수 x와 종속변수 y간의 관계를 선형 방정식으로 모델링하는 방법
데이터에 가장 잘 맞는 직선을 찾는 것이 목표

구현

# 데이터 분리 (학습/테스트)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)


# 모델 학습
from sklearn.linear_model import LinearRegression

model = LinearRegession()
model.fit(X_train, y_train)

model.coef_[0] # 기울기
model.intercept_ # 절편(W0)


# 예측 및 평가
from sklearn.metrics import mean_squared_error

y_pred = model.predict(X_test) # 테스트 데이터로 예측
mse = mean_squared_error(y_test, y_pred) # 평균 제곱 오차(MSE)

MSE

평균 제곱 오차 = (예측값 - 실제값)의 제곱의 합 / n
모델이 예측한 값과 실제 값의 차이 측정
mse가 작을 수록 예측 잘됨

R2

결정 계수 = 1 - MSE / 분산
모델이 데이터를 얼마나 잘 설명하는지 나타내는 지표

MSE가 작고 R2가 높을 수록 좋은 모델

기술 통계

데이터를 계량화한 수치값으로 표현

추론 통계

추리, 추정하는 통계
데이터 바탕으로 미래 예측

Decorator

함수나 메서드의 기능을 수정, 확장하는 도구, @ 사용
함수를 인수로 받아 새로운 함수를 반환

def my_decorator(func):
	def wrapper():
    	print('함수 실행 전')
        func()
        print('함수 실행 후')
   	return wrapper # 함수 반환


@my_decorator
def hello():
	print('Hello')


hello()


# 결과
1. hello() 호출
2. @my_decorator으로 인자로 hello 전달, my_decorator의 반환 함수인 wrapper 실행
3. print('함수 실행 전') 실행 -> 함수 실행 전 
4. func 실행, 이때 func은 hello() -> Hello
5. print('함수 실행 후') 실행 -> 함수 실행 후
6. 종료
profile
🍀 ٩(ˊᗜˋ*)و 🍀

0개의 댓글