사용자 도구

사이트 도구


wiki:hr:r_programming_guide

문서의 이전 판입니다!


R 프로그래밍 실무 가이드

이 문서는 업무에서 R을 활용한 데이터 분석을 위한 실용적인 가이드입니다.


🚀 R 시작하기

R 설치 및 환경 설정

R 설치

RStudio 설치

  • RStudio 공식 사이트에서 다운로드
  • 통합 개발 환경 (IDE)
  • 코드 편집, 시각화, 패키지 관리 등 편리한 기능 제공

필수 패키지 설치

# 데이터 처리
install.packages("dplyr")
install.packages("tidyr")
install.packages("readr")

# 시각화
install.packages("ggplot2")
install.packages("plotly")

# 통계 분석
install.packages("car")
install.packages("psych")

# 머신러닝
install.packages("caret")
install.packages("randomForest")

📊 데이터 불러오기 및 전처리

데이터 불러오기

CSV 파일 읽기

# 기본 방법
data <- read.csv("data.csv")

# readr 패키지 사용 (더 빠름)
library(readr)
data <- read_csv("data.csv")

# 엑셀 파일 읽기
library(readxl)
data <- read_excel("data.xlsx", sheet = 1)

데이터베이스 연결

# MySQL 연결
library(RMySQL)
con <- dbConnect(MySQL(), 
                 host = "localhost",
                 dbname = "database_name",
                 user = "username",
                 password = "password")
data <- dbGetQuery(con, "SELECT * FROM table_name")

데이터 탐색

기본 정보 확인

# 데이터 구조 확인
str(data)
dim(data)
head(data)
tail(data)

# 요약 통계
summary(data)

# 결측치 확인
colSums(is.na(data))

데이터 타입 변환

# 문자형을 숫자형으로
data$column <- as.numeric(data$column)

# 숫자형을 문자형으로
data$column <- as.character(data$column)

# 문자형을 날짜형으로
library(lubridate)
data$date <- ymd(data$date)

🔧 데이터 전처리

결측치 처리

결측치 확인 및 처리

# 결측치 개수 확인
sum(is.na(data$column))

# 결측치 제거
data_clean <- na.omit(data)

# 평균으로 대체
data$column[is.na(data$column)] <- mean(data$column, na.rm = TRUE)

# 중앙값으로 대체
data$column[is.na(data$column)] <- median(data$column, na.rm = TRUE)

이상치 탐지 및 처리

IQR 방법으로 이상치 탐지

# 박스플롯으로 시각적 확인
boxplot(data$column)

# IQR 계산
Q1 <- quantile(data$column, 0.25, na.rm = TRUE)
Q3 <- quantile(data$column, 0.75, na.rm = TRUE)
IQR <- Q3 - Q1

# 이상치 경계
lower_bound <- Q1 - 1.5 * IQR
upper_bound <- Q3 + 1.5 * IQR

# 이상치 제거
data_clean <- data[data$column >= lower_bound & data$column <= upper_bound, ]

Z-score 방법

# Z-score 계산
z_scores <- scale(data$column)

# 절댓값이 3 이상인 경우 이상치로 간주
outliers <- abs(z_scores) > 3
data_clean <- data[!outliers, ]

📈 기술통계 및 시각화

기술통계

기본 통계량

# 기술통계
mean(data$column, na.rm = TRUE)
median(data$column, na.rm = TRUE)
sd(data$column, na.rm = TRUE)
var(data$column, na.rm = TRUE)

# 사분위수
quantile(data$column, probs = c(0.25, 0.5, 0.75), na.rm = TRUE)

# psych 패키지로 상세 통계
library(psych)
describe(data)

그룹별 통계

# dplyr 패키지 사용
library(dplyr)

data %>%
  group_by(group_column) %>%
  summarise(
    mean_value = mean(value_column, na.rm = TRUE),
    sd_value = sd(value_column, na.rm = TRUE),
    count = n()
  )

데이터 시각화

ggplot2 기본 사용법

library(ggplot2)

# 히스토그램
ggplot(data, aes(x = column)) +
  geom_histogram(bins = 30, fill = "steelblue", alpha = 0.7) +
  labs(title = "히스토그램", x = "값", y = "빈도") +
  theme_minimal()

# 박스플롯
ggplot(data, aes(x = group, y = value)) +
  geom_boxplot(fill = "lightblue") +
  labs(title = "박스플롯", x = "그룹", y = "값") +
  theme_minimal()

# 산점도
ggplot(data, aes(x = x_column, y = y_column)) +
  geom_point(alpha = 0.6) +
  geom_smooth(method = "lm", se = TRUE) +
  labs(title = "산점도", x = "X", y = "Y") +
  theme_minimal()

상관관계 분석

# 상관계수 계산
cor(data$column1, data$column2, use = "complete.obs")

# 상관관계 행렬
cor_matrix <- cor(data[, c("col1", "col2", "col3")], use = "complete.obs")

# 상관관계 히트맵
library(corrplot)
corrplot(cor_matrix, method = "color", type = "upper")

🔍 통계 검정

t-검정

독립표본 t-검정

# 두 그룹 간 평균 비교
t_test_result <- t.test(value ~ group, data = data)
print(t_test_result)

# 결과 해석
cat("t-통계량:", t_test_result$statistic, "\n")
cat("p-value:", t_test_result$p.value, "\n")
cat("신뢰구간:", t_test_result$conf.int, "\n")

대응표본 t-검정

# 같은 대상의 전후 비교
t_test_paired <- t.test(data$before, data$after, paired = TRUE)
print(t_test_paired)

분산분석 (ANOVA)

일원배치 분산분석

# 세 그룹 이상의 평균 비교
anova_result <- aov(value ~ group, data = data)
summary(anova_result)

