R

[혼자 공부하는 R 데이터분석] 4주차_데이터 수집, 관측, 시각화

섀싹 2024. 7. 29. 18:07

4-1. 데이터 수집하기

  • 데이터를 수집하는 방식 : 직접 vs 외부 데이터 수집
  • 가공을 거치지 않은 데이터 : 원시 데이터(=원시 자료)
  • View(데이터프레임 변수명) 함수로 조회 (= 데이터 뷰어) 
    • 반드시 첫 글자 대문자로 작성
    • 가공하지 않은 원시 데이터만 확인 가능

- 데이터 수집 방법

데이터 종류 사용법 추가 설명
직접 데이터 입력 변수명 <- c(값)  
TXT 파일 <- read.table("원시 데이터 경로", options)  데이터 프레임으로 저장됨,
header 기본값 False (변수명 임의지정)
데이터 경로 표현시 슬래시 사용

CSV 파일 <- read.csv("원시 데이터 경로", options) 데이터 프레임으로 저장됨,
header 기본값 TRUE
-> 원시 데이터 변수명 없을 시 임의로 지정됨
EXCEL install.packages('readxl')
library(readxl)

<- read_excel("원시데이터 경로", options)
데이터 프레임으로 저장됨,
header 기본값 TRUE
엑셀 여러 시트 중에 특정 시트 값을 가지고 오고 싶다면 options 에서 sheet = 2 이런 식으로 설정해주면 됨.
XML install.packages("XML")
library("XML")

<- xmlToDataFrame("원시 데이터 경로" options)
데이터 프레임으로 저장됨,
태그 명이 변수 명이 됨
JSON install.packages("jsonlite")
library(jsonlite)

<- fromJSON("원시 데이터 경로", options)
데이터 프레임으로 저장 안됨.
따라서 실행 결과 View 가 아닌 str() 함수로 데이터 구조 살펴봐야함.

 

- options

사용법 기능
encoding = "sth" R의 인코딩 설정
fileEncoding = "sth" 파일의 인코딩 설정
header = TRUE or FALSE 원시 데이터의 1행 변수명인지 아닌지 판단
col.names = c(~) or 다른 컬럼변수벡터
row.names = c(~) or 다른 행변수벡터
컬럼 이름 직접 할당
행 이름 직접 할당
skip = number 옵션에 지정한 특정 행까지 제외하고 이후 행부터 가져옴
nrows = number 몇개의 행을 불러올지 지정
sep = "sth" 데이터 구분자 지정하는 옵션

 

-손코딩

# 직접 데이터 입력하기

ID <- c(1, 2, 3, 4, 5)
ID

SEX <- c("F", "M", "F", "M", "F")
SEX

DATA <- data.frame(ID=ID, SEX=SEX)
View(DATA)

# 외부 데이터 가져오기 : TXT 파일
ex_data <- read.table("C:/Rstudy/data_ex.txt", encoding = "EUC-KR", fileEncoding = "UTF-8")
View(ex_data)

# header 넣어주기
ex_data1 <- read.table("C:/Rstudy/data_ex.txt", encoding = "EUC-KR", fileEncoding = "UTF-8", header = TRUE)
View(ex_data1)

# 컬럼명 만들어주기
varname <- c("ID", "SEX", "AGE", "AREA")
ex1_data <- read.table("C:/Rstudy/data_ex.txt", encoding = "EUC-KR", fileEncoding = "UTF-8", col.names = varname)
View(ex1_data)

# skip 옵션
ex_data2 <- read.table("C:/Rstudy/data_ex.txt", encoding = "EUC-KR", fileEncoding = "UTF-8",
                       header = TRUE, skip = 2)
View(ex_data2)

#nrows 옵션
ex_data3 <- read.table("C:/Rstudy/data_ex.txt", encoding = "EUC-KR", fileEncoding = "UTF-8",
                       header = TRUE, nrows = 7)
View(ex_data3)

#sep 옵션
ex_data4 <- read.table("C:/Rstudy/data_ex1.txt", encoding = "EUC-KR", fileEncoding = "UTF-8",
             header = TRUE, sep = ",")
View(ex_data4)

