Home [데이터 정보 처리 입문] 12강 - R을 활용한 자료 분석
Post
Cancel

[데이터 정보 처리 입문] 12강 - R을 활용한 자료 분석

💡해당 게시글은 방송통신대학교 김성수, 이기재 교수님의 '데이터 정보 처리 입문' 강의를 개인 공부 목적으로 메모하였습니다.



학습 개요


  • R은 자료 처리, 통계 분석, 그래 픽스 분야 등에 탁월한 기능을 가지고 있는 무료 통계 시스템임
  • 대화형 프로그래밍 언어를 기반으로 다양한 통계 분석 함수 및 그래프 함수들을 포함하고 있음
  • R을 이용하여 데이터를 읽고, 처리하는 방법을 알아보고, 기술 통계량을 구하는 법, 히스토그램 등 기본적인 통계 그래프를 그리는 방법을 알아보도록 함



학습 목표


  • R 사용법을 익힐 수 있음
  • 데이터를 읽어 들이는 방법을 이해할 수 있음
  • 행렬 연산 방법을 설명할 수 있음
  • 기술 통계량을 구할 수 있음
  • 통계 그래프를 그릴 수 있음



강의록


R 소개 및 다운로드

R의 소개

  • 통계 소프트웨어 시스템(statistical software system)
    • 데이터를 효율적으로 처리하고 분석할 수 있으며, 다양한 통계적 분석과 그래프 등을 구현할 수 있는 통계 시스템
  • 대화형 언어(interpreted language)
    • 언어가 입력된 즉시 시행이 됨
  • 객체 지향(object-oriented) 시스템
    • R은 객체를 다룰 수 있도록 구성되어 있음
    • 데이터, 변수, 행렬 등은 모두 객체이며, 객체는 연산자 <-, 또는 =에 의해 생성 됨

R의 기능

  • 자료 처리 기능
    • 자료의 구성, 소팅, 결합 등이 프로그램 처리로 쉽게 이루어짐
  • 자료 분석 기능
    • 자료를 분석하기 위해 필요한 통계 분석 함수 및 분석 결과 제공 등이 다양함
  • 언어 기능
    • 함수 문을 쉽게 작성할 수 있으며, C언어 및 FORTRAN 언어 등과 인터페이스(Interface)가 가능
  • 그래픽스 기능
    • 대화형 그래픽스에 의한 자료 분석의 기능 및 분석 결과의 그래픽스 처리 기능이 뛰어남

R 다운 받기: www.r-project.org

image.png

R 다운 받기: Download

image.png

image.png

image.png

R 메뉴얼:

image.png

자료 읽기

설문지

  • 설문
    • 어느 집단에서 표본을 10명 추출하여 다음과 같은 4개 문항에 대하여 설문조사를 실시하였다.

      일련번호 변수1 (성별) 변수2 (나이) 변수3 (교육정도) 변수4 (월수입)
      1 1 21 2 150
      2 2 22 1 100
      3 1 33 2 200
      4 2 33 3 220
      5 1 28 2 170
      6 1 41 3 300
      7 2 39 2 290
      8 1 32 3 220
      9 2 44 1 370
      10 1 55 3 410
      1. 귀하의 성별은?
        1. 남자
        2. 여자
      2. 귀하의 나이는? (단위: 세)
      3. 교육 정도는?
        1. 중졸 이하
        2. 고졸
        3. 대졸 이상
      4. 월 수입 (단위: 만원)

텍스트 자료 읽기: read.table, read.csv

  • ex-8-1.txt

    image.png

  • ex-8-1.csv

    image.png

1
2
3
ex8 = read.table("D:/01_KNOU/2025년도 1학기/데이터 정보 처리 입문/dataintro/ex8-1.txt", header=T) # 텍스트 파일 불러오기 (첫 행을 열 이름으로 사용)
# ex8 = read.csv("c:/data/dataintro/ex8-1.csv") 
head(ex8) # 데이터의 처음 6행 출력

image.png

  • head = T
    • true 첫 번째 케이스는 변수로 되어있음

엑셀 자료 읽기: (package: xlsx, readxl)

  • Packages-Install → package(s)

    image.png

    image.png

    image.png

    image.png

