반응형

1편에 이어 matplotlib으로 그래프 만들기 2편 시작해 보도록 하겠습니다!

1편은 아래의 링크를 참고해주세요:)

https://wonhwa.tistory.com/30

 

[python/시각화] matplotlib으로 그래프 만들기- 히스토그램, 산점도, 박스그래프

안녕하세요! 오늘은 파이썬 matplotlib라이브러리를 이용해 다양한 종류의 그래프를 만들어 보도록 하겠습니다. 그럼 바로 시작해 보도록 하겠습니다. 데이터 준비 오늘 시각화할 데이터는 kaggle의

wonhwa.tistory.com

 

데이터준비

1편에서 사용한 csv데이터를 준비해 주세요:)

또는 아래의 링크에서 다운받아 주세요.

https://www.kaggle.com/imakash3011/customer-personality-analysis

 

Customer Personality Analysis

Analysis of company's ideal customers

www.kaggle.com

 

다변량 그래프 그리기

다변량 그래프는 변수가 여러 개 있는 그래프입니다.

이번 포스팅에는 변수를 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)
print(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개의 변수를 그래프로 시각화하였습니다.

 

밀집도 그래프

이번에는 '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()

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

전체 코드
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()


####밀집도 그래프#####
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()
코드 파일

ex)matplotlib(2).py
0.00MB

참고 자료
  • 책 Do it! 데이터 분석을 위한 판다스 입문 - 이지스퍼블리싱

 

마무리

저번 편에 이어 matplotlib으로 그릴 수 있는 다른 그래프들을 더 알아보았습니다.

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

데이터 인사이트를 얻기에도 쉬우리라 생각됩니다. ヾ(^▽^*)))

 

++3D 그래프 추가버전 및 기타설정은 아래에서 확인하실 수 있습니다.

https://wonhwa1.blogspot.com/2022/11/python-matplotlib-3d.html

 

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

Matplotlib 그래프 2 1편은 아래에서 확인하실 수 있습니다:) https://wonhwa1.blogspot.com/2022/11/python-matplotlib.html 데이터 준비 1편에서 사용한 csv데이터를 준비해 주세요. 또는 아래의...

wonhwa1.blogspot.com

 

반응형
반응형

안녕하세요!

오늘은 파이썬 matplotlib라이브러리를 이용해 다양한 종류의 그래프를 만들어 보도록 하겠습니다.

그럼 바로 시작해 보도록 하겠습니다.

 

데이터 준비

오늘 시각화할 데이터는 kaggle의 'Customer Personality Analysis' Datasets를 이용하여 그래프를 시각화 해보겠습니다.

아래의 링크에서 csv파일을 다운받아 주세요:)

https://www.kaggle.com/imakash3011/customer-personality-analysis

 

Customer Personality Analysis

Analysis of company's ideal customers

www.kaggle.com

이 데이터는 한 회사 고객들의 구매 정보 및 고객 정보등을 포함하고 있습니다.

각 열의 내용은 아래와 같습니다.

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
MntWines: Amount spent on wine in last 2 years (지난 2년간 와인 구매량)
MntFruits: Amount spent on fruits in last 2 years (지난 2년간 과일 구매량)
MntMeatProducts: Amount spent on meat in last 2 years (지난 2년간 육류 구매량)
MntFishProducts: Amount spent on fish in last 2 years (지난 2년간 수산물 구매량)
MntSweetProducts: Amount spent on sweets in last 2 years (지난 2년간 간식류 구매량)
MntGoldProds: Amount spent on gold in last 2 years (지난 2년간 귀금속 구매량)

그 밖에도 여러 열이 있는데 나머지는 위의 링크에 들어가면 확인할 수 있습니다 :)

 

필요모듈 import 및 폰트설정

오늘의 주인공이자 그래프 생성에 필요한 matplotlib 라이브러리와

데이터 불러오는 데 필요한 pandas 라이브러리를 불러와 줍니다.

그리고 그래프에 한글을 사용하기 위해서 한글 폰트를 설정해 주어야 하기 때문에 폰트설정까지 해 보도록 하겠습니다.

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)

저는 '맑은 고딕'을 한글 폰트로 사용하겠습니다.

다른 폰트를 사용하고 싶다면 변경해 주시면 됩니다.

 

데이터셋 준비

