[모각코] day3. 7/27 3과목. R데이터 분석 part1

2022. 7. 28. 20:17ADsP 스터디

 

  • R의 데이터 형 ( = 타입)
    • R의 데이터 형은 기본형, 구조형, 복합형으로 나눌 수 있으며, Special Values가 존재함
    1. 기본형 : numeric, character, logical
    1. 구조형 : scalar, factor, vector, matrix(행렬) , array
    1. 복합형 : list(파이썬 리스트랑 똑같음) , data.frame → 목차가있는 행렬 여러개의 타입, data.table : 여러개의 타입을 같이 사용할 수 있는지
    1. Special Values : NULL(변수값이 초기화 되지 않음), NA(결측치), NaN(계산 불가능, Not Available Number), INF(무한대)
    데이터 형 특징
    numeric 정수, 실수, 복소수, 수학적 연산 및 통계적 계산
    character 문자, 단어로 구성 “”또는 ‘’내에 표현됨
    logical TRUE,FALSE, 산술 연산 시 1, 0 으로 사용 됨
    데이터 형 차원 원소 원소의 타입
    scalar 단일 수치/ 문자/ 논리 단일
    factor 1D 수치/ 문자 단일, 범주형
    vector 1D 수치/문자/논리 단일
    matrix 2D 수치/문자/논리 단일
    data.frame 2D 수치/문자/논리 복합 가능
    array 2D 이상 수치/문자/논리 단일
    list 2D 이상 수치/문자/논리 복합 가능
  • vector - c 함수로 생성
    • 하나 이상의 스칼라 ( = 길이가 1인 벡터) 원소들을 갖는 단순한 형태의 집합
    • 숫자, 문자, 논리형 데이터를 원소(Element)로 사용할 수 있음
    • 동일한 자료형을 갖는 값들의 집합으로 하나의 열(Column)로 구성됨
    • 벡터 생성 함수 : c(value1, value2,….), seq(from, to, by), rep(x, times, each)
    rm(list = ls()) #리스트 목록 삭제
    iv <- c(1,2,3)
    cv <- c('A',"B",'C')
    bv <- c(TRUE,FALSE,TRUE)
    fv <- c(3.4,2.5,8)
    t <- c(1,2,3,4)
    icv <- c(iv,cv,bv)  #원소가 가장 유연한 타입인 chr로 변경
    
    
    
    rm(list = ls())
    v1 = seq(1:5) #v1 = 1:5
    v2 = seq(1,10,2)
    v3 = seq(1,10,length = 4)   #1~10사이의 길이 4짜리 벡터
    v4 = seq(1,3,length = 5)  #1~3사이의 길이 5짜리 벡터
    
    
    rm(list = ls())
    v1 = rep(1,5)   #1을 5번
    v2 = rep(1,time = 5)  #1을 5번
    v3 = rep(3:5, time = 3) #3,4,5를 3번
    v4 = rep(3:5, each = 2) # 3,3, 4,4, 5,5 각각 2번씩 반복
    v5 = rep(seq(1,5,2),2) #1,3,5,1,3,5
    v5 = rep(seq(1,5,2),each = 2) #1,1,3,3,5,5
    
    
    rm(list = ls())
    v1 <- seq(2,10,2)
    v2 <- rep(2,5)
    v3 <- v1 + v2
    v4 <- v1%/%v2    #몫 구하기
    v5 <- v1 ^ v2    #승수 구하기
    x <- c(1,4,8)
    y <- c(2,3)
    z <- t(y)       #전치행렬
    y    #하나의 열
    t(y)  #하나의 행 두개의 열
    
    m <- x%*%z    #행렬곱
    m
    
    
    
    rm(list = ls())
    v1 <- rep(3,7)
    v2 <- c(1,2,3)  
    v3 <- v1+v2   #재사용 규칙 적용
    v4 <- v2 + 3  #재사용 규칙 적용
    
    rm(list = ls())
    v1 <- 1:5    #seq(1:5)
    r1 <- v1[3]
    r2 <- v1[-3]  #3번인덱스의 요소를 제외하고
    r3 <- v1[2:4] #2~4인덱스의 요소
    r4 <- v1[c(1,3,4)]  #1,3,4 번째 요소
    r5 <- v1[v1%%2 == 0] #2로 나누었을 때 ,나머지가 0인 요소
    v1%%2==0
    names(v1) <-c('A',"B","C",'D','E')  #v1의 각 요소에이름 붙이기
    v1['B']  #동일한 결과
    v1[2]
rm(list = ls()) #만들어 놓은 변수의 목록 삭제
ls()
a <- 20 #두가지 방법 모두 가능
b = 20
hap <- a+b
cat(hap,'\n')   #합치기

