데이터 시각화 툴로서 종종 사용하는 Zeppelin을 갑자기 사용해야 할 일이 생겼다. 다만 예전에 설치할때 좀 까탈스러웠던 기억이 나서 Docker 이미지로 제공되는지를 찾아 보았더니 아니나 다를까 D2hub에 등록되어 있었다.

  이제 간단하게 설치를 진행해 보았다. (기본적으로 도커가 설치되어 있다는것을 전제로 하며 OS는 MAC, Linux 를 대상으로 합니다.)

#docker run -p 8080:8080 --rm --name zeppelin apache/zeppelin:0.9.0

  위의 명령어를 실행하면 Zeppelin 0.9 버전의 도커 이미지를 다운로드 하고 실행합니다. 하지만 로그라던가 notebook이 이미지 내에서 저장되므로 이미지가 삭제되거나 하면 작업한 notebook이 삭제될 수 있으므로 외부의 저장공간으로 아래와 같이 마운트 시켜 줍니다. 아래의 옵션은 차후에 드라이버를 적재하는 용도로도 사용되므로 아래와 같이 사용합니다.   

#docker run -p 8080:8080 --rm -v $PWD/logs:/logs -v $PWD/notebook:/notebook -e ZEPPELIN_LOG_DIR='/logs' -e ZEPPELIN_NOTEBOOK_DIR='/notebook' --name zeppelin apache/zeppelin:0.9.0

  이제 명령어를 수행하면 notebook 디렉터리와 logs 디렉터리가 현재 실행한 위치에 생성되고 실행이 잘 되는것을 볼 수 있습니다.

  % 실행중에 만약 root로 실행했는데 당황스럽게 파일 생성시 Permission Denied 라는 에러 메시지와 함께 실행시에 .git(notebook 하위) 디렉터리 생성이 안되거나 notebook이 생성되지 않았다면 (ubuntu 일때) root로 docker는 실행했지만 실제 Zeppelin이 실행되는 Java 프로세스는 사용자 권한으로 실행되므로 위에서 지정한 logs, notebook, .git 3가지를 해당 사용자로 생성하고 소유권을 변경해도 된다.

  이제 http://localhost:8080으로 접속하면 아래와 같은 화면이 나올것이다.

 

MySQL 연결하기..

  이제 MySQL을 연결해볼 차례다. 아래의 링크에 가면 Zeppelin 공식 페이제에서 각 DBMS 연결 방법이 설명되고 있다. 이번에는 jdbc를 이용하여 연결해 보도록 하겠다.

  참고로 Zeppelin은 postgresql 만 기본적으로 드라이버가 포함되어 배포되고 나머지는 모두 사용자가 다운로드 해서 interpreter 디렉터리 하위에 복사해서 넣어주어야만 한다. 하지만 Docker 이미지로 설치를 했기 때문에 Docker에 이를 넣어주기가 ..... 물론 불가능하지는 않다. 여러가지 방법이 있으니 시도해 보고자 하는분은 시도해 보시기 바랍니다. (귀차니즘에 입각하여 간단한 방법을.. ^^)

  우선 mysql-connector.jar 파일을 다운로드 한다. 그런 다음 위에서 docker 명령어를 수행했던 디렉터리로 간다. 내가 설치한 디렉터리는 /opt/zeppelin에서 실행하였다. 실행시 PWD를 변수로 받아서 notebook을 /notebook으로 맵핑 시켜 두었기 때문에 아래와 같이 /opt/zeppelin/notebook/mysql-connector-java-8.0.21.jar를 복사해 준다.

환경 변수 설정하기

  이제는 interpreter를 추가해줄 차례다. Zeppelin의 interpreter메뉴로 가서 신규로 생성을 눌러 새로 interpreter를 만든다. 그 때 템플릿은 jdbc를 선택하면 기본적인 필드가 나온다. 많은 필드중에서 아래의 몇가지 필드만 수정한다.

   default.url -> jdbc:mysql://localhost:3306/   
   default.user -> 사용자명   
   default.password -> 비밀번호   
   default.driver -> com.mysql.jdbc.Driver

  4가지만 기본적으로 설정하면 된다. 추가적인 mysql 접속 설정은 필요한 경우 하면 된다.

  이제 interpreter 하위에 Dependencies 부분에 추가한 디렉터리 위치를 넣어주어야 한다. 실제 파일이 위치한 경로는 /opt/zeppelin/notebook 이지만 실행시 맵핑을 해두었으므로 이미지상에서는 /notebook 으로 적어주면 된다.

  위와 같이 추가해준 다음 저장을 하고 이제 새로운 note를 생성한 다음 아래와 같이 쿼리를 내려 본다.

%interpreterName
select now()

 

  % 다만 위의 방법을 사용할 경우 docker 컨테이너를 재실행 시켜 줄 경우 노트북 파일과 드라이버 파일은 그대로 남지만 interpreter가 리셋되는 단점이 있다. 이 부분의 보완이 필요하다.

zeppelin.apache.org/docs/latest/interpreter/jdbc.html

 

Apache Zeppelin 0.8.2 Documentation: Generic JDBC Interpreter for Apache Zeppelin

 

 

  맥에서 syslog 데몬을 통해서 발생하는 syslog를 UDP 514로 전송할 수 있다.

