반응형

Intro


안녕하세요, 이번에 MySQL을 공부할 일이 생겨서, 정리한 내용 공유할 겸 글을 써보겠습니다.

명령어는 검은색, 변수 이름은 파란색으로 표시했습니다.

DB 및 TABLE 조회


  1. CREATE DATABASE database-name; - DATABASE 생성
  2. SHOW DATABASES; - 생성되어 있는 DATABASE 조회
  3. SELECT DATABASE(); - 현재 사용중인 DATABASE 확인
  4. USE database-name; - 사용할 DATABASE 선택
  5. SHOW TABLES; - 현재 DATABASE의 TABLE확인
  6. DESC table-name; - 특정 TABLE의 scheme 확인

TABLE 관리


TABLE 생성

  1. CREATE TABLE IF NOT EXISTS table-name (
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    str1 VARCHAR(20),  ## 20자리 가변 문자열 (메모리 효율 good, 속도 bad)
    str2 CHAR(1),         ## 1자리 고정 문자열 (메모리 효율 bad, 속도 good)
    int1 INT(5),            ## 5자리 정수
    date1 DATE);          ## yyyy-mm-dd
    A. 그 외 자료형: BOOL, DECIMAL, FLOAT, REAL, DOUBLE 등
    B. 정확한 소수점 저장을 위해서는 DECIMAL사용 (고정소수점)
  2. MySQL constraints 종류
    A. NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY, CHECK, DEFAULT
  3. 다른 테이블 값 복사
    CREATE TABLE IF NOT EXISTS new-table-name
    AS SELECT * FROM table-name;

TABLE 삭제

  1. DROP TABLE IF EXIST table-name;

TABLE 수정

  1. ALTER TABLE IF EXIST table-name [수정 내용];

Instance 추가

  1. 모든 변수에 대해서 추가
    INSERT INTO table-name VALUES (NULL, "apple", "melon",100, '2012-04-14');
  2. 특정 변수에 대해서만 추가 (나머지는 null됨)
    INSERT INTO table-name ('id','str1') VALUES (NULL, "apple");
  3. 여러 개 추가
    INSERT INTO table-name VALUES ("apple", "melon",100, '2012-04-14'), ("car", "cat",100, '2012-04-14'), ("ben", "chi",100, '2012-04-14');

Instance 삭제

  1. DELETE FROM customers   ##data를 삭제한 table 선택
    WHERE country = 'France' ##삭제할 data의 조건 명시, 안하면 모두 삭제
    ORDER BY creditLimit       ##삭제 대상 instance를 creditLimit으로 정렬
    LIMIT 5;                         ##creditLimit이 가장 낮은 5개의 instance 삭제

Instance 수정

A. UPDATE table-name
SET [수정 사항]
WHERE [수정 대상];

마무리


사실 이것만 보고는 감을 익히기 어려울 겁니다. 이를 참고해서 MySQL문제를 풀어보시는게 좋을 거 같습니다.

다음에는 본격적인, TABLE에서 정보를 추출하기 위한 Query에 대해서 정리하겠습니다!

References

w3school

반응형
반응형

Intro


오늘은 제가 영상 처리할 때 사용하는 OpenCV에 대한 내용과 Visual studio의 연동 방법에 대해 포스팅하겠습니다.

OpenCV란?


OpenCV(Open Source Computer Vision)은 영상 처리에 대한 무료 오픈소스 라이브러리입니다.

OpenCV는 실시간 영상처리를 위해 인텔(Intel)에서 개발하였고, 실시간 이미지 프로세싱을 중점을 두고 있습니다.

C/C++ 프로그래밍 언어로 개발되었으며 파이썬 , 자바 및 매트랩 / OCTAVE에 바인딩되어 프로그래머에게 개발 환경을 지원합니다.

OpenCV는 학교 교육이나, 회사에서 상업용으로 제품을 만들어도 무료이기 때문에 많은 사람들이 활용하는 장점이 있습니다. 그리고 복잡한 알고리즘이나 계산식을 라이브러리로 구현을 했기 때문에 사용자 입장에서는 편하게 사용할 수 있습니다. 실무에서 C++이나 Python에서 정말 많이 사용됩니다.

OpenCV 다운로드


OpenCV 다운로드 링크

OpenCV Windows 버전을 다운로드합니다.

다운로드 후 압축을 풀어줍니다.

위에 그림과 같이 파일이 있으면 정상적으로 다운로드한 것입니다.

OpenCV & Visual studio 연동


Visual studio 2019와 OpenCV를 연동해 보겠습니다. OpenCV버전은 4.5.2입니다.

Opencv & Visual studio 연동하기

  • Visual studio로 프로젝트 생성(프로젝트는 그냥 빈 프로젝트로 만들었습니다. MFC나 DLL 생성하거나 기타 프로젝트도 동일한 방법으로 OpenCV 연동하면 됩니다.)

)

  • 헤더 파일 복사 및 경로 설정(OpenCV 다운로드한 폴더에서 opencv/build/include 폴더를 복사하여 프로젝트에 넣어 줍니다. 절대 경로로 사용해도 되긴 하는데 보통은 프로젝트 안에 상대 경로로 넣어서 사용합니다. 프로젝트(P)-> 속성(P)->C/C++ -> 모든 옵션 or 일반 -> 추가 포함 디렉터리에 .\include\opencv2;를 추가해 줍니다)

)

)

  • lib 폴더 프로젝트 폴더에 복사합니다.(opencv\build\x64\vc15\lib 폴더를 프로젝트 폴더에 복사) 프로젝트(P)-> 속성(P)->링커->일반 or 모든 옵션 -> 추가 라이브러리 디렉터리에 .\lib 추가. 그다음에 프로젝트(P)-> 속성(P)->링커->입력->추가 종속성->opencv_world452d.lib를 추가해줍니다. Debug모드일 때는 opencv_world452d.lib, Release일 때는 opencv_world452.lib를 추가해 줍니다.

)

)

  • 마지막으로 opencv\build\x64\vc15\bin 경로에서 Debug모드 일 때는 opencv_world452d.dll파일을 프로젝트의 Debug 실행 파일이 있는 위치에 넣어줍니다. Release에는 opencv_world452.dll파일을 프로젝트의 Release 폴더에 넣어줍니다. 그러면 연동이 끝납니다.
  • OpenCV를 연동할 때는 Visual Studio와 OpenCV 버전을 맞춰줘야 합니다. 그리고 Debug모드 Release모드를 고려해서 lib파일과 dll파일을 설정해야 합니다.

마무리


마지막으로 OpenCV를 이용해 간단한 이미지 출력을 해 보겠습니다.

#include  
#include <opencv2/highgui/highgui.hpp>  
int main(void)  
{  
cv::Mat Image;  
Image = cv::imread("./Anabebe.jpg");  
while (1)  
{  
cv::imshow("Anabebe", Image);  
cv::waitKey(100);  
}  
return 0;  
}  

다음 시간에는 OpenCV를 활용한 영상처리 알고리즘을 소개하도록 하겠습니다. 감사합니다.

반응형
반응형

디자인 패턴이란?


