도찐개찐

[데이터시각화] 07. 산점도 본문

PYTHON/데이터분석

[데이터시각화] 07. 산점도

도개진 2023. 1. 2. 12:58
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
import seaborn as sns

산점도 scatter graph

  • n개의 짝으로 이루어진 자료(컬럼이 2개 이상)를
  • x, y 평면에 점으로 나타낸 그래프
  • 자료의 분포정도를 파악하는데 사용
  • 주로 상관/회귀분석에 사용
  • scatter(x축, y축, 옵션)
# 약물 투여에 따른 환자 반응
age = [23, 30, 40, 45, 60]
drugA = [16, 20,  27, 40, 60]
drugB = [15, 18, 25, 31, 40]
plt.scatter(age, drugA, color='b')
plt.show()

회귀계수를 이용한 예측선 그리기

  • polyfit(x축, y축, 다항수차수) -> 기울기, 절편
# A약물 투여 예측 : y = ax + b
a, b = np.polyfit(age, drugA, 1).round(2)
a, b
(1.22, -15.77)
# 예측선 시각화
plt.scatter(age, drugA, color='red')
x = np.arange(20, 65, 1) # range 함수와 다른건 간격조정 가능
y = a * x + b
plt.plot(x, y, 'b')
[<matplotlib.lines.Line2D at 0x7f277df392b0>]

a, b = np.polyfit(age, drugB, 1).round(2)
plt.scatter(age, drugB, color='red')
x = np.arange(20, 65, 1)
y = a * y + b
plt.plot(x, y, 'b')
[<matplotlib.lines.Line2D at 0x7f277de52bb0>]

seaborn으로 산점도/회귀선 시각화

  • Implot(x, y, data, ci여부)
drugs = pd.DataFrame({'age':age, 'drugA': drugA})
sns.lmplot(x='age', y='drugA', data=drugs, ci=None, line_kws={'color':'red'})
plt.show()

# sns.i
# sns.Implot(x = 'a', y='drugA')

신생아 월별 몸무게 추이

age = [1,3,5,2,11,9,3,9,12,3]
weight = [4.4,5.3,7.2,5.2,8.5,7.3,6.0,10.4,10.2,6.1]
plt.scatter(age, weight, color='b')
a, b = np.polyfit(age, weight, 1)
x = np.arange(0, 15, 1)
y = a * x + b
plt.plot(x, y, 'red')
[<matplotlib.lines.Line2D at 0x7f277ccb9310>]

tips 총지불금액별 팁금액에 대한 관계 알아보기

tips = sns.load_dataset('tips')
tips.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 244 entries, 0 to 243
Data columns (total 7 columns):
 #   Column      Non-Null Count  Dtype   
---  ------      --------------  -----   
 0   total_bill  244 non-null    float64 
 1   tip         244 non-null    float64 
 2   sex         244 non-null    category
 3   smoker      244 non-null    category
 4   day         244 non-null    category
 5   time        244 non-null    category
 6   size        244 non-null    int64   
dtypes: category(4), float64(2), int64(1)
memory usage: 7.4 KB
plt.scatter(tips.total_bill, tips.tip, color='red')
a, b = np.polyfit(tips.total_bill, tips.tip, 1)
x = np.arange(0, 55, 1)
y = a * x + b
plt.plot(x, y, 'b')
plt.show()

다이아몬드 캐럿당 가격에 대한 시각화

diamonds = sns.load_dataset('diamonds')
diamonds.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 53940 entries, 0 to 53939
Data columns (total 10 columns):
 #   Column   Non-Null Count  Dtype   
---  ------   --------------  -----   
 0   carat    53940 non-null  float64 
 1   cut      53940 non-null  category
 2   color    53940 non-null  category
 3   clarity  53940 non-null  category
 4   depth    53940 non-null  float64 
 5   table    53940 non-null  float64 
 6   price    53940 non-null  int64   
 7   x        53940 non-null  float64 
 8   y        53940 non-null  float64 
 9   z        53940 non-null  float64 
dtypes: category(3), float64(6), int64(1)
memory usage: 3.0 MB
# list(map(float, diamonds.price))
# df1 = df.astype({'col1':'int32'})
diamonds = diamonds.astype({'price':'float64'})#.astype({'col1':'float64'})
df = pd.DataFrame(diamonds)
df
# print(diamonds.price)
plt.scatter(x=df.carat, y=df.price, color='red')
a, b = np.polyfit(df.carat, df.price, 1)
x = np.arange(0, 5, 1)
y = a * x + b
plt.plot(x, y, 'b')
plt.show()

Depth 에 따ㄴ 가격 비교

sns.scatterplot(data=diamonds, x='depth', y='price')
<AxesSubplot:xlabel='depth', ylabel='price'>

윗면 table에 따른 가격비교

sns.scatterplot(data=diamonds, x='table', y='price')
<AxesSubplot:xlabel='table', ylabel='price'>

