주제

1. 시리즈(Series) 속성
2. 시리즈 메소드
3.  파이썬의 반올림
4.  값/인덱스 정렬 방법
5. 값 세기 / 접근 방법

 

시리즈(Series)의 속성

  • 시리즈는 1차원 배열, 시리즈 타입으로 만드려면 pd.Series를 이용
letters = list('programmers')
numbers = list(range(3, 14))

# 인덱스의 수와 시리즈의 수가 동일하지 않으면 에러
pd.Series(letters, index=numbers)

# .dtype : 시리즈가 담고있는 데이터 타입을 반환
number_series.dtype

# .index : 인덱스에 대한 정보를 반환
number_series.index

# .values : 데이터를 배열로 반환
number_series.values

# .shape : 데이터 구조를 알 수 있으며, 시리즈는 1차원 구조
number_series.shape

# .size : 데이터의 크기를 알 수 있다
number_series.size

# .hasnans : none이나 NaN같은 결측치가 있는지 확인
number_series.hasnans

 

 

 

 

시리즈의 메소드

  • 메소드 : 객체 안에 있는 함수
  • isnull()의 별칭(alias)가 isna이다
# 객체 생성
scores = [90.5, 55.5, 81.4, None, 75.6]

# 시리즈화
scores_series = pd.Series(scores)


# .max() : 최댓값
scores_series.max()

# .min() : 최소값
scores_series.min()

# .idxmax() : 최댓값의 인덱스
scores_series.idxmax()

# .idxmin() : 최소값의 인덱스
scores_series.idxmin()

# .sum() : 합계
scores_series.sum()

# .mean() : 평균
scores_series.mean()

# .isnull() , .isna() : 결측치 확인(null 또는 not 유형의 데이터 확인)
scores_series.isnull()
scores_series.isna()

# .round() : 각 수치 반올림
scores_series.round()

 

 

 

 

파이썬의 반올림 - 오사오입(Round half to even)

  • 우리가 일반적으로 알고 있는 반올림 방식은 사사오입(Round off)이다.
  • 사사오입 방식은 0부터 4는 내리고, 5부터 9는 올리는 방식이다.
  • 하지만 이것은 '중립적'이지 못하여, 통계학에서는 사용하지 않는다.
  • 왜 중립적이지 못할까?
  • 예를 들어 :
    • 0.5 + 1.5 + 2.5 + 3.4 = 8.5이다. 이것을 사사오입 방식으로 반올림하면
    • 1 + 2 + 3 + 4 = 10이 되어 전체 값이 1.5가 증가하는 현상이 발생
  • 이것이 만약 8.5가 아니라 8천5백만이라면, 총 천오백만이나 차이가 나는 것이다.
  • 따라서 반절 위치를 올림으로 처리하는 것은 중립적이지 못하다는 뜻이다.

 

  • 반면, 통계학에서 쓰이는 반올림 방식은 오사오입(Round half to even)이다.
  • 오사오입 방식은 반올림함 숫자가 정확히 반절 위치일 경우, 가까운 짝수 쪽으로 반올림하는 규칙이다.
  • 따라서 결과가 무조건 짝수가 된다.
  • 위와 같은 예시를 들어보자 :
    • 0.5 + 1.5 + 2.5 + 3.4 = 8.5인데, 오사오입 반올림을 하면
    • 0 + 2 + 4 =  8로 오차가 0.5로 줄어든다.
  • 또 다른 예시를 보자 :
    • 0.5 + 1.5 = 2.0이고
    • 사사오입 : 1 + 2 = 3
    • 오사오입 : 0 + 2 = 2로 오차가 없어진다.
  • 즉, 반절 위치가 나올 경우, 해당 반절은 올림 또 다른 반절은 내림으로 처리하여 중립성을 만드는 것이 오사오입이다.

 

파이썬의 반올림

  • 따라서 round(4.5)는 4가, round(5.5)는 6이 나온다
  • 오사오입 방식은 통계학뿐만 아니라, 자연과확, 공학 등에서 사용하는 방식이며, 데이터분석, 통계, 머신러닝을 다루는 파이썬도 오사오입 방식을 따른다.

 

 

csv를 불러올때 바로 시리즈화 하는 방법 : squeeze()

  • squeeze() 함수는 불러온 데이터프레임을 시리즈로 변환한다.
  • 처음 read로 가져오면 기본적으로 데이터프레임으로 가져오기 때문이다.
rich_set = pd.read_csv('TopRichestInWorld.csv', usecols=['Name']).squeeze()
rich_set

 

 

 

 

값/인덱스 정렬  방법

1. 값 정렬

  • 데이터 값을 정렬하기 위한 다양한 함수와 그의 인자들
  • sort_values()
rich_set = pd.read_csv('TopRichestInWorld.csv', usecols=['Name']).squeeze()
rich_set

