공공데이터_기술_1p

 

 

ChatGPT

 

이러한 데이터를 활용하여 IT 직무에서 좋은 스펙을 쌓을 수 있는 데이터 분석 및 예측 프로젝트 아이디어를 제안드립니다:

  1. 기상 데이터를 활용한 정밀 농업 예측 시스템 개발: 기상청의 단기예보, 중기예보, 시간별 기상자료를 활용하여 농작물의 성장 조건과 수확 시기를 예측하는 시스템을 개발할 수 있습니다. 이러한 시스템은 농업 분야에서의 의사결정을 돕고 생산성을 높이는 데 기여할 수 있습니다.
  2. 도로명주소 및 좌표 정보를 이용한 도시 계획 및 교통 최적화 연구: 행정안전부에서 제공하는 도로명주소 및 좌표 정보를 분석하여 도시 내 교통 흐름, 인구 밀집 지역, 발달 가능성이 높은 지역 등을 파악할 수 있습니다. 이를 통해 효율적인 도시 계획 및 교통 시스템 설계에 기여할 수 있습니다.
  3. 특일 정보를 활용한 이벤트 및 마케팅 전략 개발: 한국천문연구원의 특일 정보를 활용하여 국경일, 공휴일, 기념일 등과 관련된 이벤트 및 마케팅 전략을 개발할 수 있습니다. 이러한 전략은 소비자 행동 분석과 타겟 마케팅에 유용하게 사용될 수 있습니다.
  4. 우체국 위치 정보를 활용한 물류 최적화 연구: 우체국 위치 정보를 분석하여 효율적인 물류 및 배송 경로를 설계하는 연구를 진행할 수 있습니다. 이는 특히 전자상거래 분야에서의 물류 비용 절감 및 배송 효율성 향상에 도움을 줄 수 있습니다.

이러한 프로젝트들은 데이터 분석, 예측 모델링, 머신 러닝, GIS(지리정보시스템) 등 다양한 IT 기술을 활용하여 실제 문제를 해결하는 능력을 보여줄 수 있으며, 해당 분야에서의 전문성과 기술적 역량을 입증하는 좋은 사례가 될 수 있습니다.

 

공공데이터_기술_2p

 

 

ChatGPT

 

  1. 관광지 기상 데이터 기반 투자 기회 분석: 기상청의 관광코스별 관광지 상세 날씨 데이터를 활용하여 관광 관련 주식이나 산업에 대한 투자 기회를 분석합니다. 예를 들어, 특정 관광지의 날씨가 좋을 때 관광 수요가 증가할 것으로 예상되는 지역의 숙박업체나 교통수단 관련 주식을 분석하는 것입니다.
  2. 기상 데이터를 활용한 농업 상품 파생상품 개발: 기상청의 단기 및 중기 예보 데이터를 활용하여 농산물 가격에 영향을 미치는 기상 조건을 예측하고, 이를 바탕으로 농업 상품 관련 파생상품을 개발합니다. 예를 들어, 특정 기상 조건이 예상될 때 해당 조건이 영향을 미치는 농작물의 가격 변동을 예측하고, 이를 금융 상품에 반영합니다.
  3. 부동산 시장 예측을 위한 지진 및 기상 정보 분석: 기상청의 지진정보 및 생활기상지수 데이터를 활용하여 부동산 시장에 영향을 미칠 수 있는 자연 재해의 위험도를 분석합니다. 이러한 분석을 통해 특정 지역의 부동산 투자 위험도를 예측하고, 이를 부동산 관련 금융상품에 적용할 수 있습니다.
  4. 금융 서비스 최적화를 위한 고객 행동 예측: 행정안전부의 실시간 주소 정보를 활용하여 고객의 이동 패턴과 거주지 정보를 분석하고, 이를 바탕으로 개인화된 금융 서비스를 제공합니다. 예를 들어, 특정 지역에 거주하는 고객들의 소비 패턴과 신용 위험을 분석하여 그에 맞는 신용 상품을 개발하는 것입니다.