디자인 패턴은 소프트웨어 기술 면접에 자주 나오는 질문 중 하나입니다. 보통 기술면접에서 특정 상황을 물어본다음에 어떤 디자인 패턴을 사용하면 좋을까요? 이런 식으로 질문을 하거나 싱글턴 패턴이 뭔가요?처럼 특정 디자인 패턴을 물어보는 경우가 많습니다. 디자인 모든 디자인 패턴을 완벽하게 숙지하지 못하더라도 특정 상황에서 자주 쓰이는 디자인 패턴의 종류와 역할을 알면 면접에서 좋은 답변을 할 수 있습니다. 그럼 디자인 패턴에 대한 포스팅을 시작하겠습니다.

누군가는 이미 제가 가진 어려움을 경험했을 것입니다. 그리고 그 누군가는 제가 가진 어려운 경험을 이미 해결했을 것입니다. 우리는 그 문제를 해결했던 다른 개발자들의 지혜와 교훈을 배우고 익혀야 합니다.

즉, 소프트웨어 공학에서 디자인 패턴이란 프로그램을 개발하는 과정에서 빈번하게 발생하는 애로사항이나 디자인 상의 문제를 정리해서 상황에 따라 간편하게 적용해서 쓸 수 있는 패턴 형태로 만든 것입니다. 디자인 패턴을 잘 활용하면 단지 코드의 재사용뿐만 아니라, 더 큰 그림을 그리기 위한 디자인으로 재사용할 수 있습니다.

패턴이란 특정 컨텍스트 내에서 주어진 문제에 대한 해결책이다.
컨텍스트(context) : 패턴이 적용되는 상황. 반복적으로 일어날 수 있는 상황.
문제(problem) : 컨텍스트 내에서 이루고자 하는 목적
해결책(solution) : 누구든지 적용해서 일련의 제약조건 내에서 목적을 달성할 수 있는 일반적인 디자인을 의미

디자인 패턴 종류


1. 생성 관련 패턴(Creational Patterns) : 객체 인스턴트 생성을 위한 패턴으로 클라이언트와 그 클라이언트에서 생성해야 할 객체 인스턴스 사이의 연결을 끊어주는 패턴.

  • 빌더(Builder)
  • 싱글턴(Singleton)
  • 팩토리 메소드(Factory Methods)
  • 프로토타입(Prototype)
  • 추상 팩토리 메소드(Abstract Factory Methods)

2. 구조 관련 패턴 (Structural Patterns) : 클래스 및 객체들의 구성을 통해 더 큰 구조로 만들 수 있게 해주는 패턴.

  • 데코레이터(Decorator)
  • 플라이웨이트(Flyweight)
  • 컴포지트(Composite)
  • 어댑터(Adapter)
  • 브리지(Bridge)
  • 퍼사드(Facade)
  • 프록시(Proxy)

3. 행동 관련 패턴 (Structural Patterns) : 클래스와 객체들의 상호작용하는 방법 및 역할을 분담하는 방법에 관련된 패턴.

  • 템플릿 메소드(Template Method)
  • 인터프리터(Interpreter)
  • 역할 사슬(Chain of Responsibility)
  • 커맨드(Command)
  • 비지터(Visitor)
  • 미디에이터(Mediator)
  • 이터레이터(Iterator)
  • 메멘토(Memento)
  • 옵저버(Observer)
  • 스테이트(State)
  • 스트래티지(Strategy)

클래스와 객체에 따른 패턴 분류 방법

1. 클래스 패턴 (Class Patterns) : 클래스 사이의 관계를 상속을 통해 정의. 클래스 패턴은 컴파일 시에 관계가 결정됨.

  • 템플릿 메소드(Template Method)
  • 팩토리 메소드 (Factory Methods)
  • 어댑터(Adapter)
  • 인터프리터(Interpreter)

2. 객체 패턴 (Object Patterns) : 객체 사이의 관계를 다루며, 객체 사이의 관계는 보통 구성을 통해 정의됨. 객체 패턴에서 일반적으로 실행 중에 관계가 생성되기 때문에 더 동적이고 유연함.

  • 컴포지트(Composite)
  • 데코레이터(Decorator)
  • 프록시(Proxy)
  • 스트래티지(Strategy)
  • 브리지(Bridge)
  • 플라이웨이트(Flyweight)
  • 추상 팩토리 메소드 (Abstract Factory Methods)
  • 퍼사드(Facade)
  • 역할 사슬(Chain of Responsibility)
  • 미디에이터(Mediator)
  • 비지터(Visitor)
  • 커맨드(Command)
  • 프로토타입(Prototype)
  • 싱글턴(Singleton)
  • 이터레이터(Iterator)
  • 메멘토(Memento)
  • 옵저버(Observer)
  • 스테이트(State)
  • 빌더(Builder)

마무리


마지막으로 오늘은 디자인 패턴이 무엇인지와 디자인 패턴의 종류에 대해 알아봤습니다. 디자인 패턴을 정리하다 보니 설명도 없이 종류에 대해 길게 적어 놨는데... 다음 시간부터는 자주 쓰이는 디자인 패턴에 대해 자세히 탐구하는 시간을 가져 보겠습니다.

반응형
반응형

Intro


오늘은 C++ STL 중에 가장 많이 쓰이게 될지도 모르는? auto라는 키워드에 대해 설명하겠습니다.

auto


C++에서 auto는 변수를 정의할 때 명시적으로 형을 지정해 주지 않아도 됩니다.

왜냐하면 auto 변수는 초기화할 때 초기화 값에 따라서 자동으로 형을 결정해 주기 때문입니다.

즉, auto는 변수를 정의할 때 명시적으로 형을 지정하지 않고 컴파일러가 형을 자동으로 지정해주는 키워드입니다.

하지만 auto는 지역변수에서만 사용이 가능합니다.

클래스의 멤버 변수, 전역 변수, 함수의 인자로의 사용은 불가능합니다.

그리고 선언과 동시에 초기화를 시켜줘야 합니다.

그렇지 않으면 auto의 형식을 추론할 수 없다는 오류 메시지가 뜨게 됩니다.

정적 언어 vs 동적 언어의 차이
최근에 JavaScript, Ruby, Python 같은 스크립트 언어가 인기가 많습니다. 실제 개발에서 많이 쓰이기도 합니다. 이러한 스크립트 언어를 동적 언어라고 합니다. 이와 반대로 C, C++, C#, Java, Objective-C를 정적 언어라고 합니다. 정적 언어는 변수형을 선언하거나 정의할 때 명시적으로 자료형을 지정해야 합니다. ex) int a, double b, float c. 하지만 동적 언어는 자료형을 명시적으로 지정하지 않아도 됩니다. auto를 사용하면 스크립트 언어처럼 자료형을 지정하지 않아도 됩니다.

Example


#include<iostream>
int main()
{

    auto Name = "Anabebe";
    std::cout << Name << std::endl;

    auto nNum = 100;
    std::cout << nNum << std::endl;

    auto fNum = 100.99;
    std::cout << fNum << std::endl;


    return 0;

}

마무리


auto를 사용하면 프로그래밍이 이전보다 훨씬 더 간편해집니다.

STL의 컨테이너를 사용할 때 귀찮은 부분 중 하나가 반복자를 정의할 때 반복자를 길게 적어야 할 때가 있습니다.

이때 typedef를 사용하여 불편함을 감소시켜야 하지만 auto를 사용하면 불편함을 없앨 수 있습니다.

