Python Pandas 시작

2018. 9. 28. 17:57Python/pandas

\

Python 을 해본적도 없는데 갑자기 Python 으로 분석을 해야할 일이 생겼다.


데이터 분석 강의를 찾아보니 전부 R로 되어있고 파이썬 강의는 찾을 수 없었다.


왜 회사에서는 R이 아닌 파이썬으로 PPT를 준비하라고 했을까? 



출처 : http://media.fastcampus.co.kr/knowledge/dataanalysis-python-r/

R의 장단점

장점 1 : 데이터 시각화
시각화된 데이터는  Raw 데이터 보다 훨씬 효과적으로 그 의도를 전달할 수 있습니다. R을 처음 만든 목적 자체가 ‘데이터 분석, 통계학 그리고 시각화를 하기 위해 더 좋고 친근한 방법을 만들어 보자!입니다. 그만큼 R은 강력한 데이터 시각화 기능을 자랑하죠. 의미 전달이나 보고가 목적이라면 R을 활용하세요. 대표적인 시각화 패키지에는 ggplot2, ggvis, googleVis, rCharts등이 있습니다.

장점 2: 생태계
R은 정말 풍부한 최첨단 패키지와 활발한 커뮤니티를 자랑합니다. 말 그대로 ‘R의 생태계’를 이루고 있죠. R 함수와 데이터들의 모음인 패키지, 이를 통해서 언제나 쉽게 최근의 테크닉과 기능에 접근할 수 있습니다. 자료를 찾느라 밤을 지새우지 않아도 되는 거죠!

장점 3: 데이터 사이언스의 통용어
R은 통계학자들에 의해, 통계학을 위해 개발되었습니다. 그래서 통계학자들은 그들의 아이디어와 개념들을 R의 코드와 패키지 등을 통해 공유하죠. 그래서 R을 활용한다면 데이터 사이언스를 시작하기 위해 꼭 컴퓨터 공학을 배워야 할 필요가 없습니다!

단점 1: 느린 속도
말씀드렸듯이 R은 통계학자들이 좀 더 쉽게 연구하려고 만든 언어이기에 컴퓨터를 효율적으로 활용하는 방법은 그리 깊게 고려하지 않은듯합니다. 다시 말해 R은 읽기 어려운 코드 때문에 좀 느릴 수 있습니다. 하지만 그런 단점을 상쇄해줄 수 있는 pqR, renjin, FastR, Riposte 등의 패키지가 있죠! R의 패키지 생태계는 정말 대단하네요.

단점 2: 어렵다
R을 배우는 것은 그리 쉬운 일이 아닙니다. 풍부한 패키지가 있지만 그걸 사용하는데 익숙하지 않다면 활용하는데 시간이 꽤 오래 걸릴 겁니다. 입문자가 처음부터 R을 활용해 원하는 분석을 할 수는 없습니다. 꾸준한 학습이 필요하죠.





파이썬의 장단점

장점 1: IPython Notebook
IPython Notebook은 파이썬을 가지고 하는 데이터 작업을 훨씬 쉽게 만들어줍니다. 따로 부가적인 설치도 할 필요 없이, 동료들과 메모와 작업을 공유할 수 있습니다. 이를 통해 코드, 결과물, 메모 파일들을 정리하는데 필요한 비용을 획기적으로 줄여주죠. 진짜 해야 할 일에 집중할 수 있습니다.

장점 2: 특정 주제나 용도에 국한되지 않은 배우기 쉬운 언어
파이썬은 특정 분야를 위한 언어가 아니라 비교적 쉽고, 직관적입니다. 데이터 사이언스 말고도 다양한 분야에 많이 쓰이죠. 그만큼 배우기 쉽습니다. 코드를 익히고 쓰는데 드는 시간을 줄일 수 있습니다.

장점 3: 다양한 용도의 언어
파이썬은 다양한 백 그라운드의 사람들이 모두 사용할 수 있는 언어입니다. 이해하기 쉬운 언어이기 때문에 통계 백 그라운드를 가진 사람들도 배울 수 있죠. 워크플로우의 모든 부분을 통합시킬 하나의 도구를 만들 수도 있습니다.

