If else, and more

강의 홍보

I. 개요

  • 조건문에 대해 배우고 실습하는 시간을 갖는다.
  • else와 elif에 대해 배우고 실습한다.
  • 한줄로 작성하는 if_else에 대해 배우고 실습한다.

II. If 조건문 소개

  • Excel을 배운 사람이라면 누구나 아는 문법이다.
    • 다만, 위 문법을 파이썬 언어에 맞게 변형한 것이다.
if <조건=True>:
  <코드1>
  <코드2>

(1) 언제 실행되는가?

  • 위 구문의 뜻이 무엇인가?

ch 01 - PLS SEM Intro

개요

  • 석사 학위 논문을 위해 작성하기 위해 만들었음
  • PLS SEM 모델링을 위한 R 패키지가 존재함
    • plspm: 2020년 5월 14일 R Cran에서 정식 패키지에서 내려감
      • 위 패키지는 원서 약 230페이지 되는 교재도 있음
      • 1차로 위 패키지를 고려했으나 5/14일 패키지가 내려간 이후 선택에서 제외시킴
  • 또한, SMART PLS라는 상용프로그램도 존재함
  • 특정 R semPLS와 위 상용 프로그램을 비교한 논문이 있었고, 다행히 두 프로그램의 결과값이 동일한 것으로 증명되었다.
    ref. Utilization of R Program for the Partial Least Square Model: Comparison of SmartPLS and R
  • 아직 확정지은 것은 아니지만, 향후 추가적인 논문을 진행한다면 위 2개의 패키지와 SMART PLS 상용 소프트웨어를 비교하는 논문도 괜찮을 것이라 생각함

교재

Sample Code

  • 패키지 로드
library("semPLS")
## Loading required package: lattice
  • Sample 데이터 불러오기
data("ECSIsm")
head(ECSIsm)
##      source        target        
## [1,] "Image"       "Expectation" 
## [2,] "Expectation" "Quality"     
## [3,] "Expectation" "Value"       
## [4,] "Quality"     "Value"       
## [5,] "Image"       "Satisfaction"
## [6,] "Expectation" "Satisfaction"
data("ECSImm")
head(ECSImm)
##      source        target 
## [1,] "Image"       "IMAG1"
## [2,] "Image"       "IMAG2"
## [3,] "Image"       "IMAG3"
## [4,] "Image"       "IMAG4"
## [5,] "Image"       "IMAG5"
## [6,] "Expectation" "CUEX1"
data("mobi")
head(mobi)
##   CUEX1 CUEX2 CUEX3 CUSA1 CUSA2 CUSA3 CUSCO CUSL1 CUSL2 CUSL3 IMAG1 IMAG2 IMAG3
## 1     7     7     6     6     4     7     7     6     5     6     7     5     5
## 2    10    10     9    10    10     8    10    10     2    10    10     9    10
## 3     7     7     7     8     7     7     6     6     2     7     8     7     6
## 4     7    10     5    10    10    10     5    10     4    10    10    10     5
## 5     8     7    10    10     8     8     5    10     3     8    10    10     5
## 6    10     9     7     8     7     7     8    10     3    10     8     9    10
##   IMAG4 IMAG5 PERQ1 PERQ2 PERQ3 PERQ4 PERQ5 PERQ6 PERQ7 PERV1 PERV2
## 1     5     4     7     6     4     7     6     5     5     2     3
## 2    10     9    10     9    10    10     9    10    10    10    10
## 3     4     7     7     8     5     7     8     7     7     7     7
## 4     5    10     8    10    10     8     4     5     8     5     5
## 5     8     9    10     9     8    10     9     9     8     6     6
## 6     8     9     9    10     9    10     8     9     9    10    10
  • 모형 적합
ECSI <- plsm(data = mobi, strucmod = ECSIsm, measuremod = ECSImm)
mvpairs(model = ECSI, data = mobi, LVs = "Expectation")

데이콘 대회 참여 - 01 제주시 빅데이터 카드 매출 경진대회 데이터 수집 및 저장

I. 개요

  • 본 과정은 직업훈련기관 수업의 일환으로 진행하였음
  • 수강생들이 기본적으로 어려워하는 클라우드 DB연동부터 구현하여 빠르게 EDA를 활용할 수 있도록 진행함
  • DBBigQuery를 활용함.

(1) 대회 참여 및 파일 다운로드 상세

  • 데이콘은 국내 빅데이터 경진대회이다.

(2) 대회 개요

Ref. https://dacon.io/competitions/official/235615/overview/

  • 주제

    • AI 알고리즘 활용 카드 사용 금액 예측
  • 목표

    • 신용카드 사용 내역 데이터를 활용한 지역별, 업종별 월간 카드 사용 총액 예측
  • 배경

    • 신용카드 사용량을 분석을 통한 ‘Post COVID-19 시대’ 신용카드 사용량 예측 모델 개발
    • 지역 경제 위축 및 중소상공인 경영난 해소를 위한 대책 마련
  • 주최/주관

