728x90

Python Jupyternotebook으로 코딩하다보면 http://localhost:8889/tree 에서 작업하는걸 볼 수 있다.

 

 

 

 

그러다 문뜩 도커에 분명 쥬피터 이미지가 있을것 같은데? 했는데 역시 있었다!!!

다시 말하자면 전세계 어디든 인터넷만 된다면 나만의 코딩 공간을 확보할 수 있다는 것이다.

(물론 깃허브로 가능함) ->  아이패드에서 깃허브 코드 관리하는 방법도 다음에 알아보겠음

 

1.  도커 설치 : 시놀로지 패키지센터 > 도커설치 

2.  이미지 검색  : 검색창 > jupyer 검색

가장 위의 datascience-notebook 다운 

 

 

 

 

 

3. 컨테이너 설정

1. 이미지 더블 클릭하고 "고급 설정" 선택

 

2. 나스의 적당한 폴더를 만들고 마운트 경로 "/var/nas/jupyer" 입력

 

3. 로컬포트 자동에서 ->  "8888"로 변경" 하고 다음버튼 

4.  외부 엑세스 8888 생성

제어판 > 외부엑세스 > 라우터 구성 > 사용자 지정 > 라우터 포트

 

 

 

5. 이미지 토큰값 가져오기

 

1. 도커 > 컨테이너 > 해당 이미지 더블클릭

 

2.  로그 > 검색창에 "token" 검색 > token 값 복사

 

 

 http://127.0.0.1:8888/lab?token="토큰값" 라고 보이는게 토큰 값임 

 

 

 

 

6.  나스주소:8888 접속 

토큰 값 넣고 패스워드 만들면 나만의 코딩공간이 생김!!

 

설정한 비밀번호로

다른 컴퓨터에서 나의 나스서버로 접속가능!!

 

시각화를 하기엔 무리이고 그냥 단순 코드 작성이나 마크다운 내용 적기용

이럴땐 컴파일언어보다 인터프리터언어가 좋아보이네!!

 

728x90
728x90

협업 과정에서 서로의 푸시 내역과 알림을 받을 수 없을까? 하다가 알게 된 꿀팁

 

전체 순서

  1.  Slack에서 Github App 설치 
  2.  Slack <- > Github 연동
  3. 원하시는 Channel 에서 알림 설정
  4. Github > Repository 연동
  5. 기타 명령어

 

 

1. 슬랙에서 깃허브 앱 설치

1.  Apps > Add apps  / or 슬랙 상단 검색창에서 app 검색 

 

 

2. "github" 입력 > Github Install

 

2.  슬랙 > 깃 연동

1. 설치가 되었다면 새로운 창으로 redirect 되어서 이창으로 오게 됨 > Add to Slack

 

이제 슬렉에서 깃허브 연동이 1차 완료 되었습니다.

이제는 깃허브로 가서 슬랙과 2차 연동을 진행하여야 합니다.

 

2. 슬랙으로 돌아와서 우측 사이드바 Apps > Github> Connect Github account

 

3. Github에서 슬랙과 연동을 진행합니다.  Connect Github account >

 

 

 

 

 

새로운 창으로 Redirect > Authorize Slack 

 



 

여기까지 됐다면, 슬랙에서 깃허브 앱 설치 완료 및 슬랙 <->깃 연동이 되었습니다.

 

3. 원하는 Channel에서 알림 설정

1. Apps에서도 알림을 받을 수 있지만, 따로 채널을 파서 받도록 하겠습니다. (app-github 생성)

 

2. 사이드 바의 app-github > 메인 화면의 채널 상단 바

 

3. Integrations(통합) >  Add Apps > "Github" 추가 

 

 

채널에 깃허브를 추가가 완료가 되었습니다.

 

 

 

4. Github > Repository 연동

 

 

1. 다시 슬랙으로 돌아와서 알림을 받고자 하는 app-github로 돌아오겠습니다.

/github subscribe "조직or 계정"/ "레포지토리"

를 입력하시면 되는데

 

아직 레포지토리 설정이 되지 않았습니다. 

 

마지만 단계로 어떤 레포지토리 선택만 하시면 됩니다.

2. install Github App > 레포지토리 선택  (All 하시면 모든 레포지토리에 대해 알림이 옵니다)

 

 

3. 다시 한번 하시면 정상 작동됩니다.

단 아직  main(or master)에 대한 issues, pulls, commits, 등등 과 같은 기능에만 알려줍니다.

5. 기타 명령어

# 알림을 받습니다.
/github subscribe owner/repo

# 알림을 해지합니다.
/github unsubscribe owner/repo

# 알림 리스트를 확인합니다.
/github subscribe list

# main(or master) 브랜치 뿐아니라 모든 브랜치의 알림을 받겠다
/github subscribe owner/repository branches commits:all reviews comments


# 채널에 연결할 깃허브 아이디
/github signin

# 이슈생성
/github open owner/repo

# 이슈닫기
/github close [issue link]

# 이 모든 명령어를 한번에 보는 명령어
/github help
 
728x90
728x90

Smartthings 사용하다가 더 뛰어난 안정성과 장비들의 사용량과 데이터 로그들을 수집하고 인터페이스를 커스터마이징 해보고자 HA를 설치하려는데

도커를 쓰자니 DSM 7버전에는 제한이 많다고 하여 NAS에서 가상환경으로 OS구동하면 되지않을까 알아보다가 찾게 되었다!!

 

데이터 로그 모아서 시각화하면 재미있을듯? 

계절별 전기사용량, 시간대별 등등

 

1. VMM 설치 및 설정

저장소 관리자 > 볼륨 > 파일시스템:Btrfs 인지 확인

(벌써 65%나 썻네 80프로되면 슬슬 바꿀준비해야할듯)

 

 

 

패키지 센터 > vir 입력 > Virtual Machine Manage (VMM) 설치

 

 

 

시작 >

 

 

호스트 설정 확인 따로 설정할거 없음.   다음 >

 

 

네트워크 활성 화 시킴.  따로 설정할 거 없음.   다음 >

 

 

VMM으로 사용할 볼륨 선택. 다음 >

 

 

 

 

2. VM용 HA파일 다운받기  

https://www.home-assistant.io/installation/alternative

 

 

 

3번째의 .ova 파일 다운 받기
 
 

 

 

 

 

다시 나스 DSM으로 > VMM 좌측 메뉴 >  가상 컴퓨터 > 생성 옆 화살표 > 가져오기 

 

 

 

 

 

다운받았던 ova파일 선택

 

 

 

 

 

 

 

필자는 램을 20기가로 설치한 상태 4기가는 좀 빡빡해보여 넉넉하게 8기가로 잡아둠

 

 

생성단계에서는 바꿀 수 있지만, 가져오기에서는 크기조절 불가능함

 

 

자동으로 잡을꺼 다음

 

 

 

디폴트로 레거시로 잡혀있을텐데 UEFI로 바꿔주셔야 부팅이 됩니다.

 

 

전원 관리 권한 부분, 딱히 체크안해도 됨

 

 

 

