JuJuKwakKwak

[2] 분석 본문

Data Science/강서구 빅데이터 활용 공모전

[2] 분석

jujukwakkwak 2022. 3. 14. 13:29

<03.13.주일>

아직은 분석을 실시하지 않았기 때문에, 상상의 날개를 펼쳐서 결과에 대한 해석을 적었다.

그리고 쓰레기 관련 데이터를 막 수집했다.


<03.14.월>

주말 동안 조원 각자가 무엇을 해왔는지 발표하는 시간을 가졌다.

분석개요 : 1인 노인 인구 데이터를 활용해서 쓰레기를 관리하는 인력 배치하는 아이디어

분석결과 : 2020년이 최신 자료인데 2021년 자료를 구할 수 있는지, 입지 선정할 때 어떤 알고리즘이 사용되는지

결과해석 : 동별로 유동인구를 파악할 수 있으나, 동 안에 세부적으로 주민 동선을 파악할 수 있을지에 대한 걱정

활용방안 : 포리움 써서 쓰레기 배출 수거함에 대한 시각화

 

지도 시각화를 스스로 해보고 싶은 마음에 이미 다른 조원이 했던 코드를 따라쳐보았다.

# 위도와 경도가 있는 데이터를 불러온다
import pandas as pd
trash1 = pd.read_csv('trash1.csv', encoding='utf-8')
trash1.head()


# 본격적인 지도 시각화 실시
import folium # 시각화에 필요한 라이브러리

m = folium.Map(lacation=[37.546963, 126.851857], # 임의로 위치 설정
               zoom_start=11,
               width=1000,
               height=700)

for lat, long, title, address in zip(trash1['Latitude'], trash1['Longtitude'], trash1['Title'], trash1['Address']):
    iframe = folium.IFrame('<h2><b>' + title + '</h2></b>' + '<br>' + address) # 팝업창에 들어갈 내용
    popup = folium.Popup(iframe, min_width=350, max_width=350)
    
    folium.Marker(location=[lat, long],
                 tooltip=title,
                 popup=popup,
                 icon=folium.Icon('red', icon='star')).add_to(m) # 좀 더 조사해서 색깔과 표시 종류를 알아보자
m

코드 실행 잘 되었다. 뿌듯하다.


<03.15.화>

일단 뭐라도 결과물을 내놓기로 결심했다.

그래서 화곡2동에 종이팩 수거함의 최적 입지 선정을 진행했다.

 

1) 화곡2동에 있는 빌라를 모은다 - 네이버 지도

    -> 너무 많다. 그래서 내 마음대로 모았다. 빌라가 골고루 퍼져있기 때문에 골고루 모았다고 생각한다.

2) 빌라의 위도와 경도를 모은다 - 구글 지도

    -> 위도와 경도를 복사해서 엑셀에 붙이면 자동으로 숫자 몇 개는 생략되는 것 같다.

    -> 그래서 메모장에 붙였다.

    -> 하나보니 조금만 다른 곳에 마우스 우클릭하면 위도와 경도가 달라진다.

    -> 그래서 빨간색 마크에 마우스를 위치시키고 우클릭한다.

    -> 메모장에 적은 내용을 csv로 저장한다.

3) 주피터노트북에서 두 개의 csv를 합친다.

import pandas as pd

data1 = pd.read_csv('화곡2동.csv')
data2 = pd.read_csv('화곡2동_위도경도.csv')

data1['위도'] = data2.iloc[:,0]
data1['경도'] = data2.iloc[:,1]

4) k-means clustering을 실행한다.

from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=1)
kmeans.fit(X=data1[['위도', '경도']])

data3 = pd.DataFrame({'위도':[37.53256663457308], '경도':[126.85492085683484]})
sns.scatterplot(x='위도', y='경도', data=data1, color='blue', label='data1')
sns.scatterplot(x='위도', y='경도', data=data3, color='red', label='data3')

5) folium으로 지도 시각화하기

import folium

m = folium.Map(lacation=[37.53256663457308, 126.85492085683484],
               zoom_start=11,
               width=1000,
               height=700)

for lat, long in zip(data3['위도'], data3['경도']):
    iframe = folium.IFrame('<h2><b>' + '화곡2동 종이팩 수거함' + '</h2></b>')
    popup = folium.Popup(iframe, min_width=350, max_width=350)
    
    folium.Marker(location=[lat, long],
                 tooltip='화곡2동 종이팩 수거함',
                 popup=popup,
                 icon=folium.Icon('red', icon='star')).add_to(m)
m

m.save('화곡2동.html')

원래 설치된 주민센터와의 거리가 가깝다.

내가 예상한 결과가 달라서 당황스럽다.

원래 설치된 곳과 거리가 멀어야 분석할 가치가 있는데...

이제는 무엇을 해야 할지 모르겠다.


<03.16.수>

조원이 우리랑 비슷하게 한 사례를 찾았다. 그래서 그 사례를 활용하기로 했다.

오늘은 어떤 식으로 분석했고, 어떤 코드를 작성했는지 파악했다.

참고 사례 : https://github.com/DaeWang-Ima/2021-Public-Bigdata-Analysis

 