하지만 auto는 만능이 아닙니다. 같이 협업하는 사람 중에 auto를 아주 사랑하는 동료가 있었는데 모든 변수에 auto를 남발하다 보니 자료형을 정확히 알아야 하는 경우 찾기가 힘들었습니다.

하지만 auto를 적절하게 사용하면 분명 편리하고 애용하는 기능 중 하나가 될 것입니다.

반응형

'[C++ STL]' 카테고리의 다른 글

[C++ STL - forward_list]  (0) 2021.06.24
[STL - 메모리 관리(스마트 포인터 shared_ptr, unique_ptr]  (0) 2021.06.08
[C++ STL - tuple]  (0) 2021.05.21
[C++ STL - range based for]  (0) 2021.05.13
[C++ STL - 람다(lambda)]  (0) 2021.05.04
반응형

Intro


정규분포는 종모양을 띄는 분포로, 가장 익숙한 개념입니다. 이번 글에서는 정규분포와 정규성 검정에 대해서 정리하겠습니다.

정규분포


정규분포 (normal distribution, gaussian distribution)는 평균($\mu$)과 표준편차($\sigma$)에 의해 모양이 결정되는 데이터 분포입니다.

따라서 확률 변수 $X$가 정규분포를 따르고 평균과 표준편차를 알 수 있으면, 각 $x$값이 발견될 확률을 아래의 식으로 구할 수 있습니다.

$$\frac{1}{\sqrt{2\pi\sigma}}e^{-\frac{(x-\mu)^2}{2\sigma^2}}$$

$\mu=0, \sigma=1$인 특수한 경우의 정규분포를 표준 정규분포라고 합니다.

표준 정규분포를 따르지 않는 정규분포와 다른 분포들도 분포를 이루는 각 값에서 평균을 빼고, 표준편차로 나눔으로써 $\mu=0, \sigma=1$인 상태로 변환할 수 있습니다.

이런 과정을 표준화(standardization)이라고 합니다.

이때 표준화된 분포의 각 값을 z-score라고 합니다.

$$z=\frac{x-\mu}{\sigma}$$

표준화는 분포의 모양을 바꾸지 않는 변환이기 때문에, 아래와 같은 목적으로 사용될 수 있습니다.

두 분포의 모양 비교
데이터 전처리 (scaling)
정규성 검정

정규성 검정


정규성 검정(normality test)은 주어진 분포가 정규분포를 따르는지 확인하기 위한 방법입니다. 이는 가설 검정 기법인 t-test, ANOVA가 검정하려는 데이터의 분포가 정규성을 갖는다는 가정하에 사용되기 때문에, 해당 방법들을 적용할 수 있는지 여부를 알기 위해서 사용됩니다.

정규성 검정을위한 첫번째 방법으로, Q-Qplot(Quantile-Quantile plot)이 있습니다. Q-Qplot은 두 분포가 얼마나 유사한지를 보여주는 일반적인 graphical method입니다.

이때 정규성검정을 하고자 하는 분포를 표준화한 뒤, 표준 정규분포와의 Q-Qplot을 그리면, 해당 분포가 정규분포를 갖는지 알 수 있습니다.

예시를 통해 확인해보겠습니다.

[code download]

# 표준정규분포의 Q-Q plot
std_normal = np.random.normal(loc=0, scale=1, size=20000) # 표준정규분포에서 데이터 샘플링, loc=평균, scale=편차

f, ax = plt.subplots(1,2, figsize=(10,5))
f.subplots_adjust(right=1)

sns.histplot(std_normal, ax=ax[0]) # 샘플링한 데이터의 분포
ax[0].set_title("Data distribution")
ax[0].set_xlabel("sample value")

stats.probplot(std_normal, dist="norm", plot=ax[1]) # Q-Q plot

plt.show()
f.savefig(f"{save_path}/qq_normal.png")

표준 정규분포에서 추출한 데이터의 분포와 그것의 Q-Qplot을 그리는 코드입니다. 결과는 아래와 같습니다.

2번째 그림의 빨간 선이 데이터가 완벽한 표준 정규분포를 가질 때의 값이고, 비교하고자 하는 분포의 데이터는 파란 점으로 표현되어 있습니다. 당연하게도 둘은 거의 일치하는 것을 알 수 있습니다.

이번에는 실제 세계의 데이터가 정규분포를 갖는지 확인해보겠습니다. [data download]

# AT&T회사의 일별 주가변동 정보의 Q-Qplot
sp500_px_df = pd.read_csv('data/sp500_data.csv') # S&P500에 있는 회사의 일별 주식 등락 정보
sp500_px_df.rename(columns={'Unnamed: 0': 'Dates'},inplace=True)

atnt = 'T'    # 회사 AT&T

times = list(range(300))
poisson = stats.poisson.pmf(times,mu=20)

f, ax = plt.subplots(1,2, figsize=(10,5))
f.subplots_adjust(right=1)

sns.histplot(sp500_px_df[atnt], ax=ax[0])
ax[0].set_title("Data distribution")
ax[0].set_xlabel("fluctuation")

stats.probplot(sp500_px_df[atnt], dist="norm", plot=ax[1])

plt.show()
f.savefig(f"{save_path}/qq_atnt.png")

위와 같이, 데이터가 중앙에 많이 몰려있고, 평균에서 멀어질수록 급격하게 데이터 수가 감소하는 분포를 Q-Qplot을 통해 보면, 양 끝에서 차이가 커짐을 알 수 있습니다. 따라서 이 데이터는 정규분포를 같는다고 보기 어렵겠네요.

정규성을 검정할 수 있는 다른 방법은 통계적 가설 검정을 이용한 방법이 있습니다.

이 방법은 우선 아래와 같이 가설을 설정합니다.

귀무가설(null hypothesis,$H_0$): *"주어진 데이터는 정규분포를 따른다"*

대립 가설(alternative hypothesis, $H_1$): *"주어진 데이터는 정규분포를 따르지 않는다"*

그다음 두 가설을 검정하기 위한 다양한 방법을 적용한 뒤, 검정 결과 p-value가 특정값보다 크면 귀무가설을 기각하지 않고 정규성을 갖는다고 보는 겁니다.

이런 통계적 가설 검정 방법은 여러 개가 있는데, 대표적으로 D'Agostino's K-squared test, Shapiro–Wilk test 등이 있습니다.

마무리


이번에는 정규분포와 정규성 검정에 대해서 정리해봤습니다!

이번 글을 쓰면서 matplotlib의 구조에 대해서 깊게 알게 되어 기쁘네요!

읽어주셔서 감사합니다~ 좋은 하루 보내세요!

 

References

선형대수와 통계학으로 배우는 머신러닝 with 파이썬

Wikipedia-Normality test

반응형
반응형

Intro


포아송 분포는 한 마디로 아래와 같습니다.

단위시간, 단위범위 당 사건 발생횟수 $\lambda$가 주어졌을 때, 주어진 시간 동안 사건이 $x$번 발생할 확률의 분포

  오늘은 포아송 분포와 관계가 깊은 연속형 확률분포인 감마분포, 지수분포에 대해서 정리하겠습니다.

감마 분포


감마분포감마함수에 기반해서 만들어진 분포로, 우선 감마함수 먼저 알아보겠습니다. 감마함수는 아래와 같이 생겼습니다.

$\Gamma(\alpha)=\int_{0}^{\infty}x^{\alpha-1}e^{-x}dx, \alpha>0$

 감마함수는 다음 몇가지 성질을 갖습니다.

$\Gamma(n)=(n-1)\Gamma(n-1)\ \rightarrow\ (n-1)(n-2)\dots(1)\Gamma(1)$

$\Gamma(n)=(n-1)!$

$\Gamma(1)=1$

$\Gamma(\frac{1}{2})=\sqrt{\pi}$

이러한 성질을 갖는 감마함수를 이용해서 만든 감마분포고, 감마분포의 확률밀도함수는 아래와 같습니다.

$$f(x;\alpha,\beta)=
\begin{cases}
\begin{split}
\frac{1}{\beta^\alpha \Gamma(\alpha)}x^{\alpha-1}e^{\frac{-x}{\beta}}&, x>0 \\\\
0,\qquad\qquad 그\ 외
\end{split}
\end{cases}$$

감마분포는 0보다 큰 $\alpha, \beta$를 모수로 갖습니다.

감마분포의 평균과 분산은 아래와 같습니다.

$$\mu=\alpha\beta\qquad\sigma^2=\alpha\beta^2$$

  이때, $\alpha$가 1일 때의 특수한 경우를 지수분포라고 합니다. 지수분포의 확률밀도함수와 평균, 분산은 아래와 같습니다.

$$f(x;\beta)=
\begin{cases}
        \begin{split}
            \frac{1}{\beta}e^{\frac{-x}{\beta}}, x>0 \\\\
            0,\qquad 그\ 외
        \end{split}
    \end{cases}$$
$$\mu=\beta\qquad\sigma^2=\beta^2$$

포아송 분포와 지수분포의 관계


여기까지 봤을 때는 이들이 포아송 분포와 무슨 상관이 있을까 싶을겁니다. 지수분포는 감마분포의 특수한 경우고, 특히 포아송 분포와 관련이 깊습니다.

  포아송 분포는 일정 시간, 공간에서 특정한 수의 사건이 발생할 확률을 계산하는데 사용되죠, 이때 확률변수는 사건발생 수입니다. 반면에, 지수분포는 사건 발생 수가 아닌 다음 사건이 일어날 때까지의 시간을 확률변수로 갖습니다. 이렇기 때문에 포아송 분포는 이산 확률분포, 지수분포는 연속형 확률분포인거죠!

  그러면 포아송 분포를 이용해서 지수분포를 유도해보겠습니다. $x$시간 내에 첫번째 사건이 발생할 확률을 계산해봅니다.

$x$시간 내에 첫번째 사건이 발생할 확률은, 1에서 $x$시간 내에 첫번째 사건이 발생하지 않을 확률을 빼는 것과 같습니다. 이는 $x$시간 동안 단 한번도 사건이 발생하지 않을 확률 $p(0;\lambda x)$과 같습니다.

포아송 분포에 의해

$$P(X>x)=p(0;\lambda x)=e^{-\lambda x},$$

우리가 구하고자 하는 확률은 아래와 같은 $X$의 누적분포함수가 됩니다.

$$P(0\leq X \leq x)=1-e^{-\lambda x}$$

연속형 확률변수의 누적분포함수를 미분하면 확률밀도함수가 되기 때문에, 이를 미분한 결과는 $\lambda=\frac{1}{\beta}$인 지수분포의 확률밀도함수와 같아집니다.

$$f(x)=\lambda e^{-\lambda x}$$

이렇게, 지수분포의 모수 $\beta$는 포아송 분포의 모수인 $\lambda$와 역수 관계임이 확인되었습니다. 그렇다면, 우리는 $\beta$를 평균사건발생간격으로 볼 수 있습니다. 비록 우리가 구한건 최조 사건 발생까지의 시간이지만, 단위시간 당 평균 사건 발생 수($\lambda$)는 시간에 관계없이 동일하기 때문에 이런 해석이 가능합니다.

지수분포와 감마분포의 관계


지수분포는 감마분포의$\alpha$가 1일 때의 특수한 경우고, 평균사건발생간격 $\beta$를 모수로 갖는 사건발생간격의 확률분포입니다.

 그렇다면 $\alpha$가 1보다 큰 경우인 감마분포는 무엇을 의미할까요? 감마분포는 평균사건발생간격이 $\beta$인 사건이 $\alpha$번 발생할 때까지의 시간의 확률분포입니다.

마무리


이번에는 포아송 분포와 관련이 깊은 지수분포, 감마분포에 대해서 알아봤습니다.

세 분포를 한 문장씩 정리하면 아래와 같습니다.

포아송 분포: 단위시간, 단위범위 당 사건 발생횟수 $\lambda$가 주어졌을 때, 주어진 시간 동안 포아송 사건이 $x$번 발생할 확률의 분포

지수분포: 평균사건발생간격 $\beta(=\frac{1}{\lambda})$가 주어졌을 때, 시간 $x$내에 포아송 사건이 발생할 확률의 분포

감마분포: 평균사건발생간격 $\beta$가 주어졌을 때, 시간 $x$내에 포아송 사건이 $\alpha$번 발생할 확률의 분포

감마분포에 사용된 감마함수는 카이제곱분포, 베타분포에도 사용됩니다. 특히, 카이제곱분포는 감마분포의 모수인 $\alpha, \beta$가 각각 $v/2, 2$일 때의 특수한 형태로, 통계적 추론에서 많이 쓰입니다.

나중에 기회가 되면 두 분포에 대해서도 정리하겠습니다.

글 읽어주셔서 감사합니다!

 

References

이공학도를 위한 확률 및 통계학 제9판

반응형
반응형

 

Intro


확률변수가 취할 수 있는 모든 값이 유한개로 셀 수 있을 때, 해당 확률변수로 이루어진 확률분포를 이산형 확률분포라고 합니다.

  오늘은 이산형 확률분포인 이산형 균일분포, 이항분포, 포아송 분포에 대해서 정리하겠습니다.

이산형 균일분포


확률변수가 취할 수 있는 모든 값이 나올 확률이 동일한 경우의 분포를 균일분포라고 합니다.

  확률변수가 취할 수 있는 값의 모든 경우의 수가 $k$이면, 각 값이 발견될 확률은 $\frac{1}{k}$이 됩니다. 주사위나 동전을 던졌을 때 각 값이 나오는 경우를 예로 들 수 있겠네요.

  이산형 균일분포의 평균과 분산은 아래와 같습니다.

$$\mu = \frac{1}{k}\sum_{i=1}^{k}x_i\qquad\sigma^2 = \frac{1}{k}\sum_{i=1}^{k}(x_i-\mu)^2$$

이항분포


한 번 시행할 때 마다 성공 혹은 실패, 1 또는 0의 값을 갖는 작업이 있다고 해보겠습니다. 이 작업은 동전 던지기, 수술 성공 여부, 사용자의 상품 구매 여부 등 여러가지 상황으로 볼 수 있습니다.

 각 시행은 독립이고, 매 시행의 성공확률이 동일한 상수일 때, 우리는 각 시행을 베르누이 시행(Beronoulli trial)이라고 하고, 이 시행을 반복하는 과정을 베르누이 과정(Bernoulli process)라고 합니다.

 $n$번의 베르누이 시행을 진행했을 때 성공 (또는 1) 횟수 $X$를 이항확률변수(binomial random variable)라고 합니다. 그리고 $X$의 확률분포를 이항분포(binomial distribution)라고 합니다.

 이항분포는 $b(x;n,p)$로 표현할 수 있는데요, 성공확률이 $p$인 베르누이 시행을 $n$번 했을 때, 성공 횟수 $x$의 확률분포(이항분포)를 의미합니다.

 $x$번 성공한다는 것은 곧 $n-x$번 실패한다는 뜻이고, 이는 $x$번 성공하고 $n-x$번 실패할 확률과 같습니다. 이때 성공과 실패의 순서는 상관이 없습니다. 따라서 이항분포의 각 $x$의 확률은 아래와 같이 구할 수 있습니다.

$$b(x;n,p)={n \choose x}p^xq^{n-x}$$

$${n \choose x}=\frac{n!}{x!(n-x)!},\ q=1-p$$

 이산형 균일분포의 평균과 분산은 아래와 같습니다.

$$\mu = np\qquad\sigma^2 = npq$$

음이항분포


이항분포에서는 성공확률이 $p$인 베르누이 시행을 $n$번 했을 때, 성공 횟수가 $x$번일 확률을 계산할 수 있었습니다.

 하지만 우리는 $\alpha$번째 성공이 $x$번째 시행에서 일어날 확률을 알고싶을 수 있습니다. 한화 이글스가 5번째 경기에서 2번째 승리를 할 확률 같은거죠.

 이런 종류의 실험을 음이항실험(negative binomial experiments)이라 합니다. 이때 $\alpha$번째 성공이 이루어질 때 까지의 시행 횟수 $x$를 음이항확률변수(negative binomial random variable), $x$의 확률분포가 음이항분포(negative binomial distribution)입니다.

 한화 이글스가 매 경기에서 승리할 확률이 $\frac{1}{5}$라고 가정했을 때, 5번의 경기중 2번 승리할 확률은 아래와 같습니다.

$$b(2;5,\frac{1}{5})={5 \choose 2}(\frac{1}{5})^2(\frac{4}{5})^3=0.2048$$

 하지만 5번째 경기에서 2번째 승리를 할 확류은 조금 다릅니다. 5번째 경기에서는 승리를 하고, 앞의 4경기에서는 아무때나 1번만 승리하면 됩니다.

따라서 모든 시행의 성공과 실패 순서를 고려하지 않은 이항분포와는 달리, 음이항분포에서는 $x$번째 성공을 제외한 이전의 $\alpha-1$번의 시행에 대해서만 순서를 고려하지 않습니다.

결과적으로 음이항분포는 아래와 같습니다.

$$b^*(x;\alpha,p)={x-1 \choose {\alpha-1}}p^{\alpha}q^{x-\alpha}$$

음이항분포를 이용해서 한화 이글스가 5번째 경기에서 2번째 승리를 할 확률을 계산해보면 아래와 같습니다.

$$b^*(5;2,\frac{1}{5})={4 \choose 1}(\frac{1}{5})^2(\frac{4}{5})^3=0.08192$$

 $\alpha$가 1인 특수한 경우를 기하분포(geometric distribution)라고 하는데요, 이는 첫 번째 성공이 발생할 때 까지의 시행횟수 $x$의 확률분포 입니다.

기하분포 $g$의 모양, 평균, 분산은 아래와 같습니다.

$$g(x;p)=b^*(x;1,p)=pq^{x-1}\qquad\mu=\frac{1}{p}\qquad\sigma^2=\frac{1-p}{p^2}$$

포아송 분포


포아송 실험(Poisson experiments)는 일정한 시간간격 동안 (또는 일정 범위 내에서) 발생하는 사건의 수를 나타내는 확률변수 $X$ 값을 산출하는 실험입니다. 주로 일정한 시간내에 관찰하고자 하는 사건이 몇 번 발생하는지를 모델링하는데 사용됩니다.

포아송 실험은 포아송 과정(Poisson process)로부터 유도되는데, 포아송 과정은 아래와 같은 성질을 갖고있습니다.

  1. Memoryless: 단위 시간이나 일정 영역에서 발생하는 결과의 수는 서로 겹치지 않는 다른 시간간격이나 영역에서 발생하는 수와 독립이다.
  2. 매우 짧은 시간간격이나 작은 영역에서 단 한 번의 결과가 일어날 확률은 시간간격의 길이나 영역의 크기에 비례하며, 그 시간간격이나 영역외부에서 발생하는 결과의 수와는 무관하다.
  3. 매우 짧은 시간간격이나 작은 영역에서 두 번 이상의 사건이 발생할 확률은 무시할 수 있다. (매우 작다)

  위의 성질을 갖는 사건을 포아송 사건이라고 합니다. 1번 성질 (Memoryless)을 이해하는 것이 중요합니다. 이해를 위해 예시를 들어볼게요.

 5분에 1번 정도 발생하는 사건이 있습니다(공정 불량, 웹 사이트 방문 등). 그리고 5분 동안 몇 번의 사건이 발생하는지 관찰을 시작해봅니다.

 만약 2분만에 놀랍게도 3번의 사건이 발생했다고 했을 때, 남은 3분 동안의 사건 발생 횟수는 어떻게 될까요?

 Memoryless 성질은 앞의 2분 동안 몇 번의 사건이 발생했든, 남은 3분 동안의 사건 발생에는 아무런 영향을 주지 않는다는 겁니다. 앞에서 10번이 발생하는 100번이 발생하든 남은 3분 동안의 사건 발생 횟수에는 아무런 영향이 없다는 말이죠.

 이러한 성질을 Menoryless, 즉 건망성이라고 합니다. 앞의 사건을 잊었다는 뜻이죠!

 포아송 실험에서 사건의 발행횟수 $X$를 포아송 확률변수(Poisson random variable), $X$의 확률분포를 포아송 분포(Poisson distribution)라고 합니다.

 단위시간 동안 $\lambda$번 발생하는 사건이 일정한 시간간격 $t$동안 발생하는 수 $x$를 나타내는 포아송 분포의 모양은 아래와 같습니다.

$$p(x;\lambda t)=\frac{e^{-\lambda t}(\lambda t)^x}{x!}$$

 놀라운 점은 포아송 분포의 평균과 분산이 모두 $\lambda t$라는 겁니다. 이런거 분포를 알아내신 수학자님들은 정말 대단한거 같아요...

 포아송 분포를 그려보면, 평균이 커질수록 종모양에 가까워진다는 점입니다. 즉, 실험 시간 $t$나 단위시간 당 평균 사건 발생 수 $\lambda$가 크면 정규분포와 가까워진다는 말이죠.

아래는 python의 scipy라이브러리를 활용해서 그린 평균 변화에 따른 포아송 분포입니다. 평균이 커질수록 종모양에 가까워지는 걸 확인할 수있습니다.

[code download]

포아송 분포와 이항분포의 관계


 마지막으로, 포아송 분포는 이항분포의 근사값을 구할 때도 활용할 수 있습니다. 포아송 과정의 3가지 성질을 고려했을 때, 포아송 분포는 성공 확률이 작은 베르누이 시행을 매우 많이 하는 것과 유사하다고 볼 수 있습니다.

따라서 $n$이 매우 크고, $p$가 0또는 1에 가까운 이항분포의 근사값은 $\mu=\lambda t=np$인 포아송 분포의 값으로 나타낼 수 있습니다. 식으로 정리하면 아래와 같습니다.

$$b(x;n,p)\ \xrightarrow{n\rightarrow\infty}\ p(x;np)$$

tmi: 이항분포의 $p$가 $\frac{1}{2}$에 가까울 때는 평균이 $np$, 분산이 $npq$인 정규분포를 통해 근사할 수 있습니다!

마무리


이번에는 대표적인 이산형 확률분포들의 의미와 성질에 대해서 알아봤습니다!

다음에는 포아송 분포와 관련이 깊은 지수분포, 감마분포에 대해서 알아보겠습니다!

감사합니다~ 좋은 하루 보내세요!

 

References

이공학도를 위한 확률 및 통계학 제9판

반응형

'[Mathmatics]' 카테고리의 다른 글

[Statistics] 정규분포  (0) 2021.04.27
[Statistics] 포아송과 친구들  (0) 2021.04.27
[Statistics] 상관관계와 공분산  (0) 2021.04.27
[Statistics] 평균, 분산, 표준편차  (0) 2021.04.27
[Linear algebra] SVD  (0) 2021.04.27
반응형

Intro


오늘은 두 변수 사이의 상관관계에 대해서 정리하겠습니다. 상관관계는 한 변수가 분할에 따른 다른 변수의 변화를 관찰해서, 두 변수가 함께 움직이면 양의 상관관계, 두 변수가 반대로 움직이면 음의 상관관계를 갖는다고 말합니다.

주의: 양/음의 상관관계는 두 변수의 "인과관계"를 의미하지 않습니다.

이전 글에서 아이스크림 가게의 매출을 예시로 변수의 평균과 분산, 표준편차에 대해서 알아봤는데요, 만약 아이스크림 가게 A의 다음날 매출을 예측하고 싶을 때, 아이스크림 가게의 매출에 영향을 주는 요소는 어떤게 있을까요?

날씨
계절
코로나 거리두기 단계
...

우리는 이런 다양한 요소들을 고려해서 매출을 예측할 수 있습니다.

이때 우리가 예측하고자 하는 아이스크림 가게 매출을 target(또는 목푯값), 이를 예측하기 위해 사용하는 요소를 feature(또는 예측값)이라고 합니다.

변수 사이의 상관관계는 한 변수의 값의 변화에 따른 다른 변수의 변화를 관찰할 수 있습니다. 이는 _(1) target과 feature_에 대해서 수행할 수도 있고, _(2) feature와 다른 feature_에 대해서 수행할 수 있습니다.

(1) target과 feature의 상관관계: 어떤 feature가 변하면 target은 어떻게 변하는지 알 수 있기 때문에, target을 예측하는데 도움이 되는 feature는 무엇인지 가늠할 수 있습니다.

(2) 서로 다른 두 feature의 상관관계: 만약 두 feature가 매우 강한 상관 관계를 갖는다면, 두 변수 중 하나만 알아도 다른 변수의 값을 알 수 있기 때문에 하나만 선택해서 사용해야 합니다.

공분산


공분산은 두 변수의 상관관계를 측정할 수 있는 지표입니다. 두 변수 $X, Y$의 공분산을 계산하는 방법은 아래와 같습니다.

$Cov(X, Y) = E\left[(X-\mu_X)(Y-\mu_Y)\right]$

직관적으로, 각 변수의 _평균을 기준으로 한 데이터의 상대적인 위치_가 서로 비슷할수록 높은 상관관계를 갖는다고 볼 수 있습니다. 공분산은 아래의 성질을 갖습니다.

(1) $Cov(X, X) = Var(X)$

(2) $Cov(X, Y) = Cov(Y, X) $

공분산을 구할 때에도, 평균이 활용되므로 자유도는 $n-1$이 됩니다.

상관계수


공분산을 통해 두 변수 사이의 상관관계는 알 수 있지만, 두 변수의 단위가 다르므로, 공분산 값의 크기로 상관관계의 정도를 파악할 순 없습니다. 따라서 이를 가늠할 수 있도록 공분산 값을 [-1, 1] 사이의 값으로 조정할 필요가 있습니다.

상관계수(a.k.a 피어슨 상관계수)는 공분산 값을 두 변수의 표준편차의 곱으로 나눠서 그 값을 [-1, 1] 범위로 조정합니다. 식으로 표현하면 아래와 같습니다.

$Corr(X, Y) = \frac {Cov(X, Y)}{\sigma_X\sigma_Y}$

주의: 서로 독립인 두 변수의 공분산과 상관계수는 0이지만, 역은 성립하지 않습니다.
왜냐하면 앞서 설명한 상관관계는 두 변수 사이의 선형 관계만을 나타내기 때문입니다. 즉, 일차식으로 표현할 수 있는 범위에서의 상관관계를 알 수 있는 겁니다.
독립은 한 변수의 변화가 다른 변수의 변화에 영향을 끼치지 않는 것을 의미하므로, 두 변수가 선형 관계뿐만 아니라 다항식, 지수, log관계 등 어떤 관계도 갖지 않는 것을 의미합니다.

Python coding


지금까지 정리한 내용을 간단한 python 코드로 확인해보겠습니다. Practical Statistics for Data Scientists이란 책에서 상관관계를 시각화해주는 R코드 예시를 보여주는데, python으로 다시 짜 보겠습니다.

[code download], [data download]

import numpy as np
import pandas as pd
import seaborn as sns

# AT&T와 버라이즌의 일별 주식가격 등락률 정보 로드
save_path = "./img/2021-02-23"

sp500_px_df = pd.read_csv('data/sp500_data.csv') # S&P500에 있는 회사의 일별 주식 등락 정보
sp500_px_df.rename(columns={'Unnamed: 0': 'Dates'},inplace=True)

atnt = 'T'    # AT&T 종목코드
verizon = 'VZ'# 버라이즌 종목코드
{% endhighlight %}

S&P500에 있는 AT&T와 버라이즌이라는 회사의 주가 등락률의 상관관계를 분석해보겠습니다. 유명한 기업들로 해보고 싶었는데, 상관계수가 작아서 시각화할 때 안 예뻐서 이 둘로 정했습니다!

# AT&T과 버라이즌의 공분산 계산
cov_av = np.cov(sp500_px_df[atnt], sp500_px_df[verizon])
print(cov_av)   ''' [[0.08390944 0.05784096]
                    [0.05784096 0.10472254]]'''

numpy의 cov() 함수를 사용하면 두 변수 사이의 공분산 행렬을 반환합니다.
(0, 0), (1, 1)은 각각 AT&T와 버라이즌의 분산을 의미하고, (0, 1), (1, 0)은 AT&T와 버라이즌의 공분산으로, 두 값은 같습니다.

Numpy를 이용해서 공분산을 계산할 때는 위의 수식과는 달리 자유도를 고려하지 않습니다. 자유도를 고려하기 위해서는 ddof변수를 1로 설정합니다.

# AT&T과 버라이즌의 상관계수 계산
corr_av = np.corrcoef(sp500_px_df[atnt], sp500_px_df[verizon])
print(corr_av)    '''[[1.     0.61703529]
                   [0.61703529 1.    ]]'''

`corrcoef()`함수를 사용하면 두 변수 사이의 상관계수 행렬을 반환합니다.<br>(0, 0), (1, 1)은 자신과의 상관계수 이므로 최대값인 1이고, (0, 1), (1, 0)은 AT&T와 버라이즌의 상관계수입니다. 두 회사는 꽤 높은 **양의 상관관계**를 갖는다고 볼 수 있습니다.

# scatterplot
ax = sns.scatterplot(data=sp500_px_df, x=atnt, y=verizon, color='r')
ax.axhline(0, color='grey', lw=1) # 수평선 추가
ax.axvline(0, color='grey', lw=1) # 수직선 추가
fig = ax.get_figure()
fig.savefig(f"{save_path}/scatter.png")

두 변수의 상관관계를 확인할 때 가장 많이 사용하는 scatterplot입니다. 한눈에 상관관계를 확인할 수 있습니다.

하지만 scatterplot은 데이터가 너무 많은 경우 점이 겹쳐 보이기 때문에, 겹쳐 보이는 부분의 밀도는 확인하기 어려운 한계가 있습니다.

# hexbinplot
ax = sns.jointplot(data=sp500_px_df, x=atnt, y=verizon, kind='hex', gridsize=30, color='r')
ax.savefig(f"{save_path}/hexbin.png")

# contourplot
ax = sns.jointplot(data=sp500_px_df, x=atnt, y=verizon, kind='kde', color='r')
ax.savefig(f"{save_path}/contour.png")

위 두 자료는 scatterplot의 한계를 보완합니다. x좌표, y좌표 말고도 color성분을 추가해서 데이터 밀집 지역도 확인할 수 있습니다.

마무리


이 글에서는 상관관계와 공분산에 대해서 정리해봤습니다. 상관관계는 다양한 예측 변수를 활용해서 목표 변수를 예측하고자 할 때, 반드시 확인해봐야 합니다.

게시글 하나 만드는데 시간이 오래 걸리네요,,, 다른 분들은 어떻게 하시는지 ㅎㅎ

다음에는 다양한 확률 분포들 중, 이산형 확률분포에 대해서 정리하겠습니다.

긴 글 읽어주셔서 감사합니다! 좋은 하루 보내세요 :)

