kaggle in Africa_Fig

1. Introduction

Helper functions


1.1 horizontal bar graphs

Graph의 code 의 경우 해당 data와 연동해서 한꺼번에 보기로 한다.

< plot의 종류 >

  1. plotly_hBar (df, q, title, height=400,l=250,r=50,b=50,t=100,)
  2. plotly_vBar(df, q, title, l=50,r=50,b=50,t=100)
  3. head_count(df, question_num, parts):
    1. head_count function copied from
  4. df_with_percentages(df, q, n, region)
  5. plot_barH_percent(df1, df2, title, l=150, r=50, b=50, t=100)
  6. annotated_heatmap(df_w, df_a, title, width=850)
  7. categorical_scatter(df1, df2, title, l=150, r=50, b=50, t=100)
  8. annotated_heatmap_Trans(df_w, df_a, title, width=850, height=750, l=150)
  9. head_count_suf(df, question_num, part, n)
  10. df_with_percentages_suf(df, q, part, n, region)




위의 코드의 경우 쓰여지지 않은 코드도 있는 것 같지만, 일단 List UP 해 놓음.





1.2 grouping african countries

1.2.1 연도 별 Africa 국가 이름 df

1
2
3
4
5
6
africa17 = ['Nigeria','Kenya', 'South Africa', 'Egypt']
africa18 = ['Nigeria','Kenya', 'South Africa', 'Egypt', 'Tunisia', 'Morocco']
africa19 = ['Nigeria','Kenya', 'South Africa', 'Egypt', 'Tunisia', 'Morocco', 'Algeria']
africa20 = ['Nigeria','Kenya', 'South Africa', 'Egypt', 'Tunisia', 'Morocco', 'Ghana']
africa21 = ['Nigeria','Kenya', 'South Africa', 'Egypt', 'Tunisia', 'Morocco', 'Algeria', 'Ghana', 'Uganda', 'Ethiopia']

  • 아마도 직접 수기로 찾은 것 같다.

1.2.2 국가 이름 확인

  • pd.isin(): List에 존재하는 요소가 대상 dataFrame, series에 존재 여부를 Boolean type으로 반환.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
africa = ['Nigeria', 'Egypt', 'South Africa', 'Algeria', 'Tunisia', 'Morocco', 'Kenya', 'Uganda', 'Ghana', 'Ethiopia']

df21_africa = df21[df21['Q3'].isin(africa)]
df21_world = df21[~df21['Q3'].isin(africa )]
df21['region']=["Africa" if x in africa else "World" for x in df21['Q3']]

df20_africa = df20[df20['Q3'].isin(africa)]
df20_world = df20[~df20['Q3'].isin(africa )]
df20['region']=["Africa" if x in africa else "World" for x in df20['Q3']]

df19_africa = df19[df19['Q3'].isin(africa)]
df19_world = df19[~df19['Q3'].isin(africa)]
df19['region']=["Africa" if x in africa else "World" for x in df19['Q3']]

df18_africa = df18[df18['Q3'].isin(africa)]
df18_world = df18[~df18['Q3'].isin(africa)]
df18['region']=["Africa" if x in africa else "World" for x in df18['Q3']]

df17_africa = df17[df17['Country'].isin(africa)]
df17_world = df17[~df17['Country'].isin(africa )]
df17['region']=["Africa" if x in africa else "World" for x in df17['Country']]

‘africa’라는 배열을 만들어 df를 새로 정의

  • 17’~21’까지 같은 내용이므로 21’의 내용만으로 정리

0> df21 data 확인

df21

1> df21[‘Q3’]의 내용은 당신의 나라는 어디 입니까?

df21_Q3

2> 따라서 “ df21[‘Q3’].isin(africa) “ 코드의 의미는 Q3의 대답이 africa 이면 True 반환.

3> 결론적으로 Q3의 대답이 Africa[]인 모든 대답을 추출 하게 된다.

4> 반대로 dfworld의 경우 ~ ( not )을 사용하여 Q3이 false인 data frame을 추출 할 수 있는것.

1.2.3 region column을 추가

1
df21['region']=["Africa" if x in africa else "World" for x in df21['Q3']]

df21 dataframe에 Region이라는 column 을 추가해 보자.

region 컬럼에 들어갈 값은

  1. List의 끝까지 반복하되, 만약 df21[‘Q3’]의 값이 africa에 해당하면 “Africa”, 그 밖의 경우는 world를 입력해라.

df21_Q3

Africa_Region

data science를 잘 하려면, python 문법도 잘 알아야 할 듯.

How Popular is kaggle in Africa?

1. Introduction

1.1 Introduction

800 사용자가 사용하고 있는 글로벌 온라인 커뮤니티 케글. 194개의 나라에서 사용중.

2017년부터 머신러닝과 data 과학자들을 대상으로 설문을 했는데, 본 저자는 아프리카 나라들의 참여를 알아보고자 한다.

Historical overview 이용




