without haste but without rest

03. Visualization with Seabron 본문

Homework/DataMining

03. Visualization with Seabron

JinungKim 2020. 4. 14. 12:08

0. 개요

-박스 플롯 - 분산 확인
-바이올린 플롯 - 분산 확인 + 분포 확인

-스캐터 플롯 - 변수들 간의 상관관계
-페어 플롯 - 변수들 간의 상관관계
-히트맵 - 변수들 간의 상관관계

-조인트 플롯 -  스캐터 + 러그

-스왐 플롯 - 분류 문제
-스트립 플롯 - 분류 문제

 

 


1. 데이터 로드

""" Exploring """
import pandas as pd

# load iris
iris = pd.read_csv("iris.csv")
iris.head()

print(iris.columns)
print(iris)

컬럼 네임들이 짤려서 나온다. 

 

 

 

 


# 컬럼 이름 변경하기
iris.rename(columns = {iris.columns[0] : 'Sepal.Length',  
                       iris.columns[1] : 'Sepal.Width',
                       iris.columns[2] : 'Petal.Length',
                       iris.columns[3] : 'Petal.Width',
                       iris.columns[4] : 'Species'}, 
                       inplace = True)
print(iris)

 

 


# 데이터 정보 요약
iris.describe().transpose()


# 타겟 데이터의 종류별 개수
iris['Species'].value_counts()

 


 

2. seaborn: dist plot

""" Visualizin: distribution """

import seaborn as sns

# style = 바탕화면 이미지, palette = 컬러 스타일 , color_codes = 팔레트 사용 여부
sns.set(style = "white", palette = "muted", color_codes = True)


# Plot a simple histogram with binsize determined automatically
sns.distplot(iris['Sepal.Length'], kde = False, color = "b")


"""
kde 옵션은 히스토그램 라인
"""

 

 


# bins / r의 breaks 옵션과 같다. 
sns.distplot(iris['Sepal.Length'], bins = 15, kde = False, color = "b")

 


# bins의 크기를 구하는 방법 1 sturges가 제안한 방법
sns.distplot(iris['Sepal.Length'], bins = 'sturges', kde = False, color = "b")

 

 


 

# 방법2 프리드만 다이아코니스가 제안한 방법이다
# bins 옵션의 디폴트 값이기도 하다

sns.distplot(iris['Sepal.Length'], bins = 'fd', kde = False, color = "b")

 

 


 

3.  maplotlib: dist plot

import matplotlib.pyplot as plt

plt.figure(figsize = (8, 5))
sns.distplot(iris['Sepal.Length'], kde = False, color = "b")
plt.show()

 


 

 

# 개별 변수에 대한 시각화 방법

# rug는 차트 밑에 |||| 형태들로 자료가 고르게 분포하는지 확인 가능 

# Plot a kernel density estimate and rug plot
plt.figure(figsize = (8, 5))
sns.distplot(iris['Sepal.Length'], hist = False, rug = True, color="r")
plt.show()

 

 

 


# kde_kws 옵션 
# Plot a filled kernel density estimate
plt.figure(figsize = (8, 5))
sns.distplot(iris['Sepal.Length'], hist = False, color = "g", kde_kws = {"shade": True})
plt.show()

 

 


# Plot a histogram and kernel density estimate
plt.figure(figsize = (8, 5))
sns.distplot(iris['Sepal.Length'], color = "m")
plt.show()


 

4. plot array

R의 par(mfrow=c(a, b) ) 함수와 동일

plt.subplots 메소드

""" plot array 1 """
f, axes = plt.subplots(2, 2, figsize = (7, 7), sharex = True)
sns.despine(left = True)

sns.distplot(iris['Sepal.Length'], kde = False, color = "b", ax = axes[0, 0])

sns.distplot(iris['Sepal.Length'], hist = False, rug = True, color="r", ax = axes[0, 1])

sns.distplot(iris['Sepal.Length'], hist = False, color = "g", kde_kws = {"shade": True}, ax = axes[1, 0])

sns.distplot(iris['Sepal.Length'], color = "m", ax = axes[1, 1])

plt.setp(axes, yticks = [])
plt.tight_layout()
plt.show()

 

 

 

 


""" plot array 2 """
f, axes = plt.subplots(2, 2, figsize = (7, 7), sharex = True)
sns.despine(left = True)

# sepal.length가 petal.length보다 평균이 크고 
# petal.length 가 분산이 더 큰 것을 그림으로 쉽게 파악 가능 
# petal.length에는 two bimodal 이 존재한다. 
# 이것만으로도 분류가 쉽게 가능하지 않을까?
sns.distplot(iris['Sepal.Length'], color = "m", ax = axes[0, 0])
sns.distplot(iris['Sepal.Width'], color = "m", ax = axes[0, 1])
sns.distplot(iris['Petal.Length'], color = "m", ax = axes[1, 0])
sns.distplot(iris['Petal.Width'], color = "m", ax = axes[1, 1])

plt.setp(axes, yticks = [])
plt.tight_layout()
plt.show()

 

 

 

 


5. 멀티플 히스토그램

# 멀티플 히스토그램 
""" multiple histograms on the same axis """
iris[iris['Species'] == 'setosa']

plt.figure(figsize = (8, 5))

sns.distplot(iris[iris['Species'] == 'setosa']['Petal.Length'], color = "b", label = 'setosa')
sns.distplot(iris[iris['Species'] == 'versicolor']['Petal.Length'], color = "r", label = 'versicolor')
sns.distplot(iris[iris['Species'] == 'virginica']['Petal.Length'], color = "m", label = 'virginica')

