Post

[KT Aivle 3기 AI] 6일차. 시계열 데이터, 데이터 분석 방법론, 시각화, 단변량 분석

0. 개요

KT Aivle School 3기 AI 6일차

  • 강사 : 한기영 강사님
  • 내용
    • 시계열 데이터
    • 데이터 분석 방법론
    • 시각화
    • 단변량 분석 (숫자형, 범주형 변수)

위 내용들을 배웠음. 구체적인 내용은 추후 따로 포스트를 올릴 예정.

1. 시계열 데이터

  • 행과 행에 시간의 순서(흐름)가 있고
  • 행과 행의 시간 간격이 동일한 데이터 (엄격한 기준임)
  • Time Series = Sequential Data 라고도 부름

1) 날짜 요소 추출

(1) 날짜 타입으로 변환

  • 보통, 데이터에서 날짜는 data type이 object로 되어있음
  • 이를 data['Date'] = pd.to_datetime(data['Date'])와 같이 datetime으로 변경해준다.

(2) 날짜 요소 추출

  • 날짜 타입의 변수로부터 날짜의 요소를 뽑아낼 수 있음
  • data['yaer'] = data['date'].dt.year 와 같이 뽑아내고 할당할 수 있음
  • 사진과 같이 다양한 method가 있음

dt_method

2) 시간에 따른 흐름 추출하기 : Time Lag

  • 시계열 데이터에 사용
  • shift, rolling, diff 가 있다.

(1) .shift()

  • 시계열 데이터에서 시간의 흐름 전후로 정보를 이동시킬 때 사용
  • temp['Amt_lag'] = temp['Amt'].shift(periods=n) 과 같이 사용
  • n행 shift 한다는 의미임. periods 생략 가능. 기본값은 1

(2) .rolling().mean()

  • 시간의 흐름에 따라 일정 기간 동안 평균을 이동하면서 구하기
  • .rolling(n):
    • n 기본값은 1
    • min_periods : 최소 데이터 수
    • min_periods 설정이 없으면, n일까지는 이전 데이터가 없기 때문에 NaN이 뜨지만, 설정하게되면 설정한 값부터 값을 내줌
  • .rolling().mean()은 이동평균값
1
2
3
temp['Amt_MA7_1'] = temp['Amt'].rolling(7).mean()
temp['Amt_MA7_2'] = temp['Amt'].rolling(7, min_periods = 1).mean()
temp.head(10)
DateAmtAmt_MA7_1Amt_MA7_2
02013-01-0120.0NaN20.000000
12013-01-023938.0NaN1979.000000
22013-01-032885.0NaN2281.000000
32013-01-042907.0NaN2437.500000
42013-01-053831.0NaN2716.200000
52013-01-064066.0NaN2941.166667
62013-01-072700.02906.7142862906.714286
72013-01-082533.03265.7142863265.714286
82013-01-092462.03054.8571433054.857143
92013-01-102110.02944.1428572944.142857

(3) .diff()

  • 특정 시점 데이터, 이전시점 데이터와의 차이 구하기
  • temp['Amt_D1'] = temp['Amt'].diff(n)과 같이 사용
  • n행 전과 차이를 구한다는 의미

2. 데이터 분석 방법론 (CRISP-DM)

  • 이 내용은 계속해서 강조하셨고, 앞으로의 작업에서 기반이 되는 프로세스이다.
  • 따로 포스팅을 작성하겠다.

crisp-dm

3. 시각화

  • 수많은 데이터를 한 눈에 파악하는 두가지 방법
    1. 그래프(시각화)
      • Histogram, scatter, Density Plot, Bar plot, Box plot, …
    2. 통계량(수치화)
      • Min, Max, Sum, Mean, Std, 사분위수, 검정 통계량, P-value, …

Focus

  • 우리가 다루는 데이터에는 비즈니스가 담겨 있다.
  • 데이터 시각화의 목적은
    • 아름다운 그래프가 아니라,
    • 통계적인 해석을 넘어,
    • 비즈니스의 인사이트를 파악하는 것이다.

한계

  • 그래프와 통계량에는 요약된 정보(원본)가 표현 된다.
  • 요약을 하는 관점에 따라 해석의 결과가 달라지 수 있다.
  • 어떤 식으로든 요약을 하면, 정보의 손실이 발생된다.

1) Maplotlib과 Seaborn

  • 간단하게 plot 하는 방법을 배움
  • 추후 시각화에 대해 따로 정리한 글을 올리겠다.

4. 단변량 분석 (숫자형, 범주형 변수)

  • “데이터가 그렇게 분포하고 있는 데에는 다 이유가 있다.”
 그래프통계량