이러한 프로젝트들은 기상, 지리, 인구 통계학적 데이터를 분석하여 금융 상품 개발, 투자 전략 수립, 리스크 관리 등에 적용함으로써 금융 IT 분야에서의 전문성과 데이터 기반 의사 결정 능력을 보여줄 수 있습니다.

 

공공데이터_기술_3p

 

 

ChatGPT

 

  1. 도메인 및 IP 주소 데이터를 활용한 사이버 보안 투자 분석: 한국인터넷진흥원에서 제공하는 인터넷주소(도메인, IP) 정보를 분석하여 사이버 보안 위험을 평가하고, 이를 바탕으로 사이버 보안 관련 기업에 대한 투자 분석을 수행할 수 있습니다. 예를 들어, 특정 도메인이나 IP 주소에 대한 위협 수준이 높아질 경우 해당 기업의 보안 솔루션에 대한 수요가 증가할 가능성이 있습니다.
  2. 태풍 및 기상 정보를 이용한 재해 관련 금융 상품 개발: 기상청의 태풍정보 및 일기도 서비스 데이터를 활용하여 재해 발생 가능성을 예측하고, 이를 기반으로 재해 보험 상품이나 재해 관련 파생상품을 개발합니다. 예를 들어, 특정 지역에서 태풍이나 기타 자연 재해의 발생 확률이 높아질 경우 이에 대비한 보험 상품의 수요가 증가할 수 있습니다.
  3. 위성 영상 및 지구자기장 데이터를 활용한 지역별 리스크 평가: 기상청의 위성영상 및 국립전파연구원의 지구자기장 교란 지수 정보를 분석하여 특정 지역의 리스크를 평가합니다. 예를 들어, 위성 영상을 통해 홍수나 산불 등의 자연 재해 발생 지역을 식별하고, 이를 통해 해당 지역의 부동산 및 농업 관련 금융 상품의 리스크를 평가할 수 있습니다.
  4. 태양고도 정보를 활용한 에너지 분야 투자 분석: 한국천문연구원의 태양고도 정보를 분석하여 특정 지역의 태양 에너지 발전 가능성을 예측하고, 이를 바탕으로 태양 에너지 관련 기업에 대한 투자 분석을 수행합니다. 예를 들어, 높은 태양고도를 가진 지역에서 태양 에너지 발전소의 효율성이 증가할 것으로 예상할 수 있습니다.

주제_실시간_활용_많은_순서

https://www.data.go.kr/tcs/dss/selectDataSetList.do?dType=API&keyword=%EC%8B%A4%EC%8B%9C%EA%B0%84&operator=AND&detailKeyword=&publicDataPk=&recmSe=N&detailText=&relatedKeyword=&commaNotInData=&commaAndData=&commaOrData=&must_not=&tabId=&dataSetCoreTf=&coreDataNm=&sort=reqCo&relRadio=&orgFullName=&orgFilter=&org=&orgSearch=¤tPage=1&perPage=10&brm=&instt=&svcType=&kwrdArray=&extsn=&coreDataNmArray=&pblonsipScopeCode=

 

목적

- 실시간 수질 정보 조회 및 생활 용수와 공업 용수의 상태 파악

- 민간 및 기업에 모두 유용한 데이터를 제공하는 것

 

활용 데이터

한국수자원공사_실시간 수도정보 수질(시간) 조회 서비스(GW)

 

 

사용 라이브러리

from datetime import datetime
from datetime import timedelta
import pandas as pd
import requests
import pprint
from os import name
import pandas as pd
import bs4

 

인증키 확인

서비스 URL

http://apis.data.go.kr/B500001/rwis/waterQuality/list 

 

요청 메시지 명세

항목명(영문) 항목명(국문) 항목크기 항목구분 샘플데이터 항목설명
stDt 조회시작일자 10 1 2015-11-18 조회시작일자
stTm 조회시작시간 2 1 00 조회시작시간
edDt 조회종료일자 10 1 2015-11-18 조회종료일자
edTm 조회종료시간 2 1 24 조회종료시간
fcltyMngNo 시설관리번호 10 0 4824012333 시설관리번호
sujCode 사업장코드 3 0 333 사업장코드
liIndDiv 생활공업구분 1 0 1 생활:1, 공업:2
numOfRows 줄수 10 0 10 줄수
pageNo 페이지번호 10 0 1 페이지번호

 