1. /etc/syslog.conf 에 아래의 라인을 추가한다.

*.*        @10.10.10.5

2. syslog 데몬 재시작

launchctl stop com.apple.syslogd

launchctl start com.apple.syslogd

이제 해당 목적지 서버로 로그가 전송되는것을 확인할수 있다.

 

 

from datetime import datetime

# return : string '2020-03-01'
def gettoday():
    today = datetime.today().strftime("%Y-%m-%d")
    return today

# start_date : string  '2020-03-01'
# end_date : string  '2020-03-04'
# return : int  : 3
def get_datediff(start_date, end_date):
    betday = datetime.strptime(end_date,"%Y-%m-%d").date() - datetime.strptime(start_date,"%Y-%m-%d").date()
    return betday.days


if __name__ == "__main__":
    print(gettoday() )
    betday = get_datediff( '2020-03-01' , gettoday() )
    print( betday )

 

  간단하게 파이선으로 오늘 날짜를 구하고 두개 날짜의 차이를 구하는 함수

  날짜로 배치작업을 돌려야 할때 요긴하게 사용가능해 보인다. 다른 방법도 많지만.. 


#간단한게 가장 좋다.

  주로 DB를 사용하고자 할때 요즘은 SQL Lite등을 사용하지만 개발을 진행하다가 보면 보안적인 측면 그리고 성능적인 측면에서 수십, 수백만건의 데이터가 넘어 갈 경우에는 파일 DB로는 불가능한 경우를 종종 만나게 된다. 그럴때 사용할 만한 RDBMS로 MySQL을 사용하는데 매번 설정을 찾아 보는게 귀찮아 한번에 정리한 버전을 만들어 본다.

 

환경

OS : CentOS 7.X (amd64)

설치 방법 : yum을 이용한 설치

설치 대상 : MariaDB 10.5.2-1.el7.centos

 

yum repository에 등록

yum으로 최신 버전의 MariaDB를 설치하고자 한다면 먼저 /etc/yum.repos.d/ 하위에 신규 파일을 생성하고 아래와 같이 넣어 준다.

 

maria.repo

 