생성 후 가상 컴퓨터 켜기 체크 후 다음

 

 

 

 

시간이 조금 걸림.

기본포트는 8123

 

 

 

 

172.30.1.22:8123 입력하면 이렇게 나와야 정상

728x90
728x90

 

Seaborn은 Matplotlib의 기능과 스타일을 확장한 파이썬 시각화 도구의 고급버전이지만 쉽다.

# import library
import seaborn as sns

# 타이타닉 데이터셋 로딩
titan_df = sns.load_dataset('titanic')

 

회귀직선이 있는 산점도

import matplotlib.pyplot as plt
import seaborn as sns

# 스타일을 지정 - darkgrid
sns.set_style('darkgrid')
# 그래프 객체 생성 - 한 out에 그래프를 살펴보도록
fig = plt.figure(figsize=(15,5)) # 15: 가로길이 // 5: 세로길이
ax1 = fig.add_subplot(1,2,1)  # 1 x 2 사이즈에서 1번째 (왼쪽에 위치함)
ax2 = fig.add_subplot(1,2,2)  # 1 x 2 사이즈에서 2번째 (오른쪽에 위치함)

# 그래프 그리기 - 선형회귀선 표시 (fit_reg = True)
sns.regplot(x='age', y='fare',
           data=titan_df,
           ax=ax1)


# 그래프 그리기 - 선형회귀선 미표시 (fit_reg = false)
sns.regplot(x='age', y='fare',
           data=titan_df,
           ax=ax2,
           fit_reg=False)

plt.show()

 

히스토그램 및 밀도함수

 

# 그래프 객체 생성 - 한 out에 그래프를 살펴보도록
fig = plt.figure(figsize=(15,5)) # 15,5 // 16,8
ax1 = fig.add_subplot(1,3,1)
ax2 = fig.add_subplot(1,3,2)
ax3 = fig.add_subplot(1,3,3)

# 기본값 
sns.distplot(titan_df.fare, ax=ax1)

# hist = False
sns.distplot(titan_df.fare, hist=False, ax=ax2)

# kde = False
sns.distplot(titan_df.fare, kde=False, ax=ax3) # Kernel Density 

# 차트 제목 표시
ax1.set_title('titan fare-hist/kde')
ax2.set_title('titan fare-hist')
ax3.set_title('titan fare-kde')

plt.show()

 

 

히트맵(Heat-map)

# 테이블 생성
table = titan_df.pivot_table(index=['sex'], columns=['class'], aggfunc='size')

# 히트맵 그리기
sns.heatmap(table,
           annot=True,
           fmt='d',
           linewidth=1) # heat-map을 쓰실때 cmap - color mapping :: heatmap_cmap의 종류

박스플롯 / 바이올린 플롯

import matplotlib.pyplot as plt
import seaborn as sns

# 데이터 로드
titan_df = sns.load_dataset('titanic')

# set_style theme
sns.set_style('whitegrid')

# 그래프 객체 생성
fig = plt.figure(figsize=(15,5))
ax1 = fig.add_subplot(2,2,1)
ax2 = fig.add_subplot(2,2,2)
ax3 = fig.add_subplot(2,2,3)
ax4 = fig.add_subplot(2,2,4)

# 박스플롯 - 기본값
sns.boxplot(x='alive', y='age', data=titan_df, ax=ax1).set(title='BOXPLOT')
      # .set(title='BOXPLOT') 타이틀 넣어주기 or 객체.set_title("타이틀")

# 박스플롯 - hue 변수 추가 
sns.boxplot(x='alive', y='age', hue='sex', data=titan_df, ax=ax2).set(title='BOXPLOT + HUE')

# 바이올린 플롯 - 기본값
sns.violinplot(x='alive', y='age', data=titan_df, ax=ax3).set(title='VIOLINPLOT')

# 바이올린 플롯 - hue 변수 추가 
sns.violinplot(x='alive', y='age', hue='sex', data=titan_df, ax=ax4).set(title='VIOLINPLOT+HUE')

 

 

막대 그래프

# 그래프 객체 생성
fig = plt.figure(figsize=(15,5))
ax1 = fig.add_subplot(1,3,1)
ax2 = fig.add_subplot(1,3,2)
ax3 = fig.add_subplot(1,3,3)

# x축, y축에 변수 할당
sns.barplot(x='sex', y='survived', data=titan_df, ax=ax1)

# x축, y축에 변수 할당 후, hue 옵션 추가
sns.barplot(x='sex', y='survived', hue='class', data=titan_df, ax=ax2)

# x축, y축에 변수 할당 후, hue 옵션 추가 후 누적 출력
sns.barplot(x='sex', y='survived', hue='class', dodge=False, data=titan_df, ax=ax3)

# 차트 제목 표시
ax1.set_title('titan survived - sex')
ax2.set_title('titan survived - sex/class')
ax3.set_title('titan survived - sex/class(stacked)')

plt.show()

 

 

 

범주형 데이터의 산점도

import matplotlib.pyplot as plt
import seaborn as sns

# titan
titan_df = sns.load_dataset('titanic')

# set style theme
sns.set_style('whitegrid')

# 그래프 객체 생성
fig = plt.figure(figsize=(15,5))
ax1 = fig.add_subplot(1,2,1)
ax2 = fig.add_subplot(1,2,2)

# 이산형 변수의 분포 - 데이터 분산 고려를 안한다면(중복 표시 O)
sns.stripplot(x='class',
             y='age',
             data=titan_df,
             ax=ax1)

# 이산형 변수의 분포 - 데이터 분산 고려를 한다면(중복 표시 X)
sns.swarmplot(x='class',
             y='age',
             data=titan_df,
             ax=ax2)

# 차트 제목 표시
# ax1.set_title('Strip Plot')
# ax2.set_title('Swarm Plot')

plt.show()

728x90

'AI > [Visualization]' 카테고리의 다른 글

[Matplotlib] Pie그래프  (0) 2023.02.13
[Matplotlib] 막대바  (0) 2023.02.13
[Matplotlib] 산점도 찍기  (0) 2023.02.13
[Matplotlib] 시각화 첫 단계  (0) 2023.02.07
728x90
# 한국어 폰트 적용

import matplotlib
# matplotlib.rcParams['font.family'] = 'Malgun Gothic' # 윈도우즈의 '맑은 고딕'설정
matplotlib.rcParams['font.family'] = 'AppleGothic'    # 맥북 '애플 고딕'설정

matplotlib.rcParams['axes.unicode_minus'] = False

 

# 도형 1
fruit = ['사과','바나나','딸기','오렌지','포도']
result = [7,6,3,2,2]
import matplotlib.pyplot as plt
plt.pie(result)
plt.show()

# 도형 2
# 생성한 원이 타원 -> 원형으로 변환
plt.figure(figsize=(5,5))
plt.pie(result, labels = fruit, autopct = '%.1f%%')
plt.show()

도형 1
도형 2

 

 

# 시계방향순 데이터 정렬

plt.figure(figsize=(5,5))
plt.pie(result, labels = fruit, autopct = '%.1f%%', startangle=90, counterclock=False )  

