jjinyeok 성장일지

데이터 분석 및 의미 찾기 #2 - 개별 변수 분석하기 2022/08/10~2022/08/12 본문

[KT AIVLE School]

데이터 분석 및 의미 찾기 #2 - 개별 변수 분석하기 2022/08/10~2022/08/12

jjinyeok 2022. 8. 20. 15:14

데이터를 분석하는 과정은 다음과 같다.

 

1. 개별 변수 분석하기 (단변량 분석)

  EDA & CDA를 통해 데이터를 분석하는 과정에서 개별 변수를 분석하는 과정을 정리한다. 개별적인 모든 변수들은 (feature와 target 모두) 숫자형 데이터와 범주형 데이터로 나눌 수 있다. 또한 데이터를 분석하는 방법으로 기초 통계량을 사용하는 방법과 그래프를 사용하는 방법이 있다. 따라서 방법은 다음과 같이 나눌 수 있다.

  기초통계량 그래프 시각화
숫자형 데이터 mean
median
mode
4분위 수
...
히스토그램
밀도함수 그래프
박스플롯
...
범주형 데이터 범주형 빈도수
범주형 비율
...
barchart
...

 

2. 숫자형 데이터 단변량 기초통계량으로 분석하기

  기초통계량이라는 것은 자료를 대표하는 값이다. 숫자형 데이터에서 기초통계량을 통해 데이터를 분석할 때 보통 평균, 중위수, 최빈값, 4분위수를 사용한다. mean() 메서드를 통해 평균을, median() 메서드를 통해 중위수를, mode() 메서드를 통해 최빈값을, np.percentile() 함수를 통해 비율에 해당하는 위치값을 찾아 4분위수를 알 수 있다. 각 과정은 다음과 같다.

"대푯값"

print(titanic['Fare'].mean())
# 32.2042079685746

print(titanic['Fare'].median())
# 14.4542

print(titanic['Fare'].mode())
# 0    8.05
# dtype: float64

print(np.percentile(titanic['Fare'], [0, 25, 50, 75, 100]))
# [  0.       7.9104  14.4542  31.     512.3292]

  위처럼 각각의 집계함수를 이용하여 기초통계량을 살펴보는 방법도 가능하지만 데이터프레임 혹은 시리즈의 describe() 메서드를 사용하여 한꺼먼에 구할 수 있다. 이때 기초통계량은 숫자형 데이터에 대해서만 확인할 수 있으며 범주형 데이터에 대한 기초통계량을 보기 위해 describe() 메서드 안에 include='all' parameter를 입력할 수 있다. 이때 숫자형 데이터는 수치형 데이터가 아닐 수 있음에 유의하자. 대표적으로 시간은 범주형 데이터지만 종종 헷갈리곤 한다. 타이타닉 데이터 내부에서도 Survived와 Pclass는 숫자형 변수가 아니다.

"describe()"

print(titanic.describe())
#        PassengerId    Survived      Pclass         Age        Fare
# count   891.000000  891.000000  891.000000  714.000000  891.000000
# mean    446.000000    0.383838    2.308642   29.699118   32.204208
# std     257.353842    0.486592    0.836071   14.526497   49.693429
# min       1.000000    0.000000    1.000000    0.420000    0.000000
# 25%     223.500000    0.000000    2.000000   20.125000    7.910400
# 50%     446.000000    0.000000    3.000000   28.000000   14.454200
# 75%     668.500000    1.000000    3.000000   38.000000   31.000000
# max     891.000000    1.000000    3.000000   80.000000  512.329200

print(titanic.describe(include='all'))
#         PassengerId    Survived      Pclass                     Name   Sex  \
# count    891.000000  891.000000  891.000000                      891   891   
# unique          NaN         NaN         NaN                      891     2   
# top             NaN         NaN         NaN  Braund, Mr. Owen Harris  male   
# freq            NaN         NaN         NaN                        1   577   
# mean     446.000000    0.383838    2.308642                      NaN   NaN   
# std      257.353842    0.486592    0.836071                      NaN   NaN   
# min        1.000000    0.000000    1.000000                      NaN   NaN   
# 25%      223.500000    0.000000    2.000000                      NaN   NaN   
# 50%      446.000000    0.000000    3.000000                      NaN   NaN   
# 75%      668.500000    1.000000    3.000000                      NaN   NaN   
# max      891.000000    1.000000    3.000000                      NaN   NaN   

