데이터 분석 공부를 하게 되면

필수로 공부하게 되는 파이썬 라이브러리 코스 "Numpy → Pandas"

 

 

Numpy는 지난 번에 다음과 같이 살펴봤다.

- [파이썬 데이터 분석가 되기] 01 - NumPy

 

이번에 살펴볼 것은 "Pandas"

 

① 판다스 시작하기

② 데이터 내용 확인하기

③ 특정 열 선택하기

④ 데이터 필터링 하기

⑤ 결측치 처리하기

⑥ 데이터 통계 처리하기

⑦ 데이터프레임에 행/열 추가하거나 삭제하기

 

지난 포스팅에서도 말했지만 처음 공부하는 것은 아니기 때문에

기본적인 것들은 생략하고 기억하면 좋을 것들 중심으로 정리해보겠다.

 

책에서 언급하지 않는 내용들도 조금 더 포함했고,

설명 방법도 조금 다르게 정리한 내역도 있으니 참고하기 바란다.

 

실습은 local 환경에 mini-conda 설치해서

직접 Jupyter Notebook 띄워서 진행했다(당연히 Colab 환경과 별 차이는 없을 것이다).

 

 

 

① 판다스 시작하기

예전에는(예전이라고 해도 사실 그렇게 오래된 것은 아닐텐데, 요즘 AI 세상은 너무 빨리 변해서)

Numpy와 Pandas가 서로 상호보완적으로 많이 사용되었었던 것 같은데,

최근에는 사실 Pandas만으로도 대부분 처리할 수 있어서

굳이 Numpy 공부 후 Pandas를 공부할 필요 없이 바로 Pandas로 공부를 해도 괜찮은 것 같다.

다만, Pandas도 Numpy를 기반으로 한다고 할 수도 있기에... 뭐 같이 공부한다고 손해볼 것은 없다.

 

Pandas에서 제공하는 데이터 타입

- Series: 1차원 배열과 같은 형태. index와 value로 구성.

- DataFrame: 2차원 배열 형태. index와 column으로 구성. 하나의 column은 Series.

 

 

▷ List to Series

pd.Series() 함수에 List를 넣어주면 된다.

 

index와 value로 잘 생성된 것을 볼 수 있을 것이다.

value에 여러 형식의 데이터 타입이 포함되어 있기에 'object'로 분류 된다.

 

 

▷ Dict to DataFrame

pd.DataFrame()에 Dictionary 데이터를 넣어주면 된다.

 

 

print()로 출력을 하면 안예쁘게 나오는데,

Jupyter Notebook 환경인 점을 이용해서 그냥 해당 변수를 찍어주면 나름 예쁘게 내용을 살펴볼 수 있다.

 

 

 

▷ DataFrame to CSV File

Pandas DataFrame은 다양한 형태로 저장할 수도 있다.

일반적으로 많이 사용하는 CSV 파일로 저장을 하고 싶으면 .to_csv() 를 사용하면 된다.

 

 

"index=False" 파라미터를 주지 않으면 행 이름까지 저장하는 것을 막기 위한 코드이다.

왼쪽 파일 목록에 생성한 CSV 파일이 보일 것이다.

 

 

CSV File to DataFrame

반대로 CSV 파일을 읽어와서 DataFrame을 만드는 것은 어떻게 할 수 있을까?

정답은 ".read_csv()"

 

 

local에 있는 파일뿐만 아니라 웹에 있는 파일도 불러올 수 있다.

 

 

 

▷ DataType in Pandas

"int / float / object" 3종 밖에 없는 줄 알았는데, 의외로 다양한 데이터타입을 지원하고 있다.

하지만, 중요한 것은 결국 "object"

 

 

 

 

② 데이터 내용 확인하기

▷ columns

앞에서 생성한 내역을 이용해서 column 내용부터 확인해보자.

 

 

column은 기본적으로는 Index 형식이고, list 데이터 타입으로 변환해서 살펴볼 수도 있다.

 

 

▷ index

column과 마찬가지로 index에 대해서도 살펴보자.

 

 

여기에서 나오는 index는 실제 데이터 안에 포함된 정보가 아니라

일련번호로 설정되어 있다.

 

index 값을 명시적으로 정해주면 어떻게 될까?

 

 

내가 원하는 형태로 설정할 수가 있다.

 

임의로 정해준 값이 아니라, 명시적인 값이 있는 Index 형태의 데이터로 되었다는 것을 확인할 수 있다.

 

 

 

▷ loc[ ]

이렇게 정해진 index 값을 이용해서 특정 행을 지칭할 수도 있다.

앞서 살펴본 Numpy에서의 indexing / slicing 모두 적용 가능하다.

 

 

 

▷ head() / tail() / sample()

데이터의 일부 내용을 살펴보는 방법들을 알아보자.

 

데이터 앞부분의 내역을 살펴보는 것은 head()를 사용하면 된다.

 

 

기본적으로는 5개의 데이터를 보여주지만, 원하는 양만큼 보고 싶으면 파라미터로 전달하면 된다.

데이터의 뒷 부분을 살펴보는 것은 tail()을 살펴보면 된다.

 

 

임의의 데이터를 뽑아서 보여주는 것은 sample()이 있는데,