References

Practical Statistics for Data Scientists

선형대수와 통계학으로 배우는 머신러닝 with 파이썬

반응형

'[Mathmatics]' 카테고리의 다른 글

[Statistics] 포아송과 친구들  (0) 2021.04.27
[Statistics] 이산형 확률분포  (0) 2021.04.27
[Statistics] 평균, 분산, 표준편차  (0) 2021.04.27
[Linear algebra] SVD  (0) 2021.04.27
[Linear algebra] 주요 개념 및 성질(2)  (0) 2021.04.27
반응형

Intro


첫 게시글의 주제는 통계학입니다. 통계학을 공부하는 이유는 아래와 같습니다.

알고싶은 사실을 "예측"하는데 필요한 정보를 주어진 데이터로부터 얻기 위해서

오늘은 가장 기본 정보인 평균, 분산, 공분산 에 대해서 정리하겠습니다.

오픈한 지 $n$일이 지난 아이스크림 가게의 하루 매출을 의미하는 변수 $X={x_1, x_2, ..., x_n}$가 있습니다. $x_i\ (i\in[1,n])$는 $i$번째 날의 아이스크림 가게 매출을 의미합니다.

평균


평균은 아이스크림 가게의 총 매출영업일로 나눈 값입니다. 평균을 알면 아이스크림 가게가 하루에 얼마 정도 벌었는지 알 수 있습니다.