※ 항목구분 : 필수(1), 옵션(0), 1건 이상 복수건(1..n), 0건 또는 복수건(0..n)

오퍼레이션 목록

1) 1시간 수질정보 조회 waterQualityList

2) 정수장 코드 조회 fcltyList

3) 공급지역 정수장 코드 조회 supplyLgldCodeList

 

서비스와 URL 조합

http://apis.data.go.kr/B500001/rwis/waterQuality/list/waterQualityList

http://apis.data.go.kr/B500001/rwis/waterQuality/list/fcltyList

http://apis.data.go.kr/B500001/rwis/waterQuality/list/supplyLgldCodeList

 

파이썬 샘플 코드

 

import requests

url = 'http://apis.data.go.kr/B500001/rwis/waterQuality/list'
params ={'serviceKey' : '서비스키', 'stDt' : '2015-11-18', 'stTm' : '00', 'edDt' : '2015-11-18', 'edTm' : '24', 'fcltyMngNo' : '4824012333', 'sujCode' : '333', 'liIndDiv' : '1', 'numOfRows' : '10', 'pageNo' : '1' }

response = requests.get(url, params=params)
print(response.content)

 

시간 결정

from datetime import datetime
from datetime import timedelta
print(datetime.today())
print(datetime.today().strftime("%Y-%m-%d %H:%M:%S"))
print(datetime.today().strftime("%Y-%m-%d"))

five_years_ago = datetime.today() - timedelta(days = 5*365)
five_years_ago.strftime("%Y-%m-%d")

 

url, params 설정

import pandas as pd
import requests
import pprint

decoding_key = '디코딩_key'

url = 'http://apis.data.go.kr/B500001/rwis/waterQuality/list'
# params ={'serviceKey' : '서비스키', 
#          'stDt' : '2015-11-18', 
#          'stTm' : '00', 
#          'edDt' : '2015-11-18', 
#          'edTm' : '24', 
#          'fcltyMngNo' : '4824012333', 
#          'sujCode' : '333', 
#          'liIndDiv' : '1', 
#          'numOfRows' : '10', 
#          'pageNo' : '1' }

params ={'serviceKey' : decoding_key, 
         'stDt' : five_years_ago.strftime("%Y-%m-%d"), # 조회시작일자
         'stTm' : '00',  # 조회시작시간
         'edDt' : datetime.today().strftime("%Y-%m-%d"), # 조회종료일자
         'edTm' : '24', # 조회종료시간
         'fcltyMngNo' : '4824012333' # 시설관리번호
         # 'sujCode' : '333'  # 사업장코드
         # 'liIndDiv' : '1'  # 생활공업구분
         # 'numOfRows' : '10'  # 줄수
         # 'pageNo' : '1'  # 페이지번호
        }
response = requests.get(url, params=params)

# xml 내용
content = response.text
print('content',content)

# 깔끔한 출력 위한 코드
pp = pprint.PrettyPrinter(indent=4)
print('pp', pp)

### xml을 DataFrame으로 변환하기 ###
from os import name
import pandas as pd
import bs4

#bs4 사용하여 item 태그 분리
xml_obj = bs4.BeautifulSoup(content,'lxml-xml')
print('xml_obj', xml_obj)
rows = xml_obj.findAll('item')
print(rows)

# 각 행의 컬럼, 이름, 값을 가지는 리스트 만들기
row_list = [] # 행값
name_list = [] # 열이름값
value_list = [] #데이터값

# xml 안의 데이터 수집
for i in range(0, len(rows)):
    columns = rows[i].find_all()
    #첫째 행 데이터 수집
    for j in range(0,len(columns)):
        if i ==0:
            # 컬럼 이름 값 저장
            name_list.append(columns[j].name)
        # 컬럼의 각 데이터 값 저장
        value_list.append(columns[j].text)
    # 각 행의 value값 전체 저장
    row_list.append(value_list)
    # 데이터 리스트 값 초기화
    value_list=[]
    
