데이터 다운로드를 위한 주소:

github.com/PinkWink/DataScience/blob/master/data

 

PinkWink/DataScience

책) 파이썬으로 데이터 주무르기 - 소스코드 및 데이터 공개. Contribute to PinkWink/DataScience development by creating an account on GitHub.

github.com

read_csv, read_excel, head(), rename()등의 기본기를 익힌후에 접근해본다.

 

1. 데이터 프레임 조작하기

 

일단 데이터 분석을 위한 library들을 불러온다.

항상 import 뒤에 모듈명이 들어간다.

import pandas as pd
import sys
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
pd.__version__
# print(sys.version) #Python 내에서 현재 python version확인용

우리가 사용할 library중 테이블을 잘 정리하고 분석에 용이한 Pandas라는 library에 대해 간략히 정리할 것이다.

우선 pandas의 기본 데이터 유형은 Series인데 어떤 데이터 유형이던 담을 수 있다. 

s = pd.Series([1,3,4,np.nan,6,8]) #pandas 의 기초유형
s

또한, 날짜 관련 데이터 유형이 있다. periods를 이용해서 지정한 2013년01월01일부터 2013년 01월06일까지 dates variable에 지정된다.

dates = pd.date_range('20130101',periods=6)
dates
#pd.date_range 함수를 쓰면 모든 날짜/시간을 일일히 입력할 필요없이 시작일과 종료일 또는 시작일과 기간을 입력하면 범위 내의 인덱스를 생성해 준다.

DataFrame을 만들고 여러가지 테이블 관련 함수를 사용하거나 문자와 숫자로 인덱싱을 할 수 있다.

*주의 할 점은 인덱싱을 할 때, 숫자나 문자로 인덱싱이 된다. 하지만 loc함수에서도 문자로만 indexing이 되고 iloc은 숫자로 인덱싱이 된다.

#data frame의 index를 dates로 설정, column명은 ABCD로 설정
df = pd.DataFrame(np.random.randn(6,4),index=dates, columns=['A','B','C','D'])
#data frame을 위에서 6줄만 보여줌
df.head(3)
#index, colums과 values
df.index
df.columns
df.values
df.info()
#column별로 통계량을 계산해준다.
df.describe()
#B컬럼을 기준으로 오름차순으로 정렬
df.sort_values(by='B',ascending=True)
#index을 문자로만 인덱싱
df['20130102':'20130104']
# loc함수는 문자로만 indexing
df.loc[dates[0]]
df.loc[:,['A','B']]
df.loc['20130102':'20130104',['A','B']]
# iloc는 index(숫자) 자체로만 indexing
df.iloc[3:5,1:3]
df.iloc[[1,2,4],[0,2]]

 조건을 걸어서 데이터 프레임을 조작할 수 있다.

copy()함수를 쓰는 이유는 그냥 다른 변수에 원래 변수를 할당해주면 동일한 주소를 갖게되므로 

copy()함수를 써서 다른 주소로 변수를 할당해주어야한다.

#조건에 맞는 테이블 찾기
df[df>0]
#변수 복사
df2 = df.copy()
#column하나 추가
df2['E']=['one','one','two','three','four','three']
#E컬럼에서 two와 four를 갖고있는 조건의 df2 데이터프레임 반환
df2[df2['E'].isin(['two','four'])]
#apply는 apply함수로 어떤 함수를 전체 데이터프레임에 적용함
df.apply(np.cumsum)
#간단하게 함수를 만들때 lambda를 사용
df.apply(lambda x: x.max()-x.min())
dist = lambda x: x.max()-x.min()

이제 실제로 데이터 분석을 위해 저장된 엑셀파일을 불러와보자. 

CCTV_seoul = pd.read_csv('C:/Users/USER-PC/Documents/DataScience_followingbook/data/01. CCTV_in_Seoul.csv',encoding='utf-8')
pop_seoul_ori= pd.read_excel('C:/Users/USER-PC/Documents/DataScience_followingbook/data/01. population_in_Seoul.xls')
pop_seoul = pd.read_excel('C:/Users/USER-PC/Documents/DataScience_followingbook/data/01. population_in_Seoul.xls',
                            encoding='utf-8',usecols='B,D,G,J,N',header=2,)
pop_seoul_test = pd.read_excel('C:/Users/USER-PC/Documents/DataScience_followingbook/data/01. population_in_Seoul.xls',
                            encoding='utf-8',header=2)

CCTV_seoul.head()
pop_seoul.head()
pop_seoul_test.head()

맘에 들지 않는 컬럼명을 바꿔보자.

CCTV_seoul.rename(columns={CCTV_seoul.columns[0]:'구별'},inplace=True)
CCTV_seoul.head()
pop_seoul.rename(columns={pop_seoul.columns[0]:'구별',
                         pop_seoul.columns[1]:'인구수',
                         pop_seoul.columns[2]:'한국인',
                         pop_seoul.columns[3]:'외국인',
                         pop_seoul.columns[4]:'고령자'},inplace=True)