위에서 다운받은 csv파일을 열어 줍니다.

이 csv파일은 ,가 아니라 tab으로 나누어져있어 sep = \t으로 설정하여 열어주어야 합니다.

그후 .head()를 사용하여 데이터 내용을 확인해 보도록 하겠습니다.

#데이터 셋 불러오기
df = pd.read_csv('marketing_campaign.csv',sep='\t')

print(df.head())

출력:

29개의 컬럼으로 데이터가 이루어져 있습니다.

각각 컬럼에 대한 설명은 위를 확인해 주세요.

이제 위의 데이터로 그래프를 만들어 보도록 하겠습니다.

히스토그램 그래프

히스토그램은 도수분포를 그래프화 시킨 건데 보통 변수 1개를 가지고 빈도를 구하여 그래프를 그립니다.

오늘 포스팅에는 고객의 자녀 수를 히스토그램으로 만들어 보도록 하겠습니다.

#############히스토그램##############
#그래프를 그리기 위한 기본 틀 생성
fig = plt.figure()
axes1=fig.add_subplot(1,1,1)

#히스토그램 그래프 만들기(변수1개)
axes1.hist(df['Kidhome'],bins = 8) #가정의 자녀 수 히스토그램 #bins는 x축 칸(간격)조정
#제목설정
axes1.set_title('고객 가정의 자녀 수 히스토그램')
#x축라벨링
axes1.set_xlabel('자녀 수')
#y축라벨링
axes1.set_ylabel('빈도')
plt.show()

위와 같이 히스토그램이 만들어 졌습니다.

데이터프레임으로도 히스토그램을 만들 수 있는데요 방법은 아래와 같습니다.

###다른방법으로 히스토그램
ax = plt.subplots()
ax = df['Kidhome'].plot.hist()
plt.show()

산점도 그리기

이번에는 matplotlib으로 산점도를 생성해보도록 하겠습니다.

산점도는 x,y 값을 점으로 찍어 그래프를 그리는방법인데,

여기서는 간식구매량을 x, 과일구매량을 y로 설정하여 산점도를 생성해 보겠습니다.

#산점도 그리기(변수2개)
scatter_plot = plt.figure()
axes2 = scatter_plot.add_subplot(1,1,1)

axes2.scatter(df['MntSweetProducts'],df['MntFruits'])
#제목설정
axes2.set_title('간식구매량 및 과일구매량 산점도')
#x축라벨링
axes2.set_xlabel('간식구매량')
#y축라벨링
axes2.set_ylabel('과일구매량')

#산점도 그리는 다른 방법
fig2,ax2 = plt.subplots()
ax2 = df.plot.scatter(x='MntSweetProducts',y='MntFruits',ax=ax2)
plt.show()

[산점도 그래프]

[df로 그린 산점도 그래프]

이렇게 2가지 방법으로 산점도를 그려 봤습니다.

 

박스그래프

이제 박스그래프를 그려보도록 하겠습니다.

박스그래프는 이산형 변수와 연속형 변수를 함께 사용하여 그리는데

이산형 변수는 성별의 male, female 과 같이 확실히 구분되는 값을 말하고,

연속형 변수는 구매량과 같은 연속적인 숫자가 있는 범위의 값을 말합니다.

이번에는 데이터의 Education(학력)을 이산형변수로,

Income(수입)을 연속형 변수로 하여 박스그래프를 그려 보도록 하겠습니다.

income값 중에 null인 값이 있어 null을 0으로 대체한 후 그래프를 생성하도록 합니다.

#############박스그래프##############
# box 그래프 그리기(이산형 변수와 연속형 변수를 함께 사용)
# 이산형: 학력
# 연속형: 수입
# df Null값 0으로 대체
df['Income'] = df['Income'].fillna(0)

boxplot = plt.figure()
axes3 = boxplot.add_subplot(1,1,1)
axes3.boxplot([df[df['Education'] == 'Basic']['Income'], 
               df[df['Education'] == 'Graduation']['Income'],
               df[df['Education'] == '2n Cycle']['Income'],
               df[df['Education'] == 'Master']['Income'], 
               df[df['Education'] == 'PhD']['Income']], 
               labels=['고졸','대졸','2nCycle','석사','박사'])

axes3.set_xlabel('학력')
axes3.set_ylabel('수입')
axes3.set_title('학력에 따른 수입 박스그래프')
plt.show()