#                Age        Fare      Embarked  
# count   714.000000  891.000000           889  
# unique         NaN         NaN             3  
# top            NaN         NaN  Southhampton  
# freq           NaN         NaN           644  
# mean     29.699118   32.204208           NaN  
# std      14.526497   49.693429           NaN  
# min       0.420000    0.000000           NaN  
# 25%      20.125000    7.910400           NaN  
# 50%      28.000000   14.454200           NaN  
# 75%      38.000000   31.000000           NaN  
# max      80.000000  512.329200           NaN

 

3. 숫자형 데이터 단변량 시각화로 분석하기

  1. 히스토그램
  2. 밀도함수 그래프
  3. 박스플롯
  4. 라인차트

으로 보통 숫자형 변수를 단변량 분석한다.

 

  1. 히스토그램

  히스토그램은 구간에 따른 빈도수를 시각화해 보여주는 역할을 한다. maplotlib의 pyplot의 hist()함수와 seaborn의 histplot() 함수를 통해 히스토그램을 구현할 수 있다. 과정은 다음과 같다. 이때 bins parameter를 통해 구간의 개수를 조절할 수 있다는 것을 유의하자.

"히스토그램"

# matplotlib pyplot의 hist() 함수
plt.hist(titanic['Fare'], bins = 5)
plt.xlabel('Fare')
plt.ylabel('Frequency')
plt.show()

# seaborn의 histplot() 함수
sns.histplot(titanic['Fare'], bins = 5)
plt.xlabel('Fare')
plt.ylabel('Frequency')
plt.show()

# bins를 이용한 구간 조절
sns.histplot(titanic.Fare, bins = 30)
plt.xlabel('Fare')
plt.ylabel('Frequency')
plt.show()

 

위 과정의 결과이다. bins parameter의 값에 따라 히스토그램 모양이 바뀜에 유의하자.

  히스토그램을 통해 데이터를 분석할 때 bins를 적절히 조절해야 하는 것에 유의하자. 구간 bin의 너비를 어떻게 잡는지에 따라 전혀 다른 모양이 될 수 있기 때문이다.

 

  2. 밀도함수그래프

  히스토그램의 막대의 너비에 따라 전혀 다른 모양이 될 수 있다는 문제를 해결하기 위해 모든 점에서 데이터의 빌도를 추정하는 커널 밀도 추정(Kernel Density Estimation) 방식을 사용하곤 한다. seaborn의 kdeplot() 함수와 pandas 시리즈에서 직접 plot(kind = 'kde')라는 메서드를 입력하여 밀도함수그래프를 구현할 수 있다. 과정은 다음과 같다.

"밀도함수 그래프"

# seborn의 kdeplot() 함수
sns.kdeplot(titanic['Fare'])
plt.xlabel('Fare')
plt.ylabel('Frequency')
plt.show()

# pandas 시리즈의 plot() 메서드
titanic['Fare'].plot(kind='kde')
plt.xlabel('Fare')
plt.ylabel('Frequency')
plt.show()

위 과정의 결과이다.

밀도함수 그래프에 대해 밀도추정을 진행 할 수 있다. a부터 b 사이의 값이 나올 확률을 P(a <= x <= b)라 할때 수식은 다음과 같다.

이것은 밀도함수 그래프에서 a부터 b까지의 넓이이다.

 

  3. 박스플롯

  박스플롯은 숫자들의 분포를 간단히 살펴보게 해주는 그래프이다. 특히 이상치를 살펴보기에 편리한 시각화 도구이다. matplotlib pyplot의 boxplot() 함수 혹은 seaborndml boxplot() 함수를 통해 구현이 가능하다. 과정은 다음과 같다.

"박스플롯"

# 데이터
age = [19,20,23,46,21,25,26,25,28,31,37,24,28,34,38,33,32,29,27,24]

# matplotlib pyplot의 boxplot() 함수
plt.boxplot(age)
plt.show()