기본적으로 1개의 데이터를 보여주지만 원하는 양이 있으면 파라미터로 전달해주면 된다.

 

 

 

▷ shape

데이터의 전체 크기를 살펴보고 싶으면 shape을 찍어보면 된다.

정말 자주 사용하는 것인데, 함수 형태가 아님을 주의깊게 살펴보기 바란다.

 

 

▷ info()

DataFrame 데이터의 전체적인 내용을 살펴보고 싶으면 info()를 사용해보자.

 

 

정말 많은 정보를 깔끔하게 잘 보여주고 있다.

 

index 및 column 정보들을 상세하게 보여주고 있으며,

각 column의 Non-Null 정보, DataType 정보들을 모두 보여주고 있다.

심지어 차지하고 있는 메모리 크기까지도 알려준다.

 

모두 중요한 정보이지만, 가장 중요하게 살펴봐야 할 것은 Non-Null Count 부분이지 싶다.

결측치가 얼마나 있는지에 따라 후속으로 진행해야 할 일들이 정해지기 때문이다.

 

 

 

③ 특정 열 선택하기

▷ 단일 column = Series

DataFrame의 column 하나는 Series로 볼 수도 있다.

이것을 어떻게 추출할 수 있는지를 살펴보자.

 

 

"DataFrame['column_name']" 형식으로 column을 추출할 수 있다.

이렇게 추출했을 때, index 정보까지 같이 따라오는 것도 확인할 수 있다.

 

 

"DataFrame.column_name" 형식으로도 column을 추출할 수 있다.

 

 

▷ 복수 column = DataFrame

원하는 column의 조합으로 추출하고자 할 때에는

"DataFrame[['column1', 'column2', 'column#'] ]" 형식으로 수행할 수 있다.

 

 

여기에서 주의깊게 살펴봐야할 것은 "이중 대괄호"로 표기해야하는 것이다.

복수 column을 표기하려면 대괄호로 묶어서 넣어줘야 하는 것이다.

 

앞에서 하나의 column을 추출하면 Series라고 했는데,

1개 열로 구성된 DataFrame으로 추출할 수도 있다.

 

 

"DataFrame['column_name']" 형식으로 했을 때 Series로 추출되었음을 확인할 수 있다.

그런데, "DataFrame[['column_name']]" 형식으로 추출하면 DataFrame으로 추출할 수 있다.

 

 

이 부분은 잘 기억해둬야겠다.

 

 

▷ Boolean Indexing

특정 조건에 맞는 행을 선택하는 방법으로 'Boolean Indexing'이라는 방법이 있다.

 

 

이것을 활용해서 원하는 열들의 특정 조건에 맞는 행 데이터들을 추출하는 방법은 다음과 같다.

 

 

행의 조건을 앞에 정의하고 원하는 column을 뒤에 명시한다고 생각하면 될 것 같다.

 

 

 

④ 데이터 필터링 하기

여기부터는 정신 똑바로 차리고 잘 살펴봐야 한다. (빤짝!)

앞서 잠깐 살펴본 "Boolean Indexing"의 심화과정이라고 생각할 수 있을 것 같다.

 

 

DataFrame에 대해서 '비교 연산자'를 사용하면 전체 행에 대한 boolean 결과가 나온다.

이것을 DataFrame Column에 넣어주면 True 행만 추출이 되는 것이다.

 

 

 

▷ Operators

단순한 비교 연산자 외에 다른 연산자들을 더 알아보자.

 

먼저 살펴볼 것은 '부정 연산자(~, Not Operator)'이다.

 

 

다음 알아볼 것은 and(&) / or(|) 연산자를 알아보자.

 

 

조건문을 변수로 받을 수도 있다.

 

 

▷ loc[ ] / iloc[ ]

앞에서 "loc[ ]"에 대해서 간단히 맛을 봤다.

index를 명시적으로 지정해서 특정 행을 추출했었던 것인데, 이번에 좀 더 일반적인 사용법을 알아보겠다.

 

DataFrame.loc[ row, column ]

 

너무나 간단해보이지만, 정말 다양한 변형 활용이 가능하다.

 

DataFrame.loc[ :, [column1, column2] ]

DataFrame.loc[ [row1, row2], [column1, column2] ]

 

 

행 부분을 조금 더 알아보자.

 

 

index 값을 명시적으로 기재한 경우에는 잘 동작했으나,

slicing과 같은 방법으로는 제대로 실행이 되지 않는다.

 

 

index 숫자로 지정하고 싶은 경우에는 "iloc[]"를 사용하면 된다.

명칭 자체가 그렇다 ^^ "iloc(Integer Location)"

 

name을 사용하고 싶으면 loc[],

index를 사용하고 싶으면 iloc[]

 

 

▷ isin()

띄어쓰기가 생략된 문법이다 ^^

is in ()

 

 

isin() 함수 역시 결과가 Boolean 행렬로 나온다.

그렇기에 Boolean Indexing과 같은 방식으로 사용하면 된다.

 

여기에서 주의할 것은 파라미터로 넘길 때 하나의 요소만 사용하더라도

list 형태로(대괄호) 넘겨줘야 한다는 점이다 !!!

 

 

 

