본문 바로가기
DB 공부하기

230306_DB복습

by 보랏 2023. 3. 6.

안녕하세요. 보랏입니다. 

이번주 새로운 시작하여 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