코딩하는 타코야끼

[Matplotlib] 3강_각종 그래프 그리기_( pie( ), hist( ), boxplot( ) ) 본문

[T.I.L] : Today I Learned/Matplotlib

[Matplotlib] 3강_각종 그래프 그리기_( pie( ), hist( ), boxplot( ) )

가스오부시 2023. 5. 11. 02:48
728x90
반응형

1. 파이차트 그리기


📍 파이차트

  • 각 범주(Category)가 데이터에서 차지하는 비율을 나타내는데 사용
  •  pie(x, labels)  이용
    • x: 값 (값들을 100을 기준으로 비율을 계산해 크기 설정)
    • labels : 값들의 label
    • autopct: 조각내에 표시될 비율의 문자열 형식. '%fmt문자'
      • fmt문자: f(실수), d(정수), %% (%)

🌓 시각화

tall = 180.43
weight = 74.23

print(f'{tall},{weight}')
print('{}, {}'.format(tall, weight))
print('%.2f%%, %f' % (tall, weight)) # 타입: %f - 실수, %d - 정수, %s - 문자열
>>>
180.43,74.23
180.43, 74.23
180.43%, 74.230000
import numpy as np
import matplotlib.pyplot as plt
labels = ['사과', '배', '수박', '귤', '복숭아']
counts = [20, 10, 50, 40, 30]

plt.figure(figsize = (7, 7))
# pie(수량, 라벨)
plt.pie(counts, labels = labels,
       autopct='%.2f%%', # 소수점 2자리수 까지, f 는 실수, %% 는 %
        shadow = True,
       explode = [0,0,0.2,0,0.2])

plt.show()

plt.figure(figsize = (7, 7))
wedge, texts, autopcts = plt.pie(counts, 
                               #    labels = labels, # pie chart 그릴때 label을 빼고 legend()에 설정.
                                   autopct='%.2f%%', # 소수점 2자리수 까지, f 는 실수, %% 는 %
                                   shadow = True,
                                   explode = [0,0,0.2,0,0.2])

# label을 범례로 빼기
plt.legend(wedge, labels, # wedge > color
          bbox_to_anchor = (1,1), loc = 'upper left',
          title = '과일')

plt.show()

 

🌓  파이차트 활용

  • 한국 웹브라우저 점유율을 파이차트로 작성
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    
    df = pd.read_excel('../data/webbrowser_share.xls', parse_dates = [0], index_col = 0)
    df.shape
    
    # 2018.08 월 브라우져 점유율 - pie chart
    plt.pie(df.iloc[0]);
    

etc = df[df.columns[6:]].sum(axis = 1)
etc
>>>
date
2018-08-01    1.68
2018-09-01    1.00
2018-10-01    1.14
2018-11-01    0.98
2018-12-01    1.17
2019-01-01    1.10
2019-02-01    1.00
2019-03-01    1.11
2019-04-01    1.27
2019-05-01    1.75
2019-06-01    2.23
2019-07-01    2.65
dtype: float64
# web_df.loc['2018-08'] # pie chart 수량
# web_df.columns # labels
web_df = df[df.columns[:6]].copy()
wedge, _, _ = plt.pie(web_df.loc['2018-08-01'], autopct = '%.2f%%', shadow = True,
                     pctdistance = 1.12,
                     textprops = {'fontsize':7, 'color':'blue', 'fontweight':'bold'})

plt.legend(wedge, web_df.columns,
          bbox_to_anchor = (1,1), loc = 'upper left')

plt.show()


2. 히스토그램(Histogram) 그리기