# startangle=90 x축 기준 90도 에서 시작 (생략시 0도)
# autopct 소수점 보여줄꺼
# counterclock=False  시계방향

plt.show()

 

explode_value = (0.1, 0,0,0,0)   # 1번째 요소 0.1 만큼 파이에서 나오게

# 시계방향 순으로 데이터 pie_chart를 생성
plt.figure(figsize=(5,5))
plt.pie(result, labels = fruit, autopct = '%.1f%%', startangle =90, counterclock=False, explode=explode_value, shadow=True)

# img 저장하기
plt.savefig('./save_test0.png')
plt.show()


# 사진의 해상도 높이기 dpi(dot per inch)
import matplotlib as mpl
mpl.rcParams['figure.figsize']

# 해상도 보기 dpi를 찍어보기 
mpl.rcParams['figure.dpi']

 

 

 

 

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0, 5)
x
y1 = x
y2 = x+1
y3 = x+2
y4 = x+3

 

<y= x 꼴 그래프 만들어보기>

plt.plot(x,y1, x,y2, x,y3, x,y4)

plt.grid()
plt.xlabel('X')
plt.ylabel('Y')
plt.title('Saving a figure')

# 위의 이미지 저장 
plt.savefig('./save_test10', dpi=1000)

728x90

'AI > [Visualization]' 카테고리의 다른 글

[Seaborn] Seaborn 그래프 형태  (0) 2023.02.13
[Matplotlib] 막대바  (0) 2023.02.13
[Matplotlib] 산점도 찍기  (0) 2023.02.13
[Matplotlib] 시각화 첫 단계  (0) 2023.02.07
728x90

 

<2가지 비교사항을 막대바로 정렬해보기>

# 한국어 폰트 적용

import matplotlib
# matplotlib.rcParams['font.family'] = 'Malgun Gothic' # 윈도우즈의 '맑은 고딕'설정
matplotlib.rcParams['font.family'] = 'AppleGothic'    # 맥북 '애플 고딕'설정

matplotlib.rcParams['axes.unicode_minus'] = False

 

<Before, After 설정>

members_id= ['m_01','m_02','m_03','m_04']
before_wo = [27,35,40,33]
after_wo = [30,38,42,37]

 

# plt.bar

# 세로막대기
import matplotlib.pyplot as plt
import numpy as np

n_data = len(members_id) # 4명
index_1 = np.arange(n_data) # Numpy 배열 (0,1,2,3)

plt.bar(index_1, before_wo, tick_label=members_id) # bar(x,y)에서 x=index, y= before_wo
plt.title('Before 세로막대기')
plt.show()

 

 

 

# 가로 막대 그래프를 생성
colors =['r','g','b','m']
plt.barh(index_1,after_wo, color=colors, tick_label = members_id)  # barh <- h만 넣어주면 됨
plt.title('After 세로막대기')
plt.show()

 

<2가지 세로막대기 생성으로 비교해보기>

# 하나의 창에서 두 개의 그래프를 그리자.
barwidth = 0.4
plt.bar(index_1,before_wo, color='c', align='edge', width=barwidth, label='before')
plt.bar(index_1+barwidth,after_wo, color='m', align='edge', width=barwidth, label='after')
plt.legend() # 범례
plt.xlabel('회원 ID')
plt.ylabel('근육량')
plt.title('운동 전후의 근육변화량 비교')
plt.show()

 

728x90

'AI > [Visualization]' 카테고리의 다른 글

[Seaborn] Seaborn 그래프 형태  (0) 2023.02.13
[Matplotlib] Pie그래프  (0) 2023.02.13
[Matplotlib] 산점도 찍기  (0) 2023.02.13
[Matplotlib] 시각화 첫 단계  (0) 2023.02.07
728x90
# 한국어 폰트 적용

import matplotlib
# matplotlib.rcParams['font.family'] = 'Malgun Gothic' # 윈도우즈의 '맑은 고딕'설정
matplotlib.rcParams['font.family'] = 'AppleGothic'    # 맥북 '애플 고딕'설정

matplotlib.rcParams['axes.unicode_minus'] = False

 

 

 

import matplotlib.pyplot as plt
import numpy as np
height = [165,177,160,180,185,155,172] # 키 데이터
weight = [62,67,55,74,90,43,64] # 몸무게 데이터
plt.scatter(height, weight)

plt.xlabel('Height(cm)')
plt.ylabel('Weight(kg)')
plt.title('Height & Weight')
plt.grid()  # 그리드

plt.scatter(height, weight, s=500, c='r') # s: 마커크기, c: 색

plt.show()

 

 

# 마커 크기를 변경하는 방법

plt.scatter(height, weight, s=500, c='r') # s: 마커 크기, c: 색깔
plt.show()

 

 

 

 

 

# 데이터마다 마커의 크기와 컬러를 다르게 지정

size = 100* np.arange(1, 8)
colors = ['r', 'g', 'b', 'c', 'm', 'k','y'] 
plt.scatter(height, weight, s=size, c=colors)
height = [165,177,160,180,185,155,172] # 키 데이터
weight = [62,67,55,74,90,43,64] # 몸무게 데이터       # 165, 62가 1번째 Red -> 177, 67 Green 순서대로
plt.show()

 

 

 

 

https://hyunmin1906.tistory.com/30

 

import numpy as np

city = ['서울','인천','대전','대구','울산','부산','광주']

# 위도(latitude)와 경도(longitude)
lat = [37.56, 37.45, 36.35, 35.87, 35.53, 35.18, 35.16]
lon = [126.97, 126.70, 127.38, 128.60, 129.31, 129.07, 126.85]

# 인구밀도
pop_den = [16154, 2751, 2839, 2790, 1099, 4454, 2995]

size = np.array(pop_den) * 0.2 # 마커의 크기 지정
colors = ['r','g','b','c','m','k','y'] # 마커의 컬러 지정

plt.scatter(lon, lat, s= size, alpha=0.5)
plt.xlabel('경도')
plt.ylabel('위도')
plt.title('지역별 인구밀도')

for x,y, city_name in zip(lon, lat,city):
    plt.text(x,y, city_name) # 경도, 위도에 따른 도시이름 mapping
    
    
plt.show()

728x90

'AI > [Visualization]' 카테고리의 다른 글

[Seaborn] Seaborn 그래프 형태  (0) 2023.02.13
[Matplotlib] Pie그래프  (0) 2023.02.13
[Matplotlib] 막대바  (0) 2023.02.13
[Matplotlib] 시각화 첫 단계  (0) 2023.02.07
728x90

휴대폰으로 스캔 다 되고, 본인 인증까지 다 되는데 왜 굳이

시간을 들여가면서 신분증 들고 복지센터 가서 팩스 민원을 넣어야 하나? 

 

예상 답변 : 서류를 빠르게 처리하기 위해서 A4형식의 종이가 필요하다

 

해결책 : 1. 디지털로온 서류를 자동프린트 해주는 기능 넣으면 끝 /

             2. 서류철 시대를 끝내자. 디지털 보관이 훨씬 안전하고 효율적이다.(물론 서버2중화 필요)

 

