본문 바로가기
Python/데이터 분석

[DataFrame] DataFrame - 통계 함수, 날짜 변수

by snow_white 2022. 4. 8.
  • 통계는 데이터 분석에서 굉장히 중요한 요소이다.
  • 데이터에 대한 통계 계산식으로 Pandas 함수로 제공하기 때문에 어렵지 않게 통계 값을 산출할 수 있다.
  • describe() - 요약통계
    • 전반적인 주요 통계를 확인할 수 있음
    • 기본 값으로 수치형(Numerical) 컬럼에 대한 통계표를 보여줌
      • count : 데이터 개수
      • mean : 평균
      • std : 표준편차
      • min : 최솟값
      • max : 최대값
tc5 = tips.copy()
# numerical 칼럼에 대한 통계
tc5.describe()

# 각 컬럼에 대한 개수, 누락 데이터는 건너 뛰기 때문에 244로 나옴
tc5.count()
'''
total_bill    245
tip           244
sex           244
smoker        244
day           244
time          244
size          244
dtype: int64
'''
tc5['tip'].sum() # 731.5799999999999

round(tc5['tip'].sum()) # 732 반올림처리
round(tc5['tip'].sum(), 0) # 0이 의미하는 것은 소수점 0자리까지 반환한다는 의미
round(tc5['tip'].sum(), 2) # 731.58  /  소수점 2자리까지 반올림하여(소수점 3번째에서 반올림) 표시하라
# 여러 컬럼에 대하여 sum을 구하자. 열거형으로 칼럼 나열
# 2차원으로 나와야 하기 때문에 리스트를  [] 안에 넣어야 함
tc5[['tip', 'total_bill']].sum()
'''
tip            731.58
total_bill    4853.11
dtype: float64
'''

 

skipna

기술 통계함수에서는 skipna = True 가 기본으로 설정skip = False로 설정한다면,

NaN값이 있는 컬럼은 NaN값으로 그대로 출력된다.

# numeric 칼럼 모두 sum()
# 정수값과 누락 데이터를 더하면 Nan 이기 때문에 누락 skip하라는 skipna는 잘 안 씀
tc5.sum(skipna=False)
'''
total_bill    4853.11
tip               NaN
size              NaN
dtype: float64
'''
tc5.mean()
tc5.mean(skipna=False)
'''
total_bill    19.808612
tip                 NaN
size                NaN
dtype: float64
'''

 

median() - 중앙값

  • 데이터의 중앙 값을 출력
    • 중앙값 : 데이터를 오름차순 정렬하여 중앙에 위치한 값
  • 이상치(outlier)가 존재하는 경우, 평균보다 중앙값을 대표값으로 더 선호

 

cumsum 누적합 과 sum 합의 차이

# 누적의 합  cumsum
# 누적의 곱  cumprod
# 모든 손님이 준 팁의 합
tc5['tip'].cumsum() # 누적된 값들을 하나하나 보여줄 뿐 sum()과 다를 게 없다
'''
0        1.01
1        2.67
2        6.17
3        9.48
4       13.09
        ...  
240    724.83
241    726.83
242    728.58
243    731.58
244       NaN
Name: tip, Length: 245, dtype: float64
'''
# 합을 한 번에 보여주기
tc5['tip'].sum() # 731.5799999999999

# 분산
tc5['tip'].var() # 1.9144546380624725  variance가 그다지 다양하진 않다..?

# 표준편차
tc5['tip'].std() #1.3836381890011826

 

quantile() - 분위

  • 주어진 데이터를 동등한 크기로 분할하는 지점
  • 10%일 경우 0.1을, 80%의 경우 0.8을 대입하여 값을 계산

 

mode() - 최빈값

  • 가장 많이 출현한 데이터를 의미
    • 카테고리형 데이터에도 적용 가능

 

