머신러닝 지도학습 - 선형회귀

I. 개요

  • 머신러닝으로서 회귀 모형에 대해 숙지한다.
  • 회귀 모형의 기본적인 개념과 평가 지표에 대해 숙지한다.

II. 회귀 모형 개요

  • 회귀(Regression)은 통계 이론 중 가장 기본이다.
  • 회귀의 기원은 영국의 통계학자 갈톤(Galton)이 수행한 연구에서 유래한다.

  • 부모와 자식 간의 키의 상관관계를 분석하였는데, 키가 작은 가정과 키가 큰 가정을 살펴본 결과, 무한정 작아지지도 않고, 무한정 커지지 않아 일정한 평균으로 회귀하려는 자연적 법칙을 발견했다는 것이 기원이다.

(1) 회귀식의 개요

  • 회귀는 1차 방정식이다.
    • 지역, 방의 면적, 크기 등 여러 개의 독립변수에 따라 아파트 가격이라는 종속변수가 어떠한 관계를 나타내는지를 예측하고 모델링하는 것
    • 즉, 수치를 예측할 때 사용한다.

$$ Y = W_{1}\times W_{1} + W_{2}\times W_{2} + W_{3}\times W_{3} + \cdot \cdot \cdot + W_{n}\times W_{n} $$

입문자를 위한 머신러닝 개요

개요

  • 캐글 데이터를 불러오는 방법에 대해 숙지한다.
  • 머신러닝의 일반적인 내용에 대해 숙지한다.

I. 사전 준비작업

  • Kaggle API 설치 및 연동해서 GCP에 데이터를 적재하는 것까지 진행한다.

(1) Kaggle API 설치

  • 구글 코랩에서 API를 불러오려면 다음 소스코드를 실행한다.
!pip install kaggle
Requirement already satisfied: kaggle in /usr/local/lib/python3.6/dist-packages (1.5.6)
Requirement already satisfied: urllib3<1.25,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from kaggle) (1.24.3)
Requirement already satisfied: certifi in /usr/local/lib/python3.6/dist-packages (from kaggle) (2020.6.20)
Requirement already satisfied: tqdm in /usr/local/lib/python3.6/dist-packages (from kaggle) (4.41.1)
Requirement already satisfied: requests in /usr/local/lib/python3.6/dist-packages (from kaggle) (2.23.0)
Requirement already satisfied: python-slugify in /usr/local/lib/python3.6/dist-packages (from kaggle) (4.0.1)
Requirement already satisfied: python-dateutil in /usr/local/lib/python3.6/dist-packages (from kaggle) (2.8.1)
Requirement already satisfied: six>=1.10 in /usr/local/lib/python3.6/dist-packages (from kaggle) (1.12.0)
Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests->kaggle) (2.10)
Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests->kaggle) (3.0.4)
Requirement already satisfied: text-unidecode>=1.3 in /usr/local/lib/python3.6/dist-packages (from python-slugify->kaggle) (1.3)

(2) Kaggle Token 다운로드

  • Kaggle에서 API Token을 다운로드 받는다.
  • [Kaggle]-[My Account]-[API]-[Create New API Token]을 누르면 kaggle.json 파일이 다운로드 된다.
  • 이 파일을 바탕화면에 옮긴 뒤, 아래 코드를 실행 시킨다.
from google.colab import files
uploaded = files.upload()
for fn in uploaded.keys():
  print('uploaded file "{name}" with length {length} bytes'.format(
      name=fn, length=len(uploaded[fn])))
  
# kaggle.json을 아래 폴더로 옮긴 뒤, file을 사용할 수 있도록 권한을 부여한다. 
!mkdir -p ~/.kaggle/ && mv kaggle.json ~/.kaggle/ && chmod 600 ~/.kaggle/kaggle.json

Upload widget is only available when the cell has been executed in the current browser session. Please rerun this cell to enable.

삼성카드 대회 Track-2 데이터 고려 사항 (1)

대회 소개

  • 삼성카드 데이터분석 공모전이 시행되고 있다.
    • 대회에 처음 참여하는 아시아경제-수강생들을 위해 일종의 가이드라인으로 제안하고자 한다.
  • 본 포스트에서는 기본적인 내용만 전달하고자 함을 밝힌다.
    • Track2 과정은 마케팅 전략 제안이 중요하다!

환경 세팅

  • 먼저, 데이터가 모두 한글로 구성이 되어 있기 때문에 한글파일 설정부터 진행한다.
  • 한글파일 설정이 완료되면 구글 드라이브와 연동한다.
  • 데이터 시각화를 진행한다.
%config InlineBackend.figure_format = 'retina'
!sudo apt-get -qq -y install fonts-nanum
The following package was automatically installed and is no longer required:
  libnvidia-common-440
Use 'apt autoremove' to remove it.
The following NEW packages will be installed:
  fonts-nanum
