[데이터분석]6. 넘파이를 이용한 프로젝트

1. 알고리즘

  • 우리 동네와 연령별 인구구조가 비슷한 동네 찾기
  1. 데이터 읽어오기
  2. 알고 싶은 지역 이름 입력받기
  3. 해당 지역 인구 구조 저장
  4. 해당 지역의 인구구조와 비슷한 인구구조를 가진 지역 찾기
  5. 해당 데이터 시각화

2. 구현

1) 데이터 읽어오기

import csv
f = open('people.csv')
data = csv.reader(f)
next(data)
next(data)
for row in data:
    print(row)
  • 불필요한 2개 행 제외하고 전 데이터 프린트

2)알고 싶은 지역 이름 입력받기

name = input('알고 싶은 지역의 이름(읍면동 단위)을 입력해주세요 :')

3) 해당 지역 인구 구조 저장

import csv
f = open('people.csv')
data = csv.reader(f)
next(data)
next(data)

home = []
name = input('알고 싶은 지역의 이름(읍면동 단위)을 입력해주세요 :')
for row in data:
    if name in row[0]:
        for i in row[3:]:
            home.append(int(i))
print(home)

  • 넘파이 배열을 이용하여 이중 루프 해소
import csv
import numpy as np
f = open('people.csv')
data = csv.reader(f)
next(data)
next(data)

home = []
name = input('알고 싶은 지역의 이름(읍면동 단위)을 입력해주세요 :')
for row in data:
    if name in row[0]:
        home = np.array(row[3:], dtype=int)
print(home)

import matplotlib.pyplot as plt
plt.rc('font', family='AppleGothic')
plt.title(name+' 지역의 인구 구조')
plt.plot(home)
plt.show()

4) 해당 지역의 인구구조와 비슷한 인구구조를 가진 지역 찾기

  1. 전국의 모든 지역 중 한 곳 선택
  2. 입력받은 지역과 선택된 지역의 0세 인구 비율을 각각 뺄셈
  3. 100세 이상까지 반복 후 각각의 차이 저장
  4. 전국 모든 지역에 대해 반복 후 가장 차이가 적은 지역 선택

인구 비율 : 해당 인구수 / 전체 인구수

  • home = np.array(row[3:], dtype=int) / int(row[2])
import csv
import numpy as np
f = open('people.csv')
data = csv.reader(f)
next(data)
data = list(data)

home = []
name = input('알고 싶은 지역의 이름(읍면동 단위)을 입력해주세요 :')
for row in data:
    if name in row[0]:
        np.array(row[3:], dtype=int) / int(row[2])
for row in data:
    print(row)
  • data = list(data) : 해당 줄이 없으면 첫 번째 반복문 이후 데이터 출력이 불가능함
import csv
import numpy as np
f = open('people.csv')
data = csv.reader(f)
next(data)
data = list(data)

name = input('알고 싶은 지역의 이름(읍면동 단위)을 입력해주세요 :')
for row in data:
    if name in row[0]:
        home = np.array(row[3:], dtype=int) / int(row[2])
        #지역 한 곳 선택
for row in data:
    away = np.array(row[3:], dtype=int) / int(row[2])
    print(home - away) #해당 지역과 다른 지역의 0세 인구 비율 뺄셈
import csv
import numpy as np
f = open('people.csv')
data = csv.reader(f)
next(data)
data = list(data)

name = input('알고 싶은 지역의 이름(읍면동 단위)을 입력해주세요 :')
for row in data:
    if name in row[0]:
        home = np.array(row[3:], dtype=int) / int(row[2])
        
for row in data:
    away = np.array(row[3:], dtype=int) / int(row[2])
    print(np.sum(home - away)) #모든 연령에 대한 뺄셈의 합계

5) 해당 데이터 시각화

import csv
import numpy as np
f = open('people.csv')
data = csv.reader(f)
next(data)
data = list(data)

name = input('알고 싶은 지역의 이름(읍면동 단위)을 입력해주세요 :')
mn = 1 # 최솟값을 저장할 변수 생성 및 초기화
result_name = '' # 최솟값을 갖는 지역의 이름을 저장할 변수 생성 및 초기화
result = 0 # 최솟값을 갖는 지역의 연령대별 인구비율을 저장할 배열 초기화
for row in data:
    if name in row[0]:
        home = np.array(row[3:], dtype=int) / int(row[2]) #사용자로부터 입력받은 지역의 인구 비율 저장
        
for row in data:
    away = np.array(row[3:], dtype=int) / int(row[2]) # 다른 지역의 인구비율 저장
    s = np.sum(home - away) #home과 away의 차이 합산
    if s < mn :
        mn = s
        result_name = row[0]
        result = away

import matplotlib.pyplot as plt
plt.rc('font', family='AppleGothic')
plt.title(name + '지역과 가장 비슷한 인구 구조를 가진 지역')
plt.plot(home, label=name)
plt.plot(result, label=result_name)
plt.legend()
plt.show()

오류 수정

import csv
import numpy as np
f = open('people.csv')
data = csv.reader(f)
next(data)
data = list(data)

name = input('알고 싶은 지역의 이름(읍면동 단위)을 입력해주세요 :')
mn = 1 # 최솟값을 저장할 변수 생성 및 초기화
result_name = '' # 최솟값을 갖는 지역의 이름을 저장할 변수 생성 및 초기화
result = 0 # 최솟값을 갖는 지역의 연령대별 인구비율을 저장할 배열 초기화
for row in data:
    if name in row[0]:
        home = np.array(row[3:], dtype=int) / int(row[2]) #사용자로부터 입력받은 지역의 인구 비율 저장
        
for row in data:
    away = np.array(row[3:], dtype=int) / int(row[2]) # 다른 지역의 인구비율 저장
    s = np.sum((home - away)**2) #home과 away의 차이 합산
    if s < mn and name not in row[0] :
        mn = s
        result_name = row[0]
        result = away

import matplotlib.pyplot as plt
plt.rc('font', family='AppleGothic')
plt.title(name + '지역과 가장 비슷한 인구 구조를 가진 지역')
plt.plot(home, label=name)
plt.plot(result, label=result_name)
plt.legend()
plt.show()

  • s = np.sum((home - away)**2) : 단순 뺄셈만 했을 경우에는 음수의 값이 가장 작은 값으로 선택되기 때문에 제곱 이용
  • if s < mn and name not in row[0] : : 제곱근을 사용했기 때문에 선택한 지역과 중복 미허용

좋은 웹페이지 즐겨찾기