Machine Learning/[Kaggle Course] Data Visualization

[Kaggle Course] Scatter Plots

WakaraNai 2020. 11. 15. 11:02
728x90
반응형

이번엔  보험료에 관한 dataset에 대해서 보려 합니다. 

이 데이터를 이해하기 위해선 왜 몇몇 소비자들은 좀 더 지불하고 다른 이들은 그렇지 않은 지 알아야겠지요.

일단 dataset은 여기에. www.kaggle.com/mirichoi0218/insurance/home 

 

Medical Cost Personal Datasets

Insurance Forecast by using Linear Regression

www.kaggle.com

 

 

Scatter plots

  • sns.scatterplot
    • x=data['column_name'] : 가로축
    • y=data['column_name'] : 세로축
sns.scatterplot(x=insurance_data['bmi'], y=insurance_data['charges'])

위의 도표는 BMI(body mass index)와 보험료 사이에 긍정적인 상관관계가 있음을 보여줍니다.

높은 BMI 지수를 가진, (만성질병에 걸린 확률이 높은) 고객은 보험료를 더 내려고 하죠.

이 관계를 한 번 더 확인해보기 위에 regression line을 추가해봅시다.

sns.regplot(x=insurance_data['bmi'], y=insurance_data['charges'])

 

 

 

Color-coded scatter plots _ sns.scatterplot( ~, hue=data[])

scatter plot에 색깔도 추가하면 "3개"의 변수의 관계도 알아낼 수 있습니다. 그게 바로 color-coding이죠.

예로 흡연은 BMI와 보험료 관계에 영향을 줍니다. 'smoker'를 색칠하고

이전처럼 나머지 두 column('bmi', 'charges') 가로, 세로축으로 설정해줍시다.

sns.scatterplot(x=insurance_data['bmi'], y=insurance_data['charges'], hue=insurance_data['smoker'])

위의 그래프는 BMI지수가 높은 비흡연자는 조금만 더 보험료를 내려하지만, 흡연자의 경우 "무척 많이" 지불하네요.

이 사실을 통해 "sns.lmplot"을 이용하여 두 개의 regression line(흡연자와 비흡연자)을 그어봅시다.

(비흡연자에 비해 흡연자의 regression line은 무척 가파를 것임을 예측할 수 있겠죠?)

 

 

 

 

Color-coded scatter plots with "Regression line" _ sns.lmplot( x,y,hue,data)

sns.lmplot(x="bmi", y="charges", hue="smoker", data=insurance_data)

sns.lmplot 

x와 y의 상관관계에서 hue 값이 2개의 값만 가지게 된다면,

그 안의 값이 yes(smoker) or no(nonsmoker) 일 때 각각에 대해서 regression line을 그린다.

  • x='column_name' : 가로축
  • y='column_name' : 세로축
  • hue='column_name' : 새로운 상관관계에 두고 싶은 변수
  • data=data : 그래프를 그리는데 사용할 데이터

 

 

Categorical Scatter plot _ sns.swarmplot(x=data[], y=data[])

그래프 하나만 더 배워봅시다.

scatter plot은 연속적인(continuous) 두 변수 사이의 상관관계를 뚜렷하게 보여주기 위해서 사용 됩니다.

그러나 categorical 변수 (like 'smoker')를 feature로 잡고, scatter plot의 중심 축에 적용하려 합니다.

이를 'categorical scatter plot' 이라고 부르며 sns.swarmplot을 사용합니다.

sns.swarmplot(x=insurance_data['smoker'], y=insurance_data['charges'])

차트를 보시면, 평균적으로 비흡연자는 보험료를 적게 내며, 흡연자는 보험료를 많이 지불하네요

 

 

 

 


Exercise

 

Scenario

당신은 사탕 제조 회사의 주요 임원입니다. 당신의 목표는 신제품에 대한 보고서 작성입니다.

보고서 작성을 시작한 직후, 재밌는 설문조사의 결과와 함께 흥미로운 dataset을 우연히 발견했습니다.

CrowdSource가 좋아하는 사탕을 우연히 찾게 된 거죠.

 

fivethirtyeight.com/videos/the-ultimate-halloween-candy-power-ranking/

 

The Ultimate Halloween Candy Power Ranking

Video by Christine Laskowski, Tony Chow and Emily Scherer The social contract of Halloween is simple: Provide adequate treats to costumed masses, or be prepared…

fivethirtyeight.com

 

Setup

import pandas as pd
pd.plotting.register_matplotlib_converters()
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
print("Setup Complete")

# Set up code checking
import os
if not os.path.exists("../input/candy.csv"):
    os.symlink("../input/data-for-datavis/candy.csv", "../input/candy.csv") 
from learntools.core import binder
binder.bind(globals())
from learntools.data_viz_to_coder.ex4 import *
print("Setup Complete")

 

1. Load the data + Review the data

candy_data에 "id"column을 indexing column으로 두고 생성해봅시다.

# Path of the file to read
candy_filepath = "../input/candy.csv"

# Fill in the line below to read the file into a variable candy_data
candy_data = pd.read_csv(candy_filepath, index_col="id")

