"""
# 전북대학교 통계학과 데이터경진대회 (2022) 
"""
"""
### 팀명: <데이터좀보내조>팀
"""
"""
- 팀장: 장수빈(202021337)
- 팀원: 송도담(202016228)
"""
"""
### Import 
"""
import pandas as pd
import plotly.express as px
import matplotlib.pyplot as plt 
from plotnine import *
import numpy as np
"""
### Read Data 
"""
"""
`-` 업로드된 데이터 확인 
"""
import os
for dirname, _, filenames in os.walk('/kaggle/input'):
    for filename in filenames:
        print(os.path.join(dirname, filename))
"""
`-` read data 
"""
data1=pd.read_csv('/kaggle/input/statjbnu1/data1.csv')
data2=pd.read_csv('/kaggle/input/statjbnu1/data2.csv')
data3=pd.read_csv('/kaggle/input/statjbnu1/data3.csv')
data4=pd.read_csv('/kaggle/input/yearair/yearair.csv')
data5=pd.read_csv('/kaggle/input/income/income.csv')
data6=pd.read_csv('/kaggle/input/greeen/green.csv')
"""
### Data Description 
"""
"""
### data 1 (지하철 혼잡도 정보)
"""
data1
"""
- 서울교통공사에서 제공하는 데이터로 30분간 지나는 열차들의 평균 혼잡도를 측정한 자료이다. (단위: %).
- 조사 일자(평일, 토요일, 일요일), 호선, 역 번호, 역명, 상하선 구분, 30분 단위 별 혼잡도 데이터로 구성되어 있다.
"""
"""
### data 2 (역사 대기 정보)
"""
data2
"""
- 서울 열린 데이터 광장에서 제공하는 데이터로 서울특별시 지하철 역사 내 공기질을 측정하는 자료이다.
- 측정장비가 설치된 역사에 한하여 데이터가 존재하며 측정값은 미세먼지(PM10), 이산화탄소(CO2), 포름알데히드(HCHO), 일산화탄소(CO)이다.
- 자료 중 환승역인 경우 역사명 마지막에 숫자가 있으며 (예시: '서울역1') 이때 숫자의 의미는 지하철 호선을 의미한다. 즉 서울역의 경우 1호선과 4호선이 교차하는데 이중 1호선은 '서울역1'로 4호선은 '서울역4'로 표현한다.
"""
"""
### data 3 (자치구별 지하철역 정보)
"""
data3
"""
- 서울교통공사 관할 자치구별 지하철역 정보이며, 연번, 자치구, 해당 역(호선), 역 개수로 구성되어 있다.
"""
"""
### data 4 (연도별 지하철역 공기질 측정 정보)
"""
data4
"""
- 서울교통공사에서 제공하는 연도별 지하철역 공기질 측정결과 정보이다.
- PM10 : 미세먼지, CO2 : 이산화탄소, HCHO : 포름알데히드, CO : 일산화탄소
"""
"""
### data 5 (서울특별시 자치구별 소득수준)
"""
data5
"""
- 조선비즈(조선일보)에서 제공하는 서울특별시 자치구별 소득수준 정보이다.
- 소득수준은 소득 순위 데이터로 나타나있다. 즉 값이 작을수록 소득수준이 높은 것, 값이 클수록 소득수준이 낮은 것이다.
"""
"""
### data 6 (자치구별 지하철 환기구 주변 녹지시설 정보)
"""
data6
"""
- 국가통계포털에서 제공하는 지하철 환기구 주변 녹지시설 정보이다.
"""
"""
### Data Analysis
"""
"""
### data 1 (지하철 혼잡도 정보)
"""
"""
#### 요일별 혼잡도 비교 (평일, 주말)
"""
조사일자=data1['조사일자']
df1=data1.iloc[:,5:].assign(조사일자=조사일자).groupby('조사일자').agg(sum).T.melt().groupby('조사일자').agg(sum).reset_index()
fig=px.pie(df1,values='value',names='조사일자')
fig.show()
"""
- 주말(60.8%) > 평일(39.2%)로 주말에 지하철 혼잡도가 더 높음.
"""
"""
#### 시간대별 혼잡도 비교
"""
"""
##### ※ 호선 정보 미포함
"""
호선=data1['호선']
df1=data1.iloc[:,5:].assign(호선=호선).groupby('호선').agg(sum).melt().rename(columns={'variable':'time'}).groupby('time').agg(sum).reset_index()
df2=df1.assign(sort=list(map(lambda x: int(x.replace(':','')), df1.time))).sort_values('sort').copy().iloc[:,:-1].reset_index(drop=True)
fig=df2.plot.line(backend='plotly',
                 x='time',
                 y='value')