엑셀 자료 읽기

  • xlsx 패키지 사용

    1
    2
    3
    
      library(xlsx) # xlsx 패키지 로드
      ex8_xls = read.xlsx("D:/01_KNOU/2025년도 1학기/데이터 정보 처리 입문/dataintro/ex8-1.xlsx", 1) # ex8-1.xlsx 파일의 첫 번째 시트에서 데이터를 불러옴
      head(ex8_xls, 3) # 데이터의 처음 3행 출력
    

    image.png

  • readxl 패키지 사용

    1
    2
    3
    
      library(readxl) # readxl 패키지 로드
      ex8 = read_excel(path="D:/01_KNOU/2025년도 1학기/데이터 정보 처리 입문/dataintro/ex8-1.xlsx") # ex8-1.xlsx 파일 의 데이터를 읽어오기
      head(ex8, 3) # 데이터의 처음 3행 출력
    

    image.png

기술 통계 량 구하기

  • 변수 월 급여(salary)의 평균 및 표준 편차 구하기

    1
    2
    3
    4
    5
    6
    7
    
      ex8 = read.csv("D:/01_KNOU/2025년도 1학기/데이터 정보 처리 입문/dataintro/ex8-1.csv") # CSV 파일 읽기
      head(ex8, 3) # 데이터의 처음 3행 출력
      names(ex8) # 열 이름 출력
      attach(ex8) # 데이터 프레임의 변수를 직접 참조 가능하게 만듦
      mean(ex8$salary) # salary 열의 평균 계산
      sd(ex8$salary) # salary 열의 표준 편차 계산
      summary(ex8$salary) # salary 열에 대한 요약 통계량 출력 (최솟값, 최댓값, 중앙값 등)
    

    image.png

그룹 별 기술 통계 량 구하기

  • 성별과 교육 정도 별로 월 급여(salary)의 평균 및 표준 편차 구하기

    1
    2
    3
    4
    5
    6
    
      tapply(ex8$salary, ex8$sex, mean) # sex에 따라 salary의 평균 계산
      tapply(ex8$salary, ex8$sex, sd) # sex에 따라 salary의 표준 편차 계산
        
      mean_Sal_Sex = tapply(ex8$salary, ex8$sex, mean) # sex에 따른 salary의 평균을 mean_Sal_Sex에 저장
      rownames(mean_Sal_Sex) = c("남", "여") # 행 이름을 "남"과 "여"로 설정
      mean_Sal_Sex # 결과 출력
    

    image.png

    1
    2
    3
    4
    
      sd_sal_edu = tapply(ex8$salary, ex8$edu, sd) # edu에 따라 salary의 표준 편차 계산
      sd_sal_edu # 결과 출력
      rownames(sd_sal_edu) = c("중졸이하", "고졸", "대졸이상") # 학력 수준별 이름 설정
      sd_sal_edu # 결과 출력
    

    image.png

    1
    2
    3
    4
    5
    6
    7
    8
    
      sex_edu = list(ex8$sex, ex8$edu) # 성별(sex)과 학력(edu)을 조합한 리스트 생성
      tapply(ex8$salary, sex_edu, mean) # 성별과 학력별 salary의 평균 계산
      mean_sal_sex_edu = tapply(ex8$salary, sex_edu, mean) # 결과를 mean_sal_sex_edu에 저장
      mean_sal_sex_edu # 결과 출력
        
      rownames(mean_sal_sex_edu) = c("M", "F") # 행 이름에 성별("M" = 남성, "F" = 여성) 설정
      colnames(mean_sal_sex_edu) = c("Middle", "High", "College-") # 열 이름에 학력 수준 설정
      mean_sal_sex_edu # 결과 출력
    

    image.png

빈도 표 및 분할 표 구하기

  • 성별과 교육 정도의 빈도 표 및 분할 표
    • table() 함수를 이용하여 빈도수를 계산

      1
      2
      3
      4
      5
      
        table(ex8$sex) # 성별(sex) 변수의 빈도수 계산
        table(ex8$edu) # 학력(edu) 변수의 빈도수 계산
              
        sex_edu = table(ex8$sex, ex8$edu) # 성별(sex)과 학력(edu) 변수의 교차 빈도수 계산하여 sex_edu에 저장
        sex_edu # sex_edu 출력
      

      image.png

    • 출력 표의 행/열 이름 설정

      1
      2
      3
      4
      
              
        colnames(sex_edu) = c("중졸이하", "고졸", "대졸이상")
        rownames(sex_edu) = c("남", "녀") 
        sex_edu
      

      image.png

  • summary() 함수는 최대 빈도값, 총 빈도수, 각 조합에 대한 빈도 요약을 제공

    1
    
      summary(sex_edu) # 성별(sex)과 학력(edu)의 교차표(sex_edu)에 대한 요약 통계 출력
    

    image.png

그래프 그리기

