본문 바로가기
Data Analysis/Data Analysis

모두의 데이터분석 with 파이썬 : 5. 파이썬 데이터 분석 라이브러리를 활용한 프로젝트

by SeleniumBindingProtein 2022. 4. 3.
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
반응형

댓글