fig.update_yaxes(matches=None,showticklabels=True)
"""
- 출근, 등교 시간대인 7:30 ~ 8:00 사이에 지하철 혼잡도가 가파른 상승세를 보이다가 8:00 이후 하락세를 보임.
- 퇴근, 하교 시간대인 16:30 ~ 18:30 에서 지하철 혼잡도가 가장 높은 수치를 기록함.
- 18:30 이후 꾸준한 하락세를 보임.
"""
"""
##### ※ 호선 정보 포함
"""
호선=data1['호선']
df1=data1.iloc[:,5:].assign(호선=호선).groupby('호선').agg(sum).T.reset_index().rename(columns={'index':'time'}).melt(id_vars='time')
fig=df1.plot.line(backend='plotly',
                 x='time',
                 y='value',
                 color='호선',
                 facet_col='호선',
                 facet_col_wrap=3,
                 facet_col_spacing=0.06)
fig.update_yaxes(matches=None,showticklabels=True)
"""
- 호선별 혼잡도가 가장 높은 시간대
1. 1호선: 16:30 (출근, 등교 시간대인 8:00에 비교적 한산함)
2. 2호선: 18:30 (22:00에서도 높은 수치 기록)
3. 3,4,6,8호선, 성수지선: 18:00
4. 5호선: 17:00
5. 7호선: 17:30
6. 신정지선: 8:00
"""
"""
<호선정보 포함, 미포함 둘 다 대체로 18:00경에 혼잡도가 가장 높음>
"""
"""
#### 호선별 혼잡도 비교
"""
호선=data1['호선']
df1=data1.iloc[:,5:].assign(호선=호선).groupby('호선').agg(sum).T.melt().groupby('호선').agg(sum).reset_index()
fig=df1.plot.bar(backend='plotly',
                 x='호선',
                 y='value')
fig.update_yaxes(matches=None,showticklabels=True)
"""
- 2>7>5호선에서 가장 높은 혼잡도를 보임.
"""
"""
### data 2 (역사 대기 정보)
"""
"""
#### 호선별 대기상태 비교
"""
df1=data2.drop('역사명',axis=1).groupby('호선').agg(sum).reset_index()
df1.assign(호선=list(map(lambda x: str(x) + '호선', df1.호선))).melt(id_vars='호선').rename(columns={'variable':'오염물질'}).plot.bar(x='호선',y='value',color='오염물질',backend='plotly')
"""
- 모든 호선에서 오염물질의 구성요소들이 비슷한 비율을 보임.
- 7>5>2호선에서 오염물질의 수치가 가장 높음.
"""
"""
<2,5,7호선에서 혼잡도, 오염물질 수치가 가장 높음>
"""
"""
#### 연도별 대기상태 비교 (data 4 사용)
"""
data4.columns
data4.columns = ['year','PM10', 'CO2', 'HCHO', 'CO']
data4=data4.sort_values(by='year')
data_4=data4.assign(year=list(map(lambda x: x [:4] , data4['year'])))
with plt.style.context('seaborn-dark'):
    plt.xkcd(scale=0, length=100)
    data_4.plot.line(x='year',figsize=(25,7),subplots=True,layout=(1,4))