막대 그림 및 원 그림

  • 교육(edu) 변수의 막대 그림 및 원 그림

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
      edu_freq = table(ex8$edu)  # 학력(edu) 변수의 빈도를 계산하여 edu_freq에 저장
      edu_freq # 결과(빈도수) 출력
      rownames(edu_freq) = c("중졸이하", "고졸", "대졸이상")
        
      barplot(edu_freq)  # 막대 그래프 생성
      title("교육정도 막대그림")  # 막대 그래프 제목 추가
        
      pie(edu_freq)  # 원형 그래프 생성
      title("교육정도 원그림") # 원형 그래프 제목 추가
      # pie(edu_freq, main="교육정도 원그림") # pie 함수에서 바로 main 파라미터로 제목을 설정 가능
    

    image.png

    image.png

    image.png

성별 구분 막대 그림

  • 성별 구분 교육(edu) 변수의 막대 그림
1
2
3
4
5
6
7
8
sex_edu = table(ex8$sex, ex8$edu) # 성별(sex)과 교육 수준(edu)의 빈도를 교차표 형태로 계산
sex_edu # 교차표 출력

colnames(sex_edu) = c("중졸이하", "고졸", "대졸이상") # 교차표 열 이름(학력 수준) 설정
rownames(sex_edu) = c("남", "녀") # 교차표 행 이름(성별) 설정

barplot(sex_edu) # 성별 및 학력 수준에 따른 빈도 막대 그래프 생성
barplot(sex_edu, main = "성별 교육정도 막대그림") # 그래프에 제목 추가

image.png

image.png

히스토그램, 줄기-잎 그림, 상자그림

  • 월 급여(salary) 변수의 히스토그램, 줄기-잎 그림, 성별에 따른 상자 그림

    1
    2
    3
    4
    5
    6
    
      hist(ex8$salary, nclass=4)
      stem(ex8$salary)
      par(mfrow=c(1,2))
      boxplot(ex8$salary~ex8$sex, main="상자그림")
      ex8$sex = factor(ex8$sex, levels=c(1:2), labels = c("남", "여"))
      boxplot(ex8$salary~ex8$sex, main="상자그림 2")
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
      # 히스토그램 생성
      hist(ex8$salary, nclass = 4) # ex8$salary 변수의 히스토그램 생성 (계급 개수 4로 설정)
        
      # 줄기-잎 그림 생성
      stem(ex8$salary) # ex8$salary 데이터의 줄기-잎 그림 출력
        
      # 그래프를 한 화면에 1행 2열로 배치
      par(mfrow = c(1, 2)) # 그래프를 한 화면에 두 개(1행 2열) 배치하도록 설정
        
      # 성별에 따라 급여(salary)의 분포를 나타내는 상자그림(boxplot) 생성
      boxplot(ex8$salary ~ ex8$sex, main = "상자그림") 
      # ex8$salary 변수를 ex8$sex(성별)에 따라 구분하여 상자그림 생성
        
      # 성별(sex) 변수를 의미 있는 라벨로 설정
      ex8$sex = factor(ex8$sex, levels = c(1:2), labels = c("남", "여")) 
      # 성별(sex) 데이터를 팩터로 변환하고 라벨(1 → "남", 2 → "여")을 설정
        
      # 성별 라벨을 적용한 후 다시 상자그림 생성
      boxplot(ex8$salary ~ ex8$sex, main = "상자그림 2") 
      # ex8$salary 변수를 변환된 ex8$sex(성별) 기준으로 상자그림 생성
    

    image.png

    image.png

    image.png

연속형 자료 그래프 : 줄기-잎 그림

  • 줄기-잎 그림(stem-and-leaf plot)
    • 분포의 대략적인 형태를 살펴보기 위하여 작성되는 그래프로 군집의 존재 여부, 집중도가 높은 구간, 대칭 성의 여부, 자료의 범위 및 산포, 특이 값의 존재 여부 등을 파악하는데 이용 됨
  • ex) 점수 자료: 54 57 55 23 51 64 90 51 52 43 15 10 82 74 54 78 37 73 52 48 41 33 52 30 41 51 18 39 46 28 53 44 46 56 28 58 29 58 67 35 25 38 61 53 23 73 69 47 41 45 77 56 89 28 54 99 10 43 35 24 21 23 67 14 53

    1
    2
    
      score = scan("D:/01_KNOU/2025년도 1학기/데이터 정보 처리 입문/dataintro/score.txt") # score.txt 파일에서 데이터 읽기
      stem(score) # 줄기-잎 그림 출력
    

    image.png

    1
    2
    
      ?stem # 줄기-잎 그림(stem 함수)에 대한 도움말 확인
      stem(score, scale = 2) # 줄기-잎 그림 출력, scale = 2로 그림의 크기를 확장
    

    image.png