#xml값 DataFrame으로 만들기
water_df = pd.DataFrame(row_list, columns=name_list)
print(water_df.head(19))

#xml값 DataFrame으로 만들기
#Assertion Error가 난 경우
water_df = pd.DataFrame(water_df)
# 이후에 컬럼을 설정해 주세요.
water_df

 

제공 기관과 데이터 설명이 일치하지 않음

- 필수 parameter 정보 불일치

- 예제와 다른 경우의 데이터를 추출하기 어렵다.

 

 

결론

공공데이터 포털에서는 활용 많은 순으로 데이터를 활용할 것

기법 정리 DecisionTreeRegressor & Random Search

 

회귀 문제

LinearRegression

KNeighborsRegressor

DecisionTreeRegressor

RandomForestRegressor

XGBRegressor

 

DecisionTree, Random Search

 

1) 라이브러리 불러오기

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

 

 

2) 데이터 준비

# x, y 분리

# medv : 본인 소유 주택 가
target = 'medv'

x = data.drop(target, axis=1)
y = data.loc[:, target]

# 학습용, 평가용 데이터 분리
from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state=1)

 

 

3) DecisionTreeRegressor

from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import cross_val_score
from sklearn.metrics import mean_absolute_error, r2_score

model_dt = DecisionTreeRegressor(random_state=1)

# 성능예측

cv_score = cross_val_score(model_dt, x_train, y_train, cv=5)

# 결과 확인

print(cv_score)
print(cv_score.mean())

 

 

4) 모델 튜닝

from sklearn.tree import DecisionTree
from skelarn.model_selection import RandomizedSearchCV

# max depth : 1~50
params = {'max_depth' : range(1,50)}

model_dt = DecisionTreeRegressor(random_state)

model = RandomizeCV(nidek_dt,
                                param,
                                cv =5,
                                n_iter = 20,
                                scoring = 'r2')

# 결과 확인
** model.cv_results_['mean_test_score'] : 테스트로 얻은 성능
** model.best_parms_ : 최적의 파라미터
** model.best_score_ : 최고 성능
print(model.cv_results_['mean_test_score'])
print('최적 파라미터:', model.best_params_)
print('최고 성능:', model.best_score

 

# 변수 중요도

## model.best_estimator_
plt.barh(  y = list(x), width = model.best_estimator_.feature_importances_) # 최선의 파라미터로 된 DecisionTree이다.

 

 

'기업정보요약_train.csv' & '재무제표정보_train.csv' 분석

import pandas as pd
import maplotlib.pyplot as plt
import os
os.listdir(os.getcwd())
data1 = pd.read_csv('기업정보요약_train.csv', encoding='UTF - 8')
display(data1)

 
 
data10 = pd.read_csv('재무제표정보_train.csv',encoding = 'UTF - 8')
display(data10)

중소기업 자본 형태, 자본 종류, 자본 합계 분석

# 결합하고 중소기업 정보 남기
data_small = pd.merge(data1, data10, on='BusinessNum', how = 'left' )
data_small = data_small.loc[ data['cpmSclNm'] =='중소기업']
data_small = data_small[ ['BusinessNum', '기업명', 'cmpSclNm', 'accNm', 'acctAmt']]
data_small

 

중소기업 자산데이터 종류 분석

display(data_small['accNm'].value_counts()

 

K-Means

1) 라이브러리 로딩
import pandas as pd
import numpy as np
import matplotlib.pyplt as plt
import sklearn as sns

2) 군집모델 만들기
model = KMeans(n_clusters = 2, init='auto')
model.fit(x)

pred = model.predict(x)

pred = pd.DataFrame(pred, columns = ['predicted'])

# 모델의 중심 좌표 얻기

centers = pd.DataFrame(model.cluster_centers_, columns = ['x1', 'x2'])