"""
1. 미세먼지(PM10): 2007년에 가장 높은 수치를 기록하고, 이후 대체로 하향세를 보임.
2. 이산화탄소(CO2): 2007년 ~ 2014년까지 상승세를 보이다가 2015년에 수치가 하락하였으나 다시 대폭 상승함.
3. 포름알데히드(HCHO): 2010년에 가장 높은 수치를 기록하고, 이후 변동폭이 매우 큼.
4. 일산화탄소(CO): 변동폭이 매우 크며, 2014년에 가장 높은 수치를 기록하였으나 이후 대폭 하락하다가 다시 상승함.
"""
"""
#### 환승역 대기상태 특이점 분석
"""
df_1=data2.iloc[:,2:].rename(columns={'미세먼지(PM10)':'PM10','이산화탄소(CO2)':'CO2','포름알데히드(HCHO)':'HCHO','일산화탄소(CO)':'CO'}).eval('value=PM10+CO2+HCHO+CO').iloc[:,-1]
df_2=data2.iloc[:,:2]
df1=df_2.assign(value=df_1).assign(환승역구분=list(map(lambda x: str(x[-1]), df_2.역사명)))
linenumber=['1','2','3','4','5','6','7','8']
def transfer(x):
    if x in linenumber:
        return('환승역')
    else:
        return('일반역')
df1['환승역구분']=list(map(transfer,df1['환승역구분']))
fig=df1.plot.scatter(backend='plotly',
                     x='역사명',
                     y='value',
                     color='환승역구분'
                    )
fig.update_yaxes(matches=None,showticklabels=True)
"""
- 환승역에서 오염물질의 수치의 특이점을 찾지 못함 > 환승역, 일반역의 대기상태는 큰 차이가 없음.
"""
"""
### data 3 (자치구별 지하철역 정보)
"""
"""
#### 자치구별 역의 개수
"""
df1=data3.assign(서울경기구분=list(map(lambda x: x[-1], data3.자치구))).query("서울경기구분 == '구'").set_index('자치구').drop('부평구',axis=0).reset_index()
df2=data3.drop(['연번','해당역(호선)'],axis=1)
seoul=list(df1['자치구'])
def region(x):
    if x in seoul:
        return('서울')
    elif x == '부평구':
        return('인천')
    else:
        return('경기')
