공부zip./데이터사이언스

[패스트캠퍼스 국비지원교육 개발노트] 데이터분석 인강_week 3.1

혜이블 2022. 3. 17. 01:03

3주 차 강의.

3주차도 렛츠기릿 :)

3주 차에는 Pandas와 Seaborn을 배웠고, 이를 이용하여 다양한 문제들을 풀어보고,
직접 데이터를 분석해보는 시간을 가졌다.

잘 이해하고 있는 것인지 모르겠지만, 어찌어찌 수업을 듣다 보니 벌써 반 이상 했다네~! 

3주차 챕터!

목차. 

더보기
  1. pandas란?
    • pandas가 왜 좋은지, 왜 써야하는지
  2. pandas의 기본 자료구조(Series, DataFrame)
    • pandas 라이브러리 불러오기
    • 함수들
      • pd.Series([ ])
      • pd.date_range( )
      • pd.DataFrame( )
  3. DataFrame 기초 method
    • head( )
    • tail( )
    • df.index
    • df.coloumns, df.values
    • df.info( )
    • df.describe( )
    • df.sort_values(by='B', ascending=False)
  4. DataFrame Indexing
    • 'df.loc' slicing
    • 'df.iloc' slicing
    • fancy indexing
    • column 하나 추가하기
  5. 외부 데이터 읽고 쓰기
    • Iris 데이터 셋
  6. Seaborn이란
    • Histplot
    • Displot
    • Barplot
    • Countplot
    • Boxplot
    • Violinplot
    • Lineplot
    • Pointplot
    • Scatterplot
    • Pariplot
    • Heatmap

3주 차 후기.

 

1. pandas란 : 

     # pandas가 왜 좋은지, 왜 써야 하는지 : 

        ㅇ "python data analysis"의 약자
        ㅇ 정형 데이터 처리에 특화되어 있다
        ㅇ 다양한 머신러닝 라이브러리들에 의존성을 가지고 있다 (e.g. scikit-learn, scipy, statsmodel...)
        ㅇ python에서 excel의 기능을 사용할 수 있게 됨
           BUT : pandas는 numpy array를 베이스로 지원하며 파이썬과 함께 강력한 시너지를 내기 때문에,
                  = 엑셀 그 이상의 퍼포먼스를 냄!
        ㅇ 고성능 데이터 처리에 적합하다.

        ㅇ Pandas 라이브러리에서 기본적으로 데이터를 다루는 단위 = DataFrame 
            (흔히 알고 있는 spreadsheet와 같은 개념)
            ㄴ 이러한 형태의 데이터 : 'Structured Data' / 'Panel Data' / 'Tabular Data'라 부름

        ㅇ pandas를 공부한다는 것 = 'dataframe의 사용법을 익히고 활용하는 방법을 배운다'는 것
        ㅇ pandas를 잘 활용하면 : 대부분의 structured data를 자유자재로 다룰 수 있게 됨


2. pandas의 기본 자료구조(Series, DataFrame) : 

     # pandas 라이브러리 불러오기

        ㅇ pandas → pd 

pandas, numpy 같이 import하면 됨

        ㅇ DataFrame : 2차원 테이블
        ㅇ Series : DataFrame 테이블의 한 줄(행/열)
                      ㄴ Series의 모임 = DataFrame

     # 함수들
        ㅇ pd.Series([ ]) 함수 (대문자 조심) : 자동으로 세로로 출력해줌

pandas Series type은 자동으로 세로로 출력이 된다!

        ㅇ pd.date_range( ) 함수 : 날짜 정보를 쉽게 생성해주는 객체도 제공

pandas에는 다양한 데이터타입이 있다.

        ㅇ 위 데이터로 6x4 행렬에 -1~1 사이의 랜덤 숫자의 원소를 가지고 테이블 만들기 : 
            pd.DataFrame( )
            index(행) : dates
            columns(열) : A~D

6x4 행렬의 DataFrame


3. DataFrame 기초 method :

        ㅇ head( ) 함수 : 맨 위 5줄을 보여주는 함수 / 안에 숫자를 넣으면 그만큼 보여줌

head( )

        ㅇ tail( ) 함수 : 맨 아래에서 5줄

tail( )

        ㅇ df.index 함수 : 어떤 데이터를 받았는데 그 전체 인덱스가 궁금할 때/확인하고 싶을 때

