본문 바로가기
Study Log/ADP

[ADP 필기 요약]_4과목 데이터 분석_②

by Maker_Potato 2026. 3. 2.

1. 입력과 출력

1-1. 데이터 분석 과정

입력(Input) → 전처리/재구성(Handling) → 출력(Output)

  • 입력: 분석 목적에 맞게 “설계된 형태”로 데이터를 정확히 가져오기
  • 핸들링: 분석 가능한 구조로 재정리(결측/형변환/조인/집계 등)
  • 출력: 결과를 보고서/그래프/파일로 “해석 가능한 형태”로 뽑기

1-2. R에서 가능한 입력/출력의 범위

  • CSV/TSV 같은 텍스트 데이터
  • DB에서 뽑은 데이터
  • 다른 통계 프로그램 결과물

자릿수(출력 포맷) 컨트롤

options(digits = 10) # 출력 유효숫자 늘리기
getOption("digits") # 현재 설정 확인

 

문자열을 파일로 저장하고 싶을 때

cat("저장할 문자열", file = "result.txt")
 

파일 경로에서 자주 터지는 포인트

read.csv("C:/data/sample.csv")
read.csv("C:\\data\\sample.csv")

 

1-3. 외부 파일 입력/출력

고정자리 변수 파일 read.fwf(”파일명”, width=c(w1, w2, …))
구분자 변수 파일 read.table(”파일명”, sep=”구분자”)
csv 파일 읽기 read.csv(”파일명”, header=T) # 1행이 변수인 경우 : header = T
csv 파일 출력 write.csv(데이터프레임, “파일명”)

1-4. 웹/서버에서 데이터 읽어오기

파일 다운로드 read.csv(”주소.csv”)
ftp에서 파일 다운로드 read.csv(”ftp://주소.csv”)
html에서 테이블 readHTMLTable(”url”)

2. 데이터 구조와 데이터 프레임

2-1. 데이터 구조 3대장 비교

특징 벡터 리스트 데이터프레임
원소 자료형 동질적
(전부숫자/전부문자)
이질적 이질적
원소를 위치로 인덱싱 가능 가능 가능
인덱싱으로 여러 개 원소로 구성된 하위 데이터 생성 가능 가능 가능
원소들에 이름 부여 가능 가능 가능

2-2. 데이터프레임

  • 데이터프레임은 “표” 형태
  • 각 열(column)은 벡터 또는 요인(factor)
  • 모든 열의 길이는 동일
  • 열마다 자료형이 달라도 됨(숫자/문자/범주 혼합 가능)

2-3. 그 밖의 데이터 구조

  • 스칼라(Scalar): R에서는 원소 1개짜리 벡터로 취급
  • 행렬(Matrix): 차원을 가진 벡터(텍스트 마이닝, SNA에서 많이 씀)
  • 배열(Array): 행렬의 n차원 확장
  • 요인(Factor): 범주형 변수(레벨/그룹), 집단 분석에 필수

2-4. 벡터/리스트/행렬 다루기에서 많이 나오는 개념

 

1) 재활용 규칙

길이가 다른 벡터끼리 연산하면 짧은 벡터가 반복 재사용됩니다.

c(1,2,3,4) + c(10,20) # 10,20,10,20 으로 반복
 

 

2) 리스트 원소 선택

  • L[[n]] : 원소 자체
  • L[n] : 리스트 형태로 반환
  • L$name / L[["name"]] : 이름으로 선택

3) 행렬 만들기/차원 지정

dim(vec) <- c(2, 3) # 벡터를 2x3 형태로
rownames(m) <- c("row1","row2")
colnames(m) <- c("c1","c2","c3")

3. 데이터프레임 실무 기능 모음

3-1. 생성/결합

df <- data.frame(v1, v2, v3)

new <- data.frame(a=1, b=2, c=3, d="a") # 숫자+문자 같이 가능

rbind(df1, df2) # 행 결합
cbind(df1, df2) # 열 결합
 

대용량 틀 먼저 만들기(미리 할당)

N <- 1000000
dtfm <- data.frame(
dosage = numeric(N),
lab = character(N),
response = numeric(N)
)

 

3-2. 조회/필터링

dfrm[dfrm$gender == "m", ] # 남성만

dfrm[dfrm$var1 > 4 & dfrm$var2 > 5, c("var3","var4")] #데이터셋의 변수1과 변수2의 조건에 만족하는 레코드의 변수3과 변수 4만을 조회

dfrm[grep("문자", dfrm$var1, ignore.case = TRUE), c("var2","var3")] #데이터셋의 변수1 내 “문자”가 들어 있는 케이스들의 변수2, 변수3값을 조회

subset(dfrm, select = c(var3, var4), subset = (var1 > 4 & var2 > 5)) #데이터셋의 특정변수의 값이 조건에 맞는 변수셋 조회, subset은 벡터와 리스트에서도 선택 가능

3-3. 병합(조인)

merge(df1, df2, by = "공통키")
merge(df1, df2, by = "공통키", all = TRUE) # outer join 느낌

3-4. 결측치 처리 / 컬럼명

colnames(df)
colnames(df) <- newnames

NA_clean <- na.omit(df)
 
 

4. 데이터 구조 변경

  • 벡터 → 리스트: as.list(vec)
  • 리스트 → 벡터: unlist(lst)
  • 데이터프레임 → 리스트: as.list(df)
  • 데이터프레임 → 행렬: as.matrix(df)
  • 행렬 → 데이터프레임: as.data.frame(mat)

예시로 감 잡기:

as.data.frame(vec) # 1열 DF
as.data.frame(rbind(vec)) # 1행 DF

5. 데이터 변형: split/apply 계열만 잡아도 생산성 폭발

5-1. 집단으로 나누기(split)

v <- c(24,23,52,46,75,25)
f <- factor(c("A","A","B","B","C","A"))

groups <- split(v, f)

 

5-2. 함수 적용 “3총사”

  • 리스트: lapply(), sapply()
  • 행렬/배열: apply()
lapply(lst, func) # 리스트로 반환
sapply(lst, func) # 벡터/행렬로 단순화 반환

apply(mat, 1, func) # 행 기준
apply(mat, 2, func) # 열 기준

 

5-3. 집단별 집계(tapply, by)

tapply(vec, fac, mean)
by(dfm, fac, summary)
 

5-4. 여러 입력에 병렬 적용(mapply)

mapply(func, vec1, vec2, vec3) #벡터
mapply(func, lst1, lst2, lst3) #리스트
 
 

6. 문자열 다루기

  • 문자열 길이: nchar("문자열")
  • 벡터 길이: length(vec)
  • 문자열 연결: paste("단어", "문장", scalar)
  • 부분 문자열: substr("문자열", start, stop)
  • 분리: strsplit("a,b,c", ",")
  • 치환: sub(), gsub()

날짜 처리

as.Date("2014-12-25")
as.Date("12/25/2014", format = "%m/%d/%Y")

format(Sys.Date(), format = "%m/%d/%Y")
 

format 주요 코드

  • %b 축약 월(Jan), %B 전체 월(January)
  • %d 일(2자리), %m 월(2자리)
  • %y 연(2자리), %Y 연(4자리)

마지막: 실무에서 “입력/구조”로 사고 나는 TOP 3

  1. 경로에 \ 써서 파일 못 읽음 → / 또는 \\ 쓰기
  2. 조건식에 = 써서 필터가 이상함 → 비교는 ==
  3. 데이터프레임/리스트 인덱싱 헷갈림 → [[ ]]는 원소, [ ]는 묶음