관리 메뉴

파이티스

파이썬 Pandas 라이브러리와 groupby함수 사용으로 실습하기 3 본문

Python/Pandas

파이썬 Pandas 라이브러리와 groupby함수 사용으로 실습하기 3

파이티스 2023. 5. 24. 17:32
반응형

 

 

groupby 함수란?

- 데이터를 그룹화하여 특정 기준에 따라 그룹으로 묶는 데 사용되는 파이썬의 함수

- 판다스(Pandas) 라이브러리와 함께 가장 자주 사용

- 판다스는 데이터 조작과 분석을 위한 강력한 도구로 널리 사용

- 데이터프레임(DataFrame)이라는 자료구조를 제공

- 데이터프레임을 그룹화하기 위해 사용

 

Pandas 기초실습 3

- winemag-data-130k-v2.csv 파일을 reviews 로 읽는다.

 

import pandas as pd
reviews = pd.read_csv('D:/yh-k4-main/yh-k4-main/data/winemag-data.csv',index_col=0)

 

- 데이터 확인하기 위해 head(2) 맨앞 데이터 2개만 불러와서 확인

 

reviews.head(2)

 

- 과정1 )

- 리뷰 데이터프레임에서 points 컬럼의  median 값은?

 

- median이란?

  - 주어진 데이터를 오름차순 또는 내림차순으로 정렬했을 때 중간에 위치하는 값

  - 데이터를 절반으로 나누어 전체 데이터셋을 두 개의 동일한 크기로 나눈다.

  - 중간 값은 데이터를 정렬하여 중간에 위치한 값이므로, 전체 데이터셋을 대표하는 값으로 사용

 

reviews['points'].median()

 

- 과정2 )

- 나라를 중복되지 않도록 가져와서 countries 변수에 저장하고, 화면에 출력하시오.

 

countries = reviews['country'].unique()
countries

 

reviews['country'].nunique()

- 실제 나라의 개수는 43개 인데 위에서는 NaN이 포함되어 44개가 출력된다.

- notna()를 사용하여 NaN을 포함시키지 않고 출력한다.

 

reviews['country'][reviews['country'].notna()].unique() # nan 제외

 

- 과정3 )

- 각 국가별로는 몇개의 리뷰가 있는지, 각국가별 리뷰수를 구하시오.

- 국가별로 그룹화 함.

 

reviews.groupby('country')

 

- count()를 사용하여 그룹으로 묶인 나라의 리뷰수를 구함.

 

- 방법1)

 

reviews.groupby('country')['country'].count() # 방법1

 

방법2)

 

reviews['country'].value_counts() # 방법2 내림차순으로 정렬

 

방법3)

 

reviews.groupby('country')['country'].count().sort_values(ascending=False) #방법3

 

- 과정4 )

- 리뷰 데이터프레임의 price 컬럼 값에서, price의 평균값을 뺀 값을, centered_price 라고 저장하시오.

 

- 통계량 보기

 

reviews.describe()

 

- mean()을 사용하여 평균값을 빼기

 

centered_price = reviews['price'] - reviews['price'].mean()
centered_price

 

- 과정5 )

- 나는 경제적이므로, 가격대비 포인트가 가장 큰 와인을 사려한다. 해당 와인의 title은?

- 가성비에 대한 컬럼이 없어서 만들자!

- 가성비의 공식은 " 포인트 / 가격 " 이다.

 

# 컬럼에 가격대비 포인트가 없다.
# 그러므로 데이터가공을 해야 한다.
# 결론은 "가격대비 포인트" 컬럼을 만든다.
# 포인트 / 가격 = 가성비

reviews['가성비'] = reviews['points'] / reviews['price']
reviews

 

- 맨 마지막에 가성비 컬럼이 생성되고 값이 표시됨.

 

 

- 가성비 내림차순으로 정렬

 

reviews.sort_values('가성비',ascending=False)

 

- 과정6 )

