데이터 분석에 필요한 패키지 다운
import pandas as pd
import numpy as np
pd.set_option('display.max_columns',None) # 출력셀에 표시될 수를 지정 # 출력 셀에 모든 열 출력
pd.set_option('display.max_rows',None) # 출력셀에 표시될 수를 지정 # 출력 셀에 모든 행 출력
0-1.데이터 읽어오기
df = pd.read_csv('drinks.csv',na_filter=False)
data = pd.read_csv('drinks.csv')
교수님의 코드와 내 코드가 섞여 있을 예정. 내가 읽은 데이터는 df로, 교수님의 예시를 data로 구분
컬럼명 한글로 변경
data.columns = ['국가','맥주','증류주','와인','알코올','대륙'] # 전체
data.rename(columns={'country': '국가명', 'beer_servings' : '맥주 소비량',
'spirit_servings' : '증류주 소비량', 'wine_servings' : '와인 소비량',
'total_litres_of_pure_alcohol' : '순수 알코올',
'continent' : '대륙'},inplace=True)
컬럼명을 변경하는 방법에는 두가지가 있다.
하지만, rename() 은 적은 양의 컬럼을 변경하는데 용이하다. 전체를 바꾸고 싶을때는 df.colums 를 사용하여 재정의 하는 것이 낫다.
결측치 확인
'NA'를 NaN(결측치)로 읽는 것을 방지하기 위해 pd.read_csv 함수의 'na_filter=False' 파라메터 사용 (결측치를 읽어올지 여부 지정)
-> 처음 데이터를 읽어온 df를 보면 알수 있다.
df.isna().sum()
isna()를 사용하여 논리형으로 변경한 후 True() 의 값을 합한 개수
data['대륙'].unique() # 결측치 포함한
# 북아메리카를 의미하는 NA 가 없음
# 결측치 포함한 국가 확인
data[data['대륙'].isna()]['국가']
DataFrame.fillna(값) 또는 Series.fillna(값) : 결측값을 특정 값으로 채우기
data['대륙'] = data['대륙'].fillna('NA')
# 특정 컬럼 -> 명시적 컬럼 지정 필요
명시적으로 NA라고 읽힌 북아메리카의 이니셜을 다시 채워준다.
data.info()
info()를 통해 non-null 개수를 보아도 좋다.
통계값 구하기
DataFrame.describe() : 컬럼별 count, mean, std, min, max, Q1, Q2, Q3 등의 통계값 구하기
# describe() 는 연속형(숫자형) 데이터에 대한 통계를 보여준다.
data.describe()
# 명목형 데이터에 대한 통계치
data.describe(include= object)
# 두 개 다 포함하려면?
data.describe(include='all')
주류 소비량 비교
와인 소비량이 맥주 + 증류주 소비량보다 큰 나라를 검색해,'대륙'을 기준으로 정렬한다.
df[df['와인 소비량']> df[['맥주 소비량','증류주 소비량']].sum(axis=1)].sort_values('대륙')
data[data['와인'] > (data['맥주']+ data['증류주'])].sort_values(by = '대륙') # 값을 가지고 정렬
함수의 활용방법 , 직접적인 덧셈을 통한 비교 두 가지 방법이 존재.
맥주 소비량이 230 초과이면서, 와인 소비량이 230 초과인 나라를 검색
df[(df['맥주 소비량']>230 )& (df['와인 소비량']>230)]['국가명']
data[np.logical_and(data['맥주']>230, data['와인']>230)]
numpy의 np.logical and 를 통해 비교하는 방법도 있다.
전체 평균보다 많은 알코올을 섭취하는 대륙과 알코올 평균 소비량 검색
total_mean = data['알코올'].mean()
print(f'전체 알코올 섭취 평균: {total_mean:.2f}') # 전체 레코드
print()
conti_mean = data.groupby('대륙')['알코올'].mean() # 대륙별 순수 알코올값만의 평균
print('대륙별 알코올 섭취 평균:')
print(conti_mean) # 시리즈 객체
print()
conti_mean_over = conti_mean[conti_mean>total_mean] # 벡터 - 스칼라 자동적으로 크기가 커짐
print('전체 평균보다 많은 알코올을 섭취하는 대륙:')
print(conti_mean_over)
** 별은 주로 groupby() 로 시작하는 것이 좋다.
맥주를 가장 많이 소비하는 국가 확인
data[data['맥주'].max() == data['맥주']][['국가','맥주']]
증류주를 가장 많이 소비하는 국가 확인
data[data['증류주'].max() == data['증류주']][['국가','증류주']]
평균 맥주 소비량이 가장 많은 대륙 확인
#1
beer_avg_counti = data.groupby('대륙')['맥주'].mean()
# print(beer_avg_counti)
beer_avg_counti.sort_values(ascending= False)[[0]]
# [] : 값만 [[]] : 시리즈 객체(리스트 형태로 가져와서)
# 2
beer_avg_counti = data.groupby('대륙')['맥주'].mean()
max_id = np.argmax(beer_avg_counti)
# print(max_id) # 최대값의 인덱스 값이 2 _ 3번째
print(beer_avg_counti[[max_id]])
데이터 프레임 조작
국가별 주류 소비량 합계를 구해 새로운 컬럼 ('주류소비량') 추가
df.groupby('국가명')[['맥주 소비량','증류주 소비량','와인 소비량']].sum()
df['주류소비량'] = df['맥주 소비량'] + df['증류주 소비량'] + df['와인 소비량']
주류 소비량 대비 알코올 소비량 비율을 구해 새로운 컬럼 ('알코올비율') 추가
알코올비율 = '알코올' / '주류소비량'
df['알코올비율'] = df['순수 알코올']/df['주류소비량']
알코올비율'이 NaN인 것에 대해 0으로 채우기
df['알코올비율'] = df['알코올비율'].fillna(0)
알코올비율이 높은 국가(술을 독하게 마시는 국가) TOP5의 ['국가', '주류소비량', '알코올비율'] 정보 조회
top5 = data[['국가','주류소비량','알코올비율']].sort_values('알코올비율',ascending= False).head()
top5.index = np.arange(1,6)
top5
data[['국가','주류소비량','알코올비율']].sort_values('알코올비율' .. 형식으로 3가지의 데이터만 보는 것이 가능해진다.
DataFrame의 index를 ['대륙', '국가'] 로 지정하고, 대륙별, 국가명으로 정렬하여 df로 저장
data = data.set_index(['대륙','국가']).sort_index()
data
멀티인덱스의 데이터 프레임으로 생성되었다.
맥주 소비량
전세계 평균 소비량과 한국의 소비량을 비교하는 DataFrame 만들기
korea = data.loc[[('AS','South Korea')]]
korea.index = ['South Korea']
korea.index.name = '국가'
korea
한국의 소비량(튜플로 된 멀티인덱스이기 때문에 조회를 튜플로 해야함.)
# 뺄 거면 드랍 하면 됨
world_wide = pd.DataFrame(data.mean())
world_wide = world_wide.T
world_wide.index = ['World Wide']
# world_wide.index.name = '국가'
world_wide
한국을 포함한 전세계의 소비량(한국을 제외하는 것도 다르게 조건을 주면 가능하다.)
data.mean() 을 하면 시리즈의 형태로 나오기 때문에 DataFrame()을 만들어준 후 세로로 된 데이터 프레임을 전치 시킨다.
compare = pd.concat([korea, world_wide]) # 행, 열 둘다 가능
compare
concat() 을 사용하여 한국의 소비량과 전세계의 소비량을 이어붙여준다.
pivot_table을 사용하여 대륙별(index), '맥주'와 '와인'의 mean, median, max 값을 구하기
df2.pivot_table(index= '대륙', values=['맥주 소비량','와인 소비량'], aggfunc=['mean','median','max'])
pd.pivot_table(data, index='대륙', values = ['맥주','와인'], aggfunc=[np.mean, 'median','max'])
'국비 교육 > 데이터' 카테고리의 다른 글
[데이터 분석] Pandas 문제 실습 - 4 서울시 공공자전거 대여소 정보 분석 (0) | 2023.11.16 |
---|---|
[데이터 분석] Pandas 문제 실습 - 3 품목별 수출입실적 분석 (0) | 2023.11.16 |
[데이터 분석] Pandas 실습 문제 - 1 (시애틀 강수량 데이터 분석) (0) | 2023.11.15 |
[데이터 분석] Padas - 4 (0) | 2023.11.11 |