1.2 Table of Contents

  1. How does Africa compares with rest of the world?

    1. (Region(Q3)) 응답자 수(Africa/전체, 2021): bar-H
    2. (Region(Q3)) Africa에서 kgg사용증가 : bar
  2. Which African countries are kaggle-aware?

    1. (Q3) kgg을 사용하는 Africa나라 (2021): plotly_choroplethMap
    2. (Q3) kgg 사옹 증가 나라별 in Africa : heatmap
    3. (Q3) 조사에 참여한 나라 비율 in Africa (2021): Pie-Chart(donut)
  3. Demography : Age and Gender

    1. (Q1) age / (Q2) gender (Africa/전체, 2021): bar /bar-H
    2. (Q2, Q2, Q2, Q1, Genderselect) African 여성 비율 : bar
  4. Education, Jobs and Experience

    1. (Q4)학력/ (Q5)직업/ (Q6)경력 (Africa/전체, 2021): bar-H
  5. Programming Languages & IDE’s

    1. (Q7-13)프로그래밍 언어 선호 (Africa/전체, 2021): heatmap
    2. (Q9-13)IDE (Africa/전체, 2021): bar-H
    3. (Q8)추천 프로그래밍 언어 (Africa/전체, 2021): bar-H
  6. Machine Learning: Experience, Framework and Algorithms

    1. (Q15)Muchine Learning 경력 (Africa/전체, 2021): bar-H
    2. (Q16-18)Muchine Learning 플랫폼 (Africa/전체, 2021): bar-H
    3. (Q17-12)Muchine Learning 알고리즘 (Africa/전체, 2021): bar-H
    4. (Q18-7)computer vision Methods (Africa/전체, 2021): Heatmap
    5. (Q19-6)자연언어 처리방법 (Africa/전체, 2021): Heatmap
    6. (Q14-12)visualizations Library (Africa/전체, 2021): Heatmap
  7. Computing Resources

    1. (Q11)hardware platform (Africa/전체, 2021): bar-H
    2. (Q13)TPU 사용빈도 (Africa/전체, 2021): bar-H
    3. (Q12-6)특별한 하드웨어 (Africa/전체, 2021): Heatmap
    4. (Q27_A 12)온라인 플렛폼 (Africa/전체, 2021): bar-H
    5. (Q28)클라우드 플렛폼 (Africa/전체, 2021): bar-H
    6. (29_A, 5)클라우드 만들때 쓰는 기본 resource? (Africa/전체, 2021): bar-H
    7. (32_A, 12빅데이터 만들때 (Africa/전체, 2021): bar-H
    8. (Q33)가장많이 쓰는 big data 생성 프로그램 (Africa/전체, 2021): bar-H
  8. Employment and role at work

    1. (Q20) 최근 고용주 (Africa/전체, 2021): bar-H
    2. (Q24)일할때 중요한 활동 (Africa/전체, 2021): Heatmap
    3. (Q25) 급여 피라미드 (Africa/전체, 2021): dual bar-H
  9. Learning Platform and Media

    1. (Q40) data science 배우는 플랫폼 (Africa/전체, 2021): bar-H
    2. (Q42-12) 가장 좋아하는 DS Topics 미디어 소스 (Africa/전체, 2021): Heatmap
  10. Summary

  11. Reference

    특정 연도를 넣지 않은 부분은 historical data




2. Import

2.1 dataFrame & visualization Module

1
2
3
4
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pylab as plt

Numpy

dataframe

Pandas

dataframe

seaborn

Seaborn은 Metplotlib를 기본으로 생상테마와 통계용 차트 기능을 추가한 시각화 패키지

기본적인 시각화 기능은 Matplotlib, 통계는 Statsmodels에 의존한다.

Ref. seaborn tutorial/En


matplotlib

matplotlib.pyplot 모듈은 명령어 스타일로 동작하는 함수의 Library.

함수를 이용하여 그래프를 만들고, grid를 조정하고, Label도 꾸미는 등을 할 수 있다.

Ref. matplotlib.pyplot



2.2 plotly

1
2
3
4
5
6
7
8
9
10
11
12
13
14

import plotly.io as pio
import plotly.express as px
import plotly.graph_objects as go
import plotly.figure_factory as ff

from plotly.subplots import make_subplots #특정한 차트를 만들기 위해 넣어줌
from plotly.offline import init_notebook_mode, iplot #offLine에서도 돌아갈 수 있게 해줌

init_notebook_mode(connected=True)
pio.templates.default = "none"

# import plotly.offline as py
# py.offline.init_notebook_mode()

Plotly

plotly Livrary 전체를 pio로 받아옴.
그 중에서

를 받아 왔다.

  • plotly에서 G를 그리는 방법은 2가지가 있는다.
    • px : 템플릿을 통해 제작
    • go : 그래프를 하나하나 설정하며 제작

plotly_python

plolty-tutorial-guide/Ko

  • offline plotly

offline plotly

1
2
3
4
5
6
7
import os
for dirname, _, filenames in os.walk('/kaggle/input'):
for filename in filenames:
print(os.path.join(dirname, filename))

import warnings
warnings.filterwarnings("ignore")
  • data input 하는 방법.
    여러개의 csv file을 경로를 지정 해주어 한번에 넣어주는 code

1
2
3
4
5
df17= pd.read_csv("/kaggle/input/kaggle-survey-2017/multipleChoiceResponses.csv", encoding="ISO-8859-1")
df18= pd.read_csv("/kaggle/input/kaggle-survey-2018/multipleChoiceResponses.csv", )
df19= pd.read_csv("/kaggle/input/kaggle-survey-2019/multiple_choice_responses.csv", )
df20= pd.read_csv("/kaggle/input/kaggle-survey-2020/kaggle_survey_2020_responses.csv", )
df21= pd.read_csv("/kaggle/input/kaggle-survey-2021/kaggle_survey_2021_responses.csv", )

연도 별로 dataFrame을 씌워서 csv file을 dfyy객체에 Loading해 준다.

kaggle :ScatterLine (Q42)

kaggle dictation (08)




plotly.graph_objects as go_ Scatter + line plot

산점도

  • bivariate”이변수” 값을 시각화 하는 기본적인 그래프.
    • correlation: Positive, Negative, non
  • 두 개의 변수 각각의 분포과 변수간의 관계를 확인 할 수 있다.

ref.



0. data set

https://www.kaggle.com/miguelfzzz/the-typical-kaggle-data-scientist-in-2021



Subject : 가장 많이 이용하는 Media source

1. data 읽어오기

Q42로 시작하는 col을 읽어오기.
python의 for문을 이용.

1
media_cols = [col for col in df if col.startswith('Q42')]

media_cols



2. data Frame 만들어 주기

1
2
3
4
5
6
media = df[media_cols]

media.columns = ['Twitter', 'Email newsletters',
'Reddit', 'Kaggle', 'Course Forums',
'YouTube', 'Podcasts', 'Blogs',
'Journal Publications', 'Slack Communities', 'None', 'Other']

df_media_cols



3.표 설정.

1
2
3
4
5
6
7
8
9
10
media = (
media
.count()
.to_frame()
.reset_index()
.rename(columns={'index':'Medias', 0:'Count'})
.sort_values(by=['Count'], ascending=False)
)

media

media



4. 색 지정

1
2
3
4
5
6
7
8
9
10

colors = ['#033351',] * 12
colors[11] = '#5abbf9'
colors[10] = '#5abbf9'
colors[9] = '#5abbf9'
colors[8] = '#0779c3'
colors[7] = '#0779c3'
colors[6] = '#0779c3'
colors[5] = '#0779c3'
colors[4] = '#0779c3'


5. percent로 계산한 column 추가

i. add percent column

1
2
3
media['percent'] = ((media['Count'] / len(df))*100).round(2).astype(str) + '%'

media

Q42_percent



ii. Count값 (column값으로 ) 정렬

1
2
3
4
5
6
media = (media
.sort_values(by = ['Count'])
.iloc[0:15]
.reset_index())

media

Q42_percent_sort


1. Default는 내림차순
2. iloc으로 0번부터 15까지 List로 긁어오기
3. reset index()



6.plotly.graph_objects.Scatter()

Scatter G 그리기

i. 산점도 점 찍기
1
2
3
4
5
6
7
8

fig = go.Figure(go.Scatter(x = media['Count'],
y = media["Medias"],
text = media['percent'],
mode = 'markers',
marker_color =colors,
marker_size = 12))
fig

Q42_graph




ii. 산점도에 for문을 이용하여 line 연결하기

1
2
3
4
5
6
7
for i in range(0, len(media)):
fig.add_shape(type='line',
x0 = 0, y0 = i,
x1 = media["Count"][i],
y1 = i,
line=dict(color=colors[i], width = 4))
fig

Q42_Scatter+line


  • for i in range(0~platform의 길이만큼)
  • fig. add_shape()
    • type = ‘line’
      • line모양의 grape shape add
    • x0 = 0, y0 = i,
      • 초기값 (0, i)에서 시작
      • (0, 0) = other Line Start
    • x1 = platform[“Count”][i],
      • x축 Index : count의 값만큼 x축방향으로 Line이 그어진다.
    • y1 = i,
      • y축 Index, 마지막 값
    • line=dict(color=colors[i], width = 4)
      • line의 세부 설정, 색과 두께



7. update_traces(hovertemplate)

1
2
3
fig.update_traces(hovertemplate='<b>Media Source</b>: %{y}<br><extra></extra>'+
'<b>Count</b>: %{x}<br>'+
'<b>Proportion</b>: %{text}')


8. Design

i. 축 grid

1
2
fig.update_xaxes(showgrid=True, gridwidth=1, gridcolor='#9f9f9f', ticklabelmode='period')
fig.update_yaxes(showgrid=False)

x 축의 grid만 보여줌. tick labe lmode : period

Q42_grid



plotly의 axes/En


ii. update_layout()
1
2
3
4
5
6
7
8
9
10
11
12

fig.update_layout(showlegend=False,
plot_bgcolor='#F7F7F7',
margin=dict(pad=20),
paper_bgcolor='#F7F7F7',
yaxis_title=None,
xaxis_title=None,
title_text="Most Commonly Used <b>Media Sources</b>",
title_x=0.5,
height=700,
font=dict(family="Hiragino Kaku Gothic Pro, sans-serif", size=17, color='#000000'),
title_font_size=35)

Q42_layout



9. Annotation

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
fig.add_annotation(dict(font=dict(size=14),
x=0.98,
y=-0.22,
showarrow=False,
text="@miguelfzzz",
xanchor='left',
xref="paper",
yref="paper"))

fig.add_annotation(dict(font=dict(size=12),
x=0.04,
y=-0.22,
showarrow=False,
text="Source: 2021 Kaggle Machine Learning & Data Science Survey",
xanchor='left',
xref="paper",
yref="paper"))

fig.show()

Q42_final



kaggle :Donut Chart Graph (Q2)

kaggle dictation (07)




plotly.graph_objects as go: 를 이용한 Donut Chart(pie graph)

###pie plot / 파이차트, 도넛차트

파이차트는 원그래프를 일컫는 말

전체에 대한 각 부분의 비율을 백분율로 나타내어 전체적인 비율을 쉽게 파악 할 수있다.

fig = go.Figure(data=[go.Pie(labels=labels, values=values, hole=.3)])

원그래프에 ‘hole’을 추가하여 생성 할 수 있다.

그 hole 안에 domain(make_subplots())을 추가하여 차트 제목을 추가 할 수도 있다.

같은 원리로

fig = go.Figure(data=[go.Pie(labels=labels, values=values, pull=[0, 0, 0.2, 0])])

조각이 떼어진 pie chart 를 생성 할 수 있다.

pieChart/En : pie chart

Sunburst Chart/En : 다중 pie 차트




plotly.graph_objects as go: 를 이용한 Donut_Chart

Donut_Chart /도넛 차트 (pie chart의 일종)

0. data set

https://www.kaggle.com/miguelfzzz/the-typical-kaggle-data-scientist-in-2021



Subject : 성별의 분포_

1. data 읽어오기 , data Frame 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
gender = (
df['Q2']
.value_counts()
.to_frame()
.reset_index()
.rename(columns={'index':'Gender', 'Q2':'Count'})
.replace(['Prefer not to say','Nonbinary','Prefer to self-describe'], 'Other')
.replace(['Man','Woman'], ['Male', 'Female'])
.groupby('Gender')
.sum()
.reset_index()
)
gender

Q2_gender



2. 색 지정
1
colors = ['#5abbf9','#033351', 'b9e2fc']


3. Figure 그리기

1
2
3
fig = go.Figure(data=[go.Pie(labels=gender['Gender'], 
values=gender['Count'],
hole=.4)])

  • labels=gender[‘Gender’]
    • 컬럼 이름
  • values=gender[‘Count’]
    • 컬럼값
  • hole=.4
    • 도넛형태로 만들어 주기 위한 hole

Q2_dounuts


default 값으로 legend 가 들어 있는 것을 볼 수 있다.



4. update_traces()

1
2
3
4
5
6
fig.update_traces(hoverinfo='percent', 
textinfo='label',
textfont_size=20,
marker=dict(colors=colors,
line=dict(color='#000000', width=1)))
fig

Q2_update_traces



5. update_layout()

표의 layout 바꾸기

1
2
3
4
5
6
7
8
fig.update_layout(showlegend=False, 
plot_bgcolor='#F7F7F7',
paper_bgcolor='#F7F7F7',
title_text="<b>Gender</b> Distribution",
title_x=0.5,
font=dict(family="Hiragino Kaku Gothic Pro, sans-serif", size=25, color='#000000'))

fig



  1. showlegend=False,
    • Legend 없앰
  2. plot_bgcolor=’#F7F7F7’,
    • BG 회색, 하지만 바꿔도 안보임
  3. paper_bgcolor=’#F7F7F7’,
    • plot이 놓여있는 paper bg
  4. title_text=”Gender Distribution”,
    • 제목 설정
  5. title_x=0.5,
    • 제목의 위치
  6. font=dict(family=”Hiragino Kaku Gothic Pro, sans-serif”, size=25, color=’#000000’)
    • font 종류, 제목의 size, 색

Q2Gender_dn




6. Annotation

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
fig.add_annotation(dict(font=dict(size=14),
x=1.1,
y=-0.16,
showarrow=False,
text="@miguelfzzz",
xanchor='left',
xref="paper",
yref="paper"))

fig.add_annotation(dict(font=dict(size=12),
x=-0.28,
y=-0.16,
showarrow=False,
text="Source: 2021 Kaggle Machine Learning & Data Science Survey",
xanchor='left',
xref="paper",
yref="paper"))
fig.show()

Gender_Final_dn


kaggle :HorizontalBar (Q7)

kaggle dictation (06)




plotly.graph_objects as go: 를 이용한 bar graph

HorizontalBar plot /가로 막대 차트

0. data set

https://www.kaggle.com/miguelfzzz/the-typical-kaggle-data-scientist-in-2021



Subject : 가장 많이쓰는 programming 언어_Horizontal bar

1. data 읽어오기


Q7에는 sub가 많기 때문에 python 구문을 이용하여
‘Q7’ 이 붙어있는 컬럼 불러오기.


languages_cols = [col for col in df if col.startswith(‘Q7’)]

col 1부터 df 끝까지

Q7로 시작하는지 확인하여 true 일 때만 데이터 가져오기

1
languages_cols = [col for col in df if col.startswith('Q7')]



2. data Frame 만들어 주기

algorithms 에 data frame을 씌워서 표를 만들고, 이름을 다음과같이 바꿔줌.

1
2
3
4
5
languages = df[languages_cols]

languages.columns = ['Python', 'R', 'SQL', 'C', 'C++', 'Java',
'Javascript', 'Julia', 'Swift', 'Bash',
'MATLAB', 'None', 'Other']

languages.columns



3.표 설정.
1
2
3
4
5
6
7
8
languages = (
languages
.count()
.to_frame()
.reset_index()
.rename(columns={'index':'Languages', 0:'Count'})
.sort_values(by=['Count'], ascending=False)
)

languages


  1. .count() :coulumn 수 세기
  2. .to_frame() : frame 생성
  3. .reset_index() : 원본과 상관없는 Index 생성
  4. .rename()
    1. columns의 이름을 지정 : ‘index’:’Languages’, 0:’Count’
  5. .sort_values()
    1. by=[‘Count’], ascending=False
    2. Count 기준으로 내림차순으로 정렬


3. percent 추가

1
languages['percent'] = ((languages['Count'] / len(df))*100).round(2).astype(str) + '%'


표에 ‘percent’를 추가
algorithms의 count에 df의 length로 나누고 *100을 하는 전형적인 % 나타내기

값자체에 %를 입력하여 나중에 %를 추가 입력하지 않아도 됨

소숫점 자리 2까지 반영(반올림).
type 자체를 String으로 하여 추가 계산은 불가능.



4. 색 지정

1
2
3
4
5
6
7
8
9
10
11
colors = ['#033351',] * 13
colors[0] = '#5abbf9'
colors[1] = '#5abbf9'
colors[2] = '#0779c3'
colors[3] = '#0779c3'
colors[4] = '#0779c3'
colors[5] = '#0779c3'
colors[6] = '#0779c3'
colors[7] = '#05568a'
colors[8] = '#05568a'
colors[9] = '#05568a'


5. bar Graph 만들기

1
2
3
4
5
6
7
fig = go.Figure(go.Bar(
x=algorithms['Count'],
y=algorithms['Algorithms'],
text=algorithms['percent'],
orientation='h',
marker_color=colors
))

horizontal과 vertical Graph의 차이는 x, y axis를 바꾸어 주는 것과

orientation=’h’ 을 넣어 주는 것의 차이.

Leng_go.Bar




6. update_traces()

traces() 수정 : Trace에 대한 설정

1
2
3
4
5
6
fig.update_traces(texttemplate='%{text}', 
textposition='outside',
cliponaxis = False,
hovertemplate='<b>Lenguage</b>: %{y}<br><extra></extra>'+
'<b>Count</b>: %{x}',
textfont_size=12)
  1. texttemplate : text type
  2. textposition : ‘outside’ _ 설정 해 주지 않은 경우 칸에 따라 적당히 들어감.
  3. cliponaxis = False : text가 칸이 작아서 짤리는 경우를 막아주는 기능 (off)
  4. hovertemplate :
    1. 마우스 On하면 (커서를 위에 대면) 나오는 Hovert에대한 설정.
  5. textfont_size : 폰트 size



7. Design

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

fig.update_xaxes(showgrid=False)
fig.update_yaxes(showgrid=False)

fig.update_layout(showlegend=False,
plot_bgcolor='#F7F7F7',
margin=dict(pad=20),
paper_bgcolor='#F7F7F7',
height=700,
xaxis={'showticklabels': False},
yaxis_title=None,
xaxis_title=None,
yaxis={'categoryorder':'total ascending'},
title_text="Most Commonly Used <b>Programming Languages</b>",
title_x=0.5,
font=dict(family="Hiragino Kaku Gothic Pro, sans-serif", size=17, color='#000000'),
title_font_size=35)
  1. Grid Delete

  1. update_layout
    1. showlegend=False,
    2. plot_bgcolor=’#F7F7F7’
    3. margin=dict(pad=20),
      1. padding20
    4. paper_bgcolor=’#F7F7F7’,
    5. xaxis={‘showticklabels’: False},
      1. x 축 labels을 삭제.
    6. yaxis_title=None,
    7. xaxis_title=None, yaxis={‘categoryorder’:’total ascending’},
      1. y 축 title을 categoryorder : 정렬
    8. title_text=”Most Commonly Used Algorithms“,
    9. title_x=0.5,
    10. font=dict(family=”Hiragino Kaku Gothic Pro, sans-serif”, size=15, color=’#000000’),
             title_font_size=35)
      


8. Annotation

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
fig.add_annotation(dict(font=dict(size=14),
x=0.98,
y=-0.13,
showarrow=False,
text="@miguelfzzz",
xanchor='left',
xref="paper",
yref="paper"))

fig.add_annotation(dict(font=dict(size=12),
x=0,
y=-0.13,
showarrow=False,
text="Source: 2021 Kaggle Machine Learning & Data Science Survey",
xanchor='left',
xref="paper",
yref="paper"))

fig.show()

Leng_Final_HB

kaggle :ScatterLine (Q11)

kaggle dictation (05)




plotly.graph_objects as go: 를 이용한 Scatter + line G

산점도

  • bivariate”이변수” 값을 시각화 하는 기본적인 그래프.
    • correlation: Positive, Negative, non
  • 두 개의 변수 각각의 분포과 변수간의 관계를 확인 할 수 있다.

ref.

0. data set

https://www.kaggle.com/miguelfzzz/the-typical-kaggle-data-scientist-in-2021



Subject : 가장 많이 이용하는 computer platform(hardware)

1. data 읽어오기 + data Frame 만들어 주기

1
2
3
4
5
6
7
8
9
10
11
platform = (
df['Q11']
.value_counts()
.to_frame()
.reset_index()
.rename(columns={'index':'Platform', 'Q11':'Count'})
.sort_values(by=['Count'], ascending=False)
.replace(['A deep learning workstation (NVIDIA GTX, LambdaLabs, etc)',
'A cloud computing platform (AWS, Azure, GCP, hosted notebooks, etc)'],
['A deep learning workstation', 'A cloud computing platform'])
)

ide를 dataframe화 완료.

Q11의 column이름 까지 재설정 완료.

Q11



2.표 설정.
1
2
3
4
5
6
7
8
9
10
11
ide = (
ide
.count()
.to_frame()
.reset_index()
.rename(columns={'index':'IDE', 0:'Count'})
.sort_values(by=['Count'], ascending=False)
)


ide['percent'] = ((ide['Count'] / len(df))*100).round(2).astype(str) + '%'


3. percent 추가

1
platform['percent'] = ((platform['Count'] / platform['Count'].sum())*100).round(2).astype(str) + '%'

Q11_percent



3. 색 지정

1
2
3
4
colors = ['#033351',] * 6
colors[5] = '#5abbf9'
colors[4] = '#0779c3'
colors[3] = '#0779c3'


4. 표 재 설정

1
2
3
4
5
platform = (platform
.sort_values(by = ['Count'])
.iloc[0:15]
.reset_index())
platform

platformRe

  1. .sort_values(by = [‘Count’]) : [Count]로 정렬,
  2. .iloc[0:15] platform의 column 선택: 0~15까지 data 가져오기
  3. .reset_index() : data와 상관 없는 새 index 가져오기


5.plotly.graph_objects.Scatter()

본격적으로 Scatter G 만들기.

## 산점도 점 찍기
1
2
3
4
5
6
7
8

fig = go.Figure(go.Scatter(x = platform['Count'],
y = platform["Platform"],
text = platform['percent'],
mode = 'markers',
marker_color =colors,
marker_size = 12))
fig

Q11_graph


  1. x = platform[‘Count’], y = platform[“Platform”],
    1. x축, y축 설정
  2. text = platform[‘percent’],
    1. text를 넣는다고 하는데 안보이네
  3. mode = ‘markers’,
    1. Text, lines+markers, makers, line 이 가능 한거 같다.
    2. Scatter.mod
  4. marker_color =colors, marker_size = 12)
    1. 산점도 안에 있는 점의 색과 크기



## 산점도에 for문을 이용하여 line 연결하기 
1
2
3
4
5
6
for i in range(0, len(platform)):
fig.add_shape(type='line',
x0 = 0, y0 = i,
x1 = platform["Count"][i],
y1 = i,
line=dict(color=colors[i], width = 4))

Q11_Scatter+line

for i in range(0~platform의 길이만큼)

fig. add_shape()

type = ‘line’
- line모양의 grape shape add

x0 = 0, y0 = i,
- 초기값

x1 = platform[“Count”][i],
x축 Index
y1 = i,
y축 Index, 마지막 값

line=dict(color=colors[i], width = 4)

line의 세부 설정, 색과 두께



  • flatform은 .iloc[0:15] 로 뽑아진 list 형식
    따라서 platform[“Count”][i]값을 뽑아 낼 수 있다.




6. update_traces()

1
2
3
fig.update_traces(hovertemplate='<b>Platform</b>: %{y}<br><extra></extra>'+
'<b>Count</b>: %{x}<br>'+
'<b>Proportion</b>: %{text}')


7. Design

1
2
3
4
5
6
7
8
9
10
11
12
13
fig.update_xaxes(showgrid=True, gridwidth=1, gridcolor='#9f9f9f', ticklabelmode='period')
fig.update_yaxes(showgrid=False)

fig.update_layout(showlegend=False,
plot_bgcolor='#F7F7F7',
margin=dict(pad=20),
paper_bgcolor='#F7F7F7',
yaxis_title=None,
xaxis_title=None,
title_text="Most Commonly Used <b>Computing Platforms</b>",
title_x=0.5,
font=dict(family="Hiragino Kaku Gothic Pro, sans-serif", size=17, color='#000000'),
title_font_size=35)

Q11_layout



8. Annotation

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
fig.add_annotation(dict(font=dict(size=14),
x=0.98,
y=-0.22,
showarrow=False,
text="@miguelfzzz",
xanchor='left',
xref="paper",
yref="paper"))

fig.add_annotation(dict(font=dict(size=12),
x=0.04,
y=-0.22,
showarrow=False,
text="Source: 2021 Kaggle Machine Learning & Data Science Survey",
xanchor='left',
xref="paper",
yref="paper"))

fig.show()

Q11_final



kaggle :HorizontalBar (Q9)

kaggle dictation (04)




plotly.graph_objects as go: 를 이용한 bar graph

HorizontalBar plot /가로 막대 차트

0. data set

https://www.kaggle.com/miguelfzzz/the-typical-kaggle-data-scientist-in-2021



Subject : 어떤알고리즘을 선호 하는 지 알아보는 Horizontal bar

1. data 읽어오기

1
2
3
4
5
6
# Features that start with Q7
ide_cols = [col for col in df if col.startswith('Q9')]

ide = df[ide_cols]

print(ide)

print(ide)

list comprehension
for문으로 돌린 data값을 전부 col로 받아와서
그 값을 또 ide_cols에 싣는 한줄로 이루어진 코드.

2. data Frame 만들어 주기

ide를 dataframe화 완료.

1
2
3
ide.columns = ['JupyterLab', 'RStudio', 'Visual Studio', 'VSCode', 
'PyCharm', 'Spyder', 'Notepad++', 'Sublime Text', 'Vim, Emacs, or similar',
'MATLAB', 'Jupyter Notebook', 'None', 'Other']

Q9의 column이름 재 설정.



3.표 설정.
1
2
3
4
5
6
7
8
ide = (
ide
.count()
.to_frame()
.reset_index()
.rename(columns={'index':'IDE', 0:'Count'})
.sort_values(by=['Count'], ascending=False)
)


3. percent 추가

1
ide['percent'] = ((ide['Count'] / len(df))*100).round(2).astype(str) + '%'


4. 색 지정

1
2
3
4
5
6
7
8
9
colors = ['#033351',] * 13
colors[0] = '#5abbf9'
colors[1] = '#5abbf9'
colors[2] = '#0779c3'
colors[3] = '#0779c3'
colors[4] = '#0779c3'
colors[5] = '#0779c3'
colors[6] = '#0779c3'
colors[7] = '#0779c3'


5. bar Graph 만들기

1
2
3
4
5
6
7
fig = go.Figure(go.Bar(
x=ide['Count'],
y=ide['IDE'],
text=ide['percent'],
orientation='h',
marker_color=colors
))


6. update_traces()

1
2
3
4
5
6
fig.update_traces(texttemplate='%{text}', 
textposition='outside',
cliponaxis = False,
hovertemplate='<b>IDE</b>: %{y}<br><extra></extra>'+
'<b>Count</b>: %{x}',
textfont_size=12)


7. Design

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
fig.update_xaxes(showgrid=False)
fig.update_yaxes(showgrid=False)

fig.update_layout(showlegend=False,
plot_bgcolor='#F7F7F7',
margin=dict(pad=20),
paper_bgcolor='#F7F7F7',
xaxis={'showticklabels': False},
yaxis_title=None,
height = 600,
xaxis_title=None,
yaxis={'categoryorder':'total ascending'},
title_text="Most Commonly Used <b>IDE's</b>",
title_x=0.5,
font=dict(family="Hiragino Kaku Gothic Pro, sans-serif", size=15, color='#000000'),
title_font_size=35)


8. Annotation

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
fig.add_annotation(dict(font=dict(size=14),
x=0.98,
y=-0.17,
showarrow=False,
text="@miguelfzzz",
xanchor='left',
xref="paper",
yref="paper"))

fig.add_annotation(dict(font=dict(size=12),
x=0,
y=-0.17,
showarrow=False,
text="Source: 2021 Kaggle Machine Learning & Data Science Survey",
xanchor='left',
xref="paper",
yref="paper"))


fig.show()


kaggle :HorizontalBar (Q17)

kaggle dictation (03)




plotly.graph_objects as go: 를 이용한 bar graph

HorizontalBar plot /가로 막대 차트

0. data set

https://www.kaggle.com/miguelfzzz/the-typical-kaggle-data-scientist-in-2021



Subject : 어떤알고리즘을 선호 하는 지 알아보는 Horizontal bar

1. data 읽어오기

algorithms_cols에 data frame을 먼저 만들고 시작.
잘 모르겠지만 아마도 Q17이 붙은 data를 선택 하기 위한 code

algorithms_cols = [col for col in df if col.startswith(‘Q17’)]

col 1부터 df 끝까지

Q17로 시작하는지 확인하여 true일때만 데이터 가져오기

ref.

How to select dataframe columns that start with *** using pandas in python ?

1
2
algorithms_cols = [col for col in df if col.startswith('Q17')]



2. data Frame 만들어 주기

algorithms 에 data frame을 씌워서 표를 만들고, 이름을 다음과같이 바꿔줌.

1
2
3
4
5
6
7
8

algorithms = df[algorithms_cols]

algorithms.columns = ['Linear or Logistic Regression', 'Decision Trees or Random Forests',
'Gradient Boosting Machines', 'Bayesian Approaches', 'Evolutionary Approaches',
'Dense Neural Networks', 'Convolutional Neural Networks', 'Generative Adversarial Networks',
'Recurrent Neural Networks', 'Transformer Networks', 'None', 'Other']


algorithms


3.표 설정.
1
2
3
4
5
6
7
8
algorithms = (
algorithms
.count()
.to_frame()
.reset_index()
.rename(columns={'index':'Algorithms', 0:'Count'})
.sort_values(by=['Count'], ascending=False)
)


  1. .count() :coulumn 수 세기
  2. .to_frame() : frame 생성
  3. .reset_index() : 원본과 상관없는 Index 생성
  4. .rename()
    1. columns의 이름을 지정 : ‘index’:’Algorithms’, 0:’Count’
  5. .sort_values()
    1. by=[‘Count’], ascending=False
    2. Count 기준으로 내림차순으로 정렬


3. percent 추가

1
2
algorithms['percent'] = ((algorithms['Count'] / len(df))*100).round(2).astype(str) + '%'



표에 ‘percent’를 추가
algorithms의 count에 df의 length로 나누고 *100을 하는 전형적인 % 나타내기

값자체에 %를 입력하여 나중에 %를 추가 입력하지 않아도 됨

소숫점 자리 2까지 반영(반올림).
type 자체를 String으로 하여 추가 계산은 불가능.



4. 색 지정

1
2
3
4
5
6
7
8
colors = ['#033351',] * 12
colors[0] = '#5abbf9'
colors[1] = '#5abbf9'
colors[2] = '#066eb0'
colors[3] = '#066eb0'
colors[4] = '#044a77'
colors[5] = '#044a77'
colors[6] = '#044a77'

colors


색 깊이는 12단계, 0~6까지는 정해주고 나머지 5개는 #033351을 default로 한 것을 알 수 있다.


5. bar Graph 만들기

1
2
3
4
5
6
7
fig = go.Figure(go.Bar(
x=algorithms['Count'],
y=algorithms['Algorithms'],
text=algorithms['percent'],
orientation='h',
marker_color=colors
))

horizontal과 vertical Graph의 차이는 x, y axis를 바꾸어 주는 것과

orientation=’h’ 을 넣어 주는 것의 차이.


<orientation 없음>

orientationH


<orientation H 있음>

orientationH_


6. update_traces()

traces() 수정 : Trace에 대한 설정

1
2
3
4
5
6
fig.update_traces(texttemplate='%{text}', 
textposition='outside',
cliponaxis = False,
hovertemplate='<b>Algorithm</b>: %{y}<br><extra></extra>'+
'<b>Count</b>: %{x}',
textfont_size=12)
  1. texttemplate : text type
  2. textposition : ‘outside’ _ 설정 해 주지 않은 경우 칸에 따라 적당히 들어감.
  3. cliponaxis = False : text가 칸이 작아서 짤리는 경우를 막아주는 기능 (off)
  4. hovertemplate :
    1. 마우스 On하면 (커서를 위에 대면) 나오는 Hovert에대한 설정.
  5. textfont_size : 폰트 size



7. Design

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

fig.update_xaxes(showgrid=False)
fig.update_yaxes(showgrid=False)

fig.update_layout(showlegend=False,
plot_bgcolor='#F7F7F7',
margin=dict(pad=20),
paper_bgcolor='#F7F7F7',
xaxis={'showticklabels': False},
yaxis_title=None,
height = 600,
xaxis_title=None,
yaxis={'categoryorder':'total ascending'},
title_text="Most Commonly Used <b>Algorithms</b>",
title_x=0.5,
font=dict(family="Hiragino Kaku Gothic Pro, sans-serif", size=15, color='#000000'),
title_font_size=35)
  1. Grid Delete

grid delete


  1. update_layout
    1. showlegend=False,
    2. plot_bgcolor=’#F7F7F7’
    3. margin=dict(pad=20),
    4. paper_bgcolor=’#F7F7F7’,
    5. xaxis={‘showticklabels’: False},
      1. x 축 labels을 삭제.
    6. yaxis_title=None,
    7. xaxis_title=None, yaxis={‘categoryorder’:’total ascending’},
      1. y 축 title을 categoryorder
      2. img.png
      3. Automatically Sorting Categories by Name or Total Value
      4. layout-xaxis-categoryorder
    8. title_text=”Most Commonly Used Algorithms“,
    9. title_x=0.5,
    10. font=dict(family=”Hiragino Kaku Gothic Pro, sans-serif”, size=15, color=’#000000’),
             title_font_size=35)
      

이미 앞서서 충분히 설명 했기 때문에 본 posting에서 설명되지 않은 부분은

basic bar Graph 에서 확인

8. Annotation

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
fig.add_annotation(dict(font=dict(size=14),
x=0.98,
y=-0.17,
showarrow=False,
text="@miguelfzzz",
xanchor='left',
xref="paper",
yref="paper"))

fig.add_annotation(dict(font=dict(size=12),
x=0,
y=-0.17,
showarrow=False,
text="Source: 2021 Kaggle Machine Learning & Data Science Survey",
xanchor='left',
xref="paper",
yref="paper"))


fig.show()

kaggle :Bar Graph (Q6)

kaggle dictation (02)




plotly.graph_objects as go: 를 이용한 bar graph

###bar plot /막대 차트

막대그래프는 가장 많이 쓰이는 플롯들중 하나로 숫자 변수와 범주 형 변수 간의 관계를 보여 줍니다.

막대 차트는 종종 히스토그램과 혼동 되기도 하는데(숫자의 분포를 보여줌) 이는 통계학의 부분

그룹당 여러 값이 있는 경우에는 박스플롯이나 바이올린 플롯을 추천

최소한 그룹당 관측치 수와 각 그룹의 신뢰구간은 표시되야함.




사용한 Library

1
2
3
4
5
6
7
8
import pandas as pd
import numpy as np
import seaborn as sns
import plotly.express as px
import plotly.graph_objects as go

import warnings
warnings.filterwarnings('ignore')
사실 이 부분에서 seaborn을 사용 했는지 잘 모르겠음.
github에서 plotly가 동적 Livrary라 자꾸 오류가남.


data import

data 원문


data import 방법

data: Kaggle의 the-typical-kaggle-data-scientist-in-2021

이 부분은 data import 방법 을 참고 하거나
kaggle dictation (01) 을 참조하세요.



data encoding (Feature Engineering)

사실 이 부분이 feature Engineering에 해당하는 부분인지 잘 모르겠다.
이 부분은 data를 computer로 자동화하여 계산, 동적 그래프를 만들기 위한 부분.



###Feature Engineering

Experience라는 Question 6에 해당하는 값을 전처리 해 준다.

1
2
3
4
5
6
7
8
9
10
11
12
experience = (
df['Q6']
.value_counts()
.to_frame()
.reset_index()
.rename(columns={'index':'Experience', 'Q6':'Count'})
.replace(['I have never written code','< 1 years',
'1-3 years', '3-5 years', '5-10 years',
'10-20 years', '20+ years'], ['No experience', '<1 years',
'1-3 years', '3-5 years', '5-10 years',
'10-20 years', '20+ years'])
)
  1. .value_counts() : 데이터의 분포를 확인하는데 매우 유용한 함수
  • column 값의 개수를 확인 하는것. 중복되는 값을 묶어줌.
  1. .to_frame() : frame을 설정 (표 생성)
  2. reset_index()
  • 원본 data를 회손하지 않고 Index를 새로 만듦
  1. .rename(columns={‘index’:’Experience’, ‘Q6’:’Count’})
    • column에 새로운 이름을 붙여줌 index는 Experience로 Q6은 count로 지정
  2. replace()
    • [왼쪽]에 있는 값대신 [오른쪽]에 있는 값을 넣으려고 함.
    • 이 경우 ‘I have never written code’를 ‘No experience’로 바꾸려고 한듯.

Ref. 판다스 함수



  1. df.value_counts() 함수만 사용하면 아래와 같이 나온다.

    1
    df['Q6'].value_counts()

    1-3 years 7874
    < 1 years 5881
    3-5 years 4061
    5-10 years 3099
    10-20 years 2166
    20+ years 1860
    I have never written code 1032
    Name: Q6, dtype: int64

valueCount


  • 이는 문자형 data를 분석하여 display하기 위한 방법




data categoircal로 List로 만들고, 함수정의, 정렬

(#1) : Pandas lib의 categories function

문자열 객체의 배열을 series로 변환하여 범주형으로 변환

1
2
3
4
5
6
7
#1
experience['Experience'] = pd.Categorical(
experience['Experience'],
['No experience', '<1 years',
'1-3 years', '3-5 years', '5-10 years',
'10-20 years', '20+ years']
)

pd.categories


(#2) : experience[‘percent’]

Experience에 하나의 tap을 추가 해준다.
SQL 의 insert 에 percent tep을 만들어 줄 때 column에대해 계산하여 값을 보여주는 것과 같은 느낌.

value에 들어갈 수식 지정_ Experience의 percent 계산

1
2
3
                                         
#2
experience['percent'] = ((experience['Count'] / experience['Count'].sum())*100).round(2).astype(str) + '%'



(#3) : experience.sort_values()

데이터 정렬하기 : 컬럼의 data를 기준으로 정렬
- short_Index의 경우에는 Index를 기준으로 data를 정렬한다.
- 이 경우에는 (‘Experience’)를 기준으로 default값인 오름차순으로 정렬

experience.sort_values()

보통 percent나 count를 기준으로 정렬 되는데 이 경우 sort_values(‘Experience’) 를 하였기때문에
기준인 Experience를 기준으로 오름차순으로 정렬 되었다.

Short_value

1
2
3

#3
experience = experience.sort_values('Experience')



(#4) : colors

바chart의 color을 설정

  • *7 은 7개의 수준이 있다는 것.
  • colors[N] = 뭘까

chart color

1
2
3
4
5
6
7
8
9

#4
colors = ['#033351',] * 7
colors[1] = '#5abbf9'
colors[2] = '#5abbf9'
colors[3] = '#0779c3'
colors[4] = '#0779c3'




(#5) : fig = go.Figure(go.Bar())

import plotly.graph_objects as go 이기
때문에 fig는 plotly library 함수 사용

1
2
3
4
5
6
7
8
#5
fig = go.Figure(go.Bar(
y=experience['Count'],
x=experience['Experience'],
cliponaxis = False,
text=experience['percent'],
marker_color=colors
))
  1. x축, y축 정해주기

    y=experience[‘Count’],

    x=experience[‘Experience’],


  1. cliponaxis

    cliponaxis = False,

    cliponaxis – Text node를 아래 축에 고정 할지 아닐지 결정
    text node를 축 라인과 체크라벨 위에 보여주기위해서는 x축Layer와 y축 layer 설정을 해 주어야 한다.


  1. text=experience[‘percent’]

  2. marker_color=colors

    • 지정 해 준 colors를 사용.

barBefore.png

(#6) : fig.update_traces()

그래프 위에 캡션 다는 기능


Perform a property update operation on all traces that satisfy the specified selection criteria
지정된 선택 기준을 충족하는 모든 추적에 대해 속성 업데이트 작업 수행 (?? 전혀 모르겠군 !)
아래 본문과는 상관없는 data를 좀 보세요.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
df1 = df['Q1'].value_counts()
df2 = df['Q1'].value_counts(normalize = True)
val_pnt_df = pd.DataFrame({"count":df1,"%":df2*100})

fig = go.Figure()
# [str(x) + ' %' for x in np.round(val_pnt_df["%"].values, 1).tolist()]
# Add Traces
fig.add_bar(x = val_pnt_df.index,
y = val_pnt_df['count'].values,
text = [str(x) + ' %' for x in np.round(val_pnt_df["%"].values, 1).tolist()],
textposition="auto")

# layout
fig.update_layout(title_text = "Q1. " + questions[1])

fig.show()

python의 comprehension


오늘은 못보고 나중에 다시 보자 !


1
2
3
4
5
6

#6
fig.update_traces(texttemplate='%{text}',
textposition='outside',
hovertemplate='<b>Experience</b>: %{x}<br><extra></extra>'+
'<b>Count</b>: %{y}', textfont_size=12)

  • texttemplate=’%{text}’, : text type
  • textposition=’outside’, : inside하면 그래프 안쪽, ouside 하면 그래프 위쪽에 생성
  • hovertemplate= 커서를 가까이 대면 나오는 창 x값과, y 값이 어떤 상태인지 알려 준다.

Experience

hevertemplate

Returns the Figure object that the method was called on

메서드가 호출된 그림객체를 반환.

plotly.graph_objects.Figure.update_traces



hovertemplate_up



1
2
3
#7
fig.update_xaxes(showgrid=False)
fig.update_yaxes(showgrid=False)

(#7) : fig.update_?axes()

만들어진 fig를 수정.
SQL의 update와 비슷한 기능인듯.

fig.update_xaxes(showgrid=False) : x축의 grid 수정
fig.update_yaxes(showgrid=False) : y축의 grid 수정

showgrid=False


축을 보이지 않는 형태로 바꾸어 예쁘게 보이게 해줌.

(#8) : update_layout()

1
2
3
4
5
6
7
8
9
10
11
12
13
14

#8
fig.update_layout(showlegend=False,
plot_bgcolor='#F7F7F7',
margin=dict(pad=20),
paper_bgcolor='#F7F7F7',
height=500,
yaxis={'showticklabels': False},
yaxis_title=None,
xaxis_title=None,
title_text="<b>Experience</b> Distribution",
title_x=0.5,
font=dict(family="Hiragino Kaku Gothic Pro, sans-serif", size=14, color='#000000'),
title_font_size=35)

default로 되어있는 그래프의 Layout을 수정.

UpdateLayout

  • showlegend = False

    • 래전드를 보여줄지 : 안보여줌
  • plot_bgcolor=’#F7F7F7’

    • plot_bgcolor
  • margin=dict(pad=20)
    -dic에는 여러가지가 올 수 있는데 여기서는 dict(pad)를 사용

    • padding을 설정, 축과 그래프 사이의 패딩을 px 단위로 설정
    • Sets the amount of padding (in px) between the plotting area and the axis lines
    • layout-margin
  • paper_bgcolor=’#F7F7F7’

    • 배경색 설정
    • paper_bgcolor
  • height=500

    • plot size 설정
  • yaxis={‘showticklabels’: False}

    • y축의 showticklabels 설정 : 안함
  • yaxis_title=None, xaxis_title=None

    • y축 제목, x축 제목 설정 : 없음
  • title_text=”Most Recommended Programming Language

    • 제목 달기 <b> code는 bolde tag인듯.
  • title_x=0.5, title_y=0.95,

    • 제목의 위치 (상단 고정)
  • font=dict(family=”Hiragino Kaku Gothic Pro, sans-serif”, size=17, color=’#000000’),

                title_font_size=35)
    
    • title의 font 설정 (Default: “”Open Sans”, verdana, arial, sans-serif”)
    • font 설정
    • family, color, size 설정 가능, title_fond도 함께 설정 가능 해 보임.

plotly.graph_objects.Figure.update_layout

(#9) : add_annotation()

annotation의 경우 plot 안에 글을 집어 넣는 것.

설명을 추가 해 준다고 생각하면 쉽다.

어렵지도 않고, 같은 내용이므로 이전 posting을 첨부

annotation

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

fig.add_annotation(dict(font=dict(size=14),
x=0.98,
y=-0.24,
showarrow=False,
text="@miguelfzzz",
xanchor='left',
xref="paper",
yref="paper"))

fig.add_annotation(dict(font=dict(size=12),
x=-0.03,
y=-0.24,
showarrow=False,
text="Source: 2021 Kaggle Machine Learning & Data Science Survey",
xanchor='left',
xref="paper",
yref="paper"))
fig.show()

img_1.png


ref.

plotly.graph_object Parameter

var chart in plotly/en

kaggle :Plotly_Treemap (Q8)

kaggle dictation (01)



plotly.graph_objects as go : 를 이용한 Treemap

  • 많은 계층 구조 데이트를 표현할때 적합.
  • Ben Shneiderman에 의해 1990년도부터 출발
  • Treemap은 크기(count) 순서로 %에따라 공간을 차지하는 사각형으로 표현됨.
  • 계층에서 동일한 수준에 속하는 각 사각형 집합은 데이터 테이블의 표현식 또는 컬럼을 표현.
  • 계층에서 동일한 수준의 개별 사각형은 컬럼의 Index


언제 사용하면 좋을까

- 많은 범주간의 부분과 전체를 시각화 하고 싶을때
- 범주 간의 정확한 비교 대신 큰 특징을 나타내고 싶을때
- 데이터가 계층을 이루고 있을때


사용한 Library

1
2
3
4
5
6
7
8
import pandas as pd
import numpy as np
import seaborn as sns
import plotly.express as px
import plotly.graph_objects as go

import warnings
warnings.filterwarnings('ignore')
사실 이 부분에서 seaborn을 사용 했는지 잘 모르겠음.
github에서 plotly가 동적 Livrary라 자꾸 오류가남.


data import

data 원문
data import 방법
data는 Kaggle의 the-typical-kaggle-data-scientist-in-2021 data를 이용하였음.

data 불러오기/합치기

data를 표현 해 주기 위해 컴퓨터가 읽을 수 있는 형태로 가공.
1
2
df = pd.read_csv('../input/kaggle-survey-2021/kaggle_survey_2021_responses.csv')
df = df.iloc[1:, :]

df : data frame에 file 연동.
df.iloc[1:, :] : 1행부터 끝까지 건너뛰기 없이 선택

행번호(row number)로 선택하는 방법 (.iloc)
label이나 조건표현으로 선택하는 방법 (.loc)

Ref. loc, iloc을 이용한 행 선택



data encoding (Feature Engineering)

사실 이 부분이 feature Engineering에 해당하는 부분인지 잘 모르겠다.
이 부분은 data를 computer로 자동화하여 계산, 동적 그래프를 만들기 위한 부분.

###Feature Engineering
####data frame 설정

1
2
3
4
5
6
7
8
9
10
11
12
recommend_leng = ( df['Q8']
.value_counts()
.to_frame()
.reset_index()
.rename(columns={'index':'Lenguage', 'Q8':'Count'})
.sort_values(by=['Count'], ascending=False)
)

df['Q8'].head()

recommend_leng

recommend_leng


dataframe[Q8] : data를 가공하여 분석 할 예정

  • pd.value_counts()
    • Q8의 data counting, 중복된 data 를 counting 하여 수를 나타냄.
  • pd.frame()
    • dataframe으로 표의 형태를 잡아준다.
  • pd.reset_Index()
    • Q8의 Index reset, 원본 data에는 영향을 주지 않으면서 새로운 Index 생성
    • Reset_parameter/Ko
  • pd.rename()
    • columns에 Index를 붙여 호출 하기 위해 이름을 바꿔줌
    • index는 Lenguage로, count는 Q8로
  • pd.sort_values()
    • count 값으로 정렬
    • by=[‘Count’], ascending = false
    • by에 option 기준, (오름차순 = F )= 내림차순으로 정렬



앞으로 사용 할 색상을 미리 지정

  • 한 눈에 보기 편함.
1
2
3
4
5
6
colors = ['#033351',] * 13
colors[0] = '#5abbf9'
colors[1] = '#066eb0'
colors[2] = '#044a77'
colors[3] = '#043e64'
colors[4] = '#043e64'

아직 잘 모르겠는 부분은 왜 colors = [‘#NNNNNN’, ] 이 부분과 *13 이부분



Treemap 생성

1
2
3
4
5
6
fig = go.Figure(go.Treemap(
labels = recommend_leng['Lenguage'],
values = recommend_leng['Count'],
parents = ['']*recommend_leng.shape[0],
textinfo = "percent root+label+value+text",
))

fig 생성

  • import plotly.graph_objects as go
    plotly의 graph_objects 를 이용하여 객체 생성.

Treemap의 parameter

  • labels : values 이름
  • values : 값
  • parents : ???
  • textinfo = 표시형식

fig.update_traces(hovertemplate)

1
2
fig.update_traces(hovertemplate='<b>Lenguage</b>: %{label}<br><extra></extra>'+
'<b>Count</b>: %{value}')

hovertemplate


  • fig.update_traces()
  • 그래프 위에 캡션 다는 기능
    • Perform a property update operation on all traces that satisfy the specified selection criteria
    • 지정된 선택 기준을 충족하는 모든 추적에 대해 속성 업데이트 작업 수행 (?? 전혀 모르겠군 !)

  • hoverinfo : 마우스 오버시 나타나는 추적정보
  • hovertemplate : 커서를 가까이 대면 나오는 창을 렌더링하는데 사용되는 Temp
    • 변수 : %{variable} (변수의 형식을 지정)
      • 숫자 : %{d3-format}
      • price : %{yL$.2f}


fig.update_layout()

fig의 layout을 설정.

hoverTemp까지 설정된 treemap.


Before_layout



fig.update_layout()을 사용하여 layout을 변경 해 보자.


After_layout


1
2
3
4
5
6
7
8
9
10
11
12
13
14
fig.update_layout(showlegend=False, 
treemapcolorway = colors,
margin=dict(pad=20),
paper_bgcolor='#F7F7F7',
plot_bgcolor='#F7F7F7',
height=600,
yaxis={'showticklabels': False},
yaxis_title=None,
xaxis_title=None,
title_text="Most Recommended <b>Programming Language</b>",
title_x=0.5,
title_y=0.95,
font=dict(family="Hiragino Kaku Gothic Pro, sans-serif", size=17, color='#000000'),
title_font_size=35)
  • showlegend = False
    • 래전드를 보여줄지 : 안보여줌
  • treemapcolorway = colors
    • 위에서 정의 해 준 colors가 13개였는데 여기 계층도 13개임
      • 아마도 light 부터 deep으로 색이 정해지는듯.
  • margin=dict(pad=20)
    -dic에는 여러가지가 올 수 있는데 여기서는 dict(pad)를 사용
    • padding을 설정, 축과 그래프 사이의 패딩을 px 단위로 설정
    • Sets the amount of padding (in px) between the plotting area and the axis lines
    • layout-margin
  • paper_bgcolor=’#F7F7F7’
    • 배경색 설정

paper_bgcolor

  • plot_bgcolor=’#F7F7F7’
    • 설정 바꿔 보았으나 안보임
  • height=600
    • plot size 설정
  • yaxis={‘showticklabels’: False}
    • y축의 showticklabels 설정 : 안함
  • yaxis_title=None, xaxis_title=None
    • y축 제목, x축 제목 설정 : 없음
  • title_text=”Most Recommended Programming Language
    • 제목 달기 <b> code는 bolde tag인듯.
  • title_x=0.5, title_y=0.95,
    • 제목의 위치 (상단 고정)
  • font=dict(family=”Hiragino Kaku Gothic Pro, sans-serif”, size=17, color=’#000000’),
                title_font_size=35)
    
    • title의 font 설정 (Default: “”Open Sans”, verdana, arial, sans-serif”)
    • font 설정
    • family, color, size 설정 가능, title_fond도 함께 설정 가능 해 보임.


fig Information 추가

fig.add_annotation() _1

플롯에 메모를 남길 수 있는것. 코멘트나 copy-Right 같은걸 남기는듯

-[plotly-annotation/ko.] (https://soohee410.github.io/plotly_annotation)

1
2
3
4
5
6
7
8
fig.add_annotation(dict(font=dict(size=14),
x=0.96,
y=-0.14,
showarrow=False,
text="@miguelfzzz",
xanchor='left',
xref="paper",
yref="paper"))

dict = dictionary

A list or tuple of dicts of string/value properties where:
The ‘type’ property specifies the trace type

  • 여기서 dict는 fig객체 즉 plotly.graph_objects.Figure 에서 상응하는 정보(font, size등) 변수를 가져와 대응 시켜 주는 역할을 한다.

plot 아래에 보면 “@miguelfzzz”이라는 글자가 보이는데 이것을 설정 한 것.

  • showarrow=False,
    • 화살표등을 남길 수 있는데 이 Graph에선 false
  • xref=”paper”, yref=”paper”
    • 어느 부분 (plot or paper)에 표시 할 것인지

나머지는 말 안해도 이제는 알 수 있기 때문에 생략.

fig.add_annotation() _2

1
2
3
4
5
6
7
8
fig.add_annotation(dict(font=dict(size=12),
x=0.01,
y=-0.14,
showarrow=False,
text="Source: 2021 Kaggle Machine Learning & Data Science Survey",
xanchor='left',
xref="paper",
yref="paper"))


fig.show() 내보내기

1
fig.show()

fig.show()로 마무리 해 주면 된다.

이건 java의 return과 같은 느낌인듯.

Plotly Treemap/en.

layout/en.