# 외부 데이터 가져오기 : csv 파일
ex_data <- read.csv("C:/Rstudy/data_ex.csv")
View(ex_data)

# 외부 데이터 가져오기 : excel 파일 
install.packages('readxl')
library(readxl)

excel_data_ex <- read_excel("C:/Rstudy/data_ex.xlsx")
View(excel_data_ex)

# 외부 데이터 가져오기 : XML
install.packages("XML")
library(XML)
xml_data <- xmlToDataFrame("C:/Rstudy/data_ex.xml")
View(xml_data)

# 외부 데이터 가져오기 : JSON 파일
install.packages("jsonlite")
library(jsonlite)
json_data <- fromJSON("C:/Rstudy/data_ex.json")
str(json_data)

 

 

4-2. 데이터 관측하기

 

- 데이터 관측 함수

데이터 관측 함수 기능
data() R에 내장된 데이터 세트 목록 확인
data("~~") 내장 데이터 세트 가져오기
str(변수명) 데이터 전체 구조 확인
데이터 행, 열, 칼럼 이름, 데이터 타입 등을 알 수 있음
ncol(변수명), nrow(변수명), dim(변수명) 데이터 프레임 열 개수 확인, 행 개수 확인, 행과 열 개수 확인
length(변수명) 벡터 데이터 개수 or 데이터 프레임 열 개수 or 해당 열 행 개수
ls(변수명) 컬럼명 확인
head(변수명, n=수량), tail(변수명, n=수량) 데이터 앞부분 확인(기본6개), 뒷부분 확인

 

- 기술 통계 함수

데이터 프레임의 특정 열 확인 시 데이터프레임명$변수명 의 형태로 작성

기술 통계 함수 기능
mean(변수명) 평균
이상치 영향 많이 받음
median(변수명) 중앙값
min(변수명) 최솟값
max(변수명) 최댓값
range(변수명) 범위 (최솟값과 최댓값)
quantile(변수명, probs=0~1) 분위수
var(변수명) 분산
sd(변수명) 표준편차
kurtosi(변수명) 첨도
사용하기 위해 아래 패키지 설치 요망
install.packages("psych")
library(psych)

첨도 > 0 : 정규 분포 대비 그래프 곡선 뾰족
첨소 = 0 : 정규 분포와 그래프 뾰족 동일
첨도 < 0 : 정규 분포 대비 그래프 곡선 완만
skew(변수명) 왜도
사용하기 위해 아래 패키지 설치 요망(첨도랑 같음)
install.packages("psych")
library(psych)

왜도 > 0 : 오른쪽 꼬리 가짐
왜도 = 0 : 중앙
왜도 < 0 : 왼쪽 꼬리 가짐
freq(변수명)

ex) freq_test <- freq(iris$Sepal.Length, plot=F)
빈도분석
사용하기 위해 아래 패키지 설치 요망
install.packages("descr")
library(descr)

 

- 손코딩

data("iris")
iris
str(iris)

ncol(iris)
nrow(iris)
dim(iris)
data <- c(1, 2, 3, 4, 5)
length(data)
length(iris)
length(iris$Species)
ls(iris)

head(iris)
tail(iris, n=3)

# 기술통계량

mean(iris$Sepal.Length)
median(iris$Sepal.Length)

min(iris$Sepal.Length)
max(iris$Sepal.Length)
range(iris$Sepal.Length)

quantile(iris$Sepal.Length)
quantile(iris$Sepal.Length, probs = 0.25)
quantile(iris$Sepal.Length, probs = 0.50)
quantile(iris$Sepal.Length, probs = 0.75)
quantile(iris$Sepal.Length, probs = 0.80) #제 0.8분위수 (하위 80퍼센트 지점의 값 출력)

var(iris$Sepal.Length)
sd(iris$Sepal.Length)

install.packages("psych")
library(psych)
kurtosi(iris$Sepal.Length)
skew(iris$Sepal.Length)

install.packages("descr")
library(descr)

freq_test <- freq(iris$Sepal.Length, plot=F)
freq_test

 

 

4-3. 데이터 탐색하기

 

- 시각화 함수

