히트 맵(heat map)은 열을 뜻하는 히트(heat)와 지도를 뜻하는 맵(map)을 결합시킨 단어로, 색상으로 표현할 수 있는 다양한 정보를 일정한 이미지 위에 열분포 형태의 비주얼한 그래픽으로 출력하는 것이 특징이다.

히트맵은 가로축과 세로축의 상관 관계를 색으로 표현한다. 관련이 많을수록 색이 밝고 관련이 없을수록 색이 어두워진다.
파이썬에서 히트맵을 만들려면 seaborn 라이브러리를 이용하면 된다.
모두의 딥러닝 책을 참고하여 피마 인디언이 당뇨병에 걸리는 가장 큰 원인을 찾아보자
# 필요한 라이브러리 불러오기
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 깃허브에 있는 데이터 클론 받기
!git clone https://github.com/taehojo/data.git
# 피마 인디언 데이터셋 불러오기
df = pd.read_csv('./data/pima-indians-diabetes3.csv')
seaborn 라이브러를 이용하여 히트맵을 만들것이다.
colormap = plt.cm.gist_heat # 그래프 색상 구성
plt.figure(figsize=(12, 12)) # 그래프 크기
sns.heatmap(df.corr(), linewidths=0.1, vmax=0.5, cmap=colormap,
linecolor='white', annot=True)
plt.show()
위 코드를 전부 실행해보면 다음고 같은 이미지가 나온다.

1로 표현된것은 자기 자신과 자기 자신의 상관 관계이기에 1로 표현된다.
# 필요한 라이브러리 불러오기
import pandas as pd
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
# 깃허브에 있는 데이터 클론 받기
!git clone https://github.com/taehojo/data.git
# 피마 인디언 데이터셋 불러오기
df = pd.read_csv('./data/pima-indians-diabetes3.csv')
X = df.iloc[: ,0:8] # 세부 정보
y = df.iloc[: ,8] # 당뇨병 여부
model = Sequential()
model.add(Dense(12, input_dim=8, activation='relu', name='Dense_1'))
model.add(Dense(8, activation='relu', name='Dense_2'))
model.add(Dense(1, activation='sigmoid', name='Dense_3'))
model.summary()
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
history = model.fit(X, y, epochs=100, batch_size=5)
결과
Epoch 1/100
154/154 [==============================] - 1s 1ms/step - loss: 2.3933 - accuracy: 0.4909
Epoch 2/100
154/154 [==============================] - 0s 1ms/step - loss: 1.1371 - accuracy: 0.5794
......
Epoch 99/100
154/154 [==============================] - 0s 2ms/step - loss: 0.4869 - accuracy: 0.7734
Epoch 100/100
154/154 [==============================] - 0s 1ms/step - loss: 0.4928 - accuracy: 0.7500
약 75%의 정확도를 보인다.
seaborn은 파이썬의 데이터 시각화 라이브러리다.
#라이브러리 임포트
import seaborn as sns
#seaborn에서 제공하는 tips 데이터 셋을 사용
df = sns.load_dataset('tips')
Distribution Plot은 데이터의 분포를 시각화하는데 도움이 된다.(디스트리뷰션을 해석한 그대로이다.) 이 그래프를 사용하여 데이터의 평균(mean), 중위수(median), 범위(range), 분산(variance), 편차(deviation) 등을 이해할 수 있다.
변수에 대한 히스토그램을 표시한다.
하나 혹은 두 개의 변수 분포를 나타내는 전형적인 시각화 도구로 범위에 포함화는 관측수를 세어 표시한다.
다음과 같이 사용할 수 있다.
sns.histplot(x=df['total_bill'])
# == sns.displot(x=df['total_bill'], kind='hist')

total_bill 질량 분포
sns.histplot(x=df['total_bill'], y=df['tip'])
# == sns.displot(x=df['total_bill'], y=df['tip'], kind='hist')

total_bill 과 tip에 관한 질량 분포
displot은 Distribution plot의 인터페이스로 적당한 plot 종류를 인자로 줌으로써 여러 가지 그래프를 시각화해준다.
하나 혹은 두 개의 변수에 대한 분표를 그린다.
histplot은 절대량이라면 kdeplot은 밀도 추정치를 시각화한다.
그래서 결과물로는 연속된 곡선의 그래프를 얻을 수 있다
아래와 같이 사용할 수 있다.
sns.kdeplot(x=df['total_bill'])
# = sns.displot(x=df['total_bill'], kind='kde')

단일 변수에 대한 질량 밀도(추정) 그래프
sns.kdeplot(x=df['total_bill'], y=df['tip'])
# = sns.displot(x=df['total_bill'], y=df['tip'], kind='kde')

두개의 변수에 대한 질량 밀도(추정) 그래프
누적 분포를 시각화해준다.
실제 관측치의 비율을 시각화한다는 장점이 있다.
sns.ecdfplot(x=df['total_bill'])
# == sns.displot(x=df['total_bill'], kind='ecdf')

단일 변수에 대한 ecdf plot
x축과 y축을 따라 눈금을 그려서 주변 분포도를 표시한다.
개발 관측치에 대한 위치를 보여줌으로써 다른 그림들을 보완하는데 주로 쓰인다.
(즉, 이 그래프만 단일로 잘 쓰지는 않는다.)
아래 예시를 보자.
sns.kdeplot(x=df["total_bill"])
sns.rugplot(x=df["total_bill"])

