Learn & Record

Python (Pandas 판다스 데이터그룹핑, 연습문제, Matplotlib 맷플롯립, 선그래프, 막대그래프, 산점도그래프, 히스토그램, 연습문제) 본문

Dev/Python

Python (Pandas 판다스 데이터그룹핑, 연습문제, Matplotlib 맷플롯립, 선그래프, 막대그래프, 산점도그래프, 히스토그램, 연습문제)

Walker_ 2024. 3. 13. 17:18

1. Pandas 데이터 그룹핑

 - 데이터 그룹핑은 데이터를 특정한 값에 기반해 묶는 기능으로 groupby()를 사용하여 통계량을 요약할 수 있음

 - 통계량에 관계된 메서드에는 mean(평균), std(표준편차), var(분산), max(최대값), min(최소값) 등이 있음

import pandas as pd

# 한 열을 기준으로 그룹화하기
s1 = pd.read_excel('./input/nation.xlsx')
print(s1)
#   국적코드  성별    입국객수    증가수
# 0  A01  남성  125000   8000
# 1  A01  여성  130000  10000
# 2  A05  남성     300     10
# 3  A05  여성     200     50
# 4  A06  남성  158912  24486
# 5  A06  여성  325000  63466

print(s1.groupby('국적코드').sum())
#         성별    입국객수    증가수
# 국적코드
# A01   남성여성  255000  18000
# A05   남성여성     500     60
# A06   남성여성  483912  87952

print(s1.groupby('성별').sum())
#          국적코드    입국객수    증가수
# 성별
# 남성  A01A05A06  284212  32496
# 여성  A01A05A06  455200  73516

# 여러 열을 기준으로 그룹화하기
print(s1.groupby(['국적코드', '성별']).sum())
#            입국객수    증가수
# 국적코드 성별
# A01  남성  125000   8000
#      여성  130000  10000
# A05  남성     300     10
#      여성     200     50
# A06  남성  158912  24486
#      여성  325000  63466

 

2. 연습문제

covid = pd.read_csv('./input/covid.csv', encoding='ANSI')
print(covid.head())

# 2. '사례수'가 가장 높은 항목의 모든 정보를 출력
# 조건문과 불 인덱싱 사용
covid_tmp = covid['사례수'] == covid['사례수'].max()
print(covid[covid_tmp])

# 3. '증가율'이 높은 3개의 항목을 출력
# 증가율이 높은 순서대로 정렬 후 3개의 행을 선택
df2 = covid.sort_values(['증가'], ascending=False)
print(df2.head(3))
# print(covid.sort_values(by=['증가'], ascending=False).head(3))

# 수강과 교수 데이터파일을 이용하여 다음 문제를 해결

# 1) 두 데이터프레임을 merge()를 사용해서 결합해서 출력하세요
signup = pd.read_csv('./input/signup.csv', encoding='ANSI')
print(signup.head())

professor = pd.read_csv('./input/professor.csv', encoding='ANSI')
print(professor.head())

table_merge = pd.merge(signup, professor)
print(table_merge.head())

# 2) 교수 테이블에서 학과별 인원 수를 출력하세요. (count() 사용)
stu_count = table_merge.value_counts('학과')
print(stu_count)
#'서울특별시 코로나19 백신 예방접종현황'에 대한 정보를 가지고 있는 데이터 파일 (vaccine.csv)을 이용하여 모든 문제를 차례대로 수행하세요.

# 필드명 : 설명
# date : 접종일
# subject : 접종대상자
# day1num : 당일 1차 접종자 수
# day1sum : 1차 접종 누계
# day1rate : 1차 접종률
# day2num : 당일 2차 접종자 수
# day2sum : 2차 접종 누계
# day2rate : 2차 접종률

# 1) csv파일을 불러와서 하위 5행의 데이터를 확인.
# 2) 필요없는 열을 삭제한 후 출력
# 삭제할 열 : day1sum, day1rate, day2sum, day2rate
# 3) 데이터프레임의 기초통계량을 확인
# 4) 새로운열("월")을 생성한 후 데이터 날짜의 월을 입력
#  5) 월별 평균을 출력