[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.5/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

 

간략 설명

: 위의 yum.mariadb.org 에 접속하면 버전과 OS까지 선택할수 있게 되어 있다. 

설치하고자 하는 버전별로 OS를 선택해서 위의 baseurl을 업데이트 하기 바란다.

 

설치

이제는 설치를 진행해 보자.

아래의 명령어만으로 관련된 모든 패키지를 설치 할수 있다.

yum install MariaDB*

 

(2/435): MariaDB-common-10.5.2-1.el7.centos.x86_64.rpm                 |  81 kB  00:00:07     
(3/435): MariaDB-compat-10.5.2-1.el7.centos.x86_64.rpm                 | 2.2 MB  00:00:17     
(4/435): MariaDB-devel-10.5.2-1.el7.centos.x86_64.rpm                  | 8.1 MB  00:00:43     
(5/435): MariaDB-client-10.5.2-1.el7.centos.x86_64.rpm                 |  12 MB  00:01:16     
(6/435): MariaDB-shared-10.5.2-1.el7.centos.x86_64.rpm                 | 113 kB  00:00:02     

 

만약 구버전을 사용하다가 위의 yum을 업데이트 한다면 관련된 많은 패키지가 업데이트 된다.

 

To start mysqld at boot time you have to copy
support-files/mysql.server to the right place for your system

PLEASE REMEMBER TO SET A PASSWORD FOR THE MariaDB root USER !
To do so, start the server, then issue the following commands:

'/usr//bin/mysqladmin' -u root password 'new-password'
'/usr//bin/mysqladmin' -u root -h sokoban.co.kr password 'new-password'

Alternatively you can run:
'/usr//bin/mysql_secure_installation'

which will also give you the option of removing the test
databases and anonymous user created by default.  This is
strongly recommended for production servers.

See the MariaDB Knowledgebase at http://mariadb.com/kb or the
MySQL manual for more instructions.

You can start the MariaDB daemon with:
cd '/usr/' ; /usr//bin/mysqld_safe --datadir='/data/mysql/'

You can test the MariaDB daemon with mysql-test-run.pl
cd '/usr//mysql-test' ; perl mysql-test-run.pl

Please report any problems at http://mariadb.org/jira

The latest information about MariaDB is available at http://mariadb.org/.
You can find additional information about the MySQL part at:
http://dev.mysql.com
Consider joining MariaDB's strong and vibrant community:
https://mariadb.org/get-involved/

 

잘 설치 되었다면 위의 메시지가 뜨면서 MariaDB가 실행된것을 PS로 확인할 수 있다.

 

후속 작업

먼저 접속을 위해서 아래의 명령어를 통해서 root 패스워드를 설정 한다.

 

/usr/sbin/mysqladmin -u root password 'new-password'

 

 

설정 변경

DB의 캐릭터 설정과 메모리 사용량 등을 설정한다.

my.cnf 파일의 변경

 

 

[client-server]

[mysqld]
datadir=/data/mysql
general_log_file=/data/mysql/log/general.log
socket=/var/lib/mysql/mysql.sock
init_connect="SET collation_connection = utf8_general_ci"
init_connect="SET NAMES utf8"
#default-character-set = utf8
character-set-server = utf8
collation-server = utf8_general_ci
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
#
max_allowed_packet = 1M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size =1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 16M
query_cache_limit = 32M
thread_concurrency = 4
max_connections = 100 #200

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

[client]
default-character-set = utf8

[mysqldump]
default-character-set = utf8
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

 

 

 

시작 할때 datadir을 변경하고자 한다면 아래와 같이 /etc/init.d/mysql 스크립트내의 datadir에 명시해준다.


# If you change base dir, you must also change datadir. These may get
# overwritten by settings in the MariaDB configuration files.

basedir=
datadir=/data/mysql

# Default value, in seconds, afterwhich the script should timeout waiting
# for server start. 
# Value here is overriden by value in my.cnf. 
# 0 means don't wait at all
# Negative numbers mean to wait indefinitely

 

 

예외상황 처리

 

설치 이후 초기 DB 파일이 설치 되지 않았을 경우 대처

sudo mysql_install_db --user=mysql --basedir=/usr/ --ldata=/data/mysql/

 

서비스 포트 변경

보안성 향상을 위해 Port를 변경해 주어야 할 필요가 있을때 아래의 방법으로 변경한다.

 

SE Linux가 활성화 되어 있다면

아래의 명령어를 이용하여 SE Linux에 포트를 추가해야 한다.

semanage port -a -t mysqld_port_t -p tcp 13306

 

그리고 방화벽의 포트를 열어 준다.

firewall-cmd --permanent --zone=public --add-port=13306/tcp

firewall-cmd --reload

 

마지막으로 서비스에서 포트를 변경한다.

vim /etc/my.cnf.d/server.cnf

 

[mariadb]

port=13306

 

서비스 접속 IP 허용

최초 설치하게 되면 자기 자신의 IP만 허용되어 있고 root 계정만 존재하는 상태이다. 

계정을 생성한 다음 본인이 접근하고자 하는 외부 IP를 설정하여 외부 IP에서 접근할 수 있도록 설정해 주어야 한다.

 

MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'teddy'@'10.0.0.%' IDENTIFIED BY 'Password';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

   누구나 핸드폰은 하나 가지고 있는 시대이고 두개, 세개 가지고 있는 사람도 있을 것이다. 언제부터인가 회원 가입이나 본인을 인증하기 위한 수단으로서 핸드폰은 무엇보다도 중요한 수단이 되었다. 다만 국내가 아닌 해외의 경우 본인의 인증을 해야 하는경우, 혹은 전혀 신뢰성 없는 곳에서 SMS 문자를 받아야 하는 경우등이 발생될 수 있다. 

  이럴때 사용해 보면 좋은 온라인 무료 SMS 번호이다.

 

  % 국내 혹은 본인의 인증이 꼭 필요한 곳에는 본인 명의의 핸드폰을 사용하길 바란다. 아래의 경우 SMS 결과가 웹상에 인증없이 노출되어 있기 때문에 중요한 본인을 인증하는 서비스등에 사용할 경우 본인의 메일 노출, 메신저 대화 노출 등이 발생할 가능성이 높다. 

 

미국 번호를 제공하는 사이트

 

아래는 우크라이나 전화 번호로 실제 수령된 SMS 내용이다. 위에서 주의 한대로 임시로 혹은 본인 인증이 필요없는 곳에 사용하기 바란다. 만약 신용카드 번호를 등록하는 곳에 이런 전화번호를 사용 했다고 상상해 보라.. 그리고 누군가 그것을 알았다면 ? (결과가 웹상에 공개되어 버리기 때문에 누군가는 수신된 내역을 검토할 것이고 ID는 웹 사이트의 고객 ID 찾기를 통해서, 패스워드 까지도 변경 가능할 것이다.)

 

  구글링에 노출되는 10개 정도 사이트이다. 다만 실제로 수신된 시간이 최근이 아니고 작게는 10일전, 몇달전으로 된 경우 SMS 수신하지 못한다. 필요한 경우 마지막 수신 시간이 최근인지 확인하고 사용하는것이 필요하다.

 

https://www.raymond.cc/blog/top-10-sites-receive-sms-online-without-phone/

 

Top 10 Sites to Receive SMS Online without a Phone • Raymond.CC

If websites like Google, Yahoo or Microsoft are asking for your telephone number to verify that you are a real user, but if you are not comfortable in providing one, here are the top 10 sites that have free public phone numbers to receive SMS online.

www.raymond.cc

'보안' 카테고리의 다른 글

해외 임시 핸드폰 번호, 해외 무료 SMS 받기  (0) 2020.03.24
데이터 연계/결합의 개념  (0) 2020.03.01
일회용 메일 주소  (0) 2018.06.25

  윈도우즈에서 Pycharm을 사용해서 개발을 하는 경우가 종종 있다. PyCharm으로 개발은 하였지만 실제 코드가 동작하는 환경은 리눅스이기 때문에 이를 옮겨 주어야 한다. 

 

  이때 PyCharm의 편리한 기능중 하나인 Python 가상 환경으로 개발을 진행할수 있다.

  다만 이때 윈도우즈에서 가상환경으로 개발을 진행하게 되면 가상 환경의 실행 파일들이 모두 윈도우즈 exe 파일로 설치되게 된다. 이렇게 개발된 가상환경을 바로 유닉스 환경에서는 실행이 되지 않고 당연히 별도의 가상 환경을 해당 유닉스 시스템에 만들어 준 이후에 해주어야 한다. (윈도우즈의 가상 환경을 바로 이동 시킬수 있는 방법이 있는지는 모르겠다.)

 

   이때 해당 파이선 버전의 환경은 가상환경으로 유닉스상에서 만들기 편하지만 라이브러리의 경우에는 모두 이동을 해주어야 한다.

 

  여러가지 의존성들이 설치된 상태

 

  이때 아래의 명령어를 이용해서 간단하게 의존성을 추출하고 설치를 진행 할수 있다.

 

  방법

1. PyCharm 상에서 터미널창을 연 다음 아래의 명령어 수행

 

  > pip freeze > requirements.txt

 

2. requirements.txt 로 위의 버전 정보 추출 확인

 

beautifulsoup4==4.8.1
html5lib==1.0.1
lxml==4.4.2
numpy==1.17.4
pandas==0.25.3
psycopg2==2.8.4
python-dateutil==2.8.1
pytz==2019.3
singleton==0.1.0
six==1.13.0
soupsieve==1.9.5
webencodings==0.5.1

 

3. 유닉스 환경에서 아래의 명령어들을 이용하여 가상 환경 생성

 

> python -m venv env --without-pip

  (--without-pip 옵션은 제거하여도 된다. 에러가 난다면 추가한다.)

> source env/bin/activate

> pip install -r requirements.txt

 

pip가 제대로 설치되지 않아 --without-pip를 설정하였으므로 pip가 설치되지 않은 상태이므로 아래의 명령어로 설치해준다.

> curl https://bootstrap.pypa.io/get-pip.py | python

 

  이제 윈도우에서 개발한 환경 그대로 사용이 가능해 질 것이다.

데이터 연계 결합 지원제도 도입 방안 연구 (정보인권연구소) 발취

 

데이터 연계의 개념

 

데이터 연계(Data Linkage)란 두 개 이상의 출처로부터 동일인이나 동일한 사건, 기관, 장소에 연관된 정보를 함께 가져오는 것을 의미한다. 정보를 결합함으로써 단일 출처의 정보만으로는 알기 힘든 정보 요소 간의 관계가 밝혀질 가능성이 있다. 데이 터 연계는 레코드 연계(record linkage), 데이터 매칭(data matching), 데이터 통합 (data integration) 등으로도 불린다.2)

 

