데이터분석/Python 파이썬 1달만에 마스터하기

Day18 파이썬 apply 함수, groupby 함수, 시각화_일변량 이변량 그래프 [파이썬 1달만에 마스터하기]

어반닥터 2024. 2. 5. 12:12
728x90
반응형
Day 18
판다스 (Pandas) Groupby 함수

판다스에서의 GroupBy 쉽게 이해하기
: 그룹화는 데이터를 쉽게 이해하기 위해 비슷한 특성을 가진 것들을 모으는 것 (ex. 학교에서 학생들을 '좋아하는 과목'에 따라 그룹으로 나눠 볼 수 있음) 
판다스에서도 이런 그룹화가 가능하며, 만약 학생들의 데이터가 있고, '이름' '학년' '좋아하는 과목' 열이 있다면, '좋아하는 과목'을 기준으로 그룹화 할 수 있음. 
이렇게 그룹화를 하면, 각 과목을 좋아하는 학생들의 평균 성적이나, 각 학년별로 어떤 과목이 인기 있는지 알아볼 수 있으며, 이런 분석을 통해 데이터에 숨겨진 패턴을 발견할 수 있음

(GroupBy 예시)

import pandas as pd
import random
from faker import Faker
faker = Faker ('ko_KR') #한글이름 랜덤 불러오기

# name, ages, genders, movies, payment methods, snacks, drinks, times

ageList = [20,30,40,50,60] #연령대 설정
agePercent = [30,30,20,15,5]  #연령대 비율 설정
genderList = ['m','f']
movieList = ['웡카','시민덕희','도그맨','너의 이름은','외계인']
moviePercent = [40,10,5,5,40]  #영화 시청률 설정
paymentsList = ['현금','체크카드','신용카드','카카오페이','네이버페이']
paymentsPercent = [5,30,35,20,10]
snackList = ['선택안함','일반','캬라멜','나초','오징어','맛밤']
snackPercent = [40,10,20,15,10,5]
drinkList = ['선택안함','콜라','제로콜라','물','에이드','스프라이트','오렌지주스']
drinkPercent = [30,10,20,10,10,15,5]
timeList = ['조조','일반','심야']
timePercent = [20,70,10]

data = {
    'name': [faker.name() for i in range (500)],
    # faker에서 이름을 500개 만들기
    'ages':[random.choices(ageList, weights=agePercent, k=1) for i in range (500)],
    # ageList에서 500개 랜덤 초이스 & agePercent가중치 적용하기, k=1은 결과의 첫번째를 뽑는걸로 설정
    'genders': [genderList[random.randint(0,1)] for i in range(500)],
    'movies': [random.choices(movieList, weights=moviePercent, k=1) for i in range (500)],
    'payments': [random.choices(paymentsList, weights=paymentsPercent, k=1) for i in range (500)],
    'snacks': [random.choices(snackList, weights=snackPercent, k=1) for i in range (500)],
    'drinks': [random.choices(drinkList, weights=drinkPercent, k=1) for i in range (500)],
    'times': [random.choices(timeList, weights=timePercent, k=1) for i in range (500)],
}

df = pd.DataFrame(data)

pd.read_csv('cgv.csv')
print(df.shape) #행과 열의 수
print(df.index) #행 정보
print(df.columns) #열 정보
print(df.values)  #데이터
print(df.head(20)) #위에서 20개 가져오기
print(df.tail(20)) #뒤에서 20개 가져오기
print(df.describe()) #전체 데이터 요약본
    #       name  ages genders movies payments  snacks  drinks times
    #count   500   500     500    500      500     500     500   500
    #unique  408     5       2      5        5       6       7     3
    #top     김진호  [30]       f   [웡카]   [신용카드]  [선택안함]  [선택안함]  [일반]
    #freq      5   160     260    205      169     190     161   359

#--------------------------
# group_by:  기준 잡기
#
group_by_movies = df.groupby('movies') # 영화별로 그룹핑
ages_group_by_movies = group_by_movies['ages'].value_counts()
print(ages_group_by_movies)
group_by_times = df.groupby('times')
print(group_by_times.value_counts())
drinks_group_by_times = group_by_times['drinks'].value_counts()
print(drinks_group_by_times)

#나이대별로 지불 그룹핑
group_by_ages = df.groupby('ages')
payments_group_by_ages = group_by_ages['payments'].value_counts()
print(payments_group_by_ages)
#영화별로 스낵 그룹핑
group_by_movies = df.groupby('movies')
snacks_group_by_movies = group_by_movies['snacks'].value_counts()
print(snacks_group_by_movies)
#시간대별로 영화 그룹핑
group_by_times = df.groupby('times')
movies_group_by_times = group_by_times['movies'].value_counts()
print(movies_group_by_times)

 