평균은 보통 $\mu$ (뮤)라고 표현하고, 아래와 같은 방법으로 구할 수 있습니다.

$\mu = \frac{1}{n}\sum_{i=1}^{n}x_i$

분산


분산은 각 데이터들이 평균으로부터 얼마나 멀리 떨어져있는 지를 나타냅니다.

분산이 크면 아이스크림 가게의 매출이 들쭉날쭉하다는 걸 의미하고, 분산이 작으면 아이스크림 가게의 매출이 비교적 일정하다고 볼 수 있습니다.

분산은 보통 $\sigma^2$ (시그마)라고 표현하고, _각 데이터와 평균의 차이의 제곱 합의 평균_으로 구할 수 있습니다. 수식은 아래와 같습니다.

$\sigma^2 = \frac{1}{n-1}\sum_{i=1}^{n}(x_i-\mu)^2$

여기서 우리는 평균은 더한 값을 $n$으로 나누는 반면에, 분산은 $n-1$로 나누는 걸 볼 수 있습니다. 이때 $n-1$을 자유도(degree of freedom, dof)*라고 합니다.

표준편차


분산 $\sigma^2$의 양의 제곱근인 $\sigma$을 표준편차입니다. 분산은 크기에 단위가 없는 반면, 표준편차는 그 단위가 원래 데이터와 같아서 해석이 용이합니다.