0 upgraded, 1 newly installed, 0 to remove and 39 not upgraded.
Need to get 9,604 kB of archives.
After this operation, 29.5 MB of additional disk space will be used.
Selecting previously unselected package fonts-nanum.
(Reading database ... 144579 files and directories currently installed.)
Preparing to unpack .../fonts-nanum_20170925-1_all.deb ...
Unpacking fonts-nanum (20170925-1) ...
Setting up fonts-nanum (20170925-1) ...
Processing triggers for fontconfig (2.12.6-0ubuntu2) ...
from pandas.plotting import register_matplotlib_converters
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
import matplotlib.font_manager as fm
fontpath = '/usr/share/fonts/truetype/nanum/NanumBarunGothic.ttf'
font = fm.FontProperties(fname=fontpath, size=9)
plt.rc('font', family='NanumBarunGothic') 
plt.rcParams["figure.figsize"] = (20, 10)
register_matplotlib_converters()
mpl.font_manager._rebuild()
mpl.pyplot.rc('font', family='NanumGothic')
fm._rebuild()
  • 여기까지 실행하였으면 구글 코랩에서 런타임-런타임 다시 시작을 클릭한다.

구글 드라이브 연동

  • 이제 구글 드라이브를 연동한다.
# Mount Google Drive
from google.colab import drive # import drive from google colab

ROOT = "/content/drive"     # default location for the drive
print(ROOT)                 # print content of ROOT (Optional)
drive.mount(ROOT, force_remount=True)           # we mount the google drive at /content/drive
/content/drive
Go to this URL in a browser: https://accounts.google.com/o/oauth2/auth?client_id=947318989803-6bn6qk8qdgf4n4g3pfee6491hc0brc4i.apps.googleusercontent.com&redirect_uri=urn%3aietf%3awg%3aoauth%3a2.0%3aoob&scope=email%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdocs.test%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive.photos.readonly%20https%3a%2f%2fwww.googleapis.com%2fauth%2fpeopleapi.readonly&response_type=code

Enter your authorization code:
··········
Mounted at /content/drive
# import join used to join ROOT path and MY_GOOGLE_DRIVE_PATH
from os.path import join  

# path to your project on Google Drive
MY_GOOGLE_DRIVE_PATH = 'My Drive/Colab Notebooks/samsung/datasets'

PROJECT_PATH = join(ROOT, MY_GOOGLE_DRIVE_PATH)
%cd "{PROJECT_PATH}"
/content/drive/My Drive/Colab Notebooks/samsung/datasets
%ls
'[기타] SCDC_공모전 테이블 설명.xlsx'  '[Track1_데이터4] variable_dtype.xlsx'
'[Track1_데이터1] mrc_info.csv'        '[Track2_데이터1] trend_w_demo.csv'
'[Track1_데이터2] samp_train.csv'      '[Track2_데이터2] 업종_예시.xlsx'
'[Track1_데이터3] samp_cst_feat.csv'

데이터 불러오기

  • 패키지를 불러오기 위해 pandas 패키지를 활용하여 [Track2_데이터1] 데이터를 불러온다.
  • 파일을 불러 올 때, encoding="EUC-KR"를 설정해서 가져온다.
import pandas as pd

trend_w_demo = pd.read_csv('[Track2_데이터1] trend_w_demo.csv', encoding="EUC-KR")
trend_w_demo.head()
YMCategory성별구분연령대기혼스코어유아자녀스코어초등학생자녀스코어중고생자녀스코어대학생자녀스코어전업주부스코어
0202005할인점0Fhighlowhighmidlowlow
1202005취미0Bhighlowmidmidlowlow
2202005오픈마켓/소셜1Dmidmidmidmidlowmid
3202005뷰티0Dmidmidmidmidlowlow
4202005오픈마켓/소셜0Ghighlowmidmidmidlow
trend_w_demo['기혼스코어'].value_counts()
high    314088
mid     107368
low      30582
Name: 기혼스코어, dtype: int64
  • 위 데이터는 전형적으로 범주형으로 구성이 되어 있다.
  • 위 변수에서 고려할 것이 있다.
    • Category, 성별구분, 연령대는 명목형 변수인데 반해
    • 기혼스코어:전업주부스코어의 경우는 확률이다.
  • 각 스코어의 확률에 대한 정의는 다음과 같다.
    • 기혼스코어 : 카드 이용 고객이 기혼일 확률
    • 유아자녀스코어 : 카드 이용 고객이에게 유아자녀가 있을 확률
    • 초등학생자녀스코어 : 카드 이용 고객이에게 초등학생 자녀가 있을 확률
    • 중고생자녀스코어 : 카드 이용 고객이에게 중고생 자녀가 있을 확률
    • 대학생자녀스코어 : 카드 이용 고객이에게 대학생 자녀가 있을 확률
    • 전업주부스코어 : 카드 이용 고객이 전업주부일 확률
  • 위 스코어의 데이터는 단순히 명목형이라고 보기는 어렵다. 즉, 순위(서열)형 척도/등간척도로 봐야 할 것이다.