df2['지역']=list(map(region,df2['자치구']))
df2.plot.bar(x='자치구',y='역개수',text='역개수',color='지역',backend='plotly')
"""
- 경기도에서 대체로 지하철의 개수가 낮은 것을 알 수 있음.
"""
"""
### data 1 + data 2
"""
"""
#### 호선별 혼잡도에 따른 대기상태 비교
"""
"""
##### ※ data2에 성수지선, 신정지선의 데이터가 없으므로 1~8호선의 데이터만 다룸
"""
"""
##### ※ 오염물질 종류 정보 포함 (CO : 일산화탄소, CO2 : 이산화탄소, HCHO : 포름알데히드, PM10 : 미세먼지)
"""
호선=data1['호선']
df1=data1.iloc[:,5:].assign(호선=호선).groupby('호선').agg(sum).iloc[:-2,:].T.melt().groupby('호선').agg(sum).reset_index().rename(columns={'value':'혼잡도'})
df2=data2.drop('역사명',axis=1).groupby('호선').agg(sum).reset_index()
df3=df2.assign(호선=list(map(lambda x: str(x) + '호선', df2.호선))).melt(id_vars='호선')
df4=df1.merge(df3).rename(columns={'호선':'line','혼잡도':'congestion','variable':'pollutants','value':'pollutants value'})
df5=df4.assign(pollutants=list(map(lambda x: x.split('(')[-1][:-1], df4.pollutants))).assign(line=list(map(lambda x: str(x[0]), df4.line)))
ggplot(df5)+geom_point(aes(x='congestion',y='pollutants value',color='line'),size=2.2)+facet_wrap('pollutants')
"""
1. 미세먼지(PM10), 포름알데히드(HCHO), 일산화탄소(CO): 호선의 혼잡도와 오염수치 사이에 연관성을 찾을 수 없음.
2. 이산화탄소(CO2): 호선의 혼잡도가 클수록 오염수치가 대체적으로 높은 것을 알 수 있음.
"""
"""
##### ※ 오염물질 종류 정보 미포함 (종류 관계없이 오염물질의 총합값으로 계산)
"""
호선=data1['호선']
df1=data1.iloc[:,5:].assign(호선=호선).groupby('호선').agg(sum).iloc[:-2,:].T.melt().groupby('호선').agg(sum).reset_index().rename(columns={'value':'혼잡도'})
df2=data2.drop('역사명',axis=1).melt(id_vars='호선').groupby('호선').agg(sum).reset_index()
df3=df2.assign(호선=list(map(lambda x: str(x) + '호선', df2.호선)))
df4=df1.merge(df3).rename(columns={'호선':'line','혼잡도':'congestion','value':'pollutants value'})
df5=df4.assign(line=list(map(lambda x: str(x[0]), df4.line)))
ggplot(df5)+geom_point(aes(x='congestion',y='pollutants value',color='line'),size=2.2)
"""
- 오염물질의 총합값으로 계산시, 2,3,4호선을 제외하면 호선의 혼잡도가 높을수록 오염수치가 높은 것을 알 수 있음.
"""
"""
### data 1 + data 3
"""
"""
#### 자치구별 역 개수에 따른 혼잡도 비교
"""
#역을 자치구별로 묶는 과정
역명=data1['역명']
df1=data1.iloc[:,5:].assign(역명=역명).groupby('역명').agg(sum).T.melt().groupby('역명').agg(sum).rename({'서울역':'서울','신촌(지하)':'신촌','올림픽공원(한국체대)':'올림픽공원','미아삼거리':'미아사거리','신천':'잠실새내','총신대입구':'이수'}).reset_index().rename(columns={'value':'혼잡도'})
df2=data3.rename(columns={'해당역(호선)':'역명'})
station=list(df2['역명'])
def district(x):
    for i in range(0,31):
        if x in station[i]:
            return(df2.자치구[i])
    else:
        return('-')
df1['자치구']=list(map(district,df1['역명']))
df3=df1.groupby('자치구').agg(sum)
df4=df2.drop(['연번','역명'],axis=1).set_index('자치구')
df5=df3.merge(df4,left_index=True,right_index=True).reset_index()
fig=df5.plot.scatter(backend='plotly',
                     x='역개수',
                     y='혼잡도',
                     color='자치구',
                     height=760)
fig.update_yaxes(matches=None,showticklabels=True)
"""
- 자치구별 역의 개수가 많을수록 혼잡도가 높은 것을 알 수 있음.
"""
"""
#### 자치구별 소득에 따른 혼잡도 비교 (data 5 사용)
"""
#역을 자치구별로 묶는 과정
역명=data1['역명']
df1=data1.iloc[:,5:].assign(역명=역명).groupby('역명').agg(sum).T.melt().groupby('역명').agg(sum).rename({'서울역':'서울','신촌(지하)':'신촌','올림픽공원(한국체대)':'올림픽공원','미아삼거리':'미아사거리','신천':'잠실새내','총신대입구':'이수'}).reset_index().rename(columns={'value':'혼잡도'})
df2=data3.rename(columns={'해당역(호선)':'역명'})
station=list(df2['역명'])
def district(x):
    for i in range(0,31):
        if x in station[i]:
            return(df2.자치구[i])
    else:
        return('-')
df1['자치구']=list(map(district,df1['역명']))
df3=df1.groupby('자치구').agg(sum).reset_index()
df4=df3.assign(서울경기구분=list(map(lambda x: x[-1], df3.자치구))).query("서울경기구분 == '구'").set_index('자치구').drop('부평구',axis=0).iloc[:,:-1]
df5=data5.set_index('자치구').rename(columns={'소득수준':'소득순위'})
df6=df5.merge(df4,left_index=True,right_index=True).reset_index().sort_values('소득순위').reset_index(drop=True)
fig=df6.plot.scatter(backend='plotly',
                     x='소득순위',
                     y='혼잡도',
                     color='자치구',
                     height=760)