df.index

        ㅇ df.columns, df.values 함수 : 

DataFrame value들 확인하는 다양한 방법

        ㅇ df.info( ) 함수 : index, columns, null/not-null/dtype/memory usage 표시

df.info( )

            ㄴ non-null count = 비어있지 않은 셀 개수
            ㄴ Dtype은 모두 동일 (homogeneous) 

        ㅇ df.describe( ) : 기조적인 통계정보를 보여준다!

df.describe( )

        ㅇ df.sort_values(by='B', ascending=False) : column B를 기준으로 내림차순 정렬

column B 기준 내림차순 정렬
그 중 제일 위 3줄만 보여줘 (추가)


4. DataFrame Indexing : 

     # Indexing = 데이터에서 어떤 특정 조건을 만족하는 원소를 찾는 방법
        전체 DataFrame에서 조건에 만족하는 데이터쉽게 찾아서 조작할 때 유용하게 사용할 수 있음
        [key - value] → [괄호!]

        ㅇ DataFrame에 바로 indexing 하면 : 'column 이름'을 이용하여 찾음
            == dictionary의 indexing과 같음 == "key" indexing == "column"(key값)

DataFrame에 바로 indexing

     # 'df.loc' slicing 

        ㅇ df.loc['날짜'] 함수 : 특정 날짜를 통한 indexing (index를 찾고 싶거나, 이름을 알고 있을 때)
        ㅇ df.iloc[ 2 ] 함수 : 특정 위치를 통한 indexing (위에서 3번째 row를 찾고 싶다)

df.loc[ ]  /  df.iloc[ ]

        ㅇ DataFrame에서 slicing : 항상 row 단위로 잘림
            앞에서 3줄 slicing : df[:3]
            index value를 기준으로 slicing : df['2022-01-02':'2022-01-04']