여기서 Basic은 고등학교 졸업, Graduation은 학사, Master은 석사, PhD는 박사를 의미합니다.

2nCycle(second cycle)은 학사~석사 라고 하는데 석사 과정에 있는 사람을 말하는 것 같습니다.

혹시 2nCycle에대해 아는 분들은 댓글 남겨주세요 ㅎㅎ

그리고 df로도 박스 그래프를 그릴 수 있는데요 그전에 기존df의 피벗팅이 필요합니다.

아래와 같이 필요한 내용만 데이터를 뽑아 주세요.

# df피벗
#교육, 수입부분만뽑기
df_pv=df.iloc[:,0:5]
df_pv = df_pv.drop(['Year_Birth','Marital_Status'],axis=1) #열삭제시 axis=1
print(df_pv.head())

출력:

그 후 피벗을 진행해 줍니다.

#교육상태를 컬럼으로 피벗
df_pv = df_pv.pivot_table(
    index='ID',
    columns='Education',
    values='Income')
print(df_pv.head())

출력:

이제 다시 박스 그래프로 시각화 해보도록 하겠습니다.

#df로 박스그래프 만들기
fig3,ax3 = plt.subplots()
ax3 = df_pv.plot.box(ax= ax3)
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')

print(df.head())

#############히스토그램##############
#그래프를 그리기 위한 기본 틀 생성
fig = plt.figure()
axes1=fig.add_subplot(1,1,1)

#히스토그램 그래프 만들기(변수1개)
axes1.hist(df['Kidhome'],bins = 8) #가정의 자녀 수 히스토그램 #bins는 x축 칸(간격)조정
#제목설정
axes1.set_title('고객 가정의 자녀 수 히스토그램')
#x축라벨링
axes1.set_xlabel('자녀 수')
#y축라벨링
axes1.set_ylabel('빈도')
#plt.show()

###다른방법으로 히스토그램
ax = plt.subplots()
ax = df['Kidhome'].plot.hist()
#plt.show()

#############산점도##############
#산점도 그리기(변수2개)
scatter_plot = plt.figure()
axes2 = scatter_plot.add_subplot(1,1,1)

axes2.scatter(df['MntSweetProducts'],df['MntFruits'])
#제목설정
axes2.set_title('간식구매량 및 과일구매량 산점도')
#x축라벨링
axes2.set_xlabel('간식구매량')
#y축라벨링
axes2.set_ylabel('과일구매량')


#산점도 그리는 다른 방법
fig2,ax2 = plt.subplots()
ax2 = df.plot.scatter(x='MntSweetProducts',y='MntFruits',ax=ax2)
#plt.show()

#############박스그래프##############
# box 그래프 그리기(이산형 변수와 연속형 변수를 함께 사용)
# 이산형: 학력
# 연속형: 수입
# df Null값 0으로 대체
df['Income'] = df['Income'].fillna(0)

boxplot = plt.figure()
axes3 = boxplot.add_subplot(1,1,1)
axes3.boxplot([df[df['Education'] == 'Basic']['Income'], 
               df[df['Education'] == 'Graduation']['Income'],
               df[df['Education'] == '2n Cycle']['Income'],
               df[df['Education'] == 'Master']['Income'], 
               df[df['Education'] == 'PhD']['Income']], 
               labels=['고졸','대졸','2nCycle','석사','박사'])

axes3.set_xlabel('학력')
axes3.set_ylabel('수입')
axes3.set_title('학력에 따른 수입 박스그래프')
#plt.show()

#df으로 box plot 그리기

# df피벗
#교육, 수입부분만뽑기
df_pv=df.iloc[:,0:5]
df_pv = df_pv.drop(['Year_Birth','Marital_Status'],axis=1) #열삭제시 axis=1
print(df_pv.head())

#교육상태를 컬럼으로 피벗
df_pv = df_pv.pivot_table(
    index='ID',
    columns='Education',
    values='Income')
print(df_pv.head())

fig3,ax3 = plt.subplots()
ax3 = df_pv.plot.box(ax= ax3)
plt.show()
코드파일

ex_matplotlib(1).py
0.00MB

참고자료
  • 책 Do it! 데이터 분석을 위한 판다스 입문 - 이지스퍼블리싱
마무리

