데이터 분석일지/마케터, 기획자를 위한 실전 데이터 분석

Numpy와 Seaborn 라이브러리로 데이터 분석하기

유니스방 2024. 5. 8. 14:29

이번 포스트에선 스파르타코딩클럽의 "[왕초보] 마케터, 기획자를 위한 실전 데이터 분석" 수업 중 2주차 수업에서 한 걸음 더 나아가기 세션에 대한 개발일지를 정리하고자 한다.

 

한 걸음 더 나아가기 세션을 요약하자면, Pandas와 Matplotlib 라이브러리 말고 또다른 파이썬 라이브러리인 Numpy와 Seaborn 라이브러리로 데이터를 분석하는 세션이었다.

 

그럼 데이터를 분석하는 총 5가지 단계인 1) 문제 정의 및 가설 설정하기 → 2) 데이터 분석 기본 세팅 및 데이터 가공하기 → 3) 데이터 분석하기 → 4) 분석 결과 시각화하기 → 5) 최종 결론 내리기 순서로 포스트를 정리해보겠다.

 


1) 문제 정의 및 가설 설정하기

 

2주차에서 Kaggle의 타이타닉 데이터를 가지고 "타이타닉 데이터 중 생존율과 다른 데이터의 상관관계"를 분석하였고,

아래와 같은 그래프로 상관관계를 시각화할 수 있었다.

(2주차 수업에 대한 개발일지는 아래 링크를 참고 바란다.

Colab으로 본격 데이터 분석하기 :: 유니스방의 UX World (tistory.com)

 

Colab으로 본격 데이터 분석하기

스파르타코딩클럽의 "[왕초보] 마케터, 기획자를 위한 실전 데이터 분석" 수업 중 2주차 수업에 대한 개발일지이다. 이번 수업의 목표는 총 3가지이다:1. 데이터 분석을 위한 Python 기초 문법을 습

yunicebahngux.tistory.com

 

 

 

 

위 그래프를 보았을 때, 생존율과 가장 높은 상관관계를 가진 요소는 성별(Sex)와 탑승등급(Pclass)였다.

 

그런데, 나이와 생존율의 관계가 미미한 수치로 나왔는데 정말 상관관계가 미미할까?

여기서 한 걸음 더 나아가서, "나이대별로 생존율과의 관계"를 좀 더 명확히 파악할 수 있다.

 

 

 

 

2) 데이터 분석 기본 세팅 및 데이터 가공하기


데이터를 가공하기에 앞서서, Numpy와 Seaborn 라이브러리는 어떤 목적을 가지고 활용하면 좋은지 알아보자.

 

Numpy는 데이터 연산을 빠르고 쉽게 할 수 있게 도와주는 라이브러리다.

 

파이썬으로 복잡한 수치를 계산할 때 거의 필수적으로 사용되는 라이브러리다.

단순 계산기보다는 더 뛰어난 연산 능력을 가진 계산기라고 생각하면 된다.

 

Seaborn은 Matplotlib으로부터 만들어진 데이터 시각화를 위한 라이브러리다.

 

기본 Matplotlib 라이브러리보다 더 다양한 스타일의 그래프를 적용할 수 있다.

주로 랜덤하게 분포되어 있는 데이터를 시각화할 때 사용한다.


 

이제 데이터를 불러오고 확인해보자.

먼저 필요한 라이브러리들을 불러와준다.

 

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np #numpy 라이브러리: 숫자와 관련된 연산들을 잘 소화해주는 라이브러리.
import seaborn as sns #seaborn 라이브러리: matplotlib 으로 부터 만들어진 데이터 시각화를 위한 라이브러리.

 

 

그 다음에 분석할 데이터를 불러와주고 확인한다.

titanic = pd.read_table('train.csv',sep=',')
titanic.head(100)

 

데이터에 누락된 결측치를 제거해준다.

#print(titanic.isnull().sum()) #titanic.isnull=빈값 알려달라.
titanic = titanic.dropna() #drop.na=비어있는 행은 날려버려라.
print(titanic.isnull().sum())

 

총 데이터수, 평균, 표준 편차 등을 한눈에 보기 위하여, 타이타닉 데이터 통계치를 요약할 수 있다.

titanic.describe() #데이터에 대한 summary. #std: 표준편차

 

titanic.describe() 코드 선언 결과

 

 

여기서 우리의 가설은 나이와 생존률의 상관관계를 분석하는 것이므로, 나이에 초점을 맞춰야 한다.

참고로 나이에 대한 분포도 그래프를 히스토그램으로 그려볼 수 있다.

 