fig.update_traces(textposition='top center')
fig.update_yaxes(matches=None,showticklabels=True)
"""
- 자치구별 소득순위가 높을수록 혼잡도가 높은 것을 알 수 있음.
"""
"""
### data 2 + data 3
"""
"""
#### 자치구별 역 개수에 따른 대기상태 비교
"""
"""
##### ※ 오염물질 종류 정보 포함 (CO : 일산화탄소, CO2 : 이산화탄소, HCHO : 포름알데히드, PM10 : 미세먼지)
"""
#역을 자치구별로 묶는 과정
df1=data2.iloc[:,1:].rename(columns={'역사명':'역명'})
linenumber=['1','2','3','4','5','6','7','8']
def transfer(x):
    if x[-1] in linenumber:
        return(x[:-1])
    else:
        return(x)
df1['역명']=list(map(transfer,df1['역명']))
df2=df1.groupby('역명').agg(sum).rename({'서울역':'서울','신촌(지하)':'신촌','올림픽공원(한국체대)':'올림픽공원','미아삼거리':'미아사거리','신천':'잠실새내','총신대입구':'이수','방 화':'방화'}).reset_index()
df3=data3.rename(columns={'해당역(호선)':'역명'})
station=list(df3['역명'])
def district(x):
    for i in range(0,31):
        if x in station[i]:
            return(df3.자치구[i])
    else:
        return('-')
df2['자치구']=list(map(district,df2['역명']))
df4=df2.iloc[:,1:].groupby('자치구').agg(sum).reset_index().melt(id_vars='자치구').set_index('자치구')
df5=df3.drop(['연번','역명'],axis=1).set_index('자치구')
df6=df4.merge(df5,left_index=True,right_index=True).reset_index().rename(columns={'variable':'오염물질','value':'오염물질 측정치'})
fig=df6.plot.scatter(backend='plotly',
                     x='역개수',
                     y='오염물질 측정치',
                     color='자치구',
                     facet_col='오염물질',
                     facet_col_wrap=2,
                     facet_col_spacing=0.06,
                     height=720
                    )
fig.update_yaxes(matches=None,showticklabels=True)
"""
- 모든 오염물질에서 역의 개수가 많은 자치구일수록 오염물질 수치가 높음. 
- 역의 개수가 가장 많은 송파구, 중구에서 모든 오염물질 수치가 가장 높게 검출됨.
"""
"""
##### ※ 오염물질 종류 정보 미포함 (종류 관계없이 오염물질의 총합값으로 계산)
"""
#역을 자치구별로 묶는 과정
df1=data2.iloc[:,1:].rename(columns={'역사명':'역명'})
linenumber=['1','2','3','4','5','6','7','8']
def transfer(x):
    if x[-1] in linenumber:
        return(x[:-1])
    else:
        return(x)
df1['역명']=list(map(transfer,df1['역명']))
df2=df1.groupby('역명').agg(sum).rename({'서울역':'서울','신촌(지하)':'신촌','올림픽공원(한국체대)':'올림픽공원','미아삼거리':'미아사거리','신천':'잠실새내','총신대입구':'이수','방 화':'방화'}).reset_index()
df3=data3.rename(columns={'해당역(호선)':'역명'})
station=list(df3['역명'])
def district(x):
    for i in range(0,31):
        if x in station[i]:
            return(df3.자치구[i])
    else:
        return('-')
df2['자치구']=list(map(district,df2['역명']))
df4=df2.iloc[:,1:].melt(id_vars='자치구').groupby('자치구').agg(sum).rename(columns={'value':'오염물질 측정치'})
df5=df3.drop(['연번','역명'],axis=1).set_index('자치구')
df6=df4.merge(df5,left_index=True,right_index=True).reset_index()
fig=df6.plot.scatter(backend='plotly',
                     x='역개수',
                     y='오염물질 측정치',
                     color='자치구',
                     height=720
                    )
