Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬(Python)으로 인구 조사(Census) 데이터 분석하기


인구 조사(Census)란 특정 인구 집단에 대한 정보를 체계적인 방식으로 기록하는 작업을 말합니다. 수집되는 데이터에는 인구 통계(demographic), 경제 활동, 주거 형태 등 다양한 범주의 정보가 포함됩니다. 이러한 데이터는 정부가 현재 상황을 정확히 파악하고 미래를 계획하는 데 중요한 기초 자료로 활용됩니다.

이 글에서는 파이썬(Python)을 활용해 인도 인구 조사 데이터를 분석하는 방법을 단계별로 살펴봅니다. 인구 통계 및 경제적 측면을 다양하게 분석하고, 그 결과를 그래프로 시각화하여 한눈에 파악할 수 있도록 구성했습니다. 사용된 데이터셋은 Kaggle에서 수집한 것으로 여기에서 다운로드할 수 있습니다.

데이터 준비하기

분석에 앞서 먼저 간단한 파이썬 코드로 데이터를 불러옵니다. 아래 프로그램은 CSV 파일을 판다스(pandas) 데이터프레임으로 로드하여 이후 분석에 활용할 수 있게 해줍니다. 출력 결과에서는 가독성을 위해 일부 필드만 표시됩니다.

예제 코드

import pandas as pd
datainput = pd.read_csv('E:\\india-districts-census-2011.csv')
#https://www.kaggle.com/danofer/india-census#india-districts-census-2011.csv
print(datainput)

실행 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

      District code ... Total_Power_Parity
0                 1 ...               1119
1                 2 ...               1066
2                 3 ...                242
3                 4 ...                214
4                 5 ...                629
..            ... ...                ...
635             636 ...              10027
636             637 ...               4890
637             638 ...               3151
638             639 ...               3151
639             640 ...               5782

[640 rows x 118 columns]

총 640개 구(district)와 118개 열(column)로 구성된 방대한 데이터셋임을 확인할 수 있습니다.

두 주(State) 간 유사도 분석

데이터를 확보했다면, 이제 두 개의 주가 다양한 측면에서 얼마나 유사한지 분석해 볼 수 있습니다. 유사도는 연령대, 컴퓨터 보유 현황, 주택 가용성, 교육 수준 등 여러 기준으로 비교할 수 있습니다.

아래 예제에서는 아삼(Assam) 주안드라프라데시(Andhra Pradesh) 주를 선택해 유사도 행렬(similarity_matrix)로 두 주를 비교합니다. 두 주에 속한 모든 구 쌍(pair)에 대해 전체 데이터 필드를 대상으로 제곱 차이의 합을 계산한 뒤, 이를 정규화하여 유사도 점수를 산출합니다. 최종 결과는 히트맵(heatmap)으로 시각화되며, 색이 진할수록 두 지역이 더 밀접하게 관련되어 있음을 의미합니다. 또한 코드는 가장 유사도가 높은 구 쌍을 찾아 출력해 줍니다.

예제 코드

import pandas as pd
import matplotlib.pyplot as plot
from matplotlib.colors import Normalize
import seaborn as sns
import math
datainput = pd.read_csv('E:\\india-districts-census-2011.csv')
df_ASSAM = datainput.loc[datainput['State name'] == 'ASSAM']
df_ANDHRA_PRADESH = datainput.loc[datainput['State name'] == 'ANDHRA PRADESH']
def segment(x1, x2):
   # Set indices for both the data frames
   x1.set_index('District code')
   x2.set_index('District code')
   # The similarity matrix of size len(x1) X len(x2)
   similarity_matrix = []
   # Iterate through rows of df1
   for r1 in x1.iterrows():
      # Create list to hold similarity score of row1 with other rows of x2
      y = []
      # Iterate through rows of x2
      for r2 in x2.iterrows():
         # Calculate sum of squared differences
         n = 0
         for c in list(datainput)[3:]:
            maximum_c = max(datainput[c])
            minimum_c = min(datainput[c])
            n += pow((r1[1][c] - r2[1][c]) / (maximum_c - minimum_c), 2)
         # Take sqrt and inverse the result
         y.append(1 / math.sqrt(n))
      # Append similarity scores
      similarity_matrix.append(y)
   p = 0
   q = 0
   r = 0
   for m in range(len(similarity_matrix)):
      for n in range(len(similarity_matrix[m])):
         if (similarity_matrix[m][n] > p):
            p = similarity_matrix[m][n]
            q = m
            r = n
   print("%s from ASSAM and %s from ANDHRA PRADESH are most similar" % (x1['District name'].iloc[q],x2['District name'].iloc[r]))
   return similarity_matrix
