데이터셋 다운로드 사이트 총정리
- 공공데이터,데이터거래소

주제별 데이터셋 다운로드 사이트 총정리!

주제별 데이터셋 다운로드 사이트 총정리!


공공데이터

공공데이터 관련해서 각 부처가 별도의 사이트를 운영하고 있는 경우가 많다.
분석주제와 관련된 부처의 빅데이터 사이트를 들어가보자.

  • 공공데이터 포털 : 공공데이터를 분야별로 종합해서 모아놓은 곳

  • 서울 열린데이터 광장 : 서울시가 운영하는 공공데이터포털

  • 경기 데이터드림 : 경기도가 운영하는 공공데이터포털

  • 한국관광 데이터랩 : 한국관광공사에서 운영하고 있는 데이터셋 관련 사이트.
    • 관광방문객수 데이터 제공
    • 광역지자체 관광지출액 데이터 제공
    • 관광수지, 기타 관광관련 데이터 제공
    • 우리지역 관광상황판, 관광이슈분석 등 간단한 분석도 제공

  • 국토교통부 데이터 통합 채널
    • 국토교통 해커톤 수상작, 국민 참여 분석 프로젝트 소개
    • 주택관련 데이터 : 공동주택 공시가격 데이터
    • 교통물류 관련 데이터 : 자동차 등록대수 데이터
    • 항공 안전현황 관련 데이터

  • 국가 공간정보 포털
    • 지적도 관련 데이터 제공
    • 지형도 관련 데이터 제공
    • 도로, 국토계획 관련 데이터 제공

  • 국가 대중교통 정보센터
    • 네이버지도(대중교통) 경로검색 데이터 제공
    • 카카오맵(대중교통) 경로검색 데이터 제공

  • 국가 물류 통합정보센터
    • 내륙화물 통계 데이터 제공
    • 항공화물 통계 데이터 제공
    • 운송수단 통계 데이터 제공
    • 생활물류 통계 데이터 제공


데이터 거래소

데이터 거래소는 데이터를 사거나 팔 수 있는 플랫폼이다.
민간기업에서 제공하는 데이터를 살 수 있다.


(python) 칼럼의 값(2개 이상)에 따라 행 뽑기

OR 과 isin()을 이용한 인덱싱

(python) 칼럼의 값에 따라 행 뽑기 (열과 행 혼합 인덱싱)


1. 문제 발생



위와 같은 데이터프레임이 있다.
이 데이터프레임에서 ‘country’ 열의 값이 ‘IT’ 이거나 ‘JP’인 행을 뽑고싶다.

어떻게 해야할까?

# 예제 데이터프레임
df_clean=pd.DataFrame({'country': ['IT','JP','KR','FR']
                      , 'income':[100,200,300,400]})
                      

2. 문제 해결


크게 2가지 방법이 있다.

첫번째 방법은 or 을 사용하는 것이다.

df_clean[(df_clean['country']=="IT") | (df_clean['country']=="JP")]
                    


또다른 방법은 isin()을 이용하는 것이다.

value_list=["IT","JP"]
df_clean[df_clean['country'].isin(value_list)]                    


isin( )은 output으로 boolean(True,False) 값을 반환한다.
따라서 위와 같이 인덱싱이 가능하다.


3. 배운 점 및 피드백

  • 어러 값을 가지고 있는 리스트가 있을 때, isin( )을 활용하면 효율적인 코딩이 가능하다.

(SQL) 데이터 그룹핑 (GROUP BY, HAVING)

(SQL) 데이터 그룹핑하기



우리는 그룹핑을 통해 데이터를 요약할 수 있다.

SQL은 GROUP BY절을 통해 데이터 그룹핑을 지원한다.
HAVING 절을 이용하여 그룹핑에 조건도 추가할 수 있다.

데이터 파악에 큰 도움을 주는 데이터 그룹핑에 대해 살펴보자.

1) 그룹핑하기 : GROUP BY
2) GROUP BY절의 주요 규칙
3) 그룹 필터링 : HAVING
4) HAVING vs WHERE




1. 그룹핑하기


그룹핑은 다음과 같은 상황에서 주로 쓰인다.

  • 레코드가 종류별로 몇개가 있는지 세고 싶을 때.
  • 레코드의 총합을 종류별로 알고 싶을 때.
  • 레코드를 종류별로 집계하고, 조건에 따라 필터링하고 싶을 때.

SELECT 문에서 GROUP BY 절을 사용하여 그룹을 생성할 수 있다.

SELECT 
  vend_id
  , COUNT(*) AS num_prods
FROM Products
GROUP BY vend_id
;


위의 구문은 GROUP BY 절을 사용한 예시이다.

vend_id별로 그룹핑하고, 그룹별로 레코드의 개수를 출력했다.
(그룹 계산 함수로 COUNT 함수 사용)


2. GROUP BY 절의 주요 규칙