vaccine = pd.read_csv('./input/vaccine.csv', encoding='ANSI')
# 1) csv파일을 불러와서 하위 5행의 데이터를 확인.
print(vaccine.sort_values('date', ascending=True).head())
# 2) 필요없는 열을 삭제한 후 출력
vaccine1 = vaccine.drop(['day1sum', 'day1rate', 'day2sum', 'day2rate'], axis=1).head()
print(vaccine1)
# 3) 데이터프레임의 기초통계량을 확인
print(vaccine1.describe())
# 4) 새로운열("월")을 생성한 후 데이터 날짜의 월을 입력
vaccine1['월'] = vaccine.date.astype(str).str.slice(5,7)
print(vaccine1)

#  5) 월별 평균을 출력
vaccine2 = vaccine1[['day1num', 'day2num', '월']].groupby('월').mean()
print(vaccine2)
# 경산에 있는 커피 전문점(표준산업분류명 기준)을 동(법정동 기준)별로 몇개가 있는지 출력(출력 기준은 법정동 가나다 순)

sosang_kb = pd.read_csv('./input/소상공인시장진흥공단_상가(상권)정보_경북_202312.csv')
sosang_kb_ks = sosang_kb[sosang_kb['시군구명'] == '경산시']
print(sosang_kb_ks.head())


#2. 경산에 밍ㅆ는 커피전문점만 골라냄
df9 = sosang_kb_ks[sosang_kb_ks['표준산업분류명'] == '커피 전문점']
print(df9)

# case1
# value_counts()를 이용해서 법정동에 몇개의 데이터가 있는지 반환 후 sort_index()를 이용하여 인덱스 값 기준으로 정렬
print(df9.value_counts('법정동명').sort_index())

# case2
# '법정동명'으로 그룹을 나눈 후, 데이터의 고유번호인 '상가업소번호'의 개수를 카운팅
print(df9.groupby('법정동명').count()['상가업소번호'])

 

3. 맷플롯립 Matplotlib
 - 맷플롯립 라이브러리는 그래프를 그릴 때 가장 많이 사용하는 파이썬 라이브러리 중 하나

 - 맷플롯립을 활용하면 다양한 유형의 그래프를 간편하게 그릴 수 있음

 - 시각화할 때 데이터로 리스트나 딕셔너리 자료형도 가능하지만 데이터프레임을 이용하면

 - 새로운 그래프에 적용하는 것이 더 쉽기 때문에 대부분 데이터프레임 자료형을 이용

 - Matplotlib은 MATLAB (과학 및 공학 연산을 위한 소프트웨어)의 시각화 기능을 모델링해서 만들어짐

 - 공식 홈페이지 : http://matplotylib.org/

 - 세팅 > 라이브러리 설치 > Matplotlib 설치

# 01. 시각화 옵션

# 그래프를 표현하다 보면 그래프 제목, X축 및 Y축 이름 등의 그래프에 대한 추가 옵션을 지정할 때가 많음

# 1) 제목

# 그래프 제목은 title() 메서드를 사용하여 표현
# 제목은 기본적으로 영어를 사용하는데, 한글을 사용하려면 별도의 설정을 해야 함

# 제목 지정
import matplotlib.pyplot as plt

plt.title('Line Graph')
xdata = [2, 4, 6, 8]
ydata = [1, 3, 5, 7]
plt.plot(xdata, ydata)
plt.show()

 

 - 2) 범례

 - 그래프 범례는 두 개 이상의 데이터를 표현할 때 사용

 - 범례 주기는 plot()을 활용하여 표현하는데, plot()의 label 속성값에 원하는 문자열을 작성하고

 - 그래프를 그리기 전에 legend() 메서드를 실행