다변량 분석

  • 여러 현상이나 사건에 대한 측정치를 개별적으로 분석하지 않고 한번에 동시에 분석하는 기법
  • 2차원 데이터를 이용해서 먼저 시각화한 뒤 새로운 변수를 기준으로 색상을 표현함으로써 새로운 차원을 통한 분석 가능
  • 범주형 데이터에 다변량 분석시에는 qualitative palette에 따른 색상을 사용하는 것이 좋음
  • 정량적 데이터에 다변량 분석시에는 sequential palette에 따른 색상을 사용하는 것이 좋음
  • 칼라맵 : https://matplotlib.org/stable/tutorials/colors/colormaps.html

성별 기준 총지불금액별 팁에 대한 관계 시각화

# seaborn에서는 hue라는 속성을 이용해 다변량 분석이 가능 하다
# scatterplot(data, x, y, hue)
sns.scatterplot(data=tips, x='total_bill', y='tip', hue='sex')
plt.show()

sns.scatterplot(data=tips, x='total_bill', y='tip', hue='smoker')
plt.show()

sns.scatterplot(data=tips, x='total_bill', y='tip', hue='day')
plt.show()

sns.scatterplot(data=tips, x='total_bill', y='tip', hue='time')
plt.show()


sns.scatterplot(data=tips, x='total_bill', y='tip', hue='size', palette='Paired')

plt.show()

다이아몬드 캐럿당 가격에 대한 다변량 분석

diamonds.info()
sns.scatterplot(data=diamonds, x='carat', y='price', hue='cut', palette='Paired')
plt.show()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 53940 entries, 0 to 53939
Data columns (total 10 columns):
 #   Column   Non-Null Count  Dtype   
---  ------   --------------  -----   
 0   carat    53940 non-null  float64 
 1   cut      53940 non-null  category
 2   color    53940 non-null  category
 3   clarity  53940 non-null  category
 4   depth    53940 non-null  float64 
 5   table    53940 non-null  float64 
 6   price    53940 non-null  float64 
 7   x        53940 non-null  float64 
 8   y        53940 non-null  float64 
 9   z        53940 non-null  float64 
dtypes: category(3), float64(7)
memory usage: 3.0 MB

diamonds.info()
sns.scatterplot(data=diamonds, x='carat', y='price', hue='clarity', palette='Paired')
plt.show()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 53940 entries, 0 to 53939
Data columns (total 10 columns):
 #   Column   Non-Null Count  Dtype   
---  ------   --------------  -----   
 0   carat    53940 non-null  float64 
 1   cut      53940 non-null  category
 2   color    53940 non-null  category
 3   clarity  53940 non-null  category
 4   depth    53940 non-null  float64 
 5   table    53940 non-null  float64 
 6   price    53940 non-null  float64 
 7   x        53940 non-null  float64 
 8   y        53940 non-null  float64 
 9   z        53940 non-null  float64 
dtypes: category(3), float64(7)
memory usage: 3.0 MB

타이타닉 승객 생존에 대한 다변량 분석

titanic = sns.load_dataset('titanic')
titanic.info()
titanic.head()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 15 columns):
 #   Column       Non-Null Count  Dtype   
---  ------       --------------  -----   
 0   survived     891 non-null    int64   
 1   pclass       891 non-null    int64   
 2   sex          891 non-null    object  
 3   age          714 non-null    float64 
 4   sibsp        891 non-null    int64   
 5   parch        891 non-null    int64   
 6   fare         891 non-null    float64 
 7   embarked     889 non-null    object  
 8   class        891 non-null    category
 9   who          891 non-null    object  
 10  adult_male   891 non-null    bool    
 11  deck         203 non-null    category
 12  embark_town  889 non-null    object  
 13  alive        891 non-null    object  
 14  alone        891 non-null    bool    
dtypes: bool(2), category(2), float64(2), int64(4), object(5)
memory usage: 80.7+ KB
  survived pclass sex age sibsp parch fare embarked class who adult_male deck embark_town alive alone
0 0 3 male 22.0 1 0 7.2500 S Third man True NaN Southampton no False
1 1 1 female 38.0 1 0 71.2833 C First woman False C Cherbourg yes False
2 1 3 female 26.0 0 0 7.9250 S Third woman False NaN Southampton yes True
3 1 1 female 35.0 1 0 53.1000 S First woman False C Southampton yes False
4 0 3 male 35.0 0 0 8.0500 S Third man True NaN Southampton no True
sns.scatterplot(data=titanic, x='age', y='fare', hue='pclass')
<AxesSubplot:xlabel='age', ylabel='fare'>

sns.scatterplot(data=titanic, x='age', y='survived', hue='sex')
<AxesSubplot:xlabel='age', ylabel='survived'>

matplotlib 으로 다변량 분석 그래프 시각화

  • 분석대상 컬럼은 반드시 숫자여야함
  • 색상 지정시 color속성이 아닌 c속성을 이용
plt.scatter(titanic.age, titanic.survived)
<matplotlib.collections.PathCollection at 0x7f277aca4160>

728x90
Comments