AI 기본 과정

Python을 이용한 데이터 분석 - Pandas

넝구리 2022. 5. 10. 21:21

ICT이노베이션스퀘어 AI기본과정(CNU) 교육을 듣고 정리한 내용입니다.

AI기본과정(CNU) 교육 자료를 참고하였습니다.


Python 데이터 분석 라이브러리

 

pandas 라이브러리

 

1.  환율 데이터

 

검색창에 "환율" 입력

 

환율 관련 페이지 URL 데이터 불러오기

import pandas as pd

URL = "https://search.naver.com/search.naver?sm=tab_hty.top&where=nexearch&query=%ED%99%98%EC%9C%A8&oquery=%ED%99%98%EC%9C%A8%EC%A1%B0%ED%9A%8C&tqi=hFoOGsprvTossQC1cqKssssstW4-388307"

df = pd.read_html(URL)
print(df)

 

0번 인덱스에 저장된 내용 출력

import pandas as pd

URL = "https://search.naver.com/search.naver?sm=tab_hty.top&where=nexearch&query=%ED%99%98%EC%9C%A8&oquery=%ED%99%98%EC%9C%A8%EC%A1%B0%ED%9A%8C&tqi=hFoOGsprvTossQC1cqKssssstW4-388307"

df = pd.read_html(URL)
df[0]

 

 

2. pandas란?

 

  • pandas : panel datas의 약자로, 파이썬을 활용한 데이터 분석에서 가장 많이 활용됨
  • Series : 1차원 배열 형태의 데이터 구조
                   
  • DataFrame : 2차원 배열 형태의 데이터 구조
         
         
         
         
         

 

 

3. 데이터 프레임 기초

 

DataFrame

  • 행과 열로 구분
  • 행을 구분해주는 인덱스, 열을 구분해주는 컬럼이 있음
  • 인덱스는 별도로 지정을 하지 않으면 정수로 지정(한번 설정된 인덱스는 불변)

 

인덱스 만들기(날짜 형태로 된 8개의 인덱스)

import pandas as pd

index = pd.date_range("1/1/2000", periods = 8)
print(index)

 

8행 3열의 랜덤 데이터에 인덱스, 컬럼 이름이 설정된 데이터 프레임 생성

import pandas as pd
import numpy as np

index = pd.date_range("1/1/2000", periods = 8)
df = pd.DataFrame(np.random.rand(8,3), index = index, columns = list("ABC"))

df

 

특정 열("C")에 접근하기

import pandas as pd
import numpy as np

index = pd.date_range("1/1/2000", periods = 8)
df = pd.DataFrame(np.random.rand(8,3), index = index, columns = list("ABC"))

print(df["C"])     # 특정 열만 출력

 

특정 열("C")에 마스크 생성하기

import pandas as pd
import numpy as np

index = pd.date_range("1/1/2000", periods = 8)
df = pd.DataFrame(np.random.rand(8,3), index = index, columns = list("ABC"))

print(df["C"] > 0.5)     # 마스크 생성

 

데이터 프레임으로 저장하기

import pandas as pd
import numpy as np

index = pd.date_range("1/1/2000", periods = 8)
df = pd.DataFrame(np.random.rand(8,3), index = index, columns = list("ABC"))

df2 = df[df["C"] > 0.5]     # 마스크가 적용된 결과를 데이터 프레임으로 저장
df2

 

데이터 프레임의 행과 열 바꿔주기

import pandas as pd
import numpy as np

index = pd.date_range("1/1/2000", periods = 8)
df = pd.DataFrame(np.random.rand(8,3), index = index, columns = list("ABC"))

df2 = df[df["C"] > 0.5]
df2.T     # 행과 열 바꿔주기

 

A열을 B열로 나눈 결과로 D열 만들기

import pandas as pd
import numpy as np

index = pd.date_range("1/1/2000", periods = 8)
df = pd.DataFrame(np.random.rand(8,3), index = index, columns = list("ABC"))

df["D"] = df["A"] / df["B"]     # D열 생성
df

 

A열부터 D열까지 더한 결과로 E열 만들기

import pandas as pd
import numpy as np

index = pd.date_range("1/1/2000", periods = 8)
df = pd.DataFrame(np.random.rand(8,3), index = index, columns = list("ABC"))

df["D"] = df["A"] / df["B"]
df["E"] = np.sum(df, axis = 1)     # E열 생성

df.head()