예상 답변 : 아직 팩스를 사용하시는 분이 많고 새로운 서비스를 도입하기엔 돈이 많이 들어간다

           1. 팩스를 없애자는 말이아니다. 하나의 옵션을 넣자는 거다.

           2. 클라우드서비스가 비싸다는 소리에는 전혀 이해할 수 없다.

 

예상답변 : 보안에 문제가 있다

           1. 신분증들고 복지센터가서 팩스 민원을 넣는게, 그 신분증으로 다른 채널을 통해서 보내는 거 보다 어떤점에서 보안상으로 안전한                건지 전혀 이해가 되지않음. 돈 문제가 걸린거라면 절차가 까다로워야 하는것에 대해선 이해가능

 

           2. 모바일 신분증을 사용하면 되지않는가? 

 

예상답변 : 작성 중

 

 

 

 

 

 

 

728x90

'글적글적 > 바꿔야할부분' 카테고리의 다른 글

저출산대책  (0) 2024.06.07
SI개발자 때문에 빡치는 경우  (1) 2022.11.23
728x90

교차 검증이 무엇인가요?

교차검증이란 모델 학습 시 데이터를 훈련용과 검증용으로 교차로 선택하는 방법

 

이전에 150개 중 120개만 데이터 훈련용, 30개를 검증용으로 사용했다면 단 1번만 훈련이 된다.

 

 

이를 보안하기 위하여 학습용 데이터 셋을 분할시켜 정확도를 올림.

 

00

예시로 150개의 자료가 있다면 대략 5등분 하여(유효한 수의 데이터셋을 유지한 채) 4 x Train(초록색)을 이용해서 학습을 시킨다음 1 x 검증용(파란색) 데이터로 정확도를 측정을 총 5번 반복해서 진행하는 과정이다.

 

 

교차 검증 왜 하나요?

 

장점 

  • 특정 데이터셋에 대한 과적합 방지
  • 더욱 일반화된 모델 생성 가능
  • 데이터셋 규모가 적을 시 과소적합 방지

 

단점

  • 학습 및 검증에 필요한 시간이 증가

 

코드를 통하여서 알아보자.

 

1. 주요 라이브러리 임포트

# 필수 라이브러리 호출


from sklearn.datasets import load_iris   # 품종 데이터셋
from sklearn.tree import DecisionTreeClassifier   # 의사결정나무 알고리즘
from sklearn.model_selection import KFold    # 교차검증 자료 나누기
from sklearn.metrics import accuracy_score as acc_sc   # 평가지표
from sklearn.model_selection import train_test_split   # 훈련, 검증용 자료 나누기

import numpy as np
import pandas as pd

2. 데이터 불러오기

# 데이터 재정의
iris = load_iris()
features = iris.data # X값
label = iris.target # y값
dt_clf = DecisionTreeClassifier(random_state=156)

# kfold에서 k= 5로 놓자. (5등분한다)
kfold = KFold(n_splits=5)


print('데이터 셋의 크기:', features.shape[0])

# 데이터 셋의 크기: 150

 

 

 

3. 학습 수행 

n_iter = 0
cv_accuracy = []  # CV : cross validation
for train_index, val_index in kfold.split(label):
    # Kfold.split()으로 반환된 인덱스를 통해 학습용, 검증용 데이터 정의
    X_val, X_train = features[val_index], features[train_index]
    y_val, y_train = label[val_index], label[train_index]
    # 각 CV별 학습 및 예측
    dt_clf.fit(X_train,y_train) # 학습
    pred = dt_clf.predict(X_val) # 예측
    # 정확도 지표 계산
    accuracy = np.round(acc_sc(y_val, pred),3)
    train_size = X_train.shape[0]
    val_size = X_val.shape[0]
    n_iter += 1
    print(f'\n #{n_iter} CV 정확도:{accuracy}, 학습데이터 크기:{train_size}, 검증데이터 크기 : {val_size}')
    print(f'#{n_iter} 검증 데이터셋 인덱스 :{val_index}')
    cv_accuracy.append(accuracy)
    
# 개별 iteration 별 정확도 평균내기
print(f'\n ## 평균 CV정확도 :{np.mean(cv_accuracy)}')

<정확표 값>

 

 #1 CV 정확도:1.0, 학습데이터 크기:120, 검증데이터 크기 : 30
#1 검증 데이터셋 인덱스 :[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
 24 25 26 27 28 29]

 #2 CV 정확도:0.967, 학습데이터 크기:120, 검증데이터 크기 : 30
#2 검증 데이터셋 인덱스 :[30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
 54 55 56 57 58 59]

 #3 CV 정확도:0.867, 학습데이터 크기:120, 검증데이터 크기 : 30
#3 검증 데이터셋 인덱스 :[60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
 84 85 86 87 88 89]

 #4 CV 정확도:0.933, 학습데이터 크기:120, 검증데이터 크기 : 30
#4 검증 데이터셋 인덱스 :[ 90  91  92  93  94  95  96  97  98  99 100 101 102 103 104 105 106 107
 108 109 110 111 112 113 114 115 116 117 118 119]

 #5 CV 정확도:0.733, 학습데이터 크기:120, 검증데이터 크기 : 30
#5 검증 데이터셋 인덱스 :[120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
 138 139 140 141 142 143 144 145 146 147 148 149]

 ## 평균 CV정확도 :0.9

 

 

cv_accuracy

# [1.0, 0.967, 0.867, 0.933, 0.733]

 

 

728x90

'AI > [ML]' 카테고리의 다른 글

[ML] 머신러닝 분류  (0) 2023.03.30
[ML] Scikit-learn 을 활용한 붓꽃 품종 예측하기  (0) 2023.02.08
728x90

Scikit-learn 을 활용한 붓꽃 품종 예측하기

 

 

sepal length, sepal , petal length, petal width를 통해서 label (품종)을 예측해보자

쉽게 말해서:  4개의 꽃의 특성을 구분한 150개의 자료가 있다.

특징1, 특징2....특징4(독립변수)와 거기에 맞는 품종이 표시된 120개의 데이터(특징 + 품종)를 이용하여 학습을 시킨 다음에 

나머지 30개의 특징만으로 그 특징에 맞는 품종을 예측을 하려고 한다.

 

 

 

 

 

어렵게 말하면 4개의 독립변수(특징)와 1개의 종속변수(품종)를 가지는 150개의 데이터를 가지고

120개는 훈련용 (4개의 독립변수 + 1개 종속변수) 

30개는 (4개의 독립변수) 검증용으로  1개의 종속변수 예측하기 :

 

 

어렵게 말하면 4개의 독립변수와 1개의 종속변수를 가지는 150개의 데이터를 가지고 1개의 종속변수 예측하기 :

 

scikit-learn 

# conda 가상환경시
#!conda install scikit-learn

!pip install scikit-learn

 

import sklearn 
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split

print(sklearn.__version__) # 사이킷런 버전확인

 

#붓꽃 데이터 세트를 로딩
iris=load_iris()