# 범례지정
plt.title('Legend')
data1 = [2 ,4, 6, 8]
data2 = [8, 6, 4, 2]
plt.plot(data1, label='asc')
plt.plot(data2, label='desc')
plt.legend()
plt.show()

 - 3) 색상

 - 그래프 색상은 plot() 메서드에 color 속서을 추가하여 표현

# 3) 색상 지정
xdata = [2, 4, 6, 8]
ydata = [1, 3, 5, 7]
plt.plot(xdata, ydata, color = 'red')
plt.show()

 

- 4) x축 및  y축 이름

 - x축 이름은 xlabel()를 사용하고, y축 이름은 ylabel()을 사용하여 표현

# 4) x축 및 y축 이름 지정
xdata = [2, 4, 6, 8]
ydata = [1, 3, 5, 7]
plt.plot(xdata, ydata)
plt.xlabel('X value')
plt.ylabel('Y value')
plt.show()

 - 5) 그래프 선 모양
 - 그래프 선 모양은 plot()의 linestyle 속성을 이용하여 표현.
 - linestyle 속성으로 실선은 '-', 파선은 '--', 점쇄선 '-.', 점선은 ':' 기호로 지정

# 그래프 선 모양 지정
data1 = [2, 4, 6, 8]
data2 = [8, 6, 4, 2]
plt.plot(data1, color='r', label='dashed', linestyle='--')
plt.plot(data2, color='g', label='dotted', linestyle=':')
plt.legend()
plt.show()

 

 - 6) 그림 범위 지정

 - plot()를 사용하여 그래프를 표현하다 보면 몇몇 점들은 그림의 범위 경계선에 있어서 잘 보이지 않을 때가 있음

 - xlim() 메서드와 ylim() 메서드를 사용하여 그림의 범위를 수동으로 지정할 수 있음

 - xlim()은 x축의 최솟값과 최대값을 지정하고, ylim()은 y축의 최솟값과 최대값을 지정

 - plot()의 marker 속성을 지정하면 선에 점 모양을 다양하게 변경할 수 있음

# 그림 범위 지정
plt.title('X, Y range')
xdata = [10, 20, 30, 40]
tdata = [1, 3, 5, 7]
plt.plot(xdata, ydata, color='b', linestyle='--', marker='o', markersize='10')
plt.show()

 

plt.title('X, Y range')
xdata = [10, 20, 30, 40]
ydata = [1, 3, 5, 7]
plt.plot(xdata, ydata, color='b', linestyle='--', marker='o', markersize='10')
plt.xlim(0, 50)
plt.ylim(-5,15)
plt.show()

 

 

 - 7) 내장 시각화 옵션

 - 판다스를 이용하면 시각화 라이브러리를 임포트 하지 않아도 내장 그래프 도구를 이용하여 기본적인 시각화 가능

 - plot()의 kind 속성을 지정하면 다양한 종류의 그래프를 표현할 수 있음

# 내장 시각화 옵션

# 그래프 속성 값
# 옵션 : 종류
# line : 선 그래프
# bar : 막대 그래프 - 수직
# barh : 막대 그래프 - 수평
# his : 히스토그램 그래프
# box : 박스 그래프
# kde : 커널 밀도 그래프
# area : 면적 그래프
# pie : 원형 그래프
# scatter : 산점도 그래프
# hexbin : 고밀도 산점도 그래프
import matplotlib.pyplot as plt
import pandas as pd

my_score = [[60, 90, 95], [80, 75, 100], [65, 85, 90], [85, 70, 90], [95, 90, 85], [75, 85, 90], [85, 80, 75]]
subject = ['kor', 'math', 'eng']
df = pd.DataFrame(my_score, columns=subject)

df.plot(kind='line')
plt.show()

 