Python coding


지금까지 정리한 내용을 간단한 python 코드로 확인해보겠습니다.

[code download]

import numpy as np

# 아이스크림 가게 A, B의 일주일 매출 (단위: 만원)
shopA_sales = np.array([47, 60, 51, 52, 58, 48, 55])
shopB_sales = np.array([31, 73, 56, 61, 44, 67, 39])

# 두 아이스크림 가게의 평균
mean_A = shopA_sales.mean()
mean_B = shopB_sales.mean()
print(mean_A) # 53.0
print(mean_B) # 53.0

두 아이스크림 가게의 평균 매출은 동일합니다.

# 두 아이스크림 가게의 분산
# FYI,numpy는 분산을 계산할 때 자유도를 고려하지 않습니다.
var_A = shopA_sales.var()
var_B = shopB_sales.var()

# 자유도 고려 X
print(var_A) # 20.571428571428573
print(var_B) # 204.28571428571428

# var()사용하지 않고 shopA_sales의 분산 계산하기
tmp_var_A = np.power(shopA_sales-mean_A, 2).sum()/ len(shopA_sales)
print(tmp_var_A)          # 20.571428571428573
print(var_A == tmp_var_A) # True


# 자유도 고려 O
print(shopA_sales.var(ddof=1)) # 24.0
print(shopB_sales.var(ddof=1)) # 238.33333333333334