추천 시스템 개요 및 이론, Surprise Package

I. 개요

  • 대고객 대상으로 한 대부분의 플랫폼 서비스 업체들은 고객 개개인에게 맞춤형의 추천 서비스를 도입하고 있음
    • 전자상거래 업체, 유투브, 애플 뮤직 등
  • ML의 여러 알고리즘 중 비즈니스 관점에 부합하는 기법이 추천 시스템.
  • 추천 시스템의 진정한 묘미는 사용자 본인도 모르는 취향 발견, 재구매로 연결하도록 설계
  • 누가 필요할까?
    • 모든 플랫폼 서비스
    • 이유1: 플랫폼은 다수의 판매자와 소비자를 필요로 함, 문제는 카테고리와 메뉴구성이 복잡해지면 소비자의 제품 선택에 부작용
    • 이유2: 만족도가 떨어지면 고객은 그 플랫폼을 떠날 가능성이 크며, 이는 플랫폼 서비스의 매출 하락과 직결
    • 모든 플랫폼 서비스는 기본적으로 추천서비스를 장착하고 싶어함
  • 영화 데이터를 기준으로 추천시스템을 단계별로 구현함을 목표로 함

II. 추천시스템의 유형 및 역사

  • 추천시스템의 유형과 간단한 역사에 대해 배워보도록 한다.

(1) 유형

  • 크게 세가지로 구분됨.
    • Demographic Filtering
    • 콘텐츠 기반 필터링 (Content Filtering)
    • 협업 필터링 (Collaborative Filtering)
      • 최근접 이웃(Nearest Neighbor)
      • 잠재 요인(Latent Factor)

(2) 역사

  • 초창기: 콘텐츠 기반 필터링 또는 최근접 이웃 기반 협업 필터링이 주로 사용됨.
  • 중기: 넷플릭스 추천 시스템 경연 대회에서 행렬 분해 (Matrix Factorization) 기법을 이용한 잠재요인 협업 필터링 방식으로 우승한 뒤, 유명해짐.
  • 최근: 개인화 특성을 강화하기 위해서 하이브리드 형식으로 콘텐츠 기반과 협업 기반을 적절히 결합해 사용하는 경우도 늘고 있음

III. Surprise 패키지

  • Surprise 패키지는 추천시스템 패키지이다.
  • 설치 방법은 다음 문서를 참조하기를 바란다.
  • 해당 패키지를 활용하면 보다 쉽게 API를 활용해서 추천 시스템을 구축할 수 있다.
    • 다양한 추천 알고리즘들이 해당 패키지에 내재되어 있다.

(1) 패키지 개요

  • 영어 원문에는 아래와 같이 설명되어 있다.

추천 시스템 패키지 소개 - recommenderlab

I. 개요

  • 추천시스템을 처음 배우는 접하는 사람들을 위해 준비한 입문 Tutorial이다.

  • 패키지 소개서에 있는 내용을 한글로 번역하였다.

  • This R package provides an infrastructure to test and develop recommender algorithms. The package supports rating (e.g., 1-5 stars) and unary (0-1) data sets. Supported algorithms are:

  • 이 R 패키지는 추천자 알고리즘을 테스트하고 개발할 수 있는 인프라를 제공한다. 이 패키지는 등급(예: 별 1-5개) 및 단항(0-1) 데이터 세트를 지원한다. 지원되는 알고리즘:

    • User-based collborative filtering (UBCF)
    • Item-based collborative filtering (IBCF)
    • SVD with column-mean imputation (SVD)
    • Funk SVD (SVDF)
    • Alternating Least Squares (ALS)
    • Matrix factorization with LIBMF (LIBMF)
    • Association rule-based recommender (AR)
    • Popular items (POPULAR)
    • Randomly chosen items for comparison (RANDOM)
    • Re-recommend liked items (RERECOMMEND)
    • Hybrid recommendations (HybridRecommender)
  • For evaluation, the framework supports given-n and all-but-x protocols with

추천 시스템 개요 및 이론, Baseline Code

I. 개요

  • 대고객 대상으로 한 대부분의 플랫폼 서비스 업체들은 고객 개개인에게 맞춤형의 추천 서비스를 도입하고 있음
    • 전자상거래 업체, 유투브, 애플 뮤직 등
  • ML의 여러 알고리즘 중 비즈니스 관점에 부합하는 기법이 추천 시스템.
  • 추천 시스템의 진정한 묘미는 사용자 본인도 모르는 취향 발견, 재구매로 연결하도록 설계
  • 누가 필요할까?
    • 모든 플랫폼 서비스
    • 이유1: 플랫폼은 다수의 판매자와 소비자를 필요로 함, 문제는 카테고리와 메뉴구성이 복잡해지면 소비자의 제품 선택에 부작용
    • 이유2: 만족도가 떨어지면 고객은 그 플랫폼을 떠날 가능성이 크며, 이는 플랫폼 서비스의 매출 하락과 직결
    • 모든 플랫폼 서비스는 기본적으로 추천서비스를 장착하고 싶어함
  • 영화 데이터를 기준으로 추천시스템을 단계별로 구현함을 목표로 함