# axis = 0 : 결과가 행으로 나타남, axis = 1 : 결과가 열로 나타남

 

모든 값을 C열의 값으로 나눈 후 csv 파일로 저장하기

import pandas as pd
import numpy as np

index = pd.date_range("1/1/2000", periods = 8)
df = pd.DataFrame(np.random.rand(8,3), index = index, columns = list("ABC"))

df["D"] = df["A"] / df["B"]    
df["E"] = np.sum(df, axis = 1)     

df = df.div(df["C"], axis = 0)     # 모든 값을 C열의 값으로 나눔

df.to_csv("test.csv")     # csv 파일로 저장

df.head()

 

 

4. pandas로 인구 구조 분석하기

 

age2.csv
1.42MB

 

데이터 읽어오기

import pandas as pd

df = pd.read_csv("C:/Users/82109/OneDrive/바탕 화면/age2.csv", encoding = "cp949", index_col = 0)
df.head()

 

전체 데이터를 비율로 변환한 후 총 인구 수, 연령구간 인구 수 열 삭제하기

import pandas as pd

df = pd.read_csv("C:/Users/82109/OneDrive/바탕 화면/age2.csv", encoding = "cp949", index_col = 0)

df = df.div(df["총인구수"], axis = 0)     # 전체 데이터를 총인구수로 나눠 비율로 변환
del df["총인구수"], df["연령구간인구수"]     # 총인구수, 연령구간인구수 열 삭제

 

궁금한 지역명을 입력받고 해당 지역의 인구 구조 저장하기

import pandas as pd

df = pd.read_csv("C:/Users/82109/OneDrive/바탕 화면/age2.csv", encoding = "cp949", index_col = 0)

df = df.div(df["총인구수"], axis = 0)     # 전체 데이터를 총인구수로 나눠 비율로 변환
del df["총인구수"], df["연령구간인구수"]     # 총인구수, 연령구간인구수 열 삭제

name = input("지역명을 입력하세요:")

a = df.index.str.contains(name)     # 해당 행을 찾아서 해당 지역의 인구 구조 저장

df2 = df[a]

 

그래프로 시각화하기

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("C:/Users/82109/OneDrive/바탕 화면/age2.csv", encoding = "cp949", index_col = 0)

df = df.div(df["총인구수"], axis = 0)     
del df["총인구수"], df["연령구간인구수"]     

name = input("지역명을 입력하세요:")

a = df.index.str.contains(name)    
df2 = df[a]

plt.rc("font", family = "Malgun Gothic")
df2.T.plot()
plt.show()

 

궁금한 지역과 비슷한 인구 구조를 가진 지역 간의 비율 차이 계산하기

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

df = pd.read_csv("C:/Users/82109/OneDrive/바탕 화면/age2.csv", encoding = "cp949", index_col = 0)

df = df.div(df["총인구수"], axis = 0)     
del df["총인구수"], df["연령구간인구수"]     

name = input("지역명을 입력하세요:")

a = df.index.str.contains(name)    
df2 = df[a]

# 다른 지역의 인구 비율과 궁금한 지역의 인구 비율 간의 차
x = df.sub(df2.iloc[0], axis = 1)     # iloc[0] : 첫 번째 행 접근

# 다른 지역의 인구 비율과 궁금한 지역의 인구 비율 간의 차의 제곱 
y = np.power(x, 2)     # power(x, 2) : x ** 2

# 다른 지역의 인구 비율과 궁금한 지역의 인구 비율 간의 차의 제곱의 합
z = y.sum(axis = 1)     # 결과가 열로 출력
z

 

비율의 차이가 가장 적은 상위 5개 지역 시각화하기

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

df = pd.read_csv("C:/Users/82109/OneDrive/바탕 화면/age2.csv", encoding = "cp949", index_col = 0)

df = df.div(df["총인구수"], axis = 0)     
del df["총인구수"], df["연령구간인구수"]     

name = input("지역명을 입력하세요:")

a = df.index.str.contains(name)    
df2 = df[a]

x = df.sub(df2.iloc[0], axis = 1)    
y = np.power(x, 2)   
z = y.sum(axis = 1)    
i = z.sort_values().index[:5]     # z를 오름차순으로 정렬하여 상위 5개를 i에 저장

plt.rc("font", family = "Malgun Gothic")
df.loc[i].T.plot()     # loc[i] : 레이블 이름이 i인 행에 접근
plt.show()