GitHub - DaeWang-Ima/2021-Public-Bigdata-Analysis: 2021 공공빅데이터 실무형 프로젝트 [서울시 스마트 분리수

2021 공공빅데이터 실무형 프로젝트 [서울시 스마트 분리수거 기기 우선 입지 선정]. Contribute to DaeWang-Ima/2021-Public-Bigdata-Analysis development by creating an account on GitHub.

github.com

큰 흐름을 보면 3가지로 요약할 수 있다.

    1) 상관분석, 회귀분석, 시각화로 유의미한 변수 선정 -> 인구지수, 주건건물대지면적
    2) 3가지 군집분석 실행해서 변수 별(인구, 점포, 면적) 평균의 순위를 구해서 동 선정
    3) p-median으로 우선 입지 선정


<03.17.목>

군집분석 3가지를 먼저 돌렸다.

그 다음 상관분석을 통해 유의미한 변수를 걸렸다. 그런데 다시 해야 한다. 종속변수를 처음부터 이상치를 제거해서 다듬어진 변수로 사용했어야 했다.


<03.18.금>

[상관분석]

# 주택_쓰레기양 변수와 독립변수의 상관분석을 수행하고 산점도를 그려주는 함수 생성
def correlation_scatter(plot_data = None, column = None):    
    # 상관분석 수행
    stat, p_val = stats.pearsonr(plot_data[column], plot_data['주택_쓰레기양'])
    print('상관계수 :', np.round(stat, 4), '\n')
    print('유의확률 :', np.round(p_val, 4), '\n')
    
    # 시각화 과정
    plt.figure(figsize = (10, 5))
    
    sns.scatterplot(x = column, y = '주택_쓰레기양', data = plot_data)
    plt.show()
correlation_scatter(plot_data = data, column = '점포수')

상관분석 결과 화면

 

유의확률 0.05보다 작은 것들만 모으면 다음과 같다.

길단위상존인구, 영업겸용, 다세대주택, 비거주용건물내주택, 인구수, 세대수, 다가구주택

 

[회귀분석]

# 스케일링
from sklearn.preprocessing import RobustScaler
scaler = RobustScaler()
df[X_col] = scaler.fit_transform(df[X_col])
# 독립변수 이름만 추출
X_col = df2.drop(['주택_쓰레기양'],axis=1,inplace=False).columns.tolist()
# 회귀분석 실행

# 종속변수 : 쓰레기발생량
model = smf.ols(formula = '주택_쓰레기양 ~ '+'+'.join(X_col), data = df2)
result = model.fit()
result.summary()

회귀분석 결과

p값이 0.05보다 작은 변수들만 고르고 싶었으나

'다세대주택' 변수 1개만 작다.

그래서 회귀분석은 하지 않는 것으로 결정했다.

 

[군집분석]

(1) 최적의 k값 찾기

# 필요한 라이브러리
import pandas as pd

from sklearn.preprocessing import RobustScaler

import warnings
warnings.filterwarnings(action = 'ignore')

import matplotlib.pyplot as plt

import platform
if platform.system() == 'Windows':
    plt.rcParams['font.family'] = 'Malgun Gothic'
else:
    plt.rcParams['font.family'] = 'AppleGothic'
# 스케일링 할 변수들 추출
X_col = data3.drop(['행정동'], axis=1, inplace=False).columns.tolist()

# 스케일링 작업 실행
scaler = RobustScaler()
data3[X_col] = scaler.fit_transform(data3[X_col])

# 그래프 그리기
from sklearn.cluster import KMeans

distortions = []
for i in range(1, 11):
    km = KMeans(n_clusters=i)
    km.fit(data3.iloc[:, 1:])
    distortions.append(km.inertia_)
    
plt.plot(range(1,11), distortions, marker='o')
plt.xlabel('군집 개수')
plt.ylabel('왜곡')
plt.tight_layout()
plt.show()

k=3으로 정했다

 

(2) 3개의 군집분석 알고리즘

# k-평균 알고리즘
from sklearn.cluster import KMeans
km = KMeans(n_clusters=3, random_state=0) 
y_km = km.fit_predict(data_sub)
y_km


# k-중간점 알고리즘
!pip install scikit-learn-extra
from sklearn_extra.cluster import KMedoids
kd = KMedoids(n_clusters=3, random_state=0)
y_kd = kd.fit_predict(data_sub)
y_kd


# 병합 군집 알고리즘
from sklearn.cluster import AgglomerativeClustering
ag = AgglomerativeClustering(n_clusters=3)
y_ag = ag.fit_predict(data_sub)
y_ag

 

(3) 위도 경도 군집분석

# k=3으로 k-means 군집분석 실행
km = KMeans(n_clusters=3, random_state=0)
y_km = km.fit_predict(df.iloc[:, 2:])

# 중심점 값 확인
km.cluster_centers_

# 산점도 그리기 위해서 index가 들어있는 Dataframe 형태로 만들기
df2 = pd.DataFrame({'위도':[km.cluster_centers_[0][0], km.cluster_centers_[1][0], km.cluster_centers_[2][0]],
                    '경도':[km.cluster_centers_[0][1], km.cluster_centers_[1][1], km.cluster_centers_[2][1]]})
df2

# 그래프 겹쳐 그리기
plt.figure(figsize=(20, 9))
sns.scatterplot(x='위도', y='경도', data=df, hue=y_km)
sns.scatterplot(x='위도', y='경도', data=df2, color='red', label='중심점')
plt.show()

 

'Data Science > 강서구 빅데이터 활용 공모전' 카테고리의 다른 글

[6] 발표  (0) 2022.04.24
[5] 발표 준비  (0) 2022.04.24
[4] 최종 정리  (0) 2022.04.01
[3] 분석 정리  (0) 2022.03.22
[1] 주제 선정  (0) 2022.03.08