ADsP 독학 3주에 도전한다.

수많은 검색 글이 나오는 온라인 강의료 환급을 위한 후기가 아닌 100% 독학으로 도전한다. 시간과 돈이 없어서.

 

지난 4월에 예정되었던 제24회 시험은 코로나-19로 인해 취소되었다. 제24회 시험을 신청했다가 환불 가능한 마지막 날에 취소했었는데, 나중에 보니 시험 자체가 취소되었다. 

 

제25회 시험은 6월 7일(일요일) 예정되어 있다.

 

3주간의 독학 학습목표는 당연히 자격증 취득이다. 완벽은 포기하고, 자격증 취득을 위한 "과락(40점)없이 평균 60점"에 집중하고자 한다.

 

학습 계획은 다음과 같다.

   - 3과목(데이터 분석)을 우선 집중적으로 판다. 범위도 넓고, 출제 문항도 많기 때문이다.

   - 1과목(데이터 이해)와 2과목(데이터 분석 기획)은 3과목 하고 공부한다. 분량도 적고 암기 과목이라 일찍 하면 잊어버릴 수 있기 때문이다. 1, 2과목에 집착하다가 3과목에 소홀하지 않도록 하기 위함도 있다.

   - 실전 기출 문제를 많이 풀어본다. 한국데이터산업진흥원이 펴낸 기출문제집이 있다. 

 

 

ADsP를 준비하는 모든 분들, 화이팅~!

 

2020.05.19. 코리.

 

 

 

 

Microsoft Office 엑셀로 데이터를 다룰 때 하지 말아야 할 두 가지 유의사항이 있습니다.

1. 셀 병합을 하지 않는다.

2. 데이터 범위 내에 공란을 두지 않는다.

 

셀 병합은 표의 가독성을 높이기 위해 유용한 기능에는 틀림이 없지만, 데이터를 다루는 것에는 많은 문제점이 발생합니다. 셀 병합은 엑셀로 작업한 결과를 출력할 때만 사용하기를 권장합니다.

 

나의 의지와는 상관없이 이미 셀 병합되어 있는 파일이 있는 경우, 셀 병합을 취소하고 빈 셀에 값을 채우는 방법에 대해 알아보도록 하겠습니다.

 

 

 

 

 

 

 

▲  위는 동영상

  아래는 글

 

 

 

예제 파일 다운로드

엑셀 셀 병합 취소 후 셀에 값 채우기_sample.xlsx
0.01MB

 

 

위의 예제파일에서 왼쪽 테이블은 "구분" 열에 셀 병합이 적용되어 있습니다. 셀 병합을 취소하고 빈 셀에 값을 채워서 오른쪽 테이블과 같이 만들어 보겠습니다.

 

위 예제 그림에서는 셀 병합의 부작용이 나타나 있습니다. 오른쪽 작은 표는 셀 병합 전과 후 테이블에 sumif 함수를 적용한 집계표입니다. 총재고의 합의 261개인데, 셀 병합이 된 테이블을 집계한 결과는 총합이 82로 나타나 있습니다. 이렇게 집계된 표로 보고서를 만들게 되면 허위보고를 하게 됩니다. 이러한 현상이 나타나는 이유는 병합된 셀의 경우, 가장 위의 셀에만 값이 있고, 나머지 셀에는 값이 없기 때문입니다.

 

이제 셀 병합을 취소하고, 그 결과 만들어진 빈 셀에 값을 채워보도록 하겠습니다.

 

1. 셀 병합을 취소할 셀을 선택한다.

2. 셀 병합을 취소한다.

3-1. "홈-편집-찾기 및 선택-이동옵션"을 선택한다. 또는

3-2. F5를 누른 후, "옵션"을 클릭한다. 

4. "빈 셀"을 선택한 후 확인을 클릭한다. 

5. 키보드의 "="를 눌러 수식 입력을 준비한다.

6. "="가 입력된 바로 위의 셀을 클릭한다. "=B3" 등과 같은 모습가 된다.

7. Ctrl+Enter을 누른다.(컨트롤 키를 누른 상태에서 엔터키를 누른다.)

8. 셀 병합 취소한 모든 셀을 선택한 후, 값 복사를 한다.

9. 끝.

 

단계는 9단계로 복잡해 보일 수 있지만, 생각보다 간단하고 쉽습니다. 자세한 방법은 위 동영상을 참고하면 도움이 됩니다.

 

 

연습문제 파일 다운로드

엑셀 셀 병합 취소 후 빈 셀에 값 채우기_등록금 현황.xlsx
1.23MB

 

위 동영상에서 소개된 대학 학과별 등록금 현황 파일로 연습해 볼 수 있습니다.

 

 

엑셀로 데이터를 다룰때 셀 병합을 하지 않는 습관을 들여야 합니다. 보고서에 넣기 위한 셀 병합된 표와 알록달록 색깔을 칠한 표는 별도의 sheet에서 따로 작업해서 만드는 것을 추천합니다. 데이터를 다루는 sheet는 raw data 형식으로 작업을 하는 것이 여러 모로 도움이 됩니다.

 

2020.05.05.

코리

 

 

 

윈도우(windows)에서 카이(Khaiii) 설치하기 - 그 네 번째 이야기. Khaiii 빌드와 설치

 

 

첫 번째 이야기 보러가기 - 리눅스 설치

두 번째 이야기 보러가기 - 리눅스 세팅

세 번째 이야기 보러가기 - 필요한 패키지 설치와 jupyter notebook 실행

 

 

리눅스에서 jupyter notebook까지 실행했다면, 이제 마지막 단계를 남겨두고 있다. 드디어 Khaiii를 설치한다. Khaiii 설치는 다음의 단계를 따른다.

   - 빌드 툴 설치

   - Khaiii 빌드

   - Khaiii 설치

 

오늘도 가슴 설레는 오류가 기다리고 있다.

 

 

 

▲  위는 동영상

  아래는 글

 

 

sudo pip3 install cmake

 

우선 cmake 3.10. 이상의 설치가 필요합니다.

 