같은 결과, 다른 경로

        ㅇ df.loc의 2차원 indexing
            df.loc[:, ['A', 'B', 'D']] : 모든 row에 대해columns는 A, B, D만 가져오라는 의미

        ㅇ df.loc['2022-01-03' : '2022-01-05', ['A', 'C']] : slicing을 통해 특정 row 중, columns는 A, C만 

        ㅇ df.loc['2022-01-02', ['A', 'C']] : 특정 row 한 줄만 slicing (테이블 모양 아님 주의)

        ㅇ df.loc['2022-01-03', 'C'] : 특정 row에 특정 column 값

     # 'df.iloc' slicing 

        df.iloc[ # ] : 정수를 이용한 indexing과 같다
            row 기준 3 = 4번째

        df.iloc[3:5, 0:2] : row기준 3, 4 + column기준 0, 1 slicing

숫자 은근 헷갈릴 수 있음..!

        ㅇ df.iloc[[1,2,4], [0,3]] : slicing이 아닌 직접 리스트 형태로 기재하는 indexing

숫자는 +1 해주면 실제 위치임

        ㅇ 뒤가 ' : ' 일 때 비교해보기


     # pandas는 fancy indexing을 지원(사실 numpy에서 지원하기 때문에 pandas도 지원함)
     # fancy indexing : 조건문을 통해 indexing을 할 수 있는 방법으로
                            True와 False를 원소로 하는 리스트를 통해 masking 함

        ㅇ df.A > 0 : column A에 있는 원소들 중에 0보다 큰 데이터를 가져오기 :
        df[df.A > 0] -- DataFrame 입력

비교

            ㄴ NaN = 조건에 맞지 않을 때 나옴

        chain indexing : indexing의 앞에서부터 뒤로 쭉 순서대로 적용

chain indexing

     # column 하나 추가하기 :

pandas에서 column 하나 추가!

        df.isin 함수 : 해당 value들이 들어있는 row에 대해 True를 가지는 Series를 리턴

indexing까지


5. 외부 데이터 읽고 쓰기 :

     # Iris 데이터 셋 = 머신러닝/통계학에서 유명함
        ㄴ 붓꽃
        ㄴ 3 가지 종류를 구분해서 사용 가능한 데이터 셋
        → pandas의 기능을 사용하여, 실제로 학습이 가능한 형태로 데이터를 정제하는 연습

        1. Iris.csv 파일 불러오기 : 

/ 대신 \\으로 구분

        2. data.info( ) 함수를 통해서 Dtype 확인 : 
            ㄴ [복습] column별로 동일한 Dtype이어야 하는데
                해당 column에 하나라도 string이 있으면 Dtype = object로 표시함

object 발견
Species column이 숫자가 아니기 때문

        3. 위 Species column(Dtype = object)을 뽑아서 숫자로 바꾸기 : 
            ㄴ 이 column이 어떻게 구성되어있는지 확인하기 위함.
            data["Species"]를 치면 수많은 데이터일 때는 '...'으로 표기가 되어 다 안 나옴.
            → set(data["Species"]) 함수 사용

(1) 3 종류의 Iris 발견

           > 숫자로 바꿀 계획 :
                Iris-setosa → 0
                Iris-versicolor → 1
                Iris-virginica → 2

정상적으로 변경!
0, 1, 2로 종류이름 바뀜!

        4. 데이터 지정 이름.to_csv(" ") : 새로 저장하기


        1. kaggle_survey_2020_responses.csv 파일 불러오기 : (방법 똑같음)

Q4 !

        2. 박사학위 소지자들만 고르기 : 
            data2[data2["Q4"] == "Doctoral degree"]
            ㄴ data2 테이블 안에 > Q4열에서 > "Doctoral degree"만 출력해줘

        3. 박사학위면서 + 대한민국 국적을 가진 사람들 고르기 :  
            data2[(data2["Q4"] == "Doctoral degree") & (data2["Q3"].isin(["Republic of Korea", "South Korea"]))]


6. Seaborn이란 : 
    = statistical data visualization
    ㄴ matplotlib을 기본으로 다양한 시각화 기법을 제공하는 라이브러리
    ㄴ 시각화 라이브러리 중에서 powerful 함 = 예쁨, 쉽게 정보를 잘 확인할 수 있음
    ㄴ pandas DataFrame과 호환이 매우 잘 됨
        e.g. sns.xxxplot(data=df) ← 기본 세팅!
    ㄴ plot 만들 때 x, y 꼭 다 쓸 필요는 없고, 비워두면 자동으로 채워줌

Seaborn 공식 홈페이지 : https://seaborn.pydata.org/ 

 

seaborn: statistical data visualization — seaborn 0.11.2 documentation

Seaborn is a Python data visualization library based on matplotlib. It provides a high-level interface for drawing attractive and informative statistical graphics. For a brief introduction to the ideas behind the library, you can read the introductory note

seaborn.pydata.org

     ㄴ 'Gallery' 페이지 애용하기!

     # 라이브러리 & 데이터를 불러오고, 시각화를 위한 세팅 :

핑크박스

     # Histplot : 
        = 가장 기본적으로 사용되는 히스토그램을 출력하는 plot.
        = 전체 데이터를 특정 구간별 정보를 확인할 때 사용

        sns.histplot(data=penguins, x="flipper_length_mm", hue="species")

(1) 겹쳐서 나타남

        sns.histplot(data=penguins, x="flipper_length_mm", hue="species", multiple='stack')

(2) stack - 쌓여서 나타내기

     # Displot : 
        = distribution들을 여러 subplot들로 나눠서 출력해줌
        = displot에 kind를 변경하는 것으로, histplot, kdeplot, ecdfplot 모두 출력 가능
            e.g. displot(kind="hist")

        sns.displot(data=penguins, x='flipper_length_mm', hue='species')

histplot이랑 똑같,,,?

        sns.displot(data=penguins, x='flipper_length_mm', hue='species', col='species')

     # Barplot : 
        = 어떤 데이터에 대한 값의 크기를 막대로 보여줌 (a.k.a. 막대그래프)
        = 가로 / 세로 두 가지로 모두 출력 가능
        = 히스토그램과는 다름!

        sns.barplot(data=penguins, x='flipper_length_mm', y='species', hue='species')

가로로

        sns.barplot(data=penguins, y='flipper_length_mm', x='species', hue='species')

세로로

     # Countplot : 
        = 범주형 속성을 가지는 데이터들의 histogram을 보여줌
        = 종류별 count를 보여주는 방법

        sns.countplot(data=penguins, x='species')

        sns.countplot(data=penguins, x='species', hue='sex')

species의 hue(색상)를 sex(성별)로 구분지어라

     # Boxplot : 
        = 데이터의 각 종류별로 사분위 수(quantile)를 표시
        = 데이터의 전체적인 분포를 확인하기 좋은 시각화 기법
        = box와 전체 range의 그림을 통해 outlier를 찾기 쉬움(IQR : Inter-Quantile Range)

        sns.boxplot(data=penguins, x='flipper_length_mm', y='species', hue='species')

               ㄴ 박스 가운데 선 = average
               ㄴ 전체 중 50%가 박스로 색칠됨
               ㄴ ◆ = outlier(s)
               ㄴ 중심에 얼마나 모여있느냐를 보기 쉬움

        sns.boxplot(data=penguins, x='flipper_length_mm', y='species', hue='sex')

     # Violinplot : 
        = 데이터에 대한 분포 자체를 보여줌
        = boxplot과 비슷하지만, 전체 분포에 대한 그림을 보여준다는 점에서 boxplot과 다름
        = 보통 boxplot과 함께 표시하면 :
            - 평균 근처에 데이터가 얼마나 있는지(boxplot)
            - 전체적으로 어떻게 퍼져있는지(violinplot) 모두 확인이 가능

violinplot은 세로로 보는거 추천 (y, x)

     # Lineplot : 
        = 특정 데이터를 x, y로 표시하여 관계를 확인할 수 있음(선 그래프)
        = 수치형 지표들 간의 경향을 파악할 때 많이 사용합니다.

        sns.lineplot(data=penguins, x='body_mass_g', y='flipper_length_mm', hue='species')

     # Pointplot : 
        = 특정 수치 데이터를 error bar와 함께 출력해줌
        = 수치 데이터를 다양한 각도에서 한 번에 바라보고 싶을 때 사용합니다.
        = 데이터와 error bar를 한 번에 찍어주기 때문에, 살펴보고 싶은 특정 지표들만 사용하는 것이 좋음

        sns.pointplot(data=penguins, y='flipper_length_mm', x='sex', hue='species')

     # Scatterplot : 
        = lineplot과 비슷하게 x, y에 대한 전체적인 분포를 확인함 (산포도)
        = lineplot은 경향성에 초점을 둔다면,
           scatterplot은 데이터 그 자체가 퍼져있는 모양에 중점을 둠

        sns.scatterplot(data=penguins, x='bill_length_mm', y='bill_depth_mm', hue='sex')

부리의 길이 & 깊이의 성별 차이에 따른 분포

     # Pairplot : 
        = 주어진 데이터의 각 feature들 사이의 관계를 표시
        = scatterplot, FacetGrid, kdeplot을 이용하여 feature 간의 관계를 잘 보여줌
        각 feature에 대해 계산된 모든 결과를 보여주기 때문에, feature가 많은 경우 사용하기 적합하지 않음

        sns.pairplot(data=penguins, hue='species')   → hue만 지정하면 됨

     # Heatmap : 
        = 정사각형 그림에 데이터에 대한 정도 차이를 색 차이로 보여줌
        = 열화상 카메라로 사물을 찍은 것처럼 정보의 차이를 보여줌
        = pairplot과 비슷하게 feature 간 관계를 시각화할 때 많이 사용

        ㅇ 각 feature간 상관관계를 파악하기 위해 Correlation matrix를 만듦
            데이터 이름.corr( )

기존 데이터에 글씨가 있어서(pink boxes) correlation해도 처리가 안됨..

         글자로 된 애들을 먼저(아까 한 것처럼) 0, 1, 2로 바꿔주고 작업하면 되긴 하지만
            일단 그냥 위에 4개의 데이터로 진행 : 

         그래프 오른쪽 : 컬러바 = 정보차이를 알려줌 
            검정으로 갈수록 음의 상관관계(-1에 가까워진다는 뜻), vice versa


3주 차 후기. 

Iris는 오래된 내 영어 이름인데(거의 내 분신) 이렇게 파이썬 공부하다가 만나니까
느낌이 색다르고 괜한 친근감이 느껴진다ㅎㅎ🌸

이번 주는 pandas와 Seaborn을 메인으로 배워봤고, 또 직접 시중에 있는 데이터를 가져와서
분석을 해볼 수 있는 기회가 주어져서 신기하고 재밌었다.
(느슨했던 마인드가 다시 잡힌 느낌!)

내가 이 패캠 수강하기 전에 목표가 '데이터 분석에 자신감이 생기는 것'이었는데 
조만간 이 목표를 달성했으면 좋겠다 :)

파이팅! ⭐

 

print("to be continued...")