plt.scatter(result['x1'], result['x2'], c=result['predicted'], alpha=0.5)
plt.scatter(centers['x1'], centers['x2'], s=50, marker='D', c='r')
# k means 모델을 생성하게 되면 inertia 값을 확인 가능
model.inertia_

# k를 증가시켜가면서 inertia 구하기
kvalues = range(1,10)
inertias = []

for k in kvalues:
    model = KMeans(n_clusters=k, n_init = 'auto')
    model.fit(x)
    inertias.append(model.inertia_)

plt.plot(kvalues, inertias, '-o')
plt.xlabel('number of clusters, k')
plt.ylabel('inertia')
plt.grid()
plt.show()
 

K-Means 실습

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

from sklearn.cluster import KMeans
from sklearn,preprocessing import MinMaxScaler
# 군집화 할 변수 선택
x = data.loc[:, ['Age', 'Income', 'Score' ] ]
스케일링
scaler = MinMaxScaler()
x_s = scaler.fit_transform(x)

# k값을 늘려가면서(1~20) 모델을 만들어, inertia 값을 저장
# 그래프를 통해 최적의 k값 결정


# 반복문으로 KMeans 모델
kvalues = range(1,21)
iv = []

for k in kvalues:
    model = KMeans(n_clusters = k, n_init='auto')
    model.fit(x_s)
    iv.append(model.inertia_)

# 그래프 그려서 적절한 k값 찾기
plt.plot(kvalues, iv, marker='.')
plt.grid()
# 적절한 k 찾으면 모델 선언
model = KMeans(n_clusters=5, n_init = 'auto', random_state=10)

한 번에 분석하기

# 'Age', 'Income', 'Score', 'pred'만 추출

temp = result.loc[:, ['Age', 'Income', 'Score', 'pred' ]]

sns.pairplot(temp, hue = 'pred')
plt.show()

 

 

집계구별 일별소비지역별 카드소비패턴 분석

집계구별 일별소비지역별 카드소비패턴.csv
0.03MB
원본

 

강남에서 카드이용건수계 비율, 카드이용금액계 비율

강남 소비 분석

 

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rc('font',family='Malgun Gothic')
plt.rcParams['font.family']
gu = pd.read_csv('집계구별 일별소비지역별 카드소비패턴.csv',encoding='CP949')
gu_seoul = gu.loc[gu['가맹점주소광역시도(SIDO)']=='서울' , ['가맹점주소시군구(SGG)','업종대분류(UPJONG_CLASS1)','카드이용건수계(USECT_CORR)','카드이용금액계(AMT_CORR)']]
# display(gu_seoul[gu_seoul['가맹점주소시군구(SGG)']=='강남구'])
gu_gangnam = gu_seoul[gu_seoul['가맹점주소시군구(SGG)']=='강남구']
gu_gangnam_use = gu_gangnam.groupby(by='업종대분류(UPJONG_CLASS1)', as_index=False)[['카드이용건수계(USECT_CORR)']].sum()
# display(gu_gangnam_use)
# display(gu_gangnam_use.info())
gu_gangnam_money = gu_gangnam.groupby(by='업종대분류(UPJONG_CLASS1)', as_index=False)[['카드이용금액계(AMT_CORR)']].sum()
# display(gu_gangnam_money)
# plt.pie(데이터프레임['컬럼명'].values, labels = 데이터프레임['컬럼명'].index(), autopct='%.2f%%')
plt.figure(figsize = (10,10))
plt.subplot(1,2,1)
plt.pie(gu_gangnam_use['카드이용건수계(USECT_CORR)'].values, labels=gu_gangnam_use['업종대분류(UPJONG_CLASS1)'] )
plt.legend(loc='upper left')
plt.title('강남에서 카드이용건수계 비율')
plt.subplot(1,2,2)
plt.pie(gu_gangnam_money['카드이용금액계(AMT_CORR)'].values, labels= gu_gangnam_money['업종대분류(UPJONG_CLASS1)'])
plt.legend(loc='upper left')
plt.title('강남에서 카드이용금액계 비율')
plt.tight_layout()

 

년도별 카드이용금액계의 변화

년도별 소비금액 변동

 

