데이터분석/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()
반응형