언어/R

빅데이터 분석 실무 3일차

이게될까 2024. 7. 10. 11:52
728x90
728x90
# [행렬(Matrix)이란?]
# 행렬(Matrix)은 숫자, 기호 또는 표현식을 직사각형 배열로 나타낸 겁니다.
# 행렬은 행(row/세로)과 열(colum/가로)로 구성된 2차원 배열입니다.

# [행렬(Matrix)생성 연습-1]
# 1. 행렬 생성
mat_1 <- matrix(c(1, 2, 3, 4))
print(mat_1)


# 2. 행렬의 매개변수인 nrow = ?? 활용 2행3열 생성
mat_2 <- matrix(c(1, 2, 3, 4, 5, 6), nrow = 2)
print(mat_2)

행렬을 생성했다.

 

# 3. 행렬의 매개변수인 byrow = TRUE 활용 데이터 저장순서 변경하기
# 기본 값으로는 FALSE다.
mat_3 <- matrix(c(1, 2, 3, 4, 5, 6, 7, 8, 9), nrow = 3)
print(mat_3)

mat_3 <- matrix(c(1, 2, 3, 4, 5, 6, 7, 8, 9), nrow = 3, byrow = TRUE)
print(mat_3)

mat_4 <- matrix(c(1, 2, 3, 4, 5, 6, 7, 8, 9), nrow = 3, byrow = FALSE)
print(mat_4)


# 응용연습
mat_5 <- matrix(c(1, 2, 3, 4, 5, 6, 7, 8, 9), nrow = 2, byrow = TRUE)
print(mat_5)
mat_6 <- matrix(c(1, 2, 3, 4, 5, 6, 7, 8, 9), nrow = 2, byrow = FALSE)
print(mat_6)
# 이 코드를 학습하게 되면, 2행5열짜리 모양으로 출력이 되는데...
# 2행5열에 해당하는 데이터 요소가 부족하기에 R 프로그램이 자동으로
# 부족한 데이터 요소를 기존 데이터로 재활용 하여 채워준다.

Byrow가 True라면 행(row) 따라서 채워주지만 False라면 열(col) 따라서 숫자를 채워넣는다.
기본 값은 FALSE이므로 열 따라서 숫자를 채워 넣는다.

 

# [행렬(Matrix)생성 연습-2]
# 행렬 생성
# 1부터 6까지의 숫자로 2행(nrow)3열(ncol) 행렬 생성하기(세로적용)
my_matrix_1 <- matrix(1:6, nrow = 2, ncol = 3)
print(my_matrix_1)

# 1부터 6까지의 숫자로 2행3열 행렬 생성하기(가로적용)
my_matrix_2 <- matrix(1:6, nrow = 2, ncol = 3, byrow = TRUE)
print(my_matrix_2)


#===
# [행렬(Matrix) 요소 접근 연습-1]
# my_matrix_1 변수에 할당된 요소인 1행2열에 접근하기
element <- my_matrix_1[1, 2]
print(element)

# 특정 행 또는 열 접근하기
# my_matrix_1 행렬의 1행 전체 접근하기
row1 <- my_matrix_1[1, ]
print(row1)

# my_matrix_1 행렬의 2열 전체 접근하기
col2 <- my_matrix_1[, 2]
print(col2)

 

 

#===
# [행렬(Matrix) 요소 접근 연습-2]
# 작성된 행렬(Matrix)에 접근(조회)를 해 보겠습니다.
# 행렬에 데이터인 벡터를 생성하는 방법으로 c()함수를
# 사용하는 것과 그렇지 않은것에 차이는 없으며, 동일한 벡터가 생성됩니다.
# 4행5열을 생성해 보겠습니다.

mat_6 <- matrix(1:20, nrow = 4, ncol = 5) #matrix()함수 적용
print(mat_6)

mat_7 <- matrix(c(1:20), nrow = 4) #matrix(c()함수 적용)
print(mat_7)
# 생성된 두 행렬의 결과값 모양은 동일하다.

# 모든 행을 선택하고 2열, 3열에 접근(조회)하기
print(mat_6[, c(2, 3)])