데이터를 연결할 때 사용되는 변수들은 식별 변수와 관심변수, 크게 두 종류로 구 분된다. 식별 변수(Identifying variables)는 이름, 주소, 의료보험번호 등과 같이 개인 식별에 사용되는 변수로서 서로 다른 데이터셋의 연계에 사용된다. 관심변수 (Variables of interest)는 나이, 성별, 수입, 질병, 직업 등 연구의 주된 관심사가 되는 변수들을 의미한다.

 

식별자에는 직접적인 식별자(direct identifiers)와 간접적인 식별자(indirect identifiers) 두 종류가 있다. 직접적인 식별자는 이름, 주민등록번호, 주소 등과 같이 개인을 정확히 구별해낼 수 있는 식별자이며, 데이터들을 연결할 때만 가치가 있는 정보로 연구자들은 별로 관심을 두지 않는 대상이다. 하지만, 직접 식별자는 개인 식 별이 가능하므로 매우 민감한 정보일 수 있다. 그러므로 연구목적의 데이터셋에서 직 접적인 식별자들은 제거한 후에 연구자들이 접근하도록 하는 것이 일반적이다.

 

간접적인 식별자는 다른 정보와의 결합을 통해서만 개인을 구별해낼 수 있다. 대부 분의 간접적인 식별자는 위의 관심변수와 중첩되는 경우가 많다. 예를 들어, 나이, 성 별, 인종과 같은 정보는 개인을 구별하는 데도 사용되지만 중요한 설명요인이 되는 경우가 많다. 간접적인 식별자를 통해서도 개인이 재식별될 가능성이 있는데, 특히 데 이터셋이 연계될 경우 이러한 특징적인 정보들이 증가함에 따라 개인 재식별 가능성 이 증가하게 된다.

 

(2) 데이터 연계의 유형

데이터셋의 상태나 연구의 목적 등에 따라 다양한 데이터 연계 방법을 활용할 수 있다.

 

가. 정확 연계(exact/deterministic linking)

정확 연계는 두 개의 데이터 출처가 고유한 참조번호(reference number)를 공유하 고 있는 경우에 가능하다. 예를 들어, 영국에서는 국가보건서비스(NHS) 번호를 이용 해서 NHS 의료기록들을 연결할 수 있다. 이론적으로 정확 연계의 장점은 확실하고 단순하다는 점이다. 이때 연결에 사용되는 고유식별자가 다른 개인정보를 포함하지 않는 임의번호인 경우가 좋다. 혹시 의도하지 않게 데이터가 유출될 경우, 개인정보를 포함하고 있는 고유식별자보다는 개인정보 노출의 위험성이 낮아지기 때문이다.3)