II. 추천시스템의 유형 및 역사

  • 추천시스템의 유형과 간단한 역사에 대해 배워보도록 한다.

(1) 유형

  • 크게 세가지로 구분됨.
    • Demographic Filtering
    • 콘텐츠 기반 필터링 (Content Filtering)
    • 협업 필터링 (Collaborative Filtering)
      • 최근접 이웃(Nearest Neighbor)
      • 잠재 요인(Latent Factor)

(2) 역사

  • 초창기: 콘텐츠 기반 필터링 또는 최근접 이웃 기반 협업 필터링이 주로 사용됨.
  • 중기: 넷플릭스 추천 시스템 경연 대회에서 행렬 분해 (Matrix Factorization) 기법을 이용한 잠재요인 협업 필터링 방식으로 우승한 뒤, 유명해짐.
  • 최근: 개인화 특성을 강화하기 위해서 하이브리드 형식으로 콘텐츠 기반과 협업 기반을 적절히 결합해 사용하는 경우도 늘고 있음

III. Demographic Filtering

  • 가장 기초적이면서 Simple한 추천시스템 방식
  • 같은 영화를 인구통계학에 기반하여 각 사용자에게 추천
  • 그런데, 영화추천 시, 주로 인기도가 높은 대중적인 영화 위주 (예를 들면 Top 250개)만 선별하여 각 사용자에게 전달. 대중적인 영화들은 영화를 보지 않는 다른 일반 관객들에게게 호감을 가질 가능성이 더 높을 것으로 추정
  • 필요조건
    • 영화 평점 점수
    • 평점 점수 기반 영화 정렬

(1) 데이터 수집

(2) 데이터 설명

  • 여러 데이터들이 있는데, 관련 내용은 캐글 본문의 것을 그대로 사용한다.
    • movies_metadata.csv: The main Movies Metadata file. Contains information on 45,000 movies featured in the Full MovieLens dataset. Features include posters, backdrops, budget, revenue, release dates, languages, production countries and companies.
    • keywords.csv: Contains the movie plot keywords for our MovieLens movies. Available in the form of a stringified JSON Object.
    • credits.csv: Consists of Cast and Crew Information for all our movies. Available in the form of a stringified JSON Object.
    • links.csv: The file that contains the TMDB and IMDB IDs of all the movies featured in the Full MovieLens dataset.
    • links_small.csv: Contains the TMDB and IMDB IDs of a small subset of 9,000 movies of the Full Dataset.
    • ratings_small.csv: The subset of 100,000 ratings from 700 users on 9,000 movies.

(3) 구글 드라이브와 연동

  • 구글 드라이브와 연동하여 pandas를 활용하여 데이터를 수집한다.
  • 구글 드라이브와 연동하는 방법에 대해서는 Colab + Drive + Github Workflow에서 확인한다.
from google.colab import drive # 패키지 불러오기 
from os.path import join  

ROOT = "/content/drive"     # 드라이브 기본 경로
print(ROOT)                 # print content of ROOT (Optional)
drive.mount(ROOT)           # 드라이브 기본 경로 Mount

MY_GOOGLE_DRIVE_PATH = 'My Drive/Colab Notebooks/your/path' # 프로젝트 경로
PROJECT_PATH = join(ROOT, MY_GOOGLE_DRIVE_PATH) # 프로젝트 경로
print(PROJECT_PATH)
/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&response_type=code&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

Enter your authorization code:
··········
%cd "{PROJECT_PATH}"
!ls
data  source
import pandas as pd
import pandas_profiling
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib.pyplot import figure
import seaborn as sns

