코드잇 Codeit/Python / ML / DL

[코드잇] 데이터 사이언스 기초 - 데이터 사이언스 시작하기

꼽파 2023. 9. 2. 22:33


  • 1. 데이터 사이언스란?

  • 2. Jupyter Notebook

  • 3. Numpy

  • 4. Pandas

  • 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 사용 가능한 온라인 서비스

    https://dillinger.io/

     

    Online Markdown Editor - Dillinger, the Last Markdown Editor ever.

    Make something great today!

    dillinger.io

    https://stackedit.io/app

     

    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의 헤더 줄이 첫번째로 바로 들어감

    # 헤더가 없는 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이름)으로 설정

    728x90