m = segment(df_ASSAM, df_ANDHRA_PRADESH)
normalization=Normalize()
s = plot.axes()
sns.heatmap(normalization(m), xticklabels=df_ANDHRA_PRADESH['District name'],yticklabels=df_ASSAM['District name'],linewidths=0.05,cmap='Oranges').set_title("similar districts matrix of assam AND andhra_pradesh")
plot.rcParams['figure.figsize'] = (20,20)
plot.show()

실행 결과

위 코드를 실행하면 두 주의 구별 유사도를 보여주는 다음과 같은 히트맵이 생성됩니다.

파이썬(Python)으로 인구 조사(Census) 데이터 분석하기

특정 지표 비교하기

전체 데이터를 종합적으로 비교하는 것 외에도, 특정 지표를 기준으로 지역을 비교할 수 있습니다. 아래 예제에서는 각 주의 농경 종사자(Cultivator Workers) 수가정용 컴퓨터 보유 가구 수를 비교합니다. 주별로 이 두 지표를 나란히 보여주는 수평 막대그래프를 생성함으로써, 농업 중심 지역일수록 컴퓨터 보급률이 어떤 경향을 보이는지 직관적으로 확인할 수 있습니다.

예제 코드

import pandas as pd
import matplotlib.pyplot as plot
from numpy import *

datainput = pd.read_csv('E:\\india-districts-census-2011.csv')
z = datainput.groupby(by="State name")
m = []
w = []
for k, g in z:
   t = 0
   t1 = 0
   for r in g.iterrows():
      t += r[1][36]
      t1 += r[1][21]
   m.append((k, t))
   w.append((k, t1))
mp= pd.DataFrame({
   'state': [x[0] for x in m],
   'Households_with_Computer': [x[1] for x in m],
   'Cultivator_Workers': [x[1] for x in w]})

d = arange(35)
wi = 0.3
fig, f = plot.subplots()
plot.xlim(0, 22000000)
r1 = f.barh(d, mp['Cultivator_Workers'], wi, color='g', align='center')
r2 = f.barh(d + wi, mp['Households_with_Computer'], wi, color='b', align='center')
f.set_xlabel('Population')
f.set_title('COMPUTER PENETRATION IN VARIOUS STATES W.R.T. Cultivator_Workers')
f.set_yticks(d + wi / 2)
f.set_yticklabels((x for x in mp['state']))
f.legend((r1[0], r2[0]), ('Cultivator_Workers', 'Households_with_Computer'))
plot.rcParams.update({'font.size': 15})
plot.rcParams['figure.figsize'] = (15, 15)
plot.show()

실행 결과

위 코드를 실행하면 주별 농경 종사자 수와 컴퓨터 보유 가구 수를 비교하는 다음과 같은 그래프가 생성됩니다.

파이썬(Python)으로 인구 조사(Census) 데이터 분석하기

마무리

이처럼 파이썬의 pandas, matplotlib, seaborn 라이브러리를 활용하면 방대한 인구 조사 데이터를 손쉽게 불러오고, 주 간 유사도 분석부터 특정 지표의 시각화까지 다양한 인사이트를 도출할 수 있습니다. 소개한 예제 코드를 응용하면 교육 수준, 주거 환경, 경제 활동 등 다른 지표에 대해서도 동일한 방식으로 분석을 확장해 볼 수 있습니다.