2026/04/13 - 27일차 | ggplot2, 산점도, 선그래프, 확률과 확률실험, 이항분포
[ ggplot2 ]
- 다양한 시각화 기능을 가지고 있는 패키지
- 가장 대중적
- 데이터프레임 시각화(각 컬럼별 선그래프, 산점도 등등)
install.packages('ggplot2')
library(ggplot2)
1. 기본 구성
- ggplot : 데이터 정의
- aes : 변수(축) 정의
2. 시각화 함수
- geom_bar()
- geom_line()
- geom_point()
- geom_boxplot()
- geom_histogram()
3. 옵션 함수
- xlab(), ylab(), labs()
- theme()
[ 산점도 ]
ggplot(data = ,
mapping = aes(x=..., y=..., col=...)) +
geom_point() +
labs() +
theme()
예제) iris data 산점도
더보기

p1 <- c('#0000ff', '#ff00ff', '#00cc00')
ggplot(iris, aes(x = Sepal.Length,
y = Sepal.Width,
col = Species)) +
geom_point(size = 2) +
labs(title = '산점도', x = 'Sepal.Length', y = 'Sepal.Width') +
theme_classic()+
scale_color_manual(values = p1) +
theme(
plot.title = element_text(
size = 18,
color = "blue",
face = "bold",
family = "sans",
hjust = 0.5 # 가운데 정렬
),
axis.title.x = element_text(
size = 14,
color = "red",
face = "bold"
),
axis.title.y = element_text(
size = 14,
color = "green",
face = "bold"
))

[ 선그래프 ]
ggplot(iris, aes(x = Sepal.Length,
y = Sepal.Width,
col = Species)) +
geom_line() +
labs(title = '산점도', x = 'Sepal.Length', y = 'Sepal.Width') +
theme_classic()
예제) 시간대별 각 배달음식에 대한 통화건수 현황 선그래프
더보기

deli <- read.csv('delivery.csv', fileEncoding = 'cp949')
# 폰트설정
windowsFonts(
dongle = windowsFont("Dongle") # 다운로드한 폰트를 임의의 이름으로 등록
)
# 기초데이터 가공
library(plyr)
library(stringr)
total <- ddply(deli, .(시간대, 업종), summarise, 통화건수 = sum(통화건수))
total$업종 <- str_remove(total$업종, '음식점-')
# 시각화
p1 = c('#0000ff', '#ff00ff', '#00cc00', '#ff8000')
ggplot(total, aes(x = 시간대,
y = 통화건수,
col = 업종)) +
geom_line(size = 1.2) +
labs(title = '배달업종별 배달 현황 비교',
x = '시간대', y = '통화건수') +
scale_x_continuous(breaks = total$시간대) +
scale_y_continuous(breaks = seq(0, 90000, 10000)) +
theme_classic() +
scale_color_manual(values = p1) +
theme(
text = element_text(family = 'dongle'),
plot.title = element_text(size = 28, hjust = 0.5),
axis.title.x = element_text(size = 18),
axis.title.y = element_text(size = 18, angle = 0),
axis.text.x = element_text(size = 15),
axis.text.y = element_text(size = 15),
legend.title = element_text(size = 15, color = 'red', hjust = 0.5),
legend.text = element_text(size = 12),
legend.background = element_rect(color = 'black', fill = 'white'),
#legend.position = "top",
#legend.justification = "center",
plot.background = element_rect(fill = "#F8F9F8"),
panel.background = element_rect(fill = "#F8F9F8"))

[ 확률과 확률실험 ]
1. 확률실험
- 각 실험 반복
- 각 반복마다 일정한 확률
- 예상되는 결과 정해져있지만 실제값은 알수없는
2. 사건
- 확률실험을 통해서 관심을 갖게 되는 특정 실험
- 동전을 던져서 앞면이 나오는 사건
3. 확률변수
- 사건에서 얻을수 있는, 수치로 표현가능한 대상
- 사건의 결과이면서 각 결과마다의 확률값을 알 수 있음
예) 동전던지기 실험을 5번 반복해서 얻게되는 앞면이 나오는 횟수(X)
더보기

P(X=0) : TTTTT
0.5^5 = 0.03125
P(X=1) : HTTTT, THTTT, TTHTT, TTTHT, TTTTH
5*0.5^5 = 0.15625
choose(5,1)*(0.5)^1*(0.5)^4
P(X=2) : HHTTT, HTHTT, ...
choose(5,2)*(0.5)^2*(0.5)^3 = 0.3125
P(X=3) : choose(5,3)*(0.5)^3*(0.5)^2 = 0.3125
P(X=4) : choose(5,4)*(0.5)^4*(0.5)^1 = 0.15625
P(X=5) : choose(5,5)*(0.5)^5*(0.5)^0 = 0.03125
# 분포 시각화
par(mfrow = c(1,1))
vx <- 0:5
vy <- choose(5,0:5)*(0.5)^5
barplot(vy, names.arg = vx)

[ 이항분포 ]
- 이산형 확률분포
- 베르누이 시험을 n회 반복했을 때 성공횟수(X)가 따르는 분포
- 모수: n, p
- X ~ B(n,p)
예제) 이산형 확률분포의 확률계산
# 자유투 성공률이 0.8인 A선수가
# 총 10번 자유투를 던졌을 때 4번 성공할 확률은?
# 확률변수(X) : 총 10번 자유투 성공횟수
X ~ B(10,0.8)
P(X=x) = nCx * p^x * (1-p)^n-x
P(X=4) = choose(10,4) * 0.8^4 * (0.2)^6 = 0.005505024
R에서 사용 가능한 확률 함수
1. 확률질량/밀도 함수 : dbinom()
X ~ B(10,0.8)
P(X=4) = choose(10,4) * 0.8^4 * (0.2)^6 = 0.005505024
P(X=4) = dbinom(x, # 성공횟수
size, # 시행횟수
prob) # 성공확률
= dbinom(4,10,0.8) = 0.005505024
2. 누적분포함수 : p____
3. 퍼센트포인트함수 : q____
4. 랜덤샘플링 : r___
rbinom(n, # 샘플크기
size, # 총 시행횟수(n)
prob) # 성공확률(p)
** 이항분포 시각화
더보기


# 1) n의 변화에 따른
v1 <- rbinom(100, 10, 0.5)
v2 <- rbinom(100, 20, 0.5)
v3 <- rbinom(100, 30, 0.5)
par(mfrow=c(1,3))
par('mar' = c(5,5,4,2))
hist(v1, breaks = 0:30, main = 'E(X)=5')
hist(v2, breaks = 0:30, main = 'E(X)=10')
hist(v3, breaks = 0:30, main = 'E(X)=15')

# 2) p의 변화에 따른
v1 <- rbinom(100, 10, 0.1)
v2 <- rbinom(100, 10, 0.5)
v3 <- rbinom(100, 10, 0.9)
par(mfrow=c(1,3))
par('mar' = c(5,5,4,2))
hist(v1, breaks = 0:10, prob = T, main = "p=0.1")
hist(v2, breaks = 0:10, prob = T, main = "p=0.5")
hist(v3, breaks = 0:10, prob = T, main = "p=0.9")

27일차 실습 문제 풀이
링크첨부 예정