import numpy as np
import pandas as pd
pd.set_option('display.float_format', lambda x:'%.3f'%x) # 지수 표현 없애기
import matplotlib.pyplot as plt
plt.rc('font',family = 'Malgun Gothic')
plt.rcParams['font.family']
import seaborn as sns
import scipy.stats as spst
sobi = pd.read_csv( '집계구별 일별소비지역별 카드소비패턴.csv', encoding ='CP949')
sobi_year = sobi.loc[:,['기준일자(YMD)','카드이용금액계(AMT_CORR)']]
sobi_year['기준일자(YMD)'] = sobi_year['기준일자(YMD)'].astype('str')
sobi_year['기준일자(YMD)'] = sobi_year['기준일자(YMD)'].str[:4]
A= sobi_year.loc[sobi_year['기준일자(YMD)']=='2016','카드이용금액계(AMT_CORR)']
B= sobi_year.loc[sobi_year['기준일자(YMD)']=='2017','카드이용금액계(AMT_CORR)']
C= sobi_year.loc[sobi_year['기준일자(YMD)']=='2018','카드이용금액계(AMT_CORR)']
D= sobi_year.loc[sobi_year['기준일자(YMD)']=='2019','카드이용금액계(AMT_CORR)']
E= sobi_year.loc[sobi_year['기준일자(YMD)']=='2020','카드이용금액계(AMT_CORR)']
display(spst.ttest_ind(D,E))
# print('\n','='*100,'\n21년도의 마지막 값은 7월에서 끝나므로 21년도는 뺀다',sep='')
# < 특정 행 삭제 >
sobi_year.drop( sobi_year[ sobi_year['기준일자(YMD)'].str.contains('2021')].index, inplace = True  )
feature = '기준일자(YMD)'
target = '카드이용금액계(AMT_CORR)'
# sns.barplot(x='컬럼명', y='컬럼명', data=데이터프레임)
sobi_year[feature] = sobi_year[feature].astype('int')
sns.barplot(x=feature, y= target, data=sobi_year )

 

도별 카드이용금액의 관계

도별 카드이용금액 비교

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rc('font',family='Malgun Gothic')
plt.rcParams['font.family']
import scipy.stats as spst
import seaborn as sns
spend = pd.read_csv('집계구별 일별소비지역별 카드소비패턴.csv', encoding = 'CP949')
spend_area = spend.loc[:,['가맹점주소광역시도(SIDO)','카드이용금액계(AMT_CORR)']]
print('\n','='*100,'\n큰 단위로 나누기',sep='')
spend_area['가맹점주소광역시도(SIDO)'] = spend_area['가맹점주소광역시도(SIDO)'].replace({
                                        '서울':'수도권',
                                        '경기':'수도권',
                                        '인천':'수도권',
                                                                      
                                        '대전':'충청도',                              
                                        '충남':'충청도',
                                        '충북':'충청도',
                                        '세종':'충청도',
                                                                      
                                        '광주':'전라도',
                                        '전남':'전라도',
                                        '전북':'전라도',
                                                                      
                                        '부산':'경상도',
                                        '경북':'경상도',
                                        '경남':'경상도',
                                        '대구':'경상도'
                                      
                                      })
feature = '가맹점주소광역시도(SIDO)'
target = '카드이용금액계(AMT_CORR)'
plt.title('도별와 카드이용금액의 관계 < 범주 & 숫자 >')
sns.barplot(x=feature, y=target, data=spend_area)

https://data.seoul.go.kr/dataList/543/S/2/datasetView.do

 

열린데이터광장 메인

데이터분류,데이터검색,데이터활용

data.seoul.go.kr

 

 

import numpy as np
import pandas as pd
import csv
import matplotlib.pyplot as plt

data = pd.read_csv('./csv/교원+1인당+학생수(구별)_20230820151017.csv', index_col=0)

data_re = data.rename(columns=data.iloc[0])
data_re = data_re.drop(data.index[0])
data_re
print(data_re)

school_sort = list(set(list(data_re.index)))
print("\n\n학교 종류")
print(school_sort)

blank = []