# 사후검정 (Tukey HSD)
library(multcomp)
tukey_result <- glht(anova_result, linfct = mcp(group = "Tukey"))
summary(tukey_result)

카이제곱 검정

독립성 검정

# 교차표 생성
contingency_table <- table(data$row_var, data$col_var)

# 카이제곱 검정
chi_test <- chisq.test(contingency_table)
print(chi_test)

📊 회귀분석

선형회귀

단순선형회귀

# 모델 적합
model <- lm(y ~ x, data = data)

# 모델 요약
summary(model)

# 회귀계수
coef(model)

# R² 값
summary(model)$r.squared

# 잔차 확인
residuals(model)

다중선형회귀

# 여러 독립변수
model_multiple <- lm(y ~ x1 + x2 + x3, data = data)
summary(model_multiple)

# 변수 선택 (단계적 회귀)
step_model <- step(model_multiple, direction = "both")

회귀진단

잔차 분석

# 잔차 플롯
par(mfrow = c(2, 2))
plot(model)

# 정규성 검정
shapiro.test(residuals(model))

# 다중공선성 검정
library(car)
vif(model_multiple)

🤖 머신러닝

분류

로지스틱 회귀

# 이진 분류
logistic_model <- glm(target ~ ., data = train_data, family = "binomial")
summary(logistic_model)

# 예측
predictions <- predict(logistic_model, newdata = test_data, type = "response")
predicted_class <- ifelse(predictions > 0.5, 1, 0)

랜덤 포레스트

library(randomForest)

# 모델 학습
rf_model <- randomForest(target ~ ., data = train_data, ntree = 500)

# 예측
rf_predictions <- predict(rf_model, newdata = test_data)

# 변수 중요도
importance(rf_model)
varImpPlot(rf_model)

클러스터링

K-means 클러스터링

# 데이터 정규화
scaled_data <- scale(data[, c("col1", "col2", "col3")])

# K-means 실행
kmeans_result <- kmeans(scaled_data, centers = 3, nstart = 25)

# 결과 확인
kmeans_result$cluster
kmeans_result$centers

📋 실무 프로젝트 예제

고객 만족도 분석

데이터 불러오기 및 전처리

# 데이터 불러오기
satisfaction_data <- read_csv("customer_satisfaction.csv")

# 결측치 확인
colSums(is.na(satisfaction_data))

# 기술통계
summary(satisfaction_data)

# 만족도 점수 분포
ggplot(satisfaction_data, aes(x = satisfaction_score)) +
  geom_histogram(bins = 20, fill = "steelblue", alpha = 0.7) +
  labs(title = "고객 만족도 점수 분포", x = "만족도 점수", y = "빈도") +
  theme_minimal()

그룹별 분석

# 연령대별 만족도 비교
age_satisfaction <- satisfaction_data %>%
  group_by(age_group) %>%
  summarise(
    mean_satisfaction = mean(satisfaction_score, na.rm = TRUE),
    sd_satisfaction = sd(satisfaction_score, na.rm = TRUE),
    count = n()
  )

# 시각화
ggplot(age_satisfaction, aes(x = age_group, y = mean_satisfaction)) +
  geom_bar(stat = "identity", fill = "lightblue") +
  geom_errorbar(aes(ymin = mean_satisfaction - sd_satisfaction,
                    ymax = mean_satisfaction + sd_satisfaction), width = 0.2) +
  labs(title = "연령대별 평균 만족도", x = "연령대", y = "평균 만족도") +
  theme_minimal()

통계 검정

# 연령대별 만족도 차이 검정 (ANOVA)
anova_result <- aov(satisfaction_score ~ age_group, data = satisfaction_data)
summary(anova_result)

# 성별 만족도 차이 검정 (t-검정)
t_test_result <- t.test(satisfaction_score ~ gender, data = satisfaction_data)
print(t_test_result)

💡 실무 팁

코드 효율성

함수 작성

# 재사용 가능한 함수 만들기
analyze_satisfaction <- function(data, group_var) {
  result <- data %>%
    group_by(!!sym(group_var)) %>%
    summarise(
      mean_score = mean(satisfaction_score, na.rm = TRUE),
      sd_score = sd(satisfaction_score, na.rm = TRUE),
      count = n()
    )
  return(result)
}

# 함수 사용
age_analysis <- analyze_satisfaction(satisfaction_data, "age_group")

결과 저장

# 결과를 파일로 저장
write.csv(analysis_result, "analysis_result.csv", row.names = FALSE)

# 그래프 저장
ggsave("satisfaction_plot.png", plot = my_plot, width = 10, height = 6)

성능 최적화

대용량 데이터 처리

# data.table 패키지 사용 (더 빠름)
library(data.table)
dt <- as.data.table(data)

# 병렬 처리
library(parallel)
library(doParallel)
cl <- makeCluster(detectCores() - 1)
registerDoParallel(cl)

📚 학습 리소스

온라인 강의

  • Coursera: “R Programming” by Johns Hopkins
  • edX: “Introduction to R Programming”
  • DataCamp: R 트랙

도서

  • “R을 이용한 데이터 분석” - 김진성
  • “R Cookbook” - Paul Teetor
  • “ggplot2: Elegant Graphics for Data Analysis” - Hadley Wickham

커뮤니티

  • Stack Overflow: R 태그
  • R-bloggers: R 관련 블로그 모음
  • 한국 R 사용자 그룹

🔗 관련 문서


💡 팁: R은 처음에는 어려워 보이지만, 기본 문법을 익히면 강력한 데이터 분석 도구가 됩니다. 작은 프로젝트부터 시작해서 점진적으로 복잡한 분석을 시도해보세요!
wiki/hr/r_programming_guide.1751519284.txt.gz · 마지막으로 수정됨: (바깥 편집)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki