Matplotlib 그래프 2
https://wonhwa1.blogspot.com/2022/11/python-matplotlib.html
데이터 준비
1편에서 사용한 csv데이터를 준비해 주세요.
또는 아래의 링크에서 다운받으실 수 있습니다.
https://www.kaggle.com/imakash3011/customer-personality-analysis
다변량 그래프 그리기
다변량 그래프는 변수가 여러 개 있는 그래프입니다.
이번 포스팅에는 변수를 4개를 추가하여 그래프를 그리는 방법을 알아보도록 하겠습니다.
- x축: MntMeatProducts(육류구매량)
- y축: MntWines(와인구매량)
- 색구분: Edu_level(학력)
- 사이즈구분: NumWebPurchases(웹사이트구매횟수)
이렇게 4개의 변수를 그래프로 표현해 보겠습니다.
기존 csv를 불러온 df에서 null 값이 있으면 0으로 일괄대체를 해준 후 나머지 과정을 진행합니다.
먼저 학력별로 색 구분을 하려면 str데이터인 학력을 문자에서 숫자로 변환하는 작업이 필요합니다.
이 작업을 아래의 함수를 써서 학력을 숫자로 바꾼 후,
바꾼 숫자들을 'Edu_level'이라는 학력 컬럼을 새로 만들어 입력 하겠습니다.
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import font_manager,rc
# 한글 폰트 설정
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')
# null값 0으로 대체
df = df.fillna(0)
########## 다변량 그래프 그리기 ###########
#다변량 그래프(3개 이상의 변수 사용)
# 학력부분 숫자로 바꾸기
def recode_edu(education_level):
if education_level == 'Basic':
return 0
elif education_level == 'Graduation':
return 1
elif education_level == '2nCycle':
return 2
elif education_level == 'Master':
return 3
else:
return 4
df['Edu_level'] = df['Education'].apply(recode_edu)
df.head()
맨 끝 컬럼에 Edu_level이 잘 추가되었음을 확인할 수 있습니다.
그 후 다변량 그래프를 그려주도록 합니다.
c = color(색)을, s = size(사이즈)를 의미합니다.
# x축: MntMeatProducts(육류구매량)
# y축: MntWines(와인구매량)
# c(컬러): Edu_level(학력)
# s(사이즈): NumWebPurchases(웹사이트구매횟수)
#그래프틀생성
scatter_plot = plt.figure()
axes1 = scatter_plot.add_subplot(1,1,1)
#산점도 다변량 그래프 그리기
axes1.scatter(
x=df['MntMeatProducts'],
y=df['MntWines'],
c=df['Edu_level'],
s=df['NumWebPurchases']*10,
alpha=0.5
) #alpha는 투명도 조절
axes1.set_title('다변량 그래프(학력별 다른색상, 웹사이트구매횟수는 사이즈별')
axes1.set_xlabel('육류구매량')
axes1.set_ylabel('와인구매량')
plt.show()
이렇게 4개의 변수를 그래프로 시각화하였습니다.
3D 그래프
다변량 그래프에서 사용했던 데이터를 가지고 이번에는 3D로 scatter plot을 그려보겠습니다.
3D로 그래프를 그릴 때는 mpl_toolkits을 import 한 후, X,Y,Z 값을 차례로 넣어 주셔야 합니다.
#3D그래프 그리기
from mpl_toolkits.mplot3d import axes3d
fig = plt.figure()
ax = fig.add_subplot(111,projection='3d')
ax.scatter(df['MntMeatProducts'],df['MntWines'],df['Edu_level'], c='pink', s=50)
plt.show()
위의 그래프에서 x는 육류구매량, y는 와인구매량, z는 학력으로 설정하였습니다.
밀집도 그래프
이번에는 'NumStorePurchases'(매장구매량)컬럼을 밀집도 그래프로 나타내 보겠습니다.
밀집도 그래프는 plot.kde()를 이용하여 생성할 수 있습니다.
####밀집도 그래프#####
ax1 = plt.subplot()
ax1 = df['NumStorePurchases'].plot.kde() #매장구매량
plt.show()
육각형 그래프
다음으로, 육각형 그래프를 그려보도록 하겠습니다.
plot.hexbin을 사용하여 육각 그래프를 그릴 수 있고, gridsize 파라미터로 그래프 육각형의 크기를 조절할 수 있습니다.
x축은 'Income'(수입) 컬럼으로, y축은 'MntWines'(와인구매량) 컬럼으로 하여 육각형 그래프를 만들어 보겠습니다.
####육각형 그래프#####
fig2,ax2 = plt.subplots()
ax2 = df.plot.hexbin(x='Income',y='MntWines',ax=ax2,gridsize=10) #gridsize: 육각형크기조절
plt.show()
위와 같이 벌집모양의 육각형 그래프가 만들어졌습니다.
+ 막대 그래프에 패턴 추가하기
#####패턴추가#####
fig, ax = plt.subplots()
#그래프 크기 및 폰트 크기 지정
plt.rcParams['figure.figsize'] = (5, 5)
plt.rcParams['font.size'] = 10
# 바그래프 그리기
bar_graph = ax.bar(count.index, count,hatch='*')
plt.show()
fig, ax = plt.subplots()
#그래프 크기 및 폰트 크기 지정
plt.rcParams['figure.figsize'] = (5, 5)
plt.rcParams['font.size'] = 10
# 바그래프 그리기
bar_graph = ax.bar(count.index, count)
#그래프 안 패턴 설정
bar_graph[0].set_hatch('//')
bar_graph[1].set_hatch('o')
bar_graph[2].set_hatch('.')
bar_graph[3].set_hatch('*')
bar_graph[4].set_hatch('x')
plt.show()
+ 그래프에 텍스트 추가하기, 스타일 설정하기
fig, ax = plt.subplots()
bar_graph = ax.bar(count.index, count)
#rotation: 기울기, bbox:스타일,boxstyle:텍스트테두리모양,facecolor:텍스트배경색,alpha:투명도
# 텍스트 추가
plt.text(-0.2,230,'203명',rotation=0, bbox=dict(boxstyle='round',facecolor='red',alpha=0.5)) #둥근모서리
plt.text(0.8,100,'54명',rotation=0, bbox=dict(boxstyle='circle',facecolor='skyblue',alpha=0.5)) #원
plt.text(1.7,1140,'1127명',rotation=0, bbox=dict(boxstyle='square',facecolor='pink',alpha=0.5)) #사각형
plt.text(2.7,390,'370명',rotation=0, bbox=dict(boxstyle='DArrow',facecolor='yellow',alpha=0.5)) #양쪽화살표 #왼쪽화살표:LArrow,오른쪽화살표:RArrow
plt.text(3.8,510,'486명',rotation=0, bbox=dict(boxstyle='Sawtooth',facecolor='green',alpha=0.5)) #톱니모양테두리
plt.show()
전체코드
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import font_manager,rc
# 한글 폰트 설정
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')
# null값 0으로 대체
df = df.fillna(0)
########## 다변량 그래프 그리기 ###########
#다변량 그래프(3개 이상의 변수 사용)
# 학력부분 숫자로 바꾸기
def recode_edu(education_level):
if education_level == 'Basic':
return 0
elif education_level == 'Graduation':
return 1
elif education_level == '2nCycle':
return 2
elif education_level == 'Master':
return 3
else:
return 4
df['Edu_level'] = df['Education'].apply(recode_edu)
print(df.head())
# x축: MntMeatProducts(육류구매량)
# y축: MntWines(와인구매량)
# c(컬러): Edu_level(학력)
# s(사이즈): NumWebPurchases(웹사이트구매횟수)
#그래프틀생성
scatter_plot = plt.figure()
axes1 = scatter_plot.add_subplot(1,1,1)
#산점도 다변량 그래프 그리기
axes1.scatter(
x=df['MntMeatProducts'],
y=df['MntWines'],
c=df['Edu_level'],
s=df['NumWebPurchases']*10,
alpha=0.5
) #alpha는 투명도 조절
axes1.set_title('다변량 그래프(학력별 다른색상, 웹사이트구매횟수는 사이즈별')
axes1.set_xlabel('육류구매량')
axes1.set_ylabel('와인구매량')
plt.show()
###3D그래프 그리기###
from mpl_toolkits.mplot3d import axes3d
fig = plt.figure()
ax = fig.add_subplot(111,projection='3d')
ax.scatter(df['MntMeatProducts'],df['MntWines'],df['Edu_level'], c='pink', s=50)
plt.show()
####밀집도 그래프#####
ax1 = plt.subplot()
ax1 = df['NumStorePurchases'].plot.kde() #매장구매량
plt.show()
####육각형 그래프#####
fig2,ax2 = plt.subplots()
ax2 = df.plot.hexbin(x='Income',y='MntWines',ax=ax2,gridsize=10) #gridsize: 육각형크기조절
plt.show()
#####패턴추가#####
fig, ax = plt.subplots()
#그래프 크기 및 폰트 크기 지정
plt.rcParams['figure.figsize'] = (5, 5)
plt.rcParams['font.size'] = 10
# 바그래프 그리기
bar_graph = ax.bar(count.index, count,hatch='*')
plt.show()
##개별 막대에 패턴 추가##
fig, ax = plt.subplots()
#그래프 크기 및 폰트 크기 지정
plt.rcParams['figure.figsize'] = (5, 5)
plt.rcParams['font.size'] = 10
# 바그래프 그리기
bar_graph = ax.bar(count.index, count)
#그래프 안 패턴 설정
bar_graph[0].set_hatch('//')
bar_graph[1].set_hatch('o')
bar_graph[2].set_hatch('.')
bar_graph[3].set_hatch('*')
bar_graph[4].set_hatch('x')
plt.show()
###텍스트 추가###
fig, ax = plt.subplots()
bar_graph = ax.bar(count.index, count)
#rotation: 기울기, bbox:스타일,boxstyle:텍스트테두리모양,facecolor:텍스트배경색,alpha:투명도
# 텍스트 추가
plt.text(-0.2,230,'203명',rotation=0, bbox=dict(boxstyle='round',facecolor='red',alpha=0.5)) #둥근모서리
plt.text(0.8,100,'54명',rotation=0, bbox=dict(boxstyle='circle',facecolor='skyblue',alpha=0.5)) #원
plt.text(1.7,1140,'1127명',rotation=0, bbox=dict(boxstyle='square',facecolor='pink',alpha=0.5)) #사각형
plt.text(2.7,390,'370명',rotation=0, bbox=dict(boxstyle='DArrow',facecolor='yellow',alpha=0.5)) #양쪽화살표 #왼쪽화살표:LArrow,오른쪽화살표:RArrow
plt.text(3.8,510,'486명',rotation=0, bbox=dict(boxstyle='Sawtooth',facecolor='green',alpha=0.5)) #톱니모양테두리
plt.show()
참고자료
책 Do it! 데이터 분석을 위한 판다스 입문 - 이지스퍼블리싱
마무리
저번 편에 이어 matplotlib으로 그릴 수 있는 다른 그래프들을 더 알아보았습니다.
데이터 분석 시 시각화가 필요한 그래프가 있으면 위의 내용들을 활용하여 분석을 진행하면
데이터 인사이트를 얻기에도 쉬우리라 생각됩니다.
댓글
댓글 쓰기