정확 연계는 연계 필드(match field)의 고유성과 함께, 그 데이터가 정확하다는 것 을 전제로 한다. 연계 필드의 데이터에 오류가 있다면, 당연히 연계로 생성된 데이터 셋에 오류가 발생할 수밖에 없기 때문이다. 이는 연계 필드를 생성하는 기관이 얼마 나 많은 자원을 갖고 있는지와 정확한 연계의 중요성 정도에 달려있다. 예를 들어, 카 드번호와 같이 데이터값의 정확성이 중요한 경우에는 값의 정확성을 즉시 자체 점검 할 수 있는 메커니즘을 가지고 있다.

 

정확 연계가 반드시 임의의 참조번호에 의해서만 이루어지는 것은 아니다. 경우에 따라 이름이나 생년월일 등의 정보를 통해서도 충분히 연계가 가능할 수도 있다. 그 러나 이 경우에는 연계 필드가 고유하고, 정확하다는 전제가 취약해질 수 있다.

 

나. 확률연계(probabilistic matching)

확률연계는 두 개 이상의 데이터셋에서 식별 변수에 해당하는 값을 비교하여 두 레 코드가 동일인에 관한 기록일 가능성을 추정하는 방식이다. 이 방법은 데이터가 부정 확하거나 불완전할 수 있다는 점, 그리고 데이터 출처마다 값이 다른 포맷으로 입력 되었을 수도 있다는 점을 전제로 한다.

서로 다른 데이터 소스가 정확 연계를 위해 동일한 참조번호를 사용하기 위해서는 기관 간의 조정이 필요하지만, 이름, 주소, 나이, 성별 등은 많은 데이터 소스에서 일 반적으로 사용하는 정보들이다. 서로 다른 데이터셋에 공통적인 고유한 참조번호가 없거나, 혹은 법적인 문제를 포함한 여러 가지 이유로 사용하기 힘들 경우 확률연계 를 수행할 수 있다.

두 레코드가 동일인에 관한 것일 확률을 측정하는 것이므로 오류 가능성이 존재한 다. 이러한 오류 가능성은 동일인에 관련된 레코드가 아님에도 연결하는 경우와 실제 로 연결되는 레코드가 있음에도 연계되지 않는 경우가 있을 수 있는데, 전자를 1종 오류(false positives), 후자를 2종 오류(false negatives)라고 부른다.

연계 실제

True Match

True Non-Match

Link

True Positive

False Positive (1종 오류)

Non-Link

False Negative (2종 오류)

True Negative

표 2-1 데이터 연계 오류

* 출처: 오미애 등 (2014)

 

확률연계를 수행하는 소프트웨어는 데이터를 사용자가 설정한 일정한 오차범위를 갖고, ‘매칭됨(matched)’, ‘매칭되지 않음(unmatched)’, ‘불확실(uncertain)’ 등으로 분류 하게 된다. 그 목적은 사용자가 ‘매칭됨’ 및 ‘매칭되지 않음’은 유효하다고 생각하고, ‘불확실’ 영역에 초점을 맞추어 검토하도록 하는 것이다. 이렇게 사람이 직접 개입함 으로써(이를 clerical matching이라고 한다) 연계율을 높일 수 있다.

확률연계는 정확 연계보다 다소 주관적인 절차가 더 많을 수밖에 없다. 사람들이 많은 결정을 내려주어야 하기 때문이다. 예를 들어, 어떠한 변수의 조합을 사용하는 것이 적절한가, 연계 여부 결정을 위한 요구조건은 얼마나 엄격하게 설정되어야 하는 가4), 일치하지 않는 값들은 오류로 처리할 것인가, 어떤 변수에서의 불일치는 다른 것보다 중요한 것으로 봐야 할 것인가.5) 또한, 확률연계를 통한 분석을 다른 연구자 가 검증할 수 있도록 하기 위해서는 이러한 결정이 투명하고, 기록되고, 일관된 방식 으로 이루어질 필요가 있다.

  확률연계는 그 속성상 정확 연계보다는 오류에 덜 민감하다. 그럼에도 불구하고, 데 이터 연계 작업 전에 데이터 정제(data cleaning) 작업이 선행되어야 할 수 있다. 예 를 들어, 문자열 데이터의 양식을 통일하거나 불필요한 부분을 제거하는 절차가 필요 하다. 또한, 문자열을 비교하는 알고리즘의 특성은 연계 결과에 큰 영향을 미칠 수 있 다. 예를 들어, 소리 기반 연계 알고리즘은 ‘beat’ 와 ‘beath’보다는 ‘Jon’과 ‘John’이 더 가깝다고 판단할 수 있겠지만, 바이그램(bigram) 분석 알고리즘(‘be/ea/at’와 ‘be/ea/at/th’처럼 문자열을 문자 쌍들로 분리하여 분석하는 방식)에서는 반대가 될 것 이다.

 

다. 통계적 연계(statistical linking)

정확 연계 및 확률연계가 정확한 두 개인을 연계하는 것이라면, 통계적 연계는 서 로 다른 개인에 관한 두 개의 레코드가 마치 동일인에 관한 레코드인 것처럼 연계하 여 분석하기 위해 개발된 방법으로 데이터 퓨전(data fusion)이라고도 한다. 예를 들 어, 50세 경상도 남성인 홍길동의 어떤 특성(교육수준, 정치적 성향 등)이 다른 50세 경상도 남성과 유사하다면, 홍길동의 의료 데이터를 그와 유사한 다른 누군가의 정보 와 연계했을 때 통계적으로 유의미한 결과를 얻을 수 있을 것이다. 공중보건 분야에 서는 연구자가 정책 평가를 위해서 시뮬레이션 모델을 만들기 위해 사용한다.