# seaborn의 boxplot() 함수
sns.boxplot(age)
plt.show()

# pyplot의 boxplot() 함수에서 x축으로 시각화
plt.boxplot(age, vert=False)
plt.show()

# seaborn의 boxplot() 함수에서 y축으로 시각화
sns.boxplot(y=age)
plt.show()

위 과정의 결과이다.

  박스플롯의 경우 박스의 양 극단이 1사분위수, 3사분위 수, 중간의 선이 2사분위 수 즉 중간값이다. 박스에서 이어지는 직선이 끝나는 선을 Fence라고 부른다. 1사분위수의 Fence는 max(1사분위 값 - 1.5 * IQR, min 값)이고, 3사분위수의 Fence는 min(3사분위 값 + 1.5 * IQR, max 값)이다. 여기서 Fence를 벗어난 값은 이상치일 수 있다.

 

  4. 라인차트

  보통 시계열 데이터에서 수치형 데이터를 단변량으로 시각화하여 분석할 때 시간축을 x축으로 하여 라인차트로 표현하곤 한다. 그 과정은 다음과 같다.

"라인차트"

# 데이터
air['Date'] = pd.to_datetime(air['Date']) # 날짜 형식으로 변환

# 라인차트로 표현
plt.plot('Date', 'Ozone', 'g-', data = air, label = 'Ozone')
plt.plot('Date', 'Temp', 'r-', data = air, label = 'Temp')

# x축은 시간축을 나타냄
plt.xlabel('Date')
plt.legend()
plt.show()

위 과정의 결과이다.

 

4. 범주형 데이터 단변량 기초통계량으로 분석하기

  범주형 데이터를 단변량으로 기초통계량을 통해 분석할 때는 범주별 빈도수와 범주별 빈도를 통해 데이터를 분석하고 확인한다. 데이터프레임의 value_count() 메서드를 이용하여 범주별 빈도수를 구하고 이를 전체 데이터양으로 나누어 범주별 비율을 구할 수 있다. 과정은 다음과 같다.

"범주형 데이터 단변량 기초통계량으로 분석"

# 범주별 빈도수
print(titanic['Pclass'].value_counts())
# 3    491
# 1    216
# 2    184
# Name: Pclass, dtype: int64

# 범주형 비율
print(titanic['Pclass'].value_counts()/titanic.shape[0])
# 3    0.551066
# 1    0.242424
# 2    0.206510
# Name: Pclass, dtype: float64

 

5. 범주형 데이터 단변량 시각화로 분석하기

  범주형 데이터를 단변량으로 시각화를 통해 분석할 때는 barchart를 사용한다. matplotlib pyplot의 barh() 함수는 범주 이름과 값이 필요하기 때문에 집계작업이 선행되어야 한다. 따라서 value_counts() 메서드를 사용하여 집계를 먼저하고 시각화를 하는 방식으로 시각화를 구현한다. seaborn의 countplot() 함수는 입력받은 시리즈에 대하여 빈도수를 시각화해주기 때문에 이 과정이 필요 없다. 구현하는 과정은 다음과 같다.

"범주형 데이터 단변량 시각화로 분석"

# matplotlib pyplot의 bar()
temp = titanic['Pclass'].value_counts() # 집계가 먼저 진행된다
plt.bar(temp.index, temp.values) # index와 values를 통해 집계를 진행한다.
plt.show()

# seaborn의 countplot()
sns.countplot(x=titanic['Pclass'])
plt.show()

위 과정의 결과이다.

 

6. 단변량 분석을 통해 살펴볼 점

  우리는 단변량 분석을 통해 개별 변수들의 값의 범위를 확인할 수 있고 데이터가 모여있는 구간을 확인할 수 있으며 이상치와 결측치를 확인하고 조치할 방안을 수립할 수 있고 가변수화와 스케일링을 진행할 대상을 선별할 수 있다. 또한 데이터가 왜 그런 분포를 찾아가는지를 통해 비즈니스의 일반 사항과 특이사항을 도출하고 추가 분석 대상 또한 도출할 수 있다. 이러한 과정의 세부사항은 지난 데이터 처리 과정에서 정리하였다.

Comments