for i in school_sort:

    a = data_re[data_re.index.str.contains(i)]    
    gyo = pd.DataFrame(a.loc[:,'교원1인당학생수'])
    gyo_nu = pd.to_numeric(gyo['교원1인당학생수'])
    gyo_nu_mean = gyo_nu.mean()
    
    blank.append(gyo_nu_mean)
    
print('\n\n')
print(blank)

plt.rcParams['font.family'] ='Malgun Gothic'
plt.rcParams['axes.unicode_minus'] =False

plt.bar(school_sort, blank)
plt.show()

 

 

https://www.senbigdata.com/

 

서울교육 데이터 활용 아이디어 공모전

home keyboard_arrow_right 공고안내 description 공고안내 서울특별시교육청에서는 서울교육 데이터 활용 아이디어 발굴을 통해 공공데이터 활용을 촉진하고, 시민 누구나 교육정책에 참여하는 기회 제

www.senbigdata.com

 

공공데이터 사이트

 

공공데이터포털 데이터셋

https://www.data.go.kr/

 

서울열린데이터광장

https://data.seoul.go.kr/

 

나이스교육정보개방

https://open.neis.go.kr/portal/mainPage.do

 

나이스 교육정보 개방 포털

OPEN API 활용신청 제공되는 데이터를 활용하기 위해 인증키를 발급 받으세요. 교육정보개방 소개 <!-- 2017.10.25 kty 정부3.0제거 교육부 정부 3.0 - 교육정보 개방 포털은 어떤 시스템인지 알아보세요.

open.neis.go.kr

교육통계서비스

https://kess.kedi.re.kr/index

 

 

유치원알리미

https://e-childschoolinfo.moe.go.kr/

 

유치원 알리미

유아 · 교직원 현황, 유치원 회계 현황, 환경위생 및 안전관리 사항 등 유치원의 주요 정보

e-childschoolinfo.moe.go.kr

학교알리미

https://www.schoolinfo.go.kr/Main.do

기본 준비

import numpy as np
import pandas as pd
import os

print(os.getcwd())
print(os.listdir(os.getcwd()))
print(os.listdir('./csv'))

 

 

csv 파일들은 편의를 위해 csv 폴더에 따로 모아두기

 

 

자료

 

https://www.data.go.kr/index.do

 

https://www.data.go.kr/data/15080794/fileData.do

 

 

전체출력

import csv
f = open('./csv/school in seoul.csv')
data = csv.reader(f)

for row in data:
    print(row)

 

카테고리 확인

import csv
f = open('./csv/school in seoul.csv')
data = csv.reader(f)

for row in data:
    a=0
    print(f"* 첫째 행 구성요소 : {row}")
    print(f"* 행 길이 : {len(row)}")
    for i in row:
        print(f"{a}번째 값 : {i}")
        a+=1
    break

 

 

Pandas를 활용하여 간단하게

import csv
import pandas as pd

f = open('./csv/school in seoul.csv')
data = csv.reader(f)

df = pd.read_csv('./csv/school in seoul.csv', encoding='cp949', index_col=0)
df

df = pd.read_csv('./csv/school in seoul.csv', encoding='cp949', index_col=0)

cp949 : 한글 표현하기 위함

index_col = 0 : 불필요한 인덱스 제거 역할


index_col = 0 입력

 

 

index_col  생략

 

원하는 정보(초, 중, 고 중에서 선택)만 골라서 출력

 

df.index.str.contains() 함수를 통해 데이터 프레임의 인덱스 문자열에 원하는 문자열이 포함된 행을 찾기

import csv
import pandas as pd

f = open('./csv/school in seoul.csv')
data = csv.reader(f)

df = pd.read_csv('./csv/school in seoul.csv', encoding='cp949', index_col=0)

name = input('초등학교, 중학교, 고등학교 중에서 선택')

a = df.index.str.contains(name)

df2 = df[a]

df2

 

df.index.str.contains(name)에는 True, False 값이 배열 형태로 저장

 

"초등학교" 입력 결과

 

초, 중, 고 갯수 확인

