인구 조사(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()실행 결과
위 코드를 실행하면 두 주의 구별 유사도를 보여주는 다음과 같은 히트맵이 생성됩니다.
특정 지표 비교하기
전체 데이터를 종합적으로 비교하는 것 외에도, 특정 지표를 기준으로 지역을 비교할 수 있습니다. 아래 예제에서는 각 주의 농경 종사자(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()실행 결과
위 코드를 실행하면 주별 농경 종사자 수와 컴퓨터 보유 가구 수를 비교하는 다음과 같은 그래프가 생성됩니다.
마무리
이처럼 파이썬의 pandas, matplotlib, seaborn 라이브러리를 활용하면 방대한 인구 조사 데이터를 손쉽게 불러오고, 주 간 유사도 분석부터 특정 지표의 시각화까지 다양한 인사이트를 도출할 수 있습니다. 소개한 예제 코드를 응용하면 교육 수준, 주거 환경, 경제 활동 등 다른 지표에 대해서도 동일한 방식으로 분석을 확장해 볼 수 있습니다.

