wiki:hr:r_programming_guide
차이
문서의 선택한 두 판 사이의 차이를 보여줍니다.
다음 판 | 이전 판 | ||
wiki:hr:r_programming_guide [2025/07/03 05:08] – 만듦 - 바깥 편집 127.0.0.1 | 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.1751519284.txt.gz · 마지막으로 수정됨: (바깥 편집)