ch0nny_log

[빅데이터분석] R _ 39. 데이터 시각화 5 (히스토그램 그래프 2) 본문

빅데이터 분석(with 아이티윌)/R

[빅데이터분석] R _ 39. 데이터 시각화 5 (히스토그램 그래프 2)

chonny 2024. 7. 3. 11:06
★ 점심시간 문제:  커미션을 받는 사원들의 월급의 분포를 산포도 그래프로 시각화 하세요 
# 데이터 불러오기
library(plotly)
setwd("c:\\data")
emp <- read.csv("emp.csv", header=TRUE)
emp

# 불러올 데이터 추출출
a<-emp[!is.na(emp$comm),c('ename','sal','comm')]
a

# 산포도 그래프 생성
fig <- plot_ly( data= a,
                x = ~ ename,
                y = ~sal,
                type='scatter',
                mode='markers',
                marker = list(color='red'))

# 그래프 레이아웃 설정
fig <- fig %>%
  layout(
         xaxis = list(title = 'ename'),
         yaxis = list(title = 'sal'))

# 그래프 출력
fig


# 필요한 라이브러리 로드
install.packages("modeest")

# 그래프 지우기 
graphics.off()  
library(modeest)  # R 에서 최빈값을 출력하고 사용함, mlv 함수 이용하여 최빈값 추출

# 1. 대칭분포 데이터 생성

# 아래의 rnrom 함수가 값을 랜덤하게 생성하기 때문에 모든 자리에서 동일하게
# 랜덤한 값을 생성하기 위해서 set.seed(123) 를 사용한것입니다.
set.seed(123)  

# 평균이 50이고 표준편차가 10인 정규분포로 구성된 1000개의 난수를 생성합니다.
data1 <- rnorm(1000, mean = 50, sd = 10)
data1
summary(data1)

# 2. 왼쪽으로 치우친 분포 데이터 생성
set.seed(123)
data2 <- c(rnorm(800, mean = 60, sd = 10), rnorm(200, mean = 30, sd = 5))

# 3. 오른쪽으로 치우친 분포 데이터 생성
set.seed(123)
data3 <- c(rnorm(800, mean = 40, sd = 10), rnorm(200, mean = 70, sd = 5))

# 평균값, 중앙값, 최빈값 계산 함수
calculate_stats <- function(data) {
  mean_value <- mean(data)
  median_value <- median(data)
  mode_value <- density(data)$x[which.max(density(data)$y)]
  return(list(mean = mean_value, median = median_value, mode = mode_value))
}

# 통계량 계산
stats1 <- calculate_stats(data1)
stats2 <- calculate_stats(data2)
stats3 <- calculate_stats(data3)

print("대칭분포 통계량:")
print(stats1)
print("왼쪽 치우친 분포 통계량:")
print(stats2)
print("오른쪽 치우친 분포 통계량:")
print(stats3)

# 1. 대칭분포 그래프 그리기
hist(data1, breaks=30, col="grey", border="white", prob=TRUE, ylim=c(0, 0.05), main="대칭분포", xlab="값", ylab="밀도")
lines(density(data1), col="red")  # 확률 밀도 함수 그래프
abline(v=stats1$mean, col="blue", lwd=2, lty=2)   # 평균값
abline(v=stats1$median, col="green", lwd=2, lty=2) # 중앙값
abline(v=stats1$mode, col="purple", lwd=2, lty=2)  # 최빈값

# 2. 왼쪽 치우친 분포 그래프 그리기
hist(data2, breaks=30, col="grey", border="white", prob=TRUE, ylim=c(0, 0.05), main="왼쪽 치우친 분포", xlab="값", ylab="밀도")
lines(density(data2), col="red")
abline(v=stats2$mean, col="blue", lwd=2, lty=2)
abline(v=stats2$median, col="green", lwd=2, lty=2)
abline(v=stats2$mode, col="purple", lwd=2, lty=2)

# 3. 오른쪽 치우친 분포 그래프 그리기
hist(data3, breaks=30, col="grey", border="white", prob=TRUE, ylim=c(0, 0.05), main="오른쪽 치우친 분포", xlab="값", ylab="밀도")
lines(density(data3), col="red")
abline(v=stats3$mean, col="blue", lwd=2, lty=2)
abline(v=stats3$median, col="green", lwd=2, lty=2)
abline(v=stats3$mode, col="purple", lwd=2, lty=2)

