안녕하세요. 보랏입니다.
이번주 새로운 시작하여 DB복습 시작하겠습니다.
오늘은 파이썬 클래스, linked list(자료구조), 통계 수업을 진행하였습니다.
1. 클래스
- 클래스 : 똑같은 무엇인가를 계속해서 만들어내는 설계 도면
- 객체 : 클래스로 만든 피조물
- 객체와 인스턴스의 차이
- 인스턴스 : 클래스로 만든 객체, 특정 객체가 어떤 클래스의 객체인지를 관계 위주로 설명할 때 사용
- a = cookie() : a는 cookie()의 인스턴스
class urus :
def __init__(self, color, wheel) : #클래스를 지정할 때는 self 표시 필요
self.color = color
self.wheel = wheel
self.speed = 0
def get_color(self) :
return self.color
def get_wheel(self) :
return self.wheel
def __len__(self) :
return 10
def accelerator(self) :
self.speed += 10
def get_speed(self) :
return self.speed
a = urus('yellow',20)
a.get_color() # 'yellow'
a.get_wheel() # 20
2. Linked list (연결 리스트)
- 추상형 자료형인 리스트를 구현한 자료구조로, Linked List라는 말 그대로 어떤 데이터 덩어리(노드)를 지정할 때 그 다음 순서의 자료가 있는 위치를 데이터에 포함시키는 방식
- 노드(원본값, 다음 값의 address) -> 하나의 연결된 값ㅂ의 모임을 만들 수 있음
- 리스트는 노드(엘리먼트)들의 모임으로 배열 대신에 다른 구조를 사용
- head : 출입문의 역할, linked list를 사용하기 위해서는 이 head가 가리키는 첫 번째 노드를 찾아야 함
class Node :
def __init__(self, data=None, next_=None) :
self.data = data
self.next = next_ #연결리스트에 화살표를 의미
class LinkedList :
def __init__(self) :
self.no = 0 #노드 개수
self.head = None #head
self.current = None #현재노드
def __len__(self) : #글자수
return self.no
def add_first(self, data) :
ptr = self.head
self.head = Node(data, ptr)
self.current = Node(data, ptr)
self.no += 1
def add_last(self, data) :
if self.head is None :
self.add_first(data)
else :
ptr = self.head
while ptr.next is not None :
ptr = ptr.next
ptr.next = self.current = Node(data,None) #1번에서 3번으로 화살표 이동
self.no += 1
def print(self) :
ptr = self.head
while ptr is not None :
print(ptr.data)
ptr = ptr.next
def search(self, data) :
cnt = 0
ptr = self.head
while ptr is not None :
if ptr.data == data :
self.current = ptr
return cnt
cnt += 1
ptr = ptr.next
return -1
def __contains__(self, data) :
return self.search(data) > 0
def __str__(self) :
print("아이ㅠ")
# head 삭제
def remove_first(self) :
if self.head is not None : #뷔의 넥스트값인 진을 head로 바꾸고 뷔는 삭제
self.head = self.current = self.head.next
self.no -= 1
def remove_last(self) :
if self.head is not None : # 만약 self.head가 있고
if self.head.next in None : # self.head.next (다음값이 없다면)
self.remove_first() #첫번째 노드 삭제
else :
ptr = self.head
pre = self.head
while ptr.next is not None : #next 포인트 위치를 변경
pre = ptr
ptr = ptr.next
pre.next = None
self.current = pre
self.no -= 1
- 위 코드에서 Node클래스는 데이터 값을 가지는 data 멤버 변수와 다음 노드를 가리키는 next멤버 변수를 가지고 있습니다.
- LinkedList클래스는 head라는 멤버 변수를 가지며, 이는 링크드 리스트의 첫 번째 노드를 가리킵니다. add_last 메서드는 새로운 노드를 리스트의 맨 뒤로 추가
- print_list는 리스트에 있는 모든 노드의 데이터 값을 출력합니다.
lst = LinkedList()
lst.add_first('a')
lst.add_first('b') # 'b'가 head가 되고 'a'가 다음 노드를 가리키게 됨
lst.add_last('c)
lst.print() # b a c
3. 통계의 기초
- 양적 자료 : 정량적 자료(수치적 자료), 셀 수 있는 정수값으로 표현된 이산형, 연속형 자료
- 질적 자료 : 범주형 자료, 수치로 측정 불가한 자료
- 중앙값 : 변량의 값을 크기 순으로 나열할 때 중앙에 오는 수치
- 홀수 : (n+1) / 2
- 짝수 : n/2 번째 데이터와 n/2+1번째 데이터의 평균
- 최빈값 : 가장 빈도가 많은 데이터 값
- 통계량 : 평균값이라는 것은 데이터의 분포 중에서 하나의 수를 꺼낸 것에 불과하며, 데이터가 그 주변에 어느 정도로 퍼져있는지, 또는 흩어져 있는지 알 수 없음
- 예) A버스는 2분 늦거나, 2분 빠르게 도착 / B버스는 10분 늦거나, 10분 빠르게 도착
- 두 버스의 평균은 동일
- 편차 : 각 데이터가 평균값으로부터 어느정도 큰가, 작은가를 나타내는 수치
- 표준편차 : 평균을 구하고 싶은 수치들을 각각 제곱하고 모두 합하여 총 개수로 나눈 뒤에 루트를 하는 방법
- 데이터들의 평균값에서 떨어져 있는 것을 평균화하는 것
- 이 때 멀리 떨어져 있든지, 가까운 곳에 있든지, 모두 양수로 평
- 분산 : 표준편차의 제곱
- 데이터 특수성의 평가 기준
- 데이터 세트 중에 어느 한 데이터의 편차가 표준편차로 계산해서 +- 1배 전후라면 이 것은 평범한 데이터
- +- 2배로 멀리 있다면 이 데이터는 특수한 데이터
- 데이터가 정규분포라고 가정 시 평균값에서 표준편차 +- 1배의 범위 내에 약 70%의 데이터가 있음
#평균값
sun(a) / len(a) #일반 함수
np.mean(a) #넘파이
a_df.mean() #판다스
# 중앙값
n = len(sorted_scores)
if n % 2 == 0:
m0 = sorted_scores[n//2 - 1]
m1 = sorted_scores[n//2]
median = (m0 + m1) / 2
else:
median = sorted_scores[(n+1)//2 - 1]
median #일반 함수
np.median(scores) #넘파이
scores_df.median() #판다스
#최빈값
pd.Series([1, 1, 1, 2, 2, 3]).mode() # 1
#편차
mean = np.mean(scores)
deviation = scores - mean
deviation # 예) array([-13., 14., 1., -14., 2., -7., 10., -6., 10., 3.])
sum(deviation) # 0 / 편차의 합은 0
#### 분산
* 편차의 평균은 항상 0이 되므로 편차의 제곱을 이용한 분산(Variance)를 사용
* var() 함수에는 ddor=0으로 기본설정
* 불편분산은 ddof=1일때 해당(자유도 1)
* numpy와 pandas의 기본 설정 값이 다르기 때문에 주의
np.mean(deviation ** 2) # == np.var(scores) # 분산
- 불편분산
- 표본분산은 모집단의 분산, 즉 모분산에 비해 분산을 과소평가해 버리는 경향 보유
- 이점을 보완하기 위한 것이 불편분산
- 표본에서 추정한 평균값은 모집단의 평균값과 조금 차이가 나는게 정상
- 모평균과 차이가 있는 표본평균을 사용해서 분산을 계산하여 정확하게 추정하기 힘듬
- 분모가 n-1이 되어 조금 작아지기 때문에 표본분산보다 살짝 더 큰 값을 가지게 됨
### 불편분산
import random
df.shape
df['english'].var()
cnt = 0
for x in range(10000):
if np.var(random.choices(df['english'].values,k=20)) < 96.036:
cnt += 1
#print(f" {x} -> {np.var(random.choices(df['english'].values,k=20))} ")
cnt #6264
- 표준편차 : 분산에 제곱근을 취한 표준편차
np.sqrt(np.var(scores, ddof=0)) #9.273618495495704
np.std(scores, ddof=0) #9.273618495495704
- 범위
- 범위는 분산이나 표준편차와 달리, 데이터 전체를 보는 것이 아닌 데이터의 최댓값과 최솟값만으로 산포도를 표현
- 최댓값과 최솟값의 차이가 크면 산포도가 크고, 그 차이가 작다면 산포도가 작다는 의미
np.max(scores) - np.min(scores) #28
scores_Q1 = np.percentile(scores, 25)
scores_Q3 = np.percentile(scores, 75)
scores_IQR = scores_Q3 - scores_Q1
scores_IQR # 15.0
오늘은 통계에 대한 기초적인 내용을 중점으로 배워서
코딩보다는 이론에 초점을 둔 날이었습니다.
오늘도 이렇게 복습 마치겠습니다.
감사합니다.
'DB 공부하기' 카테고리의 다른 글
230308_DB복습 (0) | 2023.03.08 |
---|---|
230307_DB복습 (0) | 2023.03.07 |
230228_DB복습 (0) | 2023.02.28 |
230227_DB복습 (0) | 2023.02.27 |
230224_DB 복습 (0) | 2023.02.24 |