GROUP BY절의 주요 규칙은 다음과 같다.

  • GROUP BY 절은 원하는 만큼의 열을 써서, 중첩 그룹을 만들 수 있다.

  • GROUP BY 절은 WHERE 절 뒤에, 그리고 ORDER BY 절 앞에 와야 한다.

    • ORDER BY절은 항상 구문 마지막에 사용하자
    • GROUP BY절은 데이터 정렬이 안될 때도 많다.
      따라서 정렬을 원한다면 ORDER BY를 이용하자.


3. 그룹 필터링 : HAVING


SQL은 데이터를 그룹핑하는 것 뿐만 아니라,
그룹 필터링도 가능하게 해준다.

대표적인 예로 다음과 같은 상황이 있다.

  • 최소 3번 이상 주문한 고객 리스트.
  • 총 주문금액이 30000원 이상인 고객 리스트

그룹 필터링은 HAVING 절을 이용한다.

HAVING절의 문법은 WHERE절의 문법과 동일하다.

따라서, HAVING 절은 연산자나 연산키워드를 포함하여 사용하면 된다.

연산자설명
=같다
<>같지 않다.
!=같지 않다.
<~ 보다 작다
<=~ 이하 이다.
!<~ 보다 작지 않다.
>~ 보다 크다
>=~이상 이다.
!>~ 보다 크지 않다.
BETWEEN두 개의 특정한 값 사이
IS NULL값이 NULL 이다.


GROUP BY와 HAVING 절을 이용하여
최소 3번 이상 주문한 고객 리스트를 뽑아보는 구문은 아래와 같다.

SELECT cust_id, COUNT(*) AS orders
FROM Orders
GROUP BY cust_id
HAVING COUNT(*) >= 2;




4. HAVING vs WHERE


앞서 살펴본 것처럼, >HAVING절과 WHERE절은 데이터를 필터링할 때 사용한다.

그렇다면, 이 둘의 차이는 무엇일까?

두 절의 차이는 WHERE절은 데이터가 그룹핑되기 전에 필터링하고,
HAVING 절은 데이터가 그룹핑된 후에 필터링한다는 점이다.

WHERE 절에서 필터링되어 제거된 행은 그룹에 포함되지 않는다.

WHERE절과 HAVING절을 동시에 사용하여 더 세부적인 필터링을 할 수 있다.

예를 들어, 지난 1년동안 두 번 이상 주문한 적이 있는 고객만을 뽑아내고 싶다고 하자.

이 경우, WHERE절로 지난 1년 동안 주문했던 고객을 필터링하고,
그 다음 , HAVING 절을 이용하여 결과에서 두 번 이상 주문한 고객을 필터링하면 된다.

구문은 다음과 같다.

SELECT 
  vend_id
  , COUNT(*) AS num_prods
FROM Products
WHERE 1=1
  AND prod_price >= 4
GROUP BY vend_id
HAVING COUNT(*) >= 2; 



대다수 DBMS에서 GROUP BY가 명시되지 않는다면,
HAVING절과 WHERE 절은 똑같이 처리한다.

하지만 디버깅과 업무효율화를 위해,
이 둘을 꼭 구별하여 사용하자.

  • GROUP BY 집계 전 필터링 : WHERE
  • GROUP BY 집계 후 필터링 : HAVING

(Python) json 파일을 데이터프레임으로 만들기

json 파일에 대해 알아보고 , 이를 데이터프레임으로 변환해보자.


(python) json 파일을 데이터프레임으로 만들기



1. Json이란?

1-1 Json 의 정의

json은 JavaScript Object Notation의 약자로써 자료를 주고 받을 때 주로 사용하는 파일형식이다.

약자에서 알 수 있듯이, json은 자바스크립트에서 파생되었다.
따라서 json은 자바스크립트 구문형식을 따른다.

1-2 . Json의 특징 ( 장점 )

  • 특정 프로그래밍 언어, 플랫폼에 종속적이지 않다.
    • 따라서 다양한 프로그래밍 언어에서 사용 가능하다.
    • 서로 다른 시스템과 객체를 교환할 때 유용하다.
  • 텍스트 형식으로 되어 있어, 사람과 기계 모두 파일을 읽고 쓰기 편하다.



2. Json을 판다스 데이터프레임으로 불러오기.



미국 GDP 정보가 저장된 json파일이 로컬 디렉토리에 있다.
이 파일을 판다스를 통해 데이터프레임으로 변환해보자.

(크롤링을 통해 웹에 저장된 json파일을 불러오는 경우 , urlopen 모듈을 이용하면 된다.)

import pandas as pd # pandas 모듈 로드
import json  # json 모듈 로드


우선 pandas와 json 모듈을 임포트한다.


json_file_path="./NY.GDP.MKTP.CD.json" # 파일로드 (파일명 : NY.GDP.MKTP.CD.json )

with open(json_file_path,'r') as j:
    contents=json.loads(j.read())  # open : r - 읽기모드, w-쓰기모드, a-추가모드  


위와 같이 json 파일을 로드한다.

json.loads( )로 파일을 불러올 경우, 아래 그림과 같이 오류가 발생할 수도 있다.

따라서 위 구문으로 json 파일을 로딩하자.



참고)

Expecting value : line 1 column 1 (char 0) 에러 발생이유

1) 인코딩 에러

2) 빈 문자열이 삽입되어 있을 경우.


