🐣 파이썬 기초 문법 헷갈리는 것 + Data 기초 개념 위주 정리 🐣
문자열은 불변 객체로, 인덱싱으로 변경 불가
리스트는 가변 객체로, 인덱싱으로 변경 가능
() 사용, 값 추가/변경 불가[] 사용, 값 추가/변경 가능{key : value}set(), 중복 허용 X, 순서 보장 XTrue/False컴퓨터에 데이터가 저장되는 메모리 공간의 위치
명명 규칙
_(언더바), 숫자 조합 가능자료형 확인
x = 10
print(type(x)) # <class 'int'>
0부터 시작
[start:end:step]에서 실제 범위는 start에서 end-1까지, end는 포함되지 않음
문자열 + 정수 + 문자열 불가능 -> 문자열 + str(정수) + 문자열 가능
'키는 %.2f입니다.'%height'키는 {}입니다.'.format(height)f'키는 {height:.2f}입니다.= None, 빈 문자열을 의미
키보드 입력
양쪽 공백 제거
for x in range(start, end, step):
반복문...
for x in list:
반복문...
while 조건:
반복문...
for x, y in enumerate(list/set/tuple/dict/string):
반복문 ...
# x = 인덱스, y = 값
[]사용
| function | content |
|---|---|
| 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 변수
함수명(입력값) # 함수 호출
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, 리스트)) # 리스트에서 짝수인 원소만 추출
호출된 함수 내에서만 유효
하위의 모든 함수에서 유효
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 함수
함수() # 함수 사용
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()
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(리스트) # 한 줄 쓰기
분석 데이터를 그래프나 차트로 시각화해주는 파이썬 패키지 라이브러리
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) 분석 -> 전략 수집/정책 제안/관리
수치 계산 및 배열 연산을 위한 파이썬 라이브러리
다차원 배열을 빠르고(리스트보다 빠름), 메모리를 효율적으로 처리
반복문 없이도 배열 전체에 대한 연산 가능
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 : 행 기준 합계
데이터를 효율적으로 분석하고, 조작할 수 있도록 도와주는 라이브러리
여러 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] # 조건 필터링
데이터에 값이 없는 것
결측치가 맞는지 확인 후 결측치를 다른 값으로 대체하거나 삭제
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)] # 결측치가 포함된 열/행만 출력
특정 컬럼을 기준으로 데이터 그룹화
비슷한 데이터를 그룹으로 묶고, 다양한 방식으로 요약
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의 평균 계산
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 등
from sklearn.preprocessing import MinMasScaler
scaler = MinMaxScaler() # 크기 조정
df[[컬럼]] = scaler.fit_transform(df[[컬럼]])
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)] # 이상치 추출
머신러닝을 쉽게 할 수 있도록 도와주는 라이브러리
변수 간의 관게를 모델링하는 통계적 방법
예측을 목표로 하는 통계 분석
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)
평균 제곱 오차 = (예측값 - 실제값)의 제곱의 합 / n
모델이 예측한 값과 실제 값의 차이 측정
mse가 작을 수록 예측 잘됨
결정 계수 = 1 - MSE / 분산
모델이 데이터를 얼마나 잘 설명하는지 나타내는 지표
MSE가 작고 R2가 높을 수록 좋은 모델
데이터를 계량화한 수치값으로 표현
추리, 추정하는 통계
데이터 바탕으로 미래 예측
함수나 메서드의 기능을 수정, 확장하는 도구, @ 사용
함수를 인수로 받아 새로운 함수를 반환
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. 종료