Data_Analysis_Track_33/Python

Python_matplotlib_03(각종 그래프 그리기)

lsc99 2023. 9. 21. 17:38

4. 파이차트 그리기

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

 

import matplotlib.pyplot as plt
label = ['사과', '배', '복숭아', '귤']
amount = [20, 10, 50, 20]

plt.pie(amount
        ,labels = label
        ,autopct = '%.2f%%'
        ,textprops = {'fontsize':10}
        ,explode = [0.1, 0, 0, 0] # '파이조각'을 지정한 크기만큼 뽑아준다. -> 강조의 의미로 사용할 수 있다.
        ,shadow = True
       )


plt.show()

 

 

 

xls와 같은 오래된 파일을 불러오는데 오류가 발생할 경우 pip install xlrd 실행

!pip install xlrd

 

pd.options.display.max_columns = 25 # 조회시 열 개수 25개까지 확장

 

파일 불러오기

df = pd.read_excel('data/webbrowser_share.xls'
                   ,index_col = 'date'
                   ,converters = {'date':str} # 특정 컬럼을 어떤 타입으로 읽을지 설정. (생략시 알아서 타입 변환)
                   
                  )
df.shape

 

점유율이 너무 낮아 기타로 묶을 column들을 기타로 만든다.

# 점유율이 미미한 브라우저들은 묶어서 기타로 만들어준다.
# df.iloc[:,:6] # iloc, loc index는 slicing이 가능하다.
cols = df.columns
cols
web_df = df[cols[:6]].copy()
web_df

 

점유율이 낮은 column들의 점유율 수치를 모두 합쳐 etc라는 열로 추가

# 6번 index의 column부터 모두 하나의 열으로 만들어 etc라는 이름의 열로 저장
web_df['etc'] = df[cols[6:]].sum(axis=1) # axis = 1 -> 행단위로 sum 계산

 

web_df로 etc라는 새로운 열을 확인한다.

web_df

 

# 2018.08 점유율
plt.figure(figsize = (10,10))
plt.pie(web_df.loc['2018.08']
        ,labels = web_df.columns
        ,autopct = '%.2f%%'
        ,textprops = {'fontsize':10}
        ,pctdistance = 0.8 # 원의중심부(0)에서 원의 끝부분(1)까지의 비율중 pct text를 어디에 위치시킬지 지정
        ,labeldistance = 1.15 # 라벨 text의 위치. 중심점 : 0, 경계선 : 1
       )


plt.show()

 

wedge를 활용하여 legend -> 가독성이 좋아진다. (확인하기 쉬워진다.)

# label을 legend로 처리.
plt.figure(figsize = (7,7))
# wedge : pie조각객체들
# texts : 라벨과 그 위치 -> text객체
# autotexts : 퍼센트 문자열들과 위치 -> text객체
wedge, texts, autotexts = plt.pie(web_df.loc['2018.08']
                                 ,autopct = '%.2f%%'
                                 ,textprops = {'fontsize':10}
                                )

plt.legend(wedge
           ,web_df.columns # wedge 활용
           ,bbox_to_anchor = (1, 0.9)
           ,loc = 'upper left'
           ,title = '웹브라우저'
           ,fontsize = 10
          )
