Kaggle_Survey03: Treemap 시각화 [plotly]

기본 설정

module

treemap으로 많은 요소를 건드리진 않을 예정이니 express 라이브러리를 사용

1
2
import pandas as pd
import plotly.express as px

Import data

2021년 자료 외에도 19년 자료를 추가

1
2
3
4
df21 = pd.read_csv("https://raw.githubusercontent.com/hangack/project-green/main/Kaggle_Survey-2021/data/kaggle-survey-2021/kaggle_survey_2021_responses.csv", dtype='unicode')
df19 = pd.read_csv("https://raw.githubusercontent.com/hangack/project-green/main/Kaggle_Survey-2021/data/kaggle-survey-2019/multiple_choice_responses.csv", dtype='unicode')
#df21 = pd.read_csv("../input/kaggle-survey-2021/kaggle_survey_2021_responses.csv", dtype='unicode')
#df19 = pd.read_csv("../input/kaggle-survey-2019/multiple_choice_responses.csv", dtype='unicode')

Japan & China: Programming_Languages

2021 Japan & China total

2021년 Q3(Country) 일본 중국 추출 dataframe

1
df21_ChJp = df21[df21.Q3.isin(["Japan","China"])]

Split Country

나라별 value_counts를 위해 각 나라로 dataframe 분리

2021

value_counts 오류 식별 결측값 제거

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
df21_Ch = df21_ChJp[df21_ChJp.Q3.isin(["China"])]
df21_Jp = df21_ChJp[df21_ChJp.Q3.isin(["Japan"])]


## Q7(Program_Language): 칼럼번호 8~20 - others
df21_Jp_PL = pd.DataFrame()
df21_Jp_PL['Program_Language'] = [df21_Jp[col][1:].value_counts().index[0] for col in df21_Jp.columns[7:19]]
df21_Jp_PL['counts'] = [df21_Jp[col][1:].value_counts().values[0] for col in df21_Jp.columns[7:19]]


## 2021 China: Q7_Part12(None) value == 0이므로 결측값 제거
df21_Ch_rmQ07P12 = df21_Ch.drop(['Q7_Part_12'], axis='columns')

## Q7(Program_Language): 칼럼번호 8~20 - others - Q7_Part12(None)
df21_Ch_PL = pd.DataFrame()
df21_Ch_PL['Program_Language'] = [df21_Ch_rmQ07P12[col][1:].value_counts() .index[0] for col in df21_Ch_rmQ07P12.columns[7:18]]
df21_Ch_PL['counts'] = [df21_Ch_rmQ07P12[col][1:].value_counts() .values[0] for col in df21_Ch_rmQ07P12.columns[7:18]]


## 제거된 나라 칼럼과 value를 각각 삽입 및 통합
df21_Jp_PL.insert(0, 'Country', 'Japan')
df21_Ch_PL.insert(0, 'Country', 'China')

df21_PL_JnC = pd.concat([df21_Jp_PL,df21_Ch_PL], ignore_index=True)

2019 Japan & China total

2019년 Q3(Country) 일본 중국 추출 dataframe

1
df19_ChJp = df19[df19.Q3.isin(["Japan","China"])]

2019

2021년과 동일 과정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
df19_Ch = df19_ChJp[df19_ChJp.Q3.isin(["China"])]
df19_Jp = df19_ChJp[df19_ChJp.Q3.isin(["Japan"])]


## Q18(Program_Language): 칼럼번호 83~95 - others & other(text)
df19_Jp_PL = pd.DataFrame()
df19_Jp_PL['Program_Language'] = [df19_Jp[col][1:].value_counts().index[0] for col in df19_Jp.columns[82:93]]
df19_Jp_PL['counts'] = [df19_Jp[col][1:].value_counts().values[0] for col in df19_Jp.columns[82:93]]


## 2019 China Q18_Part11(None) 결측값 제거
df19_Ch_rmQ18P11 = df19_Ch.drop(['Q18_Part_11'], axis='columns')

## Q18(Program_Language): 칼럼번호 83~95 - others & other(text) - Q18_Part11(None)
df19_Ch_PL = pd.DataFrame()
df19_Ch_PL['Program_Language'] = [df19_Ch_rmQ18P11[col][1:].value_counts() .index[0] for col in df19_Ch_rmQ18P11.columns[82:92]]
df19_Ch_PL['counts'] = [df19_Ch_rmQ18P11[col][1:].value_counts() .values[0] for col in df19_Ch_rmQ18P11.columns[82:92]]



df19_Jp_PL.insert(0, 'Country', 'Japan')
df19_Ch_PL.insert(0, 'Country', 'China')

