콘텐츠로 건너뛰기
Home » 스터디

스터디

Python 101 – 클래스

이 글을 읽으시는 파이썬을 공부하는 여러분은 아마도 들어보셨겠지만, 파이썬은 객체 지향 언어입니다. 객체 지향 언어는 객체 지향 프로그래밍이라는 패러다임을 따르는 방식으로 설계된 언어입니다. 그리고 클래스는 어떤 객체를 정의해놓은 청사진과 같다고들 합니다. 그래서 클래스가 무엇인지를 이해하려면 먼저 객체가 무엇인지를 알아야겠네요. 위키 백과에서 객체에 대해 찾아보면 다음과 같은 설명을 찾을 수 있습니다.

컴퓨터 과학에서 객체 또는 오브젝트(object)는 클래스에서 정의한 것을 토대로 메모리에 할당된 것으로 프로그램에서 사용되는 데이터 또는 식별자에 의해 참조되는 공간을 의미하며, 변수, 자료 구조, 함수 또는 메소드가 될 수 있다.

여러 편집자들이 고민하여 작성한 설명이겠지만, 이 설명만 들어서는 객체가 무엇인지 알기가 어렵습니다. 사실 객체의 개념은 워낙 추상적이라 일상의 언어로 정확하게 설명하기란 어렵습니다. 그래서 대략의 어설픈 이해를 바탕으로 접근해서, 객체가 어떤 식으로 사용되고 또 어떻게 만들 수 있는지를 받아들이는 편이 좋을 듯 합니다. 사실 학문적으로 엄밀하고 정확한 이해보다는 어떻게 만들고 사용할 수 있는지를 아는 것이 더 중요하니까요.

더 보기 »Python 101 – 클래스

파이썬 추상 클래스로 Comparable 타입 선언하기

파이썬에서 타입 어노테이션을 붙일 때, 제네릭 타입에 대해서는 typing.TypeVar 를 사용하면 일반적인 타입 T를 가정하고 정의할 수 있습니다. 그런데 이러한 타입 T에 대해서 특정한 성질을 만족하게끔 하는 조건을 넣고 싶은 경우가 있습니다. 예를 들어 리스트에 대한 버블 정렬 기능을 함수로 구현한다고 하면, 인자의 타입은 list[T] 와 같이 타입 T를 원소로 하는 리스트라고 명시할 수 있는데, 이 때 정렬을 위해서는 순서나 대소를 비교할 수 있어야 하므로, 타입 T 는 x > y 와 같이 대소를 비교할 수 있는 타입이어야 합니다. 파이썬에서는… 더 보기 »파이썬 추상 클래스로 Comparable 타입 선언하기

Python 101 – 함수

프로그래밍에서 함수는 핵심적인 개념이지만, 언어나 상황마다 용어가 다르기도 하고 정의도 모호해서 “함수는 이것이다!”라고 딱 잘라 말하기는 사실 힘듭니다. 위키 백과의 정의만 찾아봐도요.

함수(function), 서브루틴(subroutine), 루틴(routine), 메서드(method), 프로시저(procedure)는 소프트웨어에서 특정 동작을 수행하는 일정 코드 부분을 의미한다.

함수는 대부분의 프로그래밍 언어에서 지원하는 기능으로, 하나의 큰 프로그램을 여러 부분으로 나누어주기 때문에 같은 함수를 여러 상황에서 여러 차례 호출할 수 있으며 일부분을 수정하기 쉽다는 장점을 가진다.

https://ko.wikipedia.org/wiki/함수_(컴퓨터_과학)

가장 넓은 의미에서 함수를 정의하자면 “1개 이상의 동작을 묶어놓은 것”이라고 할 수 있습니다. 즉 일련의 동작을 하나의 단위로 묶어두고, 원하는 만큼 여러 차례 호출하여 사용하는 것이죠. 그렇게해서 전체 코드의 양을 줄일 수 있고, 또 공통된 동작에서 어떤 변경이나 수정이 필요할 때, 소스 코드의 이곳 저곳이 아닌 한 부분만 수정하면 되기 때문에 유지 보수 관점에서도 노력을 아낄 수 있죠.

