기본 콘텐츠로 건너뛰기

[python] matplotlib으로 그래프 만들기- 다변량그래프+3d, 밀집도그래프, 육각그래프, 패턴, 텍스트 설정까지

Matplotlib 그래프 2 1편은 아래에서 확인하실 수 있습니다:) 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') # nul

[python] matplotlib으로 그래프 만들기- 다변량그래프+3d, 밀집도그래프, 육각그래프, 패턴, 텍스트 설정까지

Matplotlib 그래프 2

1편은 아래에서 확인하실 수 있습니다:)

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()

위와 같이 벌집모양의 육각형 그래프가 만들어졌습니다.


+ 막대 그래프에 패턴 추가하기

그래프를 그리는 것 외에도 matplotlib을 사용하여 막대 그래프에 패턴을 추가 할 수 있어 그 방법을 알아보도록 하겠습니다.

우선 이번에 시각화 할 내용은 고객 중 학력(Education)이 같은 사람이 각각 몇명 있는지를 나타내 보는 것 입니다. 때문에 각 학력을 가지고 있는 사람들을 groupby를 사용하여 카운팅 후 막대그래프로 표시해 보도록 하겠습니다.

일반 막대 그래프는 밋밋하므로 막대에 별 패턴을 추가해서 시각화해 보겠습니다.
'hatch'를 사용하여 어떤 패턴을 그릴지 설정할 수 있습니다.
여기서 별은 * 로 hatch='*' 을 사용하여 나타낼 수 있습니다. 

#####패턴추가#####
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()

이렇게 막대그래프에 별모양이 추가되었습니다.

패턴은 또한 막대마다 다르게 설정이 가능합니다.
set_hatch를 사용해 변경해 줄 수 있습니다.
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()
이렇게 각각의 막대마다 패턴이 다르게 설정되었습니다.


+ 그래프에 텍스트 추가하기, 스타일 설정하기

또한 그래프 안에 텍스트를 추가할 수 있습니다.

plt.text(x좌표, y좌표, '표시할 텍스트')

를 사용하여 그래프 안에 텍스트를 입력할 수 있습니다.

이에 더해,
rotation을 사용하면 기울기를 설정할 수 있고,
bbox를 사용하여 텍스트 상자의 스타일을 설정할 수 있습니다.
bbox 안에는 딕셔너리 타입으로 설정사항을 입력하면 됩니다.

예로, boxstyle은 텍스트의 테두리 모양을 설정할 수 있고,
facecolor는 텍스트 배경색을,
alpha는 텍스트 상자의 투명도 설정이 가능합니다.

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으로 그릴 수 있는 다른 그래프들을 더 알아보았습니다.

데이터 분석 시 시각화가 필요한 그래프가 있으면 위의 내용들을 활용하여 분석을 진행하면

데이터 인사이트를 얻기에도 쉬우리라 생각됩니다.

댓글

이 블로그의 인기 게시물

[python] geopy를 사용하여 주소를 위,경도 값으로 바꾸기 & 위,경도 값을 주소로 바꾸기

geopy란? geopy는 파이썬 라이브러리로,  주소를 위,경도 숫자 값으로 바꿔 주거나(지오코딩), 반대로 위,경도 값을 사람이 읽을 수 있는 주소로 바꿔줍니다. (이를 역 지오코딩이라 합니다.) 예를 들어, 우리 지역에 있는 카페의 위치를 시각화 한다고 생각해 봅시다. 이 때, 카페 위치를 입력하기 위해서는 컴퓨터가 인식할 수 있도록 위도, 경도의 숫자 값이 필요합니다. 하지만 데이터에 문자 주소만 있다면 이를 바꿔주는 작업이 필요합니다. 이때 geopy를 사용하면 여러 지오코딩 서비스를 연결하여 사용할 수 있습니다. 이중에 OpenStreetMap을 사용하면 따로 api 키를 발급받지 않아도 위경도 변환이 가능합니다. geopy 설치 터미널에 pip install geopy 를 입력하여 설치해 줍니다. 지오코딩 주소 -> 위도, 경도 데이터준비 데이터는 공공데이터 포탈의 '강서구 커피샵 현황'을 사용해 보도록 하겠습니다. 커피샵현황 다운로드   다운받은 csv파일을 열어 주도록 하겠습니다. import pandas as pd df = pd.read_csv('서울특별시 강서구_카페 현황_20220210.csv',encoding='cp949') df.head() 이렇게 한글 도로명주소, 지번주소만 있는 것을 확인할 수 있습니다. 이 주소를 가지고 위도, 경도 값으로 변환해 보겠습니다. 그 전에 주소를 한 번 정리해 주어야 합니다. ( ) 안에 있는 상세 주소 또는 , 뒤에 있는 상세주소를 제거해 주어야 위도, 경도 변환 시 오류가 나지 않습니다. 전처리 데이터 프레임에 있는 도로명 주소, 지번 주소에서 동단위 로만 주소를 남겨 보겠습니다. 예) 서울특별시 강서구 000로 00 -> 000로 00      서울특별시 강서구 00동 000-00 -> 00동 000-0 함수를 하나 만들어 apply를 사용해 주소를 다듬어 준 후, 각각 새로운 열에 추출한 주소를 저장해 줍니다. #주소데이터 전처리

[python] matplotlib으로 그래프 만들기- 히스토그램, 산점도, 박스그래프, 파이그래프

Matplotlib이란? matplotlib은 python에서 데이터 시각화를 도와주는 라이브러리입니다. 그럼 matplotlib을 이용해 다양한 종류의 그래프를 바로 그려 보도록 하겠습니다. 데이터 준비 오늘 시각화할 데이터는 kaggle의 'Customer Personality Analysis' Datasets를 이용하여 그래프를 시각화 해보겠습니다. 아래의 링크에서 csv파일을 다운받아 주세요. https://www.kaggle.com/imakash3011/customer-personality-analysis 이 데이터는 한 회사 고객들의 구매 정보 및 고객 정보등을 포함하고 있습니다. 각 열의 내용은 아래와 같습니다. People ID : Customer's unique identifier (고객식별id) Year_Birth : Customer's birth year (출생년도) Education : Customer's education level (학력) Marital_Status : Customer's marital status (결혼상태) Income : Customer's yearly household income (수입) Kidhome : Number of children in customer's household (자녀 수) Teenhome : Number of teenagers in customer's household (10대 자녀 수) Dt_Customer : Date of customer's enrollment with the company (회원가입날짜) Recency : Number of days since customer's last purchase (마지막구매 후 경과일자) Complain : 1 if the customer complained in the last 2 years, 0 otherwise (지난 2년간 컴플레인 여부) Products