# 1행, 3행을 선택하고 모들 열에 데이터 접근(조회)하기
print(mat_6[c(1, 3), ])

행렬 접근할 때 벡터로 주어지면 그 벡터에 대한 정보를 준다.

 

행렬 연산

# [행렬의 연산]
# 행렬(Matrix)에서는 다양한 연산을 수행 할 수 있습니다.
# 예를 들어 행렬 덧셈, 행렬 곱셈, 요소별 연산 등을 할 수 있습니다.

# 두 행렬 생성 및 출력
matrix1 <- matrix(1:4, nrow = 2, ncol = 2)
matrix2 <- matrix(5:8, nrow = 2, ncol = 2)
print(matrix1)
print(matrix2)

 

# 행렬 덧셈
sum_matrix <- matrix1 + matrix2
print("행렬 덧셈 결과: ")
print(sum_matrix)

# 행렬 곱셈
곱셈_matrix <- matrix1 %*% matrix2
print(곱셈_matrix)

# 행렬 곱셈 결과는 matrix1의 행과 
# matrix2의 열을 곱한 후 더한 값이다.

# 곱셈_matrix[1,1] = (1*5) + (3*6) = 5 + 18 = 23
# 곱셈_matrix[1,2] = (1*7) + (3*8) = 7 + 24 = 31
# 곱셈_matrix[2,1] = (2*5) + (4*6) = 10 + 24 = 34
# 곱셈_matrix[1,1] = (2*7) + (4*8) = 14 + 32 = 46

%*% 는 행렬 곱이다.

 

# 요소별 연산()
요소별_곱셈 <- matrix1 * matrix2
print(요소별_곱셈)

*는 요소별 곱이다.

 

배열 Array

어레이 - 벡터를 쌓는다.

# [배열(Array)이란?]
# 동일한 유형의 데이터가 많이 있을 때, 벡터(Vector) 형은 한 줄로 
# 데이터를 저장합니다. 

# 행렬(Matrix) 형은 가로와 세로로 데이터를 저장합니다. 

# 배열(Array) 형은 여러 개의 행렬을 층층이 쌓아 놓은 것을 의미합니다. 
# 마치 마트에서 계란을 여러 층으로 쌓아 놓은 것처럼, 
# 배열은 3차원 데이터를 저장합니다.

# [배열(array)생성 연습1]
# 배열은 반드시 출력할때 높이 값이 
# 존재하기에 print()함수 출력
# print 함수는 배열의 각 차원을 이해하고
# 올바르게 출력합니다.
#
array1 <- array(c(1:12), dim = c(2,2,3)) 
# dim = (가로, 세로, 높이)
print(array1) 
# 배열을 정상적으로 출력 
print(paste(array1))
# paste() 함수는 주어진 값을 문자열로 
# 결합하고, 결합된 결과를 하나의 문자열로 
# 출력합니다. 
# 따라서 배열을 paste() 함수로 출력하면 
# 배열이 벡터 형태의 문자열로 변환되어 
# 출력됩니다.^^ 차잇점을 확인합니다.!!

 

# [배열(array)생성 연습2]
# 3행4열3층에 해당하는 배열 연습
# 배열에 사용할 과일 이름 목록
과일이름 <- c(
  "사과", "바나나", "체리", "대추", 
  "엘더베리", "무화과", "포도", "허니듀", 
  "인도무화과", "잭프루트", "키위", 
  "레몬", "망고", "넥타린", "오렌지", 
  "파파야", "모과", "라즈베리", "딸기", 
  "탄제린", "우글리프루트", "바닐라",
  "수박", "시과", "옐로패션프루트", "주키니")
# 데이터 수가 몇개인지?는 알수 없지만 해당 데이터를
# 3행4열 각 층에 12개씩 3층으로 쌓아올리면 총36개
# 데이터를 표현할 수 있다는 점을 감안하고 학습

# 3행 4열 3층 배열 생성
과일배열 <- array(과일이름[1:36], dim = c(3, 4, 3))

# 출력1_(먼저 출력해서 값을 확인한다.)
# 배열 출력
print("3행4열3층의 과일 배열:")
print(과일배열)