이미 우리는 파이썬에서 함수를 사용하는 법을 알고 있습니다. 어떤 문자열이나 객체의 내용을 출력하는 print() 나 사용자로부터 문자열을 입력받는 input() 과 같은 동작은 파이썬이 미리 제공하는 함수입니다. 이렇게 별다른 사전 준비 없이 바로 사용할 수 있는, 파이썬이 기본적으로 제공하는 함수를 내장함수(builtin function)라고 합니다. 우리는 내장 함수를 사용하는 것외에 우리가 원하는 동작을 함수로 만들어서 사용할 수도 있습니다. 이런 개념을 내장함수에 상대적인 개념으로 사용자 정의 함수 (user defined function)이라고 합니다.

더 보기 »Python 101 – 함수

Pandas 기초 사용법 – Series

파이썬에서 통계 및 데이터 분석을 위해 사용하는 대표적인 패키지로 pandas를 꼽을 수 있다. 사실 pandas말고 다른 통계용 패키지는 뭐가 있나 잘 모르겠… 통계 분석을 위해서 pandas를 사용하기 위해 파이썬을 배우는 입장이 아니라면 기존의 파이썬 자료 구조와는 사용법이 살짝 다르기 때문에 약간 위화감이 들 수 있다. 이 글에서는 기존 파이썬 자료 구조에 익숙한 사용자가 pandas를 익히기 위해 필요한 내용과 그 사용법을 정리하고자 한다.

Pandas에서는 Series와 DataFrame이라는 두 가지 형식의 데이터 타입이 존재한다. Series는 특정한 기준에 따른 계열 데이터로 파이썬의 리스트와 비슷하다. DataFrame은 Series를 합친 형태로 2차원의 표 형식의 데이터를 다룰 때 사용한다.

더 보기 »Pandas 기초 사용법 – Series

비율에 대한 검정

