2022. 11. 8. 15:30ㆍPython
Doit Pandas
데이터 프레임 확인하기
이와 같은 데이터를 가진 gapminder.tsv 파일이 있다.
이 데이터를 분석할건데 먼저 tsv 파일에 대해 알아보자.
tsv 파일이란 데이터가 TAB(\t) 기준으로 정렬되어 있는 파일이다.
이를 데이터프레임으로 불러오려면
import pandas as pd
df = pd.read_csv("/Users/inho/inho_study/Python/doit_pandas-master/data/gapminder.tsv", sep='\t')
print(df)
pd.read_csv("파일경로", sep=(구분자)) 형태와 같이 사용해야한다.
데이터프레임을 출력해보면 이와 같은 결과가 나온다
1704개의 행과 6개의 열로 이루어진 데이터다.
print(df.head())
print(type(df))
.head() 메소드를 사용하면 상단의 5개의 행만 출력한다
또한 print(type(df))를 통해 df가 정말 DataFrame이 맞는지 확인할 수 있다.
따로 데이터를 보지 않고 행과 열의 크기를 확인할 때는 shape메소드를 사용한다
이번에는 tsv 파일에 어떤 정보가 들어있는지 확인해보자
print(df.columns)
위와 같이 데이터를 구성하는 열이름을 확인할 수 있다.
이 외에도 데이터프레임의 데이터 타입을 확인할 수 있는 dtypes 메소드와 info() 메소드도 존재한다.
열 데이터 추출하기
특정 열에 접근하여 그 열에 대한 정보를 추출해보자
나는 country 열에 대한 정보만 확인할 것이다
country_df = df['country']
print(country_df.head())
dtype 의 object는 판다스에서 String을 object 자료형으로 인식하기 때문이다.
head 메소드를 통해 상단 5개의 데이터만 확인하였다.
리스트에 열 이름을 전달하면 어러 개의 열을 한번에 추출 할 수 있다.
country_df = df[['country', 'continent', 'year']]
print(country_df.head())
이 때 주의할 점은 1개의 열을 추출할 경우 시리즈 자료형을 가지지만 2개 이상의 열을 추출할시 데이터프레임이다
또한 df[안에 리스트를 넣기] 괄호부분을 신경 쓰자
열에 대한 접근은 위와 같은 방식이다 행에 대한 접근은 어떻게 할까?
- 판다스에서는 인덱스를 행 번호라고 한다.
행 데이터 추출하기
- loc : 인덱스를 기준으로 행 데이터 추출
- iloc : 행 번호를 기준으로 행 데이터 추출
추출할 데이터의 행과 열을 지정하는 방법이 있는데, 두 속성 모두 추출할 데이터의 행을 먼저 지정하고 그 후에 열을 지정하는 방법이다.
즉 df.loc[[행],[열]]과 같은 방식으로 사용하면 된다. 아래 예제를 통해 자세히 알아보자.
print(df.loc[0])
0번 행의 경우 위와 같은 데이터를 가지고 있다는 것이다.
여러 행에 대한 정보를 알고 싶을 때는 loc 메소드 역시 리스트에 원하는 인덱스를 담아 전달해주면 된다.
print(df.loc[[0,5,10]])
하지만 loc 속성의 경우 존재하지 않는 인덱스 값을 사용하려 할 시 오류가 난다. 즉 df.loc[-1]은 오류 메세지가 나올 것이다.
그러면 가장 아래에 있는 인덱스에 접근을 하려면 df.shape[0]를 통해 -1을 해서 접근하기엔 너무 불편하지 않은가?
loc 속성은 데이터프레임의 인덱스를 사용하여 추출하지만 iloc 속성은 데이터 순서를 사용한다.
print(df.iloc[-1])
그렇기에 iloc[-1]을 통해 가장 아래에 있는 인덱스를 쉽게 추출할 수 있었다.
위와 같은 방식으로 행과 열의 데이터를 추출할 수 있다. 이를 활용하면 원하는 데이터만 추출하는 것에 큰 어려움이 없을 것이다.
df.loc[[행],[열]] 방식으로 코드를 작성해보면 어떨까?
print(df.loc[1:5, ['year', 'pop']])
#1~5번 행의 year pop 값만 출력
혹은 range 메소드를 이용해도 원하는 범위를 추출할 수 있다.
*range의 반환형은 정수리스트이기 때문에 가능하다
s_range = list(range(1, 4))
print(s_range)
print(df.iloc[:10, s_range])
즉 iloc 속성으로 0,99,999번째 행의 0,3,5 번째 열 데이터를 추출하기
print(df.iloc[[0,99,999],[0,3,5]])
기초적인 통계 계산하기
- lifeExp 열을 연도별로 그룹화하여 평균 계산하기
데이터를 year 열로 그룹화 -> lifeExp 열의 평균을 구하기
그룹화하는 메소드는 groupby이다.
df['year'].max() # 최대값
df['year'].min() # 최소값
df['year'].sum() # 토탈값
df['year'].count() # 건수
df['year'].var() # 분산값( 데이터의 퍼짐 정도를 수치로 나타낸것)
df['year'].std() # 표준편차 ( 분산값에 루트를 씌운값 )
print(df.groupby('year')['lifeExp'].mean())
'year' 별로 그룹화한다 -> 년도별로 데이터가 그룹화 되는데 'lifeExp 열의 .mean(평균)을 나타내는 코드이다.
lifeExp, gdpPercap 열의 평균값을 연도, 지역별로 그룹화하여 한번에 계산하기
print(df.groupby(['year','continent'])[['lifeExp','gdpPercap']].mean())
이와 같은 결과를 확인할 수 있다.
이번에는 그룹화한 데이터 개수 세기를 해보자
print(df.groupby('continent')['country'].nunique())
continent 속성의 데이터 빈도수를 nunique()메소드를 이용해 쉽게 계산할 수 있다.
기본 사용법
df.nunique(axis=0, dropna=True)
axis : 기준이 되는 축 입니다.
dropna : 결측치를 무시할지 여부 입니다. False일경우 하나의 요소로 간주합니다.
데이터 시각화
수백 줄의 텍스트만으로 이루어진 데이터를 읽어 통계를 계산하고 판단하는 것은 어렵다.
사람의 눈은 한번에 볼 수 있는 양이 정해져 있기 때문에 데이터 시각화가 필요하다.
데이터 분석에서 중요한 요소인 데이터 시각화는 matplotlib를 사용한다
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv("/Users/inho/inho_study/Python/doit_pandas-master/data/gapminder.tsv", sep='\t')
global_yeaerly_life_expectancy = df.groupby('year')['lifeExp'].mean()
global_yeaerly_life_expectancy.plot()
plt.show()
한번에 여러개 그래프 그리기
- Anscombe 데이터프레임의 dataset 열의 값이 I, II, III, IV 인 것을 불린 추출하여 dataset_1, 2, 3, 4에 저장
dataset_1 = anscombe[anscombe['dataset']=='I']
dataset_2 = anscombe[anscombe['dataset']=='II']
dataset_3 = anscombe[anscombe['dataset']=='III']
dataset_4 = anscombe[anscombe['dataset']=='IV']
fig = plt.figure() #그래프 격자가 위치할 기본 틀
axes1 = fig.add_subplot(2, 2, 1)
axes2 = fig.add_subplot(2, 2, 2)
axes3 = fig.add_subplot(2, 2 ,3)
axes4 = fig.add_subplot(2, 2, 4)
axes1.plot(dataset_1['x'], dataset_1['y'],'o')
axes2.plot(dataset_2['x'], dataset_2['y'],'o')
axes3.plot(dataset_3['x'], dataset_3['y'],'o')
axes4.plot(dataset_4['x'], dataset_4['y'],'o')
axes1.set_title('dataset_1')
axes2.set_title('dataset_2')
axes3.set_title('dataset_3')
axes4.set_title('dataset_4')
fig.suptitle("Anscombe Data")
fig.tight_layout() #그래프의 이름 숫자가 안겹치게 하는 메소드
plt.show()
'Python' 카테고리의 다른 글
Python - Pandas 2 (0) | 2023.01.06 |
---|---|
Python - 그래프 그리기 (0) | 2022.11.10 |
Python - 데이터 분석 3 (0) | 2022.06.16 |
Python - 데이터분석 2 (0) | 2022.06.15 |
Python - 데이터분석 1 (0) | 2022.06.15 |