plt.legend(title = "Species")

plt.show()

 

 


# 멀티플 히스토그램을 통계학적 관점에서 살펴보는 방법 
# 박스 플롯


""" box plot """
plt.figure(figsize = (8, 5))

sns.boxplot(x = 'Petal.Length', y = 'Species', data = iris)

plt.show()

 

 

 


6. 두 개 이상의 변수들의 관계 살펴보기

# 피쳐들이 서로 어떤 관계를 가지고 있는가?
# 둘 이상의 변수에서의 관계 살펴보기
""" scatter plot 1 """
plt.figure(figsize = (8, 8))

sns.scatterplot(x = 'Petal.Length', y = 'Petal.Width', data = iris)

plt.show()

컬러 구분이 안 되어 있어서 구분하기가 어렵다.

 


# 컬러링을 이용해서 색 추가 
# *hue 옵션은 그룹별로 컬러링하는 옵션이다.

""" scatter plot 2: coloring """
plt.figure(figsize = (8, 8))

sns.scatterplot(x = 'Petal.Length', y = 'Petal.Width', hue = 'Species', data = iris)

plt.show()

 

 


회귀 선 추가하기

"""
세토사의 경우 데이터의 분포만으로도 분류할 수 있을 것 같다.
하지만 버지칼라와 버지니카는 분포가 섞여있다.
그런데 두 품종의 petal.length, petal.width 간의 관계의 상관계수가
차이를 보인다.

따라서 절편을 통해서 두 품종을 구분할 수 있지 않을까 생각해볼 수 있다.

"""

""" scatter plot 2: regression line """
g = sns.lmplot(x = 'Petal.Length', y = 'Petal.Width', hue = 'Species', height = 6, aspect = 8 / 6,  data = iris)

g.set_axis_labels("Pepal length (mm)", "Pepal width (mm)")

 

 

 

 


조인트 플롯

# 조인트 플랏

""" scatter plot 2: joint plot """

sns.jointplot(x = 'Petal.Length', y = 'Petal.Width', kind = 'scatter', 
              marginal_kws = dict(bins = 15, rug = True),  
              annot_kws = dict(stat = "r"), s = 40, 
              height = 8, data = iris)
              

 

 


 

페어플롯

# 페어플랏, 각 자료에 대한 관계를 살펴보기 좋다 
# \ 대각선은 밀도 플롯 

""" scatter plot matrix: pair plot """

sns.pairplot(iris, hue = 'Species')

sns.pairplot(iris, hue = 'Species', palette = 'husl')

 

 


스왐 플롯

"""
스왐 플랏은 새들이 떼지어 다니는 것 같은 형상 때문에 붙은 이름으로
분류(classification) 문제에 효율적이다.
"""


""" scatter plot: swarm plot """
sns.set(style = 'whitegrid', palette = 'muted')

"""
판다스의 melt 메소드는
품종이 맨 앞으로 오고(범주형), 연속형 변수들이 뒤로 가게 한다.
"""

# "Melt" the dataset to "long-form" or "tidy" representation
tidy_iris = pd.melt(iris, 'Species', var_name = 'Measurement')


plt.figure(figsize = (7, 7))
# Draw a categorical scatterplot to show each observation
sns.swarmplot(x = 'Measurement', y = 'value', hue = 'Species',
              palette = ['r', 'c', 'y'], data = tidy_iris)
plt.show()

 

 


스트립 플롯

"""
스트립 플롯은 스왐플롯과 유사한 결과를 보여준다.
역시나 분류 문제에 효율적이므로, 적당한 변수를 선택하기에 좋다.
"""


""" scatter plot: strip plot """

# Initialize the figure
f, ax = plt.subplots()

sns.despine(bottom = True, left = True)

# Show each observation with a scatterplot
sns.stripplot(x = 'value', y = 'Measurement', hue = 'Species',
              data = tidy_iris, dodge = True, alpha = .25, zorder = 1)

# Show the conditional means
sns.pointplot(x= 'value', y = 'Measurement', hue = 'Species',
              data = tidy_iris, dodge = .532, join = False, palette = 'dark',
              markers = 'd', scale = .75, ci = None)

# Improve the legend 
handles, labels = ax.get_legend_handles_labels()
ax.legend(handles[3:], labels[3:], title = 'Species',
          handletextpad = 0, columnspacing = 1,
          loc = 'lower right', ncol = 3, frameon = True)

plt.show()

 


7. 상관계수와 히트맵

 

상관계수

"""
전통적으로 변수들간의 관계를 식별하기 위해 사용하는 것은 
상관계수이다. 

그리고 상관계수들 간의 관계를 시각화한 것은
히트맵
"""


# 상관계수
iris.corr()

"""
petal 특성은 서로 양의 상관관계
sepal 은 서로 영향이 적음
sepal.length는 petal 특성들과 양의 상관관계
sepal.width는 petal 특성들과 음의 상관관계 
"""

 

 

 


히트맵

""" correlation: heat map """

plt.figure(figsize = (8, 8))
sns.heatmap(data = iris.corr(), annot = True, fmt = '.2f', linewidths = .5, cmap = 'Reds')
plt.show()

 

 

색상이 진할 수록 상관계수가 높은 모습을 보인다.

 


 

'Homework > DataMining' 카테고리의 다른 글

06. Feature Selection  (0) 2020.05.01
05. One-Hot Encoding  (0) 2020.05.01
04. Interpolation / Normalization & Standardization  (0) 2020.04.21
02. Data Load with sqlite3  (0) 2020.04.07
01. Data Exploration & Visualization  (0) 2020.03.24
Comments