오늘은 matplotlib로 그래프 그리는 방법을 알아보았는데요

다음 시간에는 matplotlib 2편으로 다른 그래프들도 그려보도록 하겠습니다!

궁금한 점은 댓글로 알려주세요:)

 

++ 파이그래프 추가한 글은 아래에서 확인하실 수 있습니다.

https://wonhwa1.blogspot.com/2022/11/python-matplotlib.html

 

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

Matplotlib이란? matplotlib은 python에서 데이터 시각화를 도와주는 라이브러리입니다. 그럼 matplotlib을 이용해 다양한 종류의 그래프를 바로 그려 보도록 하겠습니다. 데이터 준비 오늘 시각화할 데이

wonhwa1.blogspot.com

 

반응형
반응형

안녕하세요! 오늘은 bar-chart-race(직역하면 막대그래프 경주)를 이용해서 시각화 하는 방법을 알려드리려고 합니다.

예제로 EPL 영국 프리미어 축구 리그 데이터를 활용하여 bar-chart-race 시각화를 해 보도록 하겠습니다.

 

step1. 필요한 데이터 준비

이번에 사용할 데이터는  영국 프리미어 축구 리그 EPL의 2010년부터 2021년까지의 데이터입니다.

데이터에는 각 팀의 시즌별 순위 및 득점 정보가 나와 있습니다.

데이터는 Kaggle에서 받을 수 있습니다.

여기를 클릭하여 EPL Standings 2010-2021.csv를 받아 주세요 :)

링크를 클릭하면 위와 같은 화면이 나타나는데 다운로드를 클릭하시면 데이터셋이 저장됩니다.

step2. FFmpeg 설치하기

다음으로 bar-chart-race를 구동할 때 필요한 FFmpeg를 설치하여 줍니다.

https://ffmpeg.org/download.html#build-windows

 

Download FFmpeg

If you find FFmpeg useful, you are welcome to contribute by donating. More downloading options Git Repositories Since FFmpeg is developed with Git, multiple repositories from developers and groups of developers are available. Release Verification All FFmpe

ffmpeg.org

위에 링크를 클릭한 후, 

파란 윈도우 아이콘 선택 후 Windows builds from gyan.dev를 클릭하여 줍니다.

그럼 위와 같은 화면이 나타납니다. 최신 버전을 사용하여도 되지만 안정적인 버전을 다운받아보도록 하겠습니다.

ffmpeg-4.4.1-full_build.7z를 클릭하여 다운받아주세요.

다운 받은 압축 파일을 압축 해제해 주세요. 저는 Program Files라는 곳에 파일을 이동시켜 압축해제 하였습니다.

압축 해제한 ffmpeg-4.4.1-full_build 폴더 이름은 ffmpeg으로 변경해 주세요.

그 후 ffmpeg> bin에 ffmpeg.exe, ffplay.exe, ffprobe.exe 가 있으면 준비는 거의 다 되었습니다.

윈도우 검색창에 시스템 환경 변수 편집을 타이핑하고 클릭하여 주세요.

위의 창에서 환경 변수를 클릭하여 줍니다.

user에 대한 사용자 변수 > Path > 편집을 클릭하여 주세요.

새로 만들기 > ffmpeg.exe 가 있는 주소 입력 > 확인을 차례대로 눌러주세요.

그 후 나머지 창들도 확인을 클릭하여 창을 닫아줍니다.

다음으로, windows + R 키를 누른 후 cmd를 입력후 엔터하여 명령 창을 열어 줍니다.

나오는 창에 ffmpeg을 쳤을때 위와 같이 나오면 잘 설치가 되었다는 뜻입니다. :)

step3. bar_chart_race 모듈 다운받기
pip install bar_chart_race

위의 코드를 아나콘다 프롬프트에서 실행해 bar_chart_race를 다운 받습니다.

기본적인 bar_chart_race에는 image label 기능이 없기 때문에 bar_chart_library에 기능이 추가된 파일로 교체하도록 하겠습니다.

https://github.com/andresberejnoi/bar_chart_race/tree/image_labels

 

GitHub - andresberejnoi/bar_chart_race: Create animated bar chart races in Python with matplotlib

Create animated bar chart races in Python with matplotlib - GitHub - andresberejnoi/bar_chart_race: Create animated bar chart races in Python with matplotlib

github.com

