๊ด€๋ฆฌ ๋ฉ”๋‰ด

ruriruriya

[Python] ํŒŒ์ด์ฌ ๋งทํ”Œ๋กฏ๋ฆฝ(Matplotlib) - ๋ง‰๋Œ€๊ธฐ ๋ฐ” ์ฐจํŠธ(Bar Charts) ๋ณธ๋ฌธ

๐ŸPython/Matplotlib

[Python] ํŒŒ์ด์ฌ ๋งทํ”Œ๋กฏ๋ฆฝ(Matplotlib) - ๋ง‰๋Œ€๊ธฐ ๋ฐ” ์ฐจํŠธ(Bar Charts)

๋ฃจ๋ฆฌ์•ผใ…‘ 2023. 11. 20. 23:31
๋ฐ˜์‘ํ˜•

Matplotlib๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ง‰๋Œ€ ์ฐจํŠธ(Bar Chart)๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์ฃผ๋กœ plt.bar() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฅผ ๋ง‰๋Œ€๋กœ ์‹œ๊ฐํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. 

์šฐ์„  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ์ž„ํฌํŠธ(import) ํ•ด์ค€๋‹ค.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sb

์ด๋ฒˆ์—” csv ์‹ค์ œ ํฌ์ผ“๋ชฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์„ ๋งŒ๋“ค์–ด ํ™œ์šฉํ•ด๋ณธ๋‹ค.

>> df = pd.read_csv('../data/pokemon.csv')
>> df

๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„ describe() ํ•จ์ˆ˜๋กœ ์ •๋ณด๋ฅผ ํ™•์ธํ•ด๋ณด๋‹ˆ
generation_id๋Š” ๋ฐ์ดํ„ฐ ๊ฐ’์ด ์ค‘๋ณต๋˜๋Š” ๊ฑธ ํ™•์ธํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.
์ด ์ฒ˜๋Ÿผ ์ค‘๋ณต๋˜๋Š” ๋ฐ์ดํ„ฐ ๊ฐ’์ด ์žˆ๋Š” ๊ฒƒ์„ ์นดํ…Œ๊ณ ๋ฆฌ์ปฌ ๋ฐ์ดํ„ฐ(Categorical Data)๋ผ๊ณ  ํ•œ๋‹ค.

>> df.describe()

 

nunique() ํ•จ์ˆ˜์™€ unique() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์นดํ…Œ๊ณ ๋ฆฌ์ปฌ ๋ฐ์ดํ„ฐ ๊ฐฏ์ˆ˜์™€ ์–ด๋–ค ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  generation_id ์ปฌ๋Ÿผ์˜ value_counts๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์•„์ด๋”” ๋ณ„๋กœ ์บ๋ฆญํ„ฐ๊ฐ€ ๋ช‡๊ฐœ ์”ฉ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

>> df['generation_id'].nunique()
7
>> df['generation_id'].unique()
array([1, 2, 3, 4, 5, 6, 7], dtype=int64)
>> # ๊ฐ ์ œ๋„ˆ๋ ˆ์ด์…˜ ์•„์ด๋””๋ณ„๋กœ, ์บ๋ฆญํ„ฐ๊ฐ€ ๋ช‡ ๊ฐœ์”ฉ ์žˆ๋Š” ๊ฒƒ์ธ๊ฐ€?
>> df['generation_id'].value_counts()
generation_id
5    156
1    151
3    135
4    107
2    100
7     86
6     72
Name: count, dtype: int64

 

seaborn ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ž€

Seaborn์€ ํŒŒ์ด์ฌ์˜ ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘ ํ•˜๋‚˜๋กœ, Matplotlib์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ์ง€๋งŒ ๋” ๊ฐ„ํŽธํ•˜๊ณ  ๋ฉ‹์ง„ ์‹œ๊ฐํ™”๋ฅผ ์œ„ํ•œ ๊ณ ์ˆ˜์ค€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

Seaborn์€ ํ†ต๊ณ„ ๊ทธ๋ž˜ํ”ฝ์Šค๋ฅผ ์œ„ํ•œ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ๋“ค์„ ์ œ๊ณตํ•˜๋ฉฐ, ํŠนํžˆ ํ†ต๊ณ„ ๋ชจ๋ธ์˜ ์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•œ ๊ทธ๋ž˜ํ”ฝ ๊ธฐ๋ฒ•๋“ค์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค. ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ฆด ๋•Œ ์ง๊ด€์ ์ด๊ณ  ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” API๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™” ์ž‘์—…์„ ๋”์šฑ ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค์–ด ์ค€๋‹ค.

 

Seaborn ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ secountplot ํ•จ์ˆ˜

Seaborn์˜ countplot() ํ•จ์ˆ˜๋Š” ๋ฒ”์ฃผํ˜• ๋ฐ์ดํ„ฐ์˜ ๋นˆ๋„๋ฅผ ์‹œ๊ฐํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ์˜ ๊ฐ ๋ฒ”์ฃผ์— ์†ํ•˜๋Š” ๊ด€์ธก์น˜์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ง‰๋Œ€ ๊ทธ๋ž˜ํ”„๋กœ ๋‚˜ํƒ€๋‚ด๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

ํŠน์ • ์ปฌ๋Ÿผ์ด ์นดํ…Œ๊ณ ๋ฆฌ์ปฌ ๋ฐ์ดํ„ฐ์ผ ๋•Œ,
๊ฐ ํ…Œ์ดํ„ฐ๊ฐ€ ๋ช‡๊ฐœ ์”ฉ ์žˆ๋Š”์ง€๋ฅผ ์ฐจํŠธ๋กœ ๋‚˜ํƒ€๋‚ด๊ณ  ์‹ถ์œผ๋ฉด
serborn์˜ countplot ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

