이 페이지는 컵활 1급의 Excel 예제를 그대로 R과 Python에서 해보는 것을 목적으로 하고 있습니다. 오류와 수정사항 그리고 교육문의는 metrics@kakao.com 으로 메일주시면 감사하겠습니다
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
- 필터링 Filtering: 조건을 기반으로 데이터를 필터링 하기
- 직위가 과장이거나, 직위가 사원이고 점수가 80 이상인 자료의 이름, 부서명, 직위, 점수, 평가열만 순서대로 표시하시요
- 엑셀에서는 [데이터] -> [고급필터] 를 통해서 해결 가능!
- 조건부서식
- 업무수행이 80 미만이고, 영어듣기가 70 미만인 행 전체에 대해서 글꼴 스타일은 굵은글씨, 글꼴 색을 빨강으로 적용하는 조건부 서식을 작성하시오.
- 엑셀에서는 [홈] -> 조건부 서식 -> [새 규칙] -> [수식을 사용하여 서식을 지정할 셀 결정]
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 상