위의 사이트에 들어간 후,

Code 클릭 > Download ZIP을 클릭하여 파일을 다운 받은 후 압축을 풀어 줍니다.

bar_chart_race-image_labels > bar_chart_race에서 빨간 박스의 모든 .py파일을 복사해 주세요.

그 후 user > anaconda3 > Lib > site-packages > bar_chart_race 안에 복사한 파일을 아래와 같이 붙여주세요.

드디어 bar_chart_race를 사용하기 위한 모든 준비를 마쳤습니다.

step4. 데이터 전처리하기

처음에 다운받은 EPL Standings 2010-2021.csv를 전처리하여 bar_chart_race에 맞는 데이터로 바꾸어 봅시다.

#필요한 모듈 불러오기
#!pip install bar_chart_race as bcr
import pandas as pd
import numpy as np
import bar_chart_race as bcr
#필요한 데이터 셋 불러오기
# 주의할 점: 주소에 \를 //로 바꿔줄 것!
path = "C://Users//user//Desktop//blog//code//EPL_Standings_2010_2021.csv"
EPL = pd.read_csv(path)

# 요약출력
EPL.head()

파일 주소를 입력 할 때는 \//로 바꾸어 주세요. 그대로 복사 붙여넣기 하면 오류가 납니다.

출력:

위와 같이 파일의 내용이 나옵니다. 우리는 여기서 Season, Team, Pts(전체 포인트)만 사용하겠습니다.

# 필요한 데이터만 남기고 지우기
EPL = EPL[['Season','Team','Pts']]
EPL.head()

그러면 위와 같이 3개의 컬럼만 남습니다.

그 후 프리미어 축구 팀을 열로, 점수를 값으로 하여 피봇팅 해 주겠습니다.

#데이터를 알맞은 포맷으로 변형하기 - 피봇팅
df = EPL.pivot_table(values='Pts', index = ['Season'],columns='Team')
df.head()

결과를 보니 NaN값이 많이 있습니다. NaN이 있으면 점수 계산이 안되기 때문에 NaN 값을 0으로 바꾸어 주겠습니다.

# NaN값 0으로 바꾸어 주기
df.fillna(0,inplace=True)
df.sort_values(list(df.columns), inplace=True)
df = df.sort_index()
df.head()

어느 팀이 시간에 따라 제일 잘했는지 시각화하기 위해서는 시즌별 점수가 누적이 되어 나타나야 합니다.

예를 들어, 1시즌이 12점, 2시즌이 25점일 때, 표로는 1시즌 : 12, 2시즌: 12+25 = 37 ... 이런식으로 누적으로 표현되어야 bar_chart_race를 그릴 수 있습니다.

때문에 각 열의 값을 누적값으로 바꾸어 주겠습니다.

# 누적데이터로 각 축구팀의 데이터 값 바꾸기
df.iloc[:,0:-1] = df.iloc[:, 0:-1].cumsum()
df.head()

이렇게 누적 값이 만들어졌습니다.

이 파일에는 37개의 축구 클럽이 있는데 그중 시즌 별로 상위 10위 클럽만 남기고 나머지 팀은 정리하도록 하겠습니다.

# 37개의 클럽 중 시즌 별 top 10 클럽만 남기고 다른 데이터는 지우기
top_10_clubs= set()
for index, row in df.iterrows():
    top_10_clubs |= set(row[row>0].sort_values(ascending=False).head(10).index)

df = df[top_10_clubs]
df.head()

대략 20개의 팀으로 줄었습니다.

step 5. bar_chart_race 만들기

위에서 전처리한 데이터를 가지고 bar_chart_race를 그려보겠습니다.

우선 각 팀별 막대 그래프에 이미지를 추가해 주기 위해 지금 작성하고 있는 코드가 있는 폴더 안에 각 축구팀의 이미지를 추가하도록 하겠습니다.

그림 파일은 제가 미리 준비를 하였으니 아래의 파일을 다운받은 후 압출을 풀어 주세요.

bar_image_labels.zip
4.02MB

이때 주의할 점은 사진 이름이 df 파일에 있는 컬럼 명과 정확히 일치하여야 하고, png 파일이어야 합니다.

그리고 반드시 현재 작성하고 있는 코드와 같은 폴더에 위치시켜 주세요.

