R/Python (1) - 기본작업

2020/12/10

이 페이지는 컵활 1급의 Excel 예제를 그대로 R과 Python에서 해보는 것을 목적으로 하고 있습니다. 오류와 수정사항 그리고 교육문의는 으로 메일주시면 감사하겠습니다

R code 블럭과 Python code 블럭은 다음과 같이 색깔로 구분하겠습니다. 결과창은 동일하게 Ivory 색 블럭으로 표시됩니다.

필요한 패키지 준비

library(readxl) # read excel
library(dplyr)
library(DT)
library(formattable)

library(reticulate) # Python
#py_install(packages = "matplotlib")
#py_install(packages = "pandas")
# "이것은 R 코드 입니다."
# "이것은 Python 코드 입니다."

유형1

R

모든 예제 데이터 준비

wd_mac = "~/Dropbox/컴활1급실기/1-2016버전 엑셀/1-출제유형분석1회"
wd = "C:/Users/ericr/Dropbox/컴활1급실기/1-2016버전 엑셀/1-출제유형분석1회"
fn = list.files(path = wd,
                pattern = '*실습파일.xlsm')
fn_mac = list.files(path = getwd())[1]

path = paste(wd,fn,sep = '/')
path_mac = paste(wd_mac, fn_mac, sep='/')
print(path)
## [1] "C:/Users/ericr/Dropbox/컴활1급실기/1-2016버전 엑셀/1-출제유형분석1회/"
print(path_mac)
## [1] "~/Dropbox/컴활1급실기/1-2016버전 엑셀/1-출제유형분석1회/1급A형실습파일.xlsm"
  • 모든 sheets을 list 안에다 집어넣기
#tab_names_mac = excel_sheets(path_mac)
tab_names = excel_sheets(path_mac)
print(tab_names)
## [1] "기본작업-1" "계산작업"   "분석작업-1" "분석작업-2" "기타작업-1"
## [6] "기타작업-2" "기타작업-3"
#list_all_mac = lapply(tab_names_mac, 
#                  function(x) read_excel(path = path_mac,
#                                         sheet = x,))
list_all = lapply(tab_names, 
                  function(x) read_excel(path = path_mac,
                                         sheet = x,))
summary(list_all)
##      Length Class  Mode
## [1,] 12     tbl_df list
## [2,]  9     tbl_df list
## [3,] 13     tbl_df list
## [4,]  6     tbl_df list
## [5,]  5     tbl_df list
## [6,] 12     tbl_df list
## [7,]  6     tbl_df list

예제1 데이터 준비

df1 = list_all[[1]]
head(df1)
## # A tibble: 6 x 12
##   사원번호 이름  부서명 직위  입사일자            업무수행 영어독해 영어듣기
##      <dbl> <chr> <chr>  <chr> <dttm>                 <dbl>    <dbl>    <dbl>
## 1   200104 강감찬… 기획부 대리  1998-01-04 00:00:00       10        0        0
## 2   200126 김규리… 영업부 부장  2000-01-02 00:00:00       90       80       90
## 3   200123 김나비… 총무부 대리  1999-08-12 00:00:00      100       56       64
## 4   200134 김대진… 기획부 과장  2000-01-07 00:00:00       70       52       76
## 5   200114 김윤선… 기획부 대리  1999-08-01 00:00:00      100       60       48
## 6   200137 김정식… 기획부 사원  2002-01-02 00:00:00      100       76       80
## # … with 4 more variables: 전산이론 <dbl>, 전산실기 <dbl>, 점수 <dbl>,
## #   평가 <chr>

필터링 문제풀기

  • 직위가 과장이거나, 직위가 사원이고 점수가 80 이상인 자료의 이름, 부서명, 직위, 점수, 평가열만 순서대로 표시하시요
df1 %>% 
  # 직위가 과장이거나, 직위가 사원이고 점수가 80이상인
  filter( (직위 =="과장") | (직위 == "사원" & 점수 >= 80)) %>% 
  # 이름, 부서명, 직위, 점수 평가열 (Column) 선택
  select(이름, 부서명, 직위, 점수, 평가)
## # A tibble: 12 x 5
##    이름   부서명 직위   점수 평가 
##    <chr>  <chr>  <chr> <dbl> <chr>
##  1 김대진 기획부 과장   77.6 중   
##  2 김정식 기획부 사원   91.2 상   
##  3 마소희 기술부 사원   87.6 상   
##  4 방정환 기획부 과장   80   중   
##  5 배기성 기획부 사원   92   상   
##  6 배우리 영업부 사원   85.2 상   
##  7 아유라 영업부 과장   95   상   
##  8 유강현 영업부 사원   90.4 상   
##  9 이순신 기술부 사원   86   상   
## 10 조용히 영업부 사원   88.4 상   
## 11 최민정 기술부 과장   41.6 하   
## 12 홍난수 총무부 과장   89.6 상