# .sort_values() : 값 정렬 (기본적으로 오름차순 정렬)
rich_set.sort_values()
  • axis(축)
    • 정렬에 사용할 축을 지정
    • default는 0
    • 시리즈는 1차원이라서 의미가 없지만 데이터프레임은 축이 2개
  • ascending
    • 오름차순(True), 내림차순(False)
    • default는 오름차순
rich_set.sort_values(axis=0, ascending=False)
  • kind
    • quicksort, mergesort, heapsort, stable
    • 정렬에 사용할 정렬 알고리즘을 지정
    • quicksort가 가장 우수한 성능을 보임(default)
  • na_position
    • NaN값을 어디로 배치할지 정함
    • first, last
rich_set.sort_values(ascending=True, kind='quicksort', na_position='last')
  • ignore_index
    • 정렬할 때 index열도 같이 정렬할 건지(False, default), 유지하고 정렬할 건지(True)를 지정
rich_set.sort_values(ascending=True, kind='quicksort', na_position='last', ignore_index=True)
  • inplace
    • 비파괴적 처리(False) 혹은 파괴적 처리(True)
  • key
    • 정렬 기준을 지정
    • 함수를 지정하면 되고, lambda를 사용하면 좋다
basket = ['apple', 'Banana', 'Cherry', 'durian']
basket_series = pd.Series(basket)

# 모두 소문자라고 치고 정렬하려면
basket_series.sort_values(key=lambda x : x.str.lower())

 

 

 

2. 인덱스 정렬

  • 인덱스를 정렬하는 데 사용하는 함수
  • sort_index()
  • 대부분의 인자가 sort_values()와 동일하다
rich_set.sort_index(ascending=False)

 

 

 

 

값 세기 / 접근 방법

1. 값 세기

  • 특정 열 가져오기 : usecols= 인자 사용
  • 특정 열을 인덱스로 지정 : index_col= 인자 사용
rich_df = pd.read_csv('TopRichestInWorld.csv', usecols=['Country/Territory', 'Industry'], index_col=[Industry'])
  • value_counts()
rich_country.value_counts()

결과

  • value_counts()의 인자들
  • normalize
    • 정규화
    • 퍼센트처럼 비중으로 계산
rich_country.value_counts(normalize=True)

정규화 결과

  • sort
    • 빈도 별로 정렬
    • False면 정렬 안됨
  • ascending
    • True면 내림차순, False면 오름차순
  • bins
    • 개수를 입력하여, 그만킄 구간을 나누어 카운트
    • 지정되지 않으면 고유 값의 빈도로 카운트
    • 숫자 같은 연속형 데이터만 가능
rich_age.value_counts(bins=10)

10구간으로 나뉘어 카운트

  • dropna
    • 카운트 시에 NaN형 데이터를 처리할지를 결정
    • default가 True이므로 None은 카운트 되지 않음
    • False면 None이 카운트 됨
import numpy as np
data = ['banana', None, 'apple', 'banana', 'apple', np.nan]
data_set = pd.Series(data)
data_set

data_set.value_counts(dropna=False)

false시 none도 카운트

data_set.value_counts(dropna=True)

true시 none은 카운트되지 않음

 

 

2. 값 접근 방법

# 특정 인덱스 조회
rich_name[0]

# 특정 인덱스들 조회
rich_name[[0, 15, 5]]

# 인덱스 슬라이싱
rich_name[0:5]

 

  • Series 인덱스 조회

인덱스 조회

  • RangeIndex
    • 순차적인 정수로 구성된 인덱스 객체
    • 데이터프레임이나 시리즈를 생성할 때, 명시적으로 인덱스를 지정하지 않았을 때 기본적으로 생성
    • 0부터 시작하는 정수로 구성
    • 일반적으로 데이터의 길이 또는 행의 개수에 따라 자동 생성
    • 변경할 수 없는(Immutable) 객체, 크기 고정
    • 메모리 사용을 최적화하여 데이터의 검색과 접근 속도를 향상시킴
  • Index
    • 일련의 값으로 구성된 객체
    • 문자열, 정수, 날짜 등 다양한 데이터 타입을 가질 수 있음
    • 명시적으로 지정되거나 다른 데이터의 인덱스로부터 생성
    • 변경 가능한(mutable) 객체
    • 인덱스의 값이나 순서를 변경하거나 추가/ 삭제가 가능
    • 데이터 레이블링, 인덱싱, 슬라이싱 등의 작업에 활용

 

 

오늘 실습에 사용된 데이터셋 :

https://www.kaggle.com/datasets/tarundalal/100-richest-people-in-world?resource=download

 

100 Richest People In World

100 Richest People In The World

www.kaggle.com

 

 

 


느낀점

처음 판다스를 독학하면서 써본 함수들인데 인자도 같이 배우니까 다음에 사용할 때 조금 더 수월하게 쓸 수 있을 것 같다. 데이터 분석에 필요한 내용 위주로 배우니까 좋은 것 같다. 조금 더 높은 레벨도 얼른 배우고 싶다

+ Recent posts