행, 열, 층으로 묶는다!

 

# 출력2_(출력1을 실행하고 이후에 출력해 본다)
# for문을 활용하여 각 층을 따로 출력
for (i in 1:3) {
  cat(sprintf("\n %d 층:\n", i))
  print(과일배열[, , i])
}

 

#===
# [배열(array)생성 및 조회 연습1]
# 배열을 조회하는 형식은 
# array이름[행번호, 열 번호, 높이번호]의 형태입니다.

# 배열에 사용할 과일 이름 목록
과일이름 <- c(
  "사과", "바나나", "체리", "대추", 
  "엘더베리", "무화과", "포도", "허니듀", 
  "인도무화과", "잭프루트", "키위", 
  "레몬", "망고", "넥타린", "오렌지", 
  "파파야", "모과", "라즈베리", "딸기", 
  "탄제린", "우글리프루트", "바닐라",
  "수박", "시과", "옐로패션프루트", "주키니")

# 3행 4열 3층 배열 생성
과일배열 <- array(과일이름[1:36], dim = c(3, 4, 3))

# 배열 출력을 통해서 전체 출력 내용을 보면서
# 아래 내용처럼 특정 요소 출력 부분을 각각 
# 실행시켜 보면서 조회 방법을 알아봅니다.

print("3행 4열 3층의 과일 배열:")
print(과일배열)
#===


#===
# 특정 요소 조회 (예: 1층의 2행 3열)
print("1층의 2행 3열 요소:")
print(과일배열[2, 3, 1])

# 특정 층 조회 (예: 2층)
print("2층 전체:")
print(과일배열[, , 2])

# 특정 행 조회 (예: 3층의 1행)
print("3층의 1행:")
print(과일배열[1, , 3])

# 특정 열 조회 (예: 1층의 4열)
print("1층의 4열:")
print(과일배열[, 4, 1])

 

 

리스트 list

# [리스트(list)란?]
# 앞에서 학습한 벡터, 행렬, 배열은 반드시 작성되는 데이터 요소가 
# 동일한 데이터 유형(type)이어야 한다는 것을 학습했습니다.
# 하지만, 실제 데이터는 동일하지 않은 유형도 한 세트로 저정해야 
# 할 경우가 아주 많습니다.
# 예를 들어 댓글을 분석해서 키워드를 찾을 경우를 생각해 
# 보겠습니다.
#===========================================================#
# “2024년 1월 11일에 이 시계를 ₩50,000원 주고 샀는데 배송, #
# 디자인이 맘에 들었죠”                                     #  
#===========================================================#
# 위 댓글을 보면 날짜, 숫자, 글자, 기호 등이  다 들어가 있는 것을 
# 확인할 수 있습니다.
# 따라서, 앞에서 학습했던 벡터, 행렬, 배열 등 으로는 한 세트로 
# 묶어서 저장할 수 없습니다.
# 이처럼 서로 다른 데이터 유형도 한 세트로 묶어서 저장할 수 있는 
# 것이 리스트(list) 유형입니다.

# [리스트(list) 생성 연습1]
#
# 리스트 데이터 생성(1)
list1 <- list(학번=1001, 이름="홍길동", 생일="2005-07-07")
# 출력 paste()함수
paste("저장된 리스트 데이터:", list1) #오류
# list()함수로 할당된 데이터는 반드시 print()함수로 출력한다.
print(list1) #정상 출력

# 리스트 데이터 생성(2)
list2 <- list(STUDNO = c("Rc1001", "Rc1002", "Rc1003", "Rc1004"),
              Name = c("홍길동", "박길동", "고길동", "차길동"),
              Age = c(25,23, 20, 21, 24)
              )
print(list2)

# 리스트 데어터 생성(3)
list3 <- list( 소대1 = c("홍길동", "전우치", "일지매"),
               소대2 = c("강감찬", "이순신", "유관순"),
               소대3 = c("김수", "김유신", "을지문덕"))
print(list3)

 

