wiki:hr:r_programming_guide
문서의 이전 판입니다!
목차
R 프로그래밍 실무 가이드
이 문서는 업무에서 R을 활용한 데이터 분석을 위한 실용적인 가이드입니다.
🚀 R 시작하기
R 설치 및 환경 설정
R 설치
- CRAN 공식 사이트에서 다운로드
- Windows, macOS, Linux 지원
- 최신 안정 버전 권장
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 · 마지막으로 수정됨: (바깥 편집)