import csv
import pandas as pd

f = open('./csv/school in seoul.csv')
data = csv.reader(f)

df = pd.read_csv('./csv/school in seoul.csv', encoding='cp949', index_col=0)

df_cho = df[df.index.str.contains("초등학교")]
df_jung = df[df.index.str.contains("중학교")]
df_go = df[df.index.str.contains("고등학교")]

print(f"전체 학교 수 : {df.shape[0]}")
print(f"초등학교 수 : {df_cho.shape[0]}")
print(f"중학교 수 : {df_jung.shape[0]}")
print(f"고등학교 수 : {df_go.shape[0]}")

 

 

행 개수, 열 개수 확인

import csv
import pandas as pd

f = open('./csv/school in seoul.csv')
data = csv.reader(f)

df = pd.read_csv('./csv/school in seoul.csv', encoding='cp949', index_col=0)
df

print(f"행 개수 : {df.shape[0]} 열 개수 : {df.shape[1]}")

 

학교 종류 확인(리스트 타입)

import csv
import pandas as pd

f = open('./csv/school in seoul.csv')
data = csv.reader(f)

df = pd.read_csv('./csv/school in seoul.csv', encoding='cp949', index_col=0)

index_info = list(set(df.index.to_list()))
print(index_info)

 

학교 종류별 갯수 

import csv
import pandas as pd

f = open('./csv/school in seoul.csv')
data = csv.reader(f)

df = pd.read_csv('./csv/school in seoul.csv', encoding='cp949', index_col=0)

index_info = list(set(df.index.to_list()))

print(f" index_info {index_info}\n\n")

a=[]

for i in index_info:
    # 정확한 일치 개수를 세는 방식으로 변경
    count = (df.index==i).sum()
    print(f"{i}: {count}")
    a.append(count)

print('\n\n',a,'\n\n')

print(sum(a),'\n\n')

 

 

(df.index==i).sum() 코드 이해

 

시각화

import matplotlib.pyplot as plt

print(index_info)

print(a)

plt.rcParams['font.family'] ='Malgun Gothic'
plt.rcParams['axes.unicode_minus'] =False

plt.bar(index_info,a)
plt.xticks(rotation=90)
plt.tick_params(axis='x', direction='in', length=3, pad=6, labelsize=8, labelcolor='black')
plt.show()

 

 

 

한글 깨짐 방지 코드

plt.rcParams['font.family'] ='Malgun Gothic'
plt.rcParams['axes.unicode_minus'] =False

 

한 번에 끝내기

import numpy as np
import pandas as pd
import os
import csv
import matplotlib.pyplot as plt


f = open('./csv/school in seoul.csv')
data = csv.reader(f)

df = pd.read_csv('./csv/school in seoul.csv', encoding='cp949', index_col=0)

kind = list(set(df.index.to_list()))
print(f"학교 종류 확인\n {kind}\n")


numbers =[]

for i in kind:
    count = (df.index==i).sum()
    print(f"{i}: {count}")
    numbers.append(count)
#     print(df)
    

print(f"\n갯수 : {numbers}")
print("총 합계 :",sum(numbers),"\n")

plt.rcParams['font.family'] ='Malgun Gothic'
plt.rcParams['axes.unicode_minus'] =False

plt.bar(kind,numbers)
plt.xticks(rotation=90)
plt.tick_params(axis='x', direction='in', length=3, pad=6, labelsize=8, labelcolor='black')
plt.show()

 

인구 구조 시각화_행정안전부 인구 데이터

라이브러리 import & 현재 파일 경로 확인은 항상 기본적으로 하기!!

import numpy as np
import pandas as pd
import os

print(os.getcwd())
print(os.listdir(os.getcwd()))

 

csv 파일은 'age.csv' 이름으로 저장, 파일 내용 확인

import csv
f = open('age.csv')
data = csv.reader(f)

for row in data:
    print(row)

 

특정 데이터만 확인

import csv
f = open('age.csv')
data = csv.reader(f)
for row in data:
    if '신도림' in row[0]:
        print(row)

 

+ Recent posts