주황 색선이 rugplot, 파란색 선이 kdeplot이다. rugplot은 보조 그래프 정도로 참고용 이라보면 된다.
지금부터 설명하는 plot은 범주형(categorical) 변수를 이해하는데 도움이 된다. 일변량(univariate) 혹은 이변량(bivariate) 분석에 사용된다.
이변량(bivariate) 분석을 위한 plot이다.
x축에는 범주형 변수, y축에는 연속형 변수를 넣는다.
sns.barplot(x = df['sex'], y = df['tip'])

범주형 변수의 발생 횟수를 샌다.
일변량(univariate) 분석이다.
sns.countplot(x = df['sex'])
최대(maximum), 최소(minimum), mean(평균), 1 사분위수(first quartile), 3 사분위수(third quartile)를 보기 위한 그래프
특이치(outliar)를 발견하기에도 좋다.
단일 연속형 변수에 대해 수치를 표시하거나, 연속형 변수를 기반으로 서로 다른 범주현 변수를 분석할 수 있다.
sns.boxplot(x = df['total_bill'])

sns.boxplot(y = df['total_bill'], x = df['smoker'])

sns.violinplot(y = df['total_bill'], x = df['smoker'])
연속형 변수와 범주형 변수 사이의 그래프이다.
산점도(scatter plot)로 표시되는데, 범주형 변수의 인코딩을 추가로 사용한다.
sns.stripplot(y = df['total_bill'], x = df['smoker'])

Strip plot과 violin plot의 조합이다.
데이터 포인트 수와 함께 각 데이터의 분포도 제공한다.
sns.swarmplot(y = df['total_bill'], x = df['smoker'])

딱 보면 알 수 있듯 Strip Plot에 비해 분포도를 확인하기 쉽다.
시각화를 위해 2차원 행렬 데이터를 사용하는 특별한 유형의 plot이다. 매트릭스 데이터에서는 사이즈가 크기 때문에 패턴을 분석하고 생성하기 어렵다. 다음에 오는 plot은 매트릭스 데이터에 색상을 제공함으로써 조금 더 분석하기 쉽게 도와준다.
우리의 데이터에는 3개의 numerical variables들이 있다. 이것들 사이의 상관 행렬(correlation matrix)을 만들어보자.

우리는 단지 3x3=9개의 값만 있지만 5x5=25개만 넘어가도 모든 값을 한눈에 읽고 이해하기는 어렵다.
색상을 입히는 게 얼마큼 해석이 쉬워지는지 알아보자.
sns.heatmap(df.corr(), annot = True, cmap = 'viridis')

결측 값(missing value)도 그래프로 확인하는 할 수 있다.
sns.heatmap(df.isnull(),yticklabels=False,cbar=False,cmap='viridis')

아쉽게도 이번 예시에서는 결측 값이 없다. 만약 결측 값이 있으면 보라색이 아닌 다른 색으로 그림에 표기가 된다.
sns.clustermap(df.corr(), annot=True, cmap='viridis')

유사도가 높은 것들 순서대로 계층적으로 클러스터(Hiearchical Clustering)가 형성된다.
Grid plot은 시각화에 대한 제어력을 높이고 코드 한 줄로 다양한 그래프를 표시한다.
성별과 흡연 여부에 따라서 얼마만큼 지불을 하는지 알고 싶다면 다음과 같이 실행하면 된다.
sns.FacetGrid(df, col = 'smoker', row = 'sex').map(sns.distplot, 'total_bill')

성별 / 흡연 여부에 따라서 총 4개의 그래프가 그려졌다.
두 변수에 대한 displot의 조합이다.
두 변수에 분포에 대한 분석을 할 수 있다.
두 displot 사이에 scatter plot이 추가되어 분포를 추가로 확인할 수 있다.
scatter plot 대신 hex plot으로 정의할 수도 있다.
sns.jointplot(x=df['total_bill'], y=df['tip'], kind = 'scatter')

sns.jointplot(x=df['total_bill'], y=df['tip'], kind = 'hex')

데이터셋을 통째로 넣으면 숫자형 특성에 대하여 각각에 대한 히스토그램과 두 변수 사이의 scatter plot을 그린다.
이 한 줄이면 데이터를 한눈에 보기 쉬워서 애용한다.
다른 기능이나 유연성이 더 필요하다면 pairgrid를 사용하면 된다.
sns.pairplot(df)

Regression plot은 지금까지 봐온 plot과는 개념이 조금 다른데, regression 머신러닝의 결과를 그래프에 표기해준다.
즉 데이터를 있는 그대로 보여주기보다는, 머신러닝 결과와 함께 보여주는 것이다.
sns.regplot(x = 'tip', y = 'total_bill', data = df)

이 plot은 regplot()과 faceGrid를 결합한 것이다.
hue에 들어간 컬럼의 값을 구분하여 따로따로 모델링하여 결과를 보여준다.
regression을 위한 여러 가지 옵션들이 있다.(자세한 내용은 공식 Documentation을 참고)
sns.lmplot(x = 'tip', y = 'total_bill', data = df, hue = 'sex')

출처: https://dining-developer.tistory.com/30, https://github.com/taehojo/deeplearning