df19_PL_JnC = pd.concat([df19_Jp_PL,df19_Ch_PL], ignore_index=True)

Split year{Country}

다른 csv인 2019자료와 2021자료 통합

1
2
3
4
df21_PL_JnC.insert(0, 'year',  '2021')
df19_PL_JnC.insert(0, 'year', '2019')

df_PL_JnC_21n19 = pd.concat([df21_PL_JnC,df19_PL_JnC], ignore_index=True)

Program_Language의 19년도 21년도 통합 value_counts의 정렬(연도 - 언어 - 나라)

values는 Program_Language의 value_counts

Programming_Languages [treemap]

이전 언급처럼 treemap으로 많은 요소를 건드리진 않을 예정이니 express 라이브러리를 사용했다.

path 요소의 순서는 부모자식 순서로 dataframe 칼럼 순서에 제한되지 않는다. -> path 요소 조정으로 순서를 맘대로 바꿀 수 있다.

color 기준: country

1
2
3
4
5
6
7
8
9
fig = px.treemap(df_PL_JnC_21n19, path=[px.Constant("2019n2021"),'year','Program_Language','Country'],
values='counts', color='Country',
color_discrete_map={'(?)':'lightgrey', 'China':'gold', 'Japan':'darkblue'})

fig.data[0].textinfo = 'label+percent parent+value'

fig.update_layout(margin = dict(t=0, l=0, r=0, b=0))

fig.show()

color 참조 값을 counts로 넣었을 때는 plotly.express 설정대로 colorbar가 나온다.

color 기준: counts

1
colors = ['#D2691E','#E19B50','#E6C17B','#F0CB85','#F5D08A','#FFEFD5']
1
2
3
4
5
6
7
8
fig = px.treemap(df_PL_JnC_21n19, path=[px.Constant("2019n2021"),'year','Program_Language','Country'],
values='counts', color='counts', color_continuous_scale=colors)

fig.data[0].textinfo = 'label+percent parent+value'

fig.update_layout(margin = dict(t=0, l=0, r=0, b=0))

fig.show()

Kaggle_Survey02: Bar 시각화 [plotly]

이전 포스팅들과 동일 과정

1
2
3
4
import pandas as pd
import plotly.graph_objects as go

colors = ['#FF0000','#FFBB00','#ffff00','#00FF00','#0000FF','#9C009C']
1
2
df = pd.read_csv("https://raw.githubusercontent.com/hangack/project-green/main/Kaggle_Survey-2021/data/kaggle-survey-2021/kaggle_survey_2021_responses.csv", dtype='unicode')
#df = pd.read_csv("../input/kaggle-survey-2021/kaggle_survey_2021_responses.csv")
1
2
3
4
df_ChJp = df[df.Q3.isin(["Japan","China"])]

df_Ch = df_ChJp[df_ChJp.Q3.isin(["China"])]
df_Jp = df_ChJp[df_ChJp.Q3.isin(["Japan"])]
1
2
3
def indiQ_value_counts(dataframe, indi_Qnum):
df = dataframe[indi_Qnum][1:].value_counts()
return df
1
2
df_Jp_age = indiQ_value_counts(df_Jp, 'Q1')
df_Ch_age = indiQ_value_counts(df_Ch, 'Q1')

Age [plotly: Bar]

01에 이어 이번에도 두 나라의 값을 비교할 예정이니 아예 처음부터 데이터를 합쳐서 표현한 그래프를 뽑아내겠다.

1
2
3
4
5
6
7
8
Bar_C = go.Bar(name='China',
x=df_Ch_age.index,
y=df_Ch_age.values
)
Bar_J = go.Bar(name='Japan',
x=df_Jp_age.index,
y=df_Jp_age.values
)
1
2
3
4
5
6
7
8
fig = go.Figure(data=[Bar_C,
Bar_J])

fig.update_layout(title='Age: Japan & China',
xaxis_title="Age", yaxis_title='Counts'
)

fig.show()

Bar1

bar chart에서 stack 형식을 사용하거나 group과 stack을 동시에 사용하지 않는 이상 하나의 plot에 여러 bar data를 넣으면 default는 group 형식으로 뽑힌다.

index 정렬

나이 순으로 출력하고 싶었지만, value_counts 할 때 원본 dataframe의 요소 순서로 index가 들어가버렸다.

그래서 value_counts된 dataframe을 sort_index를 사용해 오름차순 정렬한다.

1
2
df_Ch_sortAge = df_Ch_age.sort_index()
df_Jp_sortAge = df_Jp_age.sort_index()