4. 선 그래프

 - 연속적으로 변하는 데이터를 시각화할 때는 선 그래프가 가장 적당

 - 일반적으로 선 그래프는 시간에 따라 데이터의 연속적인 변화량을 관찰할 때 자주 사용

 - 예를 들어 시간에 따른 온도 변화량, 수출액 변화량, 교통 사고량 등을 시각화 할 때 유용하게 사용

 - 선 그래프는 수량을 점으로 표시하면서 선으로 이어 그리기 때문에 증가와 감소 상태를 쉽게 확인할 수 있음

 

 - 선 그래프는 plot()에 x축, y축 데이터를 선택하여 그림

 - x축에 시간 변수를 지정하여 시간 변화량을 나타내는 시계열 데이터를 표현하는 그래프에도 많이 사용

# 에어코리아에서 제공하는 2001년 ~ 2019년까지의 미세먼지 데이터 'fine_dust.xlsx'를 이용하여 선 그래프로 표현

import pandas as pd
import matplotlib.pyplot as plt

# 1) 2019년 데이터 읽기
data = pd.read_excel('./input/fine_dust.xlsx')
print(data.head())
data2019 = data[2019]

# 2) 2019년 지역별 미세먼지 선 그래프
plt.figure(figsize=(15,4))
plt.plot(data2019, color='b', marker='o') # 원형 마커 지정
plt.title('2019 Fine Dust Line Graph')
plt.xlabel('area')
plt.ylabel('micrometer')
plt.grid() # 격자 표시
plt.show()

 

# 3) 2016 ~ 2019년 미세먼지 선 그래프
# 2016년 데이터를 가져와 chartdata에 저장하고 마커 및 이름을 저장하는 과정을 2019년까지 반복
plt.figure(figsize=(15,4))
for year in range(2016, 2020):
    plt.plot(data[year], marker='o', label=year)
plt.title('2016 ~ 2019 Fine Dust Line Graph')
plt.xlabel('area')
plt.ylabel('micrometer')
plt.legend()
plt.show()

 

 

5. 막대그래프

 - 집단별 차이를 표현할 때 막대 그래프가 적당

 - 시간에 따른 변화를 표현할 때는 선 그래프가 좋지만, 크고 작음의 차이를 한눈에 파악할 때는

 - 막대 그래프를 많이 사용

 - 예를 들어, 수량의 많고 적음 비교, 변화된 양에 대한 일별, 월별, 연별 통계 등의 비교,

 - 우리 반 학생들이 좋아하는 연예인과 좋아하는 인원 등을 시각화 할 때 유용하게 사용

 - 가독성 면에서 막대 그래프는 일반적으로 항목의 개수가 적으면 가로 막대가 좋고

 - 항목이 많으면 세로 막대가 보기 편함

 - 막대 그래프는 bar(), 함수에 x축, y축 데이터를 지정하여 그림

# 1) 세로 막대 그래프 그리기

# 2016년 지역별 미세먼지 세로 막대 그래프
plt.figure(figsize=(15,4))
plt.bar(data2016.index, data2016, color='g') # x축에 data2016의 인덱스를, y축 데이터에 data2016을 지정
plt.title('2016 Fine Dust Bar Graph')
plt.xlabel('area')
plt.ylabel('micrometer')
plt.ylim(35, 55)
plt.grid()
plt.show()

 

# 3) 그룹 누적 가로 막대 그래프 만들기
# 2016 ~ 2019 지역별 미세먼지 그룹 막대 그래프를 누적하여 가로 방향으로 변경하여 표현
# 누적 막대 그래프를 그리는 것은 기존 막대 그래프 위에 막대 그래프를 하나 더 그리는 방식
# 이를 위해서는 index의 위치를 변경해야 함
# 가로 방향으로 바꾸는 것은 bar() 대신 barrg()를 사용하면 됨
# 막대 그래프를 가로 방향으로 변경했으므로 x축 및 y축 이름, x축 및 y축 눈금도 가로 방향에 맞게 변경

 

# 2016 ~ 2019 지역별 미세먼지 그룹 누적 가로 막대 그래프
index = np.arange(4)