조건부 서식

업무수행이 80 미만이고, 영어듣기가 70 미만인 행 전체에 대해서 글꼴 스타일은 굵은글씨, 글꼴 색을 빨강으로 적용하는 조건부 서식을 작성하시오.

f1 = formatter("span",
               style = ~ ifelse(업무수행 < 80 &
                                영어듣기 < 70, 
                                style("color:red",
                                      font.weight = "bold"),
                                NA
                                )
               )
formattable(df1,
            list(area(row = 1:nrow(df1)) ~ f1)
)
사원번호 이름 부서명 직위 입사일자 업무수행 영어독해 영어듣기 전산이론 전산실기 점수 평가
200104 강감찬 기획부 대리 1998-01-04 10 0 0 90 70 34.0
200126 김규리 영업부 부장 2000-01-02 90 80 90 80 85 85.0
200123 김나비 총무부 대리 1999-08-12 100 56 64 80 100 80.0
200134 김대진 기획부 과장 2000-01-07 70 52 76 90 100 77.6
200114 김윤선 기획부 대리 1999-08-01 100 60 48 90 100 79.6
200137 김정식 기획부 사원 2002-01-02 100 76 80 100 100 91.2
200131 마소희 기술부 사원 2000-01-07 90 76 72 100 100 87.6
200133 방정환 기획부 과장 2000-01-07 64 90 76 90 80 80.0
200129 배기성 기획부 사원 2000-01-07 100 88 72 100 100 92.0
200127 배우리 영업부 사원 2000-01-02 100 64 72 90 100 85.2
200112 소식가 영업부 대리 1999-08-01 90 100 100 95 90 95.0
200120 아유라 영업부 과장 1996-08-07 100 90 100 90 95 95.0
200128 엄화정 총무부 부장 2000-01-02 100 68 72 90 100 86.0
200119 왕연 총무부 대리 1999-08-07 100 44 60 90 90 76.8
200116 우희진 영업부 대리 1999-08-01 56 80 56 80 90 72.4
200135 유강현 영업부 사원 2002-01-02 100 72 80 100 100 90.4
200110 이기자 기획부 대리 1998-01-09 90 48 44 80 100 72.4
200130 이순신 기술부 사원 2000-01-07 90 68 72 100 100 86.0
200132 조용히 영업부 사원 2000-01-07 100 76 76 90 100 88.4
200124 최민영 영업부 사원 2000-01-02 70 52 64 70 90 69.2
200106 최민정 기술부 과장 1998-01-05 50 40 28 0 90 41.6
200136 홍난수 총무부 과장 2002-01-02 100 68 80 100 100 89.6

Python

Calling R from Python

We can access to R objects within Python cuhcks via the r object.

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

df = r.df1
df.head()
##        사원번호   이름  부서명  직위       입사일자   업무수행  영어독해  영어듣기  전산이론   전산실기    점수 평가
## 0  200104.0  강감찬  기획부  대리 1998-01-04   10.0   0.0   0.0  90.0   70.0  34.0  하
## 1  200126.0  김규리  영업부  부장 2000-01-02   90.0  80.0  90.0  80.0   85.0  85.0  상
## 2  200123.0  김나비  총무부  대리 1999-08-12  100.0  56.0  64.0  80.0  100.0  80.0  중
## 3  200134.0  김대진  기획부  과장 2000-01-07   70.0  52.0  76.0  90.0  100.0  77.6  중
## 4  200114.0  김윤선  기획부  대리 1999-08-01  100.0  60.0  48.0  90.0  100.0  79.6  중

필터링 문제풀기

위의 똑같은 내용을 Python에서 푸는 경우 다음과 같은 코드를 이용할 수 있다. - 직위가 과장이거나, 직위가 사원이고 점수가 80 이상인 자료의 이름, 부서명, 직위, 점수, 평가열만 순서대로 표시하시요

df.loc[(df['직위']=='과장') | (df['직위']=='사원') & (df['점수']>=80)][['이름','부서명','직위','점수','평가']]
##      이름  부서명  직위    점수 평가
## 3   김대진  기획부  과장  77.6  중
## 5   김정식  기획부  사원  91.2  상
## 6   마소희  기술부  사원  87.6  상
## 7   방정환  기획부  과장  80.0  중
## 8   배기성  기획부  사원  92.0  상
## 9   배우리  영업부  사원  85.2  상
## 11  아유라  영업부  과장  95.0  상
## 15  유강현  영업부  사원  90.4  상
## 17  이순신  기술부  사원  86.0  상
## 18  조용히  영업부  사원  88.4  상
## 20  최민정  기술부  과장  41.6  하
## 21  홍난수  총무부  과장  89.6  상