Bar2

60-69 구간에 더미값 추가

정렬은 문제없어 보였지만 70+와 60-69 순서가 이상하다.

1
df_Ch_sortAge
18-21    206
22-24    274
25-29    159
30-34    109
35-39     39
40-44     14
45-49      8
50-54      1
55-59      2
70+        1
Name: Q1, dtype: int64

아무래도 China에 60-69 구간에 해당하는 value가 없어서 index 추가가 안된거같다.

index가 전부 있는 Japan을 앞 순서로 바꿔도 되겠지만, 그냥 China 60-69 index를 추가하고 임의로 값 0를 넣겠다.

1
2
df_Ch_sortAge.loc['60-69'] = 0
df_Ch_sortAge = df_Ch_sortAge.sort_index()

Bar3

외부링크

Kaggle_Survey01: Pie 시각화 [plotly]

dataset 구조 확인하기

1
2
3
4
import pandas as pd
import plotly.graph_objects as go

colors = ['#FF0000','#FFBB00','#ffff00','#00FF00','#0000FF','#9C009C']
1
2
df = pd.read_csv("https://raw.githubusercontent.com/hangack/project-green/main/Kaggle_Survey-2021/data/kaggle-survey-2021/kaggle_survey_2021_responses.csv", dtype='unicode')
#df = pd.read_csv("../input/kaggle-survey-2021/kaggle_survey_2021_responses.csv")

Columns 구조는 문자열에서 특정 값을 뽑아내고 input을 받는 함수 포스트에서 확인했으므로 넘어간다.

비교 대상 선정하기

2021 kaggle_survey 분석을 계속 진행한다.

베이스는 2021년 기준 survey 응답 count 수가 비슷한 일본과 중국을 선정했다.
한국 넣으려다 응답수가 낮아 방향을 바꿨다

kaggle_survey_2021_responses의 모든 row를 사용할 필요 없으므로 Q3(country) 응답에 Jp(Japan), Ch(China)인 요소만 추출한다.

1
2
3
4
df_ChJp = df[df.Q3.isin(["Japan","China"])]

df_Ch = df_ChJp[df_ChJp.Q3.isin(["China"])]
df_Jp = df_ChJp[df_ChJp.Q3.isin(["Japan"])]

Gender [plotly: Pie]

일단 간단히 비교할 수 있는 Gender(Q2)와 Age(Q1) 중 Q2를 Pie 그래프로 시각화할 예정이다.

간단한 Pie 그래프를 사용할 예정이고, 간단한 그래프인 만큼 pie 요소 option을 만질 여지가 많다.
따라서 express가 아닌 graph_objects 모듈로 작업했다.

plotly.graph_objects.Pie를 사용해서 만든 그래프를 Figure 형식으로 지정하고 fig_j 객체에 저장한다.

아래 코드는 필수 요소인 lablesvalues만 넣은 결과다.

1
2
3
4
5
6
7
fig_j = go.Figure(data=[go.Pie(labels=df_Jp['Q2'][1:].value_counts().index, 
values=df_Jp['Q2'][1:].value_counts().values
)
]
)

fig_j.show()

Pie1

대응하는 value_counts 함수 만들기

앞으로 많은 그래프를 그려낼거고 df_Jp['Q2'][1:].value_counts() 형식이 반복된다.

df_Jp['Q2'][1:].value_counts()을 객체로 만들어서 넣어도 되겠지만, 이번 작업에서 사용할 df은 df_Jp&df_Ch 2개로 dataframe 객체의 변동이 있고, 칼럼명도 Q1,Q2로 변동이 있다.
위 조건에 부합하는 간단한 함수 하나 만들겠다.

1
2
3
def indiQ_value_counts(dataframe, indi_Qnum):
df = dataframe[indi_Qnum][1:].value_counts()
return df
1
2
df_Jp_gen = indiQ_value_counts(df_Jp, 'Q2')
df_Ch_gen = indiQ_value_counts(df_Ch, 'Q2')

subplots: 그래프 figure 합치기

japan과 china 함수를 각각의 figure로 보기엔 불편하다.
subplost를 이용해 하나의 fig로 합칠 예정이다.

1
from plotly.subplots import make_subplots
1
2
3
4
5
6
7
Pie_J = go.Pie(labels=df_Jp_gen.index, 
values=df_Jp_gen.values
)

Pie_C = go.Pie(labels=df_Ch_gen.index,
values=df_Ch_gen.values
)
1
2
3
4
5
6
fig = make_subplots(rows=1, cols=2,specs=[[{"type": "domain"},{"type": "domain"}]])

