목차
오늘은 그동안 나를 너무 힘들게 했던, ploty의 다양한 chart에 대해 집중 공부해보겠다.
이것 때문에 적어도 50시간은 쏟은 것 같은데 제대로 하려면 머리 아프니, 대강 대강 넘어가다보니..
결국 새로운 과제에 직면했는데 다시 초보자처럼 헤매고 있었다.
그래서, 그냥 정도로 기록해가며 공부를 하려고 한다.
ploty가 제공하는 각 chart에 대해 소개한다.
다양한 종류의 data들을 그냥 보기에는 어렵다. 아무리 많은 데이터를 가지고 있다고 해도, 그 데이터를 가지고 유의미한 insight를 도출하지 못한다면 그것은 가지고 있는 거나 없거나, 큰 차이가 없다.
중요한 것은 insight이다.
insight를 발견하는데는, 머신러닝의 기술을 빌리지 않는다면 데이터 시각화가 최고의 방법이다.
ploty, px, 라이브러리
우선 ploty chart를 쓰는데 필요한 라이브러리를 설치한다.
import pandas as pd
import numpy as np
import plotly.express as px
import plotly.graph_objects as go
pie plot
우리 나라에서는 원차트, 원형차트로 불린다.
이것은 특정 카테고리가 차지하는 비율을 보여주는데 좋다.
즉, 해당 카테고리가 전체에서 얼만큼 차지하는지를 이해하는데 편리하다.
values, names
#data 만들기
time_percent=[50, 20, 10, 20]
works_category=['Data study', 'metaverse', 'house work', 'blog writing']
#pie plot
fig= px.pie(values=time_percent, names=works_category, title= "Olivia's Work State")
fig.show()
values 값을 보여준다.
아래의 표에서 보면 숫자 퍼센티지가 정확히 time_percent의 리스트 값과 일치한다.
그런데, 모든 숫자를 합치면 100이다.
즉, 전체가 100이기 때문에 리스트 값이 그대로 보이는 것이다.
names는 카테고리를 뜻한다.
리스트와 카테고리 값이 일치하기 때문에 1:1로 연결된다.
만약 숫자가 달라진다면?
퍼센티지의 값은 달라진다.
#data 만들기
time_percent=[50, 60, 10, 20]
works_category=['Data study', 'metaverse', 'house work', 'blog writing']
#pie plot
fig= px.pie(values=time_percent, names=works_category, title= "Olivia's Work State")
fig.show()
좀더 복잡한 데이터로 pie plot 만들기
아래의 데이터가 있다.
Launch Site마다 class 0,1이 차지하는 비율을 구하려고 한다.
함수를 만든다.
def success_percent(entered_site):
entered_site_df=spacex_df[spacex_df['Launch Site']==entered_site]
success_ratio=entered_site_df.groupby('class').size()/len(entered_site_df)*100
df= pd.DataFrame(success_ratio)
df=df.reset_index()
df.columns=['class', 'percent']
return df
success_percent(sites[3])
1) dataframe에서 특정 값으로 구성된 행으로 구성하고 싶을 때
entered_site_df=spacex_df[spacex_df['Launch Site']==entered_site]
2) 특정 칼럼의 값으로 전체 df을 그룹지을 때
entered_site_df.groupby('class')
>>class로 그룹지음
entered_site_df.groupby(['Launch Site'], ['class'])
>>launch Site, class 로 그룹지음
entered_site_df.groupby(('Launch Site']('class').sum()
>>launch site로 그룹지은 다음, 개별 site마다 class의 각각의 값의 총합을 구한다.
이것은 sql에서 groupby 후, aggregation함수로 하나의 값을 extract 하는 것과 동일하다.
3) size()
entered_site_df.groupby('class').size()
그 그룹의 크기를 계산한다. 빈도를 계산하는 것이다.
위의 예시에서는 class의 0, 1이 나오는 빈도를 계산한다.
4) 연산
success_ratio=entered_site_df.groupby('class').size()/len(entered_site_df)*100
전체 df값으로 나누어주고, 100을 곱하면 백분율이 된다.
5) 시리즈->데이터프레임
연산 후 값은 series이다. dataframe으로 바꾼다.
df= pd.DataFrame(success_ratio)
6) reset_index()
df=df.reset_index()
index를 리셋한다.
7) 칼럼
df.columns=['class', 'percent']
칼럼만들기
차트 함수 만들기
def get_pie_chart(entered_site):
if entered_site == 'ALL':
filtered_df = spacex_df[spacex_df['class']==1]
fig = px.pie(filtered_df, #데이터
values='class',
names='Launch Site', #데이터에서 원하는 컬럼
title='Total Success Launches By Site') #차트 타이틀
return fig
else:
fig= px.pie(success_percent(entered_site),
values='percent',
names='class',
title='Sucess of Lauches')
return fig
# return the outcomes piechart for a selected site
rangeslider
min, max, step
최소값, 최대값, 간격을 적는다.
(마크 자동생성)
dcc.RangeSlider(0, 20, value=[5, 15])
marks
화면에 보이는 표식이다.
{실제값: 보이는값,...} 같은 딕셔너리 형식으로 표시된다.
from dash import dcc
dcc.RangeSlider(
min=0,
max=10,
step=None,
marks={
0: '0°F',
3: '3°F',
5: '5°F',
7.65: '7.65°F',
10: '10°F'
},
value=[3, 7.65]
)
마크에 스타일을 넣을 수 있다.
from dash import dcc
# RangeSlider has included=True by default
dcc.RangeSlider(0, 100, value=[10, 65], marks={
0: {'label': '0°C', 'style': {'color': '#77b0b1'}},
26: {'label': '26°C'},
37: {'label': '37°C'},
100: {'label': '100°C', 'style': {'color': '#f50'}}
}
)
scatterplot , 산점도
x값에 대한 y의 값을 점으로 표시한다.
흩어진 정도를 알 수 있으며, x와 y의 관계를 유추한다.
fig=px.scatter(x=[0,1,2,3,4,5], y=[2,3,5,6,8,13])
fig.show()
데이터프레임 값을 산점도로 표시해보자
fig=px.scatter(spacex_df, x=spacex_df['Payload Mass (kg)'], y=spacex_df['class'])
fig.show()
산점도의 색깔
fig=px.scatter(spacex_df, x=spacex_df['Payload Mass (kg)'], y=spacex_df['class'], color='Booster Version Category')
fig.show()
산점도의 크기
fig=px.scatter(spacex_df, x=spacex_df['Payload Mass (kg)'], y=spacex_df['class'], color='Booster Version Category', size='Payload Mass (kg)')
fig.show()