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()

 

 

+ Recent posts