숫자형히스토그램, KDE plot, box plotmin, max, mean, std, 사분위수
범주형bar plot범주별 빈도수, 비율

1) 숫자형 변수

숫자형 변수를 정리하는 두 가지 방법

  1. 숫자로 요약하기 : 정보의 대푯값 => 기초 통계량
    • 평균(mean)
      • 산술, 기하, 조화 평균
    • 중앙값(median)
      • 자료의 순서상 가운데 위치한 값
    • 최빈값(mode)
      • 자료 중에서 가장 빈번한 값
    • 사분위수(Quantile)
      • 데이터를 오름차순으로 정렬한 수를 분포 수로
      • 전체를 4등분 하고, 각 경계에 해당되는 값 (25%, 50%, 75%)을 의미한다.
    • df.describe()로 한번에 확인 가능
  2. 구간을 나누고 빈도수(frequency) 계산 => 도수분포표(frequency table)
    • Histogram
      • plt.hist() 혹은 sns.histplot()으로 시각화 가능
      • bins에 따라 전혀 다른 모양이 될 수 있음
    • Density Plot (KDE Plot)
      • 밀도함수 그래프
      • 밀도함수 그래프의 아래 면적은 1
      • sns.kdeplot() 혹은 sns.histplot(~~, kde=True)를 통해 Histogram과 함께 시각화 할 수 있음

(1) 시각화

[1] Histogram

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
plt.subplot(2, 2, 1)
plt.hist(titanic['Fare'], bins=5, edgecolor='gray')
plt.xlabel('Fare')
plt.ylabel('Frequency')

plt.subplot(2, 2, 2)
plt.hist(titanic['Fare'], bins=20, edgecolor='gray')
plt.xlabel('Fare')
plt.ylabel('Frequency')

plt.subplot(2, 2, 3)
sns.histplot(x='Fare', data = titanic, bins=5)
plt.xlabel('Fare')
plt.ylabel('Frequency')

plt.subplot(2, 2, 4)
sns.histplot(x='Fare', data = titanic, bins=20)
plt.xlabel('Fare')
plt.ylabel('Frequency')

plt.tight_layout()
plt.show()

png

[2] 밀도함수 그래프 (KDE Plot)

1
2
3
4
5
6
7
plt.subplot(2, 1, 1)
sns.kdeplot(x='Fare', data = titanic)

plt.subplot(2, 1, 2)
sns.histplot(titanic['Age'], kde=True)

plt.show()

png

[3] Boxplot

  • plt.boxplot()은 반드시 NaN을 제외해야 결과가 나옴
  • sns.boxplot()은 알아서 빼고 그려줌
  • 그림 의미

boxplot1

boxplot2

boxplot3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
plt.subplot(2, 2, 1)
plt.boxplot(temp['Age'])
plt.grid()

plt.subplot(2, 2, 2)
plt.boxplot(temp['Age'], vert = False)
plt.grid()

plt.subplot(2, 2, 3)
sns.boxplot(x = titanic['Age'])
plt.grid()

plt.subplot(2, 2, 4)
sns.boxplot(y = titanic['Age'])
plt.grid()

plt.tight_layout()
plt.show()

png

2) 범주형 변수

  • 범주별 개수를 세면 된다! => 범주별 개수, 범주별 비율

(1) 수치화 : 기초 통계량

  • 범주별 빈도수와 비율을 확인
  • 범주별 빈도수 : series.value_counts()
  • 범주별 비율 : series.value_counts() / df.shape[0]
1
2
print(titanic['Embarked'].value_counts(), end='\n\n')
print(titanic['Embarked'].value_counts() / titanic.shape[0])
1
2
3
4
5
6
7
8
9
Southhampton    644
Cherbourg       168
Queenstown       77
Name: Embarked, dtype: int64

Southhampton    0.722783
Cherbourg       0.188552
Queenstown      0.086420
Name: Embarked, dtype: float64

(2) 시각화

1) bar chart

  • seaborn의 sns.countplot()
    • plt.bar()를 이용하려면 먼저 집계한 후 결과를 가지고 그래프를 그려야 함
    • sns.countplot()은 집계 + bar plot 한 번에 해결
1
2
3
4
5
6
7
8
9
10
plt.subplot(2, 1, 1)
sns.countplot(x = titanic['Pclass'])
plt.grid()

plt.subplot(2, 1, 2)
sns.countplot(y = titanic['Pclass'])
plt.grid()

plt.tight_layout()
plt.show()

png

This post is licensed under CC BY 4.0 by the author.

[KT Aivle 3기 AI] 5일차. (2) DataFrame 결합

[KT Aivle 3기 AI] 7일차. 이변량 분석(숫자 → 숫자, 범주 → 숫자)