[코드잇] 데이터 사이언스 기초 - 데이터 사이언스 시작하기
1. 데이터 사이언스란?
데이터 사이언스란?
• 데이터 과학 = 다양한 데이터로부터 지식과 인사이트를 추출하는 분야
• 데이터 사이언티스트가 갖춰야 할 능력 = 수학과 통계, 프로그래밍, 전문성
데이터 사이언스에 대한 오해
• 데이터 사이언스의 핵심은 인공지능, 딥러닝이다. (X)
1. 데이터를 모으는 과정
2. 데이터를 옮기고 저장하는 과정
3. 데이터를 정리하는 과정
→ 1~3. 데이터 엔지니어링
4. 분석
5. A/B테스트 (서비스 개선)
6. 인공지능, 딥러닝 -----> 가장 상위에 있는 분야
미디어에서 인공지능과 딥러닝만 강조하지만, 사실 그 이전 단계에서 하는 일들이 기반이 되므로 중요함.
• 데이터 사이언티스트는 왠지 하루종일 컴퓨터와 수학만 하는 사람일 것 같다. (X)
세상에 가치를 더할 수 있는 문제를 찾아내고 데이터를 이용해 문제를 해결하는 일.
단순히 기술적인 분야만이 아님.
비즈니스의 핵심 문제를 파악하기 위해 소통 역량이 필요함.
R과 파이썬
R | 통계와 시각화 - 데이터 분석이나 시각화를 할 수 있는 툴이 아주 많음. - 목적이 특수하다보니 R을 배운다고 다른 프로그래밍을 할 수 있는 건 아님. - 연구 분야에서 많이 사용함. |
Python | 다양한 분야에서 사용할 수 있는 언어 - 통계와 시각화를 하기 위한 기본 툴이 R에 비해 부족함. - 웹사이트 개발, 이미지 처리, 업무 자동화, 데이터 시각화, 게임 개발, 앱 서버 개발 등 다양한 분야로 진출 가능함. - 간단하고 직관적이라서 프로그래밍을 처음 배우기 좋은 언어임. |
예전에는 R이 인기가 많다가, numpy, pandas, tensorflow 같은 라이브러리가 생겨서 파이썬 인기가 많아짐.
2018년부터 파이썬이 훨씬 앞섬.
데이터 사이언스 프로세스
1. 문제 정의하기 | 해결하고자 하는 문제를 정의 |
목표 설정, 기간 설정, 평가 방법 설정, 필요한 데이터 설정 | |
2. 데이터 모으기 | 필요한 데이터를 모을 수 있는 방법 찾기 |
웹 크롤링, 자료 모으기, 파일 읽고 쓰기 | |
3. 데이터 다듬기 | 데이터의 퀄리티를 높여서 의미 있는 분석이 가능하게끔 함. |
데이터 관찰하기, 데이터 오류 제거, 데이터 정리하기 | |
4. 데이터 분석하기 | 준비된 데이터로부터 의미를 찾습니다. |
데이터 파악하기, 데이터 변형하기, 통계 분석, 인사이트 발견, 의미 도출 | |
5. 데이터 시각화 및 커뮤니케이션 | 분석 결과를 다른 사람들에게 전달합니다. |
다양한 시각화, 커뮤니케이션, 리포트 |
2. Jupyter Notebook
파이썬 프로그래밍 방법 3개
텍스트 에디터, 커맨드 라인 | 운영체제에 내장된 커맨드 라인으로 프로그램 실행됨. Sublime Text, ATOM + : 컴퓨터의 사양이 좋지 않아도 사용 가능함. - : 툴이 많지 않아 실수 가능, 권장된 스타일로 하지 않을 수 있음, 프로그램 수리 어려움. |
IDE(통합 개발 환경) | Pycharm, 웹브라우저에서 사용 가능한 IDE + : 디버깅 툴, 자동완성, 코드 스타일 교정 등 많은 장점이 있음. - : 소프트웨어 용량 많이 차지함, 익히기 어려움, 의존성이 커짐. |
Jupyter | 웹브라우저에서 인터랙티브하게 작업하기 위한 툴 코딩하면서 그래프 보고 설명 작성 가능 Python, R, Julia + : 결과물 바로 확인 가능, 여러 단계로 나누어 확인 가능, 편리한 마크다운 기능 - : 제공되는 툴이 적음, 버전관리와 협업이 어려움 → 대규모 프로젝트에서 사용하지 않음. |
Jupyter Notebook 설치
Anaconda Navigator를 실행하고 launch 버튼을 눌러 Jupyter Notebook을 실행
Command 창에서 pip로 설치하는 방법
1. Python 3 설치하기
2. Add Python 3.7 to PATH 옆 체크 박스
3. "Windows 키" + "r" → cmd 실행 → pip install jupyter 입력
Jupyter Notebook 둘러보기
• New - Python 3 (ipykernel)
• User Interface Tour
• Command mode vs Edit mode
Command 모드 | 아무것도 없음 | 커맨드 모드인 상태에서는 선택된 셀의 왼쪽이 파란색임. 키보드 단축키를 사용해서 노트북을 전반적으로 컨트롤 가능 선택된 셀 실행, 삭제, 복사 |
Edit 모드 | 연필 표시 | 셀의 왼쪽이 초록색으로 바뀜 셀 안 커서가 껌뻑임 키보드에 뭔가 치면 선택된 셀에 입력됨 ESC를 누르면 다시 커맨드 모드로 돌아갈 수 있음 |
• Kernel Indicator
커널 = 작성한 코드를 실행시켜주는 엔진
커널의 상태를 표시함.
커널이 색칠되어 있으면 코드 실행 중임.
멈추고 싶으면 '■' 누르기 → Interrupting kernel이라고 뜸.
• Tool Bar와 단축키
기능 | Tool Bar | 단축키 |
셀 실행 | Cell - Run Cell | Ctrl + enter |
새로운 셀 추가 (위) | Insert - Insert Cell Above | a |
새로운 셀 추가 (아래) | Insert - Insert Cell Below | b |
선택한 셀 삭제 | Edit - Delete Cells | dd |
셀 연속 선택 | shift | |
셀이 실행되고 나서 그 밑에 새로운 셀 실행 | Run Cells and Insert Below | Alt + enter |
셀이 실행되고 나서 그 밑의 셀을 선택 (마지막 셀에서 이걸 누르면 새로운 셀이 생성됨) |
Run Cells and Select Below | Shift + enter |
노트북에 있는 셀들은 세션을 공유함.
같은 환경에서 실행되기 때문에 변수, 함수 등을 서로 공유함.
첫번째 셀에서 정의한 x를 두 번째 셀에서도 사용할 수 있음.
변수 y를 정의한 적이 없어서 세번째 셀은 오류가 남.
작성한 순서대로 실행되는 일반 프로그램과 다름.
같은 세션을 공유하지만 실행이 독립적으로 됨.
→ 실행되는대로 작성할 필요는 없으나, 실행 순서대로 코드를 작성하자.
• 셀 실행과 관련된 단축키
Cell - Run All | 모든 셀 실행. (아까 사용하던 세션은 그대로 사용하면서 다른 세션 실행됨.) |
Kernel - Kernel - Restart & Clear Output Cell - Run ALL |
모든 세션이 삭제됨. |
모든 셀이 새로운 세션에서 시작됨. (앞에 숫자가 1부터 다시 시작됨) | |
Kernel - Restart & Run All | 새로운 세션을 시작하고 모든 셀을 실행함. |
• Markdown
![]() |
![]() |
![]() |
![]() |
제목 | #개수 작을수록 글자가 큼 | # 이것은 1단계 제목입니다. ## 이것은 2단계 제목입니다. ### 이것은 3단계 제목입니다. #### 이것은 4단계 제목입니다. |
번호가 있는 목록 | 번호 순서대로 쓰기 | 번호가 있는 목록 1. 먼저 시작하겠다. 2. 그다음으로 할 일이다. 3. 세 번째로 끝 |
번호가 없는 목록 | * (별) 쓰기 | * 번호가 없는 목록입니다. * 번호가 없는 목록입니다. * 번호가 없는 목록입니다. |
줄바꿈 | 스페이스바 두 번 | 도토리가 문을 도로록, 드르륵, 두루룩 열었는가?vv 드로록, 두루륵, 두르룩 열었는가. |
문단 바꿈 | 엔터 두 번 | 안촉촉한 초코칩이니까 안촉촉한 초코칩나라에서 살아"라고해서 안촉촉한 초코칩은 촉촉한 초코칩이 되는것을 포기하고 안촉촉한 초코칩 나라로 돌아갔다. |
링크, 이미지, 코드블록, 인라인코드, 구분선 추가
▼ markdown 사용 가능한 온라인 서비스
Online Markdown Editor - Dillinger, the Last Markdown Editor ever.
Make something great today!
dillinger.io
StackEdit
stackedit.io
• 값 출력
![]() |
![]() |
print로 출력하면 각 코드가 다 나오지만 print 없이 출력하면 맨 마지막 코드만 나옴. |
같은 내용이라도 print로 출력한 것과 그냥 출력한 것이 다르게 나옴. |
3. Numpy
numpy란?
Numerical Python : 숫자와 관련한 파이썬 도구
파이썬 리스트와 비슷한 Numpy 배열(Numpy Array)를 제공해줌.
![]() |
![]() |
numpy array의 생김새
numpy array 생성
· numpy를 불러와서 numpy 모듈을 이용
→ 파라미터로 파이썬 리스트를 넘겨주니까 numpy array가 생성됨.
· type : ndarray (n차원 배열)
모듈 이름 만들기
'import matplotlib.pyplot' 이렇게 모듈 이름이 길면 전부 쓰기 힘듦.
import matplotlib.pyplot as plt
→ 모듈을 불러 올 때 plt만 쓰면 됨.
array의 shape : 행과 열의 개수
· array1.shape = (7,) : 행이 1개, 열이 7개인 1차원 array
· array2.shape = (3, 4) : 행이 3개, 열이 4개인 2차원 array → 세로 길이 3, 가로길이 4
array의 size : 총 몇 개의 요소가 있는지
· array1.size = 7 : 요소가 7개
· array2.size = 9 : 요소가 9개
numpy array 생성하는 방법
import numpy as np
# 파이썬 리스트를 통해 생성
array1 = np.array([2, 3, 5, 6])
print(array1)
'''
[2 3 5 6]
'''
# 균일한 값으로 생성 (full)
# full안에는 (행의 shape를 나타내는 튜플, 값)
array2 = np.full((3, 4), 7) # 모든 원소가 7 (3, 4) 형태의 배열
print(array2)
'''
[[7 7 7 7]
[7 7 7 7]
[7 7 7 7]]
'''
# 모든 값이 0인 numpy array 생성
array3 = np.full((2, 4), 0)
array4 = np.zeros((2, 4), dtype=int)
print(array3)
print(array4)
'''
[[0 0 0 0]
[0 0 0 0]]
[[0 0 0 0]
[0 0 0 0]]
'''
# 모든 값이 1인 numpy array 생성
array5 = np.full((3, 2), 1)
array6 = np.ones((3, 2), dtype=int)
print(array5)
print(array6)
'''
[[1 1]
[1 1]
[1 1]]
[[1 1]
[1 1]
[1 1]]
'''
# 랜덤한 값들로 생성
array7 = np.random.random(6)
print(array7)
'''
[0.23998374 0.97906104 0.77264671 0.61714519 0.06909035 0.51971524]
'''
# 연속된 값들이 담긴 numpy array 생성 (arange)
array8 = np.arange(6) # 0부터 5까지의 값
print(array8)
# [0 1 2 3 4 5]
array9 = np.arange(3, 6) # 3부터 5까지의 값
print(array9)
# [3 4 5]
array10 = np.arange(4, 13, 3) # 4부터 12까지의 값이 3만큼 간격으로
print(array10)
# [ 4 7 10]
인덱싱, 슬라이싱
![]() |
![]() |
numpy 기본연산
![]() |
![]() |
numpy 불린 연산
np.where() : True값이 있는 인덱스만 반환
numpy array vs python list
• 공통점 : 여러 값을 보관할 수 있음
• 차이점 :
1. 문법적인 차이
리스트끼리 덧셈 | 리스트끼리 뺄셈, 곱셈, 나눗셈 |
Numpy : 같은 인덱스 있는 값끼리 더해짐 Python : 리스트끼리 이어짐 |
Numpy : 덧셈과 비슷하게 작용함 Python : 오류 발생함 |
리스트에 숫자 덧셈, 뺄셈, 나눗셈 | 리스트에 숫자 곱셈 |
Numpy : 배열에 있는 각 값에 연산이 적용됨 Python : 오류 발생함 |
Numpy : 배열에 있는 각 값에 곱셈이 적용됨 Python : 리스트에 있는 원소가 숫자만큼 반복됨 |
2. 효율성 차이
값들이 저장되는 방식 차이 때문에 효율성에서 차이가 발생함.
자료형 | 용도 | |
Numpy | 배열에는 같은 자료형끼리만 들어감 | 수치 계산이 많고 복잡할 때 행렬 같은 다차원 배열의 경우 |
Python | 한 리스트에 여러가지 자료형이 들어감 | 값을 추가하고 제거하는 일 |
numpy 기본통계
import numpy as np
'''
최댓값, 최솟값 --> max(), min()
'''
arr1 = np.array([12, 4, 6, 7, 9, 1])
print(arr1.max()) # 최댓값 12
print(arr1.min()) # 최솟값 1
'''
평균값 --> mean()
'''
arr2 = np.array([3, 5, 7, 12, 45, 1])
print(arr2.mean()) # 평균값 12.16...
'''
중앙값 ---> median()
'''
# median()은 numpy의 메소드라서 np를 쓰기
arr3 = np.array([9, 2, 40, 21, 16])
arr4 = np.array([14, 6, 13, 23, 7, 31, 9, 5])
# 배열의 개수가 짝수이면 두 중앙값의 평균
print(np.median(arr3)) # 중앙값 16.0
print(np.median(arr4)) # 중앙값 11.0
'''
표준편차, 분산 ---> std(), var()
'''
arr5 = np.array([24, 6, 13, 21, 41, 31, 9, 5])
print(arr5.std()) # 표준 편차 12.028611723719408
print(arr5.var()) # 분산 144.6875
4. Pandas
Pandas란?
R | Python |
통계를 위해 만들어진 언어 | 다양한 용도로 만들어진 언어 |
데이터 분석의 도구가 잘 갖춰짐 | 데이터 분석의 도구가 평범 |
R의 장점을 파이썬으로 옮김
R의 DataFrame을 Python의 pandas로 가져옴.
Numpy Array VS Pandas
• Pandas는 Numpy를 이용해서 만들어짐.
• 데이터 분석 및 정리와 같은 Numpy의 기능들은 Pandas에 기본적으로 있으면서 다른 기능들이 추가됨.
- 외부 데이터 읽고 쓰기
- 정리된 데이터 새로운 파일에 저장
- 데이터 시각화
• Pandas는 표 형식의 데이터를 다루는 것에 능하다.
DataFrame 소개
일반적인 데이터베이스나 엑셀 테이블은 2차원 배열 형태임.
대부분의 데이터셋은 1차원이 아니라 2차원임.
• Pandas의 DataFrame = 2차원 형태의 표 형식의 데이터를 담는 자료형
- 가로 줄 = 열(Column) : 각 데이터의 특징
- 세로 줄 = 행(Row/Index) : 레코드
숫자 인덱스가 아닌 정해준 이름으로도 값을 찾을 수 있음.
문자열, 숫자 등 다양한 데이터를 다룰 수 있음.
DataFrame 사용해보기
DataFrame을 만드는 다양한 방법
'''
pd.DataFrame(list)
pd.DataFrame(array)
pd.DataFrame(list_of_series)
'''
import numpy as np
import pandas as pd
two_dimensional_list = [['dong', 50, 86], ['sin', 89, 31], ['ikj', 68, 91], ['soo', 88, 75]]
two_dimensional_array = np.array(two_dimensional_list)
list_of_series = [
pd.Series(['dongwook', 50, 86]),
pd.Series(['sineui', 89, 31]),
pd.Series(['ikjoong', 68, 91]),
pd.Series(['yoonsoo', 88, 75])
]
# 세 가지 모두 동일함함
df1 = pd.DataFrame(two_dimensional_list)
df2 = pd.DataFrame(two_dimensional_array)
df3 = pd.DataFrame(list_of_series)
print(df1)
'''
dictionary로도 DataFrame 생성 가능
'''
import numpy as np
import pandas as pd
my_list = [
{'name': 'dongwook', 'english_score': 50, 'math_score': 86},
{'name': 'sineui', 'english_score': 89, 'math_score': 31},
{'name': 'ikjoong', 'english_score': 68, 'math_score': 91},
{'name': 'yoonsoo', 'english_score': 88, 'math_score': 75}
]
df = pd.DataFrame(my_list)
print(df)
Pandas의 데이터 타입
dtype | 설명 |
int64 | 정수 |
float64 | 소수 |
object | 텍스트 |
bool | 불린(참과 거짓) |
datetime64 | 날짜와 시간 |
category | 카테고리 |
Pandas로 데이터 읽어들이기
iphone_df = pd.read_csv(r'C:\Users\airyt\Downloads/iphone.csv', encoding='utf-8')
iphone_df
# 헤더가 없는 csv 파일인 경우
iphone_df = pd.read_csv(r'C:\Users\airyt\Downloads/iphone.csv', header=None, encoding='utf-8')
iphone_df
iphone_df = pd.read_csv(r'C:\Users\airyt\Downloads/iphone.csv', encoding='utf-8', index_col=0)
iphone_df
# index_col = 0 ---> 0번째 컬럼을 인덱스(row이름)으로 설정