fig.update_yaxes(matches=None,showticklabels=True)
"""
- 대체로 역 개수가 많을수록 오염수치가 증가하는 경향을 보임.
- 역의 개수가 가장 많은 송파구, 중구, 강남구에서 오염물질 수치가 가장 높게 검출됨.
"""
"""
#### 지하철 환풍구 근처 녹지시설 개수와 면적에 따른 대기상태 (data 6 사용)
"""
#역을 자치구별로 묶는 과정
df1=data2.iloc[:,1:].rename(columns={'역사명':'역명'})
linenumber=['1','2','3','4','5','6','7','8']
def transfer(x):
    if x[-1] in linenumber:
        return(x[:-1])
    else:
        return(x)
df1['역명']=list(map(transfer,df1['역명']))
df2=df1.groupby('역명').agg(sum).rename({'서울역':'서울','신촌(지하)':'신촌','올림픽공원(한국체대)':'올림픽공원','미아삼거리':'미아사거리','신천':'잠실새내','총신대입구':'이수','방 화':'방화'}).reset_index()
df3=data3.rename(columns={'해당역(호선)':'역명'})
station=list(df3['역명'])
def district(x):
    for i in range(0,31):
        if x in station[i]:
            return(df3.자치구[i])
    else:
        return('-')
df2['자치구']=list(map(district,df2['역명']))
df4=df2.iloc[:,1:].melt(id_vars='자치구').groupby('자치구').agg(sum).rename(columns={'value':'오염물질 측정치'})
df5=data6.drop(['녹지현황(1)','2017','2018'],axis=1).rename(columns={'자치구(1)':'자치구','개소/면적(1)':'구분','2019':'녹지현황'}).set_index('자치구')
df6=df5.merge(df4,left_index=True,right_index=True).reset_index()
"""
##### ※ 녹지시설 개수 - 대기상태 그래프
"""
df7=df6.query("구분=='개소'")
fig=df7.plot.scatter(backend='plotly',
                     x='녹지현황',
                     y='오염물질 측정치',
                     color='자치구',
                     title='녹지시설 개수 - 대기상태'
                    )
fig.update_yaxes(matches=None,showticklabels=True)
"""
##### ※ 녹지시설 면적 - 대기상태 그래프
"""
df7=df6.query("구분=='면적'")
fig=df7.plot.scatter(backend='plotly',
                     x='녹지현황',
                     y='오염물질 측정치',
                     color='자치구',
                     title='녹지시설 면적 - 대기상태'
                    )
fig.update_yaxes(matches=None,showticklabels=True)
"""
- 지하철 환풍구 근처 녹지시설 개수, 면적과 역사 대기상태는 연관성이 없음
"""
"""
### Conclusion and Summary
"""
"""
<혼잡도>
- 주말 > 평일 
- 18:00경 혼잡도 가장 높음 
- 자치구별 역의 개수가 많을수록 혼잡도가 높음 
- 자치구별 소득 순위가 높을수록 혼잡도가 높음 
"""
"""
<역사 대기상태>
- 모든 호선에서 오염물질 구성요소가 비슷한 비율을 보임 
- 미세먼지(PM10): 해가 갈수록 하향세, 이산화탄소(CO2): 해가 갈수록 상승세 
- 환승/일반역의 대기 상태 차이 없음
- 총합 값으로 봤을 때, 혼잡도가 높을수록 오염수치가 높음 
- 역 개수가 많을수록 오염 수치가 높음 (송파구, 중구, 강남구)
- 지하철 환풍구 근처 녹지시설과 연관이 없음 
"""
"""
### References
"""
"""
- https://www.data.go.kr/data/15071311/fileData.do
- https://data.seoul.go.kr/dataList/OA-2732/F/1/datasetView.do
- https://www.gimi9.com/dataset/www-data-go-kr-data-filedata-15081868
- https://biz.chosun.com/site/data/html_dir/2019/01/11/2019011102294.html
- https://kosis.kr/statHtml/statHtml.do?orgId=201&tblId=DT_201_00368_2015&conn_path=I2
- https://www.kaggle.com/c/statjbnu1/data
"""