Plotly 기본 사용 연습
본 글은 kaggle 의 ‘2021 Kaggle Machine Learning & Data Science Survey’ 시각화 대회의 데이터를 이용하였습니다. KASHISH RASTOGI 님의 2021 Kaggle Gender Survey Analysis를 토대로 코드를 분석 하며 공부하였습니다.
사전 준비
import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import plotly.express as px
from plotly.subplots import make_subplots
import plotly.figure_factory as ff
import plotly.offline as offline
import plotly.graph_objs as go
offline.init_notebook_mode(connected = True)
import plotly.io as pio
pio.renderers.default = 'colab'
데이터 파일 분류
우선 Pandas의 read-csv 함수를 통해 데이터를 df 객체로 로딩한다.
질문 부분에 해당하는 0번 인덱스 데이터를 따로 qusetion 객체로 복사한다.
그리고 응답에 해당하는 1번 인덱스 이후 모든 행을 df 객체로 초기화 시켜준다.
iloc[] 뒤에 붙는 T는 ‘Transposed Data Frame’ 란 의미로 행과 열을 바꾸는 기능을 한다.
low_memory 참고 : https://ahnty0122.tistory.com/99
df = pd.read_csv('kaggle_survey_2021_responses.csv',low_memory=False)
# low_memory=False 는 여러 type의 데이터가 섞여 있을 때 나오는 오류를 방지해주는 기능
questions = df.iloc[0, :].T
df = df.iloc[1:, :]
Highest Level of Education: Gender
데이터 정리
df_q2_q4 = df[df['Q2']!='ETC'][['Q2','Q4']] # ETC로 제외할 필요 없음
#df_q2_q4 = df[0:][['Q2','Q4']]
df_q2_q4
Q2 | Q4 | |
---|---|---|
1 | Man | Bachelor’s degree |
2 | Man | Master’s degree |
3 | Man | Master’s degree |
4 | Man | Doctoral degree |
5 | Man | Doctoral degree |
... | ... | ... |
6157 | Man | Master’s degree |
6158 | Man | Bachelor’s degree |
6159 | Prefer not to say | Master’s degree |
6160 | Woman | Master’s degree |
6161 | Man | Doctoral degree |
6161 rows × 2 columns
위 코드를 통해 Q2의 성별에 대한 질문에 ETC라고 응답한 행을 제외한 데이터 프레임(df[df[‘Q2’]!=’ETC’]) 중에서 Q2,Q4(학위에 대한 질문)열에 해당하는 데이터([[‘Q2’,’Q4’]])를 추출하여 저장한다.
df_q2_q4 = pd.crosstab(df_q2_q4.Q2, df_q2_q4.Q4)
df_q2_q4
Q4 | Bachelor’s degree | Doctoral degree | I prefer not to answer | Master’s degree | No formal education past high school | Professional doctorate | Some college/university study without earning a bachelor’s degree |
---|---|---|---|---|---|---|---|
Q2 | |||||||
Man | 1950 | 521 | 114 | 1886 | 79 | 57 | 323 |
Nonbinary | 11 | 2 | 0 | 7 | 1 | 1 | 2 |
Prefer not to say | 20 | 11 | 5 | 21 | 3 | 2 | 5 |
Prefer to self-describe | 5 | 0 | 0 | 2 | 0 | 0 | 1 |
Woman | 412 | 134 | 29 | 470 | 12 | 15 | 60 |
pd.crosstab(X,Y) 함수를 통해 X의 값이 행의 인덱스가 되고 Y의 값이 columm이 된다. 이를 통해 빈도수를 계산하여 dataFrame을 바꾸는 함수이다.
참고 : https://3months.tistory.com/194
df_q2_q4 = pd.crosstab(df_q2_q4.Q2, df_q2_q4.Q4).T.reset_index()
df_q2_q4
Q2 | Q4 | Man | Nonbinary | Prefer not to say | Prefer to self-describe | Woman |
---|---|---|---|---|---|---|
0 | Bachelor’s degree | 1950 | 11 | 20 | 5 | 412 |
1 | Doctoral degree | 521 | 2 | 11 | 0 | 134 |
2 | I prefer not to answer | 114 | 0 | 5 | 0 | 29 |
3 | Master’s degree | 1886 | 7 | 21 | 2 | 470 |
4 | No formal education past high school | 79 | 1 | 3 | 0 | 12 |
5 | Professional doctorate | 57 | 1 | 2 | 0 | 15 |
6 | Some college/university study without earning ... | 323 | 2 | 5 | 1 | 60 |
Transposed Data Frame 을 통해 행과 열을 바꾸고 reset_index()로 인덱스 넘버를 추가한다.
fig = make_subplots(specs=[[{"type": "scatter"}]])
fig.add_trace(go.Scatter(x=df_q2_q4['Man'], y=df_q2_q4['Q4'], mode = 'markers', name='Man',
marker=dict(color='#496595', size = 10),
))
fig.add_trace(go.Scatter(x=df_q2_q4['Woman'], y=df_q2_q4['Q4'], mode = 'markers', name='Woman',
marker=dict(color='#f36196', size = 10),
))
fig
from google.colab import drive
drive.mount('/content/drive')
figure 객체를 만들어준 후 빈 캔버스에 add_trace()함수를 통해 Scatter형식의 데이터 포인트를 입력해준다.
mode = ‘markers’점만 찍는 형식의 산점도 그래프를 의미한다.
그리고 makers의 설정은 딕셔너리 형태의 값으로 색상이나 사이즈를 입력한다.
for i in range(0, len(df_q2_q4)):
fig.add_shape(type='line',
x0 = df_q2_q4['Man'][i],
y0 = i,
x1 = df_q2_q4['Woman'][i],
y1 = i,
line=dict(color='#c6ccd8', width = 2))
add_shape()함수로 선을 추가해준다. x0,y0 의 지점과 x1,y1의 지점을 잇는 선을 그어준다.
fig.update_xaxes(showgrid=False)# 캔버스의 세로 격자 무늬를 지운다.
fig.update_yaxes(tickmode='array',
tickvals=["Some college/university study without earning a bachelor’s degree",
"Professional doctorate",
"No formal education past high school",
"Master’s degree","I prefer not to answer","Doctoral degree",
"Bachelor’s degree"],
ticktext=["Without Bachelor's Degree","Professional doctorate",
"No formal education past high school",
"Master’s degree","I prefer not to answer","Doctoral degree",
"Bachelor’s degree"])# 기존에 너무 길었던 첫번째 항목의 제목을 바꾼다.
fig.update_layout(height=350,
margin=dict(b=0,r=20,l=20), # 각각 bottom right left를 의미
title_text="Highest Level of Education: Gender",#제목
template="plotly_white",
title_font=dict(size=25, color='#444', family="Lato, sans-serif"), #폰트 설정
font=dict(color='#8a8d93'),
hoverlabel=dict(bgcolor="#f2f2f2", font_size=13, font_family="Lato, sans-serif"), # 그래프 위에 마우스를 올려놨을 때 나오는 hoverlabel설명 설정
legend=dict(orientation="h", yanchor="bottom", y=1, xanchor="center", x=0.5))
fig.show()
댓글남기기