CMake(Cross Platform Make)는 멀티플랫폼으로 사용할 수 있는 Make의 대용품을 만들기 위한 오픈소스 프로젝트이다[1]. 여기서 make는 소프트웨어 개발을 위해 유닉스 계열 운영 체제에서 주로 사용되는 프로그램 빌드 도구이다 [2].

무슨 말인지 모르겠다. 그냥 뭔가 설치하기 위한 도구인가 보다.

 

 

 

시작하자마자 오류를 출력합니다. 그렇지... 오류 없이 그냥 지나가면 허전하지...

 

"Module Not Found Error : No module named 'skbuild' "

Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-dpt1duvm/cmake/

 

일단 skbuild라는게 없어서 오류가 나는 것으로 보입니다.

"scikit-build / cmake-python-distributions" 라는 github에 유사한 증상에 관한 글이 있지만 이미 해결된 상태(closed)입니다.[3]

 

한참 동안 방법을 찾다가 앞서서 사용한 "apt-get"이 떠올랐습니다. 무작정 해봤습니다. 됩니다.

sudo apt-get install cmake

 

무작정 해본 거라, 소 뒷걸음질 치다 쥐 잡은 꼴입니다. 

좀 찾아보니 "pip3 install"과 "apt-get"에는 어디서부터 패키지를 받아오는지에 대한 작은 차이가 있었습니다.

 

앞서 살펴본 바와 같이 pip는 package installer for python을 의미한다. 반면 apt는 Advanced Packaging Tool을 의미합니다. pip로 설치하면 파이썬과 관련된 곳에서 파일을 다운로드 받고, apt를 사용하면 우분투와 관련된 곳에서 파일을 다운받는 것으로 확인된다.

 

위에 오류난 그림에서 보면 "Downlonding https://files.pythonhosted.org/packages/....." 으로 나타나지만, apt-get으로 실행한 화면에서는 "Get: 1 http://archive.ubuntu.com/ubuntu bionic..."로 나타난다.

 

 

git clone https://github.com/kakao/khaiii.git

깃헙에서 khaiii 관련 파일을 복사한다.

 

 

# khaiii 폴더로 이동(cd = change directory)
cd khaiii

# khaiii 폴더 아래에 build 폴더 만들기(mkdir = make directiory)
mkdir build

# build 폴더로 이동
cd build

# 프로그램에 필요한 리소스 준비(끝에 점 2개 찍어야 함) - 약 10분 정도 걸림
sudo cmake ..

# 빌드 실행 - 약 5분 걸림
sudo make all

# 리소스 빌드(large와 base중 선택, 저장용량에 문제가 없다면 large 선택)
sudo make large_resource # large
sudo make resource       # base

# khaiii 설치
sudo make install 

# python과 바인딩
sudo make package_python
cd package_python
sudo pip3 install . # 마지막에 점 하나 찍어야 함, 약 5분 걸림

 

 

드디어 khaiii 설치를 완료하였습니다.

"Successfully installed khaiii"가 반갑습니다.

 

 

이제 khaiii를 설치했으니, 다음에는 khaiii를 활용한 간단한 분석 이야기를 해볼까 합니다.

 

 

참고자료

 

[1] https://ko.wikipedia.org/wiki/CMake 

[2] https://ko.wikipedia.org/wiki/Make_(소프트웨어)

[3] https://github.com/scikit-build/cmake-python-distributions/issues/86

 

 

2020.04.12. 코리.

 

 

 

 

윈도우(windows)에서 카이(Khaiii) 설치하기 - 그 세 번째 이야기. 필요한 패키지 설치와 jupyter notebook 실행

 

 

첫 번째 이야기 보러가기 - 리눅스 설치

두 번째 이야기 보러가기 - 리눅스 세팅

 

 

 

윈도우에 리눅스(Ubuntu)를 성공적으로 설치하고 기본적인 세팅을 완료하였으니, Khaiii 설치를 위한 기본 패키지를 설치해야 한다.

   - jupyter, numpy, pandas 설치하기 

 

 

 

 

▲  위는 동영상

  아래는 글

 

 

sudo pip3 install jupyter numpy pandas

 

위의 명령어로 jupyter, numpy, pandas를 설치합니다. 설치하는데 시간이 조금 걸립니다. (한 5분 정도)

 

이제 낯선 리눅스와 이별하기 위해 jupyter notebook을 입력하고 실행합니다.

오류 없이 실행되면 허전합니다.

 

 

 

jupyter notebook을 입력하고 실행하면 위 사진의 윗부분과 같은 결과가 나타나야 정상인데, 화면이 깜빡이면서 아래 빨간색 글자가 0.1초 나타났다가 완전히 먹통(검은색 화면으로 바뀌어버리는) 오류가 나타납니다. 오류는 항상 설레죠.

 

먹통인 화면에서 탈출하는 방법은 "ctrl+c"를 눌러 중지시킨 후, "shutdown this notebook server?" 라는 질문에 "y"로 응답해주면 됩니다.

 

빨간색 오류는....

categoryinfo : invalid operation [start-process], invalid operation exception

fully qualified error id : Invalid Operation Exception.Microsoft.PowerShell.Commands.StartProcessCommand

 

뭔가 잘못된다고 합니다. 원인을 찾아 헤매다가 근본 원인을 파악하여 해결하지는 못했지만, jupyter notebook을 실행하기 위한 방법은 찾았습니다.

 

jupyter notebook --no-browser

브라우저 없이 주피터 노트북을 실행하도록 하면, 위에서 경험한 오류 없이 원하던 정보가 나타납니다. 아마도 위에서 경험한 오류는 주피터 노트북을 실행하는 과정에서 브라우저와 뭔가 연결이 잘 안돼서 나타나는 현상이라 추정됩니다.

 

 

 

원하던 정보가 정상적으로 출력되었습니다.

가장 아래 출력된 두 줄은 jupyter notebook을 실행할 수 있는 내부 주소입니다. 두 줄 중 한 줄을 마우스로 긁어서 복사(ctrl+c)합니다.

 