단점 1: 시각화
R 에겐 장점이었던 것이 파이썬에겐 단점입니다! 시각화는 데이터 분석 소프트웨어를 고르는데 매우 중요한 판단 기준이지만, 아쉽게도 파이썬은 시각화 기능이 R에 비해 떨어지죠. Seaborn, Bokeh and Pygal과 같은 시각화 라이브러리를 가지고 있긴 하지만, 너무 선택사항이 많은 감이 들기도 합니다. 더욱이 R과 비교하면 파이썬의 시각화는 난해한 모습을 하고 있는 경우가 많습니다. 그래서 시각화된 결과가 썩 만족스럽지 않을 때도 있죠.

단점 2: 파이썬은 도전자다
데이터 분석 툴에 있어서 R이 파이썬보다 선구자입니다. 파이썬은 도전자죠. 그래서 R이 수백 개에 달하는 기본적인 패키지들의 대체자가 되기에는 아직 많이 부족합니다. 파이썬이 최근 핫하게 떠오르고는 있지만, 여전히 사람들이 방대한 패키지를 자랑하는 R을 포기할 만큼인지는 미지수입니다.




배우기 쉽고, 적용하기 쉽고 도전해보라는 의미였던거 같다.


파이썬을 설치,pycharm, 아나콘다를 설치한다


출처: http://excelsior-cjh.tistory.com/83



다른 블로그를 참조하면서 pandas 를 import 하고 실행시켜보았다.

출처:http://pythonstudy.xyz/python/article/408-pandas-%EB%8D%B0%EC%9D%B4%ED%83%80-%EB%B6%84%EC%84%9D



import pandas as pd

data = [1, 2, 3, 4, 5]
s = pd.Series(data)

print(s)



??????!!

당연히 안될줄 알았는데 된다......

패키지 같은걸 설치해야 될줄알았더니 아나콘다에서 기본으로 pandas를 제공한다고함

그런데 지금 위의 코드가 뭘한건줄 모르겠다 출력을 해서 배열처럼 인덱스로 나오는건 알겠는데...

기본 파이썬을모르니,, 확인을위해 data만 따로뽑아보자

import pandas as pd

data = [1, 2, 3, 4, 5]





맞다 .

data = 배열이고

pandas 의 Seriese() 를 사용하면 배열에 인덱스가 부여되는걸로 예상된다 



설명에는 다음과 같이 적혀있다.


Series

가장 간단한 1차원 자료구조인 Series는 배열/리스트와 같은 일련의 시퀀스 데이타를 받아들이는데, 별도의 인덱스 레이블을 지정하지 않으면 자동적으로 0부터 시작되는 디폴트 정수 인덱스를 사용한다.


그러면 인덱스 레이블을 지정할 수 있다는건데??


찾아본 결과

import pandas as pd

data = [1, 2, 3, 4, 5]
s = pd.Series(data, index=["서울", "부산", "인천", "대구", "제주"])

print(s)

C:\Anaconda\python.exe D:/Project/myProject/python/pandas/start
서울    1
부산    2
인천    3
대구    4
제주    5
dtype: int64

다음과 같이 인덱스를 지정할수 있었다

이밖에도

import pandas as pd

data = {"서울" : 1, "부산" : 2, "인천":3, "대구":4, "제주":5}
s = pd.Series(data)

print(s)

와같이 딕셔너리를 사용할수도있다.

Series의 다양한 사용법이 있으나 현재는 배우는 단계기 때문에

저렇게 배열등 을 인덱스를 부여해 pandas에서 사용한다고 이해하고 넘어가야겠다.

(해야될건 분석이기때문에 나중에 필요하면 다시 찾아서 보자)



DataFrame

2차원 자료구조인 DataFrame는 행과 열이 있는 테이블 데이타(Tabular Data)를 받아들이는데, 아래 예제는 그 한가지 방법으로서 열(column)을 dict의 Key로, 행(row)을 dict의 Value로 한 Dictionary 데이타를 pd.DataFrame()을 사용하여 pandas의 Data Frame 자료구조로 변환한 예이다