이 방법의 장점은 연계의 질이 덜 중요해진다는 점이다. 그러나 이 방법은 많은 통 계적 가정에 의존하고 있다. 우선 연계할 여러 데이터의 표본은 동일한 모집단에서 조사되었다고 가정한다. 또한, 매칭 변수가 주어졌을 때, 두 데이터셋의 관심변수가 서로 독립적이어야 한다는 것이다. 이는 하나의 연계 후보가 다른 것과 유사하다는 전제를 위해 필요하다.

그러나 통계적 연계의 문제점은 그 전제가 충족되지 않았을 경우, 분석의 결과를 신뢰할 수 없게 된다는 점이다. 두 데이터셋의 조사 혹은 생산 시점이 다를 경우, 두 데이터의 모집단이 다르거나 가중치가 다른 경우, 공통 변수 선택 등 고려해야 할 문 제가 많으며, 연계 데이터의 품질을 어떻게 측정할 것인지도 중요한 문제이다. (오미 애 등, 2014)

라. 다층 연계(multilevel linking)

데이터 연계가 반드시 개인 레벨일 필요 없이 환경정보와 연결되어도 유용성이 높 다. 즉, 개별 단위(사람과 사람, 단체와 단체)의 연계가 아니라, 서로 다른 차원 사이 에 ‘수직적으로’(예를 들어 개인을 의사 혹은 병원과 연계), 혹은 ‘수평적으로’(개인을 작은 지역의 데이터와 연계) 연계할 수도 있다. 예를 들어, HIV 감염 데이터를 지역 적 데이터와 연계할 경우, 지역에 따라 다른 특성을 보여줄 수 있다. 다층연계를 사용 할 경우 정확도가 높으면서도 보안상의 위험도는 낮출 수 있다.

(3) 연계 데이터 유형별 특징

가. 횡단면조사 데이터(Cross-sectional survey data)

사회경제적 데이터를 수집할 때는 주로 설문을 이용하게 되는데, 통계를 낼 목적이 므로 설문조사 결과 데이터는 표면적으로는 깨끗하다. 즉, 통상적인 표준에 따라, 통 상적인 정의와 메타데이터와 함께 수집·생산된다.

그러나 설문 데이터는 주로 표본조사를 하므로 이 데이터가 관심 인구의 대표성을 갖고 있는지가 관건이 된다. 적은 비용으로 가치 있는 데이터를 추출하기 위해, 군집 화(clustering, 특정 지역 혹은 그룹에 초점을 맞춘다)와 계층화(어떤 외부 특성에 따 라 다른 샘플링 방법을 사용) 기법이 사용된다.

설문조사 데이터는 한번 수집되면 그 정확성을 검증하기 힘들다. 설문 응답자를 추 적해서 확인하는 것이 비용이 많이 들어 사실상 불가능하기 때문이다. 또한, 설문조사 데이터는 일반적으로 가명화되기 때문에 데이터 연계 시 문제가 발생할 수도 있다. 예를 들어 연령이 42세가 아니라 43세로 잘못 기록되었을 때, 이는 통계적으로는 큰 문제가 아닐 수 있지만, 데이터 연계 시에는 문제를 야기할 수 있다.

'보안' 카테고리의 다른 글

해외 임시 핸드폰 번호, 해외 무료 SMS 받기  (0) 2020.03.24
데이터 연계/결합의 개념  (0) 2020.03.01
일회용 메일 주소  (0) 2018.06.25

전문적으로 Python으로 개발하지 않더라도 Python으로 이것저것 개발하거나 혹은 인터넷이나 Github상에서 다운로드한 소스코드를 동작해야 할 일이 꽤 많을 것이다.  그럴때 아래와 같이 잘 예외 처리가 된 코드를 보았다고 생각해 보자..


    lineList = []

    try:

        f = open(fileName, 'r', encoding='latin-1')


    except IOError:

        print("[!] Could not open file " + fileName)

        exit(1)


    except:

        print("[!] Could not access file " + fileName)

        exit(1)


    for line in f.readlines():

        newLine = line.replace('\n', '')

        lineList.append(newLine)


  단지 파일의 내용을 읽은 다음 단순히 리스트에 하나씩 넣어주는 단순한 코드 이다.

 근대 위의 코드를 실행해 보면 아래와 같이 에러가 난다.



[!] Could not access file ./usernames.txt


예외처리가 되어 있어 아무런 에러 메시지가 나지 않는다. 제일 쉬운 에러 메시지를 보는 방법은 try, except를 모두 제거 해버리면 된다. 그러나 열심히 짜둔 코드를 에러 하나 보겠다고 즉 Stack Trace 하나 하겠다고 지우고 다시 짜기엔 귀차니즘이 용납하지 않는다. 이럴때 에러 로깅을 한가지 넣어서 해결 해 보자.