plt.figure(figsize=(15,4))
df1 = data.loc['Seoul':'Busan', 2016:2019] # 서울, 경기, 인천, 부산 지역의 2016 ~ 2019년 데이터만 추출
for year in range(2016, 2020):
    chart_data = df1[year]  # 연도별로 데이터 가지고 옴
    plt.barh(index, chart_data, label=str(year))

plt.title('2016~2019 Fine Dust Group Barh Graph')
plt.ylabel('area')
plt.xlabel('micrometer')
plt.xlim(30,55)
plt.yticks(index, ['Seoul', 'Gyeonggi', 'Incheon','Busan'])
plt.legend()
plt.show()

 

6. 산점도그래프

 - 서로 다른 두 연속성 변수 사이의 관계를 나타내며 연속성 변수의 상관성을 확인할 때 산점도 그래프를 사용

 - 예를 들어 나이와 소득에 대한 상호 관련성 파악 등에 유용하게 사용되는데, 두 변수 간의 상관관계를 대략적으로 파악

 - 산점도에 표시되는 각 점들은 자료의 관측값을 의미하고, 각 점의 위치는 관측값이 가지는 x축, y축 변수의 값으로 결정

 

# 공공데이터포털에서 다운로드한 2020년 건강검진 일부 데이터를
# 이용하여 산점도 그래프를 표현

import pandas as pd
import matplotlib.pyplot as plt

data = pd.read_csv('./input/health_screenings_2020.csv')
# print(data.head())

df1 = data.iloc[:100000]
# print(df1.info())

height_data = df1['height'] # 키 데이터만 가져와 heightdata에 저장
weight_data = df1['weight'] # 몸무게 데이터만 가져와 weight_data에 저장
print(height_data.head())
# 0    175
# 1    150
# 2    155
# 3    165
# 4    160
# Name: height, dtype: int64

plt.figure(figsize=(10,4)) # 그래프 크기를 지정
plt.scatter(height_data, weight_data) # x축 데이터에 height_data, y축 데이터 weight_data 지정
plt.title('2020 Health screenings Scatter Grap')
plt.xlabel('height')
plt.ylabel('weight')
plt.show()
# 2) 그룹 산점도 그래프 그리기
# 누적 산점도 그래프를 그리는 것은 기존 산점도 그래프위에 산점도 그래프를 하나 더 그리는 형식

# HDL, LDL, cholesterol 데이터를 가져와 각각의 변수에 저장
HDL_date = df1['HDL']
LDL_date = df1['LDL']
cholesterol_date = df1['cholesterol']

plt.figure(figsize=(10,6)) # 그래프의 크기를 지정

# scatter()에 x축 데이터와 y축 데이터를 지정하고 점 색상과 점 테두리 색상을 지정
plt.scatter(cholesterol_date, LDL_date, color='r', edgecolors='w', label='Cholesterol*LDL')
plt.scatter(HDL_date, cholesterol_date, color='g', edgecolors='w', label='HDL*Cholesterol')
plt.scatter(HDL_date, LDL_date, color='b', edgecolors='w', label='HDL*LDL')

plt.title('2020 Health screenings Group Scatter Graph')
plt.xlim(-50, 500)
plt.ylim(-50, 500)
plt.legend()
plt.show()

 

7. 히스토그램

 - 변수가 하나인 데이터의 빈도수를 막대 모양으로 나타낼 때 히스토그램이 적당

 - 통계분석에서 도수분포표와 히스토그램은 가장 많이 사용되는 도구이고,

 - 데이터의 분석 및 분포를 파악하는 역할

 

 - x축에는 계급, y축에는 해당 도수 및 비율(개수)을 지정

 - 계급은 변수의 구간을 의미하는데, 서로 겹치지 않아야 하고 계급(막대)들과는 서로 붙어 있어야 함

import pandas as pd
import matplotlib.pyplot as plt

data = pd.read_csv('./input/health_screenings_2020.csv')
print(data.info())