📍 히스토그램

  • 도수 분포표를 그래프로 나타낸 것.
    • 도수분포표: 연속형 자료를 특정 구간(bin)으로 나눠 그 빈도를 나타낸 표
      • 빈도 확인이나 분포를 볼때 사용한다.
    • X축: 계급(변수구간)의 대표값, Y축: 빈도수
  •  hist(data [, bins=계급개수)  메소드를 사용
    • data: 연속형 값들을 원소로하는 1차원 자료구조.
data = np.random.normal(100, 10, 1000) # 평균: 100, 표준편차: 10 정규분포를 따르는 난수 1000개.
v, cnt = np.unique(data, return_counts=True) # 고유값과 개수
plt.hist(data, bins=30)
plt.show()


📍 히스토그램 활용

  • tips.csv
    • 식당에서 팁을 지불한 손님의 정보를 모아둔 데이터 셋
    df = pd.read_csv('../data/tips.csv')
    df.shape
    >>>
    (244, 7)
    
    df.info()
    >>>
    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 244 entries, 0 to 243
    Data columns (total 7 columns):
     #   Column      Non-Null Count  Dtype  
    ---  ------      --------------  -----  
     0   total_bill  244 non-null    float64
     1   tip         244 non-null    float64
     2   sex         244 non-null    object 
     3   smoker      244 non-null    object 
     4   day         244 non-null    object 
     5   time        244 non-null    object 
     6   size        244 non-null    int64  
    dtypes: float64(2), int64(1), object(4)
    memory usage: 13.5+ KB
    

🌓  total_bill 의 분포를 시각화

df['total_bill'].value_counts()
>>>
13.42    3
13.81    2
15.98    2
17.92    2
10.07    2
        ..
24.71    1
21.16    1
28.97    1
22.49    1
18.78    1
Name: total_bill, Length: 229, dtype: int64
plt.hist(df['total_bill'], bins=30)
plt.show()

 

        🌓  흡연여부

result = df['smoker'].value_counts()
plt.bar(result.index, result)
plt.show()

df['smoker'].value_counts().plot(kind='bar')
plt.show()

3. 상자그래프(Boxplot) 그리기


📍  상자그래프란

  • 연속형 값들의 사분위수, 극단값들을 이용해 값들의 분포를 시각화한다.
  •  boxplot(x, whis=1.5) 
    • x: 데이터셋
    • whis: 극단치 계산시 사용할 값(기본 1.5)
      • IQR을 이용해 극단치 계산하기

 

 

  • 상자 그래프
    • 정상 범위내의 최대값 / 3분위 / 2분위 = 중위값 / 정상범위 : 표의 최솟값
import numpy as np

data = np.random.randint(1, 100, 1000) # 1 ~ 99 사이의 정수 1000개를 1차원 배열에 묶어서 반환.
data[:5] = [200,250, -50, -60, -80]
data.shape
>>>
(1000,)
## plt.boxplot(data, whis = 3) # IQR * 1.5 = > IQR * 3
plt.boxplot(data, whis = 1) # IQR * 1.5 = > IQR * 4
plt.show


📍 상자그래프 활용

  • tips_df 에서 tip의 분포를 상자그래프로 확인
import pandas as pd
tips = pd.read_csv('../data/tips.csv')
tips.shape
>>>
(244, 7)
tips

plt.boxplot(tips['tip'], labels = ['팁'])
plt.ylabel('Tip(Dollar)')
# plt.xticks([1], labels = ['팁']) 이것 대신 위에 labels = ['팁']으로 대처 가능.
plt.xticks([1], labels = ['팁'])
plt.show()

  • 남녀별 tip의 분포를 하나의 boxplot에서 그려 비교
  • 한 그래프에서 여러 데이터셋의 boxplot을 그리기.
    • 2차원 배열형태의 구조로로 데이터를 제공
    • 행(axis=0) 별로 그래프를 그린다.
tips['sex'].value_counts()
>>>
Male      157
Female     87
Name: sex, dtype: int64
male_tip = tips.loc[tips['sex'] == 'Male', 'tip']
female_tip = tips.loc[tips['sex'] == 'Female', 'tip']

plt.boxplot([male_tip, female_tip], labels =['남성', '여성'])
plt.xlabel('성별')
plt.ylabel('Tip(Dollar)')

# plt.axis('off')
plt.show()

반응형