연속 형 자료 그래프 : 상자 그림

1
2
3
4
score = scan("D:/01_KNOU/2025년도 1학기/데이터 정보 처리 입문/dataintro/score.txt") # score.txt 파일에서 데이터를 읽어와 'score'에 저장
stem(score) # 줄기-잎 그림 출력하여 데이터 분포 요약
summary(score) # score 데이터의 기초 통계량(최소값, 최대값, 평균, 중앙값 등) 출력
boxplot(score) # score 데이터의 상자그림 출력으로 데이터의 분포와 이상값(outliers) 확인

image.png

image.png

산점도 그리기

  • (age, salary) 산점도 그리기

    1
    2
    3
    4
    
      library(readxl) # Excel 파일을 읽어올 수 있는 readxl 패키지 로드
      ex8 = read_excel(path="D:/01_KNOU/2025년도 1학기/데이터 정보 처리 입문/dataintro/ex8-1.xlsx") # ex8-1.xlsx을 읽어서 ex8 데이터프레임으로 저장
      head(ex8, 3) # ex8 데이터프레임의 첫 3행 출력
      plot(ex8$age, ex8$salary, col = "BLUE", pch = 19) # 나이(age)와 급여(salary)의 산점도 출력 (파란색 점, pch=19로 채워진 점 표시)
    

    image.png

    image.png

  • 성별로 구분한 산점도 그리기

    1
    2
    3
    4
    5
    
      plot(ex8$age, ex8$salary, type = "n") # 빈 플롯 생성
      points(ex8$age[ex8$sex == 1], ex8$salary[ex8$sex == 1], pch = "M", col = "BLUE") # 남성 데이터 추가
      points(ex8$age[ex8$sex == 2], ex8$salary[ex8$sex == 2], pch = "F", col = "RED") # 여성 데이터 추가
      legend("bottomright", legend = c("Male", "Female"), pch = c("M", "F"), col = c("BLUE", "RED")) # 범례 추가
      legend(locator(1), legend = c("Male", "Female"), pch = c("M", "F"), col = c("BLUE", "RED")) # 마우스로 범례 위치 지정
    

    image.png

    image.png

R 연산

스칼라와 벡터 연산

  • 스칼라 연산

    1
    2
    3
    4
    5
    6
    7
    
      x = 4 # 변수 x에 값 4를 할당
      y = 4 * x + 7 # y는 4*x + 7로 계산
      y # y의 값을 출력
        
      x <- 4 # 변수 x에 값 4를 할당 (화살표 방식)
      y <- 4 * x + 7 # y는 4*x + 7로 계산
      y # y의 값을 출력
    

    image.png

  • 벡터 연산

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
      x = c(-10:10) # -10부터 10까지의 정수를 생성하여 x에 저장
      y = 4 * x + 7 # y는 x 값을 이용해 4*x + 7로 계산
      y # y 값을 출력
        
      x[3] # x의 세 번째 요소를 출력
      x[1:5] # x의 1번째부터 5번째 요소를 출력
        
      x1 = x[x < 0] # x 중에서 0보다 작은 값들만 추출하여 x1에 저장
      x1 # x1 값을 출력
        
      y = 4 * x1 + 7 # x1 값을 이용해 y를 계산 (4*x1 + 7)
      y # 새로운 y 값을 출력
    

    image.png

data frame

1
2
3
4
5
6
7
8
9
10
11
12
13
x = c('red', 'green', 'blue') # 색상을 나타내는 문자열 벡터 생성
y = c(1, 2, 3) # 숫자 벡터 y 생성
z = c(4, 5, 6) # 숫자 벡터 z 생성

dframe = data.frame(x, y, z) # x, y, z 벡터를 결합해 데이터프레임 생성
dframe # 데이터프레임 출력

dframe[1, 1] # 데이터프레임의 1행 1열 값 출력
dframe[1, 2] # 데이터프레임의 1행 2열 값 출력

names(dframe) # 데이터프레임의 열 이름(컬럼 이름) 출력
dframe$y # 데이터프레임의 y 열(벡터 형태) 출력
dframe[, 2] # 데이터프레임의 2번째 열 출력 (y와 동일)

image.png

seq 함수: 일련의 값을 갖는 객체를 생성

1
2
3
4
5
6
x_seq = seq(-pi, pi, 1)              # -π에서 π까지 1 간격으로 시퀀스 생성
x_seq                                # x_seq 출력
round(x_seq, 4)                      # x_seq 값을 소수점 4자리까지 반올림하여 출력