Numpy를 이용해서 분산을 계산할 때는 자유도를 고려하지않습니다. 분산 계산시 자유도를 고려하기 위해서는 ddof변수를 1로 설정합니다.LINK

데이터의 수가 작기 때문에, 자유도의 고려 여부에 따라 꽤 많은 차이가 있음을 알 수 있습니다.

# 두 아이스크림 가게의 표준편차
std_A = shopA_sales.std()
std_B = shopB_sales.std()

print(std_A) # 4.535573676110727
print(std_B) # 14.292855358035156

# std()사용하지 않고 shopA_sales의 표준편차 계산하기
tmp_std_A = np.sqrt(np.power(shopA_sales-mean_A, 2).sum()/ len(shopA_sales))
print(tmp_std_A)                   # 4.535573676110727
print(std_A == tmp_std_A)          # True
print(std_A == np.sqrt(tmp_var_A)) # True

아이스크림 가게 A와 B의 매출 표준 편차를 반올림하면 각각 4.54만원, 14.29만원으로, 데이터의 단위와 일치합니다.

이로써 우리는 아이스크림 가게 B의 매출이 A보다 변동성이 크다고 볼 수 있습니다. 하지만, A가 B보다 장사가 잘된다고 볼 수 없습니다.

마무리


이 글에서는 평균, 분산, 표준편차를 정리해봤습니다. 이 세가지 통계량은 데이터의 특성을 나타내주는 좋은 지표이지만, 이상치(outlier)에 민감하게 반응하는 단점이 있습니다.