데이터를 특정 column기준으로 정렬해보자.

CCTV_seoul.head()
CCTV_seoul.sort_values(by='소계',ascending=True).head(5)
CCTV_seoul.sort_values(by='소계',ascending=False).head(5)
CCTV_seoul['최근증가율']=(CCTV_seoul['2014년']+CCTV_seoul['2015년']+CCTV_seoul['2016년'])/CCTV_seoul['2013년도 이전']*100
CCTV_seoul.sort_values(by='최근증가율',ascending=False).head()

맘에 들지 않는 행이나 열을 지워보자.

pop_seoul.head()
pop_seoul.drop([0],axis=0) #drop함수는 행이나 열을 제거 axis =0 행, 1열
pop_seoul['구별'].unique()
pop_seoul[pop_seoul['구별'].isnull()]
pop_seoul.drop([26],axis=0)
pop_seoul.head()

 

2. 데이터 프레임끼리 JOIN

 

간단하게 데이터 프레임끼리 어떤 기준키로 데이터프레임을 조작하는 방법을 알아보자.

우선 사용할 df를 만들어주자.

df1 = pd.DataFrame({'A':['A0','A1','A2','A3'],
                   'B':['B0','B1','B2','B3'],
                   'C':['C0','C1','C2','C3'],
                   'D':['D0','D1','D2','D3']},index=[0,1,2,3])
df2 = pd.DataFrame({'A':['A4','A5','A6','A7'],
                   'B':['B4','B5','B6','B7'],
                   'C':['C4','C5','C6','C7'],
                   'D':['D4','D5','D6','D7']},index=[4,5,6,7])
df3 = pd.DataFrame({'A':['A8','A9','A10','A11'],
                   'B':['B8','B9','B10','B11'],
                   'C':['C8','C9','C10','C11'],
                   'D':['D8','D9','D10','D11']},index=[8,9,10,11])
df4 = pd.DataFrame({'B':['B2','B3','B6','B7'],
                   'D':['D2','D3','D6','D7'],
                   'F':['F2','F3','F6','F7']},index=[2,3,6,7])

concat은 행기준으로 데이터를 병합하는 것이고 열 기준으로 묶기 위해서는 axis를 1로 변경해준다. 그런데 자주 사용 안 할 것 같다.

result = pd.concat([df1,df2,df3],keys=['x','y','z']) #keys를 설정하면 다중 인덱스가 됨
result.index
result.index.get_level_values(0)
result = pd.concat([df1,df4],axis=1) #concat은 index를 기준으로 date를 합침
result = pd.concat([df1,df4],axis=1,join='inner') #concat은 index를 기준으로 date를 합침
result = pd.concat([df1,df4],axis=1,join_axes=[df1.index]) #concat은 index를 기준으로 date를 합침
result = pd.concat([df1,df4],ignore_index=True) #concat은 index를 기준으로 date를 합침
result

대신 merge라는 것을 사용할 것이다. 

left=pd.DataFrame({'key':['k0','k4','k2','k3'],
                  'A':['a0','a1','a2','a3'],
                  'B':['b0','b1','b2','b3']})
right=pd.DataFrame({'key':['k0','k1','k2','k3'],
                  'C':['c0','c1','c2','c3'],
                  'D':['d0','d1','d2','d3']})
left
right
pd.merge(left,right,on='key')
pd.merge(left,right,how='left',on='key')
pd.merge(left,right,how='right',on='key')
pd.merge(left,right,how='outer',on='key')
pd.merge(left,right,how='inner',on='key')
data_result = pd.merge(CCTV_seoul,pop_seoul,on='구별')
data_result.head()
del data_result['2013년도 이전']
del data_result['2014년']
del data_result['2015년']
del data_result['2016년']
data_result.head()
data_result.set_index('구별',inplace=True)
data_result.head()

이제 정렬이 어느 정도 되었으니 각 column별로 얼마나 관계를 띄는지 확인해보려 한다.

이때, corrcoef함수로 correlation coefficient를 볼 수 있다.

np.corrcoef(data_result['고령자비율'],data_result['소계'])
np.corrcoef(data_result['외국인비율'],data_result['소계'])
np.corrcoef(data_result['인구수'],data_result['소계'])

 

'데이터분석 > 예제로 데이터분석' 카테고리의 다른 글

서울시 범죄 현황 분석  (0) 2020.02.19