판다스 (Pandas) Apply 함수

판다스에서의 Apply 함수 쉽게 이해하기
: 판다스의 DataFrame에서 'apply'함수를 사용하면, 사용자가 정의한 함수를 각 행이나 열에 적용할 수 있음. 예를 들어, 학생들의 성적 데이터가 있고 '수학' '영어' '과학' 열이 있다면, 각 학생의 평균 성적을 계산하기 위해 apply 함수를 사용할 수 있음. 
이렇게 apply 함수를 활용하면, 데이터셋의 각 행이나 열에 복잡한 연산을 쉽고 빠르게 적용할 수 있음. 또한, 이를 통해 데이터를 더 깊이 분석하고 의미있는 인사이트를 얻을 수 있음. 이러한 분석은 데이터를 더 효과적으로 이해하고 활용하는 데 도움이 됨. 

(Apply함수 예시)

import pandas as pd
# apply : 새로운 열 만들기

df = pd.read_csv('cgv.csv')
def recommendPopcornForSenior(row):
    if row['ages']==50 and row['snacks']=='일반':
        return '할인 대상'
    else:
        return '할인 없음'

#    name  ages genders      movies  ...    snacks     drinks   times 50대 할인 이벤트
#0    이예은  [30]       f     ['외계인']  ...   ['캬라멜']   ['제로콜라']  ['일반']      할인 없음
#1    김영식  [30]       f    ['시민덕희']  ...    ['일반']   ['선택안함']  ['조조']      할인 없음
#2    박도현  [50]       m     ['외계인']  ...  ['선택안함']  ['스프라이트']  ['일반']      할인 없음
#3    배지훈  [30]       m     ['외계인']  ...    ['나초']   ['선택안함']  ['일반']      할인 없음
#4    이명숙  [60]       m  ['너의 이름은']  ...  ['선택안함']   ['선택안함']  ['일반']      할인 없음
#..   ...   ...     ...         ...  ...       ...        ...     ...        ...

#조조이고 체크카드를 사용하면 조조이벤트 해당됨, 해당안됨
def morningEvent(row):
    if row['times']=='조조' and row ['payments'] == '체크카드':
        return '해당됨'
    else:
        return '해당안됨'

def comboEvent(row):
    if row['snacks']=='일반' and row ['drinks'] == '제로콜라':
        return '제로콤보 세트'
    else:
        return '해당없음'

df['제로이벤트'] = df.apply(comboEvent,axis=1)
df['50대 할인 이벤트'] = df.apply(recommendPopcornForSenior,axis=1)
df['조조이벤트'] = df.apply(morningEvent,axis=1)

print(df)
#    name  ages genders      movies  ...   times 제로이벤트 50대 할인 이벤트 조조이벤트
#0    이예은  [30]       f     ['외계인']  ...  ['일반']  해당없음      할인 없음  해당안됨
#1    김영식  [30]       f    ['시민덕희']  ...  ['조조']  해당없음      할인 없음  해당안됨
#2    박도현  [50]       m     ['외계인']  ...  ['일반']  해당없음      할인 없음  해당안됨
#3    배지훈  [30]       m     ['외계인']  ...  ['일반']  해당없음      할인 없음  해당안됨
#4    이명숙  [60]       m  ['너의 이름은']  ...  ['일반']  해당없음      할인 없음  해당안됨
#
판다스 (Pandas) 데이터 시각화

  • Matplotlib 라이브러리
  • 데이터 범주형
  • 일변량 그래프
  • 이변량 그래프
  • 다변량 그래프

(일변량그래프 예시)

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv('cgv.csv')
snacks_by_times = df.groupby('times')['snacks'].value_counts()
morning_time_snack = snacks_by_times['조조']

plt.rcParams['font.family'] = 'Malgun Gothic' #폰트 설정
morning_time_snack.plot.pie(autopct = '%1.1f%%') # plot.pie() 파이그래프, autopct = 소수점자리 설정
plt.show() # 보여주기

 

(이변량그래프 예시)

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.read_csv('cgv.csv')

# 1. 시간과 음료 그룹핑
# 2. 크기 계산하기 size()
# 3. 피벗 테이블화
table = df.groupby(['times','drinks']).size().unstack(fill_value=0)
print(table)
#drinks  ['물']  ['선택안함']  ['스프라이트']  ['에이드']  ['오렌지주스']  ['제로콜라']  ['콜라']
#times
#['심야']      2        18          8        4          3        16       3
#['일반']     46        98         51       32         20        76      36
#['조조']      7        19         19        7          7        19       9

plt.rcParams['font.family'] = 'Malgun Gothic'
sns.heatmap(table, cmap='coolwarm') #cmap 은 색상설정
plt.show()

반응형