참고로 히스토그램은 추이를 볼 때 많이 이용하므로, 데이터 숫자가 어마어마하게 많으면 바그래프보다는 히스토그램을 활용하는게 나을 수 있다.

 

#나이별로 히스토그램 구하기
titanic['Age'].hist(bins=40,figsize=(18,8),grid=True)

 

나이에 대한 분포도 그래프 (히스토그램)

 

 

 3) 데이터 분석하기

 

우리의 가설은 나이대별 생존율과의 관계를 알아내는 것이다.

 

먼저 나이 연령대를 선언해주는 작업을 진행해줘야 한다.

#나이별 구분 및 각 나이별 생존율 확인 하기
#baby: 0~3, children: 7~15..이렇게 라벨링하는 작업.
titanic['Age_cat'] = pd.cut(titanic['Age'],bins=[0,3,7,15,30,60,100],include_lowest=True,labels=['baby','children','teenage','young','adult','old'])

 

직접 라벨링해준 연령대를 기준으로 평균 값을 구한다.

#연령대를 기준으로 평균 값을 구해 볼수 있어요!
titanic.groupby('Age_cat').mean()

 

여기서 groupby() 코드는 원하는 컬럼을 기준으로 그룹을 묶을 수 있게 해주는 함수이고,

mean() 함수는 평균값을 구하는 함수이다.

 

즉, 위 코드에서는 'Age-cat' (나이 연령대)를 기준으로 그룹을 묶어 평균값을 구해주는 것이다. 아래와 같은 표를 출력하고 싶으면 print() 함수를 사용하면 된다.

print(titanic.groupby('Age_cat').mean())

 

 

 

 

4) 분석 결과 시각화하기

 

3번에서 분석한 내용을 이제 시각화해보자.

#그래프 크기 설정
plt.figure(figsize=(14,5))

# 바 그래프 그리기 (x축 = Age_cat, y축 = Survived)
sns.barplot(x='Age_cat',y='Survived',data=titanic)

# 그래프 나타내기
plt.show()

 

 

 

 

5) 최종 결론 내리기 

 

 

이전에 그래프를 그렸을 때는 나이와 생존율은 상관관계가 거의 없었으나,

위 그래프를 보았을 때, 나이대 별로 나누어서 생존율과의 관계를 보니, baby와 children의 생존율이 다른 연령대에 비해서 높다는 것을 알 수 있었다.

 

 


 

이렇게 Pandas와 Matplotlib 뿐만 아니라, 더 다양한 라이브러리를 활용해 데이터를 분석해보는 경험을 쌓을 수 있었고,

하나의 가설에서만 생각하는 것이 아닌, 더 넓은 시각을 가지고 다양한 가설을 시도해보면 새로운 인사이트를 얻을 수 있다는 것을 배웠다.

 

위 내용을 진행한 전체 코드는 아래와 같다.

코드를 출력할 때 잠시 숨김처리하고 싶었던 코드는 주석으로 처리해두었다.

참고하면 좋을 것 같다:

 

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np #numpy 라이브러리: 숫자와 관련된 연산들을 잘 소화해주는 라이브러리.
import seaborn as sns #seaborn 라이브러리: matplotlib 으로 부터 만들어진 데이터 시각화를 위한 라이브러리.

titanic = pd.read_table('train.csv',sep=',')
titanic.head(100)

#print(titanic.isnull().sum()) #titanic.isnull=빈값 알려달라.
titanic = titanic.dropna() #drop.na=비어있는 행은 날려버려라.
print(titanic.isnull().sum())
titanic.describe() #데이터에 대한 summary. #std: 표준편차

#나이라는 것도 세부적으로 뜯어볼 수 있다.

#나이별로 히스토그램 구하기
titanic['Age'].hist(bins=40,figsize=(18,8),grid=True)

#나이별 구분 및 각 나이별 생존율 확인 하기
#baby: 0~3, children: 7~15..이렇게 라벨링하는 작업.
titanic['Age_cat'] = pd.cut(titanic['Age'],bins=[0,3,7,15,30,60,100],include_lowest=True,labels=['baby','children','teenage','young','adult','old'])

#연령대를 기준으로 평균 값을 구해 볼수 있어요!
titanic.groupby('Age_cat').mean()

print(titanic.groupby('Age_cat').mean())

#그래프 크기 설정
plt.figure(figsize=(14,5))

# 바 그래프 그리기 (x축 = Age_cat, y축 = Survived)
sns.barplot(x='Age_cat',y='Survived',data=titanic)

# 그래프 나타내기
plt.show()