프로그램 입출력

 

  1. 함수

    1. 구조와 사용법

      1. 구조: def 함수명(입력값): 수행문

        1. def는 함수를 만들때 사용하는 예약어

        2. 매개변수: 함수에 입력으로 전달 된 값을 받는 변수

        3. 인수: 함수를 호출할 때 전달하는 입력값

      2. 함수의 형태

        1. 일반적인 경우

          1. def 함수이름(매개변수): 수행문 return 결과값

        2. 입력값이 없는 경우

          1. def 함수(): return 결과값

          2. 사용법: 결과값을 받을 변수 = 함수()

        3. 결괏값이 없는 함수

          1. def 함수명(매개변수): 수행문

            1. return이 없으면 결과값이 아니다. print도 수행문의 일부일 뿐이다.

        4. 입력값도 결과값도 없는 함수

          1. 사용법: 함수이름()

      3. 매개변수 사용

        1. 매개변수를 지정해서 호출

          1. ex) result = add(a=3,b=7) <- 순서가 바뀌어도 됨

        2. 매개변수에 초깃값 미리 설정

          1. 함수를 만들때 초기값이 변하는 것이 아니면 매개변수에 초기값을 넣어서 생성

            1. ex) def say_myself(name, old, man=True): 수행문

            2. 초기값의 위치는 맨 마지막에 입력

      4. 입력값이 몇개인지 모를 때

        1. 사용법: def 함수이름 (*매개변수): 수행문

        2. 사용법2: def 함수이름(choice, *매개변수): 수행문

      5. 키워드 파라미터

    2. 특징

      1. 결과값은 늘 하나

        1. 만약 결과값은 언제나 하나여야하지만 2개를 입력하는 경우 -> 두 값이 하나로 뭉쳐지는 튜플로 변환되어 나옴, 에러 안남

        2. 만약 return을 두번 사용하면?

          1. return을 사용하는 순간 함수를 빠져나옴

      2. 함수안의 변수는 함수 안에서만 효력이 있음

        1. 함수 안에서 함수 밖의 변수를 변경하려면?

          1. return 사용

            1. return값을 다시 밖의 변수에 넣어주면 됨

          2. global 명령어 사용

            1. global 변수 선언하면 가능

    3. lambda

      1. def 대신에 간결한 함수를 만들 때

        1. ex) add= lambda 매개변수1,2,...: 매개변수를 이용한 표현식

  2. 사용자 입력과 출력

    1. 입력

      1. input()함수

        1. 사용: 사용자의 입력값을 변수에 입력하고 싶을 때 사용

          1. 입력된 값은 문자이다!

          2. ex) a = input()

        2. 프롬프트에 질문띄우고 입력값 받기: input(‘질문내용’)

          1. ex) old = input(‘how old are you?’

    2. 출력

      1. print 자세히 알기

        1. 클따옴표로 둘러싸인 문자열은 +연산과 동일함

        2. 문자열 띄어쓰기는 콤마(,)로 함

        3. 한줄에 결괏값 입력: end 사용

          1. print(출력값, end=’ ‘)

  3. 파일 읽고 쓰기

    1. 파일 쓰기

      1. open함수 이용: 파일객체 = open(‘파일명’,’파일 열기모드’)

        1. ex) f= open(‘example.txt’,’w’) f.close() -> 결과값으로 파일이 생성

          1. f.close()는 파일을 닫아주는 역할 -> 생략가능

        2. 디렉토리 설정가능: open(‘C:/doit/새파일.txt’,’w’) 

        3. 열기모드(r,w,a)

          1. r: 읽을때만 

          2. w: 파일을 쓸때

          3. a: 새로운내용 추가

      2. 주의: 파일을 쓰기모드로 다시 실행한 경우 기존의 내용이 모두 사라지고 새로운 파일이 생성

      3. 쓰기예제

        1. f = open(‘example.txt’,’w’); for i in range(1,11): data = ‘%d line \n’ %i; f.write(data); f.close()

    2. 파일 읽기

      1. readline() 함수: 파일의 한줄을 읽어옴

        1. readline을 쓰는 경우 무한루프 안에서 한줄씩 읽어오다가 더이상 읽을 라인이 없으면 break

          1. while True: line=f.readline(); if not line: break; print(line)

      2. readlines() 함수: 여러줄을 불러옴

        1. readlines() 함수로 전체를 불러와서 lines 객체로 넣고 for문을 사용하여 line을 한줄씩 읽음

      3. read 함수 이용

        1. data= f.read(); print(data)

    3. 파일에 새로운 내용 추가하기

      1. ‘w’를 사용하면 새로 작성이기 때문에 문제가 생김 -> ‘a’로 수정만 하자!

        1. ex) f = open(‘example.txt’,’a’)

    4. with문과 함께 사용하기

      1. close()를 안 사용해도 된다는 장점

      2. 사용법

        1. with open(‘example.txt’,’w’) as f:

        2. 이하의 블록을 넘어가면 종료

출처: jump to python

'Python > 기초' 카테고리의 다른 글

Pandas 사용 함수  (0) 2022.04.22
각 type별 함수 사용  (0) 2022.04.19
파이썬 나아가기  (0) 2019.09.05
Python 제어문  (0) 2019.09.05
Python 기초 (특징과 데이터형)  (0) 2019.08.29

+ Recent posts