# Print the first five rows of the data
candy_data.head()

 

위의 dataset은 83개의 가로줄이 있으며 이는 각각의 다른 캔디바와 일치합니다.

column은 13개가 있습니다

  • 'competitorname' : 캔디바의 이름
  • 'sugarpercent' : 설탕 함유량. 높을 수록 설탕이 많이 함유되었음을 의미함
  • 'pricepercent' : 다른 캔디와 비교하여 단위당 가격을 보여줌. 
  • 'winpercent' : 설문조사 결과. 높을 수록, 응답자들에게 더 유명한 사탕이란 의미.
  • 그 외의 9개의 column들은, (from 'chocolate' to 'pluribus')는 candy를 의미함. 예로 chocolate candies를 가진 rows는 'chocolate' column에 "Yes"라는 대답이 들어갑니다. (초코가 없는 사탕은 'chocolate' column에 "No"라는 대답

 

 

2. Role of Sugar

왜 사람들은 설탕함유량이 높은 사탕을 선호할까요?

 

Part A

'sugarpercent'(x축)과 'winpercent'(y축)의 관계를 regression line 없이 scatter plot으로 만들어봅시다.

# Scatter plot showing the relationship between 'sugarpercent' and 'winpercent'
sns.scatterplot(x=candy_data['sugarpercent'], y=candy_data['winpercent']) # Your code here

 

 

Part B

두 변수 사이에서 강한 상관관계가 느껴지시나요?

그렇다면 설탕함유량이 높고 낮을 때 설문 응답자분들의 인지도는 어떤가요?

>>>위의 scatter plot으로 두 변수 간 뚜렷한 관계는 없음으로 판정됩니다.

이 결과로 설탕함유량이 사탕 인지도와 직결되지 않음을 알게되었습니다.

 

 

 

3. Take a closer look

Part A

2번의 scatterplot에 regression line을 추가해봅시다.

# Scatter plot w/ regression line showing the relationship between 'sugarpercent' and 'winpercent'
sns.regplot(x=candy_data['sugarpercent'], y=candy_data['winpercent']) # Your code here

 

Part B

선을 그리고 나니 두 변수 사이의 약한 상관관계가 보이네요.

설탕함유량이 높을 수록 조금 더 유명한 사탕이라고요.

 

 

4. Chocolate!

아래 박스는 'pricepercent'(x축)과 'winpercent(y축)' 사이 관계를 scatter plot으로 보여주는 코드입니다.

'chocolate' column으로 color-code로 점을 찍어봅시다.

아직 regression line은 추가하지 마세요. 다음 차례에 할 거예요!

# Scatter plot showing the relationship between 'pricepercent', 'winpercent', and 'chocolate'
sns.scatterplot(x=candy_data['pricepercent'], y=candy_data['winpercent'], hue=candy_data['chocolate'])

흥미로운 패턴이 보이나요? regression line을 추가하여 좀 더 조사해봅시다.

 

 

 

5. Investigate Chocolate

Part A

4번 그래프에 '2개'의 regression line을 추가해보세요. 

하나는 chocolate candies에, 다른 하나는 without chocolate 사탕에 대해서.

# Color-coded scatter plot w/ regression lines
sns.lmplot(x="pricepercent", y="winpercent", hue="chocolate", data=candy_data)

 

Part B

선을 그리고 나니, chocolate과 가격이 사탕 인지도에 어떤 결과를 미치나요?

가격이 높고 초코함유량이 높을 수록 사탕 인지도 또한 올라간다는 점을 알 수 있습니다.

Since this ilne has a slightly positive slope, 

마찬가지로 초코렛이 함유되어있지 않을 땐 negative slope가 되기에,

chocolate을 함유하지 않을 때, 인지도를 높이려면, 가격을 낮추는 수밖에 없음을 알게 되었습니다.

한 가지 더.

이 data set은 매우 작습니다. 그러니 이 패턴들에 대해 무한한 신뢰를 가지면 안됩니다!

좀 더 자신감을 갖고 결과를 보려면 더 많은 사탕을 dataset에 추가해야 합니다.

 

 

 

6. Everybody loves chocolate

 

Part A

'chocolate'(x축)과 'winpercent'(y축) 사이 관계를 강조하는 categorical scatterplot을 그려봅시다.

# Scatter plot showing the relationship between 'chocolate' and 'winpercent'
sns.swarmplot(x=candy_data['chocolate'],y=candy_data['winpercent'])# Your code here

Part B

위의 차트까지 보고나니 초코렛이 함유되면 사탕 인지도 또한 올라간다는 쪽으로 의견이 기울어졌습니다.

이 의견을 다른 이들에게도 말해주려면 5번과 6번 중 어느 plot을 보여주어야 할까요?

>>> 이 경우에는, 6번 categorical scatter plot을 보여주는 것이 더 적합합니다. 두 그래프 모두 같은 의견을 표명해줄 수 있지만, 5번 그래프는 설문조사 결과도 들어있어 주요 핵심을 모호하게 할 수 있으니까요.

728x90
반응형