원래 파이썬은 데이터 분석에 유용한 언어가 아니었다. 과거에는 통계를 위한 언어인 R언어가 파이썬보다 기반이 더 좋았고, 현재도 통계적 분야에는 R언어가 조금 더 유용하다고 한다.
파이썬이 데이터분석 툴로 활약하게 된건 앞서 설명한 pandas와 지금부터 알아볼 numpy(numerical python) 라이브러리가 나오고 나서 부터라고 해도 과언이 아니다. 파이썬은 해당 라이브러리들로 인해 통계적 분석 뿐 아니라 범용적으로 사용이 가능해지면서 더욱 인기가 높아졌다.
numpy는 무엇일까?
기존 파이썬 언어로 계산하기 복잡한 수치들을 계산하기 쉽도록 도와주는 라이브러리이다.
뿐만 아니라 list와 유사한 기능을 하는 numpy array를 사용하여 table을 다루는 것을 더 용이하게 해준다.
numpy array
파이썬의 기본 자료형인 list와 다르게 numpy array는 사칙연산을 할 수 있도록 구성되었다.
또한 indexing과 slicing을 사용할 수 있어 데이터를 다루는데 매우 적합하다.
기본적인 형태는 list와 유사한 형태로 작성할 수 있다.
numpy array
또 full, arange, random 등의 메서드를 활용해서 좀 더 쉽게 array를 구성할 수 있다.
array 구성의 다양한 메서드
계속해서 언급했던 사칙연산은 어떻게 적용되고 있는지 한번 알아보도록 하자.
우선 list에 곱연산을 적용해서 list 원소 값이 변화하는지 살펴보면,
list 연산
우리가 기대했던 것과는 다르게 출력이 된다. 그럼 numpy array에는 어떻게 출력이 될까?
array 연산array끼리 연산 또한 가능하다
우리가 기대했던 원소 값의 변화가 발생하였다.
이러한 것들은 단순히 편하다는 것을 넘어서서 코드를 완성한 후 직관성을 올려주고 코딩을 잘 하지못하는 사람들에게도 이해하기 쉽도록 도와주는 역할을 한다.
또 편리한 기능으로 indexing과 slicing을 넘어 filtering도 가능하게 해주는데, 이는 where함수를 사용해서 구현할 수 있다.
array filtering
where함수 안에 조건문을 넣어 boolean값을 받은 후 indexing을 통해 filtering을 한 것으로 filtering 된 값을 출력하는 것 이외에도 원하는 값만 변경해주는 필터링하는 등 다양하게 활용할 수 있다.
numpy는 list에 비해 연산속도가 빠르고, 같은 자료형만 한 배열 안에 담아 side-effect를 방지할 수 있으며, 문법적으로도 직관성이 뛰어나 사랑받고 있다.
pandas 역시 numpy를 바탕으로 해서 만들어져, numpy가 중요한 내용을 담고 있음을 알 수 있다.
사실 1번 문장은 위에서 설명한 것과 이미 같은 내용이다. scientist의 모든 데이터 값을 출력하되, Age의 값이 mean보다 높은 값의 데이터만 출력하겠다라는 의미이다.
drop은 내가 원하는 행열을 삭제시킬 수 있다. axis는 축의 방향으로 index와 column의 방향을 정해 지울 수 있다.
해당 코드는 작성한 DataFrame이나 수정한 csv파일을 저장하는 코드이다.
윗 줄과 밑 줄의 차이점은, 밑에 줄은 index를 지정해주지 않았다. 나머지는 같다.
데이터 병합 (Concatenate, Merge)
데이터들을 합치는 방법에는 여러가지가 있는데, 그 중 merge와 concat의 방식을 한번 배워보도록 할 것이다.
1. Concat
먼저 concat은 가장 단순하게 데이터를 병합하는 방법으로, concat함수를 선언해주면 된다.
연결해주고 싶은 방향에 따라 axis를 설정해주면 된다.
하지만 이렇게 단순하게 연결을 하게 되면 하나의 문제점이 생기는데,
어떤 문제점인지 알겠는가?
바로 index와 index번호가 수정되지 않고 그대로 연결하게 된다는 것이다.
이렇게 되면 iloc은 문제없이 작동될 수 있지만, loc의 경우에 문제가 생기는 것이다. 인덱스의 네이밍이 같기 때문에 작동은 될 지 언정, 내가 원하는 데이터 값을 뽑아내기는 힘들 수 있다.
따라서 우리는 다음 방법을 통해서 데이터 병합을 할 때 혼동을 줄이자.
이렇게 인덱스명을 수정해주면,
loc을 사용할 수 있는 형태로 출력이 가능하다.
만약 내가 병합을 하는데 각각 column의 name이 다 다르면 어떻게 병합이 될까?
각 위치에 데이터가 존재하면 데이터 값을 합쳐 병합을 했고, 그렇지 않은 부분은 NaN값으로 대체되어 출력이 되었다.
이걸로 concat 역시 outer join 방식임을 알 수 있다.
2. Merge
merge의 특징은 공통적인 데이터를 기준으로 합병이 진행된다는 것이다.
가령 이러한 데이터가 있다고 치자.
이 데이터를 병합을 하게되면 어떤 결과가 추출이 될까?
결과는
이렇게 나온다.
우리가 지정해준 df1과 df2의 데이터에서 'name' column의 내용은 서로 다른데 어떻게 NaN의 값이 없이 데이터가 출력될 수 있었을까?
또, df1과 df2의 raws는 5줄인데 data_merged의 raws는 7줄이 모두 값이 존재하게 출력 된걸까?
이건 inner join 방식의 결과이기 때문이다.
outer join의 결과는 모든 출력값을 데이터의 존재 유무와는 상관없이 출력하게 되지만, inner join은 같은 name끼리의 값을 합쳐서 출력을 하게 된다.
쉽게 풀어서 설명하자면 이런 그림으로 설명이 가능하다.
하나의 input 값에 각각 대응하는 ways의 수만큼 출력이 되는 것이다.
merge는 기본적으로 이러한 방법을 채택하고 있지만, 우리가 지정을 해줌으로써 다른 방법으로도 병합이 가능하다.
방법은 outer, left, right 방식이 있다.
outer은 우리가 알고 있는 그 방법이 맞고, left는 병합할 때 기준으로 왼쪽에 있는 데이터를 모두 출력해주고, right는 오른쪽에 있는 데이터를 모두 나타내준다.
<left, right의 예시>
또 left, right는 내가 출력하고 싶은 column을 따로 설정해줄 수 있는데 이건 예제를 통해서 알아보도록 하자.
예제에서 실행한 것은 site 와 visited의 merge이다.
내가 알고싶은 것은 site에 방문한 visited의 날짜라고 했을 때, 방문한 장소의 name을 기준으로 병합을 진행하기 위해서 left와 right의 기준을 name과 site로 정했다. visited의 site는 site의 name에 해당하는 값이므로 병합을 진행해보면,
다음과 같은 결과가 나오게된다.
2. 누락값(NaN, nan) 처리
우리는 위의 예제들을 통해서 누락값을 발생을 경험해 보았고 이러한 데이터가 어떻게 발생하는지 알게되었다.
지금부터는 이 누락값들을 채우고 처리하는 방법을 알아보도록 하자.
결측값 분석하기
isnull 메서드를 사용하면, 데이터에 존재하는 누락값의 수를 알아낼 수 있다.
해당 데이터는
사진에서 보이듯이 그냥 보기에도 데이터가 듬성듬성한게 nan 값이 참 많게 생겼다.
지금부터 nan 값을 세아려 볼 것이다.
오래간만에 보는 귀여운 값들이 톡 튀어나왔다.
결측값은 총 1214개이고, guinea column의 결측값은 29개이다.
Dropna method
isnull 이외에 dropna를 이용해서 결측값을 세아리는 방법도 있다.
value_count로 고유값의 개수를 세아려주고, dropna를 통해서 결측값의 개수도 세아려 준다.
원래 dropna의 본래 사용법은 결측값을 제거하는데 사용하는 것이다.
dropna매서드에 axis 값을 정해주면 원하는 방향으로 누락값 제거가 가능하다.
결측값 채우기
누락값 채우기를 할 때 사용하는 매서드는 fillna이다.
fillna를 사용해서 누락값을 채울 시에는 모든 값이 파라미터 값으로 바뀐다.
ex) df.fillna('A')이면 nan 값이 모두 A로 대체되게 된다.
혹은 ffill, bfill이라는 값을 사용해주게 되면, 각각 위의 값 복사, 아래의 값 복사를 해서 데이터를 채워넣는다.
2번째 출력값에서는 상위의 값이 존재하지 않기 때문에 NaN으로 출력이 된 것이다.
그리고 interpolate는 위아래의 평균값을 누락값에 채워넣어준다. 같은 이유로 NaN값이 출력된 것이다.
오늘 배울것은 셀레니움(selenium)라이브러리를 이용한 웹 정보수집 (Web crawling)을 해볼것이다.
사용할 library로는 selenium과 beautiful soup 이 있다.
둘에 대해 간략하게 설명하자면,
-selenium : 주로 웹앱을 테스트하는 프레임 워크다. 각 웹앱에 맞는 driver를 통해서 웹을 직접 조작하며 결과물을 불러올 수 있다.
-bs4(Beautiful Soup) : html 구조를 파이썬이 이해할 수 있도록 변환하는 parsing을 맡고 있는 라이브러리. 의미가 있는 결과물을 불러낼 때 사용한다.
이것들을 이용해 두번의 예제에 걸쳐서 학습해보도록 하자.
#에브리타임 게시판 글 가져오기.
우선 필요한 라이브러리들을 전부 호출해줬다 selenium과 bs4, csv는 앞서 설명을 진행하였다.
그렇다면 time sleep은 무엇일까?
쉬어가겠다는 의미이다. 그렇다면 우리는 왜 정보를 수집할 때 쉬어가야하는걸까?
우리가 인터넷 사이트에 직접적으로 접속할 때 일정시간이 소요된다. 하지만 셀레니움을 이용해 이에 접근할 때는 우리가 접속할 대 소모되는 시간을 무시하고 빠르게 진행이 된다. 이렇게 되면 웹 사이트에서 우리를 해킹툴로 인식해 차단할수도 있고, 웹에 과부하를 줄 수도있다. 그러므로 되도록이면 sleep을 사용해 쉬어들어가도록 하자.
csv파일을 사용하는데 wt+는 처음보는것 같..지만 사실은 알고있는 범위 내다.
w : 쓰기모드
t : 텍스트모드
+ : 업데이트를 위해 열기
세개를 조합해서 쓴 것이다. 우리는 웹에서 데이터를 따와서 csv파일에 저장할 것 이므로 이렇게 써줬다.
웹앱은 요즘 정말 많이 존재한다. (firefox, naverwhale, chrome, IE ...)
firefox 앱이 셀레니움에 최적화 되어있지만 우리는 보편적으로 깔려있는 chrome을 써서 웹을 수집할 것이므로 chromedriver를 이용해주도록하자.