윈도우에서 브라우저(크롬 등)를 실행해서 주소창에 복사한 내용을 붙여놓고 엔터키를 눌러주면 드디어 jupyter notebook이 실행됩니다.

 

 

 

반가운 김에 hello world를 출력해 봅니다.

 

 

 

이제 Khaiii를 사용하기 위한 기본 준비를 마쳤습니다.

다음은 본격적인 khaiii 설치에 대한 내용을 포스팅할 예정입니다.

 

다음 이야기 보러가기 :

2020/04/12 - [Bigdata_tips] - [python] 윈도우에서 카이(Khaiii) 설치하기_04.Khaiii 빌드와 설치

 

 

파이썬을 학습하며 남기는 블로그입니다.

질문, 지적, 조언은 항상 환영합니다.

 

 

2020.04.08. 코리.

 

 

 

 

윈도우(windows)에서 카이(Khaiii) 설치하기 - 그 두 번째 이야기. 리눅스 세팅

 

 

첫 번째 이야기 보러가기 - 리눅스 설치

 

 

윈도우에 리눅스(Ubuntu)를 성공적으로 설치하였다면, 카이를 사용하기 위한 몇 가지 세팅이 필요하다.

할 일은 다음과 같다.

   - username과 password 입력

   - 전체 패키지 업데이트

   - 전체 패키지 업그레이드

   - pip 설치

 

 

 

 

 

▲  위는 동영상

  아래는 글

 

 

리눅스 아이콘에 마우스 우클릭하여 관리자 권한으로 실행한다.

그럼, CMD창이나 예전 DOS창과 같은 검은색 화면이 하나 실행된다. 처음 구동하는 경우, 시간이 1~2분 정도 걸리니 여유롭게 기다려야 한다.

 

 

준비가 되면 username을 입력하라는 메시지가 나타난다. 자기 컴퓨터에서만 사용되는 이름이니 아무것이나 입력해도 된다.

 

username을 입력하면 password를 입력하라는 메시지가 나타난다. 비밀번호는 반드시 메모를 해둬야 한다. 비밀번호를 잊어버리면 리눅스를 다시 설치해야 하는 불상사가 생긴다. 비밀번호를 타이핑해도 입력 커서가 움직이지 않는다. ***로 입력되지도 않는다. 그래도 정상적으로 입력되는 것이니 오타 내지 않도록 잘 입력한다. 비밀번호를 확인하기 위해 한 번 더 입력하는 절차가 있다.

 

 

전체 패키지를 upgrade 하고 update 하기 위해 다음의 코드를 하나씩 실행한다. 

sudo apt-get upgrade
sudo atp-get update

 

첫 번째 줄을 실행하면 비밀번호를 입력하라는 메시지가 나타난다. 위에서 입력한 비밀번호를 입력하고 엔터키를 누르면 된다. 그 이유는 리눅스의 "sudo" 명령어가 윈도우의 "관리자 권한으로 실행"과 유사한 개념으로 "Super User DO"를 의미한다. 관리자 권한으로 뭔가를 하려고 하니 관리자 비밀번호를 입력하라는 것이다.

 

upgrade와 update는 생각보다 시간이 꽤 걸린다. 둘 다 합쳐서 10분 정도 걸린 것으로 기억난다. 

 

 

 

 

다음 단계는 파이썬 패키지 인스톨러인 pip 설치를 위해 다음의 코드를 실행한다.

sudo apt-get install python3-pip

 

pip는 package installer for python을 의미한다. 파이썬으로 작성된 패키지를 다운로드, 설치, 관리하기 위한 것이다.[1] 

pip3는 python3 버전으로 설치하는 것이고, 그냥 pip는 python2 버전으로 설치하는 것이다.[2] pip 설치 중 오류가 발생하면 위에서 실시한 update를 될 때까지 계속해봐야 한다.

 

 

 

pip가 정상적으로 설치되었는지 확인하기 위해 다음의 코드를 실행한다.

pip3 --version

실행 결과 위 그림과 같이 조회되면 제대로 설치된 것이다.

 

 

 

 

파이썬을 학습하며 남기는 블로그입니다.

질문, 지적, 조언은 항상 환영합니다.

 

참고자료

[1] https://ko.wikipedia.org/wiki/Pip_(%ED%8C%A8%ED%82%A4%EC%A7%80_%EA%B4%80%EB%A6%AC%EC%9E%90), https://pip.pypa.io/en/stable/

[2] https://kaen2891.tistory.com/27

 

 

2020.04.06.

코리

 

 

 

 

 

 

Khaiii(Kakao Hangul Analyzer Ⅲ)는 카카오가 개발한 세번째 형태소 분석기이다.

 

공식자료는 깃헙에서 찾아볼 수 있다.(github.com/kakao/khaiii)

 

Khaiii는 C++14로 개발했기 때문에 이를 지원하는 컴파일러가 필요하다.

   - CentOS 7.4 : gcc-5.3.1 (devtoolset-4)

   - Ubuntu 16.04 : gcc-5.4.0

   - MacOS Mojave : LLVM-11.0.0

   - 공식적으로Window는 지원하지 않음

 

 

윈도우를 지원하지 않으므로, jupyter notebook에서 "!pip install khaiii" 라고 해도 실행되지 않는다.

 

윈도우에서 Khaiii를 설치하기 위한 첫번째 이야기는,

윈도우에 리눅스(Linux)의 일종인 우분투(ubuntu)를 설치하는 것이다.

 

 

 

 

 

▲  위는 동영상 

  아래는 글

 

 

 

 

우선 "제어판-windows 기능 켜기"에서 리눅스 기능을 켜주어야 한다.

체크되어 있지 않으면, 체크를 한다. 이 경우 컴퓨터 재시작이 필요하다.

 

 

 

MS Store에서 Linux를 검색한 후 왼쪽에 있는 ubuntu를 클릭하여 설치한다.

 

 

자, 이제 윈도우에서 카이를 설치하기 위한 첫 단계가 끝났다. 

 

다음 이야기는 방금 설치한 리눅스(ubuntu) 셋팅에 대한 이야기 이다. - 보러가기

 

 

