728x90
반응형
#!/usr/bin/env python
# coding: utf-8
#13.숫자 데이터를 쉽게 다루게 돕는 numpy 라이브러리
# In[1]:
import matplotlib.pyplot as plt
import numpy as np
t = np.arange(0.,5.,0.2)
plt.plot(t,t,'r--',t,t**2,'bs',t,t**3,'g^')
plt.show()
# In[2]:
import matplotlib.pyplot as plt
t=[]
p2=[]
p3=[]
for i in range(0,50,2):
t.append(i/10)
p2.append((i/10)**2)
p3.append((i/10)**3)
plt.plot(t,t,'r--',t,p2,'bs',t,p3,'g^')
plt.show()
# In[3]:
import numpy
print(numpy.sqrt(2))
# In[4]:
import numpy as np
print(np.sqrt(2))
# In[5]:
import numpy as np
print(np.pi)
print(np.sin(0))
print(np.cos(np.pi))
# In[6]:
import numpy as np
a = np.random.rand(5)
print(a)
print(type(a))
# In[7]:
import numpy as np
print(np.random.choice(6,10))
# In[8]:
import numpy as np
print(np.random.choice(10,6,replace=False))
# In[9]:
import numpy as np
print(np.random.choice(6, 10, p=[0.1, 0.2, 0.3, 0.2, 0.1, 0.1]))
# In[10]:
import matplotlib.pyplot as plt
import numpy as np
dice = np.random.choice(6, 10)
plt.hist(dice, bins =6)
plt.show()
# In[11]:
import matplotlib.pyplot as plt
import random
dice = []
for i in range(10) :
dice.append(random.randint(1,6))
plt.hist(dice, bins = 6)
plt.show()
# In[16]:
import matplotlib.pyplot as plt
import numpy as np
dice = np.random.choice(6, 1000000, p=[0.1,0.2,0.3,0.2,0.1,0.1])
plt.hist(dice, bins=6) # 0, 1, 2, 3, 4, 5 중 랜덤으로 추출한 숫자를 히스토그램 표현
plt.show()
# In[24]:
import matplotlib.pyplot as plt
import random
x = []
y = []
size = []
for i in range(200) :
x.append(random.randint(10,100))
y.append(random.randint(10,100))
size.append(random.randint(10,100))
plt.scatter(x, y, s=size, c=x, cmap='jet', alpha=0.7)
plt.colorbar()
plt.show()
# In[25]:
import numpy as np
a = np.array([1,2,3,4])
print(a)
# In[26]:
import numpy as np
a = np.array([1,2,3,4])
print(a[1], a[-1]) # a의 1번 인덱스 값, -1번 인덱스 값 출력
print(a[1:]) # a의 1번 인덱스를 기준으로 슬라이싱 결과 출력
# In[28]:
import numpy as np
a = np.array([1,2,'3',4])
print(a)
# In[29]:
import numpy as np
a = np.zeros(10) # 0으로 이루어진 크기가 10인 배열 생성
print(a)
# In[30]:
import numpy as np
a = np.ones(10) # 1로 이루어진 크기가 10인 배열 생성
print(a)
# In[31]:
import numpy as np
a = np.eye(3) # 3행 x 3열의 단위 배열 생성
print(a)
# In[33]:
import numpy as np
a = np.eye(5) # 5행 x 5열의 단위 배열 생성
print(a)
# In[34]:
import numpy as np
print(np.arange(3)) # arange( ) 함수에 1개 값 입력
print(np.arange(3,7)) # arange( ) 함수에 2개 값 입력
print(np.arange(3,7,2)) # arange( ) 함수에 3개 값 입력
# In[35]:
import numpy as np
a = np.arange(1, 2, 0.1) # 1이상 2미만 구간에서 0.1 간격으로 실수 생성
b = np.linspace(1, 2, 11) # 1부터 2까지 11개 구간으로 나눈 실수 생성
print(a)
print(b)
# In[36]:
import numpy as np
a = np.arange(-np.pi, np.pi, np.pi/10)
b = np.linspace(-np.pi, np.pi, 20)
print(a)
print(b)
# In[37]:
import numpy as np
a = np.zeros(10) + 5
print(a)
# In[38]:
import numpy as np
a = np.linspace(1, 2, 11)
print(np.sqrt(a)) # a값의 제곱근을 출력함
# In[39]:
import matplotlib.pyplot as plt
import numpy as np
a = np.arange(-np.pi, np.pi, np.pi/100)
plt.plot(a, np.sin(a))
plt.show()
# In[40]:
import matplotlib.pyplot as plt
import numpy as np
a = np.arange(-np.pi, np.pi, np.pi/100)
plt.plot(a, np.sin(a))
plt.plot(a, np.cos(a))
plt.plot(a+np.pi/2, np.sin(a))
plt.show()
# In[41]:
import numpy as np
a = np.arange(-5, 5)
print(a)
# In[42]:
print(a<0)
# In[44]:
import numpy as np
a = np.arange(-5, 5)
print(a[a<0])
# In[45]:
mask1 = abs(a) > 3 #abs(a) > 3은 a 배열에 저장된 원소의 절대값이 3보다 크다
print(a[mask1])
# In[46]:
mask1 = abs(a) > 3
mask2 = abs(a) % 2 == 0
print(a[mask1+mask2]) # 둘 중 하나의 조건이라도 참일 경우
print(a[mask1*mask2]) # 두 가지 조건이 모두 참일 경우
# In[55]:
import matplotlib.pyplot as plt
import numpy as np
x = np.random.randint(-100, 100, 1000) # 1000개의 랜덤 값 추출
y = np.random.randint(-100, 100, 1000) # 1000개의 랜덤 값 추출
size = np.random.rand(100) * 100
mask1 = abs(x) > 50 # x에 저장된 값 중 절댓값이 50보다 큰 값 걸러 냄
mask2 = abs(y) > 50 # y에 저장된 값 중 절댓값이 50보다 큰 값 걸러 냄
x = x[mask1+mask2] # mask1과 mask2 중 하나라도 만족하는 값 저장
y = y[mask1+mask2] # mask1과 mask2 중 하나라도 만족하는 값 저장
size = np.random.rand(len(x)) * 100
plt.scatter(x, y, s=size, c=x, cmap='jet', alpha=0.7)
plt.colorbar()
plt.show()
#!/usr/bin/env python
# coding: utf-8
# In[1]:
# 14.numpy를 활용한 나만의 프로젝트 만들기
# In[2]:
#전국에서 영유아들이 가장 많이 사는 지역은 어디일까?
#보통 학군이 좋다고 알려진 지역에는 청소년들이 많이 살까?
#광역시 데이터를 10년 단위로 살펴보면 청년 비율이 줄고 있다는 사실을 알 수 있을까?
#서울에서 지난 5년간 인구가 가장 많이 증가한 구는 어디일까?
#우리 동네의 인구 구조와 가장 비슷한 동네는 어디일까?
# In[3]:
#전국에서 신도림동의 연령별 인구 구조와 가장 형태가 비슷한 지역은 어디일까?
#1.데이터를 읽어온다.
#2.궁금한 지역의 이름을 입력받는다.
#3.궁금한 지역의 인구 구조를 저장한다.
#4.궁금한 지역의 인구 구조와 가장 비슷한 인구 구조를 가진 지역을 찾는다.
#5.가장 비슷한 곳의 인구 구조와 궁금한 지역의 인구 구조를 시각화한다.
# In[4]:
#1.데이터를 읽어온다.
import csv
f = open('age.csv', 'r', encoding='utf8')
data = csv.reader(f)
for row in data :
print(row)
# In[5]:
#1.데이터를 읽어온다.
import csv
f = open('age.csv', 'r', encoding='utf8')
data = csv.reader(f)
next(data) #데이터 처리에 불필요한 헤더 부분 제외
for row in data :
print(row)
# In[12]:
#2.궁금한 지역의 이름을 입력받는다.
#3.궁금한 지역의 인구 구조를 저장한다.
import csv
f = open('age.csv', 'r', encoding='utf8')
data = csv.reader(f)
next(data) #데이터 처리에 불필요한 헤더 부분 제외
home=[] #입력받은 지역의 데이터를 저장할 리스트 생성
name = input('인구 구조가 알고 싶은 지역의 이름(읍면동 단위)을 입력해주세요 : ')
for row in data :
if name in row[1]: #입력받은 지역의 이름이 포함된 행 찾기
for i in row[4:] : #4번 인덱스 값부터 슬라이싱
home.append(int(i)) #입력받은 지역의 데이터를 home에 저장
print(home) #home에 저장된 데이터 출력
# In[16]:
import numpy as np
import csv
f=open('age.csv', 'r', encoding='utf8')
data=csv.reader(f)
next(data)
name = input('인구 구조가 알고 싶은 지역의 이름(읍면동 단위)을 입력해주세요 : ')
for row in data :
if name in row[1]:
home=np.array(row[4:], dtype=int)
print(home)
# In[18]:
import numpy as np
import matplotlib.pyplot as plt
import csv
f=open('age.csv', 'r', encoding='utf8')
data=csv.reader(f)
next(data)
name = input('인구 구조가 알고 싶은 지역의 이름(읍면동 단위)을 입력해주세요 : ')
for row in data :
if name in row[1]:
home=np.array(row[4:], dtype=int)
plt.rc('font', family='AppleGothic')
plt.title(name+' 지역의 인구 구조')
plt.plot(home)
plt.show()
# In[22]:
#4.궁금한 지역의 인구 구조와 가장 비슷한 인구 구조를 가진 지역을 찾는다.
#1)전국의 모든 지역 중 한 곳(B)을 선택한다.
#2)궁금한 지역 A의 0세 인구수에서 B의 0세 인구수를 뺀다.
#3) 2)를 100세 이상 인구수에 해당하는 값까지 반복한 후 각각의 차이를 모두 더한다.
#4)전국의 모든 지역에 대해 반복하며 그 차이가 가장 작은 지역을 찾는다.
import numpy as np
import matplotlib.pyplot as plt
import csv
f=open('age.csv', 'r', encoding='utf8')
data=csv.reader(f)
next(data)
data=list(data)
name = input('인구 구조가 알고 싶은 지역의 이름(읍면동 단위)을 입력해주세요 : ')
for row in data :
if name in row[1]:
home=np.array(row[4:], dtype=int)/int(row[3])#사용자로부터 입력받은 지역의 연령대별 인구 비율을 home에 저장하는 코드
for row in data:
away=np.array(row[4:], dtype=int)/int(row[3])#다른 동네의 인구 비율을 away에 저장하는 것
print(home - away) #home에 저장된 인구 비율과 away에 저장된 값의 차를 출력
plt.rc('font', family='AppleGothic')
plt.title(name+' 지역의 인구 구조')
plt.plot(home)
plt.show()
# In[23]:
#4.궁금한 지역의 인구 구조와 가장 비슷한 인구 구조를 가진 지역을 찾는다.
#1)전국의 모든 지역 중 한 곳(B)을 선택한다.
#2)궁금한 지역 A의 0세 인구수에서 B의 0세 인구수를 뺀다.
#3) 2)를 100세 이상 인구수에 해당하는 값까지 반복한 후 각각의 차이를 모두 더한다.
#4)전국의 모든 지역에 대해 반복하며 그 차이가 가장 작은 지역을 찾는다.
import numpy as np
import matplotlib.pyplot as plt
import csv
f=open('age.csv', 'r', encoding='utf8')
data=csv.reader(f)
next(data)
data=list(data)
name = input('인구 구조가 알고 싶은 지역의 이름(읍면동 단위)을 입력해주세요 : ')
for row in data :
if name in row[1]:
home=np.array(row[4:], dtype=int)/int(row[3])#사용자로부터 입력받은 지역의 연령대별 인구 비율을 home에 저장하는 코드
for row in data:
away=np.array(row[4:], dtype=int)/int(row[3])#다른 동네의 인구 비율을 away에 저장하는 것
print(np.sum(home - away)) #home에 저장된 인구 비율과 away에 저장된 값의 차를 출력
plt.rc('font', family='AppleGothic')
plt.title(name+' 지역의 인구 구조')
plt.plot(home)
plt.show()
# In[31]:
#전국에서 신도림동의 연령별 인구 구조와 가장 형태가 비슷한 지역은 어디일까?
#1.데이터를 읽어온다.
import numpy as np
import matplotlib.pyplot as plt
import csv
f=open('age.csv', 'r', encoding='utf8')
data=csv.reader(f)
next(data)
data=list(data)
#2.궁금한 지역의 이름을 입력받는다.
name = input('인구 구조가 알고 싶은 지역의 이름(읍면동 단위)을 입력해주세요 : ')
mn=1 #최솟값을 저장할 변수 생성 및 초기화
result_name='' #최솟값을 갖는 지역의 이름을 저장할 변수 생성 및 초기화
result=0 #최솟값을 갖는 지역의 연령대별 인구 비율을 저장할 배열 생성 및 초기화
#3.궁금한 지역의 인구 구조를 저장한다.
for row in data :
if name in row[1]:
home=np.array(row[4:], dtype=int)/int(row[3])#사용자로부터 입력받은 지역의 연령대별 인구 비율을 home에 저장하는 코드
#4.궁금한 지역의 인구 구조와 가장 비슷한 인구 구조를 가진 지역을 찾는다.
for row in data:
away=np.array(row[4:], dtype=int)/int(row[3])#다른 동네의 인구 비율을 away에 저장하는 것
s=np.sum((home-away)**2) #home에 저장된 값과 away에 저장된 값의 차이의 합을 계산
if s < mn and name not in row[1] : #if 조건문 안에서는 위에서 계산한 합이 최솟값인지 확인
#not in 연산을 사용하여, 입력받은 이름과 같은 이름이 아닌 데이터 중에서 최솟값을 찾
#전국에서 인구 구조가 완전히 똑같은 지역은 없을 것이라고 가정하면 if 0 < s < mn : 와 같이 코드를 작성할 수도 있음
mn = s #만약 최솟값이라면 변수 mn의 값을 갱신
result_name=row[0]
result=away
#5.가장 비슷한 곳의 인구 구조와 궁금한 지역의 인구 구조를 시각화한다.
plt.rc('font', family='AppleGothic')
plt.title(name+' 지역과 가장 비슷한 인구 구조를 가진 지역')
plt.plot(home, label=name) #home 값을 그리는 그래프 레이블 설정
plt.plot(result, label=result_name) #result 값을 그리는 그래프 레이블 설정
plt.legend() #범례표기
plt.show()
#!/usr/bin/env python
# coding: utf-8
# In[1]:
#15.테이블 형태의 데이터를 쉽게 다루도록 도와주는 pandas 라이브러리
#국가별 하계 및 동계 올림픽 메달 획득 결과표
import pandas as pd
df = pd.read_html('https://en.wikipedia.org/wiki/All-time_Olympic_Games_medal_table')
print(df)
# In[16]:
#국가별 하계 및 동계 올림픽 메달 획득 결과표
import pandas as pd
df = pd.read_html('https://en.wikipedia.org/wiki/All-time_Olympic_Games_medal_table',header=0,index_col=0) #맨 위의 헤더를 열 이름으로 정하고, 나라 이름을 인덱스 이름 적용
# 데이터 중 하계올림픽에 대한 데이터만 추출
summer = df[1].iloc[:,:5]
summer.columns=['경기수','금','은','동','계']
print(summer.sort_values('금', ascending=False)) #sort_values에서 ascending 속성을 변경함으로써 정렬
#만약 오름차순으로 정렬하고 싶으면 False를 True 변경
summer.to_excel('하계올림픽메달.xlsx')
# In[17]:
#pandas는 panel datas(패널 자료)의 약자
#1차원 배열 형태의 데이터 구조를 Series라고 부르고, 2차원 배열 형태의 데이터 구조를 DataFrame
#2차원 배열 형태의 데이터 프레임은 행과 열이 있고, 행을 구분해주는 인덱스(index)와 열을 구분해주는 컬럼(column)이 있음
#별도로 지정해주지 않으면 인덱스는 리스트처럼 정수로 설정이 되고 한 번 설정된 인덱스는 변경되지 않음
# In[19]:
import pandas as pd
index = pd.date_range('1/1/2000', periods=8)
print(index)
# In[20]:
import numpy as np
df = pd.DataFrame(np.random.rand(8,3), index=index, columns=list('ABC'))
df
# In[21]:
#B라는 이름의 특정 열을 선택하였더니,
#날짜로 이루어진 인덱스와 1차원 배열 형태(시리즈 형태)로 값이 출력되는 것을 확인
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['B'])
# In[22]:
#B 열의 데이터가 0.4보다 큰 지 확인하는 조건
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['B']>0.4)
# In[23]:
#B열의 값이 0.4보다 큰 값이라는 조건이 True인 데이터들로만 이루어진 데이터 프레임
#T는 행과 열을 바꾼다는 의미의 단어 transpose를 의미
#행 방향 축을 기준으로 한 연산
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'] #A열의 값을 B열의 값으로 나눈 값을 D열에 저장
df
# In[26]:
#열 방향 축을 기준으로 계산
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() #head() 함수는 많은 데이터 중 처음 5개의 데이터만 확인하고 싶을 때 사용하는 함수
# In[28]:
#전체 데이터를 A열의 값으로 뺄 때는 sub() 함수를 사용
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.sub(df['A'],axis=0) #A열의 데이터를 기준으로 열 우선 계산
df.head()
# In[29]:
#데이터 전체를 C열 값으로 나눌 때는 div() 함수를 사용
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.sub(df['A'],axis=0)
df=df.div(df['C'],axis=0) #C열 데이터를 기준으로 열 우선 계산
df.to_csv('test.csv') #데이터 프레임을 test.csv 파일로 저장
df.head()
# In[46]:
#1 | 데이터를 읽어온다.
#➊ 전체 데이터를 총 인구수로 나누어 비율로 변환한다.
#➋ 총인구수와 연령구간인구수를 삭제한다.
#2 | 궁금한 지역의 이름을 입력받는다.
#3 | 궁금한 지역의 인구 구조를 저장한다.
#4 | 궁금한 지역의 인구 구조와 가장 비슷한 인구 구조를 가진 지역을 찾는다.
#➊ 전국의 모든 지역 중 한 곳(B)을 선택한다.
#➋ 궁금한 지역 A의 0세 인구 비율에서 B의 0세 인구 비율을 뺀다.
#➌ ➋를 100세 이상 인구수에 해당하는 값까지 반복한 후 차이의 제곱을 모두 더한다.
#➍ 전국의 모든 지역에 대해 반복하며 그 차이가 가장 작은 지역을 찾는다.
#5 | 가장 비슷한 곳의 인구 구조와 궁금한 지역의 인구 구조를 시각화한다.
import pandas as pd
df = pd.read_csv('age.csv', encoding='utf8', index_col=1)
df = df.div(df['총 인구수'], axis=0) # 1 │ ➊ 전체 데이터를 총인구수로 나눠서 비율로 변환
del df['행정기관코드'], df['총 인구수'], df['연령구간인구수'] # 1 │ ➋ 총인구수, 연령구간인구수 열 삭제
name = input('원하는 지역의 이름을 입력해주세요 : ') # 2 │ 지역 이름 입력
a = df.index.str.contains(name) # 3 │ 해당 행을 찾아서 해당 지역의 인구 구조를 저장
df2 = df[a]
import numpy as np
# 4 │ ➊ 궁금한 지역 A의 인구 비율에서 B의 인구 비율을 뺀다.
x = df.sub(df2.iloc[0], axis=1) #iloc - 행 번호를 기준으로 행 데이터 읽기
# 4 │ ➋ A의 인구 비율에서 B의 인구 비율을 뺀 값의 제곱 값을 모두 더한다.
y = np.power(x, 2)
z = y.sum(axis=1)
i = z.sort_values().index[:5] # 4 │ ➌ 그 차이가 가장 작은 지역 5곳을 찾는다.
import matplotlib.pyplot as plt
plt.rc('font', family='AppleGothic')
df.loc[i].T.plot() # 4 │ ➍ 결과를 꺾은선 그래프로 보여준다.
plt.show()
# In[23]:
#1 | 데이터를 읽어온다.
#➊ 전체 데이터를 총 인구수로 나누어 비율로 변환한다.
#➋ 총인구수와 연령구간인구수를 삭제한다.
#2 | 궁금한 지역의 이름을 입력받는다.
#3 | 궁금한 지역의 인구 구조를 저장한다.
#4 | 궁금한 지역의 인구 구조와 가장 비슷한 인구 구조를 가진 지역을 찾는다.
#➊ 전국의 모든 지역 중 한 곳(B)을 선택한다.
#➋ 궁금한 지역 A의 0세 인구 비율에서 B의 0세 인구 비율을 뺀다.
#➌ ➋를 100세 이상 인구수에 해당하는 값까지 반복한 후 차이의 제곱을 모두 더한다.
#➍ 전국의 모든 지역에 대해 반복하며 그 차이가 가장 작은 지역을 찾는다.
#5 | 가장 비슷한 곳의 인구 구조와 궁금한 지역의 인구 구조를 시각화한다.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rc('font', family='AppleGothic')
df = pd.read_csv('age.csv', encoding='utf8', index_col=1)
df = df.div(df['총 인구수'], axis=0) # 1 │ ➊ 전체 데이터를 총인구수로 나눠서 비율로 변환
del df['행정기관코드'], df['총 인구수'], df['연령구간인구수'] # 1 │ ➋ 총인구수, 연령구간인구수 열 삭제
name = input('원하는 지역의 이름을 입력해주세요 : ') # 2 │ 지역 이름 입력
a = df.index.str.contains(name) # 3 │ 해당 행을 찾아서 해당 지역의 인구 구조를 저장
df2 = df[a]
# 4 │ 궁금한 지역의 인구 구조와 가장 비슷한 인구 구조를 가진 지역 찾기
df.loc[np.power(df.sub(df2.iloc[0], axis=1), 2).sum(axis=1).sort_values().index[:6]].T.plot()
plt.show()728x90
반응형
'Data Analysis > Data Analysis' 카테고리의 다른 글
| Python 데이터분석과 이미치 처리 : 행렬의 필요성 (0) | 2022.04.03 |
|---|---|
| Python 데이터분석과 이미치 처리 : 기본 (0) | 2022.04.03 |
| 모두의 데이터분석 with 파이썬 : 4. 대중교통 데이터 프로젝트 (0) | 2022.04.03 |
| 모두의 데이터분석 with 파이썬 : 3. 인구 공공데이터 (0) | 2022.04.03 |
| 모두의 데이터분석 with 파이썬 : 2. 데이터 시각화 기초 (0) | 2022.04.03 |
댓글