본문 바로가기
혼공학습단9기

혼자 공부하는 데이터 분석 with 파이썬: 4주차(Chapter 04-1)

by 이두스 2023. 2. 19.

Chapter04 "데이터 요약하기

 

Chapter 04-1의 주제는 '통계로 요약하기' 이다.

 

기술통계 구하기

  • 기술통계(요약통계): 자료의 내용을 압축하여 설명하는 방법
  • 시각화까지 아우르는 데이터 분석이 탐색적 데이터 분석
import pandas as pd
import gdown

# 03-2에서 만든 데이터 다운로드
gdown.download('https://bit.ly/3736JW1','ns_book6.csv', quiet = False)

ns_book6 = pd.read_csv('ns_book6.csv', low_memory = False)
ns_book6.head()
  • describe() 메서드 : 수치형 열에 대한 요약 통계
# describe() 메서드
ns_book6.describe()

도서권수의 최소가 0이 나와서 확인해본다.

# 도서권수 최소가 0, 0권인 도서는 몇 권인지 확인
sum(ns_book6['도서권수']==0)

결과는 3206이다. 최소가 0인 것은 의미가 없다고 생각해서 제외한다.

# ns_book7 생성 : 도서권수가 0권인 것은 의미가 없다고 생각하여 제외함. 
ns_book7 = ns_book6[ns_book6['도서권수']>0]
  • percentitles 매개변수 : 사분위 값을 바
# percentiles 매개변수로 기존 1사분위 2사분위 3사분위 값을 바꿈
ns_book7.describe(percentiles = [0.3, 0.6, 0.9])

 

사분위 값을 바꾼 결과

  • include 매개변수: describe() 메서드에서 다른 데이터 타입의 열의 기술통계 보기
# describe() 메서드에서 다른 데이터 타입의 열의 기술통계 보기: include 매개변수
ns_book7.describe(include = 'object')

  • 결과보는 방법
    • count : 누락된 값을 제외한 데이터 개수
    • unique : 고유한 값의 개수
    • top : 가장 많이 등장하는 값
    • freq : top 행에 등장하는 항목의 빈도수

평균 구하기

일반적으로는 반복문을 사용한다.

# 일반적인 평균: 반복문 사용
x = [10, 20, 30]
sum = 0
for i in range(3):
  sum += x[i]
print("평균: ",sum / len(x))

결과는 평균: 20.0으로 나온다.

mean() 메서드

  • 판다스에는 평균을 계산하는 mean() 제공
ns_book7['대출건수'].mean()

 

중앙값 구하기

median() 메서드

ns_book7['대출건수'].median()
# 결과
# 6.0

# 데이터의 개수가 짝수개일 경우: 가운데 두 개의 값의 평균
temp_df = pd.DataFrame([1,2,3,4])
temp_df.median()
# 결과
# 0    2.5
# dtype: float64

중복값 제거하고 중앙값 구하기

# 172p의 drop_duplicates()
ns_book7['대출건수'].drop_duplicates().median()

# 결과
# 183.0

아마 중복하기 전에는 작은 대출건수가 많을 것이다.

 

최솟값, 최댓값 구하기

  • min(), max() 사용
# 한 셀에 넣기 위해 print 사용
# 최솟값 
print(ns_book7['대출건수'].min())

# 최댓값
print(ns_book7['대출건수'].max())

# 결과
# 0
# 1765

 

분위수 구하기

  • 분위수는 데이터를 순서대로 느어놧을 때 균등한 간격으로 나눈 것. 보통 사분위수는 네 구간으로 나누어 25%, 50%, 75% 제1사분위 제2사분위 제3사분위로 읽음
  • quantile() 메서드
# quantile() 메서드
ns_book6['대출건수'].quantile(0.25)
ns_book7['대출건수'].quantile(0.25)

# list 가능
ns_book6['대출건수'].quantile([0.25, 0.5, 0.75])
# 결과
# 0.25     2.0
# 0.50     6.0
# 0.75    14.0
# Name: 대출건수, dtype: float64

# 시리즈 객체를 정의한 후 분위수 구하기
pd.Series([1,2,3,4,5]).quantile(0.9)
# 결과
# 4.6

같은 코드가 2개나 있는 것은 아마 교재에 ns_book6로 적혀있는 것이 이해가 안돼 다시 쓴 코드일 듯하다.

 

quantile() 의 interpolation 매개변수에서 중간 값 계산 방법을 정함.

위에서는 딱히 지정하지 않아서 기본값을 계산한다.

비례식으로 계산4가 해당 시리즈의 제3분위수이기 때문에 0.9는 (0.9-0.75)(5-4)/(1-0.75)

두 지점 사이에 놓인 특정 위치의 값을 구하는 방법을 보간이라고 부름

  • midpoint는 분위수에 상관없이 두 수 사이의 중앙값
  • nearest는 두 수 중 가까운 값을 설정

백분위 구하기

# 불리언 배열
borrow_10_flag = ns_book7['대출건수'] < 10

# True 1 False 0
borrow_10_flag.mean()
# 결과
# 0.6402712530190833 (약 0.65)
# 10 은 백분위 0.65 정도된다고 보면 된다.

ns_book7['대출건수'].quantile(0.65)
# 결과
# 10.0

분산 구하기

  • var() 메서드
# var() 메서드
ns_book7['대출건수'].var()
# 결과
# 371.69563042906674

 

표준편차 구하기

표준편차는 분산의 제곱근이다.

  • std() 메서드
# std() 메서드
ns_book6['대출건수'].std()
# 결과
# 19.241925726324574

최빈값 구하기

  • mode() 메서드
ns_book7['도서명'].mode()
# 결과
# 0    승정원일기
# dtype: object

# 텍스트 뿐만 아니라 수치형에도 적용 가능
ns_book7['발행년도'].mode()
# 결과
# 0    2012.0
# dtype: float64

데이터프레임에서 기술통계 구하기

# mean은 수치형만 연산해 numeric_only = True를 해야함
ns_book7.mean(numeric_only = True)
# 결과
# 번호      202977.476649
# 발행년도      2008.460076
# 도서권수         1.145540
# 대출건수        11.593439
# dtype: float64
# 도서명부터 마지막 열까지의 최빈값
ns_book7.loc[:, '도서명':].mode()

# 저장
ns_book7.to_csv('ns_book7.csv',index=False)

 

실습코드

https://colab.research.google.com/drive/1Sn2WMwbjAznhadK7pXmO804z5bPTl2it?usp=sharing