cat(a , '+', b ,'=', hap, '\n')
ls()
rm(hap) #hap 변수 삭제
ls()  #변수의 목록

a.list = 10 #변수명에 . 사용가능
a.so = 20
rm(list = ls()) #리스트 목록 삭제
iv <- c(1,2,3)
cv <- c('A',"B",'C')
bv <- c(TRUE,FALSE,TRUE)
fv <- c(3.4,2.5,8)
t <- c(1,2,3,4)
icv <- c(iv,cv,bv)  #원소가 가장 유연한 타입인 chr로 변경



rm(list = ls())
v1 = seq(1:5) #v1 = 1:5
v2 = seq(1,10,2)
v3 = seq(1,10,length = 4)   #1~10사이의 길이 4짜리 벡터
v4 = seq(1,3,length = 5)  #1~3사이의 길이 5짜리 벡터


rm(list = ls())
v1 = rep(1,5)   #1을 5번
v2 = rep(1,time = 5)  #1을 5번
v3 = rep(3:5, time = 3) #3,4,5를 3번
v4 = rep(3:5, each = 2) # 3,3, 4,4, 5,5 각각 2번씩 반복
v5 = rep(seq(1,5,2),2) #1,3,5,1,3,5
v5 = rep(seq(1,5,2),each = 2) #1,1,3,3,5,5
  • matrix(행렬)
    • 데이터의 형태가 2차원으로 행(row)과 열(column)로 구성
    • 하나의 데이터 유형만 가능, 역행렬은 solve()로 구한다.
  • 행렬 생성 함수
    • matrix(data = NA, nrow = 1(행의 수), ncol = 1(열의 수), byrow = FALSE(TRUE일 경우 행방향으로 채워짐), dimnames = NULL(각 차원의 이름))
    • rbind(vectors or matrices), cbind(vectors or martrices)
  • data.frame
    • 엑셀의 WorkSheet와 같은 구조의 2차원 데이터
    • ‘여러가지 데이터 유형’을 가질 수 있음, 벡터 벼로 다른 데이터 유형 가능
    • 벡터가 모여 데이터 프레임을 구성함
  • data.frame 생성함수
    • data.frame(vectors or matrices, stringsAdFactors) #벡터의 길이는 모두 같아야 함
    • data.frame(변수명 = 벡터, .., stringAsFacrots)# stringAsFactors를 TRUE로 지정하면 문자열을 factor형으로 저장함
rm(list =ls())
name <- c('tom','jerry','cindy','mark')
gender <-c('f','m','f','m')
kor <- c(90,100,80,95)
eng <- c(90,95,100,80)
df1 <- data.frame(name, gender,kor,eng)
df2 <- data.frame(matrix(seq(1,9),nrow = 3))
#이름을 별도로 주지 않았으므로 x1,x2,x3로 설정

df3<- data.frame(gender = c('f','m','f','m'),
                 score = c(90,100,85,95),
                 stringsAsFactors = TRUE)
str(df3)  #structure, gender에 대해서는 factor type
df <- data.frame(name, gender,kor,eng)
v1 = df[1,3]  # 1행 3열
df1 <- df[2,]  # 2행 모든열, 4obs. of 4 variables
v2 <- df[,'name'] 
# 열 의 경우 한가지 타입으로 통일 되어 있으므로 
# 하나의 vector 반환
v3 <- df$name #df안의 name이라는 열, df[,'name'], vector