지난 시간에 모평균에 대한 검정을 수행했다. 평균에 대한 검정은 표본 조사를 통해서 모집단의 평균이 특정한 값인지 혹은 특정 기준보다 큰지/작은지에 대해 판단하는 검정이었다. 이번 시간에는 모비율에 대한 검정 방법을 알아보도록 하자. 모비율에 대한 분포는 이항분포와 관련이 있다. 이항 분포에서도 표본이 충분히 크면 이행분포가 정규 분포에 근사한다. 이 때 이항 분포의 평균은 p 이고, 분산은 p(1 – p)/n 인 정규 분포를 따른다. 평균에 대한 검정이 정규 분포에 기초한 것이었음을 생각해보면, 모비율 검정에서도 검정 통계량은 똑같은 공식을 사용한다. 검정 통계량 = {표본평균과… 더 보기 »비율에 대한 검정

모평균에 대한 가설 검정

표본의 통계량으로부터 모평균을 추정하는 것과 같은 원리를 사용하여, 모평균에 대한 가설을 검정할 수 있다. 예를 들어 “어떤 공장에서 생상한 나사못의 지름은 8mm이다.”라는 가설이 있을 때 표본 조사를 통해 이 가설이 맞는지를 알아보는 것은 모평균에 대한 검정이다. 평균에 대한 가설의 검정은 표본으로부터 얻은 통계량으로 모수를 추정하고, 그 추정치가 가설에서 말하는 값에 부합할 확률이 어느 수준인지를 판단하는 것이므로, 모평균의 추정과 사실 그 원리는 동일하다. 대신에 통계학에서는 가설을 설정하고 이를 검정하는 방법을 규격화하여 사용한다.

검정은 다음과 같은 순서로 이루어진다. 우선 어떤 모수의 값이 얼마인지에 대한 가설과 유의수준을 설정한다. 유의 수준이란 간단히 말해서 검정의 결론이 잘못될 확률이다. 그리고 모집단에 대한 표본평균을 확률 변수로 할 때, 이 확률변수의 분포를 구한다. 그런 다음 실제 표본을 조사하여 표본 평균을 계산한다. 계산된 표본 평균이 평균의 확률 분포에 따라 나타날 수 있는 확률을 구한다. 만약 표본 평균이 나타날 확률이 유의수준보다 낮다면, “본래의 가설이 맞다고 가정했을 때, 표본 조사의 결과가 그러한 가정에서는 나타나기 힘든 수치이므로 이 가설을 기각한다.”는 결론을 내릴 수 있다.

더 보기 »모평균에 대한 가설 검정

조건부 확률

솔직히 고백하자면 개인적으로도 이 조건부 확률에 대해서 제대로 이해하지 못했었다. 조건부 확률 문제를 단순히 공식을 사용해서 푸는 것과 어느 정도 이해하는 것은 전혀 다른 문제이기 때문이다. 조건부 확률은 단순히 결합가능한 두 사건 사이의 관계의 확률이라기 보다는, 각각의 사건의 확률의 관계를 수식으로 다룬다는 것에 있다.

조건부 확률은 어떤 사건이 일어났을 때의 다른 사건이 일어나는 확률이다. (여기까지는 ‘확률’을 제외하면 일상의 언어로 된 문장이기 때문에 어려울 것이 없다.) 두 사건 A, B가 있고 이 각각의 사건이 일어날 확률을 P(A), P(B) 라고 했을 때, 사건 B가 일어났을 때 사건 A가 일어났을 확률을 ‘사건 B에 대한 사건 A의 조건부 확률’이라 하고 P(A|B) 라고 표기한다.

더 보기 »조건부 확률

모평균의 추정

중심극한 정리에 따르면 모집단의 데이터의 분포에 무관하게, 표본의 크기가 충분히 크다면 표본 평균의 분포는 그 평균의 모평균과 같고, 분산이 모분산을 표본수로 나눈 값인 정규분포에 가까워진다. 이 말은 어떤 집단에서 표본을 추출하여 얻는 표본 평균이 모평균의 근처에 있을 가능성이 높다는 의미이다. 그리고 표본 평균의 분산은 모분산을 표본수로 나눈 값이므로 표본의 수가 충분히 크다면 더더욱 표본 평균은 모평균과 가까워질 것이다. 따라서 표본 조사를 통해 얻은 표본 평균을 통해 모평균을 추정하는 것은 너무 터무니 없는 것은 아닌 것이다. 그렇다면 표본 조사를 통한 모평균의 추정은 어떻게 할 수 있을까?

더 보기 »모평균의 추정

Python 101 : 맵, 필터와 반복문

지난 글에서는 리스트 및 그와 비슷한 집합 형태의 자료형을 살펴보면서 “반복 가능”이라는 개념에 대해서 소개했다. 반복 가능하다는 특성은 꼭 리스트가 아니어도 여러 개의 값을 포함하는 집합/모임(collection)의 성질을 갖는 다양한 자료형에서 나타나는 성질이며, 이러한 특성을 갖는 객체들은 그 내부 구현에 상관없이 for 루프나 comprehension 축약 문법에 적용될 수 있다.

더 보기 »Python 101 : 맵, 필터와 반복문

Python101 : 다른 집합 유형들

지난 글에서 리스트의 특징에 대해서 언급할 때나, 리스트 축약에 대해서 이야기하면서 “연속열”이나 “반복가능”이라는 단어를 사용한 적이 있다. 사실 파이썬에 연속열이나 반복객체 혹은 반복가능객체는 이제는 거의 공식적으로 사용되는 개념이다. 리스트는 이런 “연속열”과 “반복가능”에 공통적으로 속하는 유형의 데이터 타입인 것이다. 이번 글에서는 그럼 리스트 외에 어떤 다른 집합형 데이터 타입이 있는지 알아보고 그 면면을 좀 살펴보기로 하겠다. 값의 타입 일단 값의 타입을 확인하는 방법을 알아보자. 사실 여기서 말하는 타입들은 아주 “대표적인” 파이썬 타입들이며, 사실 파이썬에는 엄청나게 많은 데이터 유형이 존재한다. (사실 어떤… 더 보기 »Python101 : 다른 집합 유형들