fig.add_trace(Pie_J,row=1,col=1)
fig.add_trace(Pie_C,row=1,col=2)

fig.show()

Pie1

text, color 커스텀

커스텀 색상이나 타이틀 등 텍스트를 넣어 간단한 시각적 커스텀을 입혀보자

1
2
3
4
5
6
7
8
9
10
11
Pie_J = go.Pie(labels=df_Jp_gen.index, 
values=df_Jp_gen.values,
title='Japan',
textinfo ='label,percent'
)

Pie_C = go.Pie(labels=df_Ch_gen.index,
values=df_Ch_gen.values,
title='China',
textinfo ='label,percent'
)
1
2
3
4
5
6
7
8
9
fig = make_subplots(rows=1, cols=2,specs=[[{"type": "domain"},{"type": "domain"}]])

fig.add_trace(Pie_J,row=1,col=1)
fig.add_trace(Pie_C,row=1,col=2)

fig.update_layout(title_text='Gender')
fig.update_traces(marker=dict(colors=colors[1:]))

fig.show()

Pie1

시각 요소 커스텀

Trace의 title이 Pie 외부에 위치하는게 맘에들지 않는 부분을 수정하기 위해 시각 효과에서 legend를 제거하는 등 각종 요소 값을 변경한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Pie_J = go.Pie(labels=df_Jp_gen.index, 
values=df_Jp_gen.values,
# pull=[0,0,0.2,0.2,0.2], ## 중앙에서 n% 떨어진 위치 할당
title='Japan',
textinfo ='label,percent',
hole=0.3
)

Pie_C = go.Pie(labels=df_Ch_gen.index,
values=df_Ch_gen.values,
# pull=[0,0,0.2,0.2,0.2],
title='China',
textinfo ='label,percent',
hole=0.3
)
1
2
3
4
5
6
7
8
9
10
11
12
13
fig = make_subplots(rows=1, cols=2,specs=[[{"type": "domain"},{"type": "domain"}]])

fig.add_trace(Pie_J,row=1,col=1)
fig.add_trace(Pie_C,row=1,col=2)

fig.update_layout(title_text='Gender',
# showlegend=False, ## ledend(lable 목록) 시각적으로 제거
margin=dict(t=0, b=0, l=0, r=0)
)
fig.update_traces(marker=dict(colors=colors[1:]))


fig.show()

외부링크

Rstudio 처음 세팅하기

Rstudio 기본 설치 프로그램

  • Rstudio는 R 언어를 사용하는 프로그램이니 R 언어팩을 설치한다.

  • 사용할 작업 환경인 Rstudio도 받아주고,

  • Rtools를 설치하면 R의 기본적인 Package 세트와 C/C++과 같은 의존성 세팅을 불러올 수 있다.

Rstudio 기본 세팅

나는 memo 앱을 사용할 때도 자동 줄바꿈을 사용하는 편이기에 Soft-wrap를 체크했다.

Soft-wrap R source files

윈도우 환경이라면 언어 인코딩 방식을 UTF-8로 변경하는걸 추천한다.

default text encoding

R Script

R studio 상단의 files 탭에서 project 경로를 생성하거나 py 혹은 ipynb 처럼 R Script, Rmd 파일창을 열 수 있다.

new

Rtools path 설정

R Script 등을 열었다면 Rtools의 경로를 지정해준다.

1
write('PATH="${RTOOLS40_HOME}\\usr\\bin;${PATH}"', file = "~/.Renviron", append = TRUE)

R은 PL/SQL처럼 동작한다. 원하는 명령어를 작성하고 해당 열에서 Ctrl+Enter 해주면 된다.

이후 Path값을 다시 불러오기 위해 R을 재시작한다. 나의 경우 R restart로 해결안되서 Rstudio 자체를 재실행했다.
그냥 깔끔하게 Rstudio를 껏다키는걸 추천한다.

패키지 불러오기

1
2
3
install.packages("Package_Name")
#혹은
install.packages("Package_Name", dependencies = TRUE)

패키지 함수를 사용하려면 다른 프로그램 언어들처럼 file에서 package를 import 해줘야한다.

1
library(Package_Name)

만약 콘솔에 사용하려는 패키지가 없다고 나온다면 install.packages("패키지명")를 해주자.

특수한 경우에 대한 오류는 R 패키지 리스트에서 stringi처럼 시스템 기본 요구사항이 들어있는 경우다.

stringi

일반적인 경우는 Rtools 설치에서 해결됐을테니 크게 신경쓸 필욘 없다.

외부링크

튜토리얼

Kaggle_Survey00: dtype Warning 해결하기 [pandas]