⑤ 결측치 처리하기

머신러닝, 데이터 분석 등을 할 때 가장 중요한 것 중 하나가 바로 결측치에 대한 관리다.

 

▷ NA, NaN, None

결측치라는 것은 값이 비었다는 것인데, 이것을 어떻게 표기할 것인지에 대한 문제가 있다.

Pandas에서는 "NA (Not Available)", "NaN (Not a Number)", "None" 두 가지 방식으로 표기하고 있다.

 

 

DataFrame 데이터 내역을 보다보면 "NaN"으로 되어있는 결측치를 볼 수 있다.

보다 일반적인 것은 Numpy의 "NaN" 개념이고, 실제로도 "np.nan"으로 지칭하는 것이 일반적이다.

 

NaN은 Numpy에서 사용하는 것이고, None은 Python 자체에서 사용하는 것이다.

NA 정도가 Pandas에 특화된 것인데, 나름의 추가적인 특성도 갖고 있다.

 

 

세가지 모두 NaN 처리가 되었지만, 조금 다른 특성들이 있긴 하다.

 

여러 상황을 고려하기 싫으면 np.nan을 사용하길 권장하고,

굳이 numpy 라이브러리를 import하기 싫을 때(pandas만 import 했을 때)에만 pd.NA를 사용하면 되지 않을까 한다.

 

 

이런 결측치 값을 어떻게 할 것인지에 대해서 다음의 4단계로 알아보자.

 

⒜ 확인하기

⒝ 대체하기

⒞ 제거하기

⒟ 추출하기/저장하기

 

 

⒜ 확인하기 - .isna() /  .isna().sum() / .info()

각 값의 NaN 여부를 확인해볼 수 있다.

 

 

사실 알고 싶은 것은 각 column의 결측치 개수가 궁금하기에 .sum() 함수까지 붙여주는 것이 더 일반적이다.

한눈에 확 들어온다!

 

 

사실 .info() 만으로도 충분히 알 수는 있다.

 

 

비율을 확인해볼 수도 있다.

 

 

⒝ 대체하기 - .fillna() / .replace()

nan 값을 정해준 값으로 fill 해주는 함수이다.

 

 

셀레나 쌤(저자)이 말한 것처럼 원본을 그대로 작업하는 것이 명확하고 좋다. 또한 메모리도 보다 효율적이다.

 

하지만, 이것 저것 테스트해보고 공부할 때에는 원본을 그대로 놔둔채로

장난감(?)을 하나 만들어서 마음껏 뜯고 맛보고 즐기고(^^),

필요하면 다시 또 원본에서 장난감을 만들고... 하는 방식이 편해서 나는 위와 같이 해봤다.

 

말이 길어질 수도 있어서... 책에서도 뒤에 언급할 것으로 예상되지만,

Python의 특성상 그냥 변수에 할당하면 원본과 연결 고리가 생기므로

.copy()로 확실하게 명시적으로 연결고리가 끊긴 복사본을 만들어서 변수 할당해줘야 한다.

 

이번에는 .replace()를 이용해서 결측치 값을 대체해보자.

 

 

 

앞의 .fillna()도 그렇고, .replace()도 그렇고 자기 자신의 값을 실제 변경하지는 않는다.

변경한 결과값을 되돌려 줄 뿐이다.

그렇기에 앞에 원본에 그 결과를 반영하라고 변수 할당해줘야 변경한 값을 저장한다.

 

 

