현실 세계의 문제를 분석하여 해결책을 찾는 과학적 사고법을 Computational Thinking이라 하며 이렇게 설계한 해결책을 컴퓨터의 명령어로 작성하는 것이 컴퓨터 프로그래밍이다.
구성
- 분해 : 복잡한 문제를 작은 문제로 나눔
- 패턴 인식 : 문제 안에서 유사성을 발견
- 추상화 : 문제의 핵심에만 집중하고 부차적인 것은 제외
- 알고리즘 :이렇게 정의한 문제를 해결하는 절차(일반화와 모델링은 여기에 포함)
데이터소스 - 수집 - 저장 - 처리 - 분석 - 표현
모델링 : 도메인 지식이 부족할 수 있다.
분석 -> 비즈니스 인사이트 도출이 메인이다.
컴파일러 & 인터프리터 : 인간이 고급 프로그래밍 언어(소스코드)로 작성한 것을 컴퓨터가 실행할 수 있도록 운영체제나 가상머신이 이해할 수 있는 코드로 번역해주는 프로그램
IDE(Intergrated Development Environment)
- 코딩, 디버그, 컴파일, 배포 등 프로그램 개발에 관련된 모든 작업을 하나의 프로그램 안에서 처리하는 환경을 제공하는 프로그램
컴파일러는 bin파일로 os가 이해할 수 있도록 한다. 한 번에 실행하기에 bin파일이 필요한다.
Unix/Linux/MS Windows/Macintosh : 다 python 사용 가능한 플랫폼이다.
- 전부 다 C 계열이다.
- Cpython 이 좀 쓰기가 좋겠죠?
- MS는 조금 다르기에 visual 뭐 설치하라고 하는거야.
python interpreter 종류
- python : 일반적인 파이썬, 기본적인 모듈 포함
- Anaconda : 데이터 분석할 사람들은 주로 씀
- Canopy : 우리나라는 별로 안씀
(#) 다음에 작성하면 주석이 됩니다.
파이썬에는 문자열 상수를 만들 때, 작은 따옴표나 큰 따옴표를 안에 묶고 여러 줄의 경우는 작은 따옴표나 큰 따옴표를 3번해서 묶습니다.
#! 는 주석이 아니고 유닉스의 shebang 입니다.
- 일반적으로 파이썬에서는 소스 코드의 인코딩을 표시할 목적으로 사용합니다.
dir(데이터) : 데이터가 호출 가능한 속성과 메서드를 리턴합니다.
- print 안에서 불러야 할 것이다.
help(함수나 메서드) : 함수나 메서드의 도움말을 출력합니다.
__ __ 가 붙는 것들 : 특수 메서드(근본적으로 직접 호출이 아닌 호출법이 따로 존재함)
안붙은 것들 : 메서드, 함수
import keyword print(keyword.kwlist)
를 해보자pip install
을 했는데 왜 없다 그러지?import sys print(sys.path)
를 해보자.숫자 데이터 : int, float, complex - 하나의 데이터(scala data), 불변(immutable), 직접 접근
문자열 : str : 0개 이상의 문자의 집합, 불변, 순차 접근
tuple : 0개 이상의 데이터의 모임, 불변, 순차 접근
list : 0개 이상의 데이터의 모임, 가변, 순차 접근
set(집합) : 0개 이상의 데이터의 모임, 가변, 순차 접근을 못함(순서대로 저장x)
- set은 데이터를 빨리 찾으려고 쓰는 것이다.
- id만 불러온다고 하면 set(중복도 안되며 찾는 속도는 다 똑같음)
dict(딕셔너리, 사전, map, hashtable 등) : 0개 이상의 데이터의 모임으로, 가변, key-value 시스템
- key가 set으로 만들어 집니다.(똑같은 key는 없다.)
이름으로 찾는 것이 index보다 빠르다. list vs dict : dict가 이김
하지만 장점이 있다면 단점도 있다. (속도의 이득->메모리낭비)
- trade-off라고 하네요
- 적절한 지점을 찾아가는 것이 중요하다.
? 직접 접근 : 순차 접근
사용자가 직접 입력하는 데이터로 처음 사용될 때 static 영역에 생성되고 이후 부터는 재사용을 합니다.
static영역은 한 번 쓰면 안사라짐
- a=10
a에 10에 저장한다고 말하지좀 말자
- b=10
하면 10을 참조하는 것이 2개인 것이다.
숫자 : 정수, 실수, 복소수
정수(int) : 10진수(숫자), 8진수(0o숫자), 16진수(0x숫자), 2진수(0b숫자), 숫자L(long 형)
실수(float) : 1.2(단순 숫자입력), 0.12e1(0.12*10^1)
복소수(complex) : 4+5j(j로 표현)
bool : True, False(첫 글자는 대문자)
str : 작은 따옴표나 큰 따옴표 안에 기재하면 되는데, 여러 줄은 3번
bytes : 바이트의 집합으로 b'문자열' 또는 b'\코드\코드..'
list : [] 안에 나열
tuple : () 안에 나열
set : {}안에 나열
dict : {key:value, key:value...}방식으로 나열
str, bytes, list, tuple, set, dict는 순차적으로 접근이 가능하다고 해서
iterable이라고 합니다.
확인방법 : dir 에 넣어서 __iter__가 있는지 확인
python을 알고 분석하는 것과 모르고 분석하는 것은 매우 큰 차이가 난다.
\n : 줄바꿈
\t : 탭
\,\',\" : 등등등...
value type : 값을 직접 저장
장점 : 빠르다.
reference type : 참조를 저장
단점 : 느리다.
장점 : dynamic binding(어떠한 타입이라도 저장 가능)
del 변수명
이는 데이터 파괴가 아님. 산술연산 : 숫자 데이터를 연산해서 숫자로 결과를 리턴하는 연산
논리연산 : bool 데이터를 연산해서 결과를 bool로 리턴하는 연산
단항 연산(Unary) : 데이터의 개수가 1개인 연산(피연산자)
이항 연산(Binary) : 데이터의 개수가 2개인 연산(피연산자)
python은 삼항 연산 없다
파이썬은 숫자데이터의 메모리 제한이 없음. 최대한으로 잡음
연산의 결과를 bool로 리턴
bool 데이터도 크기 비교가 가능
- True는 1, False 는 0
문자열도 크기 비교가 가능
- 첫 글자부터 코드 값을 비교해서 크다 작다를 판별
- A는 65, a는 97
정수 데이터를 2진수로 변환해서 각 비트 단위로 연산을 수행한 후 10진 정수로 결과를 리턴하는 연산자
'&' : and로 둘 다 1일때만 결과가 1이고 나머지는 0
'|' : or로 둘 다 0인 경우만 0이고 나머지는 1
- 2개의 연산자는 데이터 분석을 위한 라이브러리(numpy)에서는 데이터 모임에서도 사용이 가능한데, 이 경우는 위치 별로 연산을 수행해서 리턴
'^' : eXclusive OR 로 두 개의 데이터가 같은 경우는 0 다른 경우는 1
'~' : 단항 연산으로 1의 보수
'<<' : 왼쪽으로 미는 연산자 - 곱하기 2
'>>' : 오른쪽으로 미는 연산자 - 나누기 2
진법 : 몫이 0이 나올때까지 나누고 나머지를 역순으로 나열하기
이거 한번 만들어보자
and와 or가 같이 있으면 and가 우선입니다.
and와 or는 연산자의 좌우를 변경해도 연산의 결과는 그대로입니다.
과정은 다릅니다.
- and는 앞의 결과가 False인 경우, 뒤의 연산 결과를 확인 X
- or는 앞의 결과가 True인 경우, 뒤의 연산 결과를 확인 X
if i%3==0 and i%4==0
과if i%4==0 and i%3==0
은 다릅니다. 이는 아래와 같습니다.
i는 0부터 100까지 순회를 한다고 가정합시다.
if i%3==0 : if i%4==0: // 33개 체크한 것을 안에서 체크합니다.
if i%4==0 : if i%3==0: // 25개 체크한 것을 안에서 체크합니다.
충분히 차이가 납니다.
check1, check2 넣어서 몇번씩 들어가는지 확인해도 됩니다.
우리는 컴퓨터 입장에서 생각을 해봐야 합니다.
type(데이터)
id(데이터)
프로그래밍에서는 일반적으로 숫자와 문자열 사이의 변환이나 문자열과 날짜 사이의 변환을 많이 수행하지만, 데이터 분석에서는 이외에도 factor타입으로의 변환이나 문자열 데이터를 비트열로 변환하는 것을 많이 수행합니다.
factor(나열형 상수?)
ex
남자와 여자가 있다.
데이터 분석을 하려면 숫자로 바꿔야 한다.
0, 1로 치환한다 하자. 2,3,4 같은 숫자 방지를 해야 한다.
이외의 값을 통제한다.
분석하는 사람들은 (0 1) (1 0) 을 생각한다.
묵시적 형변환 : 자동으로 형 변환이 되는 경우
- 파이썬은 묵시적 형변환이 한개밖에 없다. 다른 종류의 숫자 데이터끼리 연산을 하는 경우, 작은 타입을 큰 타입으로 변환해서 수행
명시적 형변환 : 형 변환을 직접 해줘야 하는 경우
- 정수로 변환 : int(숫자 혹은 숫자로된 문자열)
- 실수로 변환 : float(숫자 데이터 또는 숫자로 된 문자열)
- bool로 변환 : bool(숫자 데이터 또는 bool 문자열)
- 문자열로 변환 : str(데이터)
실수를 정수로 변경하면 소수가 소멸됩니다.
- 3750을 10의 자리에서 반올림해서 백의 단위로 변환
- 내가 반올림 하고 싶은 자리를 소수 첫째자리로 옮기기
- 37.5+0.5 하고 소수 버리고 다시 곱한다.
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
- 첫 번째 매개변수(value)는 출력할 데이터
- 두 번째 매개변수(...)는 출력할 데이터인데 개수 제한이 없음
- sep는 데이터 사이의 출력되는 문자(구분자, 현재는 공백)
- end는 출력하고 난 후 출력되는 문자
- file은 출력할 대상을 지정하는 것인데, sys.stdout은 표준 출력장치(일반적으로 모니터)이다. 파일경로를 쓰면 파일에 출력
- flush는 버퍼의 내용을 비울지에 대한 옵션이다. True, False로 지정할 수 있다.(False는 바로바로, True는 모아서 출력 내부적으로 작용)
flush는 버퍼의 내용을 비울 지에 대한 옵션입니다.
num=20 print("num은", num) print("num은 %d" %(num))
동일합니다.
"{데이터의 인덱스}".format(데이터나열)" print("{0}은 {1}을 좋아합니다.".format("mino","home"))
물론 인덱스 위치는 상관없습니다.
인덱스 자리대신에 변수를 쓸 수 있다면?
// 따옴표 앞에 f를 추가하면 인덱스 대신에 이름 사용 가능합니다. name="mino" place="home" print(f"{name}은 {place}을 좋아합니다.")
이를 f-string 이라고 합니다. 이렇게 출력하는 것을 권장합니다.
input(prompt=None,/)
name=input("이름을 입력하세요:") print(name)
메시지가 없다면 그냥 빈 화면에서 입력해야 한다.
try: age=int(input("나이 입력")) print(age) except: print("문제 발생") print("프로그램 종료")
이와 같이 예외처리를 하지 않으면 안된다.
hobbys=input("취미 입력을 ,로 구분해서 입력").split(",") for hobby in hobbys: print(hobby)
이렇게 한다면 여러 값을 넣을 수 있다. 형태는 리스트 형태로 저장