import pandas as pd
 
data = {
    'year': [2016, 2017, 2018],
    'GDP rate': [2.8, 3.1, 3.0],
    'GDP': ['1.637M', '1.73M', '1.83M']
}
 
df = pd.DataFrame(data)

data를 위와 같이 쓰는게 Dictionary 데이타 라고하나보다. key value 쌍

저대로 해보니
year GDP rate GDP 0 2016 2.8 1.637M 1 2017 3.1 1.73M 2 2018 3.0 1.83M
잘 실행된다




Panel

3차원 자료구조인 Panel은 Axis 0 (items), Axis 1 (major_axis), Axis 2 (minor_axis) 등 3개의 축을 가지고 있는데, Axis 0은 그 한 요소가 2차원의 DataFrame 에 해당되며, Axis 1은 DataFrame의 행(row)에 해당되고, Axis 2는 DataFrame의 열(column)에 해당된다.

아래 예제는 numpy를 사용하여 3차원 난수를 발생시킨 후, 이를 pandas.Panel() 에 적용한 예이다. 출력 결과에 보면, 2 (items) x 3 (major_axis) x 4 (minor_axis) 크기의 Panel 객체가 생성되었음을 알 수 있다. Panel 객체 p로부터 p[0]을 조회하면, Axis 0 의 첫번째 요소인 DataFrame이 출력됨을 볼 수 있다.


import pandas as pd
import numpy as np

data = np.random.rand(2,3,4)
p = pd.Panel(data)
print(p)
print(p[0])
소스는 이건데 0번째가 DataFrame인건 알겠는데 rand함수를 몰라서 어떤식으로 동작하는지 모르겠다

일단 data부터찍어보자

[[[0.78100553 0.62156554 0.68201828 0.75238709] [0.18389455 0.61957062 0.75935209 0.85925252] [0.44446903 0.72984849 0.28067282 0.86116028]] [[0.77870571 0.31176337 0.76882765 0.68271708] [0.49358087 0.87346953 0.82619705 0.1145929 ] [0.93443526 0.80477726 0.41483622 0.9074736 ]]]

와같은 결과를 반환했는데 여전히 왜이렇게되었는지 모르겠다 rand 함수를 찾아보자


rand 명령은 0과 1사이의 난수를 발생시키는 명령으로 인수로 받은 숫자 횟수만큼 난수를 발생시킨다.

In [2]:
np.random.rand(5)
array([0.5488135 , 0.71518937, 0.60276338, 0.54488318, 0.4236548 ])



아하 rand가 0과 1사이의 난수를 발생시키므로 주어진 인자는

2개items를 3개의 row 4개의 column 로 만드는 형식인것같다.


p를 출력한 결과를 보면

<class 'pandas.core.panel.Panel'>

Dimensions: 2 (items) x 3 (major_axis) x 4 (minor_axis)

Items axis: 0 to 1

Major_axis axis: 0 to 2

Minor_axis axis: 0 to 3

2개의 아이템 3개의 로우 4개의 컬럼 이라고 설명이 나와있는것같다.


print(p[0]) 을했을때 첫번째 item에 해당하는 데이터가 나온다 

          0         1         2         3

0  0.781006  0.621566  0.682018  0.752387

1  0.183895  0.619571  0.759352  0.859253

2  0.444469  0.729848  0.280673  0.861160

그럼 p1는 두번째 p2은 오류를 뱉을것이다 테스트해보자 

예상대로 되는걸 확인했다




다음으로 진행


3. 데이타 엑세스

pandas에서 Series, DataFrame, Panel 등의 자료구조를 만든 후, 다양한 방법을 통해 데이타를 엑세스할 수 있다. 
가장 간단한 방식으로 pandas 자료구조에 대해 인덱싱 혹은 속성(Attribute)을 사용하는 것인데, 예를 들어 위에서 생성한 DataFrame인 df 에 대해 year 행을 가져오기 위해 df["year"] 혹은 df.year 를 사용할 수 있다. 또한, 부울린 인덱싱 (boolean indexing)을 사용하여 특정 조건의 데이타만 필터링 할 수도 있는데, df[df['year'] > 2016]은 2016년 초과인 데이타만 필터링해서 표시한다.

