ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 데이터 사이언스: Seaborn 데이터 시각화 공부하기!(kde, violin, cat, distplot... )
    데이터 사이언스 2020. 7. 28. 13:01

    Seaborn이란?

     

     

    Seaborn library에 대한 설명을 보면 Statistical Data Visualization 이라는 말이 나옵니다. 

     

    이는 통계를 기반으로 데이터를 시각화한다는 것을 의미합니다. 

     

    원래는 파이썬에서 그래프를 그릴 때 사용하는 라이브러리는 matplot인데 

     

    세세하기 만들어줘야 할 것들이 많아서 사용하는게 조금 어렵다고 합니다. 

     

    하지만 이 seaborn 라이브러리를 사용하면 이쁘고 간단하게 원하는 데이터를 시각화할 수 있죠

     

     

     

     

     

    우선 주피터 노트북에 seaborn을 설치해 줍시다. 

     

     

    1. seaborn 설치하기 

     

    pip install seaborn==0.9.0

     

    Requirement already satisfied: seaborn==0.9.0 in c:\users\seungju\anaconda3\lib\site-packages (0.9.0)
    Requirement already satisfied: pandas>=0.15.2 in c:\users\seungju\anaconda3\lib\site-packages (from seaborn==0.9.0) (1.0.1)
    Requirement already satisfied: matplotlib>=1.4.3 in c:\users\seungju\anaconda3\lib\site-packages (from seaborn==0.9.0) (3.1.3)
    Requirement already satisfied: numpy>=1.9.3 in c:\users\seungju\anaconda3\lib\site-packages (from seaborn==0.9.0) (1.18.1)
    Requirement already satisfied: scipy>=0.14.0 in c:\users\seungju\anaconda3\lib\site-packages (from seaborn==0.9.0) (1.4.1)
    Requirement already satisfied: python-dateutil>=2.6.1 in c:\users\seungju\anaconda3\lib\site-packages (from pandas>=0.15.2->seaborn==0.9.0) (2.8.1)
    Requirement already satisfied: pytz>=2017.2 in c:\users\seungju\anaconda3\lib\site-packages (from pandas>=0.15.2->seaborn==0.9.0) (2019.3)
    Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in c:\users\seungju\anaconda3\lib\site-packages (from matplotlib>=1.4.3->seaborn==0.9.0) (2.4.6)
    Requirement already satisfied: cycler>=0.10 in c:\users\seungju\anaconda3\lib\site-packages (from matplotlib>=1.4.3->seaborn==0.9.0) (0.10.0)
    Requirement already satisfied: kiwisolver>=1.0.1 in c:\users\seungju\anaconda3\lib\site-packages (from matplotlib>=1.4.3->seaborn==0.9.0) (1.1.0)
    Requirement already satisfied: six>=1.5 in c:\users\seungju\anaconda3\lib\site-packages (from python-dateutil>=2.6.1->pandas>=0.15.2->seaborn==0.9.0) (1.14.0)
    Requirement already satisfied: setuptools in c:\users\seungju\anaconda3\lib\site-packages (from kiwisolver>=1.0.1->matplotlib>=1.4.3->seaborn==0.9.0) (45.2.0.post20200210)
    Note: you may need to restart the kernel to use updated packages.

     

     

     

     

     

    그리고  1000명의 키, 몸무게 데이터가 있습니다. 

     

    import pandas as pd
    import seaborn as sns 

     

    body_df = pd.read_csv("Downloads/body.csv",index_col = 0)
    body_df

     

     

     

     

     

     

    2. KDEplot 시각화

     

     

    kde는 Kernal Density Estimation을 의미합니다. 

     

    샘플안에 없는 데이터를 추정하여 존재할 구간안에 그 값이 존재할 확률을 나타냅니다.

     

    확률밀도함수라고 생각하시면 됩니다. 

     

    kdeplot은 어떤 구간안의 확률을 나타내기 때문에 

     

    전체구간에 대해서 적분을 해버리면 1이 나와버리죠 

     

     

    sns.kdeplot(body_df["Height"])

     

     

     

     

     

     

    조금더 세분화해서 보고 싶다면 bw를 조정하면서 조절할 수 있습니다. 

     

    sns.kdeplot(body_df["Height"], bw = 0.5)

     

     

     

     

     

     

    3. distplot 데이터시각화 

     

     

    histogram과 kdeplot을 동시에 나타냄으로써 값을 비교할 수 있습니다.

     

    (kdeplot은 측정값뿐만 아니라 예측값들도 섞여 있기 때문에)

     

    sns.distplot(body_df["Height"], bins = 15)

     

     

     

     

     

     

    4. violin plot 데이터 시각화

     

     

    바이올린 플롯은 kde를 옆으로 두개 붙여 놓은 모양입니다. 가오리 같다고 해서 가오리 그래프라고도 한다네요

     

    바이올린 플롯은 여러 그룹들의 분포를 시각화하기 좋고 

     

    밀도를 쉽게 비교할 수 있다는 장점이 있습니다. 

     

    sns.violinplot(y = body_df["Height"])

     

     

     

     

     

     

    5. kde plot 등고선 데이터 시각화

     

     

    1000명의 키와 몸무게의 상관관계를 알아보겠습니다.

     

    body_df.plot(kind = "scatter", x = "Height", y = "Weight")

     

    대체로 키가 크면 몸무게가 큽니다. 그리고 자세히 보면 가운데에 유난히 몰려있는 것 같습니다. 

     

    다른 데이터 시각화 방법으로 봅시다.

     

     

     

     

     

    kdeplot의 두개의 파라미터를 넣어주면 다음과 같이

     

    등고선의 형태로 특이한 데이터가 나옵니다. 

     

    이는 등고선과 원리가 같은데요

     

    선과 선사이의 거리가 멀면 값변화가 완만하고

     

    가깝다면 값변화가 급격합니다.

     

    sns.kdeplot(body_df["Height"], body_df["Weight"])

     

     

     

     

     

     

    키와 몸무게에 대해서 좀 더 자세히 뜯어 봅시다.

     

    sns.kdeplot(body_df["Height"])

     

    키 데이터는 경사가 급격한 반면에 

     

     

     

     

     

    sns.kdeplot(body_df["Weight"])

     

    몸무게 데이터는 경사가 완만한 구간이 있네요

     

     

     

     

     

    6. 회귀선 추가하기 

     

     

    회귀선을 추가할 수도 있습니다.

     

    회귀선을 추가함으로써 데이터에는 없는 값들도 예상할 수 있죠

     

    sns.lmplot(data = body_df, x = "Height", y = "Weight")

     

     

     

     

     

    7. 데이터 시각화 연습

     

     

    한번 노트북에 관한 데이터를 받아 seaborn 데이터 시각화를 해보죠 

     

    laptops_df = pd.read_csv("Downloads/laptops.csv")
    laptops_df

     

     

     

     

     

    바이올린 플롯으로 비교해봅시다.

     

    # 모두 출력형태 같습니다.
    sns.violinplot(x = laptops_df["os"], y = "price")
    sns.violinplot(data = laptops_df, x = "os", y = "price")
    sns.catplot(data = laptops_df, x = "os", y = "price", kind = "violin")
    # catlplot은 카테고리 별로 나눈다는 의미입니다.

     

     

    os에 따른 가격 분포입니다. 

     

    맥의 가격 분포가 리눅스와 윈도우보다 많이 크네요

     

    리눅스 노트북은 대체로 맥이나 윈도우보다 저렴하네요

     

     

     

     

     

    sns.catplot(data = laptops_df, x = "os", y = "price", kind = "box")

     

     

    바이올린 플롯과 유사하게 나옵니다. 하지만 바이올린 플롯으로는 알 수 없었던 이상점까지 확인할 수 있네요.

     

     

     

     

     

    sns.catplot(data = laptops_df, x = "os", y = "price", kind = "strip")

    이번에는 노트북 os 별 가격대 데이터 갯수를 알 수 있네요.

     

    그리고 맥의 가격대 분포가 가장 넓지만 데이터의 갯수가 가장 적은 걸로 보아 정확한 데이터같지 않네요

     

     

     

     

     

    프로세서 브랜드 비율도 확인해보겠습니다.

     

    laptops_df["processor_brand"].unique()

     

    array(['intel', 'amd'], dtype=object)

     

    이렇게 hue를 파라미터로 받으면 프로세서 브랜드를 색깔별로 비교를 할 수 있습니다. 

     

    sns.catplot(data = laptops_df, x = "Height", y = "Weight", kind = "strip", hue = "processor_brand")

     

     

    값이 너무 많으면 중첩돼서 잘 안 보이는데 이때 "swarm"을 파라미터로 받으면 겹치지 않게 값의 분포를 확인할 수 있습니다 

     

    sns.catplot(data = laptops_df, x = "Heihgt", y = "Weight", kind = "swarm", hue = "processor_brand")

     

    반응형

    댓글

Designed by Tistory.