# [리스트(list) 조회 연습1]
# 리스트(list) 유형을 조회할 때는 “list이름$key이름” 형태로
# 조회한다. print() 함수 코드를 활용한다.
#=
print(list1$학번) 
print(list1$생일)
print(list1$이름)
#=
print(list1[1])
print(list1[2])
print(list1[3])
#=
# list2 변수에 적용된 리스트 조회 연습
print(list2$studno) #오류!
#리스트 조회시 반드시 'Key값의 대.소문자' 구분 한다는 것!
print(list2$STUDNO) #출력


# list2에서 Name과 Age를 출력하고자 할때는 cat()함수 사용!
print(list2$Name, list2$Age) 
print(c(list$Name), c(list2$Age))
# 오류! print()함수에서 인수 두 개 사용x

cat(c(list2$Name), c(list2$Age))
cat(c(list2$Name), '\n', c(list2$Age))

 

# [응용문제]
#  
# list2라는 리스트의 두 번째 요소(박길동, 23)에서 
# Name과 Age 값을 가져와서, 
# 이를 하나의 벡터로 만든 다음 출력하는 코드 작성하기!
#==============
#cat(위 조건을 만족하는 코드를 작성하시오!) #문제!
#==============
#cat(c(list2$Name[2]), c(list2$Age[2])) #정답!



# [연습문제]
# 1. 아래 빈 칸을 알맞은 명령을 작성하시오.
# 구매내역목록 <- ???  # 문제
  
구매내역목록 <- list(번호=1000, 고객명="홍길동", 
               상품명="맛동산", 구매일자="2018-01-11",
               금액 = 500) #정답

#print(구매내역목록)


# 2. 아래 네모 칸에 알맞은 명령을 작성하시오.

#print(??) # 문제
#print(??)
#print(??)
#print(??)
print(구매내역목록$고객명)
print(구매내역목록$번호)
print(구매내역목록$고객명)
print(구매내역목록$금액)

 

데이터 프레임

# [데이터 프레임형(Data frame) 생성]
# data frame의 생성은 벡터(vector)를 생성하고, 이후에 
# 각각의 벡터를 합쳐서 데이터 프레임으로 만들 수 있습니다.

# 1. 개별 벡터 생성 -> 데이터 프레임 생성하기(회원목록)
#==
names <- c("홍길동", "고길동", "박길동")# 이름 벡터
aegs <- c(25, 35, 45) # 나이 벡터
height <- c(170, 172, 175) # 키 벡터

print(names)
print(aegs)
print(height)

# 1-1. 생성된 개별 벡터를 합쳐서 -> 데이터 프레임 생성하기
df_1 <- data.frame(Name = names, Age = aegs, Height = height)

# 2. 데이터 프레임 출력하기
print("[회 원 목 록]")
print(df_1)

넣을 때 개수가 안맞으면 안만들어지네요 ㅎㅎ 

 

# 2. 개별 벡터 생성 -> 데이터 프레임 생성하기(과일상품)
#==
fruit_number <- c("1", "2", "3", "4")
fruit_name <- c("사과", "딸기", "바나나", "배")
fruit_cost <- c("1,000원", "2,000원", "1500원", "2,000원")

print(fruit_number)
print(fruit_name)
print(fruit_cost)

df_2 <- data.frame(No = fruit_number, 
                   과일명 = fruit_name, 
                   가격 = fruit_cost)
print(df_2)
#==

 

# 3. data.frame() 함수 적용 직접 생성하기
#==
출석부 <- data.frame(
  이름 = c("홍길동","콩미소","차길동","고길동","콩순이"),
  나이 = c(23,24,25,21,24),
  성별 = c("남자", "여자", "남자", "남자", "여자")
)
print(출석부)
#==

이렇게 직접 만들 수 있다.

 

#==
# 4. seq()와 rep() 함수를 이용하여 데이터프레임 생성
# seq() 함수는 등차수열을 생성
# rep() 함수는 반복되는 값을 가진 벡터를 생성
특별출석부 <- data.frame(
  이름 = c("홍길동","콩미소","차길동","고길동","콩순이"),
  나이 = seq(22, 26, by = 1), # by = 1은 1씩 증가
  성별 = rep(c("남자", "여자"), times = 3)[1:5],  # 필요 길이만큼 잘라내기
  #성별 = rep(c("남자"), times = 3)[1:5] 테스트 해보기!
  성적 = rep(90, times = 5) # 90 점수를 벡터의 개수만큼 반복
)