측정척도의 유형과 내용

  • 명목척도: 범주형 데이터로 측정된 측정대상을 단순히 범주로 분류하기 위한 목적으로 숫자를 부여한 척도(수학적 가감승제 계산 안 됨)
    • 예시 - 성별, 종교, 직업, 혈액형
  • 순위(서열)척도: 범주형 데이터로 명목척도의 기능뿐 아니라 각 범주 간의 대소관계, 순위(서열성)에 관하여 숫자를 부여한 척도(수학적 가감승제 계산 안 됨)
    • 예시 - 학력, 건강상태 등
  • 등간척도: 연속형 데이터로 절대적 영점(absoulute zero)이 없으며 대상이 갖는 양적인 정도의 차이에 따라 등간격으로 숫자를 부여한 척도(수학적 가감승제 계산 안 됨)
    • 예시 - 온도, 만족도(리커트척도), 충성도(리커트척도), 물가지수, 생산지수 등
  • 비율척도: 연속형 데이터로 절대적 영점이 존재하며, 비율계산이 가능한 숫자를 부여한 척도(수학적 가감승제 계산 가능)
    • 매출액, 무게, 가격, 소득, 길이, 부피 등)

(1) 척도와 분석 간의 관계

  • 척도와 분석 간의 관계에 관한 표는 아래와 같다 (신건권, 2018).
독립변수종속변수분석방법
범주형 변수(명목, 서열)범주형 변수(명목, 서열)교차분석, 카이제곱
범주형 변수(명목, 서열)연속형 변수(등간, 비율)t-검증, 분산분석, 다변량분산분석
연속형 변수(등간, 비율)범주형 변수(명목, 서열)판별분석, 군집분석, 로지스틱회귀분석
연속형 변수(등간, 비율)연속형 변수(등간, 비율)상관분석, 회귀분석, 경로분석/구조방정식모델링분석
  • 즉, 위 표를 기준으로 삼성카드를 매우 단순하게 본다면 교차분석 외에는 쓸만한 분석방법이 떠오르지 않는다.
  • 그러나, 연도, Category, 성별구분, 연령대를 제외하고는 나머지 변수들을 서열 또는 등간으로 본다면 조금 더 다양한 분석 방법이 생길 수 있다.

(2) 시각화 방법

  • 순위 및 서열척도를 다루는 데이터에 대한 시각화는 주로 다음과 같다.

(3) 모수 VS 비모수 통계

  • 통계 분석 방법은 매우 중요하다. 일종의 가이드라인이기 때문이다.
  • 모수 통계는 기본적으로 평균들의 차이를 파악해야 하기 때문에 연속형 자료형이 필요하다. 또한, 이러한 자료는 대개 정규분포라는 형태로 잘 포장되어야 하지만, 실상은 그렇지 않다.
  • 이러한 경우 비모수적 검정을 실시한다.
    • 비모수적 검정의 기본 조건은 모수 통계를 할 수 없는 상황이 생기면, 보다 완화된 조건으로 해석하는 것이 옳은 방법이다. (가정을 무시하는 것은 아니다!)
  • 비모수 검정에는 크게 윌콕슨 순위합 검정, 윌콕슨 부호순위 검정, 프리드먼 검정, 그리고 크러스컬-월리스 검정 등이 사용된다.
  • 정규성 검정에 따른 모수와 비모수 검정 방법은 다음과 같다.
  • T검정
    • 모수적 방법: 독립표본 T검정, 대응표본 T검정
    • 비모수적 방법: 윌콕슨(Wilcoxon) 검정, 맨-휘트니(Mann-Whitney) 검정
  • 분산분석
    • 모수적 방법: 일원 배치 분산분석
    • 비모수적 방법: 크루스칼-윌리스(Kruskal-Wallis)검정
  • 관계분석
    • 모수적 방법: 피어슨의 상관분석
    • 비모수적 방법: 스피어만의 로 상관분석
  • 삼성카드의 데이터는 일반적인 모수적 방법으로는 통계검정을 하기에는 어려움이 있다. 즉, 비모수 통계에 대한 기본적인 숙지가 필요하며, 파이썬에서 비모수 통계 소스코드 예제는 추후에 다시 정리한다.

Reference

DataFrame의 변수 추가 및 삭제

강의 홍보

데이터 개요

  • German Credit Card를 활용하여 데이터를 가공하도록 한다.
    • 데이터셋에 대한 설명은 Kaggle에서 확인한다.
import pandas as pd
print(pd.__version__)
1.0.5
url = 'https://raw.githubusercontent.com/chloevan/kaggle2portpolio/master/datasets/german_credit_data.csv'
german_credit = pd.read_csv(url)
german_credit.head(3)
Unnamed: 0AgeSexJobHousingSaving accountsChecking accountCredit amountDurationPurpose
0067male2ownNaNlittle11696radio/TV
1122female2ownlittlemoderate595148radio/TV
2249male1ownlittleNaN209612education
  • Pandas DataFrameIndex와 나머지 열로 구성이 되어 있다.
  • 데이터의 행과 크기를 알아보는 가장 좋은 방법은 DataFrame객체의 shape변수를 이용하는 것이다.
print('DataFrame 크기: ', german_credit.shape)
DataFrame 크기:  (1000, 10)
  • 생성된 DataFrame 객체인 german_credit은 10개의 칼럼으로 이루어져 있다.
  • 이번에는 describe() 함수를 활용하여 개략적인 분포도를 확인한다.
