info) 정규세션 2주차 Tourism 데이터 시각화
Tourism 데이터를 활용하여 시각화 그래프 그리기
1. 초기 환경설정
from IPython.core.display import display, HTML
display(HTML("<style>.container {width:80% !important;}</style>"))
%matplotlib inline
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
from scipy import stats
import warnings
warnings.filterwarnings('ignore')
mpl.rcParams['figure.figsize'] = (12,8) #시각화 figure default 설정
mpl.rcParams['font.family'] = 'NanumGothic' #폰트 디폴트 설정
mpl.rcParams['font.size'] = 10 #폰트 사이즈 디폴트 설정
plt.rcParams['axes.unicode_minus'] = False
%config InlineBackend.figure_format='retina' # 그래프 글씨 뚜렷
2. Tourism 데이터 로드
import pandas as pd
import numpy as np
df = pd.read_csv('./tourism.csv')
df.head(3)
3. 데이터 전처리
3.1 Gender의 'Fe Male' 오기 수정
# 오타가 발생한 'Fe Male'을 'Female'로 수정
df['Gender'].replace('Fe Male', 'Female', inplace=True)
# 수정된 결과 확인
df['Gender'].unique()
3.2 'Age' 결측치 처리
# 성별 나이 중앙값
male_median_age = df.loc[df['Gender'] == 'Male', 'Age'].median() #남자의 나이 중앙값
female_median_age = df.loc[df['Gender'] == 'Female', 'Age'].median() #여자의 나이 중앙값
print('남성 나이 중앙값: ', male_median_age, '여성 나이 중앙값: ', female_median_age)
# Age의 결측치를 중앙값으로 대치
median_age = df['Age'].median()
df['Age'].fillna(median_age, inplace = True)
# Age 값들 확인
df['Age'].unique()
array([28., 34., 45., 29., 42., 32., 43., 36., 35., 31., 49., 52., 33.,
22., 50., 23., 41., 37., 40., 56., 54., 39., 20., 46., 27., 38.,
25., 26., 24., 30., 21., 51., 47., 55., 44., 53., 48., 18., 57.,
60., 59., 19., 58., 61.])
3.3 연령대(Ageband) 파생변수 생성
# 연령대를 반환하는 ageband() 정의
def ageband(x):
if x < 10:
return '10세 이하'
elif x < 20:
return '10대'
elif x < 30:
return '20대'
elif x < 40:
return '30대'
elif x < 50:
return '40대'
elif x < 60:
return '50대'
elif x < 70:
return '70대'
else:
return '80대 이상'
df['Ageband'] = df['Age'].apply(lambda x: ageband(x))
4. 그래프 그리기
Graph1) EDA 그래프
1. 시각화 목적:
1) 전반적인 데이터의 상황을 한눈에 확인하기 위한 목적
2) 개괄적으로 데이터를 살핀 후 필요에 따라 drill-down하여 세부적으로 확인 가능
2. 시각화 과정 소개:
1) 범주형 변수와 연속형 변수를 분리하여 따로 그래프를 그림
2) subplots를 통해 한번에 여러 그래프를 확인할 수 있도록 함
3) 색상은 구매선택과 미선택 사이에 극명한 차이를 둘 수 있도록 대조되는 컬러 사용
4) 연속형 변수에 대한 그래프의 경우, kde(커널 밀도 추청) 그래프를 추가하여 히스토그램에 대한 확률밀도함수를 추정하여 정밀 표현
3. 피드백:
1) 색상 지정에서 hue의 각 변수에 대해 새상을 따로 지정할 수 있는지 확인이 필
2) 가령, 0(미선택)에 대해 부정을 의미하는 빨간색, 1(선택)에 대해 긍정을 의미하는 파란색 부여가 가능한지
Graph1-1) 카테고리형 변수별 상품 신청률(ProdTaken)
#카테고리 변수만 따로 리스트로 분리하고 개수 출력
categorical_list = ['TypeofContact', 'CityTier', 'Occupation', 'Gender', 'NumberOfPersonVisiting', 'PreferredPropertyStar', 'MaritalStatus',
'NumberOfTrips', 'OwnCar','NumberOfChildrenVisiting', 'Designation']
print('카테고리 변수 개수: ', len(categorical_list))
#subplot으로 11개의 변수를 한번에 표시
fig, axes = plt.subplots(3, 4, figsize = (24, 24))
for idx, cat in enumerate(categorical_list):
row = idx // 4
col = idx % 4
sns.countplot(x = cat, hue = "ProdTaken", palette = 'deep', data=df, ax=axes[row][col])
plt.tight_layout()
plt.show()
Graph1-2) 연속형 변수별 신청률(ProdTaken)
#연속형 변수만 따로 리스트로 분리하고 개수 출력
continuous_list = ['Age', 'DurationOfPitch', 'MonthlyIncome']
print('연속형 변수 개수: ', len(continuous_list))
#subplot으로 11개의 변수를 한번에 표시
fig, axes = plt.subplots(1, 3, figsize = (12, 6), squeeze=False)
for idx, con in enumerate(continuous_list):
row = idx // 4
col = idx % 4
sns.histplot(data=df, x=con, hue="ProdTaken", palette = 'Set1', kde= True, multiple='stack', ax=axes[row][col])
plt.tight_layout()
plt.show()
'BACS > 정규세션' 카테고리의 다른 글
[BACS] 정규 세션 2주차 Tourism 시각화 (2) (0) | 2022.11.18 |
---|---|
[BACS] 정규 세션 2주차 Titanic 시각화 (2) (0) | 2022.11.04 |
[BACS] 정규 세션 2주차 Titanic 시각화 (1) (0) | 2022.10.14 |
[BACS] 정규 세션 1주차 (강원도 소방 데이터) (0) | 2022.09.30 |
[BACS] 정규 세션 1주차 (Pandas 실습 - World2012) (0) | 2022.09.27 |