- 사람들이 어떤와인을 더 많이 거론했는지 보려한다.
   "tropical" 이 들어있는 리뷰의 갯수를 세고, "fruity" 라고 들어있는 리뷰의 갯수를 세어서 판다스 시리즈

    descriptor_counts  변수로 만들어 보자.
- 깃 허브의 데이터분석 항목 참고
- 데이터프레임의 apply 함수도 고려

 

"tropical" 리뷰 갯수 세기

- apply 함수 사용

 

def is_tropical(sentence): # tropical 함수를 만들어서 아래 apply함수에 적용
    if 'tropical' in sentence:
        return True
    else :
        return False 
        
reviews['description'].apply(is_tropical).sum()   # apply 함수 사용

 

- pandas.Series.str.contains 형식으로 구하기

 

# reviews['description'] # 이 소스의 결과는 판다스 시리즈
reviews['description'].str.contains('tropical').sum() # pandas.Series.str.contains 형식으로 구하기

 

"fruity"  리뷰 갯수 세기

 

- apply 함수 사용

 

def is_fruity(sentence): # tropical 함수를 만들어서 아래 apply함수에 적용
    if 'fruity' in sentence:
        return True
    else :
        return False    
        
reviews['description'].apply(is_fruity).sum()

 

- pandas.Series.str.contains 형식으로 구하기

 

reviews['description'].str.contains('fruity').sum()

 

과정7 )

- 별점 시스템을 만들려고 한다. 따라서 별점에 대한 데이터가 필요하다. 

  별점은 1,2,3 즉 3개로 만들것이다.
  포인트가 95점 이상이면 3점, 85점 이상이면 2점, 나머지는 1점으로 할 것이다. 
  리뷰데이터를 통해 각 데이터의 별점을 구하시오.

 

reviews['points']

 

- get_star 함수를 정의하고 apply함수 사용

- star칼럼을 새로 만들고 별점을 넣어준다.

 

def get_star(point):
    if point >= 95:
        return 3
    elif point >= 85:
        return 2
    else:
        return 1
    

reviews['star'] = reviews['points'].apply(get_star)

 

과정8 )

- 리뷰의 region_2 컬럼에 데이터가 비어있는 경우에는, 'Unknown'으로 셋팅하자.

 

reviews['region_2'] = reviews['region_2'].fillna('Unknown')
reviews.head(2)

 

 

- 과정9 )

- 각 포인트 별로, 몇개의 리뷰가 있는가?
  예를들어, 95점은 4개, 94점은 10개 등등... 알고싶은 경우다.

 

reviews['points'].value_counts()

 

- 오름차순으로 정렬해보기

 

reviews.groupby('points')['points'].count().sort_values(ascending=True)

 

- 과정10 )

- 가장 점수가 좋은 와인은?

  가정 높은 점수는 100점이다.

 

reviews['points'].max()

 

 - 100점을 받은 와인 데이터만 loc를 사용하여 출력한다.

 

reviews.loc[reviews['points'] == reviews['points'].max() , ]

reviews.loc[reviews['points'] == 100, ].count

 

- 과정11 )

- 점수는 높고 가격은 싼 와인 순으로 보여주시오.

- points는 내림차순으로, price는 오름차순으로 정렬

- 이때 ascending도 리스트화 하여 ['points','price']    ascending=[False,True]) 해준다.

 

reviews.sort_values(['points','price'],ascending=[False,True])

 

- 과정12 )

- 포인트별로, 가격의 최소값을 구해본다
- 이것을 구하면 100점짜리 와인을 먹으려면, 최소한 얼마가 있어야 하는지 파악이 가능함.

 

reviews.groupby('points') # 포인트별로 묶어라

reviews.groupby('points')['price'].min()

 

- 과정13 )

- 포인트별로 제일 싼 와인과 제일 비싼와인을 한번에 보기

 

import numpy as np
reviews.groupby('points')['price'].agg([np.min , np.max])  # agg함수 : 집계하다.

import numpy as np
reviews.groupby('points')['price'].agg([np.min , np.max]).sort_index(ascending=False)  # 포인트 내림차순 정렬

 

실습 끝!

반응형