종류 사용법 상세 설명
막대 그래프 (barplot) - freq(변수명, plot=T, options)
- barplot(변수명, options)
   *table() 함수 같이 사용 필수
barplot 함수의 경우 table 함수 결과처럼 표 형태로 데이터가 구성되어 있을 때 변수별로 빈도를 표현 가능(freq 처럼은 불가)
상자 그림 (boxplot) boxplot(변수명, options) 데이터 분포 비교나 이상치 판단에 용이
히스토그램 (histogram) hist(변수명, options) 구간별 관측치 분포 상태 확인 용이
파이차트 (pie chart) pie(변수명, options)
  *table() 함수 같이 사용 필수
그림에 빈도수 같이 나옴  
줄기 잎 그림 stem(변수명, scale = 1, options) scale 옵션에 따라 데이터 분포를 다양하게 파악 가능. 숫자가 클 수록 더 세밀하게 볼수 있음. 기본값은 1
산점도 그리기(=산포도) 산점도 : plot(x, y)
산점도 행렬
- pairs(변수명)
- pairs.panels(변수명)
   *psych 라이브러리 필요
pairs.panels 가 pairs 만 쓰는 것보다 수치 등이 추가 되어 결과가 더 명확.

 

- 함수 옵션 

사용법 기능
ylim = c(y축 범위) 출력할 y 범위 지정
main = "그래프 제목" 그래프 제목 지정
xlab = "x축 제목" x축 제목 지정
ylab = "y축 제목" y축 제목 지정
names = c("컬럼 제목", ...) c() 함수를 사용해 벡터 형태로 컬럼 제목 지정
col = c("색상", ...) c() 함수를 사용해 벡터 형태로 그래프 색상 지정

 

- 어떤 그래프를 쓰는게 더 좋을지 고민될 때 참고할만한 사이트 

https://www.data-to-viz.com/

 

From data to Viz | Find the graphic you need

A classification of chart types based on their input data format.

www.data-to-viz.com

 

- 손코딩

# 막대 그래프 그리기
library(descr)
library(readxl)
exdata1 <- read_excel("C:/Rstudy/Sample1.xlsx")
exdata1

freq(exdata1$SEX, plot = T, main = '성별(barplot)')

dist_sex <- table(exdata1$SEX)
dist_sex
barplot(dist_sex)
barplot(dist_sex, ylim=c(0,14), main = "BARPLOT", xlab = "SEX", 
        ylab = "FREQUENCY", 
        names = c("FEMALE", "MALE"),
        col = c("pink", "navy"))

# 상자 그림 그리기
boxplot(exdata1$Y21_CNT, exdata1$Y20_CNT)
boxplot(exdata1$Y21_CNT, exdata1$Y20_CNT, 
        ylim = c(0, 60),
        main = "boxplot",
        names = c("21년건수", "20년건수"),
        col = c("green", "yellow"))

#히스토그램 그리기
hist(exdata1$AGE, xlim = c(0, 60), ylim = c(0, 7), main = "AGE분포")

#파이차트 그리기
data(mtcars)
x <- table(mtcars$gear)
pie(x)

# 줄기 잎 그림 그리기
x <- c(1, 2, 3, 4, 7, 8, 8, 5, 9, 6, 9)
stem(x)
stem(x, scale = 2)
stem(x, scale = 0.5)

# 산점도 그리기
data(iris)
plot(x = iris$Sepal.Length, y = iris$Petal.Width)
pairs(iris)

library(psych)
pairs.panels(iris)

 

4-4. 4주차 과제

1) 

 

2) 

상자 그림 그래프의 5가지 요약값

명칭 의미
최댓값 데이터의 가장 큰 값(가장 위쪽 수염)
수염 밖은 이상치
제 3사분위수 데이터의 상위 25프로 지점
데이터의 75프로가 이 값 보다 작다
중앙값 (제 2사분위수) 전체 데이터의 가운데.
박스 내부에 있는 가로선으로 표시됨
제 1사분위수 데이터의 하위 25프로 지점
데이터의 75프로가 이 값 보다 크다
최솟값 데이터의 가장 작은 값(가장 아래쪽 수염)
수염 밖은 이상치