#iris.data는 Iris 데이터 세트에서 피처(feature)만으로 된 데이터를 numpy로 가지고 있음.
iris_data=iris.data # x값 들

#iris.target은 붓꽃 데이터 세트에서 레이블(결정 값)데이터를 numpy로 가지고 있다.
iris_label=iris.target #y값 들
print('iris target값:', iris_label)
print('iris target명:', iris.target_names) # ['setosa' 'versicolor' 'virginica'] 문자타입을 0, 1, 2숫자로 변환!

#붓꽃 데이터 세트를 자세히 보기 위해 DataFrame으로 변환한다.
iris_df = pd.DataFrame(iris_data,columns=iris.feature_names)
iris_df['label']=iris.target
iris_df.tail()
iris target값: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 2 2]
iris target명: ['setosa' 'versicolor' 'virginica']

# 0 : sentosa
# 1 : versicolor
# 2 : virginica

다음으로 학습용 데이터와 테스트용 데이터를 분리해보자. 학습용 데이터와 테스트용 데이터는 반드시 분리해야 한다.

학습데이터로 학습된 모델이 얼마나 뛰어난 성능을 가지는지 평가하려면 테스트 데이터 세트가 필요하기 때문이다.

이를 위해 사이킷런은 train_test_split()API를 제공한다. train_test_split()을 이용하면 학습 데이터와 테스트 데이터를 test_size 파라미터 입 값의 비율로 쉽게 분할이 가능하다. 예를 들어 test_size =0.2로 입력 파라미터를 설정하면 전체 데이터 중 테스트 데이터가 20%, 학습데이터가 80%로 데이터를 분할한다. 먼저 train_test_split()을 호출한 후 좀 더 자세히 입력 파라미터와 변환값을 살펴보자.

 

X_train, X_test, y_train, y_test = train_test_split(iris_data, iris_label, test_size=0.2) 
# test_size=0.2 = 20프로는 테스트용이로 따로 빼두겠다

 

X_train.shape # (sepal length, sepal width, petal length, petal width)
# (120, 4)   120가지의 4개의 컬럼을 가지고 있고 이것을 학습용 x (독립 변수로 두겠다)

y_train.shape # (label => 품종이 어떤건지)
(120,)	     120가지의 품종이 있다 (종속 변수) 


# X_train의 4가지 독립변수들을 결합하여 y_train 종속 변수를 찾아내는 알고리즘을 학습시킴


# 그 알고리즘에 

X_test.shape # (sepal length, sepal width, petal length, petal width)
# (30, 4)   30가지의 4개의 컬럼을 직접 넣어서 

y_test.shape 
# (30,)      30개의 품종을 얼마나 잘 맞추는지 테스트하는것!

 

의사결정나무를 통해서 학습시키기

# 의사결정 트리에  120개의 학습용 데이터 넣기

DecisionTreeClassifier.fit(X_train,y_train)
#학습이 완료된 DecisionTreeClassifier 객체에서 테스트 데이터 세트로 예측 수행.

pred=dt_clf.predict(X_test) # X_test는 test_size=0.2에서 빼둔 (30, 4)개의 데이터

 

 

# 예측값
pred

# array([2, 2, 1, 1, 2, 0, 1, 0, 0, 1, 1, 1, 1, 2, 2, 0, 2, 1, 2, 2, 1, 0,
#       0, 1, 0, 0, 2, 1, 0, 1])

 

# 실제값
y_test

# array([2, 2, 2, 1, 2, 0, 1, 0, 0, 1, 2, 1, 1, 2, 2, 0, 2, 1, 2, 2, 1, 0,
#       0, 1, 0, 0, 2, 1, 0, 1])

예측값(학습된 데이터로 만들어진 알고리즘) 30개중 2개가 실제값과 다름

정확도 : 0.93333

from sklearn.metrics import accuracy_score as acc_sc
print('예측 정확도: {0}'.format(acc_sc(y_test,pred)))


학습한 의사 결정 트리의 알고리즘 예측 정확도가 약 0.9333(93.33%)으로 측정되었다. 앞의 붓꽃 데이터 세트로 분류를 예측한 프로세스를 정리하면 다음과 같다.

  1. 데이터 세트 분리: 데이터를 학습 데이터와 테스트 데이터로 분리한다.
  2. 모델 학습: 학습 데이터를 기반으로 ML 알고리즘을 적용해 모델을 학습시킨다.
  3. 예측 수행: 학습된 ML 모델을 이용해 테스트 데이터의 분류 (즉, 붓꽃 종류)를 예측한다.
  4. 평가: 이렇게 예측된 결과 값과 테스트 데이터의 실제 결과를 비교해 ML 모델 성능을 평가한다.
728x90

'AI > [ML]' 카테고리의 다른 글

[ML] 머신러닝 분류  (0) 2023.03.30
[ML] 2. Cross Validation 교차 검증  (0) 2023.02.09
728x90

Matplotlib를 통한 시각화 첫 단계 

# matplotlib
!pip install matplotlib # 라이브러리 설치


import matplotlib.pyplot as plt # 라이브러리 임포트

 

 

값 채워 넣고 라이브러리 실행 (1차식)

data1 = [10,14,19,20,25]
plt.plot(data1)
plt.show()

 


 

2차식 넘파이를 활용하여 만들기

import numpy as np 
x = np.arange(-4.5, 5, 0.5) # 넘파이로 숫자 생성(-4.5 부터 5까지 0.5씩증가)
y = 2*x**2   # y = 2x^2
[x,y]



#[array([-4.5, -4. , -3.5, -3. , -2.5, -2. , -1.5, -1. , -0.5,  0. ,  0.5,
#         1. ,  1.5,  2. ,  2.5,  3. ,  3.5,  4. ,  4.5]),
# array([40.5, 32. , 24.5, 18. , 12.5,  8. ,  4.5,  2. ,  0.5,  0. ,  0.5,
#         2. ,  4.5,  8. , 12.5, 18. , 24.5, 32. , 40.5])]

시각화하기 

plt.plot(x,y)
plt.show()


 

여러 그래프를 하나의 창에 넣어보기

# 함수 설정하기
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-4.5, 5.0, 0.5)
y1 = 2*x**2
y2 = 5*x + 30
y3 = 4*x**2 + 10

 

# 시각화 방법 1
plt.plot(x,y1)
plt.plot(x,y2)
plt.plot(x,y3)
plt.show()

# 더 간단하게도 가능
#plt.plot(x,y1,x,y2,x,y3)
# plt.show()

 


여러 그래프를 여러 창에 넣어보기

# 넘파이로 함수 생성
import numpy as np

# 데이터 생성
x = np.arange(-5,5, 0.1)
y1 = x**2 -2

y2 = 20*np.cos(x)**2

#plt.figure 로 새창을 만들고 (숫자)로 여러 창 생성가능

plt.figure(1) # 1번 그래프를 창에 넣기
plt.plot(x, y1)

plt.figure(2) # 2번 그래프를 창에 넣기
plt.plot(x, y2)

plt.show()

728x90

'AI > [Visualization]' 카테고리의 다른 글