아래와 같이 코드를 수정한다.


    import traceback

    lineList = []

    try:

        f = open(fileName, 'r', encoding='latin-1')


    except IOError:

        print("[!] Could not open file " + fileName)

        traceback.print_stack()

        traceback.print_exc()

        exit(1)


    except:

        print("[!] Could not access file " + fileName)

        traceback.print_stack()

        traceback.print_exc()

        exit(1)


    for line in f.readlines():

        newLine = line.replace('\n', '')

        lineList.append(newLine)


   위와 같이 변경하고 나면 아래와 같이 encoding이 잘못된 키워드로 함수내에 정의되었다는 에러 메시지를 볼수 있다.


TypeError: 'encoding' is an invalid keyword argument for this function


  위에서 사용한 traceback은 python상에서 위와 같이 예외처리등이 수행된 상태에서 Stack Trace를 출력하기에 상당히 유용한 모듈이다. 상세한 설명은 아래의 링크를 참고하기 바란다.


https://docs.python.org/2/library/traceback.html


This module provides a standard interface to extract, format and print stack traces of Python programs. It exactly mimics the behavior of the Python interpreter when it prints a stack trace. This is useful when you want to print stack traces under program control, such as in a “wrapper” around the interpreter





Death Valley 관광하기

미국 서부를 여행하면서 제대로 황무지를 즐기고 볼수 있는 곳이라고 생각한다. 데스 밸리도 역시 국립공원으로 지정되어 있기 떄문에 보존이 잘 되어 있고 군대군대 관광을 할만한 포인트가 상당히 많이 있는 편이다. 다만 데스밸리의 경우 기온이 너무 올라가면 입장을 제한하기도 하니 기온을 잘 알아 보고 가는것은 필요해 보인다. 그리고 너무나 날씨가 더운 상태에서 차량으로 언덕을 계속 오르는 관광 코스의 경우 차에 무리가 많이 갈수도 있다.


이번 여행에서는 라스베가스에서 Yosemite로 가기 위해서 Bishop을 지나기로 했기 때문에 가는길에 있는 데스 밸리를 여행하는건 어찌보면 당연하지 않을까 생각된다. 천천히 짐을 챙겨서 오전 9시쯤 라스베가스의 호텔에서 출발하면 약 2시간 정도 가면 데스밸리의 관광 포인트로 들어갈 수 있다. 


이번에 내가 지나간 경로는 아래와 같다.



% 평소에도 더운 편이지만 내가 방문했던 7월은 한여름인지라 섭씨 50도까지 올라갔다. 실제로 장시간 돌아다니는것이 힘든 상태이기 때문에 다양한 포인트를 보지는 못했다.



Dante`s View

  해발 1,669m 높이에 있는 전망대로 데스 밸리 전체를 전망하기에 아주 좋은 장소이다. 


 단테의 전망(Dantes View)라는 이름이 지어진것은 신곡을 쓴 단테 알리기에리의 이름에서 따온것으로 1926년 Pacific Coast Borax 회사의 사업가들 몇명이 데스밸리에서 가장 전망이 좋은 곳을 찾다가 이 지점을 보고 꼭 단테의 신곡에 나오는 지옥과 연옥을 보는것 같다고 하여 Dante`s View라고 이름 붙였다고 한다.


  고도가 높은편이므로 올라가는 길은 상당히 오르막길이다. 운전을 약간은 조심하면서 올라가야 하고 거의 다 올라간 지점쯤에 임시 화장실이 하나 있다. 다만 시골 화장실이라고 생각하면 된다. ^^



정상에서 바라본 데스 밸리










zabriskie point

Pacific Coast Borax 회사의 부사장 겸 총 책임자였던 Christian Brevoort Zavriskie의 이름을 따서 지어진 전망대로서 낮은 위치에서 퇴적물들로 만들어진 황무지를 전망할수 있게 해줍니다. 










Furnace Creek Visitor Center

데스 밸리에 있는 여행자 안내소로 데스밸리에 대한 전반적인 설명을 볼수 있다.

간단한 음식도 판매하고 있기 때문에 라스베가스를 떠난 이후에 마땅히 식사를 할 장소가 없으므로 여기서 간단한 샌드위치를 사서 먹으면 좋다. 



관광 안내소 앞에 온도계 화씨 120도를 가리키고 있다. (섭씨로 약 49도 정도.. )



  




  미국 서부를 관광하면서 빼놓을수 없는 것중에 하나가 Yosemite 국립공원이 아닐까 생각한다. MAC OS를 사용하는 사람이라면 엘 캐피탄이나 시에라와 같은 버전명을 많이 들었을 것이다. 뿐만아니라 바탕화면으로 제공되는 수려한 자연의 사진들 모두 실제 Yosemite 국립공원의 장소 이름과 그 장소의 사진들이다. 


  Yosemite를 관광하는 방법에는 샌프란시스코에서 출발하여 진입하는 방법 한가지가 있을것이고 라스베가스나 LA쪽에서 올라가는 방법이 있다. 