파이썬을 학습하며 남기는 블로그입니다.

질문, 지적, 조언은 항상 환영합니다.

 

 

2020.04.06.

코리

 

 

 

 

아... 쉽지 않다.

 

파이썬도 힘든데, Khaiii를 사용하기 위해서 리눅스를 해야 한다니...

여차 저차 해서 윈도우에서 우분투도 깔고, 우분투에서 Khaiii도 설치했다.

 

Khaiii 테스트까지 잘했는데, 본격적으로 해보려고 했는데, 윈도우10의 파일을 우분투로 어떻게 옮기는지에서 막혔다.

윈도우 탐색기에서 파일을 복사해서 우분투 파일에 옮긴 후 jupyter notebook에서 파일을 열려고 하니 permission error(권한 문제)가 발생했다. 

 

 

csv로 바꿔서도 시도해봤고, "pd.read_excel('./data/Q3_sample.xlsx', engine='xlrd')" 이런 방법도 사용해봤는데 모두 권한 문제에서 자유롭지 못했다. 

 

원도우 탐색기를 이용해서 파일을 우분투 폴더로 옮기면 권한 문제가 생긴다는 것을 알게 되었다.

 

또다시 끝을 모를 검색이 시작되었다. 시도했다가 실패한 방법은 다음과 같다.

1. WinSCP 설치

  - 윈도우10에 WinSCP를 설치하고 우분투의 IP를 이용해서 접근하는 우분투로 접근한 후 파일을 전송하는 방법인데, 우분투 쪽에 방화벽 등과 관련된 설정이 필요한데, 잘 안돼서 실패했다.

 

2. 우분투에 크롬 설치 후 구글 드라이브로 직접 접근

  - 크롬은 성공적으로 설치했으나 터미널에서 크롬창 띄우는 것을 실패해서 포기했다.

# 크롬 드라이버 다운로드
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb

sudo dpkg -i google-chrome-stable_current_amd64.deb
# 이렇게 하면 오류 발생
# error processing package google-chrome-stable (--install):
# dependency problems - leaving unconfigured

sudo apt-get install libappindicator1
# 다른 오류 발생
# E: Unmet dependencies. Try 'apt --fix-broken install' with no packages (or specify a solution).

sudo apt-get -f install
# 우분투가 깡통이라 그런지 어마무시하게 설치함
# 0 upgraded, 158 newly installed, 0 to remove and 2 not upgraded.

sudo dpkg -i google-chrome-stable_current_amd64.deb
# 이제 됨

google-chrome
# 드디어!! 우분투에서 크롬을 띄울 수 있는것인가!!

# 에러발생... 그래 이렇게 쉬울리 없어...
# (google-chrome:3809): Gtk-WARNING **: 00:51:33.827: cannot open display:

xhost +si:localuser:root
xhost +si:localuser:userid
xhost +
# xhost:  unable to open display ""
# 모두 같은 에러 발생

# 안해 안해!!!!

 

3.  wget 으로 구글 드라이브 직접 접근

  - 이건 제일 처음 시도했었는데 실패해서 다른 방법들 해보다가 다시 wget으로 돌아옴

# wget 시도
wget https://drive.google.com/open?id=1dhNvuN이하생략

# 오오오! 다운로드 받았데!!
2020-01-06 00:06:54 (1021 KB/s) - ‘open?id=1dhNvuN_oBiqeWJU_pQxqHojz77kCkGnc’ saved [184119]

# 근데 다운로드된 파일이름이 왜 이따구야. 난 엑셀파일을 받으라고 했다고.
ls
'open?id=1dhNvuN이하생략'

# 안해. 안해!!

 

- 그런데, 돌고 돌아 다른 방법을 찾았다.

# 100MB 이하 파일을 구글 드라이브에서 우분투로 다운로드하는 새로운 방법
wget --no-check-certificate 'https://docs.google.com/uc?export=download&id=공유ID' -O FILENAME

# 공유ID입력하고
# 마지막 FILENAME 자리에 우분투에 저장하고 싶은 파일 이름 입력

# 100BM 이상 파일인 경우(실제로 해보지는 않음)
wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=FILEID' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=FILEID" -O FILENAME && rm -rf /tmp/cookies.txt

 

 

 

 

야호! 드디어 성공이다.

고마워 Anjan 형! 

출처 : https://medium.com/@acpanjan/download-google-drive-files-using-wget-3c2c025a8b99?

 

2020.01.06. 코리

 

 

 

 

 

jupyter notebook DLL load failed 지정된 프로시저를 찾을 수 없습니다

 

 

파이썬을 3.6에서 3.7로 업그레이드하는 과정에서 seaborn import error가 발생하여 오랜 시간 동안 고생했다. 수많은 검색을 통해 아나콘다를 지우고 재설치하고를 반복하며 헤맸는데, 에러 메시지에 답이 있었다. 

 

아나콘다 재설치를 통해 파이썬 업그레이드(3.6 -> 3.7)를 시도했다. 모든 것이 잘 흘러갔지만, seaborn을 import하는 단계에서 import error를 마주하게 되었다. 에러 메시지는 항상 설렌다.

 

 

 

 

 

위와 같은 오류 메시지는 사라져서 다른 패키지(numpy, matplotlib 등)들과 seaborn을 함께 import해서 오류난 메지지가 아래와 같다.

ImportError                               Traceback (most recent call last)
<ipython-input-2-d2e7a3f2c9b4> in <module>
      2 import numpy as np
      3 import matplotlib.pyplot as plt
----> 4 import seaborn as sns
      5 get_ipython().run_line_magic('matplotlib', 'inline')

~\Anaconda3\lib\site-packages\seaborn\__init__.py in <module>
      4 
      5 # Import seaborn objects
----> 6 from .rcmod import *
      7 from .utils import *
      8 from .palettes import *

~\Anaconda3\lib\site-packages\seaborn\rcmod.py in <module>
      3 import functools
      4 import matplotlib as mpl
----> 5 from . import palettes, _orig_rc_params
      6 
      7 