corr() - 상관관계

  • 컬럼별 상관관계를 확인할 수 있음
    • -1에 가까울수록 반비례 관계, 1에 가까울수록 정비례 관계를 의미
    • 부호에 상관없이 -1과 1에 가까운지에 따라 영향력 있음을 판단함

 

✅ Sat(토요일) 방문한 누적 식사 인원(size)의 숫자는?

condition = tc5['day']=='Sat'
con_list = tc5[condition]
con_list['size'].cumsum()
tc5[condition]['size'].sum()

# loc 권장!!
tc5.loc[condition, 'size'].cumsum()
#con_list['size'].sum()
#tc5[condition].size

 


 

날짜, 시간 datetime

 

날짜 끝나는 날, 주기, 설정 가능

  • date_range() 함수 사용으로 생성
  • start(시작날짜) | end (끝나는 날짜) | periods(생성할 데이타 갯수) | freq(주기)
  • datetime64라는 데이타 타입으로 지정됨
  • datetime 타입은 dt접근자로 아래와 같은 날짜 속성에 쉽게 접근 가능하다.

 

Pandas의 dt(datetime) 날짜 관련 변수

  • pandas.Series.dt.year: 연도
  • pandas.Series.dt.month: 월
  • pandas.Series.dt.day: 일
  • pandas.Series.dt.dayofweek :요일**(월요일 0)**
  • pandas.Series.dt.hour: 시
  • pandas.Series.dt.minute: 분
  • pandas.Series.dt.second: 초
  • pandas.Series.dt.microsecond: 마이크로초(micro seconds, 백만분의 일초)
tips.shape # (245, 7)  행과 열
tips.shape[0] # 245 행의 수

 

날짜는 datetime64

가끔 datetime이 object로 나오는 경우가 있다

# tips.shape[0]  245일 생성
dates = pd.date_range('20200101', periods=tips.shape[0])
dates

feature engineering 다루기

dc = tips.copy()
# 컬럼 추가
dc['date'] = dates
dc.head()

datetime - 을 기준으로 년, 월, 일로 자르기

월별 데이터를 추출해낼 수 있다칼럼을 새롭게 만들 때 날짜를 분리해서 만드는 경우가 있다

# 문자열일 경우 datetime으로 형변환하여 - 를 기준으로 년, 월, 일 나누기
# 데이터프레임에서 칼럼 하나만 잘라오면 Series가 된다
dc['date'].dt.year.head()
'''
0    2020
1    2020
2    2020
3    2020
4    2020
Name: date, dtype: int64
'''

# datetime에서 월만 추출
dc['date'].dt.month.head()
'''
0    1
1    1
2    1
3    1
4    1
Name: date, dtype: int64
'''

dc['date'].dt.day.head()
'''
0    1
1    2
2    3
3    4
4    5
Name: date, dtype: int64
'''

 

월요일 0, 일요일 6

dc['date'].dt.dayofweek.head() # 2 수, 3목, 4금, 5토, 6일
'''
0    2
1    3
2    4
3    5
4    6
Name: date, dtype: int64
'''

 

# 분기 quarter / 1년 => 1분기: 1~3월, 2분기: 4~6월, ...
# 우리 데이터는 9월까지라 3분기로 나뉨
dc['date'].dt.quarter
'''
0      1
1      1
2      1
3      1
4      1
      ..
240    3
241    3
242    3
243    3
244    3
Name: date, Length: 245, dtype: int64
'''
dc['분기'] = dc['date'].dt.quarter
dc['년도'] = dc['date'].dt.year
dc['월'] = dc['date'].dt.month
dc['일'] = dc['date'].dt.day
dc.head()

날짜 관련처럼 보이지만 실제로 object로 인식되는 컬럼들이 많다.

이런 컬럼들은 다시 날짜 타입으로 변경해야 하는데 그런 경우to_datetime() 함수로 바꿔준다.

바꾸고 나서 나머지 사용법은 동일하다

dc['date'] = pd.to_datetime(dc['date'])
dc.head()

댓글