# 1) 히스토그램 그리기

# data에서 남성(data.gender==1.0)의 성별, 키 데이터만 가져옴
man_data = data.loc[data.gender == 1.0, ['gender', 'height']]
print(data['gender'].value_counts())

plt.figure(figsize=(10,6))
# hist() 메서드로 man_data 데이터의 키를 지정하고 계급 개수 20개 등의 속성을 지정
plt.hist(man_data['height'], bins=20, label='Man')
plt.title('2020 Health Screenings Man Height Histogram')
plt.xlabel('height')
plt.ylabel('frequency')
plt.legend()
plt.grid()
plt.show()

 

# 2) 그룹 히스토그램 그리기

# 그룹 히스토그램을 그리는 것은 기존 히스토그램 위에 히스토그램을 하나 더 그리는 형식
# 남성 및 여성 키 그룹 히스토그램

# data에서 남성(data.gender==1.0)의 성별, 키 데이터만 가져옴
man_data = data.loc[data.gender == 1.0, ['gender', 'height']]
# data에서 여성(data.gender==2.0)의 성별, 키 데이터만 가져옴
woman_data = data.loc[data.gender==2.0, ['gender', 'height']]

plt.figure(figsize=(10,6)) # 그래프의 크기를 지정
# hist() 메서드로 데이터의 키를 지정하고 계급 개수 20개 등의 속성을 지정
plt.hist(man_data['height'], bins=20, alpha = 0.5,label='Man')
plt.hist(woman_data['height'], bins=20, alpha = 0.5,label='Woman')

plt.title('2020 Health Screenings Man & Woman Height Group Histogram')
plt.xlabel('height')
plt.ylabel('frequency')
plt.xlim(120, 200)
plt.legend()
plt.grid()
plt.show()

 8. 연습문제

# 1. 공공데이터 '국민건강보험공단_건강검진정보' 다운로드
import pandas as pd
import matplotlib.pyplot as plt

# 2. 파일을 읽은 후 데이터프레임으로 변환하시오
data = pd.read_csv('./input/국민건강보험공단_건강검진정보_20221231.csv', encoding='ANSI')
# print(data.head())
# print(data.info())
# 3. 남성의 키데이터를 가지고 히스토그램을 만들것
man_data =data.loc[data['성별']==1, ['성별', '신장(5cm단위)']]
# 4. 남성과 여성이 키 데이터를 하나의 히스토그램으로 만들 것
plt.hist(man_data['신장(5cm단위)'], bins=10, label='Man')
plt.title('2022 Health Screenings Man Height Histogram')
plt.xlabel('height')
plt.ylabel('frequency')
plt.legend()
plt.grid()
plt.show()
 4. 남성과 여성이 키 데이터를 하나의 히스토그램으로 만들것
# data에서 남성(data['성별'] == 1) 성별, 키 데이터만 가져옴
man_data = data.loc[data['성별']==1, ['성별', '신장(5cm단위)']]
# data에서 여성(data['성별'] == 2)의 성별, 키 데이터만 가져옴
woman_data = data.loc[data['성별']==2, ['성별', '신장(5cm단위)']]

plt.figure(figsize=(10,6)) # 그래프의 크기를 지정
# hist() 메서드로 데이터의 키를 지정하고 계급 개수 20개 등의 속성을 지정
plt.hist(man_data['신장(5cm단위)'], bins=10, alpha = 0.5,label='Man')
plt.hist(woman_data['신장(5cm단위)'], bins=10, alpha = 0.5,label='Woman')

plt.title('2022 Health Screenings Man & Woman Height Group Histogram')
plt.xlabel('height')
plt.ylabel('frequency')
plt.xlim(120, 200)
plt.legend()
plt.grid()
plt.show()

 

 


공부 과정을 정리한 것이라 내용이 부족할 수 있습니다.

부족한 내용은 추가 자료들로 보충해주시면 좋을 것 같습니다.

읽어주셔서 감사합니다 :)