wiki:hr:r_programming_guide
차이
문서의 선택한 두 판 사이의 차이를 보여줍니다.
| 양쪽 이전 판이전 판 | |||
| wiki:hr:r_programming_guide [2025/07/03 05:11] – syjang0803 | wiki:hr:r_programming_guide [알 수 없는 날짜] (현재) – 제거됨 - 바깥 편집 (알 수 없는 날짜) 127.0.0.1 | ||
|---|---|---|---|
| 줄 1: | 줄 1: | ||
| - | ====== R 프로그래밍 실무 가이드 ====== | ||
| - | **이 문서는 업무에서 R을 활용한 데이터 분석을 위한 실용적인 가이드입니다.** | ||
| - | |||
| - | |||
| - | ===== 🚀 R 시작하기 ===== | ||
| - | |||
| - | ==== R 설치 및 환경 설정 ==== | ||
| - | |||
| - | **R 설치** | ||
| - | * [[https:// | ||
| - | * Windows, macOS, Linux 지원 | ||
| - | * 최신 안정 버전 권장 | ||
| - | |||
| - | **RStudio 설치** | ||
| - | * [[https:// | ||
| - | * 통합 개발 환경 (IDE) | ||
| - | * 코드 편집, 시각화, 패키지 관리 등 편리한 기능 제공 | ||
| - | |||
| - | **필수 패키지 설치** | ||
| - | < | ||
| - | # 데이터 처리 | ||
| - | install.packages(" | ||
| - | install.packages(" | ||
| - | install.packages(" | ||
| - | |||
| - | # 시각화 | ||
| - | install.packages(" | ||
| - | install.packages(" | ||
| - | |||
| - | # 통계 분석 | ||
| - | install.packages(" | ||
| - | install.packages(" | ||
| - | |||
| - | # 머신러닝 | ||
| - | install.packages(" | ||
| - | install.packages(" | ||
| - | </ | ||
| - | |||
| - | ---- | ||
| - | |||
| - | ===== 📊 데이터 불러오기 및 전처리 ===== | ||
| - | |||
| - | ==== 데이터 불러오기 ==== | ||
| - | |||
| - | **CSV 파일 읽기** | ||
| - | < | ||
| - | # 기본 방법 | ||
| - | data <- read.csv(" | ||
| - | |||
| - | # readr 패키지 사용 (더 빠름) | ||
| - | library(readr) | ||
| - | data <- read_csv(" | ||
| - | |||
| - | # 엑셀 파일 읽기 | ||
| - | library(readxl) | ||
| - | data <- read_excel(" | ||
| - | </ | ||
| - | |||
| - | **데이터베이스 연결** | ||
| - | < | ||
| - | # MySQL 연결 | ||
| - | library(RMySQL) | ||
| - | con <- dbConnect(MySQL(), | ||
| - | host = " | ||
| - | | ||
| - | user = " | ||
| - | | ||
| - | data <- dbGetQuery(con, | ||
| - | </ | ||
| - | |||
| - | ==== 데이터 탐색 ==== | ||
| - | |||
| - | **기본 정보 확인** | ||
| - | < | ||
| - | # 데이터 구조 확인 | ||
| - | 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, | ||
| - | |||
| - | # 중앙값으로 대체 | ||
| - | data$column[is.na(data$column)] <- median(data$column, | ||
| - | </ | ||
| - | |||
| - | ==== 이상치 탐지 및 처리 ==== | ||
| - | |||
| - | **IQR 방법으로 이상치 탐지** | ||
| - | < | ||
| - | # 박스플롯으로 시각적 확인 | ||
| - | boxplot(data$column) | ||
| - | |||
| - | # IQR 계산 | ||
| - | Q1 <- quantile(data$column, | ||
| - | Q3 <- quantile(data$column, | ||
| - | 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, | ||
| - | median(data$column, | ||
| - | sd(data$column, | ||
| - | var(data$column, | ||
| - | |||
| - | # 사분위수 | ||
| - | quantile(data$column, | ||
| - | |||
| - | # psych 패키지로 상세 통계 | ||
| - | library(psych) | ||
| - | describe(data) | ||
| - | </ | ||
| - | |||
| - | **그룹별 통계** | ||
| - | < | ||
| - | # dplyr 패키지 사용 | ||
| - | library(dplyr) | ||
| - | |||
| - | data %>% | ||
| - | group_by(group_column) %>% | ||
| - | summarise( | ||
| - | mean_value = mean(value_column, | ||
| - | sd_value = sd(value_column, | ||
| - | count = n() | ||
| - | ) | ||
| - | </ | ||
| - | |||
| - | ==== 데이터 시각화 ==== | ||
| - | |||
| - | **ggplot2 기본 사용법** | ||
| - | < | ||
| - | library(ggplot2) | ||
| - | |||
| - | # 히스토그램 | ||
| - | ggplot(data, | ||
| - | geom_histogram(bins = 30, fill = " | ||
| - | labs(title = " | ||
| - | theme_minimal() | ||
| - | |||
| - | # 박스플롯 | ||
| - | ggplot(data, | ||
| - | geom_boxplot(fill = " | ||
| - | labs(title = " | ||
| - | theme_minimal() | ||
| - | |||
| - | # 산점도 | ||
| - | ggplot(data, | ||
| - | geom_point(alpha = 0.6) + | ||
| - | geom_smooth(method = " | ||
| - | labs(title = " | ||
| - | theme_minimal() | ||
| - | </ | ||
| - | |||
| - | **상관관계 분석** | ||
| - | < | ||
| - | # 상관계수 계산 | ||
| - | cor(data$column1, | ||
| - | |||
| - | # 상관관계 행렬 | ||
| - | cor_matrix <- cor(data[, c(" | ||
| - | |||
| - | # 상관관계 히트맵 | ||
| - | library(corrplot) | ||
| - | corrplot(cor_matrix, | ||
| - | </ | ||
| - | |||
| - | ---- | ||
| - | |||
| - | ===== 🔍 통계 검정 ===== | ||
| - | |||
| - | ==== t-검정 ==== | ||
| - | |||
| - | **독립표본 t-검정** | ||
| - | < | ||
| - | # 두 그룹 간 평균 비교 | ||
| - | t_test_result <- t.test(value ~ group, data = data) | ||
| - | print(t_test_result) | ||
| - | |||
| - | # 결과 해석 | ||
| - | cat(" | ||
| - | cat(" | ||
| - | cat(" | ||
| - | </ | ||
| - | |||
| - | **대응표본 t-검정** | ||
| - | < | ||
| - | # 같은 대상의 전후 비교 | ||
| - | t_test_paired <- t.test(data$before, | ||
| - | print(t_test_paired) | ||
| - | </ | ||
| - | |||
| - | ==== 분산분석 (ANOVA) ==== | ||
| - | |||
| - | **일원배치 분산분석** | ||
| - | < | ||
| - | # 세 그룹 이상의 평균 비교 | ||
| - | anova_result <- aov(value ~ group, data = data) | ||
| - | summary(anova_result) | ||
| - | |||
| - | # 사후검정 (Tukey HSD) | ||
| - | library(multcomp) | ||
| - | tukey_result <- glht(anova_result, | ||
| - | summary(tukey_result) | ||
| - | </ | ||
| - | |||
| - | ==== 카이제곱 검정 ==== | ||
| - | |||
| - | **독립성 검정** | ||
| - | < | ||
| - | # 교차표 생성 | ||
| - | contingency_table <- table(data$row_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, | ||
| - | </ | ||
| - | |||
| - | ==== 회귀진단 ==== | ||
| - | |||
| - | **잔차 분석** | ||
| - | < | ||
| - | # 잔차 플롯 | ||
| - | par(mfrow = c(2, 2)) | ||
| - | plot(model) | ||
| - | |||
| - | # 정규성 검정 | ||
| - | shapiro.test(residuals(model)) | ||
| - | |||
| - | # 다중공선성 검정 | ||
| - | library(car) | ||
| - | vif(model_multiple) | ||
| - | </ | ||
| - | |||
| - | ---- | ||
| - | |||
| - | ===== 🤖 머신러닝 ===== | ||
| - | |||
| - | ==== 분류 ==== | ||
| - | |||
| - | **로지스틱 회귀** | ||
| - | < | ||
| - | # 이진 분류 | ||
| - | logistic_model <- glm(target ~ ., data = train_data, family = " | ||
| - | summary(logistic_model) | ||
| - | |||
| - | # 예측 | ||
| - | predictions <- predict(logistic_model, | ||
| - | predicted_class <- ifelse(predictions > 0.5, 1, 0) | ||
| - | </ | ||
| - | |||
| - | **랜덤 포레스트** | ||
| - | < | ||
| - | library(randomForest) | ||
| - | |||
| - | # 모델 학습 | ||
| - | rf_model <- randomForest(target ~ ., data = train_data, ntree = 500) | ||
| - | |||
| - | # 예측 | ||
| - | rf_predictions <- predict(rf_model, | ||
| - | |||
| - | # 변수 중요도 | ||
| - | importance(rf_model) | ||
| - | varImpPlot(rf_model) | ||
| - | </ | ||
| - | |||
| - | ==== 클러스터링 ==== | ||
| - | |||
| - | **K-means 클러스터링** | ||
| - | < | ||
| - | # 데이터 정규화 | ||
| - | scaled_data <- scale(data[, | ||
| - | |||
| - | # K-means 실행 | ||
| - | kmeans_result <- kmeans(scaled_data, | ||
| - | |||
| - | # 결과 확인 | ||
| - | kmeans_result$cluster | ||
| - | kmeans_result$centers | ||
| - | </ | ||
| - | |||
| - | ---- | ||
| - | |||
| - | ===== 📋 실무 프로젝트 예제 ===== | ||
| - | |||
| - | ==== 고객 만족도 분석 ==== | ||
| - | |||
| - | **데이터 불러오기 및 전처리** | ||
| - | < | ||
| - | # 데이터 불러오기 | ||
| - | satisfaction_data <- read_csv(" | ||
| - | |||
| - | # 결측치 확인 | ||
| - | colSums(is.na(satisfaction_data)) | ||
| - | |||
| - | # 기술통계 | ||
| - | summary(satisfaction_data) | ||
| - | |||
| - | # 만족도 점수 분포 | ||
| - | ggplot(satisfaction_data, | ||
| - | geom_histogram(bins = 20, fill = " | ||
| - | labs(title = " | ||
| - | theme_minimal() | ||
| - | </ | ||
| - | |||
| - | **그룹별 분석** | ||
| - | < | ||
| - | # 연령대별 만족도 비교 | ||
| - | age_satisfaction <- satisfaction_data %>% | ||
| - | group_by(age_group) %>% | ||
| - | summarise( | ||
| - | mean_satisfaction = mean(satisfaction_score, | ||
| - | sd_satisfaction = sd(satisfaction_score, | ||
| - | count = n() | ||
| - | ) | ||
| - | |||
| - | # 시각화 | ||
| - | ggplot(age_satisfaction, | ||
| - | geom_bar(stat = " | ||
| - | geom_errorbar(aes(ymin = mean_satisfaction - sd_satisfaction, | ||
| - | ymax = mean_satisfaction + sd_satisfaction), | ||
| - | labs(title = " | ||
| - | 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, | ||
| - | result <- data %>% | ||
| - | group_by(!!sym(group_var)) %>% | ||
| - | summarise( | ||
| - | mean_score = mean(satisfaction_score, | ||
| - | sd_score = sd(satisfaction_score, | ||
| - | count = n() | ||
| - | ) | ||
| - | return(result) | ||
| - | } | ||
| - | |||
| - | # 함수 사용 | ||
| - | age_analysis <- analyze_satisfaction(satisfaction_data, | ||
| - | </ | ||
| - | |||
| - | **결과 저장** | ||
| - | < | ||
| - | # 결과를 파일로 저장 | ||
| - | write.csv(analysis_result, | ||
| - | |||
| - | # 그래프 저장 | ||
| - | ggsave(" | ||
| - | </ | ||
| - | |||
| - | ==== 성능 최적화 ==== | ||
| - | |||
| - | **대용량 데이터 처리** | ||
| - | < | ||
| - | # data.table 패키지 사용 (더 빠름) | ||
| - | library(data.table) | ||
| - | dt <- as.data.table(data) | ||
| - | |||
| - | # 병렬 처리 | ||
| - | library(parallel) | ||
| - | library(doParallel) | ||
| - | cl <- makeCluster(detectCores() - 1) | ||
| - | registerDoParallel(cl) | ||
| - | </ | ||
| - | |||
| - | ---- | ||
| - | |||
| - | ===== 📚 학습 리소스 ===== | ||
| - | |||
| - | **온라인 강의** | ||
| - | * Coursera: "R Programming" | ||
| - | * edX: " | ||
| - | * DataCamp: R 트랙 | ||
| - | |||
| - | **도서** | ||
| - | * "R을 이용한 데이터 분석" | ||
| - | * "R Cookbook" | ||
| - | * " | ||
| - | |||
| - | **커뮤니티** | ||
| - | * Stack Overflow: R 태그 | ||
| - | * R-bloggers: R 관련 블로그 모음 | ||
| - | * 한국 R 사용자 그룹 | ||
| - | |||
| - | ---- | ||
| - | |||
| - | ===== 🔗 관련 문서 ===== | ||
| - | |||
| - | * [[wiki: | ||
| - | * [[wiki: | ||
| - | * [[wiki: | ||
| - | |||
| - | ---- | ||
| - | |||
| - | > **💡 팁**: R은 처음에는 어려워 보이지만, | ||
wiki/hr/r_programming_guide.1751519509.txt.gz · 마지막으로 수정됨: (바깥 편집)