x1_seq = seq(-pi, pi, length = 10)   # -π에서 π까지 10개 값으로 균등 분할한 시퀀스 생성
x1_seq                               # x1_seq 출력

image.png

행렬 연산

  • 행렬 생성

    1
    2
    3
    
      x = c(1:12) # 1부터 12까지의 숫자를 가진 벡터 생성
      x = matrix(x, ncol = 4, byrow = T) # 벡터 x를 4개의 열로 가지는 행렬로 변환, 행 단위로 채움
      x # 행렬 x 출력
    

    image.png

  • 모든 원소 값이 동일한 상수인 행렬

    1
    2
    
      x = matrix(1, nrow = 4, ncol = 3) # 값 1로 채워진 4x3 행렬 생성
      x # 행렬 x 출력
    

    image.png

  • 서브 행렬 추출

    1
    2
    3
    4
    5
    6
    
      x = c(1:12) # 1에서 12까지의 숫자를 가진 벡터 생성
      x = matrix(x, ncol = 4, byrow = T) # 4개의 열로 구성된 행렬 생성 (행 단위로 채움)
      x # 행렬 x 출력
        
      x[, c(1:3)] # x의 1~3열만 선택해 출력
      x[c(1:3), -2] # x의 1~3행에서 두 번째 열을 제외하고 선택해 출력
    

    image.png

  • 행렬 연산 함수
    • ncol(x)
      • 열의 수
    • nrow(x)
      • 행의 수
    • t(x)
      • 전치 행렬
    • cbind(...)
      • 열을 더할 때 이용되는 함수
    • rbind(...)
      • 행을 더할 때 이용되는 함수
    • diag(x)
      • 대각 행렬
    • apply(x,m,fun)
      • 행 또는 열에 함수 적용
    • x %*% y
      • 두 행렬의 곱
    • solve(x)
      • 역행렬
  • 행렬의 곱 및 apply 함수 예

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
      x = c(1, 2, 3, 5, 6, 7) # 벡터 x 생성
      x = matrix(x, ncol = 3, byrow = T) # 3개의 열로 구성된 행렬로 변환 (행 우선 방식)
      x # 행렬 x 출력
        
      y <- c(1:4) # 벡터 y 생성 (1부터 4까지)
      y <- matrix(y, ncol = 2) # 2개의 열로 구성된 행렬로 변환 (기본적으로 열 우선 방식)
      y # 행렬 y 출력
        
      t(x) %*% y # x의 전치된 행렬과 y를 행렬 곱셈 수행
    

    image.png

    • t(x) %*% y

      ( C[i,j] ) 계산 예제 결과 값
      첫 번째 행(1, 5)과 첫 번째 열(1, 2)의 내적: ( 11 + 52 = 1 + 10 ) 11
      첫 번째 행(1, 5)과 두 번째 열(3, 4)의 내적: ( 13 + 54 = 3 + 20 ) 23
      두 번째 행(2, 6)과 첫 번째 열(1, 2)의 내적: ( 21 + 62 = 2 + 12 ) 14
      두 번째 행(2, 6)과 두 번째 열(3, 4)의 내적: ( 23 + 64 = 6 + 24 ) 30
      세 번째 행(3, 7)과 첫 번째 열(1, 2)의 내적: ( 31 + 72 = 3 + 14 ) 17
      세 번째 행(3, 7)과 두 번째 열(3, 4)의 내적: ( 33 + 74 = 9 + 28 ) 37
    1
    2
    
      apply(x, 1, mean) # x 행렬의 각 행(row)에 대해 평균을 계산
      apply(x, 2, mean) # x 행렬의 각 열(column)에 대해 평균을 계산
    

    image.png



연습 문제


  1. 그룹 변수인 성별(sex)의 값에 따라 변수 salary의 평균(mean)을 구하는 명령은 ?

    a. tapply(salary, sex, mean)

  2. 데이터 객체의 처음 6개의 케이스를 출력하고자 한다. R 명령은 ?

    1
    
     > ( b )(ex.data)
    

    a. head

  3. 다음과 같은 텍스트 파일을 읽어 들이는 R 명령은 ?

    1
    
     ex.data = ( a )("c:/data/example.txt", header=T)
    

    a. read.table 

  4. 데이터 객체 ex.data의 변수들을 직접 사용하고자 한다. 유용한 명령은?

    a. attach(ex.data)

  5. package xlsx를 인스톨하였다. 이를 가동 시키기 위한 명령은? 

    a. library(xlsx)

Contents

[파이썬 프로그래밍 기초] 12강 - 파일

[운영 체제] 12강 - 저장 장치 및 파일 관리