⒞ 제거하기 - .dropna(axis=#)

일단 현재까지 진행된 데이터프레임 데이터들의 상황을 확인해보자.

 

 

앞서 결측치의 값 대체를 통해서 대부분 처리를 했고, 하나의 column이 남아있다.

 

 

꼭 하나의 column에 대해서만 적용되는 것은 아니고,

결측치가 있는 column을 삭제해버리고 싶을 때 사용하는 것이 바로 .dropna(axis=1) 이다.

 

 

파라미터로 있는 axis=1 부분을 보면 알겠지만, column이 아닌 row에 대해서도 적용할 수 있다.

 

 

결측치 값이 하나라도 있는 row에 대해서는 모두 삭제를 해버렸기 때문에, 하나의 row만 남았다.

그러면, 내가 지정한 column을 기준으로만 결측치 row를 삭제하고 싶으면 어떻게 해야할까?

 

 

subset 파라미터로 column 목록을 지정해주면 된다.

 

※ inplace=True

앞에서 잠깐 언급했는데, pandas의 상당히 많은 함수들의 경우에 원본 값을 직접 수정하지 않는다.

그래서 지금까지처럼 함수 실행 결과를 변수에 할당하도록 작성을 했다.

하지만, pandas에서는 그냥 바로 원본에 그 결과를 반영하도록 할 수 있는 파라미터가 있다.

 

 

뭔가 편해보이지만, 사실 권장하는 방법은 아니다.

앞서서 말했지만, 원본을 수정하는 것 자체를 그다지 권장하지 않기 때문이다.

그냥 이런 방법도 있구나~ 하고 참고하기 바란다.

 

 

⒟ 추출하기/저장하기 - .to_csv()

이렇게 정제 작업을 거친 결과를 다음을 위해 파일로 저장을 해보자.

 

 

예쁘게 잘 저장된 것을 확인할 수 있다.

다음에는 정제 작업을 다시 할 필요 없이 해당 파일을 바로 불러오면 된다.

 

 

⑥ 데이터 통계 처리하기

데이터들이 모여 있으니 이에 대한 통계 정보를 확인하는 것은 당연한 수순일 것이다.

 

▷ 평균값(mean) / 중앙값(median) / 합계(sum) / 최댓값(max) / 최솟값(min)

가장 기본적인 통계값들을 구해보자.

 

 

너무 편하다!!

 

▷ 표준편차(std) / 분산(var)

표준편차와 분산도 그냥 쓰면 된다.

 

 

▷ count() / value_counts()

count()는 결측치를 제외한 row의 개수를 알려준다.

value_counts()는 값 각자가 몇 개가 있는지를 알려준다.

 

 

▷ describe()

지금까지 살펴본 통계값들을 포함해서 기본적인 통계치를 한 번에 확인할 수 있다.

 

 

앞에서 살펴보지 않은 것은 사분위수 정도 밖에 없을 것 같다.

사분위수는 나중에 이상치(outlier) 처리할 때 심도있게 살펴보지 않을까 한다.

 

 

▷ 집계(aggregate) - agg()

원하는 column의 원하는 통계치만 보고 싶을 때 agg()을 활용할 수 있다.

 

 

지정하지 않은 부분은 NaN으로 나온다.

 

 

▷ groupby()

공부해보면 사실 별것도 아닌데,

개인적으로 머리에 잘 들어오지 않는 이상한 아이라서 신경이 많이 쓰인다 ㅠㅠ

 

 

type 값이 "TV Show"인 row들에 대해서 "release_year" 값의 평균, "duration" 값의 합계를 구하려고 할 때

"groupby()"를 사용하면 손쉽게 할 수 있다.

 

 

'type'으로 그룹핑해서 'duration'의 평균을 각각 구하라는 의미이다.

좀 더 복합적인 상황을 살펴보자.

 

 

type 값이 'Movie'이고 country 값이 'United States'인 데이터의

'duration' 평균값만 추출하고 싶으면 어떻게 해야할까?!

 

 

row를 지칭하는 부분을 주의깊게 살펴보기 바란다.

list 형식이 아니라, 튜플(tuple) 형식으로 사용한다.

 

 

 

⑦ 데이터프레임에 행/열 추가하거나 삭제하기

▷ 행/열 추가

새로운 row를 하나 추가하는 것을 살펴보자.

일단 Dict 타입으로 추가할 row 데이터를 하나 준비하자.

 

 

새로 추가할 index(row) 값을 지정해서 값을 넣어주면 끝이다.

 

 

index 값을 가지고 새로운 row를 추가하는 것인데, iloc[]가 아닌 loc[]를 사용하고 있는 것을 조심해야 한다.

iloc[]의 경우에는 기존의 데이터 범주에 대해서만 사용할 수 있기 때문에

새로운 row를 추가하는 것에는 사용할 수 없다.

 

column을 추가하는 것은 변수값 지정하듯이 사용하면 된다.

 

 

 

▷ 행/열 삭제 - drop()

drop()에서 axis 파라미터 값을 이용해 행/열 모두 삭제할 수 있다.

 

 

np.arange(2, 5)를 통해서 2부터 4까지의 값을 얻어낼 수 있기 때문에,

2, 3, 4 행이 삭제되었음을 알 수 있다. (axis=0)

 

이번에는 열(column)을 삭제해보자.

 

 

Column 이름을 지정해주고 axis=1 파라미터를 전달해서 column을 삭제했다.

 

 

우와 엄청 많은 내용이었다.

힘들다.

 

그래서 스터디 제출 기간을 살짝 오버했다 (사실 중간에 여행가느라... ㅋㅋㅋ)

 

반응형

Pandas가 너무 유명하다보니

수 많은 alternative 라이브러리들이 쏟아지고 있으며 특히, 속도를 개선한 유형이 많다.

 

그러다가 Pandas 보다 100배 더 빠르다는 불오리를 발견하게 되었다.

- https://hwisnu.bearblog.dev/fireducks-pandas-but-100x-faster

 

 

응?! FireDocks가 대체 뭔데, 이런 성능을 보여준다는거지?!

- https://fireducks-dev.github.io/

 

 

성능이 너무 잘 나와서인지 최근 엄청난 뉴스들이 쏟아지고 있다.

성능도 성능이지만, 기존에 Pandas로 작성한 코드를 그대로 사용할 수 있다는 점도 또 하나의 매력이다.

 

실제 측정한 성능은 어떻게 될까?

- https://fireducks-dev.github.io/docs/benchmarks/

 

 

자기들이 측정한 것이라 믿지 못할 수도 있겠지만,

실험한 환경 및 코드를 모두 공개하고 있으니 거짓말은 아닐 것이다 ^^

 

직접 코드를 한 번 돌려봤다.

테스트 환경은 Google Colab을 사용했다.

 

 

현재 최신 버전은 v1.1.5 이다.

 

테스트를 하기 위한 데이터를 생성하고,

실제 groupby 및 mean 실행을 통해 연산을 하는 소요 시간 측정 코드를 작성했다.

 

 

Pandas로 실행을 했을 때엔 3초의 시간이 소요되었는데,

FireDucks는 눈 깜짝 할 사이에 실행이 되어버리는 것을 볼 수 있다.

 

 

라이브러리 호출 부분만 변경했을 뿐인데, 성능이 좋아진다면 사용하지 않을 이유가 없을 것 같다.

 

라이선스는 "the 3-Clause BSD License (the Modified BSD License)"이다.

- https://github.com/fireducks-dev/fireducks

 

 

이렇게 훌륭한 라이브러리를 누가 만들었을까!?

- https://www.nec.com/en/press/202310/global_20231019_01.html

 

 

응?! 여기에서 갑자기 NEC ?!

어쩐지 공식 홈페이지에서 지원하는 언어가 English 외에 Japanese가 있더라니...

 

한 때는 가전제품도 생산을 해서 가끔 눈에 띄이곤 했는데,

요즘은 B2B 사업이나 통신 설비 등에 주력해서인지 주변에서 잘 보이진 않는다.

하지만, 11만명 이상의 임직원이 있는 글로벌한 기업이다.

 

 AI 및 클라우드 사업도 한다고 하던데,

이런 훌륭한 라이브러리도 만들어서 공개하고.... 괜찮은데!?

반응형

Chapter 06

 

어느덧 6주차까지 왔다. 혼공 완주 !!!

스스로에게 칭찬해줘야지 !!! 쓰담~ 쓰담~

 

▶ 내용 요약

06-1 객체지향 API로 그래프 꾸미기

- pyplot 방식과 객체지향 API 방식

 

 

- 그래프에 한글 출력하기

  . 한글 폰트가 필요하기 때문에, 나눔폰트를 설치해야 한다.

  . 예제에서는 구글 코랩에 대해서만 설명되어 있지만, 일반적인 Ubuntu 환경에서도 적용된다.

 

 

  . 사용할 수 있는 폰트 목록을 확인해볼 수도 있다.

  . 사용할 폰트를 지정할 수도 있고, 크기도 정할 수 있다.

 

 

  . 잘 되는지 확인해보자.

 

 

- 출판사별 발행 도서 개수 산점도 그리기

  . 교재와는 다르게, 내가 이용하는 도서관의 데이터로 진행해봤다.

 

 

  . 모든 데이터가 아닌 Top 30 출판사를 뽑아서 사용한다.

 

 

  . 산점도를 그리면 된다!

 

 

  . Marker 크기를 확인하거나 설정을 할 수도 있다.

  . 그냥 점이 아니라 크기에 따라 의미를 부여해보자. (대출건수)

 

 

- 맷플롯립의 다양한 기능으로 그래프 개선하기

 

 

 

 

06-2 맷플롯립의 고급 기능 배우기

- 실습준비하기

  . 한글 폰트 설치 및 도서관 CSV 파일 읽어오기 (앞에서 진행했던 내용 활용)

 

- 하나의 피겨에 여러 개의 선 그래프 그리기

  . 대출건수 크기가 유사한 출판사 2개를 선택해서 그려보자

 

 

  . 레전드를 표현하거나 모든 출판사 정보를 그려보거나 해보자.

 

 

  . 피봇 테이블을 이용해서 데이터를 만들어서 stackplot으로 그려보자.

 

 

 

- 하나의 피겨에 여러 개의 막대 그래프 그리기

 

 

  . 나란히 나오도록 할 수도 있다.

 

 

  . 2개의 bar 그래프를 합쳐서 그리는 2가지 방법이 있다.

 

 

 

  . 데이터 값 누적한 것을 그려보기 위해서 데이터를 먼저 확인해보자

 

 

  . cumsum()을 이용해서 누적 데이터를 만들 수 있다.

 

 

- 원 그래프 그리기

  . 10개 출판사를 뽑아서 pie를 그리면 된다.

 

 

  . startangle 및 여러 옵션들을 줘서 멋진 원 그래프를 만들 수 있다.

 

 

- 여러 종류의 그래프가 있는 서브플롯 그리기

  . 앞에서 살펴본 것들의 종합판이다!

 

 

  . 한 방에 모두 그려진다!!!

 

 

- 판다스로 여러 개의 그래프 그리기

  . DataFrame에서 바로 그래프를 그릴 수도 있다.

 

 

 

 

▶ 기본 미션

p.344의 손코(맷플롯립의 컬러맵으로 산점도 그리기)를 코랩에서 그래프 출력하고 화면 캡쳐하기

 

→ 코랩이 아닌 로컬 환경에서 실행해봤다 ^^

 

 

 

 

▶ 선택 미션

p.356~359의 스택 영역 그래프를 그리는 과정을 정리하기

 

① 기본 데이터 준비

  - 작업 준비 과정이다.

 

 

② 그래프로 표현할 데이터 만들기

  - Top30 출판사 기준으로 "출판사 / 발행년도 / 대출건수"를 추출하고,

  - "출판사 / 발행년도" 기준으로 그룹핑을 하면서, 대출건수는 sum()을 했다.

  - 전체적으로 reset_index()까지 해줬다.

 

 

③ pivot_table()

  - 발행년도를 X축으로 하고, 출판사를 Y축으로 하고, 대출건수를 데이터로 하는 테이블을 만든다.

 

 

④ get_level_values()

  - pivot_table()을 사용했다보니, column이 다단으로 구성되어 있다.

  - 이런 경우 원하는 레벨의 값만 추출하기 위해 get_level_values()를 사용했다.

 

 

⑤ stackplot()

  - 이제 그래프를 그리면 된다.

 

 

우와~~~ 다했다!!!!

반응형

Chapter04. 데이터 요약하

 

정신없이 달리다보니 어느덧 반환점을 돌고 있다. 앗싸~!!!

 

▶ 내용 요약

04-1. 통계로 요약하기

- df.describe()
  . 25%/50%/75% 가 아닌 다른 범위를 알고 싶을 때 : df.describe(percentiles=[0.3, 06, 0.9])
  . object 컬럼의 값 통계를 보고 싶을 때 : df.describe(include='object')


- 일반적인 수학 함수
  . df.mean() / df.median() / df.max() / df.min()


- df.quantile() / sr.quantile() : 분위수
  . df.quantile(0.25)
  . df.quantile([0.25, 0.5, 0.75])


- df.var() : 분산
  . 평균을 먼저 구한 뒤, 평균과 각 데이터 차이를 제곱해서 더한 뒤 데이터 갯수로 나눔


- df.std() : 표준 편차
  . 분산에 루트를 씌운 값

 

import numpy as np

diff = df['대출건수'] - df['대출건수'].mean()
np.sqrt( np.sum(diff**2) / (len(df) - 1) )


- df.mode() : 최빈값. 제일 자주 나오는 값


04-2. 분포 요약하기

- 산점도 : plt.scatter(df['column1'], df['column2'], alpha=0.1)


- 히스토그램
  . plt.hist(df['column1'], bins=5) : y축 폭을 5로 해서 그려라
  . plt.historgram_bin_edge(df['column1'], bins=5)

 

- 상자 수염 그림
  . 상자에서부터 1.5배 IQR 거리 안에서 가장 멀리 떨어져 있는 것 까지 표시

 

plt.boxplot( df[ ['column1', 'column2'] ])
plt.yscale('column')
plt.show()

 

 

▶ 기본 미션

p. 279의 확인 문제 5번 풀고 인증하기

 

기본 미션

 

우와 문제 스케일이 좀 크다 ^^

 

① 데이터 확보

  - https://www.data4library.kr/ 접속해서 데이터를 확보하자.

  - '데이터 제공' 탭을 통해서 데이터를 내려 받을 수 있다.

 

도서관 정보나루

 

② 데이터 읽어들이기

  - 다운로드 받은 데이터를 불러들여서 기본 모양을 살펴보자.

  - 특히, encoding을 신경써야 한다 !!! (정부차원에서 이거 그냥 UTF-8 쓰도록 강제해야하는 것 아닌가)

pd.read_csv()

 

③ Column 상태 확인 및 수정

  - '발행년도'를 가지고 통계를 내야 하는데, 수치형이 맞는지 확인하고, 아니아면 변경을 해야한다.

 

astype()

 

  - 그런데, 위와 같이 에러가 발생한다.

  - 이유는 제일 밑에 나와 있다. "2022(2021)"처럼 입력되어 있는 데이터가 있다보니 casting이 안되는 것이다.

 

  - '("를 포함한 데이터가 얼마나 있는지 확인해보고, '(*)' 부분을 삭제하도록 하자.

 

replace()

 

  - 다시 casting 해보자.

 

error

 

  - 또 에러가 나온다. 숫자가 아닌 데이터가 많은 것 같다.

  - 확인해보자.

 

숫자가 아닌 데이터

 

  - 이거.... 쉽게 갈 수 있는 길을 너무 어렵게 가는 것 같은데....

  - 일단 '.'을 포함한 것들이 많아 보이니 이를 먼저 처리해보자.

 

replace()

 

  - 아직도 243개나 남았다.

  - 데이터를 한 번 더 확인해보고 처리해보자.

 

replace()

 

  - 이제 85개 밖에 안남았다.

  - 데이터 확인해보고, 숫자가 아닌 것들을 전부 날려버리자.

replace()

 

  - astype()을 적용하기 위해서는 ''(공백), NaN 값이 있으면 안된다.

  - ''(공백)을 NaN으로 변환하고, NaN을 모두 0으로 변환해 astype()을 돌리자.

 

astype()

 

  - 드디어 int64 dtype으로 변환되었다.

 

④ draw Histogram

  - 이제 Boolean Indexing을 이용해서 원하는 범위를 한정하고, histogram을 그리면 된다.

histogram

 

 

▶ 선택미션

Ch.04(04-1)에서 배운 8가지 기술통계량(평균, 중앙값, 최솟값, 최댓값, 분위수, 분산, 표준편차, 최빈값)의 개념을 정리하기

 

일반적인 개념 정의는 너무나 잘 정리된 내용이 여기 저기 많이 있으므로 ^^

앞에서 만든 데이터를 가지고 직접 확인해보면서 살펴보겠다.

 

발행년도에 따른 대출건수가 어떻게 되는지를 scatter() 로 표현해봤다.

 

scatter()

 

8가지 기술통계량을 직접 확인해보자.

 

기술통계량

 

① max / ② min : 해당 값의 최댓값 / 최솟값

③ mean / ④ median

    . 평균값은 전체 데이터의 합을 전체 갯수로 나눈값이고,

    . 중앙값은 데이터를 줄 세웠을 때 중간 위치에 해당하는 실제값을 의미한다.

⑤ quantile

    . 분위수를 알려주는 것인데, 일반적으로는 IQR(InterQuartile Range, 사분범위) 사용

    . 명시적으로 원하는 분위수를 확인할 수도 있다.

⑥ var / ⑦ std

    . 분산은 각 데이터와 평균의 차이의 제곱의 총합을 전체 데이터 갯수만큼 나눠준 값이다.

    . 표준편차는 분산에 루트를 씌운 값이다.

⑧ mode

    . 최빈값은 데이터 값 중에서 가장 많은 빈도로 나오는 것을 의미한다.

 

 

우리 모두 파이팅 !!!

반응형

 

파이썬 라이브러리를 활용한 데이터 분석 2판

 

표지

 

이번에 보게된 책은

"데이터 분석을 위해 파이썬 라이브러리를 사용하는 방법"을

알려주는 교과서와 같은 유명한 책이다.

 

 

교과서와 같은 책이라고 해서

오래된 책이라고 생각할 수도 있는데

오래된 책 맞다.

 

그렇다고 해서 'out of date' 된 책은 아니다.

 

제목에도 써있는 것처럼

"2판"으로 나왔기 때문이다.

 

2판 5쇄

 

거기에다가 5쇄까지 찍었다.

유명한 책인 것은 분명하다.

 

2판

 

결론적으로 2019년에 2판으로 업데이트 했고

내용은 지금도 유효하다!!!

 

 

 

"학습 환경"

이 책에서 제안하는 학습 환경은

Anaconda 설치해서

IPython 또는 Jupyter Notebook

사용하는 것이다.

 

IPython & Jupyter

 

Jupyter Notebook의 근간이 IPython 이라는 것을

처음 알았다 @.@

 

 

추가적으로 IDE(통합 개발 환경)를 소개해주기는 하는데,

결국은 IPython 또는 Jupyter Notebook을

사용하는 것을 권장하고 있다.

IDE

VSCode(Visual Studio Code) 언급이 없는 것으로 보아

2019년 이전에 작성한 책이 맞는 것 같다 ^^

하지만, 공부에는 지장이 없다 !!!

 

 

 

책 내용은

기본 자료형부터 설명을 시작하면서

Numpy와 Pandas를 중심으로

너무나 잘 설명해주고 있다.

 

책 내용도 훌륭하지만,

코드 예제 데이터는 꼭 찾아보길 바란다.

https://github.com/wesm/pydata-book

 

단순히 샘플 코드만 있는 것이 아니라

Jupyter Notebook 파일로 제공해주면서

설명하는 내용까지 담겨있다.

 

예제 코드

 

최근 많은 분들이 계속 관심을 많이 갖고 있는

Machine Learning, Deep Learning, Big Data 등의

공부를 하게 되면

반드시 거쳐가는 것이 바로

Python 특히, Numpy & Pandas 라이브러리에 대해서

공부를 하게 된다.

 

이 때, 정말 많은 도움이 될 책으로 추천할 수 있을 것 같다!!!

 

 

 

이 책을 보면서 특히 호감이 들었던 부분이

바로 "Chapter 11. 시계열" 이다.

 

시계열 데이터

 

개인적으로 Python으로 작업하면서

많은 고생을 했던 (즉, 시간을 엄청 많이 빼았겼던)

부분이 바로 "날짜" & "시간" 이었다.

 

즉, "시계열" 데이터 인데,

이것을 하나의 챕터로 깊게 다뤄주고 있어서

정말 감동했다.

 

 

 

이 책에 대해서 짧게 서평하자면

Python으로 데이터를 다루고 싶은 모든 분들에게 추천하는 책이다.

 

Numpy, Pandas는 물론이고

기본 내장 데이터형부터 시작해서

고급 데이터 분석까지 차분히 설명해주고 있다.

 

 

 "한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."

 

반응형


머신러닝에 대해서 공부를 한다고 하면,

예전에는 (아직도) R 등과 같은 수학에 맞춰진 언어를 소개하기도 하지만 대부분은 Python을 추천한다.


사실은 Python이라는 언어 자체가 중요한 것이 아니라

머신러닝을 할 때 필요한 많은 기능(?)들을 제공해주는 라이브러리들이 중요한데

Pandas, Numpy 라이브러리가 워낙에 잘 되어 있어서 Python을 사용하라고 하는 것이다.

물론 Python이라는 언어 자체도 매력적이긴 하지만...



이에 대해서 공부를 하고자 하는 분들에게 드리는 좋은 정보~


Google에서 무려 한국어로 제공해주는 "머신러닝 단기집중과정" 온라인 강좌

https://developers.google.com/machine-learning/crash-course


그 중에서도 Pandas에 대해서 직접 실습해가며 배울 수 있는 정말 멋진 과정

- https://colab.research.google.com/notebooks/mlcc/intro_to_pandas.ipynb?utm_source=mlcc&utm_campaign=colab-external&utm_medium=referral&utm_content=pandas-colab&hl=ko



그런데, 위의 내용 말고도 좋은 강좌가 하나 더 있다.

머신러닝에 대해서 공부하다보면 누구나 알게 되는 Kaggle !!


 Kaggle에서도 Pandas에 대해서 친절한 강좌를 제공해준다.

https://www.kaggle.com/learn/pandas


4시간이면 끝낼 수 있단다~!! ^^ (필자는 멍청해서 4일은 걸릴듯... ㅠㅜ)




모두들 즐거운 머신러닝 공부시간 되세요~


반응형


Ubuntu에서 Python3 환경 셋업을 한 뒤에 (https://www.whatwant.com/entry/Python3-환경-만들기-버전-변경하기-in-Ubuntu)

pandas를 사용해보고자 했더니, 에러가 발생...


Traceback (most recent call last):

  File "./test.py", line 4, in <module>

    import pandas as pd

ModuleNotFoundError: No module named 'pandas'




0. 현재 환경


    - 아래 작업을 실행한 환경은 다음과 같다


$ lsb_release -a


No LSB modules are available.

Distributor ID: Ubuntu

Description:    Ubuntu 18.04.3 LTS

Release:        18.04

Codename:       bionic



$ python --version


Python 3.6.9


    - Python 3.7 버전으로 했을 경우에는 아래와 같이 진행하면 충돌(?)이 있다. 3.6 버전으로 진행하길...




1. pandas 설치하기


    - 뭔가 무지막지하게 많이 설치된다.


$ sudo apt-get install python3-pandas


Reading package lists... Done

Building dependency tree

Reading state information... Done

The following additional packages will be installed:

  blt fonts-lyx javascript-common libaec0 libblas3 libblosc1 libgfortran4 libhdf5-100 libjbig0 libjpeg-turbo8 libjpeg8 libjs-jquery libjs-jquery-ui liblapack3 liblcms2-2 libsnappy1v5 libsz2 libtcl8.6 libtiff5 libtk8.6 libwebp6 libwebpdemux2

  libwebpmux3 libxft2 libxrender1 libxss1 python-matplotlib-data python-tables-data python3-bs4 python3-cycler python3-dateutil python3-decorator python3-html5lib python3-lxml python3-matplotlib python3-numexpr python3-numpy python3-olefile

  python3-pandas-lib python3-pil python3-pyparsing python3-scipy python3-tables python3-tables-lib python3-tk python3-tz python3-webencodings tk8.6-blt2.5 ttf-bitstream-vera x11-common

Suggested packages:

  blt-demo apache2 | lighttpd | httpd libjs-jquery-ui-docs liblcms2-utils tcl8.6 tk8.6 python-cycler-doc python3-genshi python3-lxml-dbg python-lxml-doc dvipng ffmpeg gir1.2-gtk-3.0 ghostscript inkscape ipython3 librsvg2-common

  python-matplotlib-doc python3-cairocffi python3-gi-cairo python3-gobject python3-nose python3-pyqt4 python3-sip python3-tornado texlive-extra-utils texlive-latex-extra ttf-staypuft gfortran python-numpy-doc python3-dev python3-numpy-dbg

  python-pandas-doc python-pil-doc python3-pil-dbg python-pyparsing-doc python-scipy-doc python-tables-doc python3-netcdf4 vitables tix python3-tk-dbg

The following NEW packages will be installed:

  blt fonts-lyx javascript-common libaec0 libblas3 libblosc1 libgfortran4 libhdf5-100 libjbig0 libjpeg-turbo8 libjpeg8 libjs-jquery libjs-jquery-ui liblapack3 liblcms2-2 libsnappy1v5 libsz2 libtcl8.6 libtiff5 libtk8.6 libwebp6 libwebpdemux2

  libwebpmux3 libxft2 libxrender1 libxss1 python-matplotlib-data python-tables-data python3-bs4 python3-cycler python3-dateutil python3-decorator python3-html5lib python3-lxml python3-matplotlib python3-numexpr python3-numpy python3-olefile

  python3-pandas python3-pandas-lib python3-pil python3-pyparsing python3-scipy python3-tables python3-tables-lib python3-tk python3-tz python3-webencodings tk8.6-blt2.5 ttf-bitstream-vera x11-common

0 upgraded, 51 newly installed, 0 to remove and 0 not upgraded.

Need to get 35.7 MB of archives.

After this operation, 160 MB of additional disk space will be used.

Do you want to continue? [Y/n]




2. 테스트 코드


    - 잘 동작하는지 살펴보자. 샘플은 Kaggle의 내용을 참조했다.


import pandas as pd

import pprint


pp = pprint.PrettyPrinter(indent=4)


if __name__ == "__main__":


    fruits = pd.DataFrame( [[30, 21]], columns=['Apples', 'Bananas'] )

    pp.pprint( fruits )


    exit(0)


파이팅~!!!

반응형

+ Recent posts