안녕하세요! 오늘은 matplotlib에 이어 seaborn 라이브러리로 그래프 그리는 방법을 알아보도록 하겠습니다.
그래프로 시각화할 데이터는 전의 게시물에서 사용한 마케팅 데이터셋을 그대로 사용하겠습니다.
데이터 준비
https://www.kaggle.com/imakash3011/customer-personality-analysis
데이터 불러오기 및 폰트 설정
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import font_manager,rc
import seaborn as sns
# 한글 폰트 설정
font_location = 'C:/Windows/Fonts/MALGUNSL.TTF' #맑은고딕
font_name = font_manager.FontProperties(fname=font_location).get_name()
rc('font',family=font_name)
#데이터 셋 불러오기
df = pd.read_csv('marketing_campaign.csv',sep='\t')
밀집도 그래프, 히스토그램
seaborn 라이브러리에서는 distplot을 이용하면 히스토그램과 밀집도 그래프를 동시에 그릴 수 있습니다.
고객의 매장 구매량 정보를 히스토그램 및 밀집도 그래프로 시각화하여 보겠습니다.
### seaborn으로 그래프 그리기 ###
## 밀집도 그래프와 히스토그램 같이 그리기 ##
# 그래프 바탕 생성
ax = plt.subplots()
# 밀집도 그래프 없애려면 kde=False 추가, 밀집도만 남기려면 hist=False 추가
ax = sns.distplot(df['NumStorePurchases'],kde=True,hist=True,bins=13)
# 제목 생성
ax.set_title('매장구매 밀집도&히스토그램')
# x라벨
ax.set_xlabel('매장구매')
# y라벨
ax.set_ylabel('빈도')
#그래프 popup
plt.show()
만약 히스토그램 그래프만 남기고 싶으면 sns.distplot(kde = False)로 바꾸어 주면 됩니다.
밀집도만 남기고 싶을 때는 sns.distplot(hist = False)로 바꾸어 주시면 됩니다.
또 seaborn에서는 rug 그래프(양탄자 그래프)를 그려 데이터의 밀집 정도를 확인할 수 있습니다.
# rug 추가
ax1 = plt.subplots()
ax1 = sns.displot(df['NumStorePurchases'],kde = True,rug=True)
ax1.set_titles('매장구매 히스토그램 양탄자그래프')
ax1.set_xlabels('매장구매')
plt.show()
seabron.distplot()에 rug = True를 추가하면 만들 수 있습니다.
count 그래프
이번엔 빈도 수를 세어 주는 count 그래프를 countplot을 사용하여 그려 보도록 하겠습니다.
count그래프는 이산값을 이용하여 그리는데, 오늘 예제에서는 학력을 기준으로 count 그래프를 만들어 보겠습니다.
## count 그래프 그리기(이산값) ##
ax2 = plt.subplots()
ax2 = sns.countplot('Education',data=df)
ax2.set_title('학력별 인원(명)')
ax2.set_xlabel('학력')
ax2.set_ylabel('해당 인원 숫자')
plt.show()
이렇게 고객의 학력을 전체적으로 파악할 수 있습니다.
산점도 그래프
위의 그래프까지는 변수 1개를 그래프로 그려보았습니다.
이번엔 변수 2개를 사용하여 산점도 그래프를 그려 보도록 하겠습니다.
산점도는 regplot을 이용하여 그릴 수 있습니다.
육류구매량을 x, 와인구매량을 y로 하여 산점도를 그려 보겠습니다.
##이변량그래프 그리기##
# 산점도 그래프 그리기
ax3 = plt.subplots()
ax3 = sns.regplot(x='MntMeatProducts',y='MntWines',data=df, fit_reg=True) #회귀선 제거 시 fig_reg=False
ax3.set_title('육류 및 와인 구매량 산점도')
ax3.set_xlabel('육류구매량')
ax3.set_ylabel('와인구매량')
plt.show()
regplot은 회귀선까지 같이 그려지는데 회귀선을 제거하고 싶으면
sns.regplot(fit_reg = False)로 바꿔주면 됩니다.
또한 jointplot을 사용하여 산점도와 히스토그램을 동시에 그릴 수도 있습니다.
# 산점도&히스토그램 그리기
joint = sns.jointplot(x='MntMeatProducts',y='MntWines',data=df)
joint.set_axis_labels(xlabel='육류구매량',ylabel='와인구매량')
joint.fig.suptitle('육류 및 와인구매량 산점도&히스토그램',fontsize=10)
plt.show()
육각 그래프
이번에는 그래프의 데이터를 구분하기 용이한 육각 그래프를 만들어 보겠습니다.
x값은 매장구매량, y값은 웹사이트 구매량으로 하는 육각 그래프는 jointplot의 kind='hex'를 사용하여 생성 가능합니다.
#육각그래프 그리기
hexbin = sns.jointplot(x='NumStorePurchases',y='NumWebPurchases',data=df,kind='hex')
hexbin.set_axis_labels(xlabel='매장구매',ylabel='웹사이트구매')
hexbin.fig.suptitle('매장 및 웹사이트 구매 육각그래프',fontsize=10)
plt.show()
산점도와 마찬가지로 위, 오른쪽의 히스토그램을 지워주고 싶으면
sns.regplot(fit_reg = False)로 바꿔주면 됩니다.
이차원 밀집도
이차원 밀집도는 kdeplot을 사용하여 그릴 수 있습니다. 결과물은 등고선 처럼 표현이 됩니다.
육류구매량을 x, 와인구매량을 y로 하여 이차원 밀집도를 그려보겠습니다.
#이차원 밀집도 그리기
ax4 = plt.subplots()
ax4 = sns.kdeplot(data=df['MntMeatProducts'],
data2=df['MntWines'],
shade=True) #shade=True 음영효과 설정
ax4.set_title('이차원밀집도(와인 및 육류 구매량)')
ax4.set_xlabel('육류구매량')
ax4.set_ylabel('와인구매량')
plt.show()
kdeplot(shade = True)로 설정하여 음영을 줄 수 있습니다.
위의 그래프는 음영을 준 상태입니다.
박스그래프
이번엔 이산값과 연속값을 시각화할 수 있는 박스그래프를 그려보도록 하겠습니다.
x는 학력, y는 수입으로 잡고 boxplot을 사용하여 그래프를 생성하겠습니다.
#박스그래프 그리기
ax4 = plt.subplots()
ax4 = sns.boxplot(x='Education',y='Income',data=df)
ax4.set_title('학력에 따른 수입 박스그래프')
ax4.set_xlabel('학력')
ax4.set_ylabel('수입')
plt.show()
바 그래프
바 그래프는 변수값의 평균을 계산하여 시각화가 가능합니다.
학력에 따른 수입의 평균을 barplot을 사용하여 그려보겠습니다.
#바그래프 그리기
ax_4 = plt.subplots()
ax_4 = sns.barplot(x='Education',y='Income',data=df)
ax_4.set_title('학력에 따른 수입 바그래프')
ax_4.set_xlabel('학력')
ax_4.set_ylabel('수입의 평균')
plt.show()
바이올린 그래프
바이올린 그래프는 박스그래프와 비슷하지만 데이터 분산을 더욱 잘 확인할 수 있습니다.
데이터 밀도를 추정하여 시각화하기때문입니다.
위에서와 마찬가지로 x=학력, y=수입으로 하는 바이올린 그래프를 violinplot을 사용하여 만들어 보겠습니다.
#바이올린그래프 그리기(데이터분산확인가능)
ax5 = plt.subplots()
ax5 = sns.violinplot(x='Education',y='Income',data=df)
ax5.set_title('학력에 따른 수입 바이올린그래프')
ax5.set_xlabel('학력')
ax5.set_ylabel('수입')
plt.show()
관계 그래프
seaborn으로는 여러 그래프를 한 번에 확인할 수 있는 관계 그래프를 그릴 수 있습니다.
seaborn의 pairplot을 사용하여 그릴 수 있는데,
map_upper은 대각선 위 3개 그래프,
map_lower은 대각선 아래 3개 그래프,
map_diag는 대각선상에 있는 나머지3개의 그래프를 지정하여 만들 수 있습니다.
여기서는 대각선 위의 그래프는 산점도로, 아래는 밀집도 그래프로, 나머지 대각선은 히스토그램으로
관계 그래프를 그려 보도록 하겠습니다.
원본 데이터셋의 열이 너무 많기 때문에, 육류구매랴야, 와인구매량, 웹사이트 구매량의 3변수만 뽑아내어
관계 그래프로 시각화 해 보겠습니다.
#데이터 다듬기
df2 = df.loc[:,['MntMeatProducts','MntWines','NumWebPurchases']]
print(df2.head())
#관계 그래프 그리기
pair_grid = sns.PairGrid(df2)
pair_grid = pair_grid.map_upper(sns.regplot) # 대각선 윗부분
pair_grid = pair_grid.map_lower(sns.kdeplot) # 대각선 아랫부분
pair_grid = pair_grid.map_diag(sns.histplot) # 대각선 중심
plt.show()
전체 코드
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import font_manager,rc
import seaborn as sns
# 한글 폰트 설정
font_location = 'C:/Windows/Fonts/MALGUNSL.TTF' #맑은고딕
font_name = font_manager.FontProperties(fname=font_location).get_name()
rc('font',family=font_name)
#데이터 셋 불러오기
df = pd.read_csv('marketing_campaign.csv',sep='\t')
print(df.head())
### seaborn으로 그래프 그리기 ###
## 밀집도 그래프와 히스토그램 같이 그리기 ##
# 그래프 바탕 생성
ax = plt.subplots()
# 밀집도 그래프 없애려면 kde=False 추가, 밀집도만 남기려면 hist=False 추가
ax = sns.distplot(df['NumStorePurchases'],kde=True,hist=True,bins=13)
# 제목 생성
ax.set_title('매장구매 밀집도&히스토그램')
# x라벨
ax.set_xlabel('매장구매')
# y라벨
ax.set_ylabel('빈도')
#그래프 popup
#plt.show()
# rug 추가
ax1 = plt.subplots()
ax1 = sns.displot(df['NumStorePurchases'],kde = True,rug=True)
ax1.set_titles('매장구매 히스토그램 양탄자그래프')
ax1.set_xlabels('매장구매')
#plt.show()
## count 그래프 그리기(이산값) ##
ax2 = plt.subplots()
ax2 = sns.countplot('Education',data=df)
ax2.set_title('학력별 인원(명)')
ax2.set_xlabel('학력')
ax2.set_ylabel('해당 인원 숫자')
#plt.show()
##이변량그래프 그리기##
# 산점도 그래프 그리기
ax3 = plt.subplots()
ax3 = sns.regplot(x='MntMeatProducts',y='MntWines',data=df, fit_reg=True) #회귀선 제거 시 fig_reg=False
ax3.set_title('육류 및 와인 구매량 산점도')
ax3.set_xlabel('육류구매량')
ax3.set_ylabel('와인구매량')
#plt.show()
# 산점도&히스토그램 그리기
joint = sns.jointplot(x='MntMeatProducts',y='MntWines',data=df)
joint.set_axis_labels(xlabel='육류구매량',ylabel='와인구매량')
joint.fig.suptitle('육류 및 와인구매량 산점도&히스토그램',fontsize=10)
#plt.show()
#육각그래프 그리기
hexbin = sns.jointplot(x='NumStorePurchases',y='NumWebPurchases',data=df,kind='hex')
hexbin.set_axis_labels(xlabel='매장구매',ylabel='웹사이트구매')
hexbin.fig.suptitle('매장 및 웹사이트 구매 육각그래프',fontsize=10)
#plt.show()
#이차원 밀집도 그리기
ax4 = plt.subplots()
ax4 = sns.kdeplot(data=df['MntMeatProducts'],
data2=df['MntWines'],
shade=True) #shade=True 음영효과 설정
ax4.set_title('이차원밀집도(와인 및 육류 구매량)')
ax4.set_xlabel('육류구매량')
ax4.set_ylabel('와인구매량')
plt.show()
#박스그래프 그리기
ax4 = plt.subplots()
ax4 = sns.boxplot(x='Education',y='Income',data=df)
ax4.set_title('학력에 따른 수입 박스그래프')
ax4.set_xlabel('학력')
ax4.set_ylabel('수입')
plt.show()
#바그래프 그리기
ax_4 = plt.subplots()
ax_4 = sns.barplot(x='Education',y='Income',data=df)
ax_4.set_title('학력에 따른 수입 바그래프')
ax_4.set_xlabel('학력')
ax_4.set_ylabel('수입의 평균')
plt.show()
#바이올린그래프 그리기(데이터분산확인가능)
ax5 = plt.subplots()
ax5 = sns.violinplot(x='Education',y='Income',data=df)
ax5.set_title('학력에 따른 수입 바이올린그래프')
ax5.set_xlabel('학력')
ax5.set_ylabel('수입')
plt.show()
#데이터 다듬기
df2 = df.loc[:,['MntMeatProducts','MntWines','NumWebPurchases']]
print(df2.head())
#관계 그래프 그리기
pair_grid = sns.PairGrid(df2)
pair_grid = pair_grid.map_upper(sns.regplot) # 대각선 윗부분
pair_grid = pair_grid.map_lower(sns.kdeplot) # 대각선 아랫부분
pair_grid = pair_grid.map_diag(sns.histplot) # 대각선 중심
plt.show()
코드 파일
참고 자료
- 책- Do it 데이터 분석을 위한 pandas 입문
마무리
오늘은 seaborn으로 그릴 수 있는 그래프들을 알아보았습니다.
seabron을 사용하면 matplotlib보다 화려하고 다양한 그래프를 만들 수 있습니다.
데이터 분석 시 활용하는걸 추천합니다. :-)
'시각화(Visualization)' 카테고리의 다른 글
[Python/시각화] Manim을 활용한 애니메이션 시각화(2) (2) | 2022.01.24 |
---|---|
[python/시각화] Manim을 활용한 애니메이션 시각화(1) - 설치 (0) | 2022.01.21 |
[python/시각화] matplotlib으로 그래프 만들기- 다변량그래프, 밀집도그래프, 육각그래프 (0) | 2021.12.15 |
[python/시각화] matplotlib으로 그래프 만들기- 히스토그램, 산점도, 박스그래프 (0) | 2021.12.15 |
[python] CCTV,가로등 위치를 folium을 사용하여 clustering 시각화하기 (4) | 2021.11.17 |