본문 바로가기
  • 사진, 커피, 그리고 광고를 좋아합니다
마케팅/빅데이터

파이썬을 통한 빅데이터 분석_인구분석 |통계청 | 오늘코드

by 섭케터 2020. 10. 30.

손코딩을 하면 실력이 항상 될 것 같아서 제가 요즘 즐겨보는 오늘코드님의 유튜브를 보며 따라 적어봤어요.

역시 손코딩을 통해 하니까 비슷한 것은 금방금방 외우게 되네요~

오늘코드님의 통계청 데이터를 활용한 인구분석

제가 빅데이터에서 중요하게 생각하는 것은 시각화인데 오늘코드님이 간단하게 정리해주셔서 좋습니다!
여러 데이터셋을 바탕으로 하는데 오늘은 통계청에소 검색하여 CSV파일을 받아 활용한 파일이네요.

총 6단계로 정리할수 있어요.

1. 데이터 불러오기
2. 데이터 멜팅
3. 데이터 전처리
4. 판다스를 이용한 시각화
5. 씨본을 이용한 시각화
6. 특정구역을 보는 시각화

아래는 수업에서 나온 코드를 손코딩 한 것입니다~


import pandas as pd
df_kosis = pd.read_csv("data/population_kosis_1997_2018.csv", encoding = "cp949") # cp949는 csv파일에서 한글을 읽을떄 유효
df_kpsis.shape # 행과 열을 파악

pd.options.display.max_columns = 793 #...으로 보여진 영역을 다 보기 위해서
"""
데이터를 어떻게 분석할지 감이 잘오지 않는다
피봇 테이블 형태가 아니라 타이디 데이터 형식으로 만들어줘야 된다.
"""
df_kosis.head() #개략적인 데이터 파악

df = df_kosis.melt(id_vars="시군구별")

df["시군구별"].unique()

df.shape
df[df["시군구별"] != "시군구별"].copy() #df에 뒤집어 씌운다.
df.shape

df.head()

"""
연도, 월, 성별로 나눌거
"""
#expand하면 데이터 프레임 형태로 보여준다
df["연도"] = df["variable"].str.split(".", expand=true)[0]
df["월"] = df["variable"].str.split(".", expand=true)[1]
df["성별"] = df["variable"].str.split(".", expand=true)[2]
df.head()

df["성별"].unique()

df["성별"].nunique() #유니크의 밸류가 몇개인지 셀때 앤유니큐 none은 세지 않는다

df["성별"] = df["성별"].fillna("전체")
df["성별"].unique()

df["성별"] = df["성뵬"].replace("1", "남자").replace("2", "여자") #할당을 해줘야 반영됨
df["성뵬"].unique()

df["성뵬"].value_counts()

df.head()

df = df.rename(columns={"variable": "기간", "value" : "출생아수"})
df.head()

"""
분석 해보자!
"""

df.info()

import numpy as np
df["출생아수"] = df["출생아수"].replace("-", np.nan) #-를 결측치로 바꿔준다
df["출생아수"] = df["출생아수"].astype(float) #결측치로바꿔줘야 평균에 영향을 끼치지 않는다.
df["출생아수"].describe()

df_all = df[(df["시군구별"] == "전국") & (df["성별" == "전체")]
df_all.head(2)

"""
시각화 해보자! 판다스를 통해
"""
df_all = df_all[["연도별","월","출생아수"]].copy()
df_all.head()

import matplotlib.pyplot as plt
plt.rc("font", family = "Malgun Gothic") #폰트가 깨지는 워닝 메시지를 지우기 위해서

df_all.set_index(["연도","월"]).plot(figsizE=(15,4)) #선그래프
df_all.set_index(["연도","월"]).bar(figsizE=(15,4)) #바그래프

df_all[-24:].set_index(["연도","월"]).plot(figsizE=(15,4)) #최근 24개월

"""
시각화를 해보자! 씨본을 통해서
"""
import seaborn as sns

plt,figure(figsize=(15,4)) #그림자가 있다.
sns.lineplot(data=df_all, x="연도", y="출생아수")

plt,figure(figsize=(15,4)) #그림자가 있다.
sns.lineplot(data=df_all, x="연도", y="출생아수", hue="월")
#월별로 추가 할려면 hue, 그라데이션으로 표현한다.

plt.figure(figsize=(15,4)) #막대가 있다.
sns.barplot(data+df_all, x="연도", y="출생아수")
#바플롯에서는 hue를 하면 보기 어렵다.

#월을 넣어주지 않았다. 그림자는 1~12까지의 값의 범위이다. == CI ==신뢰구간
#판다스와 씨본의 차이점은 연산값을 직접 해줘야 하지만, 씨본은 내부적으로 계싼해준다
#이것이 장점.

"""
지역별 출생아수 분석 해보자!
"""
df_local = df[df["시군구별"] != "전국"].copy() #전국이 아닌것만 #copy를 해주면 df값을 안바꾸고 할수 있음

plt.figure(figsize=(15,4))
sns.pointplot(data=df_local, x="연도", y="출생아수",hue="성별") #점을 찍어 연결

df_local_all = df_local[df_local["성별"] == "전체"]
df_local_all.head()

plt.figure(figsize=(15,4))
sns.pointplot(data=df_local_all, x="연도", y="출생아수")

plt.figure(figsize=(15,4))
sns.pointplot(data=df_local_all, x="연도", y="출생아수", hue="시군구별") #시군구별 레전드리가 가운데 있다...
plt.legend(loc="center right", bbox_to_anchor=(1.25, 0.5), ncol=1) #스택오버 플로우에서 찾음, 레저드 밖으로 옮기기

#서울시, 경기도, 세종특별자치시만 따로 보고싶다.
df_local_2 = df_local_all[
df_local_all["시군구별"].isin(
["서울특별시","경기도","세종특별자치시"])]

plt.figure(figsize=(15,4))
sns.pointplot(data=df_local_2, x="연도", y="출생아수", ci=None, hue="시군구별")
#ci=None 한 이유 : 연산을 빠르게 할려고

df_sj = df[df["시군구별"] == "세종특별자치시"]

#기간이 시작되는 곳부터 그리고 싶다.
df_sj = df[df["시군구별"] == "세종특별자치시"].dropna(how="any")

sns.pointplot(data=df_sj, x="duseh", y="출생아수", ci=None)

#다 더해서 표현하고 싶다
import numpy as np
sns.pointplot(data=df_sj, x="duseh", y="출생아수", ci=None, estimator = np.sum)


파이썬을 통해 스스로 데이터를 해석하는 것이 마켓팅의 시장조사 단계에서 유리하다고 생각합니다.

분석된 자료를 통한 것보다 데이터를 직접 만지고 보며 얻는 인사이트를 통해 더욱 값진 도출값을 낼 수 있다고 생각하기 때문이에요!

댓글