german_credit.describe()
Unnamed: 0AgeJobCredit amountDuration
count1000.0000001000.0000001000.0000001000.0000001000.000000
mean499.50000035.5460001.9040003271.25800020.903000
std288.81943611.3754690.6536142822.73687612.058814
min0.00000019.0000000.000000250.0000004.000000
25%249.75000027.0000002.0000001365.50000012.000000
50%499.50000033.0000002.0000002319.50000018.000000
75%749.25000042.0000002.0000003972.25000024.000000
max999.00000075.0000003.00000018424.00000072.000000
german_credit['Sex'].value_counts()
male      690
female    310
Name: Sex, dtype: int64
  • Sex의 반환 결과는 1이 700개, 0이 300개로 확인할 수 있다.
  • 이 때 value_counts()는 많은 건수 순서로 정렬되어 값을 반환한다.

새로운 변수 추가

  • 기존 데이터에서 변수를 추가하고 삭제하는 것을 진행해본다.
  • 이러한 과정을 보통 도출변수로 표현되기도 한다.
german_credit['Age+100'] = german_credit['Age'] + 100
german_credit.shape
(1000, 11)

(1) 수치형 조건에 따른 변수 추가

  • 수치형 변수의 특성에 따라 새로운 변수를 추가한다.
  • Age를 기준으로 크게 ">50"<=50이하로 구분한다.
  • 그러기 위해서는 각 조건이 맞는지를 확인하는 if 조건과 반복 수행을 위한 for-loop 조건이 필요하다.
# 빈 리스트 객체 생성
age_group = []

for age in german_credit['Age']:
  if age > 50:
    age_group.append('>50')
  else:
    age_group.append('<=50')

(age_group[0:3])
['>50', '<=50', '<=50']
  • 출력된 결과물은 위와 같은 형태로 저장된 것을 확인할 수 있다.
  • age_group에 저장된 리스트 값을 새로운 변수로 추가한다.
german_credit['Age_group'] = age_group
german_credit['Age_group'].value_counts()
<=50    887
>50     113
Name: Age_group, dtype: int64

(2) 문자형 조건에 따른 변수 추가

  • 이번에는 특정문자열의 존재 유무에 따라 새로운 column is_own을 추가한다.
german_credit['Housing'].value_counts()
own     713
rent    179
free    108
Name: Housing, dtype: int64
  • 위 데이터에서 own인 경우는 True 그렇지 않은 경우는 False로 저장한다.
  • np.where을 사용하면 if처럼 매우 쉽게 사용이 가능하다.
import numpy as np 
german_credit['is_own'] = np.where(german_credit['Housing'] == "own", True, False)
german_credit['is_own'].value_counts()
True     713
False    287
Name: is_own, dtype: int64

변수 삭제

  • 이렇게 생성된 변수를 삭제하도록 한다.
  • 이 때, 가장 많이 사용되는 함수는 drop() 메서드를 이용한다.
  • 함수 사용 시, 주의해야 하는 것 중 하나는 axis 0은 행의 방향, axis 1은 열의 방향 축으로 움직인다.
    • 즉, drop()함수를 사용 시에는 axis 1를 같이 입력한다.
german_credit = german_credit.drop('Age+100', axis = 1)
german_credit.shape
(1000, 12)
  • 이번에는 두개의 변수를 추가한 뒤, 한꺼번에 삭제하는 예제를 실습해본다.
german_credit['age+10'] = german_credit['Age'] + 10
german_credit['age+20'] = german_credit['Age'] + 20
german_credit.shape
(1000, 14)
  • 이제 새로 추가된 변수 2개를 삭제 한다.
german_credit = german_credit.drop(['age+10', 'age+20'], axis = 1)
german_credit.shape
(1000, 12)
  • 이렇게 두개 이상의 변수를 삭제할 때는 list를 활용해서 삭제가 가능하다.

정리

  • DataFrame에서 간단하게 변수를 추가 및 삭제하는 방법에 대해 배웠다.
    • 수치형 변수를 활용한 변수 추가, 문자형 변수를 활용한 변수 추가의 기본적인 내용을 숙지한다.
  • 변수를 삭제할 때는 drop()메서드를 사용하는 데, 행을 삭제할 때는 axis = 0, 열을 삭제할 때는 axis = 1 활용한다.

Geospatial Analysis Using Python - Basic

강의 홍보

개요

  • 파이썬을 활용한 공간 시각화에 대해 기술하도록 한다.
  • 각 패키지의 쓰임새와 용도를 확인하도록 한다.
    • 예제를 통해 확인한 뒤, 국내 데이터를 적용해보도록 한다.
    • 한글 폰트상의 문제점 외에 다른 문제점은 없는지 확인해본다.
  • 우선 참고한 자료는 아래와 같다.

기본 환경설정

  • 구글 코랩의 환경설정을 살펴보자.
    • 파이썬 버전 3.6.9을 현재 사용중이다. (2020년 8월 기준)
import sys
sys.version_info
sys.version_info(major=3, minor=6, micro=9, releaselevel='final', serial=0)
  • 이번에는 OS 플랫폼을 확인한다.
    • 현재 Ubuntu 18.04 버전을 사용중이다.
import platform
platform.platform()
'Linux-4.19.112+-x86_64-with-Ubuntu-18.04-bionic'
  • 이번에는 CPU 관련된 정보를 확인해본다.
    • CPU 제논 2.3GHz