[Seaborn] Seaborn 그래프 형태  (0) 2023.02.13
[Matplotlib] Pie그래프  (0) 2023.02.13
[Matplotlib] 막대바  (0) 2023.02.13
[Matplotlib] 산점도 찍기  (0) 2023.02.13

728x90
import pandas as pd
df = pd.DataFrame({'Old A' : ['Old a1', 'Old a2', 'Old a3', 'Old a4'], 'Old B' : ['Old b1', 'Old b2', 'Old b3', 'Old b4'], 'Old C' : ['Old c1', 'Old c2', 'Old c3', 'Old c4']})
df

1. 인덱스 명 바꾸기

 

  • 1-1 df.index = ["바꿀 인덱스 값"]

# 모든 인덱스를 바꿀때만 

# 이미 생성된 컬럼수와 입력하는 컬럼수가 같아야함
df.index = ["New 0", "New 1", "New 2", "New 3"]
df

 

 

 

  • 1- 2 df.rename(columns = {"원래이름" : "바꿀이름" }, option)   

(일부의 인덱스명만 바꿀때 and 인덱스명으로)

 * rename의 파라미터인 딕셔너리 형태로 써줌

# 일부의 인덱스명만 바꿀때 and 인덱스명으로
df.rename(index = {0: "New 0", 1: "New 1"}) 
# df.rename({0: "New 0", 1: "New 1"}, axis =0)

# axis= 0 은 인덱스  (생략도 가능)

 

 

 

option : inplace = True (기존값도 변경)   

 

  • 1-3 df.index.values[컬럼번호] = "바꿀 컬럼명" 

(일부의 컬럼명만 바꿀때 and 컬럼명으로)

# 일부의 인덱스명만 바꿀때 and 인덱스 번호로
df.index.values[0] = "New A0"

 

 

 

오류발생 !!

# 'int' object has no attribute 'index'
# invalid literal for int() with base 10: 'New A0'

 

  • 1-4 컬렴을(열)을 인덱스로 만들기
df1 = df.set_index("Old A")
df1

 

 

 

2.  컬럼명 명 바꾸기

-> 인덱스랑 똑같다. 'Index 대신 'columns'로 바꾸면 끝

 

  • 1- 1  df.column 을 통해서 바꾸기  

(모든 컬럼명을 바꿔야 할때만)

* column 의 파라미터인 리스트형태로 써줌

df.columns = ["New A", "New B", "New C"] # 이미 생성된 컬럼수와 입력하는 컬럼수가 같아야함
df

 

 

  • 1- 2 df.rename(columns = {"원래이름" : "바꿀이름" }, option)   

(일부의 컬럼명만 바꿀때 and 컬럼명으로)

 * rename의 파라미터인 딕셔너리 형태로 써줌

# 일부의 컬럼명만 바꿀때 and 컬럼명으로
df.rename(columns = {"Old A": "New A1", "Old B": "New B1"}) 
# df.rename({"Old A": "New A1", "Old B": "New B1"}, axis =1)

# axis= 1 은 컬럼(열)

# rename() 함수에서는 lambda 사용가능
df.rename(columns= lambda x:'[' + x +']' )

 

option : inplace = True (기존값에 저장)   

 

  • 1-3 df.columns.values[컬럼번호] = "바꿀 컬럼명" 

(일부의 컬럼명만 바꿀때 and 컬럼명으로)

# 일부의 컬럼명만 바꿀때 and 컬럼 번호로
df.columns.values[0] = "New A1"

 

 

3.  데이터 값 변경

CRUD에서 R과 똑같음

https://itcreator.tistory.com/143

# https://itcreator.tistory.com/143    3-1번 

titan_df.loc[0,'Pclass']  # 3이 출력됐었음

# " = " 만 넣으면 끝
titan_df.loc[0,'Pclass'] = 999999  # 3에서 999999로 바뀜

 

 

4. 조건으로 데이터 값 변경하기 

- lamda

# st['default'] = st['default'].apply(lambda x : 0 if x == 'No' else 1)
# st

 

5. replace

df.replace('현재 문자열', '바꿀 문자열', inplace = True) # inplace = True : 원본도 바꿈


# 여러개 바꿀때는 Key-Value 형태로 가능 
df.replace({'현재 문자열1':'바꿀 문자열 1', '현재문자열2':' 바꿀 문자열 2'})


