일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- python
- 네이버
- 네이버 웹툰
- 이기적 출판사
- geopandas
- 애니메이션
- 아주 작은 습관의 힘
- 액션
- 네이버 완결 웹툰
- 영화
- 빅데이터 분석기사
- 로맨스
- 빅데이터 분석기사 필기
- 진심
- 이범선
- pandas
- 웹툰
- 습관
- 제주도
- 서귀포
- 만화 영화
- QGIS
- 넷플릭스
- 커피
- 완결 웹툰
- 산책
- 사랑
- 완결
- 제임스 클리어
- 가족
- Today
- Total
JuJuKwakKwak
[2] 분석 본문
<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()
(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 |