!cat /proc/cpuinfo
processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 79
model name	: Intel(R) Xeon(R) CPU @ 2.20GHz
stepping	: 0
microcode	: 0x1
cpu MHz		: 2200.000
cache size	: 56320 KB
physical id	: 0
siblings	: 2
core id		: 0
cpu cores	: 1
apicid		: 0
initial apicid	: 0
fpu		: yes
fpu_exception	: yes
cpuid level	: 13
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm rdseed adx smap xsaveopt arat md_clear arch_capabilities
bugs		: cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs taa
bogomips	: 4400.00
clflush size	: 64
cache_alignment	: 64
address sizes	: 46 bits physical, 48 bits virtual
power management:

processor	: 1
vendor_id	: GenuineIntel
cpu family	: 6
model		: 79
model name	: Intel(R) Xeon(R) CPU @ 2.20GHz
stepping	: 0
microcode	: 0x1
cpu MHz		: 2200.000
cache size	: 56320 KB
physical id	: 0
siblings	: 2
core id		: 0
cpu cores	: 1
apicid		: 1
initial apicid	: 1
fpu		: yes
fpu_exception	: yes
cpuid level	: 13
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm rdseed adx smap xsaveopt arat md_clear arch_capabilities
bugs		: cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs taa
bogomips	: 4400.00
clflush size	: 64
cache_alignment	: 64
address sizes	: 46 bits physical, 48 bits virtual
power management:
  • 메모리 정보를 확인해본다.
    • 무료 버전의 경우 약 13GB를 사용할 수 있다.
!cat /proc/meminfo
MemTotal:       13333552 kB
MemFree:        10691516 kB
MemAvailable:   12499620 kB
Buffers:           76712 kB
Cached:          1886808 kB
SwapCached:            0 kB
Active:           668976 kB
Inactive:        1678968 kB
Active(anon):     360932 kB
Inactive(anon):      360 kB
Active(file):     308044 kB
Inactive(file):  1678608 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:              1992 kB
Writeback:             0 kB
AnonPages:        384360 kB
Mapped:           179824 kB
Shmem:               972 kB
Slab:             164416 kB
SReclaimable:     124572 kB
SUnreclaim:        39844 kB
KernelStack:        3872 kB
PageTables:         4924 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     6666776 kB
Committed_AS:    2491516 kB
VmallocTotal:   34359738367 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
Percpu:              952 kB
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB
DirectMap4k:      107708 kB
DirectMap2M:     5134336 kB
DirectMap1G:    10485760 kB
  • GPU 사용이 가능하면 /device:GPU:0이라고 확인이 될 것이다.
    • 만약 런타임 유형 변경에서 None으로 설정 하면, ' '만 출력이 된다.
import tensorflow as tf
tf.test.gpu_device_name()
'/device:GPU:0'

한글 폰트 설정

  • 시각화 출력 시, 한글 폰트는 별도로 설치 및 설정해줘야 한다.
    • 폰트 설치, 폰트 불러오기, 그리고 런타임 재실행 순으로 해준다.

(1) 폰트 설치

  • 우분투 명령어 apt-get을 통해 나눔 폰트를 설치한다.
!apt-get update -qq
!apt-get install fonts-nanum* -qq
Selecting previously unselected package fonts-nanum.
(Reading database ... 144540 files and directories currently installed.)
Preparing to unpack .../fonts-nanum_20170925-1_all.deb ...
Unpacking fonts-nanum (20170925-1) ...
Selecting previously unselected package fonts-nanum-eco.
Preparing to unpack .../fonts-nanum-eco_1.000-6_all.deb ...
Unpacking fonts-nanum-eco (1.000-6) ...
Selecting previously unselected package fonts-nanum-extra.
Preparing to unpack .../fonts-nanum-extra_20170925-1_all.deb ...
Unpacking fonts-nanum-extra (20170925-1) ...
Selecting previously unselected package fonts-nanum-coding.
Preparing to unpack .../fonts-nanum-coding_2.5-1_all.deb ...
Unpacking fonts-nanum-coding (2.5-1) ...
Setting up fonts-nanum-extra (20170925-1) ...
Setting up fonts-nanum (20170925-1) ...
Setting up fonts-nanum-coding (2.5-1) ...
Setting up fonts-nanum-eco (1.000-6) ...
Processing triggers for fontconfig (2.12.6-0ubuntu2) ...

(2) 폰트 설정

# 설치된 나눔 폰트 출력
# 만약, 설치했는데도, 리스트가 [] 로 출력된다면 런타임을 다시 시작해주세요

import matplotlib.font_manager as fm
import matplotlib.pyplot as plt

sys_font=fm.findSystemFonts()
nanum_font = [f for f in sys_font if 'Nanum' in f]
print(f"nanum_font number: {len(nanum_font)}")
nanum_font

!python --version
def current_font():
  print(f"현재 설정된 폰트 글꼴: {plt.rcParams['font.family']}, 현재 설정된 폰트 사이즈: {plt.rcParams['font.size']}")  # 파이썬 3.6 이상 사용가능
        