그 중에서 가장 유명한 엘 캐피탄을 중심으로 많은 분들이 경로를 잡는데 실제로 내가 경로를 잡았을때에는 아래와 같은 경로가 있었다.


 1.  LA->Fresno -> Yosemite

 2. Las Vegas -> Fresno -> Yosemite

 3. Las Vegas -> Bishop -> Yosemite


  검색을 해본 결과 주로 한국 단체 여행의 경우 프레즈노(Fresno)를 경유한 다음에 Yosemite 국립공원으로 진입하는 경로가 많았기 떄문에 최초에 그 경로를 잡았지만 구글 맵에서 경로를 검색해보니 Bishop을 통과하는 120번 도로를 알려 주었다. 결과적으로 위에서 3번의 경로를 선택하였고 Bishop에서 Yosemite 엘캐피탄으로 가기 위해서는 120번 도로를 통과해야 한다.


   일명 Tioga 도로로 불리는 120번 도로는 요세미티 국립공원 한 중간을 통과하는 해발 3,000미터 높이의 도로이다. 한 중간을 통과한다는 말은 곧 그 도로를 통과하는 것으로도 요세미티를 많이 볼수 있다고 생각되었다. 


  이 도로의 중요한점은 보통 겨울기간에는 11월 ~5월까지는 폐쇄되고 일년에 약 5-6개월만 지나갈수 있다. (혹시라도 방문하시고자 하는 분은 열려 있는지 닫혀 있는지 반드시 확인해야 한다.)


  지금 이 글을 적는 시점에서는 닫혀 있다. ( https://www.nps.gov/yose/planyourvisit/conditions.htm )


  % 120번 도로를 타고 가면 초입에 입장료를 받는 곳이 나온다. 입장료는 차 한대에 30$ 였던것으로 기억한다. (다만 최근 $70까지 인상한다는 기사가 나오는데 고려하시기 바란다.)


Tioga Load 120 Load

요세미티 국립공원(Yosemite National Park) 동쪽 입구로 가려면 티오가 패스(Tioga Pass)라는 별명으로 불리는 120번 하이웨이를 타야 합니다. 이 도로는 해발 9,945피트(3,031m) 높이에 있으며, 겨울이 다가오면 통제됩니다(보통 11월부터 5월까지 통제되며, 여행 전에 현재 통제 상황을 확인하세요). 리 바이닝(Lee Vining) 마을 인근, 120번 도로의 시작점에 있는 후아 넬리 델리(Whoa Nellie Deli)라는 놀라우리만큼 훌륭한 레스토랑도 도로가 개방되어 있는 기간에만 영업합니다. 무엇이 놀랍냐구요? 이 식당은 다름 아닌 주유소에 딸린 마트 안에 있기 때문입니다. 우선 바닷가재 타퀴토스나 야생 버팔로 미트로프를 주문한 후, 밖으로 나가서 모노 레이크(Mono Lake)가 잘 보이는 곳에 자리를 잡으세요. 이곳은 고대에 바다였던 곳으로, 튜파 타워(tufa towers)라 불리는 초자연적인 지형 때문에 특히 사진작가들에게 인기가 좋은 곳입니다. 거대한 탑들이 마치 세월에 깎여나간 체스 말들처럼 호수 주변에 열지어 서 있습니다. 조류탐사를 하는 사람들도 이곳을 무척 좋아합니다. 호수가 사막 고지대에 있고, 화학적으로 독특하여(해수보다 염도가 세 배나 높습니다) 수백만 마리의 새들이 이곳에 모여들기 때문입니다. 모노 레이크 석회화 주립 자연보호지구(Mono Lake Tufa State Natural Reserve) 방문자 센터에서 더 많은 정보를 얻을 수 있습니다.

리 바이닝에서 요세미티로 가는 120번 고속도로를 타면 티오가 레이크(Tioga Lake)나 엘러리 레이크(Ellery Lake) 같은 고산 호수, 화강암 돔, 야생화 가득한 투올러미 초원(Tuolumne Meadows)입구를 지나게 됩니다. 계속 더 가서 북쪽으로 방향을 틀면 에버그린 로드(Evergreen Road)를 통해 고즈넉한 헷치 헷치 밸리(Hetch Hetchy Valley)가 나타납니다. 연중 가장 오랫동안 하이킹을 즐길 수 있으면서도 아직 사람들에게 많이 알려지지 않은 곳이죠. 등산로를 따라 걷다 보면 와파마 폭포(Wapama Falls) 비하이브 메도우 트레일(Beehive Meadow Trail)에 펼쳐진 야생화도 볼 수 있습니다.

https://www.visitcalifornia.com/kr/attraction/120%EB%B2%88-%ED%95%98%EC%9D%B4%EC%9B%A8%EC%9D%B4

미국 여행 공식 사이트 발췌



티오가 로드로 가기 바로 직전에 있는 주유소겸 마트 


( 이 마트 직전까지는 리 바이닝 근처에 대형 주유소와 식사할 곳이 많지만 이 마트를 지나고 나서는 Yosemite를 지나갈때까지는 전혀 마트나 주유소가 없기 때문에 진입하기 전에 충분히 2~3시간 정도 운행이 가능한 (약 200km 이상) 정도의 기름을 주유하길 권장한다. )











120번 도로에 있는 요세미티 여행자 안내소





% 단지 도로를 통과하는 중간중간에 차를 세우고 구경할만한 곳이 아주 많이 나온다. 


% 120번 도로를 이용 가능한 기간에 서부 여행을 하신다고 꼭 한번 지나가 보시기를 권장해 드리고 싶다.











+ Recent posts