Today I Learned

[내일배움캠프_데이터분석] 5주차 금요일 TIL _ 피벗테이블

journal201 2024. 7. 26. 21:10

A. 금일 학습내용

1.  피벗테이블(pivot table) 

- 정의: 데이터프레임에서 특정 기준으로 데이터를 집계하고 요약한 테이블

- 구성:

          행 위치에 들어갈 열              index =

          열 위치에 들어갈 열              columns =

          데이터값  위치에 들어갈 열  values = 

          집계함수                               aggfunc =

pd.pivot_table(
    data,           # 피벗 테이블을 만들 데이터프레임
    index=None,     # 행 레벨을 지정하는 열 또는 열의 리스트
    columns=None,   # 열 레벨을 지정하는 열 또는 열의 리스트
    values=None,    # 피벗 테이블에 채울 값을 지정하는 열 또는 열의 리스트
    aggfunc='mean', # 집계 함수를 지정 (기본값은 'mean')
    )

- 예시

#pd.pivot_table() 함수를 사용하여 피벗테이블 생성
data = {
    'category': ['A', 'B', 'A', 'B', 'A'],
    'value': [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)
df.pivot_table(index='category', values='value', aggfunc='sum')

- df의 모양은 이렇게 생겼다. 이 데이터로 피벗테이블을 만들면 아래와 같은 결과가 나온다.

- 카테고리 A에 해당하는 value 값을 'aggfunc'에서 지정했던 것처럼 모두 더한 값이 들어간다.

- 카테고리 B에 해당하는 value값도 카테고리 A와 같은 방식으로 값이 할당된다.

 

2. 응용버전

- 기초적인 피봇테이블은 쉽다.

- 데이터는 kaggle에서 제공하는 Spotify 사용자 행동 데이터세트 를 사용하고자 한다.

- 그렇다면 좀 더 많은 데이터를 피벗테이블로 불러와 분석해보자.

# 데이터 재조정
data = {
    'spotify_listening_device': [
        'Computer or laptop', 
        'Smartphone', 
        'Smartphone, Computer or laptop', 
        'Smartphone, Smart speakers or voice assistants', 
    ],
    'Afternoon': [31, 9, 2, 27],
    'Morning': [15, 4, 2, 8],
    'Night': [6, 1, 1, 7]
}

- 딕셔러니 자료형 data가 생성되었다.

- 이 모양이면 피벗테이블에 적용도 못할테니 형태를 맞춰주도록 하자.

# DataFrame 생성
df2 = pd.DataFrame(data)

# DataFrame의 인덱스 설정
df2.set_index('spotify_listening_device', inplace=True)

- data에 DataFrame 함수를 적용하여 테이블 형태를 갖추게 하였다.

- 'spotify_listening_device'를 인덱스로 설정하였다.

- 이제 모든 정리가 완료된 것 같으니 피벗테이블을 만들어보자.

# 피벗 테이블 만들기
pivot_table = df2.pivot_table(index=df2.index, 
                              values=['Afternoon', 'Morning', 'Night'], 
                              aggfunc='sum', 
                              fill_value=0)

- 앞에서 보았던 피벗 테이블의 구성을 다시 한번 보면서 어떤 값들이 들어갔는지 확인하면 아래와 같다.

- 구성:

          행 위치에 들어갈 열              index = df2.index

          열 위치에 들어갈 열              columns =  ????????????????

          데이터값 위치에 들어갈 열   values = ['Afternoon','Morning','Night']

          집계함수                               aggfunc = sum

          결측치 발생시 대응방법        fill_value = ??????????????

- 열 인덱스 columns가 안 들어고 fill_value=0 이 추가되었다.

- 우선 fill_value = 0 은 결측값일 때 0으로 채우라는 조건이다.

-  열 인덱스 columns는 필요없다. 

- 이미 value에 칼럼 값을 지정해두었기 때문이다.

 

3. 심화버전

- 그렇다면 3개의 데이터를 하나의 피벗 테이블에 넣는 것은 어떨까.

- 연령대별 시간대별 장르 선호도를 분석할 예정이다.

- 선호하는 음학 장르별 수를 센 결과값이다.

# df는 전체 데이터전처리 과정이 끝난 테이블을 담고 있다.
pivot_table = df.pivot_table(index=['Age','music_time_slot'],
	             	     columns='fav_music_genre',
                             aggfunc='size',
                             fill_value=0)

- 구성:

          행 위치에 들어갈 열          index = ['연령 칼럼명', '음악 청취시간 칼럼명']

          열 위치에 들어갈 열          columns =  '음악장르 칼럼명'

          데이터 위치에 들어갈 열   values = 집계함수를 통해 나타나는 수

          집계함수                            aggfunc = size

          결측치 발생시 대응방법    fill_value = 0

 

4. 시각화

- 시각화를 통해 데이터가 무슨 내용을 전달하는지 더 효과적으로 파악할 수 있다.

pivot_table.plot(kind='barh', stacked=True)
plt.title('age,time and genre')
plt.ylabel('age and time')
plt.xlabel('genre count')
plt.legend(title='genre', bbox_to_anchor=(1, 1))
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

◆ 데이터 분석

  1. 시간대별로 선호되는 음악 장르가 다르게 나타난다. 아침에는 팝, 클래식 & 멜로디, 댄스 장르가 많이 선호되고, 밤에는 랩, 올드송, 록 장르가 많이 선호된다.
  2. 젊은층(20-35세)에서는 전자음악/댄스, 힙합, 팝 장르가 상대적으로 더 선호되는 반면, 중장년층(35-60세)에서는 클래식 & 멜로디, 올드송 장르가 더 선호되는 것으로 보인다.
  3. 전반적으로 장르 다양성이 높은 것으로 나타나, 다양한 음악 장르들이 고르게 소비되고 있음을 알 수 있다.
  4. 특정 시간대와 연령층에 따라 선호되는 음악 장르의 차이가 뚜렷하게 나타나므로, 이를 고려한 타깃 마케팅이 필요할 것으로 보인다.

B. 마무리

유의미한 데이터를 파악하고, 데이터를 읽는 것뿐만 아니라 한 발 더 나아가는 것은 생각보다 어려운 일이었다.

이제 처음 배우는 것이라 답답한 마음이 더 크지만 하나씩 배워나가며 성장해 나갈 수 있다는 기회가 있음에 감사하다.

머신러닝, 딥러닝 등의 알고리즘을 공부하고, 통계 공부도 하고, 수학 공부도 하고 병행해야 하는 것들이 많아졌다.

하나에 집중해서 12시간 동안 몰입하는 것이 어렵다면 나는 학교 시간표와 같이 시간을 나눠 일정시간 몰입하는 방법으로 나아가고자 한다.