current_font()
nanum_font number: 31
Python 3.6.9
현재 설정된 폰트 글꼴: ['sans-serif'], 현재 설정된 폰트 사이즈: 10.0
  • 현재 설정된 폰트 글꼴은 ['sans-serif']인 것으로 확인된다.
    • 이제 sans-serif를 나눔고딕으로 변경한다.
path = '/usr/share/fonts/truetype/nanum/NanumBarunGothic.ttf'  
font_name = fm.FontProperties(fname=path, size=14).get_name()
plt.rc('font', family=font_name)

current_font()
현재 설정된 폰트 글꼴: ['NanumBarunGothic'], 현재 설정된 폰트 사이즈: 10.0

(3) 전체 노트북에 반영

  • 이렇게 설정이 된 후에는 fm._rebuild()를 통해 재 설정 한다.
  • 현재 나올 모든 환경 설정을 아래와 같이 설정한다.
fm._rebuild()

# 노트북 전체 폰트 및 차트 크기 설정
plt.rcParams['font.family'] = 'NanumBarunGothic'
plt.rcParams["font.size"] = 14
plt.rcParams["figure.figsize"] = (12,6)

# matplotlib에서 마이너스 부호가 깨질 때
import matplotlib as mpl
mpl.rcParams['axes.unicode_minus'] = False

print('설정 되어있는 폰트 사이즈 : {}'.format(plt.rcParams['font.size']))
print('설정 되어있는 폰트 글꼴 : {}'.format(plt.rcParams['font.family']))
print('설정 되어있는 차트 크기 : {}'.format(plt.rcParams["figure.figsize"]))
설정 되어있는 폰트 사이즈 : 14.0
설정 되어있는 폰트 글꼴 : ['NanumBarunGothic']
설정 되어있는 차트 크기 : [12.0, 6.0]

(4) 공간시각화 관련 패키지 설정 방법

  • rtree 패키지 설치가 문제가 될 수 있기 때문에 다음과 같이 설치를 진행한다.
!apt install libspatialindex-dev
!pip install rtree
!pip install geopandas
Reading package lists... Done
Building dependency tree       
Reading state information... Done
libspatialindex-dev is already the newest version (1.8.5-5).
The following package was automatically installed and is no longer required:
  libnvidia-common-440
Use 'apt autoremove' to remove it.
0 upgraded, 0 newly installed, 0 to remove and 60 not upgraded.
Requirement already satisfied: rtree in /usr/local/lib/python3.6/dist-packages (0.9.4)
Requirement already satisfied: setuptools in /usr/local/lib/python3.6/dist-packages (from rtree) (49.2.0)
Requirement already satisfied: geopandas in /usr/local/lib/python3.6/dist-packages (0.8.1)
Requirement already satisfied: pyproj>=2.2.0 in /usr/local/lib/python3.6/dist-packages (from geopandas) (2.6.1.post1)
Requirement already satisfied: fiona in /usr/local/lib/python3.6/dist-packages (from geopandas) (1.8.13.post1)
Requirement already satisfied: shapely in /usr/local/lib/python3.6/dist-packages (from geopandas) (1.7.0)
Requirement already satisfied: pandas>=0.23.0 in /usr/local/lib/python3.6/dist-packages (from geopandas) (1.0.5)
Requirement already satisfied: cligj>=0.5 in /usr/local/lib/python3.6/dist-packages (from fiona->geopandas) (0.5.0)
Requirement already satisfied: attrs>=17 in /usr/local/lib/python3.6/dist-packages (from fiona->geopandas) (19.3.0)
Requirement already satisfied: six>=1.7 in /usr/local/lib/python3.6/dist-packages (from fiona->geopandas) (1.15.0)
Requirement already satisfied: munch in /usr/local/lib/python3.6/dist-packages (from fiona->geopandas) (2.5.0)
Requirement already satisfied: click<8,>=4.0 in /usr/local/lib/python3.6/dist-packages (from fiona->geopandas) (7.1.2)
Requirement already satisfied: click-plugins>=1.0 in /usr/local/lib/python3.6/dist-packages (from fiona->geopandas) (1.1.1)
Requirement already satisfied: python-dateutil>=2.6.1 in /usr/local/lib/python3.6/dist-packages (from pandas>=0.23.0->geopandas) (2.8.1)
Requirement already satisfied: numpy>=1.13.3 in /usr/local/lib/python3.6/dist-packages (from pandas>=0.23.0->geopandas) (1.18.5)
Requirement already satisfied: pytz>=2017.2 in /usr/local/lib/python3.6/dist-packages (from pandas>=0.23.0->geopandas) (2018.9)

구글 드라이브와 연동

  • 우선 구글 드라이브와 계정 연동을 진행한다.
# Mount Google Drive
from google.colab import drive # import drive from google colab

ROOT = "/content/drive"     # default location for the drive
print(ROOT)                 # print content of ROOT (Optional)
drive.mount(ROOT)           # we mount the google drive at /content/drive
/content/drive
Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True).
  • 데이터가 있는 경로로 이동한다.
from os.path import join  