data ์†์„ฑ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๊ผญ ๋ช…์‹œํ•ด์•ผํ•œ๋‹ค.
์ด๋ ‡๊ฒŒ ํ•จ์ˆ˜๋‚ด์— ์†์„ฑ๊ณผ ์†์„ฑ๊ฐ’์„ ์ž…๋ ฅํ•˜๊ณ  show() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด 
์•„๋ž˜์ฒ˜๋Ÿผ ์•Œ๋ก๋‹ฌ๋กํ•œ ๋ฐ” ์ฐจํŠธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

>> sb.countplot(data= df, x='generation_id' ) # data ์†์„ฑ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ผญ ๋ช…์‹œ
>> plt.show()

๋ฐ” ์ปฌ๋Ÿฌ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•

seaborn ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ํฌํ•จ๋œ color_palette() ํ•จ์ˆ˜๋Š” ์ปฌ๋Ÿฌ ํŒ”๋ ˆํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๋ฏธ๋ฆฌ ์ •์˜๋œ ์ปฌ๋Ÿฌ ํŒ”๋ ˆํŠธ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. ์ด ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ๊ฐํ™”ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ปฌ๋Ÿฌ๋“ค์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํŒ”๋ ˆํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ๋กœ ์ปฌ๋Ÿฌ ํ™•์ธ์„ ํ•œ ๋‹ค์Œ

>> sb.color_palette()

base_color ๋ณ€์ˆ˜์— ์ปฌ๋Ÿฌ ์ธ๋ฑ์Šค๋ฅผ ์ง€์ •ํ•˜์—ฌ ๋„ฃ์–ด์ค€๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์•„๊นŒ ์‚ฌ์šฉํ•œ countplot ํ•จ์ˆ˜ ์†์„ฑ์— color๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

๊ทธ๋Ÿผ ์•„๋ž˜์ฒ˜๋Ÿผ ์›ํ•˜๋Š” ์ƒ‰์ƒ์œผ๋กœ ๋ฐ”๋€๋‹ค.

>> base_color = sb.color_palette()[4]
>> sb.countplot(data= df, x='generation_id' , color = base_color)
>> plt.show()

๋ฐ์ดํ„ฐ ๊ฐ’ ๋†’๊ณ  ๋‚ฎ์€ ์ˆœ์„œ๋Œ€๋กœ ๋ฐ”๊พธ๊ธฐ

์ œ๋„ˆ๋ ˆ์ด์…˜ ์•„์ด๋”” ์ปฌ๋Ÿผ์— value_count() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ทธ ๋‹ค์Œ index ์ˆœ์„œ๋ฅผ ํ™•์ธํ•œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ํ™•์ธํ•œ ๊ฒƒ์„ ๋ณ€์ˆ˜์— ๋„ฃ์–ด ์ค€ ๋‹ค์Œ
order ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ด์„œ ๋ฐ์ดํ„ฐ ์ˆœ์„œ๊ฐ€ ๋†’์€ ์ˆœ์œผ๋กœ ๋ฐ”๋€Œ์—ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

>> base_order= df['generation_id'].value_counts().index
>> base_order
Index([5, 1, 3, 4, 2, 7, 6], dtype='int64', name='generation_id')
>> sb.countplot(data= df, x='generation_id' , color = base_color, order=base_order) 
>> plt.show()

์—ญ์ˆœ์œผ๋กœ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•์€ ํŒŒ์ด์ฌ์˜ reversed()ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‰ฝ๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

>> base_order=list(reversed(base_order)) 
>> sb.countplot(data= df, x='generation_id' , color = base_color, order=base_order) 
>> plt.show()

y์ขŒํ‘œ๋กœ ๊ฐ€๋กœ ๋ฐ” ์ฐจํŠธ ๋งŒ๋“ค๊ธฐ

๋จผ์ € ํ•ด๋‹น ์ปฌ๋Ÿผ์˜ ๋ฐ์ดํ„ฐ๋ณ„ ๊ฐฏ์ˆ˜๋ฅผ ํ™•์ธํ•œ ํ›„ ๋ณ€์ˆ˜์— ๋„ฃ๋Š”๋‹ค.

>> df['type_1'].value_counts()
>> base_order2= df['type_1'].value_counts().index
type_1
water       114
normal      105
grass        78
bug          72
fire         53
psychic      53
rock         46
electric     40
poison       34
ground       32
dark         29
fighting     29
ghost        27
dragon       27
steel        24
ice          23
fairy        18
flying        3
Name: count, dtype: int64

๊ทธ๋ฆฌ๊ณ  x ๋Œ€์‹  y๋กœ ๋ฐ”๊พธ๊ณ  order ํ•จ์ˆ˜์—๋„ ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.
๊ทธ๋ ‡๊ฒŒ ๊ฐ€๋กœ ๋ฐ” ํ˜•ํƒœ๋กœ ์ฐจํŠธ๋ฅผ ์™„์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค!

>> sb.countplot(data= df, y='type_1', order = base_order2)
>> plt.xticks(rotation = 0)
>> plt.title('TYPE 01')	# ์ฐจํŠธ ์ œ๋ชฉ์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜
>> plt.xlabel('COUNT')	# X์ถ• ๋ผ๋ฒจ์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜
>> plt.ylabel('TYPE 1')	# y์ถ• ํ•˜๋ฒจ์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜
>> sb.set(rc={"figure.figsize": (15,8)}) # seaborn ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์‚ฌ์ด์ฆˆ ๋น„์œจ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜
>> plt.show()

 

๋ฐ˜์‘ํ˜•