plt.show()

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

  • 5.1 히스토그램
  • 도수 분포표를 그래프로 나타낸 것.
        - 도수분포표: 연속형 자료를 특정 구간(bin)으로 나눠 그 빈도를 나타낸 표
            - 빈도 확인이나 분포를 볼때 사용한다.
        - X축: 계급(변수구간)의 대표값, Y축: 빈도수
  • hist(data [, bins=계급개수) 메소드를 사용
        - data: 리스트형의 객체를 전달한다.

 

데이터셋 가져오기

import pandas as pd

dia = pd.read_csv('data/diamonds.csv')
dia.info()

 

price 컬럼에 대하여 도수분포표 및 시각화

dia['price'].value_counts()

 

연속형 -> 범주형

price_cate = pd.cut(dia['price'], bins = [300, 5000, 10000, 20000], labels = ['저가', '중가', '고가'])
price_cate

 

범주형 -> count

cnt = price_cate.value_counts() # 도수분포표(연속형->범주형->count)
cnt

 

시각화

# 도수 분포표의 시각화 -> 히스토그램
plt.bar(cnt.index
        ,cnt      
       )
plt.show()

 

 

 

히스토그램

# 히스토그램
# plt.hist(dia['price'], bins = 3)
plt.hist(dia['price'], bins = [300, 5000, 10000, 20000]) 
# 히스토그램을 그릴 데이터셋 : 연속형값 -> 범위를 기준으로 10분할(등분 -> default) -> 개수 : count
plt.show()

 

  • 5.2 히스토그램 활용
  • tips.csv
        - 식당에서 팁을 지불한 손님의 정보를 모아둔 데이터 셋

 

csv파일 불러오기 및 데이터 확인

tips = pd.read_csv('data/tips.csv')
tips.shape
tips.head()
tips['day'].value_counts()

 

total_bill, tip 의 분포를 시각화

# total_bill의 분포
plt.hist(tips['total_bill']  # default -> 10등분
         # ,bins = 30
         ,bins = [0, 5, 10, 13, 14, 20, 25, 30, 40, 50] # 원하는 범위로 나누기
         ,alpha = 0.5
         ,label = 'bill'
        )

# tip의 분포
plt.hist(tips['tip']
         ,alpha = 0.5
         ,label = 'tip'
        )

plt.title('음식값과 팁의 분포')
plt.legend()
plt.show()

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

  • 6.1 상자그래프란
  • 연속형 값들의 사분위수, 극단값들을 이용해 값들의 분포를 시각화한다.
  • boxplot(x, whis=1.5)
        - x: 데이터셋
        - whis: 극단치 계산시 사용할 값(기본 1.5)
            - IQR을 이용해 극단치 계산하기
                - IQR(Inter Quatile Range): 3분위수 - 1분위수 로 중간 50%값의 범위
                - 극단적으로 작은값: 1분위 - IQR * whis 보다 작은 값들
                - 극단적으로 큰값: 3분위 + IQR * whis보다 큰 값들

 

data 생성 (random)

import numpy as np
data = np.random.randint(1, 100, 1000) # 랜덤값 생성 : 1 ~ 100 사이 정수 1000
data[:5] = [200, 250, -50, -100, -60]
data[:10]

 

사분위수 구하기

# 사분위수
pd.Series(data).quantile(q=[0.25, 0.5, 0.75])

 

상자그래프

plt.boxplot(data)
plt.show()

 

정상범위 변경 (whis)

# 정상범위를 더 좁게
plt.boxplot(data, whis=0.5)
plt.show()

 

정상범위를 더 넓게 -> 극단치가 정상범위가 되게 만들 수 있다.

# 정상범위를 더 넓게
plt.boxplot(data, whis=3)
plt.show()

 

  • 상자그래프 활용
  • tips_df 에서 tip의 분포를 상자그래프로 확인

 

수량적인 부분은 확인할 수 없다.

# tip의 분포 -> boxplot (값의 범위를 기준 시각화)
plt.figure(figsize=(3, 6))
plt.boxplot(tips['tip'])
plt.ylabel('Tip($)')
plt.show()

 

 

  • 남녀별 tip의 분포를 하나의 boxplot에서 그려 비교
  • 한 그래프에서 여러 데이터셋의 boxplot을 그리기.
    • 2차원 배열형태의 구조로로 데이터를 제공
    • 행(axis=0) 별로 그래프를 그린다.

 

남녀별 tip

# 남녀별 tip을 분리
m_tip = tips.loc[tips['sex']=='Male', 'tip']
m_tip

f_tip = tips.query("sex == 'Female'")['tip']
f_tip

 

boxplot 그리기

# 하나의 boxplot에 두개 이상의 데이터를 그릴 경우 리스트로 묶어서 제공.
plt.boxplot([m_tip, f_tip], labels = ['남성', '여성'])

plt.show()