음악 실시간 차트 100위 크롤링 하기

# 벅스뮤직 (https://music.bugs.co.kr)
# 주소 : https://music.bugs.co.kr/chart

 

import requests

from bs4 import BeautifulSoup

 

request = requests.get("https://music.bugs.co.kr/chart")

html = request.text

soup = BeautifulSoup(html, "html.parser"

title = soup.findAll("p", {"class":"title"})

artist = soup.findAll("p", {"class":"artist"})

 

for i in range(len(title)):

  titles = title[i].text.strip()
  artists = artist[i].text.strip().split('\n')[0]
  data = "{0:3d} {1} - {2}".format(i+1, artists, titles)
  print(data)

'프로그래밍 공부 > Python' 카테고리의 다른 글

Python 크롤링 공부 1-1  (0) 2020.06.12

크롤링을 하기전에 크롤링에 필요한 모듈을 두가지 설치해 줘야한다

terminal 창에 아래와 같이 입력해서 모듈을 다운 받도록 한다

pip install requests
pip install beautifulsoup4

# requests 는 html 문서를 파싱할 웹 사이트에 접속할 때 사용하는 모듈

# beautifulsoup4 는 html 문서에서 데이터를 가져올 때 사용하는 모듈

 

import requests
from bs4 import BeautifulSoup

# import를 해줌으로써 다운 받은 모듈을 사용한다


# https://basicenglishspeaking.com/daily-english-conversation-topics/
# 위의 사이트에서 단어 75개를 가져올것이다


def getSubject():
  subjects = [] # 일단 크롤링 데이터를 넣어줄 빈 List를 만들어준다
  request = requests.get("https://basicenglishspeaking.com/daily-english-conversation-topics/") # 웹 사이트 가져오기
  html = request.text # 가져온 자료들중 텍스트만 따로 html에 저장해준다
  soup = BeautifulSoup(html, "html.parser") # BeautifulSoup(파싱할 HTML소스, 파싱에 사용될 파서)
  divs = soup.findAll("div", {"class":"thrv-columns"}) # 가장 큰 범위의 파싱 소스를 divs에 저장해준다
  for div in divs: # 그중에서 a 태그를 가지고 있는 링크만 가지고 와서 links에 저장
    links = div.findAll("a")
    for link in links: # 가져온 텍스트들을 사전에 만들어준 빈 list subjects에 넣어준다
      subjects.append(link.text)
  return subjects

if __name__ == "__main__": # 파이썬의 프로그램 시작점을 만듭니다.
  subjects = getSubject()
  print(" {} 개의 대화를 찾았습니다.".format(len(subjects)))
  for i in range(len(subjects)):
    print("{0:2d}. {1:s}".format(i+1, subjects[i]))

'프로그래밍 공부 > Python' 카테고리의 다른 글

Python 크롤링 공부 1-2  (0) 2020.06.12

데이터 전처리

데이터 전처리는 데이터 분석 작업에 적합하게 데이터를 가공하는 일입니다

 

# dplyr 패키지의 주요함수

library(dplyr)

 

library(readxl)

excel_exam <- read_excel('excel_exam.xlsx', sheet= 'sheet2')

df_excel_exam <- as.data.frame(excel_exam)

df_excel_exam_copy <- df_excel_exam

 

# filter() : 행 단위 데이터를 추출합니다.

# %>%는 dplyr 패키지에서 사용하는 파이프연산자로 함수실행 결과를 다른 함수의 입력 데이터로 넘겨줄 수 있습니다.

df_excel_exam_copy %>% filter(df_excel_exam_copy$class2 == 1)

* 데이터 프레임이 %>% 연산자를 통해 함수로 넘어오기 때문에

특정 변수를 선택할 때 데이터 프레임 이름을 적지 않아도 됩니다.

df_excel_examcopy %>% filter(class2 == 1)

df_excel_examcopy %>% filter(class2 == 1 | class2 == 2 | class2 == 5)

매칭 연산자 in과 c() 함수를 이용하면 or 연산과 같은 효과를 낼 수 있습니다.

df_excel_examcopy %>% filter(class2 %in% c(1,2,5))

 

* mpg 데이터를 활용하기 위해 ggplot2 를 설치합니다.

install.packages('ggplot2')

library(ggplot2)

mpg

 

문제 1. 제조사(manufacturer)가 audi인 도시주행연비(cty)의 평균을 출력

mpg_audi <- mpg %>% filter(manufacturer == 'audi')

mean(mpg_audi$cty) # 17.61111

 

문제 2. 제조사(manufacturer)가 toyota인 도시주행연비(cty)의 형균을 출력

mpg_toyota <- mpg %>% filter(manufacturer == 'toyota')

mean(mpg_toyota$cty) # 18.52941

 

문제 3. 제조사가 chevrolet, ford, honda인 자동차의 고속도로 주행연비(hwy) 전체 평균을 출력

mpg_manufacturer <- mpg %>% filter(manufacturer %in% c('chevrolet', 'ford', 'honda'))

mean(mpg_manufacturer$hwy)

 

# table() : 데이터의 항목 (빈도수)

table(mpg_manufacturer$manufacturer)

 

# select() : 열 단위 데이터를 추출합니다.

df_excel_exam_copy %>% select(math2,english2,science2)

# select() 함수의 인수로 지정하는 변수 이름에 '-'를 붙여주면

'-'를 붙여준변수를 제외하고 나머지 데이터만 검색합니다.

 

df_excel_exam_copy %>% select(-math2,-science2)

# class2가 1인 데이터중 math2 과목만 출력합니다,

df_excel_exam_copy %>% filter(class2 == 1) %>% select(class2, math2)

df_excel_exam_copy %>% select(class2, math2) %>% filter(class2 == 1) * 순서는 상관 없다

 

# class2가 1, 3, 5인 데이터의 science2 열만 출력합니다.

df_excel_exam_copy %>% select(class2, science2) %>% filter(class2 %in% c(1,3,5))

 

# head() : 데이터 앞 부분의 데이터 개수를 정해서 볼 수 있습니다.

개수를 생략하면 기본값으로 6개의 데이터를 보여줍니다.

 

# tail() : 데이터 뒷 부분의 데이터 개수를 정해서 볼 수 있습니다

개수를 생략하면 기본값으로 6개의 데이터를 보여줍니다.

 

df_class135_science <- df_excel_exam_copy %>% select(class2, science2) %>% filter(class2 %in% c(1,3,5))

head(df_class135_science)

tail(df_class135_science)

head(df_class135_science, 3)

tail(df_class135_science, 3)

 

# arrange() : 데이터를 정렬합니다.

df_excel_exam_copy %>% arrange(math2) # 오름차순 정렬 

df_excel_exam_copy %>% arrange(desc(math2)) # 내림차순 정렬

 

# math2 점수로 내림차순 후 math2 점수가 같을 경우 science2 점수로 내림차순 정렬 후 5등까지 출력

df_excel_exam_copy %>% arrange(desc(math2), desc(science2)) %>% head(5)

 

# mpg 데이터에서 audi에서 생산한 자동차 중 hwy가 1~5위에 해당하는 차종을 출력

mpg %>% filter(manufacturer == 'audi') %>% arrange(desc(hwy)) %>% head(5)

 

# mutate() : 파생 변수를 여러개 추가할 수 있습니다.

df_excel_exam_copy %>% mutate(total = rowSums(subset(df_excel_exam_copy, select = math2 : science2)),

mean = rowmeans(subset(df_excel_exam_copy, select = math2 : science2)))

 

# 문제 mpg 데이터에서 cty와 hwy를 더한 합산 연비 변수를 만들고, 

합산 연비 변수의 평균 연비 변수를 만든뒤, 

평균 연비 변수의 값이 가장 큰 자동차 3개를 추출합니다. (제조사, 모델, 평균)

 

mpg %>% mutate( total = cty + hwy, mean = total / 2) %>% select(manufacturer, model, mean) %>% arrange(desc(mean)) %>% head(3)

 

# summarise() : 그룹별로 통계치를 산출할 수 있습니다.
# group_by() : 데이터의 그룹을 맺을 수 있습니다.

 

df_excel_exam_copy %>% mutate(mean_math = mean(math2))

df_excel_exam_copt %>% summarise(mean_math = mean(math2))

# 위 두식의 실행 결과를 보면 mutate() 함수는 mean_math라는 파생 변수를 만들고 모든 math2 데이터의 평균을 계산해 mean_math에 넣어주지만, summarise() 함수는 모든 math2 데이터의 평균만 계산해서 따로 출력합니다.

 

# group_by() 함수를 사용하여 먼저 그룹을 맺어주고 summarise()함수를 사용해 요약합니다.

df_excel_exam_copy %>% group_by(class2) %>% summarise(mean_math = mean(math))

 

df_excel_exam_copy %>% group_by(class2) %>% summarise(

 합계 = sum(math2),

 평균 = mean(math2),

 개수 = n(),

 최대값 = max(math2),

 최소값 = min(math2),

 표준편차 = sd(math2)

)

# 문제. 자동차회사별로 차종(class)이 suv인 자동차의 cty와 hwy의 평균을 계산해서 

내림차순으로 정렬하고 상위 5개를 출력합니다.

mpg %>% group_by(manufacturer) %>% filter(class == 'suv') %>% mutate( mean = (cty + hwy)/2)

%>% summarise(mean_avg = mean(mean)) %>% arrange(desc(mean_avg)) %>% head(5)

 

# 문제. 차종별(class)로 도시연비(cty)평균을 계산해서 평균이 높은 순서대로 출력합니다.

mpg %>% group_by(class) %>% summarise(cty_mean = mean(cty)) %>% arrange(desc(mean_cty))

 

# 문제. 고속도로 연비의 평균이 가장 높은 회사 3곳을 출력합니다.

mpg %>% group_by(manufacturer) %>% summarise(hwy_mean = mean(hwy)) %>% arrange(desc(hwy_mean)) %>% head(3)

 

# 문제. 각 회사별 경차(compact)의 차종 수를 내림차순으로 정렬해 출력합니다.

mpg %>% group_by(manufacturer) %>% filter(class == 'compact') %>% summarise(count = n()) %>% arrange( desc(count))

 

# left_join() : 가로로 데이터를 합칠 수 있습니다.

# left_join(데이터 프레임1, 데이터 프레임2, 데이터 프레임3 .. by ='기준변수명')

# by 옵션에는 합칠 때 기준이 되는 변수의 이름을 입력해야 하며 합쳐질 두 개의 데이터프레임에 반드시 같은 이름의 변수가 있어야 합니다

# by 옵셥을 지정하지 않으면 R이 알아서 같은 이름의 변수를 기준으로 합치기를 실행합니다.

test1 <- data.frame(id=c(1,2,3,4,5), middle = c(60,70,81,90,95))

test2 <- data.frame(id=c(1,2,3,4,5), midlle = c(70,83,63,95,80))

left_join(test1, test2, by = 'id')

 

df_excel_join <- df_excel_exam

df_teacher_name <- data.frame(class2=c(1,2,3,4,5), teacher = c('A','B','C','D','E'))

 

# left_join() 함수로 합치기를 실행할 때 두개의 데이터프레임에 행(데이터)의 개수가 반드시 같아야 할 필요는 없습니다.

left_join(df_excel_join, df_teacher_name, by='class2')

group1 <- data.frame(id=c(1,2,3,4,5),test = c(60,70,80,90,50))

group2 <- data.frame(id=c(6,7,8,9,10), test=c(70,90,30,50,55))

bind_rows(group1,group2)

 

# 데이터 정제

데이터 정제란 빠진 데이터 또는 잘못된 데이터를 제거하는 작업입니다

빠진 데이터, 측정이 안된 데이터, 없는 데이터 -> 결측치(NA)

# 문자열 결측치는 <NA>로 표시되고, 문자열을 제외한 나머지 자료형의 결측치는 NA로 표시됩니다.

df_na <- data.frame(gender=c('M','F',NA,'F','M'), score = c(5,4,3,2,NA))

 

# is.na() : 데이터에 결측치가 포함되어 있는지 여부를 확인할 수 있습니다.

# 결측치는 TRUE, 결측치가 아니며 FALSE로 표시됩니다.

is.na(df_na)

 

# is.na(), table() 이용해 결측치의 빈도수를 파악할 수 있습니다.

table(is.na(df_na))

table(is.na(df_na$gender))

table(is.na(df_na$score))

 

# 결측치가 포함된 데이터를 함수에 적용시키면 정상적으로 연산되지 않고 NA가 출력됩니다. 

따라서 정상적인 연산을 하려면 결측치를 제외해야 합니다.

sum(df_na$score)

mean(df_na$score)

# 결측치 처리방법
1. dplyr 패키지의 filter()를 사용해서 결측치를 제외한 데이터만 추출합니다.
gender에서 NA가 포함되고 score가 NA가 아닌 데이터만 추출합니다.

df_no_na <- df_na %>% filter(!is.na(score))

gender에서 NA가 아니고 score도 NA가 아닌 데이터만 추출합니다.

df_no_na <- df_na %>% filter(!is.na(gender) & !is.na(score))

 

sum(df_no_na$score)

mean(df_no_na$score)

 

2. na.omit() 함수를 사용해서 결측치가 있는 모든 행을 한꺼번에 제거할 수 있습니다.

df_no_na <- na.omit(df_na)

 

3. 함수를 실행할 때 na.rm=T 속성을 지정하면 결측치를 제외하고 함수를 실행합니다.

sum(df_na$score, na.rm = T)

mean(df_na$score, na.rm = T)

max(df_na$score, na.rm = T)

min(df_na$score, na.rm = T)

 

df_excel_exam_na <- df_excel_exam

df_excel_exam_na[c(3,8,15),'math2'] <- NA
df_excel_exam_na[20, 'science2'] <- NA

 

df_excel_exam_na %>% group_by(class2) %>% 
  summarise(
    math_sum = sum(math2, na.rm=T),

    math_n = n() * 개수에는 NA포함되어 출력 됩니다

)

 

# 4. 결측치의 개수도 세지 않으려면 filter() 함수를 사용하여 미리 결측치를 걸러내고 계산합니다.

df_excel_exam_na %>% group_by(class2) %>% filter(!is.na(math2)) %>%

 summarise(

  math_sum = sum(math2, na.rm = T),

  math_mean = mean(math2, na.rm = T),

  math_n = n() # 개수에 NA가 포함되지 않습니다.

엑셀파일을 읽고 쓰려면 xlsx 설치해야 합니다.
xlsx 패키지는 자바JDK를 설치해야 사용이 가능합니다.

자바 jdk 다운로드 링크:

https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html

설치를 한후에 install 함수를 이용해서 rJava랑 xlsx를 다운 받아 줍니다.

install.packages("rJava")
install.packages('xlsx')

 

library(rJava)
library(xlsx)

 

Sys.setenv(JAVA_HOME = 'C:\\Program Files\\Java\\jdk1.8.0_251')

library(readxl)

excel_exam <- read_excel('excel_exam.xlsx',sheet='Sheet2')

excel_exam <- as.data.frame(excel_exam)

write.xlsx(excel_exam, "df_excel_exam.xlsx")

 

문제 1-1 아래와 같이 구성되는 2행 2열 매트릭스 alpha를 생성합니다.

      [,1] [,2] [,3]
[1,] "a"  "c"  "e"
[2,] "b"  "d"  "f"

alpha <- matrix(letters[1:6], norow = 2)

 

문제 1-2. 'x', 'y', 'z'라는 행을 추가합니다.

alpha <- rbind(alpha, c("x","y","z"))

 

문제 1-3 's', 'p' 라는 열을 추가합니다.

alpha <- cbind(alpha, c('s','p')

 

문제2. 아래와 같이 값이 구성되는 데이터프레임을 정의하여 df1에 저장합니다.
   x   y
1  1   2
2  2   4
3  3   6
4  4   8
5  5  10

df1 <- data.frame(x=1:5, y= seq(2,10,2))

 


문제3. 아래와 같이 값이 구성되는 데이터프레임을 정의하여 df2에 저장합니다.

   col1  col2 col3
1  1       a    6 
2  2       b    7
3  3       c    8
4  4       d    9
5  5       e   10

df2 <- data.frame(col1=1:5, col2= letters[1:5], col3 = 6:10)

 

문제4-1. data.frame()과 c()를 조합해서 표의 내용을 데이터 프레임으로 만들어 출력합니다.

제품        가격        판매량
사과        1800        24
딸기        1500        38
수박        3000        13

fruit_df <- data.frame( 제품 = c("사과","딸기","수박"), 가격 = c(1800,1500,3000), 판매량 = c(24,38,13))

 

문제4-2. 앞에서 만든 데이터 프레임을 이용하여 과일 가격 평균, 판매량 평균을 구합니다.

mean(fruit_df[,2])

mean(fruit_df[,3])

 

문제5-1. 다음 세 벡터를 이용하여 데이터프레임을 생성하고, gender 변수의 값을 반대 성별로 변경합니다. 그리고 name 변수는 문자, gender 변수는 팩터, math 변수는 숫자 데이터의 유형이라는 것을 확인합니다.

#   name <- c("류정원", "김사과", "오렌지", "반하나", "이멜론")
#   gender <- factor(c("M", "F", "M", "F", "M"))
#   math <- c(85, 76, 99, 88, 40)

name <- c("류정원", "김사과", "오렌지", "반하나", "이멜론") 

gender <- factor(c("M", "F", "M", "F", "M")) 

math <- c(85, 76, 99, 88, 40)

member_df <- data.frame(name, gender, math, stringsAsFactors = F)

* stringsAsFactors = F : Factor는 연산이 불가능 함으로 연산을 할 수 있도록 팩터를 없애준다

 

#ifelse() 함수 : 조건식이 만족(T)하면 앞에식을 실행, 만족하지 않으면(F) 뒤에 식을 실행합니다

member_df$gender <- factor(ifelse(member_df$gender == 'F',"M","F"))

 

class(member_df$name)
class(member_df$gender)
class(member_df$math)

 

# 위에서 만든 데이터프레임에 대해 아래 작업을 수행합니다.
# 문제 5-2 stat변수를 추가합니다. stat <- c(76,73,95,82,35)

member_df$stat <- c(76,73,95,82,35)

#파생 변수

 

문제 5-3 math변수와 stat 변수의 합을 구하여 score 변수에 저장합니다.

member_df$score <- member_df$math + member_df$stat

 

문제 5-4 논리 연산 인덱싱을 이용하여 score가 150이상이면 A, 

100 이상이면 150미만이면 B, 70이상 100미만이면 C등급을 부여하고 grade 변수에 저장합니다.

member_df$grade <- ifelse(member_df$score >= 150, "A", ifelse(member_df$score >= 100, "B", ifelse(member_df$score >= 70, "C", NA)))

 

array(배열) : 다차원, matrix로 구성되어 있습니다.  matrix가 여러개 있는 구조입니다.

# array() 함수를 이용해 만듭니다. dim속성을 이용하여 행, 열, 면의 순서로 array 구조를 지정합니다.

# array( ... dim = c(2,3,4)) -> 2행 3열 matrix가 4개 있다는 의미입니다.

arr1` <- array(c(1:24), dim = c(2,3,4)

 

* 배열의 요소 접근 : arr1[행, 열, matrix]

arr1[,,1] # array1에서 1번째 matrix의 데이터를 선택합니다.

arr1[1,,1] # array1에서 1번째 matrix의 첫번째 행 데이터를 선택합니다
arr1[,2,2] # array1에서 2번째 matrix의 두번째 열 데이터를 선택합니다
arr1[1,,] # array1에서 모든 matrix의 1번째 행 데이터를 선택합니다
arr1[1,2,] # array1에서 모든 matrix의 1행 2열 데이터를 선택합니다

 

list(리스트) : 다차원, 데이터 프레임으로 구성되어 있습니다.

# list() 함수를 이용해 만듭니다.

vec <- 1
mat <- matrix(c(1:12), ncol=6)

df <- data.frame(x1=c(1,2,3), x2= c ('a','b','c'))

arr <- array(c(1:20), dim=c(2,5,2))

li <- list(list1=vec, list2=mat, list3=arr, list4=df)

 

# 파생 변수 만들기 : 계산에 의해 데이터가 채워진 변수(열)

df_raw <- data.frame(var1 = c(1,2,1),var2 = c(2,3,4))

df_var <- df_raw #원본 데이터를 복사하며 df_var 변수에 저장합니다

 

# 파생 변수 만드는 방법 1 : 데이터프레임$파생변수

df_var$var_sum <- df_var$var1+ df_var$var2
df_var$var_mean <- df_var$var_sum / 2

 

df_excel_exam_copy <- excel_exam
df_excel_exam_copy$var_sum <- df_excel_exam_copy$math2 + df_excel_exam_copy$english2 +df_excel_exam_copy$science2
df_excel_exam_copy$var_mean <- df_excel_exam_copy$var_sum / 3

 

# subset() : 데이터프레임에서 특정 변수의 데이터만 뽑아낼 수 있습니다.
# subset(데이터프레임, select=시작변수명:끝변수명) # 연속적인 열 추출
# subset(데이터프레임, select=c(변수명, 변수명...)) # 비연속적인 열 추출

subset(df_excel_exam_copy, select = math2:science2)
subset(df_excel_exam_copy, select = c(math2,science2)) * df_excel_exam_copy[,c("math2","science2")] 랑 같음

 

# rowSums() : 행의 합계를 계산할 수 있습니다.
# rowMeans() : 행의 평균을 계산할 수 있습니다.

df_excel_exam_copy$var_sum2 <- rowSums(subset(df_excel_exam_copy, select = math2:science2))

 

# 파생 변수 만드는 법 2 : transfrom()

df_excel_exam_copy <- transfrom(df_excel_exam_copy, var_sum3 = rowSums(subset(df_excel_exam_copy, var_sum3 = rowSums(subset(df_excel_exam_copy,  select = math2:science2)))

 

# 파생 변수 만드는 법 3 : mutate() -> dplyr 패키지 안에 들어있음

한번에 여러개의 파생 변수를 추가할 수 있습니다.

%>% 연산자 : dplyr 패키지에 있는 대입문으로 왼쪽의 데이터를 오른쪽의 함수로 전달합니다.

%>% 왼쪽의 데이터프레임의 %>% 오른쪽 함수로 전달되기 때문에 데이터 프레임의 열을 사용해야 할 때 [데이터프레임$변수이름]과 같이 사용하지 않고 데이터 프레임 이름을 생략하여 변수명만 사용하면 됩니다

library(dplyr)

df_excel_exam_copy <- df_excel_exam_copy %>% mutate( var_sum = rowSums(subset(df_excel_exam_copy, select = math2 : science2)), var_mean = rowMeans(subset (df_excel_exam_copy, select = math2 : science2)))

 

ifelse() : 조건을 사용하여 파생 변수를 만들 수 있습니다.

평균 점수(var_mean)가 60점 이상이면 'pass', 그렇지 않으면 'fail'을 가지는 파생변수 result를 추가합니다.

df_excel_exam_copy$result <- ifelse (df_excel_exam_copy$var_mean >= 60, "pass","fail")

 

평균 점수가 90점 이상이면 "A", 80점이상이면 "B", 70점이상이면 "C", 60점이상이면 "D", 나머지는 "F"인 학점을 나타내는 grade 파생 변수를 추가합니다.

df_excel_exam_copy$grade <- ifelse(df_excel_exam_copy$var_mean >= 90, "a", ifelse(df_excel_exam_copy$var_mean >= 80, "B",ifelse(df_excel_exam_copy$var_mean >= 70, "C", ifelse(df_excel_exam_copy$var_mean >= 60, "D", "F"))))

Data Frame(데이터 프레임) : 2차원

데이터 프레임은 분석에서 가장 많이 볼 수 있는 자료형입니다.

행렬과 달리 다양한 자료형을 동시에 사용할 수 있기 때문에 분석에서 많이 사용됩니다.

 

# data.frame() 함수 : 데이터 프레임을 만듭니다.

df.a <- c(1,2,3,4,1,2)

df.b <- c('a','b','c','d','a','b')

df.c <- c(1,'a','b','a',1,'c')

df.d <- data.frame(df.a,df.b,df.c)

 

* 데이터 프레임의 요소 접근

데이터 프레임의 특정 열의 값을 선택하는 방법은 크게 2가지가 있습니다.

1. 데이터 프레임의 이름 [열번호]

데이터 프레임의 형태로 값을 선택합니다

df_field1 <- df.d[1] #1번열
df_field2 <- df.d[1:2] #1~2번열

df_field3 <- df.d[c(1,3)] #1,3번 열

 

2. 데이터 프레임 $ 열이름

숫자는 벡터형태로 값을 저장하고, 문자는 펙터형태로 저장합니다.

df_field4 <- df.d$df.a

df_field5 <- df.d$df.b

df_field6 <- df.d$df.c

 

* 외부 데이터 읽어오는 방법(csv)

read.csv() : csv 파일을 읽어 데이터프레임으로 저장합니다.

-절대경로 : 파일의 위치를 물리적으로 저장

csv_exam <- read.csv('C:/sjwannabe/R/csv_exam.csv')

-상대경로 : 파일의 위치를 작업파일을 기준으로 저장(working directroy)

csv_exam <- read.csv('csv_exam.csv)

 

csv_exam[1,] #1행만 선택합니다.
csv_exam[,1] #1열만 선택합니다

class(csv_exam[,1]) #벡터형식 데이터 

csv_exam[1] # 1열만 선택합니다* 그냥 숫자만 적었을때는 열을 출력 
class(csv_exam[1]) # 데이터프레임 형식 데이터

csv_exam[1:2,] # 1행부터 2행까지 선택합니다.
class(csv_exam[1:2,]) #데이터프레임 형식 데이터
csv_exam[,'math'] # math열을 선택합니다.
class(csv_exam[,'math']) # 벡터 형식 데이터
csv_exam$math # math열을 선택합니다.
class(csv_exam$math) # 벡터 형식 데이터
csv_exam['math'] # math 열을 선택합니다.
class(csv_exam['math']) # 데이터프레임 형식 데이터
csv_exam[20,5] # 20행 5열을 선택합니다.
class(csv_exam[20,5]) # 벡터 형식 데이터

 

* 조건에 만족하는 데이터프레임의 데이터를 얻어오는 방법

데이터프레임의 class 열에 저장된 값이 1인 행만 선택합니다.
csv_exam[csv_exam$class == 1,]
데이터프레임의 math 열에 저장된 데이터가 80이상인 행만 선택합니다
csv_exam[csv_exam$math >= 80,]
데이터프레임의 class열에 저장된 데이터가 1이고, english열에 데이터가 90이상인 행만 선택합니다.
csv_exam[csv_exam$class ==1 & csv_exam$english >=90,]
데이터프레임의 math열에 저장된 데이터가 50이하이거나, english 열에 데이터가 50이하인 행만 선택합니다.
csv_exam[csv_exam$math <= 50 | csv_exam$english <= 50,]

 

* 읽어올 csv파일의 첫번째 줄이 열 이름이 아닐 경우 header=f 옵션을 사용하여 읽어올 수 있습니다.
* 첫번째 줄이 열 이름이 아닐 경우 데이터 손실이 일어날 수 있습니다.

csv_exam_noheader <- read.csv('csv_exam_noheader.csv')

* 첫번째 줄이 열 이름이 아닐 경우 header=f 옵션을 사용하여 읽어옵니다

csv_exam_noheader <- read.csv('csv_exam_noheader.csv', header = F)

* 행 이름을 기본 상태로 되돌립니다.

colnames(csv_exam_noheader) <- NULL

* 행 이름을 지정해줍니다.

colnames(csv_exam_noheader) <- c('id','class','math','enghlish','science')

 

외부 패키지를 사용하는 방법

install.packages('패키지이름') -> 패키지 이름에 꼭! 따옴표를 사용해야합니다.

install.packages('dplyr')

 

* 설치된 패키지를 사용하는 방법

패키지를 설치하고 포함된 기능을 사용하려면 library() 함수를 실행해서 설치된 패키지를 메모리에 로드 시켜야합니다.

library(dplyr) * 메모리에 로드 시킬때에는 따옴표를 사용하지 않습니다.

 

# 데이터프레임의 열 이름을 변경하기 위한 rename() 함수를 사용합니다.

rename() 함수를 사용하려면 dplyr 패키지를 설치하고 메모리에 로드한 후 사용할 수 있습니다.

rename(데이터 프레임 이름, 새이름=기존이름, 새이름=기존이름, ..)

csv_exam_copy <- rename(csv_exam_copy, V1=id, V2=class, V3=math, V4=english, V5=science)
csv_exam_copy

 

# excel 파일을 읽어오려면 readxl 패키지를 설치하고 로드한 후 사용합니다.

install.packages('readxl')
library(readxl)

 

excel_exam <- read_excel_exam.xlsx')

 

# tibble
데이터 프레임을 현대적으로 재구성한 타입으로 simple data frames라고 부릅니다.

tibble은 data.fram을 만들 때 사용하고, 데이터를 간략하게 표현하고 대용량 데이터를 다룰 수 있습니다.

tibble은 이력 유형이 변경되지 않아 character 변수를 이용할 때 보다 데이터 변경이 없는 자료에 자주 사용됩니다.

 

# 읽어올 excel 파일의 첫번째 줄이 열 이름이 아닌 경우 col_names=F 옵션으로 지정하여 읽어 옵니다

excel_exam_noheader <- read_excel(excel_exam_noheader.xlsx', col_names = F)

excel_exam_noheader_copy <- excel_exam_noheader

excel_exam_noheader_copy <- rename(excel_exam_noheader_copy, id='...1', class='...2',math='...3',english='...4',science='...5')

 

# 읽어올 excel 파일에 sheet가 여러개 있을 경우 특정 시트의 데이터를 읽어오려면 

sheet=n(n은 읽어올 sheet의 위치), 또는 sheet='시트이름' 옵션을 지정해서 읽어옵니다.

excel_exam <- read_excel('excel_exam.xlsx', sheet = 2)

excel_exam <- read_excel('excel_exam.xlsx', sheet = 'sheet2')

 

* tibble은 사용하는 패키지에 따라 사용할 수 없는 함수들이 많으므로 

데이터프레임으로 변환시키고 사용하는 것이 일반적입니다.

# as.data.frame() 함수 : 자료형을 데이터 프레임 형태로 변환합니다

excel_exam <- as.data.frame(excel_exam)

 

* csv파일로 데이터를 저장하려면 데이터프레임 형태로 저장해야합니다.

write.csv(데이터프레임, file= '파일명')

write.csv(excel_exam), file = 'df_excel_exam.csv')

행 번호를 csv파일에 저장하지 않으려면 row.names=F 옵션을 사용합니다.

write.csv(excel_exam), file = 'df_excel_exam.csv', row.names = F)

변수의 종류

 

자료형

 

1. 숫자형 (numeric)

정수(integer)와, 소수점까지 표현 가능한 실수(double),

허수까지 포함하는 복소수(complex)로 나누어 집니다.

하지만 R에서는 실수와 정수를 나눠서 분석하거나 다루지 않습니다.

 

num.a <- 100
num.b <- 200
num.c <- 300

 

# class 함수 : 변수들의 속성(자료형)을 확인합니다.

class(num.a)

 

# str 함수 : 자료형 및 자료 구성요소를 확인합니다

str(num.a)

 

2. 논리형(logical)

논리형 변수는 참, 아니면 거짓, 두개의 값만을 가집니다.

R에서 데이터 분석을 할 때 필수적으로 알아야하는 자료형 중에 하나이며,

많이 쓰이는 자료형입니다. 표현 방법은 TRUE,FALSE 또는 T,F가 있습니다.

 

logic.b1 <- TRUE
logic.b2 <- FALSE
logic.b3 <- T
logic.b4 <- F

 

3. 문자형(Character)

문자형은 작은 따옴표('')나 큰 따옴표("")로 저장합니다.

두 표시는 동일한 의미를 가지며 문자열을 저장할 수 있습니다.

 

char1 <- "R"char1 <- "R"

char2 <- 'Programming'
char3 <- "10"
char4 <- '5'

 

* 문자형 변수는 산술연산이 불가능 합니다.

 

4. 팩터형(factor)

통계학에서 명목형/순서형 변수와 굉장히 닮은 자료형입니다.

팩터형이란, 수치로서 어떤 의미를 갖는것이 아닌,

범주(category)를 나누기 위한 형태들을 의미 합니다.

 

factor <- c("대한민국", "미국", "영국", "중국", "프랑스", "대한민국", "필리핀", "중국" )

 

# as.factor 함수 : 단순 문자형을 factor형 변수로 변환합니다

factor <- as.factor(factor) * 중복된 문자열을 없애줍니다, 카테고리형식으로 변경!

factor * 이때 나오는 levels는 어떤 종류의 범주들이 있는지 나타내는 키워드

 

# 단일값(Scalar) : 단 하나의 값을 저장합니다

# 벡터(Vector) : 두 개 이상의 값을 가지고 있는 변수입니다.

스칼라와 다른점은 값이 나열되어 있다는 점이며, 한가지의 자료형만 가질 수 있습니다.

 

# c 함수 : 데이터나 객채들을 하나로 결합하여 저장하는 함수 입니다.

 

vec.a <- c(1,2,3,4,5)
vec.b <- c(1:5) * 연속되는 값을 넣을 경우 " : "을 이용해서 시작값 : 종료값 형식으로

1씩 증가하는 연속된 값을 저장할 수 있습니다.

vec.c <- c("대한민국", "영국", "미국", "프랑스")

vec.d <- c(T,F, TRUE, FALSE)

vec.e <- c(1000, TRUE, 10) * 자료형이 섞여 있는 경우 자료형의 우선순위에 따라

자료가 변경됩니다.

vec.f <- c(1000, TRUE, "상준") * 논리형 < 숫자형 < 문자형

 

# seq 함수 : 변수에 여러개의 값을 저장할 수 있습니다

seq(시작값, 종료값, [by = 증가값]) * 증가값을 생략하면 1로 기본값을 설정합니다. 대괄호 생략가능

 

vec.g <- seq(1,10) # c(1:10)
vec.h <- seq(1, 10, by=2)

 

* 벡터의 연산

여러개의 값을 기억하는 벡터에 숫자를 연산하면 모든 값에 연산됩니다.

vec.i <- vec.g + 5

여러개의 값을 기억하는 벡터에 벡터끼리 연산하면 같은 위치의 값과 연산됩니다.

단, 여러개의 값을 기억하는 벡터끼리의 연산은 값의 개수가 같아야합니다.

vec.g + vec.i

만약 저장된 값의 개수가 다를 경우 값의 개수가 적은 쪽의 값이 처음부터 반복되어 연산됩니다.

vec.g + vec.b

 

* 벡터의 요소 접근

vec.j <- c(50, 90 , 70 , 60 ,45 ,35 ,15 ,100 , 80, 85)

vec.j[1] * 벡터의 첫번째 요소 선택
vec.j[7] 
vec.j[1:5] * 벡터의 첫번째 요소부터 다섯번째 요소까지 선택
vec.j[-8] * 여덟번째 요소만 제외하고 선택
vec.j[-1:-3] * 첫번째 요소부터 세번째 요소까지를 제외한 나머지 요소만 선택
vec.j[3:1] * 세번째 요소부터 첫번째 요소까지 역순으로 선택

 

# rep 함수 : 특정요소를 반복하여 선택합니다.

rep(1,5) * 1 을 다섯 번 반복합니다 1 1 1 1 1
rep(vec.i, 2) * vec.i 를 두 번 반복합니다
rep(1:3, each = 2) * 1부터 3까지 두 번 반복합니다 1 1 2 2 3 3

 

# max 함수 : 최대값을 선택합니다.
# min 함수 : 최소값을 선택합니다.
# mean 함수 : 평균을 계산합니다. 
# sum 함수 : 총합을 계산합니다.

 

max(vec.j) # 100
min(vec.j) # 15
mean(vec.j) # 63
sum(vec.j) #630

 

예제 1

1) 1부터 10 사이의 벡터를 만들어 v1이라는 변수에 저장합니다.

v1 <- c(1:10)

2) 각 원소 값들에 2를 곱한 결과로 벡터 v2를 만듭니다

v2 <- c(1:10) * 2

3) v2에서 최대값을 뽑아 max_v에 저장합니다

max_v <- max(v2)

4) v2에서 최소값을 뽑아 min_v에 저장합니다
min_v <- min(v2)
5) v2에서 평균값을 뽑아 avg_v에 저장합니다
avg_v <- mean(v2)
6) v2에서 합을 뽑아 sum_v에 저장합니다
sum_v <- sum(v2)
7) v2에서 5번째 요소를 제외하고 v3라는 변수에 저장합니다

v3 <- v1[-5]

8) 화면에 v1, v2, v3, max_v, min_v, avg_v, sum_v를 출력합니다

v1; v2; v3; max_v; min_v; avg_v; sum_v

 

예제 2

1) seq() 또는 rep() 함수를 이용하여 아래 결과가 나오도록 출력합니다.

# 1, 3, 5, 7, 9

seq(1, 9, 2) / seq(1, 9, by=2)

# 1, 1, 1, 1, 1

rep(1, 5)

# 1, 2, 3, 1, 2, 3, 1, 2, 3

rep(1:3, 3)

# 1, 1, 2, 2, 3, 3, 4 ,4

rep(1:4, each = 2)

 

산술 연산자

+(더하기), -(빼기), *(곱하기), /(나누기), **(거듭제곱), ^(거듭제곱), %%(나머지)

 

할당 연산자

<- , =, ->

 

비교 연산자 (두 개 값에 대한 비교로 참인 경우 TRUE, 거짓인 경우 FALSE를 반환)

>, <, >=, <=, ==(같다), !=(같지않다), !(부정)

 

논리 연산자

& : 두 식의 값이 모두 TRUE인 경우 TRUE 값을 리턴하는 연산자입니다. (and)
| : 두 식의 값 중 TRUE가 있으면 TRUE값을 리턴하는 연산자입니다. (or)

 

행렬 (Matrix) : 2 차원

      1열 2열 3열
1행   1   4   7
2행   2   5   8
3행   3   6   9

 

# matrix 함수 : 행렬 데이터를 만듭니다.

행과 열을 지정하지 않으면 12행 1열인 matrix가 만들어 집니다.

mat.a <- matrix(c(1:12))

mat.b <- matrix(c(1:12), ncol=4) * ncol 옵션으로 4열의 값을 저장하는 matrix가 생성

mat.c <- matrix(c(1:12), nrow=4) * nrow 옵션으로 4행의 값을 저장하는 matrix가 생성

mat.d <- matrix(c(1:12), nrow=4, byrow = T) * matrix는 값이 채워지는 방향이 열방향을 우선으로

채워지게 됩니다. byrow = T 옵션을 사용하면 행 방향으로 채워지게 됩니다

 

* 행렬의 요소 접근

mat.d[7] # matrix에서 지정된 위치의 값을 한 개 선택합니다. -> 열 우선 방식
mat.d[1,] # matrix에서 지정된 행 전체를 선택
mat.d[,1] # matrix에서 지정된 열 전체를 선택
mat.d[3,1] # 지정된 위치 (3행, 1열)의 값을 한개 선택

mat.d[1:2,] # 지정된 범위의 행 값을 선택 -> 값이 연속될 때

mat.d[c(1,3),] # 지정된 범위의 행 값을 선택 -> 값이 연속되지 않을 때

mat.d[-1,] # 1행을 제외한 값을 선택

mat.d[,-2] # 2열을 제외한 값을 선택

mat.d[-c(1:2),] # 1행부터 2행을 제외한 값을 선택

 

# cbind 함수 : 열 중심으로 벡터값을 행렬로 만들어 줍니다.

vec01 <- c(1, 2, 3, 4, 5)
vec02 <- c(2, 4, 6, 8, 10)
vec03 <- c(3, 6, 9, 12, 15)
mat.e <- cbind(vec01, vec02, vec03)

 

# rbind 함수 : 행 중심으로 벡터값을 행렬로 만들어 줍니다.

mat.f <- rbind(vec01,vec02,vec03)

 

# names 함수 : 벡터값에 제목(열이름)을 붙여줍니다

vec <- c(1:3)

names(vec04) <- c("1번","2번","3번")

names(vec04( <- LETTERS[1:3] *알파벳 순으로 제목을 붙여줍니다.

 

# colnames 함수 : 행렬에서 열의 이름을 붙여 줍니다.

colnames(mat.f) <- c("1번", "2번", "3번", "4번", "5번")

 

# rownames 함수 : 행렬에서 행의 이름을 붙여줍니다.
rownames(mat.f) <- c("1행", "2행", "3행")

 

예제 3. 1부터 10까지 출력하는데 3씩 증가 되는 형태로 (1 4 7 10) 저장되는

벡터를 정의하여 v3변수에 저장합니다. (단, 각각 값마다 "A", "B", "C", "D" 라는 이름을 부여합니다.)

v3 <- seq(1,10,3)

names(v3) <- LETTERS[1:4]

 

예제 4-1. 다음과 같이 값이 구성되는 매트릭스를 정의하여 m1에 저장합니다. 

1,2,3의 벡터 n1 ,4,5,6의 벡터 n2 ,7,8,9의 벡터를 n3을 이용하여 matrix를 구성합니다

    ,1    ,2    ,3
1,   1     4     7
2,   2     5     8
3,   3     6     9

 

n1 <- c(1,2,3)

n2 <- c(4,5,6)

n3 <- c(7,8,9)

m1 <- cbind(n1,n2,n3)

 

예제 4-2. 다음과 같이 값이 구성되는 매트릭스를 정의하여 m2에 저장합니다.

1~9의 벡터를 이용하여 matrix를 생성합니다.
    ,1    ,2    ,3
1,   1     2     3
2,   4     5     6
3,   7     8     9


m2 <- rbind(n1,n2,n3)
m2

 

예제 4-3. m2를 가지고 아래와 같이 값이 구성되는 매트릭스를 정의하여 m3에 저장합니다.
      col1  col2  col3
row1,    1     2    3
row2,    4     5    6 
row3,    7     8    9

m3 <- rbind(n1,n2,n3)

 

colnames(m3) <- c("col1","col2","col3")

rownames(m3) <- c("row1",'row2","row3")

 

 

+ Recent posts