MY_GOOGLE_DRIVE_PATH = 'My Drive/Colab Notebooks/inflearn/Python/Kaggle_Edu/02_kaggle_eda/03_map/data' # 프로젝트 경로
PROJECT_PATH = join(ROOT, MY_GOOGLE_DRIVE_PATH) # 프로젝트 경로
print(PROJECT_PATH)
/content/drive/My Drive/Colab Notebooks/inflearn/Python/Kaggle_Edu/02_kaggle_eda/03_map/data
%cd "{PROJECT_PATH}"
/content/drive/My Drive/Colab Notebooks/inflearn/Python/Kaggle_Edu/02_kaggle_eda/03_map/data
%ls
'상가(상권)정보_201912.'/   customer_rate_02.xlsx    pivot_table_04.xlsx
 census.csv                 merge_03.xlsx
 city.geojson               missing_values_01.xlsx

공간시각화 파일에 대한 기본 개념

  • geometryPoint, Line, Polygon을 저장할 수 있다.
  • 파일의 구성도는 다음과 같다.
$ ls map_files/

map.dbf
map.shp
map.shx
  • shp는 전체 geometry를 의미한다.
  • dbf는 각 geometry에 대한 속성(atrributes)값을 가지고 있다.
  • shx는 각 속성 값을 shp안에 있는 geometry를 연결한다.

Geopandas 의존성

  • GeoJSON은 MultiPoint, MultiLineString, MultiPolygon을 포함한 MultiGeometry를 지원함.
  • geojsongeopandas로 읽게 될 경우, propertiesGeoDataFrame이 된다.

(1) Geopandas의 개념

  • geopandas는 크게 2가지의 데이터 의존성이 있다.
    • Vector: points, lines, and polygons.
    • RASTER: 일종의 격자(grid)로 생각하면 된다. (예: Topographical Map)
  • 크게 2개의 Library가 필요하다.
    • Fiona: Open GIS Simple Features와 파이썬과 geopandas를 연결하는 일종의 다리 역할을 수행한다.
    • GDALrater 데이터를 변환하는 것
    • OGR은 vector 데이터를 변환하는 것

Seaborn Visualisation Tutorial - Basic

공지

제 수업을 듣는 사람들이 계속적으로 실습할 수 있도록 강의 파일을 만들었습니다. 늘 도움이 되기를 바라며. 참고했던 교재 및 Reference는 꼭 확인하셔서 교재 구매 또는 관련 Reference를 확인하시기를 바랍니다.

시각화 기본적 원리

  1. 비교, 대조, 차이를 드러내라.
  2. 인과관계와 상관관계를 보여라.
  3. 한 도표에 여러 변수를 보여라.
  4. 텍스트, 숫자, 이미지, 그래프 같은 데이터들을 한 곳에 통합하라.
  5. 사용된 데이터의 출처를 그래프 안이나 각주로 밝혀라.
  6. 의미 있는 내용을 담아라.

데이터 변수 종류에 따른 시각화의 종류

  • 시각화는 그냥 그리는 것이 아니다. 변수의 종류에 따른 기법이 존재한다.
    • 다만, Python & R의 방법론의 차이가 있을 뿐이다.
  • 원리를 알면, 다음은 검색 및 연습을 통해 다듬어진다.

입문자를 위한 머신러닝 튜토리얼 - 교차검증

개요

  • 교차검증의 의미를 이해한다.
  • 교차검증을 위한 간단한 실습을 진행한다.

교차검증이란

  • 교차검증은 기본적으로 과적합을 예방하기 위한 방법론 중 하나이다.
  • 교차검증을 쉽게 이해하는 방법은 수능시험을 보기 위해 수능과 비슷한 유형의 모의고사를 보는 것과 같다.

(1) K폴드 교차검증 개요

  • 데이터의 수가 적을 때 사용한다.
    • 검증 데이터의 수도 적기 때문에 검증 성능의 신뢰도가 떨어진다.
    • 이 때, K-폴드 방법을 사용한다.
  • 그림을 보며 이해하자.

  • 데이터의 편향을 방지하기 위한 것
    • 데이터를 K개로 나누어 K-1개를 분할하고 나머지는 평가에 사용
    • 모델의 검증 점수는 K개의 검증 점수 평균이 된다.

(2) 소스코드를 통한 검증

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
from scipy import stats
from sklearn.datasets import load_boston
%matplotlib inline

# boston 데이타셋 로드
boston = load_boston()

# boston 데이타셋 DataFrame 변환 
bostonDF = pd.DataFrame(boston.data , columns = boston.feature_names)

# boston dataset의 target array는 주택 가격임. 이를 PRICE 컬럼으로 DataFrame에 추가함. 
bostonDF['PRICE'] = boston.target
print('Boston 데이타셋 크기 :',bostonDF.shape)
bostonDF.head()
/usr/local/lib/python3.6/dist-packages/statsmodels/tools/_testing.py:19: FutureWarning: pandas.util.testing is deprecated. Use the functions in the public API at pandas.testing instead.
  import pandas.util.testing as tm


Boston 데이타셋 크기 : (506, 14)
  • 데이터 시각화를 진행한다.