~\Anaconda3\lib\site-packages\seaborn\palettes.py in <module>
     10 from .external.six.moves import range
     11 
---> 12 from .utils import desaturate, set_hls_values, get_color_cycle
     13 from .colors import xkcd_rgb, crayons
     14 

~\Anaconda3\lib\site-packages\seaborn\utils.py in <module>
      5 
      6 import numpy as np
----> 7 from scipy import stats
      8 import pandas as pd
      9 import matplotlib as mpl

~\Anaconda3\lib\site-packages\scipy\stats\__init__.py in <module>
    377 from __future__ import division, print_function, absolute_import
    378 
--> 379 from .stats import *
    380 from .distributions import *
    381 from .morestats import *

~\Anaconda3\lib\site-packages\scipy\stats\stats.py in <module>
    180 import scipy.special as special
    181 from scipy import linalg
--> 182 from . import distributions
    183 from . import mstats_basic
    184 from ._stats_mstats_common import (_find_repeats, linregress, theilslopes,

~\Anaconda3\lib\site-packages\scipy\stats\distributions.py in <module>
      8 from __future__ import division, print_function, absolute_import
      9 
---> 10 from ._distn_infrastructure import (entropy, rv_discrete, rv_continuous,
     11                                     rv_frozen)
     12 

~\Anaconda3\lib\site-packages\scipy\stats\_distn_infrastructure.py in <module>
     22 
     23 # for root finding for discrete distribution ppf, and max likelihood estimation
---> 24 from scipy import optimize
     25 
     26 # for functions of continuous distributions (e.g. moments, entropy, cdf)

~\Anaconda3\lib\site-packages\scipy\optimize\__init__.py in <module>
    389 
    390 from .optimize import *
--> 391 from ._minimize import *
    392 from ._root import *
    393 from ._root_scalar import *

~\Anaconda3\lib\site-packages\scipy\optimize\_minimize.py in <module>
     28 from ._trustregion_krylov import _minimize_trust_krylov
     29 from ._trustregion_exact import _minimize_trustregion_exact
---> 30 from ._trustregion_constr import _minimize_trustregion_constr
     31 
     32 # constrained minimization

~\Anaconda3\lib\site-packages\scipy\optimize\_trustregion_constr\__init__.py in <module>
      2 
      3 
----> 4 from .minimize_trustregion_constr import _minimize_trustregion_constr
      5 
      6 __all__ = ['_minimize_trustregion_constr']

~\Anaconda3\lib\site-packages\scipy\optimize\_trustregion_constr\minimize_trustregion_constr.py in <module>
      2 import time
      3 import numpy as np
----> 4 from scipy.sparse.linalg import LinearOperator
      5 from .._differentiable_functions import VectorFunction
      6 from .._constraints import (

~\Anaconda3\lib\site-packages\scipy\sparse\linalg\__init__.py in <module>
    114 from .dsolve import *
    115 from .interface import *
--> 116 from .eigen import *
    117 from .matfuncs import *
    118 from ._onenormest import *

~\Anaconda3\lib\site-packages\scipy\sparse\linalg\eigen\__init__.py in <module>
      9 from __future__ import division, print_function, absolute_import
     10 
---> 11 from .arpack import *
     12 from .lobpcg import *
     13 

~\Anaconda3\lib\site-packages\scipy\sparse\linalg\eigen\arpack\__init__.py in <module>
     20 from __future__ import division, print_function, absolute_import
     21 
---> 22 from .arpack import *

~\Anaconda3\lib\site-packages\scipy\sparse\linalg\eigen\arpack\arpack.py in <module>
     43 __all__ = ['eigs', 'eigsh', 'svds', 'ArpackError', 'ArpackNoConvergence']
     44 
---> 45 from . import _arpack
     46 import numpy as np
     47 import warnings

ImportError: DLL load failed: 지정된 프로시저를 찾을 수 없습니다.

 

구글과 stack overflow에 많은 검색을 해서 다음과 같은 솔루션을 발견했지만 모두 실패했다.

- 아나콘다 삭제 후 재설치

- 아나콘다 재설치 시 관리자 권한으로 실행

- 커맨드 창에서 seaborn 삭제 및 재설치 (conda로 하기, pip으로 하기)

- 환경변수에 path 추가하기

- 아나콘다 홈페이지에서 seaborn 검색해서 DLL 파일 다운로드 받아  내 컴에 복사하기

- 등등등

 

 

위 많은 방법들이 모두 실패했다.

 

한 가지 재미있는 이상한 현상은 내가 원하는 폴더에서 jupyter notebook을 실행하면 seaborn import error가 발생하는데, "시작 - Anaconda3 - Jupyter Notebook(Anaconda3)"를 관리자 권한으로 실행하면 seaborn import error가 나타나지 않았다. 그래서 권한 쪽 문제라고 생각하고 시간을 낭비했다.

 

 

해결방법은 numpy, scipy 삭제 후 재설치였다.

사실 위 import error 메시지를 잘 살펴보면 scipy에 뭔가 문제가 있음이 나타난다. 에러 메시지가 무슨 말인지 잘 모르겠지만 유난히 scipy 관련 내용이 많다.

 

---> 7 from scipy import stats
---> 24 from scipy import optimize
---> 4 from scipy.sparse.linalg import LinearOperator


scipy 재설치를 권장하는 솔루션을 제시한 사람이 numpy도 함께 해줄 것을 권장했다.

cmd 창에서 다음의 방법으로 numpy와 scipy를 삭제 및 재설치할 수 있다.

 

 

conda remove --force numpy, scipy
pip install numpy
pip install scipy

 

삭제할 때 --force 옵션의 역할은 다음과 같다. "Forces removal of a package without removing packages that depend on it. Using this option will usually leave your environment in a broken and inconsistent state"

 

-출처 : https://stackoverflow.com/questions/38459186/conda-uninstall-one-package-and-one-package-only

 

 

 

 

numpy와 scipy를 삭제하고 다시 설치 후 두근거리는 마음으로 seaborn을 import 해보았다.

 

 

성공했다. 고생했어. 토닥토닥. 

2020.01.05. 코리.

 

 

 

참고한 사이트

- https://stackoverflow.com/questions/54083514/how-to-fix-importerror-dll-load-failed-the-specified-procedure-could-not-be-f

- https://stackoverflow.com/questions/54957065/importerror-dll-load-failed-import-seaborn-failed-only-works-with-conda-ro

- https://stackoverflow.com/questions/55641510/seaborn-import-as-sns-importerror-dll-load-failed-the-specified-module-coul

- https://community.powerbi.com/t5/Desktop/Error-with-SEABORN/td-p/690652

 

 

 

 

파이썬에서 기본으로 사용되는 할당연사자(Assignment Operators)는 등호(=)이다. 등호는 등호 오른쪽의 값을 왼쪽으로 할당한다.

 

파이썬에는 등호를 응용한 다양한 할당연사자가 존재한다. 그 종류는 다음과 같다.

 

 할당연산자

기능 

 =

 왼쪽 변수에 오른쪽 값을 할당한다.

a = b 는

a = b 를 의미함

 +=

 왼쪽 변수에 오른쪽 값을 더하고 그 결과를 왼쪽 변수에 할당한다.

a += b

a = a+b 를 의미함

 -=

 왼쪽 변수에 오른쪽 값을 빼고 그 결과를 왼쪽 변수에 할당한다.

a -= b 는

a = a-b 를 의미함

 *=

 왼쪽 변수에 오른쪽 값을 곱하고 그 결과를 왼쪽 변수에 할당한다.

a *= b 는

a = a*b 를 의미함

 /=

 왼쪽 변수에 오른쪽 값을 나누고 그 결과를 왼쪽 변수에 할당한다.

a /= b는

a = a/b 를 의미함

 %=

 왼쪽 변수에 오른쪽 값을 나눈 후 그 나머지를 왼쪽 변수에 할당한다.

a %= b 는

a = a%b 를 의미함

 //=

 왼쪽 변수에 오른쪽 값을 나눈 후 그 몫을 왼쪽 변수에 할당한다.

a //= b 는

a = a//b 를 의미함

 **=

 왼쪽 변수에 오른쪽 값을 제곱하고 그 결과를 왼쪽 변수에 할당한다.

a **= b 는

a = a**b 를 의미함

 

 

위 할당 연산자들을 실행해보면 다음과 같은 결과를 얻을 수 있다.

 

 

1. =

>>> a = 5

>>> b = 3 

>>> print(a, b)

(5, 3) ## a에 5가, b에 3이 할당됨

 

 

2. +=

>>> a, b = 5, 3 

>>> a += b ## a = a+b

>>> print(a, b) 

(8, 3) ## a(5)에 b(3)을 더한 값을 a에 할당하므로, a가 8로 변경됨

 

3. -=

>>> a, b = 5, 3 

>>> a -= b ## a = a-b

>>> print(a, b) 

(2, 3) ## a(5)에 b(3)을 뺀 값을 a에 할당하므로, a가 2로 변경됨

 

 

4. *=

>>> a, b = 5, 3 

>>> a *= b ## a = a*b

>>> print(a, b) 

(15, 3) ## a(5)에 b(3)을 곱한 값을 a에 할당하므로, a가 15로 변경됨

 

5. /=

>>> a, b = 5, 3 

>>> a /= b ## a = a/b

>>> print(a, b) 

(1, 3) ## a(5)에 b(3)을 나눈 값을 a에 할당하므로, a가 1로 변경됨

       ## a와 b의 자료형(type)이 정수(int)이므로, 나눈 5/3의 결과가 정수인 1로 나타난다.

 

>>> type(a)

int

 

>>> type(b)

int

 

>>> a, b = 5.0, 3.0 ## a와 b의 자료형을 실수(float)로 입력 

>>> a /= b ## a = a/b

>>> print(a, b) 

(1.6666666666666667, 3.0) ## 데이터가 실수로 입력되니 소수점까지 표현됨

 

>>> type(a)

float

 

>>> type(b)

float

 

 

6. %=

>>> a, b = 5.0, 3.0 ## a와 b의 자료형을 실수(float)로 입력 

>>> a %= b ## a = a%b (나머지 구하기)

>>> print(a, b) 

 

(2.0, 3.0)

 

 

7. //=

>>> a, b = 5.0, 3.0 ## a와 b의 자료형을 실수(float)로 입력 

>>> a //= b ## a = a//b (몫 구하기)

>>> print(a, b) 

 

(1.0, 3.0)

 

 

8. **=

>>> a, b = 5, 3  

>>> a **= b ## a = a**b (5의 3제곱)

>>> print(a, b) 

 

(125, 3)

 

 

 

2018.09.11. 코리.

 

 






파이썬에서는 숫자나 문자를 담을 수 있는 자료구조가 4가지가 있다. 바로 리스트(list), 튜플(tuple), 사전(dictionary), 집합(set)이다.



1. 리스트(list)

   - 값을 순서대로 저장하는 구조이다.

   - 생성 후 수정과 삭제가 자유롭다.


2. 튜플(tuple)

   - 리스트와 같이 값을 순서대로 저장하는 자료구조이지만, 수정과 삭제를 할 수 없다.

   - 수정이 필요없거너 수정해서는 안되는 자료를 담기에 적합하다. (예 : 위치정보 좌표 등)


3. 사전(dictionary)

   - Key와 그에 대응하는 Value를 짝지어 놓은 자료 구조이다.

   - 사전에서 "사과"를 찾으면 "apple"이 나오는 방식이다.


4. 집합(set)

   - 수학에서 사용하는 집합과 같은 개념이다.

   - 자료 구조 중에서 유일하게 값들을 모아둘 수 있는 구조이다.

   - 반복값을 허용하지 않으며, 순서 또한 보존하지 않는다.




이제 각 자료구조에 대해 자세히 알아보자



리스트(list)


1. 만드는법

대괄호로 만들기

>>> a = [1,2,3]

>>> print(a)

[1, 2, 3]


list 함수로 만들기

>>> b = list('abc')

>>> print(b)

['a', 'b', 'c']



2. 리스트 인덱싱(indexing)과 슬라이싱(slicing)

   : 인덱싱과 슬라이싱은 앞서 살펴본 포스팅에서 확인할 수 있다("파이썬 - 자료형" 보러가기)

슬라이싱에 간격을 적용할 수 있다 [시작인덱스 : 끝인덱스 : 간격]

>>> c = [1,2,3,4,5,6,7]

>>> c[::2] ##처음부터 끝까지 2간격으로 선택

[1, 3, 5, 7]


>>> c[1:6:3]  ##1번 값부터 6번값 사이에 3간격으로 선택

[2, 5]



3. 리스트 길이 확인

len 함수를 활용하여 리스트 안에 몇 개의 값이 있는지 확인 할 수 있음

>>> c = [1,2,3,4,5,6,7]

>>> len(c)

7



4. 리스트 수정, 정렬, 확인하기

데이터 추가하기


>>> 과일 = ['사과', '배', '포도', '복숭아', '귤']

>>> 과일.append('딸기')

>>> print(과일)

['사과', '배', '포도', '복숭아', '귤', '딸기']  ## 가장 끝에 "딸기"가 추가됨


★원하는 위치에 데이터 추가하기


>>> 과일.insert(1, '참외')

['사과', '참외', '배', '포도', '복숭아', '귤', '딸기']  ## 1번째 위치(사과 다음)에 "참외"가 추가됨


데이터 삭제하기


>>> 과일 = ['사과', '참외', '배', '포도', '복숭아', '귤', '배', '딸기']

>>> 과일.pop(5)  ## pop은 지정된 값을 호출하고 삭제함, 

                        ## 값을 지정하지 않으면 (-1)로 자동 지정되어 가장 마지막 값을 호출하고 삭제함

'귤'

>>> print(과일)

['사과', '참외', '배', '포도', '복숭아', '배', '딸기'] ## '귤'이 삭제 됨


>>> 과일.remove('배') ## remove는 가장 앞에 있는 값을 삭제함

>>> print(과일)

['사과', '참외', '포도', '복숭아', '귤', '배'] ## 2개의 '배' 중 가장 앞에 있는 것이 삭제됨


데이터 삭제하기


>>> 과일 = ['사과', '참외', '배', '포도', '복숭아', '귤', '배', '딸기']

>>> del 과일[1:3]  ## 인덱싱과 슬라이싱으로 원하는 데이터 삭제

>>> print(과일)

['사과', '포도', '복숭아', '귤', '배', '딸기']


데이터 찾아서 바꾸기


>>> 과일 = ['사과', '참외', '배', '포도', '복숭아', '귤', '배', '딸기']

>>> 과일.index('포도')  ## 포도의 위치정보를 인덱싱으로 확인

3


>>> 과일[3] = '수박'  ## 포도의 위치정보에 수박을 입력

>>> print(과일)

['사과', '참외', '배', '수박', '복숭아', '귤', '배', '딸기']


데이터 정렬하기


>>> 과일 = ['사과', '참외', '배', '포도', '복숭아', '귤', '배', '딸기']

>>> 과일.reverse()  ## 리스트의 순서를 뒤집기

['딸기', '배', '귤', '복숭아', '포도', '배', '참외', '사과']


>>> 과일.sort()  ## 리스트를 순서대로 정렬

>>> print(과일)

['귤', '딸기', '배', '배', '복숭아', '사과', '참외', '포도']


데이터 정렬하기


>>> 과일 = ['사과', '참외', '배', '포도', '복숭아', '귤', '배', '딸기']

>>> 과일.count('배')  ## 리스트 내 값의 갯수를 확인

2


데이터 합치기


>>> 과일1 = ['사과', '참외', '배', '포도']

>>> 과일2 = ['복숭아', '귤', '배', '딸기']

>>> 과일  = 과일1 + 과일2

>>> print(과일)

['사과', '참외', '배', '포도', '복숭아', '귤', '배', '딸기']


데이터 반복하기


>>> 과일1 = ['사과', '참외', '배', '포도']

>>> 과일2 = 과일1 * 2

>>> print(과일2)

['사과', '참외', '배', '포도', '사과', '참외', '배', '포도']




튜플(tuple)


1. 만드는법

★괄호 없이 만들면 튜플이 된다.


>>> a = 1, 2, 3

>>> print(a)

(1, 2, 3)



둥근괄호로 감싸서 만든다.


>>> b = (4, 5, 6)

>>> print(b)

(4, 5, 6)



★tuple 함수에 다른 값을 넣어 튜플로 만든다.


>>> c = (7, 8, 9)

>>> c = tuple(c)

>>> print(c)

(7, 8, 9)


>>> c = [7, 8, 9]  ## 리스트를 튜플로 바꿀 수 있다.

>>> c = tuple(c)

>>> print(c)

(7, 8, 9)




2. 튜플의 인덱싱(indexing), 슬라이싱(slicing), 합치기, 반복 등은 리스트와 동일



3. 수정하기

★튜플은 수정이 불가능하다는 특징이 있음


>>> b = (4, 5, 6)

>>> b[1] = 100

TypeError                                 Traceback (most recent call last)

<ipython-input-119-c3babf5fb9d5> in <module>()

      1 b = (4, 5, 6)

----> 2 b[1] = 100

TypeError: 'tuple' object does not support item assignment ## 튜플을 수정하려고 하자 오류가 발생했다.



★튜플을 리스트로 변환하면 데이터 수정이 가능함


>>> b = (4, 5, 6)

>>> b = list(b)  ## 튜플을 리스트로 변경

>>> print(b)

[4, 5, 6]


>>> b[1] = 100  ## 값 수정

>>> print(b)

[4, 100, 6]


>>> b = tuple(b)  ## 리스트를 다시 튜플로 수정

>>> print(b)

(4, 100, 6)  ## 5가 100으로 수정된 튜플




사전(dictionary)


1. 만드는법

★중괄호를 활용하여 키(key)와 값(value)를 콜론(:)으로 짝지어서 만든다.


>>> 과일 = {'사과' : 'apple', '배' : 'pear', '포도' : 'grape'}

>>> print(과일)

{'사과' : 'apple', '배' : 'pear', '포도' : 'grape'}



★dict 함수로 만든다.


>>> 과일 = dict(사과 = 'apple', 배 = 'pear', 포도 = 'grape')  ## 키(key) 값에는 따옴표가 없다.

>>> print(과일)

{'사과' : 'apple', '배' : 'pear', '포도' : 'grape'}



2. 기본 개념

★사전 자료를 키(key)로 인덱싱하면 값(value)을 받을 수 있다.


>>> 과일['포도']

'grape'



★키(key)가 중복되면, 나중에 나온 값(value)이 저장된다.  ## 키(key)는 중복 없이 유니크 해야 한다.


>>> 과일 = {'사과' : 'apple', '배' : 'pear', '포도' : 'grape', '사과' : 'green apple'}  ## '사과' 키(key)가 중복됨

>>> print(과일)

{'사과': 'green apple', '배': 'pear', '포도': 'grape'}



★키(key)에는 숫자, 문자, 튜플 등 불변(immutable)인 값들만 넣을 수 있다. 리스트와 같이 가변적인(mutable) 값은 키(key)로 사용할 수 없다.



3. 자료 확인

★키(key) 확인하기


>>> 과일.keys()

dict_keys(['사과', '배', '포도'])



★값(value) 확인하기


>>> 과일.values()

dict_values(['apple', 'pear', 'grape'])



★키(key)와 값(value) 짝지어 확인하기


>>> 과일.items()

dict_items([('사과', 'apple'), ('배', 'pear'), ('포도', 'grape')])  ## 리스트로 관리되고 있다.



★키(key)의 존재 확인


>>> 과일.get('복숭아', '없는 key 입니다.')  ## 있는 key를 찾으면 해당 value를 출력한다.

                                                       ## 없는 key를 찾으면 지정된 값을 출력한다. 

                                                       ## 지정된 값이 없으면 아무것도 출력하지 않는다.

'없는 key 입니다.'



★키(key)의 존재 확인


>>> '복숭아' in 과일

False



4. 자료 수정

★키(key)를 삭제할 수 있다.


>>> 과일 = {'사과' : 'apple', '배' : 'pear', '포도' : 'grape'}

>>> del 과일['배']  

>>> print(과일)

{'사과' : 'apple', '포도' : 'grape'}  ## 키(key)를 지우면 값(value)도 함께 삭제됨



★사전을 전부 지울 수 있다.


>>> 과일.clear()

>>> print(과일)

{ }



★키(key)와 값(value)을 추가할 수 있다.


>>> 과일 = {'사과' : 'apple', '배' : 'pear', '포도' : 'grape'}

>>> 과일['복숭아'] = 'peach'

>>> print(과일)

{'사과': 'apple', '배': 'pear', '포도': 'grape', '복숭아': 'peach'}



★"+"를 이용한 결합은 안되지만, update를 할 수 있다.


>>> 과일1 = {'사과': 'apple', '배': 'pear'}

>>> 과일2 = {'딸기' : 'strawberry', '바나나' : 'banana'}

>>> 과일1.update(과일2)

>>> print(과일)

{'사과': 'apple', '배': 'pear', '딸기': 'strawberry', '바나나': 'banana'}



★값(value)을 수정할 수 있다.


>>> 과일['포도'] = 'fresh grapes'  ## 리스트에서 인덱싱으로 값을 수정하는 것과 동일한 방법이다.

>>> 과일['포도']

'fresh grapes'




집합(set)


1. 만드는법

★중괄호로 감싸서 만든다. ## 사전과 동일하게 중괄호를 사용하지만, 키(key)와 값(value)의 짝이 없는 차이가 있다.


>>> a = { 1, 3, 2, 3, 1 }

>>> print(a)

{1, 2, 3}  ## 중복이 사라지고, 순서가 보존되지 않는다.



★set 함수로 만든다.


>>> b = (1, 3, 4, 2, 1, 1, 1)

>>> c = set(b)

>>> print(c)

{1, 2, 3, 4}


>>> 과일 = {'사과' : 'apple', '배' : 'pear', '포도' : 'grape'}

>>> d = set(과일)

>>> print(d)

{'배', '사과', '포도'}  ## 사전을 set하면 키(key)의 집합으로 변환된다.


>>> e =  set('hello')

>>> print(e)

{'e', 'l', 'h', 'o'}



2. 자료 수정 및 활용

★집합에 값 추가하기


>>> 과일 = {'배', '사과', '포도'}

>>> 과일.add('딸기')

>>> print(과일)

{'배', '딸기', '사과', '포도'}



★하나 이상의 값은 update로 추가


>>> 과일 = {'배', '사과', '포도'}

>>> 과일.update(['복숭아', '바나나', '수박']

>>> print(과일)

{'배', '복숭아', '사과', '포도', '수박', '바나나'}



★값 제거는 remove로 할 수 있다.


>>> 과일 = {'배', '사과', '포도'}

>>> 과일.remove('사과')

>>> print(과일)

{'배', '포도'}


★합집합 ( | 또는 union)  ## "|"는 "shift + \"를 누르면 나타난다. 


>>> num_1 = {1, 2, 3}

>>> num_2 = {3, 4, 5}

>>> print(num_1 | num_2)

>>> print(num_1.union(num_2))

{1, 2, 3, 4, 5}

{1, 2, 3, 4, 5}



★교집합 ( & 또는 intersection)


>>> num_1 = {1, 2, 3}

>>> num_2 = {3, 4, 5}

>>> print(num_1 & num_2)

>>> print(num_1.intersection(num_2))

{3}

{3}



★차집합 ( - 또는 difference)


>>> num_1 = {1, 2, 3}

>>> num_2 = {3, 4, 5}

>>> print(num_1 - num_2)

>>> print(num_1.difference(num_2))

{1, 2}

{1, 2}




2018.09.07. 코리.



+ Recent posts