문제1. 중고차의 가격 데이터를 위의 코드에 적용하여 그래프로 시각화 하시오.

#1. 데이터 불러오기 
usedcars <- read.csv("usedcars.csv", header=T)
price <- usedcars$price


# 평균값, 중앙값, 최빈값 계산 함수
calculate_stats <- function(data) {
  mean_value <- mean(data)
  median_value <- median(data)
  mode_value <- density(data)$x[which.max(density(data)$y)]
  return(list(mean = mean_value, median = median_value, mode = mode_value))
}

# 통계량 계산
price_stats <- calculate_stats(price)


# 1. 대칭분포 그래프 그리기
hist(price, breaks=30, col="grey", border="white", prob=TRUE, main="대칭분포", xlab="값", ylab="밀도")
lines(density(price), col="red")  # 확률 밀도 함수 그래프
abline(v=price_stats$mean, col="blue", lwd=2, lty=2)   # 평균값
abline(v=price_stats$median, col="green", lwd=2, lty=2) # 중앙값
abline(v=price_stats$mode, col="purple", lwd=2, lty=2)  # 최빈값​

설명: 평균값, 중앙값, 최빈값이 모두 비슷한 위치에 있어 대칭적으로 분포되어있음, 굳이 따지면 왼쪽 꼬리 분포임
( 대부분 중고차 가격 15000달러)
문제2. 중고차 주행거리 데이터로 위의 그래프를 그리고 그래프를 해석하시오. 
#1. 데이터 불러오기 
usedcars <- read.csv("usedcars.csv", header=T)
mileage <- usedcars$mileage


# 평균값, 중앙값, 최빈값 계산 함수
calculate_stats <- function(data) {
  mean_value <- mean(data)
  median_value <- median(data)
  mode_value <- density(data)$x[which.max(density(data)$y)]
  return(list(mean = mean_value, median = median_value, mode = mode_value))
}

# 통계량 계산
mileage_stats <- calculate_stats(mileage)


# 1. 대칭분포 그래프 그리기
hist(mileage, breaks=30, col="grey", border="white", prob=TRUE, main="대칭분포", xlab="값", ylab="밀도")
lines(density(mileage), col="red")  # 확률 밀도 함수 그래프
abline(v=mileage_stats$mean, col="blue", lwd=2, lty=2)   # 평균값
abline(v=mileage_stats$median, col="green", lwd=2, lty=2) # 중앙값
abline(v=mileage_stats$mode, col="purple", lwd=2, lty=2)  # 최빈값​

설명: 
대부분의 차량이 비교적 짧은 주행거리에 집중되어있고 일부 높은 주행거리를 가지고 있는 형태를 보이고 있습니다. 오른쪽으로 꼬리를 가지고 있으면서 주행거리 데이터는 대부분 왼쪽으로 치우친 분포를 보이고 있습니다. 대부분의 중고차의 주행거리가 20000 ~ 60000 마일 범위에 주행거리를 가지고 있으며 이는 많은 중고차가 이 범위내에 있음을 의미합니다. 100000 마일 이상의 높은 주행거리를 가지는 중고차도 일부 존재하고 있음이 보입니다.
문제 3. 그래프 자동화 코드 4번째에 히스토그램 그래프를 추가하기 위해서 문제113번 코드를 hist_plot.R 이라는 이름으로 c 드라이브 밑에 data 폴더 밑에 저장하시오 !
#1. 데이터 불러오기 
usedcars <- read.csv("usedcars.csv", header=T)
mileage <- usedcars$mileage

# 평균값, 중앙값, 최빈값 계산 함수
calculate_stats <- function(data) {
  mean_value <- mean(data)
  median_value <- median(data)
  mode_value <- density(data)$x[which.max(density(data)$y)]
  return(list(mean = mean_value, median = median_value, mode = mode_value))
}

# 통계량 계산
mileage_stats <- calculate_stats(mileage)


# 1. 대칭분포 그래프 그리기
hist(mileage, breaks=30, col="grey", border="white", prob=TRUE, main="대칭분포", xlab="값", ylab="밀도")
lines(density(mileage), col="red")  # 확률 밀도 함수 그래프
abline(v=mileage_stats$mean, col="blue", lwd=2, lty=2)   # 평균값
abline(v=mileage_stats$median, col="green", lwd=2, lty=2) # 중앙값
abline(v=mileage_stats$mode, col="purple", lwd=2, lty=2)  # 최빈값​