df2 <- df[1]  #1번 열, dataframe
df3 <- df['name'] #name 열, dataframe
v4 <- df[[1]]   #1번열, vector
df4 <- df[seq(1,3),c(1,2)]  #data frame
df5 <- df[,2:4] #data frame
df6 <- df[1:3]  #여러개의 열, dataframe
df7 <- df[-2]  #2번 열 제외 , dataframe
df8 <- df[-c(1,3,4)] #1,3,4열 제외,dataframe
  • list
    • 서로 다른 데이터 타입을 담을 수 있음
    • 리스트에 저장된 데이터를 index 또는 key를 사용해 접근함
    • 생성 함수 : list(key = value, key = value … )
  • 외부 데이터 사용
    • 작업 환경 설정
      • setwd(’디렉터리 이름’)
      • getwd() : 현재 작업 디렉터리 이름 반환
    • CSV 파일 불러오기, 저장하기
      • 불러오기 : read.csv(’파일명’, fileEncoding =’UTF-8-BOM’) # fileEncoding → 한글 깨짐방지
      • 저장하기 : write.csv(’파일명’, row.names = FALSE) #row.names = FALSE→열 이름 지정x
      • 경로명은 \\ or / 으로 경로 구분자를 사용
      rm(list = ls())
      df = read.csv('.\\data\\easySample.csv',fileEncoding = 'UTF-8-BOM')
      # fileEncoding = 'UTF-8-BOM'을 통해 깨짐 방지
      write.csv(df, 'data/mySample.csv',
                row.names = FALSE)
      write.csv(df,'data/mySample_wr.csv',
                row.names = TRUE)
       
      
      rm(list = ls())
      cname <- c('ID','name','birth','dept','english'
                 ,'japanese','chinese')   #컬럼명 설정
      
      df3 <- read.table('data/easySample.txt'
                        ,sep = ','
                        ,col.names = cname)
      #col.names = 컬럼명 설정, sep =텍스트 파일의 구분자를 알려줌
      print(df3)
      
      rm(list = ls())
      df4 <- read.csv('data/mySample.csv')
      save(df4, file = 'data/myObject1.Rdata') #객체로저장
      rm(list = ls())
      ls()   #아무것도 없음 확인
      load('data/myObject1.Rdata')   #객체 불러오기
      print(df4)
  • data.frame 핸들링
    • 새로운 변수 만들기 : 데이터프레임$변수명 또는 데이터프레임[’변수명’] < - 추가할 데이터 벡터
    • 조건으로 선택 : subset(x, subset = (조건)) #subset = 생략가능
    • 목록으로 선택 : subset(x, subset = (조건), select = 열/ 열 목록)
    • 열, 열 목록 제거 : subset(x, subset= (조건), select = 열/ -열 목록)
    • 열 이름 바꾸기 : colnames(x)< - , colnames(x)[index] < -
    •  
  • R의 데이터 셋 사용
    • x : 데이터 셋 이름, v : 데이터, n : 숫자
    • head(x, n) : 데이터 셋 처음 여섯 개 반환, n 지정 시 해당 개수 만큼 반환
    • tail(x,n) : 데이터 셋 마지막 여섯개 반환, n 지정 시 해당 개수 만큼 반환
    • View(x) : 창을 열고 엑셀과 유사한 형태로 데이터 셋을 보여줌
    • summary(x) : 데이터 셋을 구성하는 항목의 기초 통계량을 보여줌
      • 최솟값, 1사분위수, 중간값, 평균, 3사분위 수, 최댓값
    • str(x) : 데이터의 구성을 표시함
    • attach(x) : 데이터 셋을 고정으로 사용하겠다고 선언함, detach할 때 까지 유효변수명만으로 바로 데이터에 접근 가능, iris$Sepal.Width → Sepal.Width
    • detach(x) : 고정된 데이터셋 사용을 해제 선언함
    • getwd() : 현재 워킹디렉토리 반환, setwd(’경로명’) : 워킹 디렉토리 설정
    • head, tail, summary, str : vector, matrix 등의 다양한 객체에 적용 가능
    • View : matrix, data.frame, list등 Data 구조에 적용가능
    rm(list = ls())
    df = read.csv('./data/easySample3.csv')
    df1 <- df[,c(2,4,8,9)]
    df1
    df1$score <- c(90,80,50,70,100,95,85,70,95,75)  #열 추가, 길이 같아야함
    
    df2 <- subset(df1,subset = (salary>=5000) )  #조건에 맞는 행 추출
    df3 <- subset(df2,select = -score )  
    #열에 대해서 목록을 추출 score 열 제외
    df4 <- subset(df1, 
                  subset = (salary>=5000),
                  select = -score)
    # salary 5000이상이면서 score열 제거 
    df5 <- subset(df2,
                  select = c(pname, dept,salary))
    # pname, dept, salary 열 선택
    colnames(df5)[2] <- 'department'
    # df5의 2열의 이름 department로 변경
    rm(list = ls())
    df = read.csv('./data/easySample3.csv')
    df1 <- df[,c(2,4,8,9)]
    df1
    df1$score <- c(90,80,50,70,100,95,85,70,95,75)  #열 추가, 길이 같아야함
    
    df2 <- subset(df1,subset = (salary>=5000) )  #조건에 맞는 행 추출
    df3 <- subset(df2,select = -score )  
    #열에 대해서 목록을 추출 score 열 제외
    df4 <- subset(df1, 
                  subset = (salary>=5000),
                  select = -score)
    # salary 5000이상이면서 score열 제거 
    df5 <- subset(df2,
                  select = c(pname, dept,salary))
    # pname, dept, salary 열 선택
    colnames(df5)[2] <- 'department'
    # df5의 2열의 이름 department로 변경
    [출처] https://www.youtube.com/c/EduAtoZPython