1
import pandas as pd
1
2
3
4
5
#df = pd.read_csv("D:/_Bdata/Codding-base-Python/Python/Python-jupyter/Kaggle Survey - 2021 Analysis - Plotly/kaggle_survey_2021_responses.csv")

df = pd.read_csv("E:/Fear/Univ/Big_data/Training/Github/Codding-base-Python/Python/Python-jupyter/Kaggle Survey - 2021 Analysis - Plotly/kaggle_survey_2021_responses.csv")

#df = pd.read_csv("../input/kaggle-survey-2021/kaggle_survey_2021_responses.csv")
E:\Sadness\anaconda3\lib\site-packages\IPython\core\interactiveshell.py:3165: DtypeWarning: Columns (0,195,201,285,286,287,288,289,290,291,292) have mixed types.Specify dtype option on import or set low_memory=False.
has_raised = await self.run_ast_nodes(code_ast.body, cell_name,

cvs datasat을 불러오는데 위와 같이 DtypeWarning 이라는 경고가 출력되었다.

DtypeWarning 해결하기

filterwarnings

경고 그 자체가 원하는 작업은 아니지만 문제가 발생하지 않는 이상 user는 경고를 무시해도 상관없다.

권장하지 않지만 거슬린다면 warnings 모듈의 경고 필터 ignore를 사용해 경고 출력을 무시할 수 있다.

1
2
from warnings import filterwarnings
filterwarnings('ignore')

low_memory

하지만 근본적인 해결은 아니므로 terminal이 제안한 방식인 low_memory=False 를 넣어 해결할 수 있다.

1
df = pd.read_csv("csv url", low_memory=False)

위 방식은 각 column마다 data type을 추측하는 방식으로 옵션명(낮은 메모리)처럼 작업량이 data 크기에 비례해 증가한다.

방대한 데이터를 처리해야되서 Dtype 추측 방식이 부담된다면?

dtype 형식 지정

불러올 file의 문자 형식을 알고 있다면 dtype을 지정해 warning을 해결하고 memory 가용량도 줄일 수 있다.

1
df = pd.read_csv("csv url", dtype='unicode')

외부링크

Markdown 이미지파일 URL 경로에 띄어쓰기가 있는 경우

Markdown 이미지 삽입 포스팅처럼 md 어법으로 이미지를 삽입하다가 한가지 난관에 부딛혔다.

공백

image url에 공백이 들어간 것.

※ 현재 hexo 랜더러를 kramed로 변경한 상태라 아래처럼 공백도 인식한다.

  • 마찬가지로 hexo 기본 내장 tag 플러그인 어법으로 블로그 포스트는 해결 가능

우린 답을

1
![우린 답을](\images\2111\md url blank\interstellar poster.png)

하지만 ipynb 형식 등 개발환경에서 md 셀을 사용할 때는

jupyter

여전히 발생하는 문제다.

html처럼  를 공백 대신 넣어보기도 하고 cmd 마냥 ""로 묶는 등 코랄을 했지만 markdown 어법으로는 해결하지 못했다.

markdown이 html 어법도 지원하는걸 기억하고 html img 태그로 해결했다.

찾을 것

1
<img src="\images\2111\md url blank\interstellar poster.png" alt="찾을 것">

html 어법을 사용하면 md로 구현 가능한 하이퍼링크 <a href=""></a> tag는 당연하고
가운데 정렬(<center></center>)부터 이미지 크기 변경이 가능한 img 태그 size 요소 등 풍부한 표현이 가능하다.

markdown 수식 넣기

mathjax

Markdown에서는 $x^2$처럼 수식을 사용할 수 있는 mathjax 플러그인이 내장되어있다.

블럭 지정

수식을 사용하기 위해 아래와 같이 식 앞 뒤로 $문자를 넣어줘야한다.

1
$math$

$math$

아래 처럼 $ 문자를 2개 넣는 경우도 있는데,

1
$$math$$

이 경우엔 text 사이에 수식을 삽입하는게 아닌 따로 표현하는 경우에 주로 사용된다.

첨자

수학에서 행의 i번째 속성을 가리키거나 x의 n 제곱을 표현할 때 첨자를 주로 사용한다.

1
$x_i^n$

$x_i^n$

  • 아래첨자: _
  • 위첨자: ^

중괄호

x의 12제곱을 표현하기 위해 단순히 $x^12$만 입력하게 된다면

$x^12$처럼 문자 1개만 위첨자로 처리된다.
이를 해결해주는 문법이 중괄호( { } )다.

1
$x^{12}$

$x^{12}$

단, 중괄호를 mathjax에서 하나의 문자열로 처리하기 위해 사용되므로 중괄호를 사용하는 식에서는 escape(\)로 문법 인식이 아닌 문자 인식으로 바꿔줘야한다.

1
$x_5 = [[\{(x_1)+x_2\}+x_3]+x_4]$

Hexo: 중괄호를 표현하기 위해선 \를 중첩 사용한다.
hexo 수식 사용하기

1
$x_5 = [[\\{(x_1)+x_2\\}+x_3]+x_4]$

$x_5 = [[\{(x_1)+x_2\}+x_3]+x_4]$

행렬 형식

2속성만 넣을 경우

1
$$v{x \choose 0}$$

기본 형식 array행렬 & 괄호 크기 변경

1
2
3
4
5
6
7
$$
X\Bigg\{
\begin{array}{c}
x_{1}\\
x_{2}
\end{array}
$$

P-matrix

1
2
3
4
5
6
7
8
9
10
11
$$
L=
\begin{pmatrix}
b_1 & b_2 & b_3 & \cdots & b_{n-1}& b_n\\
s_1 & 0 & 0 & \cdots & 0 & 0\\
0 & s_2 & 0 & \cdots & 0 & 0\\
0 & 0 & s_3 & \cdots & 0 & 0\\
\vdots&\vdots&\vdots& \ddots & \vdots &\vdots\\
0 & 0 & 0 & \cdots & s_{n-1}& 0\\
\end{pmatrix}
$$

B-matrix

1
2
3
4
5
\begin{bmatrix}
2 & 1 &-1\\
1 & 0 & 5\\
-1 & 3 &-2
\end{bmatrix}

행렬에 세로 줄 넣기

1
2
3
4
5
6
7
8
9
$$
\left[
\begin{array}{ccc|c}
2 & 1 &-1 & 3\\
1 & 0 & 5 & 1\\
-1 & 3 &-2 & 0
\end{array}
\right]
$$

V-matrix

1
2
3
4
5
6
7
$$
\begin{vmatrix}
a & b\\
c & d
\end{vmatrix}
=ad-bc
$$

연립 방정식

1
2
3
4
5
6
7
$$
\begin{cases}
v_1 = 3i+2k\\
v_2 = 2j+k\\
v_3 = i+j+k
\end{cases}
$$

특수문자

수식에서 사용되는 곱셈 나눗셈부터 pi ohm과 같은 특수문자를 삽입하기 위해선 중괄호 경우처럼 \를 사용해야한다.

1
2
3
4
5
$$
(\hat i\cdot\hat i)\div n \\
= \frac{\vert\hat i\vert\times\vert\hat i\vert cos\theta}{n}\\
= \frac{\vert\hat i\vert^2\times 1}{n} = \frac 1n
$$

특수문자는 굉장히 다양하므로 삽입하고자 하는 문자를 LaTex(혹은 Mathjax) 검색어에 붙여 검색하자.

문자열에서 특정 값을 뽑아내고 input을 받는 함수

Kaggle Survey Data Transformation

2021 Kaggle Machine Learning & Data Science Survey 에서 질문지를 나누는 작업 중 여러 part로 다수의 칼럼명을 가진 question number 부분의 칼럼명을 뽑아내는 함수를 찾았고, 이 함수에 대응할 수 있으며 질문의 A,B type을 특정해낼 수 있는 input 함수를 짜봤다.

데이터 칼럼명 나누기

1
2
3
4
5
import numpy as np
import pandas as pd

from warnings import filterwarnings
filterwarnings('ignore')

우선 모든 Question 칼럼명을 추출해낸다.
물론 데이터를 나누는 작업 전에 나눌 데이터와 데이터 명을 학습해야한다.
kaggle_survey_2021_responses.csv의 칼럼명 형식은 다음과 같다.

  • 'Q'(num1)
  • 'Q'(num1)'_Part_'(num2)
  • 'Q'(num1)'_'(type)'_Part_'(num2)

각각을 Question, sub_Qustion, type_Qustion(sub 포함)으로 볼 수 있다.

1
2
3
4
#df = pd.read_csv("D:/_Bdata/Codding-base-Python/Python/Python-jupyter/Kaggle Survey - 2021 Analysis - Plotly/kaggle_survey_2021_responses.csv")
df = pd.read_csv("E:/Fear/Univ/Big_data/Training/Github/Codding-base-Python/Python/Python-jupyter/Kaggle Survey - 2021 Analysis - Plotly/kaggle_survey_2021_responses.csv")
df_col_name = df.columns[1:]
df_col_name
Index(['Q1', 'Q2', 'Q3', 'Q4', 'Q5', 'Q6', 'Q7_Part_1', 'Q7_Part_2',
       'Q7_Part_3', 'Q7_Part_4',
       ...
       'Q38_B_Part_3', 'Q38_B_Part_4', 'Q38_B_Part_5', 'Q38_B_Part_6',
       'Q38_B_Part_7', 'Q38_B_Part_8', 'Q38_B_Part_9', 'Q38_B_Part_10',
       'Q38_B_Part_11', 'Q38_B_OTHER'],
      dtype='object', length=368)

문자열을 인식해서 input 값을 특정해주는 함수 만들기

questions_count에 대응할 수 있는 input 함수를 짜낸다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def input_num():
print("input Question no.: ")
Qnum = input()
Qnum_subQ = [s for s in df_col_name if "Q"+Qnum+"_" in s]

if Qnum_subQ == []:
return "Q"+Qnum+" has not part_Q"

Question_type = None
if [s for s in Qnum_subQ if ("A"or"B") in s]:
print("input Q"+Qnum+"'s type")
Question_type = input().upper()

if Qnum_subQ:
print("input Q"+Qnum+"'s last part no.: ")
part_num = input()


return questions_count(Qnum,part_num,Question_type)

위 함수는
Question number(Qnum)을 입력받은 뒤 이전에 정의한 칼럼명을 추출해 낸 df_col_name 객체내에서 "Q"+Qnum+"_" 문자열이 있는 sub_Question 형식을 찾아낸다.

Data Transformation에서 얻어낸 코드는 Qnum 만 있는 경우에 대한 작업이 없으므로 이 경우는 line6 조건문에서 함수를 종료한다.

line 9의 if문에선 'A' or 'B' 문자가 들어있는 문자열을 list에서 식별해 해당하는 경우엔 Question_type 객체에 type을 입력 받게 되는 조건문을 작성했다.
이 때, upper() 함수를 이용해 소문자로 입력받아도 대문자로 자동변환되게 설정했다.

line 14의 조건문은 sub Question의 마지막 열을 입력받는 조건문으로 사용자가 ‘kaggle_survey’에서 직접 확인해서 input 값을 정해야한다.

칼럼명 리스트로 뽑아내기

Data Transformation에서 가져온 코드로, 원하는 sub_Question들을 뽑아낼 수 있는 함수다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def questions_count(question_num, part_num, Question_type = False):
part_questions = []

if Question_type in ["A","B"]:
part_questions = ['Q'+question_num+"_"+Question_type+"_Part_"+str(j) for j in range(1,int(part_num))]
part_questions.append("Q"+question_num+"_"+Question_type+"_OTHER")
else:
part_questions = ['Q'+question_num+'_Part_'+str(j) for j in range(1,int(part_num))]
part_questions.append('Q'+question_num+'_OTHER')

categories = []
counts = []
for i in part_questions:
category = df[i].value_counts().index[0]
val = df[i].value_counts()[0]
categories.append(category)
counts.append(val)

combined_df = pd.DataFrame()
combined_df['Category'] = categories
combined_df['Count'] = counts

combined_df = combined_df.sort_values(['Count'], ascending = False)
return combined_df

part_question List를 만들어서 칼럼명을 저장하는데, Question_type이 입력되었을 경우와 아닌경우로 조건문이 나뉜다.

  • type이 있는 경우: "Q(num)_(type)_Part_(part_num)"
  • type이 없는 경우: "Q(num)_Part_(part_num)"

csv 파일을 보면 알 수 있지만, sub_qustion의 마지막 칼럼은 Q(num)_OTHER로 구성된다.
위 예외에 대응하기 위해 append함수를 이용해서 list에 Q(num)_OTHER 값을 추가한다.

남은 작업은 기존 df에서 칼럼명과 칼럼에 응답한 합을 구하기 위해value_counts함수의 indexvalues를 사용해서 만든 dataframe을 반환하면 Data Transformation 작업이 끝난다.

1
input_num()
input Question no.: 
1





'Q1 has not part_Q'
1
input_num()
input Question no.: 
7
input Q7's last part no.: 
12
Category Count
0 Python 21860
2 SQL 10756
4 C++ 5535
1 R 5334
5 Java 4769
3 C 4709
6 Javascript 4332
10 MATLAB 2935
11 Other 2575
9 Bash 2216
7 Julia 305
8 Swift 242
1
input_num()
input Question no.: 
27
input Q27's type
a
input Q27's last part no.: 
11
Category Count
0 Amazon Web Services (AWS) 3721
2 Google Cloud Platform (GCP) 3142
1 Microsoft Azure 2450
3 IBM Cloud / Red Hat 572
4 Oracle Cloud 454
7 VMware Cloud 390
10 Other 337
5 SAP Cloud 290
6 Salesforce Cloud 275
8 Alibaba Cloud 259
9 Tencent Cloud 172

외부 링크

기억이 안날 때는 응애..

Markdown 하이퍼링크 이미지 넣기

URL 넣기

URL 단순 입력

단순히 표현하고 싶은 url을 붙여넣으면 아래처럼 해당 text가 url로 링크된다.
엘든링? https://en.bandainamcoent.eu/elden-ring/elden-ring

1
엘든링? https://en.bandainamcoent.eu/elden-ring/elden-ring

URL 삽입

하지만 아래처럼 url 뒤로 띄어쓰기가 없을 경우 < , >로 묶어줘야 정확한 URL 표시가 가능하다.
엘든링 https://en.bandainamcoent.eu/elden-ring/elden-ring엘?든링

1
엘든링 <https://en.bandainamcoent.eu/elden-ring/elden-ring>엘?든링

텍스트 하이퍼링크

특정 텍스트에 URL을 링크하는 text href를 사용하고 싶을 경우엔 [text](URL) 형식으로 작성하면 된다.

엘?든?링?

1
[엘?든?링?](https://en.bandainamcoent.eu/elden-ring/elden-ring)

URL 참조

하나의 URL을 여러번 사용해야할 때 참조 URL을 익혀두면 편하다.

엘든링엘든링?엘?든?링엘?
든?
링?

엘든링!
22년 2월 25일 대발매

1
2
3
4
5
6
7
[엘든링][ER][엘든링?][ER][엘?든?링][ER][엘?
든?
링?][ER]
[엘든링!][ER]
[22년 2월 25일 대발매][ER]

[ER]: https://en.bandainamcoent.eu/elden-ring/elden-ring

이미지 삽입

이미지 삽입은 Href 형식 앞에 !를 붙여 ![alt](URL)로 작성한다.

Elden Ring

1
![Elden Ring](https://p325k7wa.twic.pics/high/elden-ring/elden-ring/00-page-setup/eldenring_new.png?twic=v1/cover=800x267/step=10/quality=80)

이미지 하이퍼링크

그럼 이미지에 링크를 넣는 방법은 어떻게 해야할까?

이미지 표현문을 [ , ]로 묶어 text 처럼 표현하고 그 뒤에 href를 작성하면 된다.
ex) [![alt](URL)](Href)

엘든링 보러가기

1
[![엘든링 보러가기](https://p325k7wa.twic.pics/high/elden-ring/elden-ring/00-page-setup/eldenring_new.png?twic=v1/cover=800x267/step=10/quality=80)](https://en.bandainamcoent.eu/elden-ring/elden-ring)

Hexo local image 삽입하기

참조

Jupyter ModuleNotFound 에러 (feat.plotly)

0. 모듈 에러 확인

Plotly를 외부 컴퓨터에서 잘 사용하다가 집에서 모듈을 설치하기 위해 plotly에서 안내된 install 명령어 대로 설치하고 jupyter로 사용하려니 아래와 같이

1
ModuleNotFoundError: No module named 'plotly'

오류를 뱉어내더라.

cmd에서 plotly를 확인해도 깔려 있는데, 막상 로컬 소프트인 jupyter에서 사용하려니 경로를 못 찾아가는 느낌이라 주피터 path 경로 문제인가 했었다.

구글링해서 내린 결론은 일반 cmd로 모듈을 다운받으면 python에 대한 모듈로 다운받는게 문제였다.

“jupyter는 파이썬 아니냐?”
하겠지만 jupyter에서 import로 참조되는 모듈들은 Anaconda 설치 경로에서 참조되기 때문에 python에 모듈을 설치하는 경우는 아무 의미 없는 작업이된다.

1. Anaconda Prompt

결국 로컬 jupyter에서 외부 모듈을 적용시키기 위해선 anaconda 경로로 설치할 필요가 있고, 많은 방법 중 하나가 Anaconda Prompt다.

아나콘다 경로 혹은 시작화면 앱 찾기에서 Anaconda Prompt를 실행하고

2. plotly 설치

Plotly 설치를 Anaconda prompt에서 진행한다.

1
> pip install plotly==5.3.1

3. Jupyter 모듈 오류 해결

anaconda 로컬 소프트인 jupyter notebook에서 정상적으로 import되는 걸 확인할 수 있다.

그렇다면 구글, 당신이 신이란거야?