사쿠의 데이터 블로그

[기초통계학] 자료의요약(2) 본문

기초통계학

[기초통계학] 자료의요약(2)

토스트먹어 2020. 2. 20. 10:00

이번 자료의 요약에서의 목적은 다음과 같다.

1. 자료의 형태를 구분

2. 범주형 자료의 요약방법 확인

3. 이산형 자료의 요약방법 확인

4. 연속형 자료의 요약 방법 확인

범주형 자료의 요약방법을 소개합니다.


도수분포표(Frequency Table)

  • 도수: 관측값의 갯수
  • 상대도수: 도수를 전체 자료의 개수로 나눈 수

신규 게임 출시에 대한 긍부정 반응 조사 예시

응답 도수 상대도수
긍정 68 0.356
그저 그렇다 43 0.225
부정 66 0.345
무응답 14 0.07
191 1

무응답은 전체의 7% 정도로 설문지 참여율은 높은 편인 것으로 보인다. 결과를 보면, 긍정과 부정이 약 35% 비율로 비교적 동일하게 나왔다. 유저별 취향이 극명하게 갈리는 부분이 있는 것으로 보인다.


원형그래프(Pie Chart)

원을 그린 뒤, 원을 상대도수에 비례하게 영역을 나눈다

혈액형 도수 상대도수
A 23 0.23
AB 17 0.17
B 29 0.29
O 31 0.31
100 1

R로 혈액형 데이터를 임의로 생성해 원형그래프를 그려봤다. 원형그래프를 이용하면 전체에서 각 범주가 차지하는 비율을 파악하기 쉽다. 그러나 범주의 갯수가 많아지거나 차이를 파악하기 힘들다는 단점이 있다.

그림을 통하여 도수를 비교하거나 차이를 파악하기 위해서는 막대그래프를 이용하는 것이 더 좋다.

 

 

 

(R)

1
2
3
4
5
6
7
set.seed(2020)
df<- data.frame(blood_type = sample(c('A''B''AB''O'), replace = TRUE, size = 100))
tab_df<- table(df)
 
label = paste0(names(tab_df),' ', tab_df / sum(tab_df) * 100'%')
pie(tab_df, main='Blood type Pie Chart', labels = label)
 
cs

(Python)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
 
np.random.seed(2020)
blood_type = np.random.choice(['A''B''O''AB'], size= 100)
df = pd.DataFrame(data = {"blood_type":blood_type})
tab_df = df.blood_type.value_counts()
 
plt.pie(list(tab_df),
        labels=tab_df.index,
        autopct='%1.2f%%'# second decimal place
        startangle=90,
        textprops={'fontsize'14}) # text font size
 
plt.title('Blood type Pie Chart')
plt.show()
cs

막대그래프(Bar Chart)

Y축에는 도수 혹은 상대 도수를, X축에는 범주를 나열한다. 막대그래프를 이용하면 각 범주 간의 도수를 비교하는데 용이하다.

막대 그래프를 보면 O형 혈액형이 가장 많고 AB형이 가장 적은 것을 알 수 있다. B형 혈액형은 O형보다는 적지만 차이가 크지 않다.

 

 

 

 

 

 

(R)

1
2
3
4
set.seed(2020)
df<- data.frame(blood_type = sample(c('A''B''AB''O'), replace = TRUE, size = 100))
tab_df<- table(df)
barplot(tab_df, xlab = 'blood_type', ylab= 'Frequency')
cs

(Python)

1
2
3
4
5
6
7
8
9
10
np.random.seed(2020)
blood_type = np.random.choice(['A''B''O''AB'], size= 100)
df = pd.DataFrame(data = {"blood_type":blood_type})
tab_df = df.blood_type.value_counts()
 
plt.bar(tab_df.index, tab_df)
plt.title('Blood type Bar plot')
plt.xlabel('Blood Type')
plt.ylabel('Frequency')
plt.show()
cs

파레토그림(Pareto Diagram)

막대그래프와 유사하지만, (1)도수가 큰 순서대로 나열, (2) 누적상대도수를 추가한다는 점이 막대 그래프와는 다른점이다. 따라서 상대도수가 증가하느 정도와 큰 도수의 범주들이 차지하는 비율을 쉽게 파악할 수 있다.

어느 공장별 불량품 비율 예시

8:2 법칙으로 유명한 파레토라는 이름은 중요한 소수를 쉽게 파악할 수 있다. 공장 불량품 예시에서 불량품의 80%가 6번, 7번 공장에서 나온다는 것을 알 수 있다. 수율을 높히려면 2개의 공장을 손봐야 할 것이다.

(R)

1
2
3
4
5
6
7
8
9
10
11
library(qcc)
set.seed(2020)
sample_data <- sample(c('P1''P2''P3''P4''P5''P6''P7')
                      , replace = TRUE
                      , size = 100
                      , prob = c(111221010))
 
df<- data.frame(plant = sample_data)
tab_df<- table(df$plant)
 
pareto.result<- pareto.chart(tab_df, main = 'Plant Defective rate')
cs

(Python)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from matplotlib.ticker import PercentFormatter
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
 
np.random.seed(2020)
sample_data = np.random.choice(['P1''P2''P3''P4''P5''P6''P7']
                               , size= 100
                               , p = [1/271/271/272/272/2710/2710/27])
df = pd.DataFrame(data = {"plant":sample_data})
tab_df = df.plant.value_counts()
pareto = 100 * tab_df.cumsum() / tab_df.sum()
 
fig, ax = plt.subplots()
ax.bar(pareto.index, pareto, color="C0")
ax2 = ax.twinx()
ax2.plot(pareto.index, pareto / 100, color="C1", marker="D", ms=7)
ax2.yaxis.set_major_formatter(PercentFormatter())
plt.show()
cs

'기초통계학' 카테고리의 다른 글

[기초통계학] 자료의 요약(1)  (0) 2020.02.19
[기초통계] 통계학이란?  (0) 2020.02.18