print(특별출석부)
#==

seq는 숫자 벡터 쭉 만들어주고 rep는 주어진 벡터를 times만큼 반복하네요 

 

# [데이터 프레임형(Data frame) 조회]
# data frame으로 생성된 데이터를 조회하는 학습

# df_1 데이터 프레임 코드를 이용하여 조회 학습하기
#==
# df_1 데이터프레임에 내용을 출력합니다.
print(df_1) 

# 출력된 내용을 보면서 조회 학습을 합니다.
# 데이터프레임$라벨명(컬럼/라벨) 이름을 기준으로 조회
print(df_1$Name)
print(df_1$Age)
print(df_1$Height)

# 특정 열(라벨/라벨명)에 있는 데이터 요소를 조회하기
# 1행1열, 1행2열 / 3행1열, 3행2열 데이터 요소 조회를 해 봅니다.
print(df_1) # 데이터 프레임 전체 출력
print(df_1[c(1,3), c(1,2)])


# 2행2열, 2행3열 / 3행2열, 3행3열 데이터 요소 조회를 해 봅니다.
print(df_1[c(2,3), c(2,3)])

 

# [데이터 프레임형(Data frame) 결합하기]
# data frame으로 생성된 데이터를 결합하는 연습을 해 보겠습니다.
# 샘플 데이터 프레임 2개를 만들어 봅니다.
df1 <- data.frame(
  name = c("홍길동", "일지매", "전우치"),
  height = c(180, 175, 182)
)
print(df1)

#=
df2 <- data.frame(
  name = c("홍길동", "강감찬", "전우치"),
  weight = c(82, 75, 90)
)
print(df2)


# [데이터 프레임 결합하기 merge]-(연습1)
# df1을 기준으로 df2와 공통적으로 가진 데이터만 출력
결과1 <- merge(df1, df2)
print(결과1)
#=

# [데이터 프레임 결합하기 merge]-(연습2)
# df1을 기준으로 df2와 모든 데이터 출력
결과2 <- merge(df1, df2, all = T)
print(결과2)

 

# [데이터 프레임 신규 행(row) 추가하기]-(연습3)
# 연습용 데이터 생성하기_(벡터 방식으로 생성하기!)
#
studno <- c(1001, 1002, 1003)
name <- c("홍길동", "일지매", "전우치")
birth <- c("1980-07-15", "1985-10-23", "1983-05-05")

member <- data.frame(STUDNO=studno, NAME=name, BIRTH=birth)
print(member)

# 신규 데이터 생성하기_row(행)으로 추가할 데이터!
new_row <- data.frame(
  STUDNO = 1004,
  NAME = "강감찬",
  BIRTH = "2001-05-26"
)

# rbind() 함수를 이용한 새로운 데이터 행(nrow) 추가하기!
#= rbind() 함수는 R에서 행(row)을 기준으로 데이터를 결합할 때 
# 사용하는 함수입니다. 
# 즉, 여러 개의 데이터프레임이나 벡터를 "(행) 방향"으로 합쳐서 새로운 
# 데이터프레임을 생성합니다. 
member <- rbind(member, new_row)
print(member)
#=


# [데이터 프레임 신규 열(colum) 추가하기]-(연습4)
#= cbind() 함수를 이용하여 열(colum)을 추가하기!
member <- cbind(member, data.frame(PHONE=c("02-333-5656", "031-232-5656",
                                           "032-565-6565", "02-457-8989")))
print(member)

 

 

 

 

 

 

728x90

'언어 > R' 카테고리의 다른 글

빅 데이터 분석 실무 필기 준비  (1) 2024.07.10
빅데이터 분석 실무 2일차  (0) 2024.07.09
빅데이터 분석 실무 1일 차  (0) 2024.07.08