contents 객체에 json 데이터가 저장되었다.


contents 객체의 구조는 위 그림과 같다.
2번 리스트에 저장된 정보를 데이터프레임으로 만들것이다.

우선 2번 리스트에 저장된 데이터를 확인해보자.

contents[1][1] 

데이터가 딕셔너리 형태로 저장되어 있다.

key값을 칼럼으로, value를 레코드로 사용할 것이다.
이를 위해 3단계의 과정을 거치면 된다.

  1. key와 같은 이름을 가진 빈 리스트를 만들기.
  2. for문과 인덱싱을 이용하여 각 리스트에 value 집어넣기.
  3. pd.DataFrame( {칼럼명 : 리스트} ) 이용.

date=[]
value=[]
unit=[]
obs_status=[]
decimal=[]
for i in range(len(contents[1])):
    date.append(contents[1][i]["date"])
    value.append(contents[1][i]["value"])
    unit.append(contents[1][i]["unit"])
    obs_status.append(contents[1][i]["obs_status"])
    decimal.append(contents[1][i]["decimal"])
USA_GDP=pd.DataFrame({"date":date,
                    "value":value,
                    "unit":unit,
                    "obs_status":obs_status,
                    "decimal":decimal})

정상적으로 데이터프레임이 출력되었다.

(SQL) 칼럼 연결하기, 공백 제거하기
(CONCAT, TRIM)

(SQL) 칼럼 연결하기 , 공백제거하기.

(SQL) 칼럼 연결하기 (CONCAT ), 공백 제거하기 ( TRIM, RTRIM, LTRIM )



  • 회사명과 회사 위치를 함께 출력하고 싶지만, 두 정보가 서로 다른 테이블 열에 저장되어 있다.

  • 시,도, 우편번호는 서로 다른 열에 저장되어 있지만, 배송지 주소를 인쇄하는 응용 프로그램에서는 하나의 필드로 가져와야 한다.

위 두 상황을 해결하기 위해서는 칼럼을 서로 연결해줘야 한다.
칼럼을 연결할 때 사용하는 함수인 Concat, || 에 대해 알아보자.

추가로, 칼럼의 공백을 제거해주는 함수인 TRIM에 대해서도 살펴보자.


✋🏾 <손에 잡히는 10분 SQL _ 인사이트> 교재를 참고해 작성한 포스팅입니다.

✋🏾 샘플데이터 다운로드 링크


1. 칼럼 연결하기 : CONCAT, ||



칼럼을 연결하는 문법은 사용하는 DBMS에 따라 다르다.

MYSQL과 MariaDB의 경우, CONCAT 함수를 이용하여 칼럼을 연결해준다.

SELECT CONCAT(vend_name,'(' , vend_country,')') AS vend_total
FROM Vendors



CONTCAT함수는 괄호안에, 연결하고자 하는 칼럼, 문자를 넣어주면 된다.

위 코드의 경우 , vend_name 칼럼과 vend_country 칼럼을 연결해준다.
추가로, 소괄호를 함수안에 삽입해 vend_country를 괄호로 감싼 것을 알 수 있다.


위 표와 같이 vend_name, vend_country과 연결되어 출력된다.

PostgreSql은 칼럼을 연결하기 위해 || 문법을 사용한다.

SELECT vend_name || '(' || vend_country || ')' AS vend_total
FROM Vendors



연결하고자 하는 대상 사이에 || 를 넣어주면 된다.
( CONCAT 함수보다 더 간단하고 직관적인 느낌이다)


2. 공백제거하기 : TRIM, RTRIM, LTRIM



칼럼을 서로 연결하다 보면 공백문자가 사이에 채워져 있는 경우가 많다.

연결하자하는 레코드 자체에 공백이 포함되어 있어 나타나는 현상이다.

대부분의 DBMS는 열 길이에 맞춰 텍스트를 저장하기 때문에
공백도 하나의 문자로 취급한다.

그러나 문제는 공백은 눈에 잘 띄지 않는다는 점이다.

따라서,공백을 고려하지 않고 데이터를 처리한다면
향후에 데이터 검색이나 계산시 문제가 발생할 수 있다.

다행히도 많은 DBMS가 공백제거 함수를 제공한다.


TRIM ( ) , RTRIM( ) , LTRIM ( ) 함수를 이용하면 레코드의
공백을 제거 할 수 있다.

함수명에서 눈치챈 사람도 있겠지만, 세 함수의 차이는 아래와 같다.

  • TRIM ( ) : 양쪽에 있는 공백 제거

  • LTRIM ( ) : 왼쪽에 있는 공백 제거

  • RTRIM( ) : 오른쪽에 있는 공백 제거

다음 코드는 공백을 제거하여 칼럼을 연결하는 코드이다.

SELECT CONCAT(RTRIM(vend_name),'(',RTRIM(vend_country),')')
FROM Vendors
ORDER BY vend_name; -- MYSQL
     
     
SELECT RTRIM(vend_name) || '(' || RTRIM(vend_country) || ')'
  FROM Vendors
  ORDER BY vend_name; -- Postgresql 

Pagination


© 2024. All rights reserved.