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()
- 4.2 파이차트 활용
- 한국 웹브라우저 점유율을 파이차트로 작성
https://www.koreahtml5.kr/front/stats/browser/browserUseStats.do
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()