가끔은 이상치에 robust한 통계량을 확인하는 것도 필요하기 때문에, 평균대신 중앙값(median), 표준편차 대신 중위절대편차(MAD)를 사용하기도 합니다.

긴 글 읽어주셔서 감사합니다. 다음 글은 두 변수 사이의 상관관계에 대해서 다루겠습니다.

좋은 하루 보내세요 :)

* 자유도를 이해하기 위해서는 분산을 계산하기 위해선 평균을 알아야한다는 것에 집중할 필요가 있습니다. $\mu$를 알고있으면, 분산을 계산할 때 반드시 $x_1$부터 $x_n$까지 순서대로 계산되지 않더라도 마지막 순서의 변수 값을 알 수 있습니다.
즉, $n-1$개의 변수는 어느 값이든 가질 수 있지만 마지막 1개의 변수는 $\mu$에 의해서 특정되기 때문에, '자유로운' 변수의 개수는 $n-1$개 이므로 자유도는 $n-1$이 됩니다.
모집단의 분산을 표본의 분산을 통해 유추하기 위해서는 위와 같이 자유도를 고려하는 것이 바람직하다고 합니다.
최근 우리가 사용하는 데이터의 수는 매우 많기 때문에 자유도를 깊게 이해하고 넘어갈 필요는 없지만, Regression(회귀)을 학습할 때 주의해야하는 다중공선성(multicollinearity)을 이해하기 위해서는 어느정도 알고 있는게 좋을 거 같습니다.

References

Practical Statistics for Data Scientists

선형대수와 통계학으로 배우는 머신러닝 with 파이썬

반응형
반응형

Intro


지난글에서는 고윳값과 고유벡터, 고윳값분해(eigenvalue decomposition)까지 정리했는데요,

이번글에서는 고윳값분해의 조금 더 일반화된 형태인 SVD(Singular Value Decomposition)에 대해서 정리하겠습니다.

SVD


고윳값분해는 주로 대칭행렬의 직교대각화를 통해 수행했습니다. ($A = PDP^{-1}$)

SVD는 이런 분해를 $n \times p$ 행렬 ($p$차원 벡터 $n$개)에도 적용할 수 있는 일반화된 방법입니다.

$B=U\Sigma V^T$

$U: n \times n 직교행렬$

$\Sigma: n \times p 직사각 대각행렬$

$V: p \times p 직교행렬$

직사각 대각행렬은 왼쪽 위부터 최대 $min(n, p)$번째 대각성분 까지만 값이 있고, 나머지는 0인 행렬입니다.

앞에서 고윳값분해를 할 때 분해 대상 행렬이 대칭행렬이면 계산이 수월하다고 했습니다.

따라서 $n \times p$ 모양을 갖는 행렬 $B$를 분해하기 위해서 $BB^T,B^TB$를 활용합니다.

이들은 각각 $n \times n, p \times p$ 모양을 갖는 대칭행렬이 됩니다.

1. $B^TB$의 고윳값 $\lambda_1,\dots,\lambda_p$과 고유벡터를 구합니다.

이때, $\sigma_1=\sqrt{\lambda_1},\dots,\sigma_p=\sqrt{\lambda_p}$들을 $B$의 특이값(singular value)고 합니다.

이 특이값들을 $\Sigma$행렬의 대각성분으로 사용합니다. 이때, 구해지는 고윳값과 특이값들은 모두 0 이상의 값을 갖습니다.

또한, 각 고윳값에 대응하는 고유벡터들을 $B$의 right singular vector ($V$)로 사용합니다.

2. $BB^T$에 대해서도 고윳값과 고유벡터를 구합니다.

이때 각 고윳값에 대응하는 고유벡터들을 $B$의 left singular vector ($U$)로 사용합니다.

SVD의 활용: 추천 시스템


SVD가 활용되는 대표적인 분야는 추천 시스템입니다. 추천 시스템은 사용자의 취향에 어울리는 적절한 상품을 선택하는 문제입니다.

추천 시스템은 크게 사용자와 상품사이의 feedback정보를 사용하는 Collaborative Filtering(CF),

사용자와 상품의 콘텐츠 정보를 활용하는 Content-Based Filtering(CB) 방법이 있습니다.

SVD는 그 중 CF방법에 속합니다.

SVD를 이용해서 분해할 행렬은 rating matrix ($R$)라고 하는, 사용자와 상품 사이의 평점 정보를 기록한 행렬입니다.

행의 수는 사용자의 수, 열의 수는 상품의 수와 같고, 사용자 $u$가 상품 $v$를 구매했을 때, rating matrix $R$의 $(u,v)$칸에는 사용자가 상품에 부여한 평점이 기록되어있습니다. 평점이 없는 칸은 비어있습니다.

SVD를 이용한 추천은 $R$을 SVD를 통해 $U\Sigma V^T$로 분해한 뒤, $U\Sigma (=\hat{U})$를 사용자의 latent vector, $\Sigma V^T (=\hat{V}^T)$을 상품의 latent vector로 사용합니다.

이때, $\Sigma$의 모든 대각원소를 사용하지 않고, $d(<=min(n,p))$개의 대각원소만 사용합니다. 이에 따라 $U, V$도 $d$개 만큼의 고유벡터만 사용하죠. 이때 적절한 $d$를 선택하는 것도 중요합니다.

$\hat{U}$은 $n \times d$으로, $n$명의 고객이 각각 $d$차원 벡터로 표현됐다고 볼 수 있습니다. $\hat{V}$도 마찬가지로 $p$개의 상품이 $d$차원 벡터로 표현됐다고 볼 수 있습니다.

$\hat{U}$과 $\hat{V}$를 행렬 곱하면 우리는 원래 rating matrix $R$을 근사한 $\hat{R}$을 얻게 되고, 비어져있던 값들이 채워지게 됩니다.

우리는 채워진 값을 통해 각 사용자가 상품에게 부여할 예측 평점을 알 수 있게 되고, 이 점수가 높은 상품을 추천하게 됩니다.

하지만 실제로는 SVD보다는 ALS가 더 많이 사용됩니다. ALS는 병렬 연산을 통해 더 빠르게 사용자, 상품의 latent vector를 학습할 수 있는 장점이 있습니다.

마무리


이 글에서는 SVD에 대해서 정리했습니다.

읽어주셔서 감사합니다!

References

선형대수와 통계학으로 배우는 머신러닝 with 파이썬

다크 프로그래머님 블로그

삶은 달걀님 블로그

반응형

+ Recent posts