# 하나의 컬럼에서 바꿀때
df.replace({'컬럼이름': {'찾을 문자열': '대체 문자열'}}
728x90
728x90

DataFrame에서 데이터 추출

 

1. 추출용 데이터 셋 다운받기 

https://www.kaggle.com/competitions/titanic/data

에서 자료 다운받기 

 

# 데이터셋 불러오기

import pandas as pd
titan_df = pd.read_csv('./titanic/train.csv')
titan_df

 

 

2. 선택된 열(column) 세로만 뽑아보기

# 선택된 열(column) 세로만 뽑아보기

titan_df[['Name']]

# 여러개는 ,'컬럼명' 넣어주면 된다
# titan_df[['Name','Age']]


# print(type(titan_df[['Name']]))  => [[]] 2차원 <class 'pandas.core.frame.DataFrame'> 
# print(type(titan_df['Name']))   => [] 1차원 <class 'pandas.core.series.Series'>

 

 

 

2-1. 해당조건의 열(column) 세로 뽑아보기 

# 3. Pclass 1인 정보 추출하기

titan_df[titan_df.Pclass==1]  # <class 'pandas.core.series.Series'>
# titan_df[titan_df['Pclass']==1] # 이렇게 해도됨


#titan_df[titan_df.Pclass==1].Pclass.value_counts() # 갯수

# print(type(titan_df[titan_df.Pclass==1]))  =>  <class 'pandas.core.frame.DataFrame'>
# print(type(titan_df.Pclass==1]))           => <class 'pandas.core.series.Series'>

 

여러가지 조건 

# and 조건일 때는 &  /  or 조건일 때는 |   / Not 조건일 때는 ~
# 60세넘는  1등급 여성 추출

titan_df[(titan_df.Pclass==1) & (titan_df.Sex=='female') & (titan_df['Age'] > 60)]

# Not 조건인 경우 (반대조건)
# titan_df[~((titan_df.Pclass==1) & (titan_df.Sex=='female') & (titan_df['Age'] > 60))]

 

2-2 여러가지 기능들

# 해당 열(Name)에 글자가 포함된 데이터 출력
titan_df[titan_df.Name.str.contains('Mrs')]

# 인덱스번호 재정렬
titan_df[titan_df.Name.str.contains('Mrs')].reset_index()

# 인덱스번호 재정렬상태에서 상위3개만 보여주기 
# titan_df[titan_df.Name.str.contains('Mrs')].reset_index().head(3) # 상위 3개
# titan_df[titan_df.Name.str.contains('Mrs')].reset_index()[:3]  # 상위 3개

# titan_df[titan_df.Name.str.contains('Mrs')].reset_index().tail(3) # 하위


# 결측치받기
.isna() # 표로 보여주기
.isna().sum() # 합쳐서 보여주기

 

3. 선택된 행(row) 가로만 뽑아보기

titan_df.loc[[0]] # loc 이름이 0인 행만 추출해줘
titan_df.iloc[[0]] # iloc 위치가 0번째 행인 값들만 추출해줘

# 단일값을 불러오기1 - loc(label::명칭) // iloc(Positional-위치)

titan_df.loc[[0]] # loc 이름이 0인 행만 추출해줘
titan_df.iloc[[0]] # iloc 위치가 0번째 행인 값들만 추출해줘

# iloc 경우 슬라이스 가능
# iloc [시작:끝:옵션]

#  테스트하기 위해서 행 이름 바꿀때 
# data_df.rename(index={'two': 1, 'one': 3}, inplace=True) # inplace 원본도 바꿀래?
data_df

 

3-1. loc/iloc 을 통한 행열 을 사용하여 하나의 값 뽑기

 

titan_df.loc[0,'Pclass'] 
# 3 출력

 
# titan_df.loc[[0,'Pclass']] 로 하면 "['Pclass'] not in index" 에러 뜸

 

 

3-2. loc/iloc 을 통한 행열 을 사용하여 여러개의 값 뽑기

 

titan_df.loc[:,'Pclass':'Age']  
# 행 [:] = 전부 , 열 ['Pclass':'Age'] Pclass부터 ~ Age 까지3-1. loc을 통한 행열 을 사용하여 하나의 값 뽑기



titan_df.iloc[:,2:6]  
# 와 동일한 값 (2열부터 ~ 2,3,4,5 까지) 6열 포함x

 

<원본>

titan_df

 

 

 

 

 

<조건으로 나온 값>

 

728x90
728x90

DataFrame 행(row)열(column) 추가 삭제

CRUD중 Create 와 Delete

1: DataFrame 생성 또는 불러오기

# csv 불러오기

import pandas as pd

# 절대경로
# file_path = '/Users/chris/Desktop/Develop/TIL/python/BIGDATA/test.csv'
# tset_df = pd.read_csv(file_path, engine='python') # DataFrame의 약자 df

# 상대경로
test_df = pd.read_csv("./test.csv", encoding="cp949")  # ./ 현재폴더    # encoding="cp949" 한글 인코딩 오류해결용
# 생성하기

import pandas as pd

# 딕셔너리 형태로 
df = pd.DataFrame({'A' : ['a1', 'a2', 'a3', 'a4'], 'B' : ['b1', 'b2', 'b3', 'b4'], 'C' : ['c1', 'c2', 'c3', 'c4']})


# 리스트 형태로 (api로 불러올때는 대부분 이런식)
df = pd.DataFrame([{'A' : 'a1', 'B' : 'b1', 'C' : 'c1'},
		   {'A' : 'a2', 'B' : 'b2', 'C' : 'c2'},
                   {'A' : 'a3', 'B' : 'b3', 'C' : 'c3'},
                   {'A' : 'a4', 'B' : 'b4', 'C' : 'c4'}])
 


df

 

 

2: DataFrame  행(row) 추가 / 열(column) 추가

 

 

# 행(row, 가로) 추가 
df.loc[len(df)] = ['st', 123, '아무거나']     # len(df) df : 행 인덱스  (숫자넣는곳)
df

 

 

# 열(column, 세로) 추가

df['새컬럼'] = 'new'
df

 

 

3: DataFrame  행(row)  / 열(column) 삭제

 

# 행(row)가로 삭제

df2 = df.drop(0, axis = 0) # axis = 0 (생략가능) 행 
df2 

#df2 = df.drop([0, 1],axis = 0) 여러개도 한번에 가능
#df2

# df.drop([0], axis = 0, inplace = true) # inplace = True / 리턴없이 원본이 수정됨 (결과창 안뜸)
# df.drop([0], axis = 0, inplace = false) # false(생략가능)인 경우 리턴은 있지만 원본은 그대로 (결과창 뜸)

# 원본을 저장하고 싶으면 =>
# df = df.drop([0], axis = 0, inplace = false) 로  df에 담아야함

# df = df.drop(df.index[[0, 1]]) #인덱스 번호로도 삭제가능 (행 이름이 문자일때 번호로 지우기용)

# 열 (column, 세로) 삭제

df2 = df.drop('A', axis = 1)  # axis = 1 열 
df2

728x90
728x90

Pandas 시리즈(Series)와 데이터프레임(Dataframe)

Pandas의 차원이해하기 

<class 'pandas.core.series.Series'> : 1차원

<class 'pandas.core.frame.DataFrame'> : 2차원

 

 

 

 

 

 

 

DataFrame

:  시리즈가 여러개 합쳐진 자료형
데이터프레임에서 하나의 행 또는 열만 뽑으면 그것은 시리즈이다.

열내의 데이터 같고, 열간의 데이터는 다름

 

 

 

 

차원에 대한 이해

import pandas as pd

dic = {'컬럼_열1': ['행_가','행_나','행_다'], '컬럼_열2': ['행_a', '행_b', '행_c'], '컬럼_열3': ['행_1', '행_2', '행_3']}


df = pd.DataFrame(dic)
df

pd.DataFrame(df[df.컬럼_열1=='행_가']['컬럼_열2'])

# [][] =>  [행][렬] 
#  [행] => [df.컬럼_열1=='행_가']  => '행_가'가 포함된 행_가, 행_a, 행_1을 뽑는다. 0번째 행을 뽑는다.
#  [열] => ['컬럼_열2'] => 행_a, 행_b, 행_c를 뽑고 곂치는 값을 출력한다.
#  행_a 출력

 

 

 


pd.DataFrame(df[df.컬럼_열2=='행_c']['컬럼_열3']) 
#을 한다면?

# 행_3 출력

 

728x90
728x90

행렬 가로 세로 도대체 무엇이 맞는가?

 

분명 이런사진을 본다면 마치 행이 세로 / 열이 가로 인 것처럼 보이지만 

 

 

행은 row = 가로

가로방향으로 값을 넣는다!! -> 값을 다 넣었으면 행축세로방향으로 늘어난다!

 

행 = 가로 = row = axis 0 (데이터를 넣는 방향)

행축(행이 증가하는방향) = 세로방향으로 증가

 

 

열은 column = 세로

 세로방향으로로 값을 넣는다!! -> 값을 다 넣었으면  로방향으로 늘어난다!

 

열 = 세로 = column = axis 1 (데이터를 넣는 방향)

열축(열이 증가하는방향) = 가로방향으로 증가

 

 

가로인지 세로인지는 데이터를 넣는 방향을 말하는것!

 

행열은 축 번호를 부르는것!

 

728x90
728x90

들어가기 전

프로그래밍 언어 추천받기 전,

내가 왜 코딩을 하려하는지, 무엇을 만들려고 하는지에 대한 기본적 방향은 잡혀있어야 합니다.

프론트엔드가 뭔지, 백엔드 정도는 알아야 언어를 추천받을 수 있습니다.

 

0: 개발직군에 대한 이해

개발에는 다양한 분야가 있습니다:

임베디드, 웹개발, 앱개발, 데이터분석 등으로 나눠지며 이 안에서도 또 세분화되며 세분화된 분야마다 다양한 특징들을 가집니다. 

 

개발이 처음이시라면 웹개발을 추천합니다!

앱이 더 낫지 않나요? 웹을 이해한다면 앱은 금방 배울 수 있으며, 앱에서도 웹개발 기술을 사용합니다.

웹개발은 비교적 낮은 단계의 수준 (네트워크 이해, 데이터베이스) 개발 난이도이지만 굉장히 많은 수요를 가집니다.

 

웹개발에는 주로

Python, Java, Javascript 를 사용하여 위 3가지 언어에 대해서만 살펴보겠습니다.

 

임베디드, VR(AR) : c++, c#

앱개발 : swift(ios), kotlin(android)

 

 

 

1: Java (백엔드) 

어려운 정도 : ★★★

취업진입 : ★★★☆

일자리수 : ★★★★★

대한민국은 자바 공화국이라고 불립니다. 대부분 전자정부프레임워크를 자바로 통일하여 자바만 알아도 신입으로 빠르게 취업이 가능합니다.

일자리가 엄청 많아서 빠른 취업이 가능합니다. 제대로 된 3년 정도 경력을 쌓는다면 이직도 편합니다.

백엔드를 하신다면 반드시 자바를 알고 계시는 게 좋습니다.

 

2: Javascript (프론트, 백엔드)

어려운 정도 : ★★☆

취업진입 : ★★★★

일자리수 : ★★★☆

* java랑은 아무런 관계가 없습니다. 사자와 바다사자 관계입니다.

유일한 프론트엔드 언어입니다. 백엔드(node.js)도 가능하며, 미디어아트(three.js , p5.js) 등 에도 사용되는 스크립트언어입니다.

백엔드 개발자도 제2언어로 배울정도로 프론트에선 javascript 가 유일하며, 활용도가 높습니다.

컴퓨터 비전을 공부 중인데 DL활용 웹 제작에는 파이썬 장고나, 자바스크립트 노드.js를 주로 쓴다고 합니다.

비전공신입취업 시장에서는 백엔드보다 프론트가 취업하기 유리합니다. (시장이 굉장히 빠르게 바뀝니다)

개인적으로 미래를 보고 웹 개발을 한다면 자바 보다는 자바스크립트를 추천하는 바 (23년 3월 기준).

 

 

 

 

3: Python (데이터, 백엔드)

어려운 정도 : ★★

취업진입 : ★★

일자리수 : ★★★ ~ ★★★☆

데이터-통계분야 (머신러닝, 딥러닝, AI)라면 반드시 배워야 하는 언어입니다.

백엔드(flask, Django) 가능하지만 주로 스타트업에서 사용합니다(대부분 경력직) 

이쪽 분야는 대게 석사 이상을 요구하고 일자리수가 적어 취업 진입이 쉽지 않습니다. 

(언어는 쉽지만 사용할 라이브러리가 수학적 지식을 많이 요함)

하지만, 언어가 쉽고 굉장히 간결하여서 코딩테스트용으로 많이 쓰입니다.

 

미래를 본다면 점점 더 각광받는 언어가 될 거라 생각합니다.

 

 


 

 

결론

나는 취업을 위해 코딩을 배울 것이다 : 자바

나는 프론트엔드로 취업을 할 것이다 +  도저히 뭘 배워야 할지 모르겠다 : 자바스크립트

나는 취미로 배우겠다 + 데이터 쪽으로 일할 것이다 : 파이썬

 

 

 

 

 

728x90

'P-Language' 카테고리의 다른 글

[객체지향] 객체지향의사실과오해  (0) 2023.02.07
728x90

게시물 내렸습니다.

우측 하단 챗봇으로 문의 주세요!

 

비전공자

순공 2시간 1주 컷가능

728x90
728x90

RGB 대신 BGR을 쓰는 이유

1: 사진, 영상에서는 당연히 RGB 순서로 사용하는데 CV에서는 왜 BGR을 사용할까?

 

구글링을 했더니  사타야 말릭 박사(Dr. Satya Mallick) 의 글을 찾을 수 있었습니다. 
본문을 요약하면 사타야 말릭 박사는 한 컨퍼런스에서 OpenCV의 창시자인 그레이 브라드스키 박사(Dr. Gray Bradski)를 만났고 그에게 왜 RGB가 아닌 BGR을 쓰냐고 물었고 그에 대한 대답은 “왜 미국 철도 표준이 4피트 8.5 인치 인가?”라는 질문으로 되돌아 왔다고 합니다. 
이게 무슨 말이냐면 미국이 철도 표준을 정할때 무슨 대단한 이유가 있어서 4피트 8.5인치로 정한것이 아니라 열차 이전에 주로 사용했던 마차의 폭에 마춰서 정했다는 겁니다. 결국, 브라드스키 박사도 BGR로 정한데는 별다른 이유가 있던게 아니라 그걸 정하던 시절 초창기 카메라 산업 개발자들이 BGR을 많이 썼기 때문에 그 자신도 그냥 아무 생각없이 BGR을 선택했다는 거죠.
 

2: 그럼 왜  영상 기기 개발자들 사이에서는 RGB보다 BGR을 많이 사용했을까?

 
이는 엔디안(Endianness)와 관련이 있습니다.
CPU에 따라서 값을 메모리에 저장하고 읽을 때,  MSB 즉 큰 값을 먼저 쓰는 빅엔디안과 LSB 즉 작은 값을 먼저 쓰는 리틀엔디언 방식이 있는데, 인텔에서 만든 x86계열의 CPU는 리틀엔디언을 따릅니다.
(OpenCV는 인텔에서 시작)
 
예를 들어 0x123456이라는 값을 빅엔디언으로 저장하면 0x123456 순으로 저장되지만 리틀엔디언으로 저장하면 0x563412순으로 저장되게 됩니다.
BGR 포맷으로 이루어진 색상 정보는 각 채널당 8비트로 이루어 지고 3개의 채널을 사용하므로 24비트 즉, 0xBBGGRR가 필요합니다.  24비트 단위의 입출력은 효과적이지 않으니 메모리에 저장할때 unsigned 32비트를 사용하는것이 일반적인데 이렇게 되면 0x00BBGGRR 가 됩니다. 이 값을 x86 계열의 CPU 처럼 리틀엔디언을 사용해서 저장하면 메로리에는  0xRRGGBB00가 저장됩니다.

 

이렇게 저장된 값을 메모리에 직접 접근해서 읽어 들이는 디스플레이 장치, 카메라 등의 영상 하드웨어에서는 CPU와 무관하게 지정된 엔디안으로 앞에서 부터 읽어 들이면 자연스럽게 RGB로 읽히기 때문에 BGR 포맷이 초창기 영상 기기 관련 하드웨어 개발자들에게 자연스레 널리 사용되었다고 볼 수 있습니다.
BGR 포맷과 엔디안과의 관계에 대한 추가적인 의견은 아래의 스택오버플로우 링크에서도 보 실 수 있습니다.
 
728x90

+ Recent posts