#bar chart race 그리기
bcr.bar_chart_race(df = df,
                   n_bars = 10,
                   sort='desc',
                   img_label_folder="bar_image_labels",
                   steps_per_period = 50,
                   title = 'TOP 10 EPL clubs(2010-2021)') #)#'TOP 6 TEAM in PL(1992-2017)'
                   #,filename = 'epl_10_clubs.mp4') #차트 레이스를 동영상으로 저장하고 싶을 때 사용

 

여기서 n_bars는 화면에 표시할 막대의 갯수, title은 제목, 그리고 파일을 저장하고 싶다면 file='파일이름.mp4'를 작성해 주시면 됩니다. :)

전체 코드
#필요한 모듈 불러오기
#!pip install bar_chart_race as bcr
import pandas as pd
import numpy as np
import bar_chart_race as bcr

#필요한 데이터 셋 불러오기
# 주의할 점: 주소에 \를 //로 바꿔줄 것!
path = "C://Users//user//Desktop//blog//code//EPL_Standings_2010_2021.csv"
EPL = pd.read_csv(path)

# 요약출력
EPL.head()

# 필요한 데이터만 남기고 지우기
EPL = EPL[['Season','Team','Pts']]
EPL.head()

#데이터를 알맞은 포맷으로 변형하기 - 피봇팅
df = EPL.pivot_table(values='Pts', index = ['Season'],columns='Team')
df.head()

# NaN값 0으로 바꾸어 주기
df.fillna(0,inplace=True)
df.sort_values(list(df.columns), inplace=True)
df = df.sort_index()
df.head()

# 누적데이터로 각 축구팀의 데이터 값 바꾸기
df.iloc[:,0:-1] = df.iloc[:, 0:-1].cumsum()
df.head()

# 37개의 클럽 중 시즌 별 top 10 클럽만 남기고 다른 데이터는 지우기
top_10_clubs= set()
for index, row in df.iterrows():
    top_10_clubs |= set(row[row>0].sort_values(ascending=False).head(10).index)

df = df[top_10_clubs]
df.head()

#bar chart race 그리기
bcr.bar_chart_race(df = df,
                   n_bars = 10,
                   sort='desc',
                   img_label_folder="bar_image_labels",
                   steps_per_period = 50,
                   title = 'TOP 10 EPL clubs(2010-2021)') #)#'TOP 6 TEAM in PL(1992-2017)'
                   #,filename = 'epl_10_clubs.mp4') #차트 레이스를 동영상으로 저장하고 싶을 때 사용
코드 파일

Bar_chart_race_EPL.ipynb
1.08MB

마무리

오늘 이렇게 움직이는 그래프를 그려 보았는데요 한국어 자료가 거의 없어 여러 외국 사이트를 참고하고 

bar_chart_race를 사용하기 위한 설치 작업이 많아 시간이 오래 걸렸네요. 

그래도 만들고 결과를 보니 재밌었습니다.

다음에는 API를 이용하여 코로나 확진자 관련 그래프를 그려도 좋을 것 같다는 생각이 듭니다 ㅎㅎ

질문이나 좋은 의견이 있으면 댓글로 남겨주세요 :-)

 

++22.07.04 ffmpeg 설치방법 수정 완료.

반응형
반응형

최근 matplotlib을 이용하여 그래프를 3D로 그리는 방법은 없냐고 문의가 와서 간단한 예제를 준비해 보았다.

그래프는 여러 종류가 있지만 막대 그래프를 그리는 예제가 찾기 어려워

대표적으로 막대그래프를 그리는 코드를 짜 보았다.

코드
### 3D 그래프 만들기 ###
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

# 그래프 프레임 생성
fig = plt.figure()

# 축 생성 
ax1 = fig.add_subplot(projection = '3d')

# x, y, z값 
xpos = ypos = [1,2,3,4,5,6]
zpos = [0, 0, 0, 0, 0, 0]

# delta x, y, z 값
dx = np.ones(6)
dy = np.ones(6)
dz = [1,2,3,4,5,6]

#그래프 만들기
ax1.bar3d(xpos,ypos,zpos,dx,dy,dz) #,color='#00ceaa'(초록색) 기본값은 파란색

#그래프 보여주기
plt.show()
출력

이렇게 기본적인 파란색 막대 그래프가 출력이 되었다 :)

반응형

+ Recent posts