from IPython.core.display import display, HTML
from pandas_profiling import ProfileReport
/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
import pandas as pd
metadata = pd.read_csv('data/movies_metadata.csv', low_memory=False)
metadata.head(3)
adultbelongs_to_collectionbudgetgenreshomepageidimdb_idoriginal_languageoriginal_titleoverviewpopularityposter_pathproduction_companiesproduction_countriesrelease_daterevenueruntimespoken_languagesstatustaglinetitlevideovote_averagevote_count
0False{'id': 10194, 'name': 'Toy Story Collection', ...30000000[{'id': 16, 'name': 'Animation'}, {'id': 35, '...http://toystory.disney.com/toy-story862tt0114709enToy StoryLed by Woody, Andy's toys live happily in his ...21.946943/rhIRbceoE9lR4veEXuwCC2wARtG.jpg[{'name': 'Pixar Animation Studios', 'id': 3}][{'iso_3166_1': 'US', 'name': 'United States o...1995-10-30373554033.081.0[{'iso_639_1': 'en', 'name': 'English'}]ReleasedNaNToy StoryFalse7.75415.0
1FalseNaN65000000[{'id': 12, 'name': 'Adventure'}, {'id': 14, '...NaN8844tt0113497enJumanjiWhen siblings Judy and Peter discover an encha...17.015539/vzmL6fP7aPKNKPRTFnZmiUfciyV.jpg[{'name': 'TriStar Pictures', 'id': 559}, {'na...[{'iso_3166_1': 'US', 'name': 'United States o...1995-12-15262797249.0104.0[{'iso_639_1': 'en', 'name': 'English'}, {'iso...ReleasedRoll the dice and unleash the excitement!JumanjiFalse6.92413.0
2False{'id': 119050, 'name': 'Grumpy Old Men Collect...0[{'id': 10749, 'name': 'Romance'}, {'id': 35, ...NaN15602tt0113228enGrumpier Old MenA family wedding reignites the ancient feud be...11.7129/6ksm1sjKMFLbO7UY2i6G1ju9SML.jpg[{'name': 'Warner Bros.', 'id': 6194}, {'name'...[{'iso_3166_1': 'US', 'name': 'United States o...1995-12-220.0101.0[{'iso_639_1': 'en', 'name': 'English'}]ReleasedStill Yelling. Still Fighting. Still Ready for...Grumpier Old MenFalse6.592.0

(4) 평점 가중치 함수 구현

  • 여기에서 주목해야 하는 것이 있는데, vote_averagevote_count를 유심히 봐야한다.
  • 3명이 투표해서 얻은 평점 8.7의 영화 Vs. 100명이 투표해서 얻은 평점 8.0의 영화 중 어느 것이 더 좋다고 볼 수 있을까?
  • 이러한 부분을 고려하여 가중치 공식을 만든다. (wr:Weighted Rating)

$$ wr = \left (\frac{\nu }{\nu+\mu } \times R \right ) + \left (\frac{\nu }{\nu+\mu } \times C \right ) $$

About Dictionaries

강의 홍보

I. 개요

  • 이번 시간부터 본격적으로 파이썬의 기초 자료형에 대해 간단한 튜토리얼을 준비했다.
  • 데이터 분석과는 큰 관계가 없을 수 있지만, 데이터 정제 할 때, 도움이 되기도 한다.
  • 그 중에서 면접의 단골질문과 같은 Dictionary에 대해 나누는 시간을 가졌다.

II. Dictionary의 기본적인 특징

  • Dictionary는 영어 원뜻 그대로 사전을 생각하면 된다.
  • DictionaryList와 유사한 부분이 많다.
    • List와 같이 Mutable이라는 뜻을 포함한다.
    • List와 같이 다른 Dictionary, list 등을 포함시킬 수 있다.
  • 차이점은 원소에 대한 접근방법의 차이다.
    • List에서 각 원소에 대한 접근법은 index을 활용한다.
    • Dictionary에서 각 원소에 대한 접근법은 keys에 의해 접근한다.

III. Dictionary 정의

  • 로고사진처럼, Dictionarykey-value로 구성 되어 있다.
  • Dictionary를 정의하는 방법에는 여러가지가 있다.

(1) 기본 { }를 활용한 방법

  • 기본적인 문법은 아래와 같다.
d = {
    <>: <>,
    <>: <>,
      .
      .
      .
    <>: <>,
}
  • 간단하게 국내 야구팀을 Dictionary 형태로 만들어보자.
KOR_team1 = {
    "인천"  : "SK", 
    "서울1" : "LG", 
    "서울2" : "두산", 
    "창원"  : "NC",
    "광주"  : "기아",
    "대구"  : "삼성",
    "대전"  : "한화",
    "부산"  : "롯데",
    "수원"  : "KT",
    "고척"  : "키움",
}
KOR_team1
{'고척': '키움',
 '광주': '기아',
 '대구': '삼성',
 '대전': '한화',
 '부산': '롯데',
 '서울1': 'LG',
 '서울2': '두산',
 '수원': 'KT',
 '인천': 'SK',
 '창원': 'NC'}

(2) 내장함수 dict()를 활용하는 방법

  • key-value를 활용하는데, 이 때 tuple 형태로 작성한다.
d = dict([
    (<>, <>),
    (<>, <값),
      .
      .
      .
    (<>, <>)
])
  • 똑같이 야구팀을 작성한다.
KOR_team2 = dict([
  ("인천", "SK"), 
  ("서울1", "LG"), 
  ("서울2", "두산"), 
  ("창원", "NC"), 
  ("광주", "기아"), 
  ("대구", "삼성"), 
  ("대전", "한화"), 
  ("부산", "롯데"), 
  ("수원", "KT"), 
  ("고척", "키움")
])

KOR_team2
{'고척': '키움',
 '광주': '기아',
 '대구': '삼성',
 '대전': '한화',
 '부산': '롯데',
 '서울1': 'LG',
 '서울2': '두산',
 '수원': 'KT',
 '인천': 'SK',
 '창원': 'NC'}

(3) dict with spring

  • dict() 함수 안에 문자열 변수를 입력하는 형태로 코드를 작성한다.
KOR_team3 = dict(
  인천 = "SK", 
  서울1 = "LG", 
  서울2 = "두산", 
  창원 = "NC", 
  광주 = "기아", 
  대구 = "삼성", 
  대전 = "한화", 
  부산 = "롯데", 
  수원 = "KT", 
  고척 = "키움" 
)

KOR_team3
{'고척': '키움',
 '광주': '기아',
 '대구': '삼성',
 '대전': '한화',
 '부산': '롯데',
 '서울1': 'LG',
 '서울2': '두산',
 '수원': 'KT',
 '인천': 'SK',
 '창원': 'NC'}
  • 실제 Dictionary 형태로 정의가 되었는지 확인해본다.
print(type(KOR_team1))
print(type(KOR_team2))
print(type(KOR_team3))
<class 'dict'>
<class 'dict'>
<class 'dict'>

IV. Dictionary 접근법

  • Dictionary 원소 접근법은 indexing이 아니라 key값에 의해 결정된다.
print(KOR_team1['인천'])
print(KOR_team1['부산'])
SK
롯데
  • 만약에 전주에 새로운 야구팀(현대)이 생겼다고 가정하자.
  • 추가하는 소스코드는 아래와 같다.
KOR_team1['전주'] = "현대"
KOR_team1
{'고척': '키움',
 '광주': '기아',
 '대구': '삼성',
 '대전': '한화',
 '부산': '롯데',
 '서울1': 'LG',
 '서울2': '두산',
 '수원': 'KT',
 '인천': 'SK',
 '전주': '현대',
 '창원': 'NC'}
  • 전주: 현대가 추가된 것을 확인할 수 있다.
  • 이번에는 방금 추가한 전주: 현대를 삭제하도록 하자. (del) 함수 사용
del KOR_team1['전주']
KOR_team1
{'고척': '키움',
 '광주': '기아',
 '대구': '삼성',
 '대전': '한화',
 '부산': '롯데',
 '서울1': 'LG',
 '서울2': '두산',
 '수원': 'KT',
 '인천': 'SK',
 '창원': 'NC'}
  • 정상적으로 삭제가 된 것을 확인할 수 있다.

V. Dictionary Using Integer

  • 이전까지 접근한 것은 문자를 입력해서 접근했다.
  • Integer로 활용하는 방법은 없을까?
dic = {0: 'a', 1: 'b', 2: 'c', 3: 'd'}
dic
{0: 'a', 1: 'b', 2: 'c', 3: 'd'}
print(dic[0])
print(dic[1])
a
b
  • 그러나 주의해야 하는 것은 diclist가 아니다.
  • 즉, list에서 할 수 있었던, slicing이나 append를 사용할 수 없다.
    • 관련 에러 몇개를 확인해보자.
dic.append('e')
---------------------------------------------------------------------------

AttributeError                            Traceback (most recent call last)

<ipython-input-20-8bfa5988d009> in <module>()
----> 1 dic.append('e')


AttributeError: 'dict' object has no attribute 'append'
  • AttributeError: 'dict' object has no attribute 'append' 이 뜻이 함의하는 것은 dictionary에는 append라는 속성값이 없다는 뜻이다.
dic[0:2]
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-21-82c17d59c309> in <module>()
----> 1 dic[0:2]


TypeError: unhashable type: 'slice'
  • 마찬가지로 list에서 작동했던 slice는 여기에서는 존재하지 않는다.

VI. Dictionary와 관련된 여러 함수 소개

  • Dictionary와 함께 사용되면 좋은 함수들을 간단하게 소개 한다.

(1) d.clear()

  • 먼저 아래 코드를 확인해보자.
dic = {'A': 1, 'B': 2, 'C': 3}
dic
{'A': 1, 'B': 2, 'C': 3}
  • clear() 함수 적용 뒤 결과값을 확인해보자.
dic.clear()
dic
{}
  • 결과값을 확인해보니 모두 삭제된 것을 확인할 수 있다.

(2) d.get()

  • get()함수는 key값을 활용해서 value값을 가져오는 함수다.
  • 소스코드를 통해 확인하자.
dic = {'A': 1, 'B': 2, 'C': 3}
print(dic.get('B'))
print(dic.get('Z'))
2
None
  • .get('B')에 해당하는 Dictionary값이 존재하기 때문에 2를 반환한다.
  • .get('Z')에 해당하는 Dictionary값이 존재하지 않기 때문에 None을 반환한다.
    • 그런데 None을 반환하기 보다 특정 숫자 또는 문자로 출력하고 싶다면 다음과 같이 입력하면 된다.
print(dic.get('z', 0))
print(dic.get('z', "없음"))
0
없음

(3) d.keys()

  • Dictionarykeyvalue로 구성되어 있는데, keys()의 뜻은 현재 구성되어 있는 Dictionary에서 keys()dict_keys 형태로 반환한다.
    • 이 때, list로 변환을 하려면 list()를 활용하면 된다.
dic = {'A': 1, 'B': 2, 'C': 3}
print(dic.keys())
print(list(dic.keys()))
dict_keys(['A', 'B', 'C'])
['A', 'B', 'C']

(4) d.values()

  • keys()를 활용하여 key를 반환했던 것처럼, values()를 활용하여 value를 진행하자.
    • 코드는 위와 동일하다. 다만, 함수만 바꾼다.
dic = {'A': 1, 'B': 2, 'C': 3}
print(dic.values())
print(list(dic.values()))
dict_values([1, 2, 3])
[1, 2, 3]
  • 그 외에도 pop(), popitem(), update()를 활용법을 익혀본다.

VII. Reference

w3schools. Python Dictionaries. Retrieved June 20, 2020, from https://www.w3schools.com/python/python_dictionaries.asp

The difference betwen Lists and Tuples in Python

강의 홍보

I. 개요

  • 이번 시간부터 본격적으로 파이썬의 기초 자료형에 대해 간단한 튜토리얼을 준비했다.
  • 데이터 분석과는 큰 관계가 없을 수 있지만, 데이터 정제 할 때, 도움이 되기도 한다.
  • 그 중에서 면접의 단골질문과 같은 Lists & Tuple에 대해 나누는 시간을 가졌다.

II. Lists

  • 먼저 Lists[] 형태로 정의가 된다.
alphabet = ['A', 'B', 'C', 'D']
print(alphabet)
['A', 'B', 'C', 'D']
  • 코드는 간단하다. 그러나 함의하고 있는 내용은 다음과 같다.
    • List는 정렬(ordered)되었다.
    • List는 다양한 형태의 데이터 유형을 담을 수 있다.
    • List안에 있는 값은 인덱스로 접근한다.
    • List안에 또다른 List를 담을 수 있다.
    • List는 변하기 쉽다.
    • List는 동적이다.

(1) List는 정렬(ordered)되었다.

  • 우선 코드로 확인하자.
a1 = [1, 2, 3, 4]
a2 = [2, 3, 4, 1]

a1 == a2
False
a1 is a2
False
[1, 2, 3, 4] == [2, 3, 4, 1]
False
  • 일련의 코드는 a1a2가 같지 않다는 것을 프로그래밍적으로 증명한 것이다.
    • 좀 더 쉽게 표현하면 List안에 있는 값은 순서가 있다는 뜻이다.

(2) List는 다양한 형태의 데이터 유형을 담을 수 있다.

  • List의 편리성이기도 하지만, 분석시에는 데이터프레임으로 변환할 때 큰 애로사항이 되기도 한다.
  • 우선, 코드로 확인해보자.
multi_values = [11.1, 'foo', 3, 5, 'bar', True, False, 3.1245]
print(multi_values)
[11.1, 'foo', 3, 5, 'bar', True, False, 3.1245]
  • 또한, List는 다양한 함수, class, 심지어는 모듈도 담을 수 있다.
float
float
len
<function len>
def temp():
  pass
temp
<function __main__.temp>
import math
math
<module 'math' (built-in)>
multi_objects = [float, len, temp, math]
multi_objects
[float, <function len>, <function __main__.temp>, <module 'math' (built-in)>]

(3) List안에 있는 값은 인덱스로 접근한다.

  • 다음 그림이 인덱스로 접근하는 기본적인 방법이다.
    • 참고로 또다른 분석 언어인 R0이 아닌 1부터 시작한다.
  • 소스코드로 빠르게 확인해보자.
temp = ["A", "B", "C", "D", "E"]
temp[0]
'A'
temp[1]
'B'
temp[4]
'E'
  • 그런데, Negative List 형태로도 접근할 수 있다.
    • -1, -2와 같은 형태로 접근하는 것이다.
  • 코드를 통해 확인해보자.
temp[-1]
'E'
temp[-4]
'B'
temp[-5]
'A'
  • 슬라이싱을 활용한 인덱스 접근법도 있다.
    • temp[m:n] 형태로 From M to N으로 접근한다.
  • 코드를 통해서 확인해보자.
temp[0:5]
['A', 'B', 'C', 'D', 'E']
temp[2:4]
['C', 'D']
temp[-5:-1]
['A', 'B', 'C', 'D']
temp[-5:]
['A', 'B', 'C', 'D', 'E']
  • 이 외에도, 슬라이싱 기법을 활용한 다양한 접근법이 있다. 스택오버플로우의 문서를 확인해보면 보다 더 많은 정보를 얻을 수 있다.

(4) List안에 또다른 List를 담을 수 있다.

  • List안에 다양한 객체가 들어가 있음을 확인했다.
  • 그런데, List안에 또 다른 List가 들어갈 수도 있다.

Google Colab with Kaggle - Beginner

I. 개요

  • 데이터 시각화와 변환에 대해 짧게 익혔다면 바로 실전 데이터를 활용한다.
  • 이론이 조금 부족하게 느껴질 수 있지만, 모든 것을 다 알려드릴 수는 없다.
    • 결국 공부는 스스로 해야 한다.
  • 이 강의의 목적이 Kaggle 데이터를 활용한 Python 포트폴리오 제작 강의임을 잊지 말자.

II. Kaggle KPI 설치

  • Google Colab에서 Kaggle API를 불러오려면 다음 소스코드를 실행한다.
!pip install kaggle
Requirement already satisfied: kaggle in /usr/local/lib/python3.6/dist-packages (1.5.6)
Requirement already satisfied: requests in /usr/local/lib/python3.6/dist-packages (from kaggle) (2.23.0)
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: tqdm in /usr/local/lib/python3.6/dist-packages (from kaggle) (4.41.1)
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.4.5.1)
Requirement already satisfied: python-slugify in /usr/local/lib/python3.6/dist-packages (from kaggle) (4.0.0)
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: idna<3,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests->kaggle) (2.9)
Requirement already satisfied: text-unidecode>=1.3 in /usr/local/lib/python3.6/dist-packages (from python-slugify->kaggle) (1.3)

III. 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.

EDA with Housing Price Prediction - Handling Outliers

강의 홍보

I. 개요

  • 이제 본격적으로 Kaggle 데이터를 활용하여 분석을 진행한다.
  • 데이터는 이미 다운 받은 상태를 전제로 하며, 만약에 데이터가 없다면 이전 포스팅에서 절차를 확인하기 바란다. (미리보기 가능)

II. 구글 드라이브 연동

  • 구글 코랩을 시작하면 언제든지 가장 먼저 해야 하는 것은 드라이브 연동이다.
from google.colab import drive # 패키지 불러오기 
from os.path import join  

ROOT = "/content/drive"     # 드라이브 기본 경로
print(ROOT)                 # print content of ROOT (Optional)
drive.mount(ROOT)           # 드라이브 기본 경로 Mount

MY_GOOGLE_DRIVE_PATH = 'My Drive/Colab Notebooks/inflearn_kaggle/' # 프로젝트 경로
PROJECT_PATH = join(ROOT, MY_GOOGLE_DRIVE_PATH) # 프로젝트 경로
print(PROJECT_PATH)
/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&response_type=code&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

Enter your authorization code:
··········
Mounted at /content/drive
/content/drive/My Drive/Colab Notebooks/inflearn_kaggle/
%cd "{PROJECT_PATH}"
/content/drive/My Drive/Colab Notebooks/inflearn_kaggle
  • 위 코드가 에러 없이 돌아간다면 이제 데이터를 불러올 차례다.
!ls
data  docs  source
  • 필자는 inflearn_kaggle 폴더안에 data, docs, source 등의 하위 폴더를 추가로 만들었다.
  • 즉, data 안에 다운로드 받은 파일이 있을 것이다.

III. 캐글 데이터 수집 및 EDA

  • 우선 데이터를 수집하기에 앞서서 EDA에 관한 필수 패키지를 설치하자.
import pandas as pd
import pandas_profiling
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib.pyplot import figure
import seaborn as sns

from IPython.core.display import display, HTML
from pandas_profiling import ProfileReport
/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
%matplotlib inline
import matplotlib.pylab as plt

plt.rcParams["figure.figsize"] = (14,4)
plt.rcParams['lines.linewidth'] = 2
plt.rcParams['lines.color'] = 'r'
plt.rcParams['axes.grid'] = True 

(1) 데이터 수집

  • 지난 시간에 받은 데이터가 총 4개임을 확인했다.
    • data_description.txt
    • sample_submission.csv
    • test.csv
    • train.csv
  • 여기에서는 우선 test.csv & train.csv 파일을 받도록 한다.
train = pd.read_csv('data/train.csv')
test = pd.read_csv('data/test.csv')
print("data import is done")
data import is done

(2) 데이터 확인

  • Kaggle 데이터를 불러오면 우선 확인해야 하는 것은 데이터셋의 크기다.
    • 변수의 갯수
    • Numeric 변수 & Categorical 변수의 개수 등을 파악해야 한다.
  • Point 1 - train데이터에서 굳이 훈련데이터와 테스트 데이터를 구분할 필요는 없다.
    • 보통 Kaggle에서는 테스트 데이터를 주기적으로 업데이트 해준다.
  • Point 2 - 보통 test 데이터의 변수의 개수가 하나 더 작다.
train.shape, test.shape
((1460, 81), (1459, 80))
  • 그 후 train데이터의 상위 5개의 데이터만 확인한다.
display(train.head())
IdMSSubClassMSZoningLotFrontageLotAreaStreetAlleyLotShapeLandContourUtilitiesLotConfigLandSlopeNeighborhoodCondition1Condition2BldgTypeHouseStyleOverallQualOverallCondYearBuiltYearRemodAddRoofStyleRoofMatlExterior1stExterior2ndMasVnrTypeMasVnrAreaExterQualExterCondFoundationBsmtQualBsmtCondBsmtExposureBsmtFinType1BsmtFinSF1BsmtFinType2BsmtFinSF2BsmtUnfSFTotalBsmtSFHeating...CentralAirElectrical1stFlrSF2ndFlrSFLowQualFinSFGrLivAreaBsmtFullBathBsmtHalfBathFullBathHalfBathBedroomAbvGrKitchenAbvGrKitchenQualTotRmsAbvGrdFunctionalFireplacesFireplaceQuGarageTypeGarageYrBltGarageFinishGarageCarsGarageAreaGarageQualGarageCondPavedDriveWoodDeckSFOpenPorchSFEnclosedPorch3SsnPorchScreenPorchPoolAreaPoolQCFenceMiscFeatureMiscValMoSoldYrSoldSaleTypeSaleConditionSalePrice
0160RL65.08450PaveNaNRegLvlAllPubInsideGtlCollgCrNormNorm1Fam2Story7520032003GableCompShgVinylSdVinylSdBrkFace196.0GdTAPConcGdTANoGLQ706Unf0150856GasA...YSBrkr85685401710102131Gd8Typ0NaNAttchd2003.0RFn2548TATAY0610000NaNNaNNaN022008WDNormal208500
1220RL80.09600PaveNaNRegLvlAllPubFR2GtlVeenkerFeedrNorm1Fam1Story6819761976GableCompShgMetalSdMetalSdNone0.0TATACBlockGdTAGdALQ978Unf02841262GasA...YSBrkr1262001262012031TA6Typ1TAAttchd1976.0RFn2460TATAY29800000NaNNaNNaN052007WDNormal181500
2360RL68.011250PaveNaNIR1LvlAllPubInsideGtlCollgCrNormNorm1Fam2Story7520012002GableCompShgVinylSdVinylSdBrkFace162.0GdTAPConcGdTAMnGLQ486Unf0434920GasA...YSBrkr92086601786102131Gd6Typ1TAAttchd2001.0RFn2608TATAY0420000NaNNaNNaN092008WDNormal223500
3470RL60.09550PaveNaNIR1LvlAllPubCornerGtlCrawforNormNorm1Fam2Story7519151970GableCompShgWd SdngWd ShngNone0.0TATABrkTilTAGdNoALQ216Unf0540756GasA...YSBrkr96175601717101031Gd7Typ1GdDetchd1998.0Unf3642TATAY035272000NaNNaNNaN022006WDAbnorml140000
4560RL84.014260PaveNaNIR1LvlAllPubFR2GtlNoRidgeNormNorm1Fam2Story8520002000GableCompShgVinylSdVinylSdBrkFace350.0GdTAPConcGdTAAvGLQ655Unf04901145GasA...YSBrkr1145105302198102141Gd9Typ1TAAttchd2000.0RFn3836TATAY192840000NaNNaNNaN0122008WDNormal250000
......................................................................................................................................................................................................................................................
1455145660RL62.07917PaveNaNRegLvlAllPubInsideGtlGilbertNormNorm1Fam2Story6519992000GableCompShgVinylSdVinylSdNone0.0TATAPConcGdTANoUnf0Unf0953953GasA...YSBrkr95369401647002131TA7Typ1TAAttchd1999.0RFn2460TATAY0400000NaNNaNNaN082007WDNormal175000
1456145720RL85.013175PaveNaNRegLvlAllPubInsideGtlNWAmesNormNorm1Fam1Story6619781988GableCompShgPlywoodPlywoodStone119.0TATACBlockGdTANoALQ790Rec1635891542GasA...YSBrkr2073002073102031TA7Min12TAAttchd1978.0Unf2500TATAY34900000NaNMnPrvNaN022010WDNormal210000
1457145870RL66.09042PaveNaNRegLvlAllPubInsideGtlCrawforNormNorm1Fam2Story7919412006GableCompShgCemntBdCmentBdNone0.0ExGdStoneTAGdNoGLQ275Unf08771152GasA...YSBrkr1188115202340002041Gd9Typ2GdAttchd1941.0RFn1252TATAY0600000NaNGdPrvShed250052010WDNormal266500
1458145920RL68.09717PaveNaNRegLvlAllPubInsideGtlNAmesNormNorm1Fam1Story5619501996HipCompShgMetalSdMetalSdNone0.0TATACBlockTATAMnGLQ49Rec102901078GasA...YFuseA1078001078101021Gd5Typ0NaNAttchd1950.0Unf1240TATAY3660112000NaNNaNNaN042010WDNormal142125
1459146020RL75.09937PaveNaNRegLvlAllPubInsideGtlEdwardsNormNorm1Fam1Story5619651965GableCompShgHdBoardHdBoardNone0.0GdTACBlockTATANoBLQ830LwQ2901361256GasA...YSBrkr1256001256101131TA6Typ0NaNAttchd1965.0Fin1276TATAY736680000NaNNaNNaN062008WDNormal147500

1460 rows × 81 columns