총 21문제(기본기 체크용)
문제 6번을 통해 Boolean indexing에 대해 이해도를 높일 수 있었다. (** np.array)
문제 7번 - 단위 행렬과 정방 단위 행렬은 길이의 차이 인것 같다.
문제 10번 - 헷갈릴 수 있었던 axis 축 설정도 무리 없이 풀었다.
문제 21번 - np.random.randint 에는 복원추출에 대한 요소가 없다. 하지만, np.random.choice()를 활용하여 안에서 바로 범위를 잡고, 복원추출 유무도 설정 할 수 있다.
________________________________________________________________________________________________________________
[문제] BMI 지수 계산 및 과체중 이상인 BMI 값 확인
10명에 대한 키와 몸무게가 들어있는 'height_weight.txt'를 읽어 각 사람별 BMI 지수를 구하고 비만 전단계 이상인 BMI 값 확인하기
BMI 지수 = 몸무게(kg) / 키(M)의 제곱
체질량지수의 범위 값에 따른 비만도 값 지정
18.5 미만 ▶ 저체중 / 18.5 ~ 22.9 ▶ 정상 / 23 ~ 24.9 ▶ 비만 전단계 / 25 ~ 29 ▶ 1단계 비만 / 30 ~ 34.9 ▶ 2단계 비만 /35이상 ▶ 고도비만
#Numpy 배열 출력 형식 변경
np.set_printoptions(precision=3, suppress= True ) # 소수점 이하 3 자리 축소해서
-------------------------------------------------------------------------------------
import numpy as np
data = np.loadtxt('height_weight.txt',delimiter= ',') # 텍스트 파일 읽는 delimiter= 구분자
height = data[0]*0.01
weight = data[1]
result = weight / (height**2)
print(result[result >= 23])
# [27.07 25.861 24.207 23.144 23.62 25.592]
# res = result>=23 :동일 결과
# print(result[res])
weight = data[1]
squared_height = (data[0]*0.01)**2
BMI = weight/ squared_height # np.divide(weight,squared_height)
print(BMI[BMI >= 23])
print(BMI[np.logical_and(BMI>=23,BMI <25)]) # 비만 전단계에만 해당 되는
[문제] 국가건강검진 혈압혈당 데이터 분석
'국가건강검진_혈압혈당데이터.csv' 파일 내용을 읽기 <data = np.loadtxt("국가건강검진_혈압혈당데이터.csv", delimiter=",", dtype=np.float, skiprows=1)>
성별: 1(남자), 2(여자)
연령그룹: 1(20-24), 2(25-26),...25-74세까지 2살 간격으로 1개 그룹으로 지정, 27(74세 이상)
고혈압 당뇨병 진료여부: 1(고혈압 및 당뇨진료내역 있음), 2(고혈압 진료내역 있음), 3(당뇨 진료내역 있음), 4(고혈압 및 당뇨 진료내역 없음)
정상혈압: 수축기 혈압 120nnHg 미만, 확장기 혈압 80mmHg 미만
공복혈당 수치: 126 mg/dL 이상 -> 당뇨병, 100mg/dL-> 정상
전체 레코드 수와 상위 5개 데이터 확인
데이터 모양 확인
여성과 남성의 데이터 수 확인
여성과 남성의 수축기혈압과 이완기혈압의 평균값 확인
정상 혈압 남자 및 여자 수 확인
당뇨병 질환(공복혈당 수치 126mg/dL 이상)을 가지고 있는 사람들의 평균 체질량지수
data = np.loadtxt("국가건강검진_혈압혈당데이터.csv", delimiter=",", dtype=np.float32, skiprows=1)
# 첫 번째 행 생략
data = np.array(data)
print(data.shape) # 전체 레코드 수 (1000000, 7)
print(data[:5]) # 상위 5개 데이터 확인
# 여성과 남성의 데이터 수 확인
print(f"남성 데이터 수 : {np.sum(data[:,0] == 1):,} 개")
print(f"여성 데이터 수 : {np.sum(data[:,0] == 2):,} 개")
# 여성과 남성의 수축기 혈압과 이완기 혈압의 평균값 확인
# 수축기 혈압 = sbp, 이완기 혈압 = dbp
male_data = data[data[:,0] == 1]
female_data = data[data[:,0] == 2]
male_sbp_mean = np.mean(male_data[:,2])
print(f"남성의 수축기평균 혈압 {male_sbp_mean:.2f}")
male_dbp_mean = np.mean(male_data[:,3])
print(f"남성의 이완기평균 혈압 {male_dbp_mean:.2f}")
print('-'* 30)
female_sbp_mean = np.mean(female_data[:,2])
print(f"여성의 수축기평균 혈압 {female_sbp_mean:.2f}")
female_dbp_mean = np.mean(female_data[:,3])
print(f"여성의 이완기평균 혈압 {female_dbp_mean:.2f}")
# 정상 혈압 남자 및 여자 수 확인
nbp_masking = np.logical_and(data[:,2] < 120, data[:,3] < 80)
nbp = data[nbp_masking]
print(f"정상 혈압 남성 수: {len(nbp[nbp[:,0]==1]):,}명")
# print(f"정상 혈압 남성 수: {np.sum(nbp[:,0]==1):,}명") 마스킹 값만 가져온 것
print(f"정상 혈압 여성 수: {len(nbp[nbp[:,0]==2]):,}명")
# 당뇨병 질환을 가지고 있는 사람들의 평균 체질량지수
disease = data[data[:,4]>126]
print("평균 체질량 지수:",np.mean(disease[:,6]))
첫 번째 행을 생략하는 이유는 표의 제목이기 때문이다.
나는 해당 문제를 풀때 2와 3을 같이 묶어 평균을 내어 값이 이상하게 나왔던 것이다.
[문제] 시에틀 강수량 데이터 분석
'Seattle2014.csv' 파일 내용 읽기
강수량('PRCP')이 많은 날 상위 10일 확인
1월 강수량만 출력
1월에 내린 강수량의 합, 평균강수량 확인
1년동안 강수량이 40미만으로 내린 날이 몇일인가?
data = np.loadtxt("Seattle2014.csv", delimiter=",", dtype=object, skiprows=1)
# 첫 번째 행 생략
print(data.shape)
print(data[:5])
# 강수량('PRCP')이 많은 날 상위 10일 확인
prcp_data = data[:,3].astype(np.int32)
a = np.sort(prcp_data)[::-1]
print(a[:10])
print('-'*30)
print('날짜와 함께')
prcp_data = data[:, [2,3]].astype(int)
sorted_idx = prcp_data[:,1].argsort() # 강수량 정보 기준 오름차순 정렬된 인덱스
print(prcp_data[sorted_idx][::-1][:10])
# 1월 강수량만 출력
# 1)
prcp_data = data[:, [2,3]].astype(int)
jan_prcp = prcp_data[prcp_data[:,0]< 20140201]
print(jan_prcp[:,1])
print('='*30)
# 2) 월 정보만 빼서
prcp_data = data[:, [2,3]].astype(int)
prcp_data[:,0] = (prcp_data[:,0] - 20140000)//100
jan_prcp = prcp_data[prcp_data[:,0]==1]
print(jan_prcp[:,1])
print('='*30)
# 3)
prcp_data = data[:, [2,3]] # 문자형태 그대로
prcp_data = np.array([ [date[4:6], prcp ] for date, prcp in prcp_data])
jan_prcp = prcp_data[prcp_data[:,0] == '01'][:,1].astype(int)
print(jan_prcp)
# 1월에 내린 강수량의 합, 평균강수량 확인
print(f'1월 강수량 총 합: {np.sum((jan_prcp))}, 1월 강수량 평균: {np.mean(jan_prcp):.2f}')
# 1년동안 강수량이 40미만으로 내린 날이 몇일인가?
prcp_data = data[: ,3].astype(int) # 문자형태 그대로
under_40 = prcp_data[prcp_data<40]
print(f'강수량 40미만: {under_40.size}')
dtype=object 라고 설정하여 문자열을 읽어온다.
상위 10개를 출력할때 (이 코드는 날짜와 함께 강수량을 출력한다.) 'prcp_data[sorted_idx][::-1][:10]' 이 방법을 몰라서 정말 많이 헤맸다..
1월 강수량을 출력하는 방법으로는 세가지 방법이 존재하며, 그 중 내가 한 방법은 1번으로 가장 원초적인 방법이다.
[문제] 영화 평점 분석
'ratings.dat' 파일 내용 읽기 (데이터 형식: user_id::item_id::rating::timestamp)
상위 10개 데이터 출력하기
데이터 정보 확인(크기, 차원)
전체 데이터 평점 구하기
사용자 아이디 1인 데이터 출력하기
사용자 아이디 1인 사람의 평점 평균 구하기
각 사용자별 평점 구하기 (사용자 ID 수집: ID컬럼에 대한 np.unique() 함수 적용)
각 사용자별 평균 평점이 4점 이상인 사용자 및 인원수 구하기
data = np.loadtxt('ratings.dat', delimiter=':', dtype=np.int64)
# 첫 번째 행 생략
print(data.shape)
print(data[:10])
# 전체 데이터 평점 평균 구하기
rate = data[:,2]
print(f'전체 사용자 평균 평점 : {np.mean(rate):.2f}')
# 사용자 아이디 1인 데이터 출력하기
user_id_1 = data[data[:,0] == 1]
print(user_id_1[:10])
# 사용자 아이디 1인 사람의 평점 평균 구하기
print(f'사용자가 1인 사람의 평점 평균: {np.mean(user_id_1[:,2]):.2f}')
# 각 사용자별 평점 구하기 (사용자 ID 수집: ID컬럼에 대한 np.unique() 함수 적용)
user_ids = np.unique(data[:,0])
print(f'전체 사용자 수: {user_ids.size:,}명')
user_avg_rating = [[id, np.mean(data[data[:,0] == id ][:,2])] for id in user_ids ]
for i id,rating in user_avg_rating[:10]:
print(f'{id} : {rating:.2f}')
# 각 사용자별 평균 평점이 4점 이상인 사용자 및 인원수 구하기
user_avg_rating = np.array(user_avg_rating) # 불린 인덱싱
print(f'평균 평점이 4점 이상인 사용자 수: {np.sum(user_avg_rating[:,1] >= 4):,}명')
해당 파일은 구분자가 ':' 으로 되어있기 때문에 파일을 읽어오는 구분자를 delimiter=':' 로 설정하여 파일을 읽어왔다.
사용자별 평점을 구하기 위해서는 우선 아이디의 중복을 없애서 전체 사용자 수를 알아낸다.
'[[id, np.mean(data[data[:,0] == id ][:,2])] for id in user_ids ]' : user_ids 안의 데이터들을 빼 와 빼온 데이터가 id와 맞는지 확인 후 데이터 안에서 id별로 평균을 구한다.
'국비 교육 > 데이터' 카테고리의 다른 글
[데이터 분석] Pandas - 2 (0) | 2023.11.11 |
---|---|
[데이터 분석] Pandas - 1 (0) | 2023.11.11 |
[데이터 분석] Numpy - 3 (0) | 2023.11.07 |
[데이터 분석] Numpy - 2 (0) | 2023.11.07 |