# 2개의 행과 4개의 열을 가진 subplots를 이용. axs는 4x2개의 ax를 가짐.
fig, axs = plt.subplots(figsize=(16,8) , ncols=4 , nrows=2)
lm_features = ['RM','ZN','INDUS','NOX','AGE','PTRATIO','LSTAT','RAD']
for i , feature in enumerate(lm_features):
    row = int(i/4)
    col = i%4
    
    # 시본의 regplot을 이용해 산점도와 선형 회귀 직선을 함께 표현
    sns.regplot(x=feature , y='PRICE', data=bostonDF , ax=axs[row][col])

png

입문자를 위한 머신러닝 분류 튜토리얼 - Decision Tree

개요

  • 사이킷런(scikit-learn)은 파이썬 머신러닝 라이브러리이다.
  • 파이썬에서 나오는 최신 알고리즘들도 이제는 사이킷런에 통합하는 형태로 취하고 있다.
  • 구글 코랩은 기본적으로 사이킷런까지 설치가 완료되기에 별도의 설치가 필요없는 장점이 있다.
  • Note: 본 포스트는 머신러닝 자체를 처음 접하는 분들을 위한 것이기 때문에, 어느정도 경험이 있으신 분들은 필자의 다른 포스트를 읽어주시기를 바랍니다.

패키지 불러오기

  • 패키지는 시간에 지남에 따라 계속 업그레이드가 되기 때문에 꼭 버전 체크를 하는 것을 권장한다.
    • 필자가 글을 남겼을 때는 2020년 8월 16일에 작성했음을 기억하자.
import sklearn
print(sklearn.__version__)
0.22.2.post1

머신러닝 워크플로우

  • 가장 간단한 데이터인 iris 데이터의 종 분류를 진행하도록 한다.
  • 사실, 이 예제는 매우 간단하기 때문에, 전체적인 프로세스를 익히는 관점에서 확인하기를 바란다.

(1) 지도학습의 정의

  • 지도학습(Supervised Learning)의 가장 큰 특징 중의 하나는 위와 같이 분류 결정값이 사전에 정의가 되어야 한다.
    • 만약, 사전에 분류가 된 것이 없다면 어떻게 할 수 있을까? 당연한 말이지만, 머신러닝 수행하기 전 데이터 수집이 필수가 된다.
  • 위 꽃을 분류하는 것 같이, 명확한 정답이 주어진 데이터를 먼저 학습 한 뒤, 미지의 정답을 예측하는 것을 지도학습이라 부른다.

입문자를 위한 머신러닝 분류 튜토리얼 - IRIS 분류

개요

  • 사이킷런(scikit-learn)은 파이썬 머신러닝 라이브러리이다.
  • 파이썬에서 나오는 최신 알고리즘들도 이제는 사이킷런에 통합하는 형태로 취하고 있다.
  • 구글 코랩은 기본적으로 사이킷런까지 설치가 완료되기에 별도의 설치가 필요없는 장점이 있다.
  • Note: 본 포스트는 머신러닝 자체를 처음 접하는 분들을 위한 것이기 때문에, 어느정도 경험이 있으신 분들은 필자의 다른 포스트를 읽어주시기를 바랍니다.

패키지 불러오기

  • 패키지는 시간에 지남에 따라 계속 업그레이드가 되기 때문에 꼭 버전 체크를 하는 것을 권장한다.
    • 필자가 글을 남겼을 때는 2020년 8월 16일에 작성했음을 기억하자.
import sklearn
print(sklearn.__version__)
0.22.2.post1

머신러닝 워크플로우

  • 가장 간단한 데이터인 iris 데이터의 종 분류를 진행하도록 한다.
  • 사실, 이 예제는 매우 간단하기 때문에, 전체적인 프로세스를 익히는 관점에서 확인하기를 바란다.

(1) 지도학습의 정의

  • 지도학습(Supervised Learning)의 가장 큰 특징 중의 하나는 위와 같이 분류 결정값이 사전에 정의가 되어야 한다.
    • 만약, 사전에 분류가 된 것이 없다면 어떻게 할 수 있을까? 당연한 말이지만, 머신러닝 수행하기 전 데이터 수집이 필수가 된다.
  • 위 꽃을 분류하는 것 같이, 명확한 정답이 주어진 데이터를 먼저 학습 한 뒤, 미지의 정답을 예측하는 것을 지도학습이라 부른다.

Data Science Resources

개요

  • 제 개인 참조하려고 만든 게시글입니다.
  • 언제나 좋은 글 및 싸이트, 패키지를 만들어 배포하는 모든 Data Scientist, Analyst 분들 존경합니다.

(1) Tools

I. 머신러닝/딥러닝 관련 자료

(1) 머신러닝

(2) 딥러닝 논문

(3) 추천시스템

(4) 강의자료

(5) 딥러닝 논문 로드맵

II. 통계

(1) 구조방정식

  • SmartPLS: 기본 튜토리얼 및 원서 제공

III. 문서 자동화 & autoEDA

(1) R 기반

(2) Python 기반

IV. 데이터과학을 위한 Tools

V. GUI (Graphical User Interface)

(1) Python

  • Tkinter
    • [Sample Tutorial](Cats vs Dogs Classification (with 98.7% Accuracy) using CNN Keras – Deep Learning Project for Beginner)

VI. 시각화

(1) 공간시각화

(2) 파이썬 시각화

(3) 파이썬 대시보드

V. MLOps

기타