데이타량이 많은 경우는 df.head() 함수를 사용하면 처음 5개 row를 표시해 주며, df.tail() 함수를 사용하면 마찬가지로 마지막 5개 row를 표시해 준다.




설명만 봐도 너무 유용하고 좋은것같다 이를 위해서 비슷한 데이터를 만들어주었다 

분석때 임시적으로 쓸 키,성별,발 dataframe을 만들고 따라해보겠다

import pandas as pd

data = {
'키': [182, 172, 162, 152],
'성별': ["남", "남", "여", "여"],
'발': ['280', '170', '140','130']
}

df = pd.DataFrame(data)

먼저 키의 행을 가지고온다. 두가지 방법으로 사용할 수 있다
print(df['키'])

print(df.키)

0 182 1 172 2 162 3 152

또한 조건문을 걸어서 사용 가능하다. 키가 170 이상인 data를 뽑아보았다.

print(df[df['키'] > 170])
     키 성별    발
0  182  남  280
1  172  남  170 

mean -> 평균 sum 합계 min 최소 max 최대 등 함수 사용이 가능하다.

print(df['발'].sum(), df['발'].mean())
280170140130 70042535032.5

데이터가 이상하게 나오고있는데 int형이 아니라서그런것같다 int형으로 바꿔주자


1020 255.0

원하는 결과가 출력되었다.


또한 기본적인 통계치를 표현하기위해


print(df.describe())과 같이 사용할수있는데
                키           발
count    4.000000    4.000000
mean   167.000000  255.000000
std     12.909944   23.804761
min    152.000000  230.000000
25%    159.500000  237.500000
50%    167.000000  255.000000
75%    174.500000  272.500000
max    182.000000  280.000000
와 같이 결과가 나온다

또한 외부의 데이터를 읽고 쓸수도 있는데 excel, csv, json, 등 다양한 외부 데이터를 읽고 쓴다.

import pandas as pd

df = pd.read

위상태에서 ctrl + space 를 누르니 읽을 수 있는 데이터 형식이 나온다. 분석때 사용할 데이터가 json 형태일 것으로 예상되므로

json 형태의 임시 데이터를 만들어준다 불러오는 방식도 여러가지이니 나중에 필요할때찾아본다.

파일을 생성
data.json

{
"키": [182, 172, 162, 152],
"성별": ["남", "남", "여", "여"],
"발": [280, 270, 240,230]
}










import pandas as pd

df = pd.read_json("D:\Project\myProject\python\pandas\data.json")

print(df)
    �궎 �꽦蹂�   諛�
0  182   �궓  280
1  172   �궓  270
2  162   �뿬  240
3  152   �뿬  230

출력결과가 깨져서나온다 불러올때 옵션이 있지 않을까 하고 찾아보니 역시 ENCODING 이있었다 적용해주니 한글이 나오는걸 확인할 수 있다

df = pd.read_json("D:\Project\myProject\python\pandas\data.json",encoding='utf-8')

     키 성별    발

0  182  남  280

1  172  남  270

2  162  여  240

3  152  여  230



데이터를 읽어들인 후 , matplotlib 을 통해 Bar차트를 그려보자


matplotlib 는 파이썬에서 기본 제공하는 시각화툴이다


import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_json("D:\Project\myProject\python\pandas\data.json",encoding='utf-8')
print(df['키'])
plt.bar(df.키, df.발)
plt.show()

ㅅㅁㅅ


다음 그림처럼 간단하게 차트로 확인할 수 있다.


반응형

'Python > pandas' 카테고리의 다른 글

Python pandas - 상관관계 분석 -2  (0) 2018.11.06
Python pandas - 상관관계 분석 -1  (0) 2018.11.06
Pandas 엑셀파일읽고 데이터 컨트롤  (0) 2018.10.17