데이터프레임 사용법
데이터 시각화
상관 관계 분석 이해 --> 히트맵그리기
주류데이터 이용, 데이터 불러오기
어떤 기능이 있나?
이전까지는 read_table을 사용했으나 지금은 read_csv을 쓸 거임. 쓰는 건 비슷함. url을 입력하는 것만으로도 불러오기 가능. 그 다음 seperator지정. 여기서는 콤마.
type확인
head로 상위 x개 출력
tail로 하위x개 출력
sample로 랜덤 x개 출력
데이터 자체의 정보 index, dtypes사용
index로는 데이터 정보 확인 stop=193은 데이터 샘플이 0번부터 192번까지 있다는 뜻.
dtype 각 열별로 어떤 데이터타임이 들어있는지 보여줌
문자열 - 자료형object
숫자형 - int64 integer정수
실수형 - float 소수점 있는 것
shape - 총 몇 개의 열과 행을 갖고있는지 출력
values - 각 행을 하나의 리스트로 만들 때 - numpy모듈에서 출력 - 리스트 타입으로 만드는 것
for문 - 전체 리스트에서 0번째 인덱스부터 요소 하나씩 뽑으면서 x에 할당.
열에 접근하는 방법, 종합적으로 정보 출력하는 법 공부해보자
열에 접근한다 --> 특정한 열만 가져와서 출력, 변형 등을 하는 것.
열에 접는하는 법은
drink_df.beer_servings 이렇게 점을 넣는 방법과,
drink_df['beer_servings'] 이렇게 대괄호를 넣는 방법도 가능
열 하나만 가져왔으면 더이상 표가 아니기 때문에 series라고 부름.
두 개의 열에 접근하고 싶으면
drink_df['beer_servings', 'wine_servings']이렇게 리스트 형식으로 가능
종합적인 정보를 볼 때는 info
drink_df.info()
여기서 non-null Count는 비어있지 않다는 뜻.
continent를 보면 다른 열에 비해 170 non-null이라 써있음. 23개의 결측치가 있다는 것임. 이렇게 결측치 확인
데이터를 파악하기 위한 열을 결과를 도출하기 위한 특성(feature)라고 부름
결측치 제거, 평균내보기
isnull() --> 준비작업
sum() 결측치 갯수 모두 더한 것.
dropna()함수로 결측데이터 포함된 행 제거
describe()해당 데이터의 최솟값, 최댓값, 평균값 등 파악 - 문자열이 포함된 열 제외하고 계산함
조건부 로직
원하는 데이터만 출력하기 - 특정 조건을 걸어 조건에 만족하는 데이터만 출력
데이터프레임 이름.특정 열의 이름 == '특정값'
drink_df_continent == 'EU' #단순한 조건문임 - 이 조건을 만족하는지 물어봄
그리고
drink_df[drink_df.continent=='EU'].head(20)
이렇게 조건을 만족하는 데이터 행들만 출력 가능 #같으면 출력하고 아니면 출력 하지말라는 것
drink_df[drink_df.beer_servings <=10][['country', 'beer_servings']]
beerservings가 10이상인 열 중 country와 beerservings만 출력
drink_df[drink_df.beer_servings > drink_df.beer_servings.mean()]
beerservings가 평균보다 큰 값만 출력
drink_df.continent.isnull()
비어있는지 차있는지 여부 확인
drink_df[drink_df.continent.isnull()]
비어있는 데이터만 출력
& : AND
| : OR shift+\
~: NOT
drink[~(drink_df.continent=='EU')]
EU에 해당하지 않는 값만 출력
drink_df[(drink_df.continent=='EU') & (drink_df.wine_servings > 300)]
continent에 EU가 들어가있고 wine servings가 300보다 큰 값 출력
len[(drink_df.continent=='EU') | (drink_df.wine_servings > 300)]
둘 중 하나만 충족하는 것의 길이(갯수)를 출력
not and or기호, 소괄호로 감싸기, 대괄호 2개 등 모두 외우기
퀴즈1
drink_df에서 total_litres_of_pure_alcohol의 값이 최대값인 경우의 country 열 출력하기
drink_df[drink_df['total_litres_of_pure_alcohol'].max()][['country']]
내가 한 것 (오류남)
drink_df[drink_df.total_litres_of_pure_alcohol == drink_df.total_litres_of_pure_alcohol.max()]['country']
정답
퀴즈2
drink_df에서 wine_servings의 값이 300보다 크거나, beer_servings의 값이 300보다 크거나, spirit_servings의 값이 300보다 큰 경우의 country열의 데이터를 모두 카운트 하였을 때의 숫자를 출력하라
len(drink_df[(drink_df.wine_servings > 300) | (drink_df.beer_servings > 300) | (drink_df.spirit_servings > 300)].continent)
내가 한 것 --> 소괄호를 안 넣어서 오류났었음
drink_df[(drink_df.wine_servings > 300) | (drink_df.beer_servings > 300) | (drink_df.spirit_servings > 300)]['country'].count()
여기서는 count를 썼음 왜냐 카운트하라 해서
drink_df.sort_values('beer_servings')
여기서 Length는 배열의 속성,
Count는 list의 클래스 속성.
Count는 양쪽에 사용 가능
beer_servings 열의 오름차순을 기준으로 정렬
drink_df.sort_values('beer_servings', ascending = False)
내림차순을 기준으로 정렬
drink_df.sort_values('beer_servings', 'wine_servings')
beer_servings오름차순 기준으로 먼저 정렬하고 그걸 해치지 않는 선에서 wine_servings오름차순 기준으로 정렬
상관관계 분석, 시각화, 직관적 분석
상관관계 분석 --> 상관계수를 구하는 것. 공분산의 개념. 두 개의 특성(변수)이 있을 때, 두 개의 변수 간의 관계를 뜻함. 상관계수는 1에서 -1사이에 위치하는데, 여기서 정/역을 보는 것.
패키지 Matplotlib은 자료를 차트나 플롯으로 시각화
Seaborn은 Marplotlib을 기반으로 테마와 기능을 추가한 패키지
알아둘 함수
데이터프레임이름.corr(method='pearson')
#correation의 줄임
상관계수를 구할 건데 상관계수를 구하는 방식으로 피어슨 상관계수 방식을 사용하겠다는 것. 대부분 이 방식을 씀.
sns.heatmap(데이터프레임의 상관계수 데이터)
상관계수를 넣어주면 그걸 기반으로 직관적인 차트형태로 보여주는 함수
sns.pairplot(데이터프레임)
산점도를 그리는 함수
어떤 식으로 시각화를 할 수 있는지,
준비과정,
Group by기능 알아보기
결측값 처리
제거할 때는 dropna() 채울 때는 fillna()
ex)대륙별로 알콜소비량이 어떤지,각 대륙이 차지하는 비율이 어떤지 시각화하고 싶다 할 때는 비어있는 값이 있으면 안됨. 그래서 빈값을 어떤 특정값으로 채워놓고 그걸 토대로 시각화.
기타값이란 의미로 아래처럼 ETC로 넣어줌
drink_df['continent'] = drink_df['continent'].fillna('ETC')
drink_df.sample(10)
drink_df.isnull().sum()
결측값 개수가 총 몇 개인지
pie chart
각 비율을 나타내는 label의 데이터
label의 개수
비율 확인에 매우 직관적
value_counts()
각 종류에 대해 총 몇 개가 있는지 셀 때 사용
drink_df['continent'].value_counts()
label부분은 .index()로 가져올 수 있고,
값 부분은 .values로 가져올 수 있음
그 다음 리스트로 만들어야 파이차트로 만들 수 있다.
그럴 때는 .tolist()사용
pie_labels = drink_df['continent'].value_counts().index.tolist()
pie_values = drink_df['continent'].value_counts().values.tolist()
print(pie_labels)
print(pie_values)
여기서 values도 사실 리스트나 다름없지만 numpy계열이라 정확하게 리스트로 만들어줘야 한다.
plt.pie(pie_values, labels=pie_labels, autopct='%.02f%%')
plt.title.('Percentage of each continent')
plt.show
#autopct는 소수점 x자리까지
group by
특정 열을 기준으로 그룹을 만들어서 그룹별로 통계적인 정보를 구할 때 사용 (평균 등)
.groupby('그룹을 묶고자 하는 열의 이름')['묶은 열의 값별로 알고자하는 열']
ex)대륙별 평균 맥주 소비량
drink_df.groupby('continent')['beer_servings'].mean
총 알코올 소비량 평균보다 더 많이 알콜을 섭취하는 대륙은?
total_mean = drink_df.total_litres_of_pure_alcohol.mean()
continent_mean = drink_df.groupby('continent')['total_litres_of_pure_alcohol'].mean()
continent_over_mean = continent_mean[continent_mean>= total_mean]
print(continent_over_mean)
총 알콜 소비량 평균 구하기
총 알콜 소비량 대륙별로 묶기
더 많이 섭취하냐는 조건문 쓰기
출력
ex2)평균 wine_servings이 가장 높은 대륙은?
.idxmax()사용하면 시리즈에서 가장 높은 값을 데이터를 집어서 리턴해줌
index max라는 뜻임
drink_df.groupby('continent')['wine_servings'].mean().idxmax()
ex3) 각 대륙별로 와인 소비에 대해 평균, 최소, 최대, 합을 출력해보기
.agg를 사용하면 여러가지 수치정보를 표시하는 함수 동시 사용 가능
drink_df.groupby('continent').wine_servings.agg(['mean', 'min', 'max', 'sum'])
Bar chart시각화
bar chart를 그리려면 3가지가 필요함
1. 바의 위치를 결정하는 인덱스
2. 바 차트로 사용할 데이터 이름이 담긴 리스트(label)
3. 해당 이름에 해당하는 데이터 값이 담긴 리스트 (실질 데이터)
# 여기서 index 값인 0, 1, 2는 순차적으로 어디에 배치될 것인지를 의미합니다.
# 어떤 의미인지 궁금하다면 0, 1, 5로 바꿔서 실행해보세요!
index = [0, 1, 2]
years = ['2017', '2018', '2019']
values = [100, 400, 900]
plt.bar(index, values, width=0.2, color='g')
plt.xticks(index, years)
plt.show()
여기서 index의 값을 일일이 작성할 수 없기 때문에 numpy모듈의 np.arange()를 사용한다.
코로나 데이터 분석
데이터가 어떻게 이루어져있는지 먼저 살펴보기
캐글에서 가져온 12개의 파일 (2020년 1월부터 6월까지)
여기서 patientinfo, case, TimeAge, TimeGender를 사용할 것임
import pandas as pd
case = pd.read_csv('Case.csv')
p_info = pd.read_csv('PatientInfo.csv')
t_age = pd.read_csv('TimeAge.csv')
t_gender = pd.read_csv('TimeGender.csv')
case.head(5)
p_info.head(5)
t_age.head()
t_gender.head()
데이터가 어떻게 생겼는지 보기
import matplotlib.pyplot as plt
import seaborn as sns
시각화에 필요한 모듈 가져오기
p_info
p_info.info()
결측치 파악 --> confirmed_date에 3개 밖에 없으므로 전체에 큰 영향은 x
일별 확진자 수
#확진일별로 환자를 묶기
daily_count = p_info.groupby(['confirmed_date'])['patient_id'].count()
plt.rcParams['figure.figsize'] = (15, 5)
daily_count.plot()
plt.title('Number of Daily Confirmed Patients')
plt.show()
daily_count
누적 확진자 수
accumulated_count = daily_count.cumsum() #cumultive sum 누적합산
accumulated_count.plot()
plt.title('Number of Daily Confirmed Patients')
#위에서 가로를 늘려놨기 때문에 그 설정대로 유지
도시별 확진자 수 표시
대구의 구별 확진자 수
case[case['province']=='Daegu']
sns.barplot(data=case[case['province']=='Daegu'], x='confirmed', y='city', ci=None).set(xlabel='Confirmed', ylabel='District', title='Case in Daegu') #ci는 오차범위
서울의 구별 확진자 수
case[case['province']=='Seoul']
sns.barplot(data=case[case['province']=='Seoul'], x='confirmed', y='city', ci=None).set(xlabel='Confirmed', ylabel='District', title='Case in Seoul')
#맨 아래는 어느 구인지 불명
성별 / 연령별 확진자 비율 표시
2020년 6월 30일 성별 확진자 비율
t_gender[t_gender['date']=='2020-06-30']['confirmed']
pie_labels = ['male', 'female']
pie_values = t_gender[t_gender['date']=='2020-06-30']['confirmed'].values.tolist()
print(pie_labels)
print(pie_values)
plt.pie(pie_values, labels=pie_labels, autopct='%.2f%%')
#'%.2f%%'에서 .넣는거 주의
plt.title('Confirmed Case (2020-06-30)')
plt.show
2020년 6월 30일 연령별 확진자 비율
t_age
population_by_age = t_age[t_age['date']=='2020-06-30']
population_by_age
pie_labels = population_by_age['age'].values.tolist()
pie_values = population_by_age['confirmed'].values.tolist()
print(pie_labels)
print(pie_values)
plt.figure(figsize=(10, 10)) #이렇게 위에다 써야함. 아래다 쓰면 적용x
plt.pie(pie_values, labels=pie_labels, autopct='%.2f%%')
plt.title('Confirmed Distribution by age (2020-06-30)')
plt.show
지도 위에 확진자 분포 띄우기
folium패키지 사용, Map()함수 사용해서 표시하려는 지역의 위도와 경도를 입력하면 됨. zoom_start는 처음 표시할 때 얼마나 확대할 지 결정.
import folium
seoul = folium.Map(location=[37.55, 126.98], zoom_start=12)
seoul
기본으로는 도로기준인 OpenStreetMap형태로 표시
Stamen Terrain, Stamen Toner 등으로도 표시 가능
히트맵 그리기
지도에 확진자 분포 띄우기
확진자 위치에 대한 위도, 경도 필요함
이거 case.scv에 있었음
그리고
확진자 발생 수
확진자id
도 함께 추출할 것임
pivot_table함수
case.pivot_table(index=['group'], aggfunc='sum')
group의 열의 값을 그룹화하고 총합구하기
import pandas as pd
case = pd.read_csv('Case.csv')
case
case.pivot_table(index=['group'], aggfunc='sum') #원하는 그룹별 총합 값 구하기
local_infected = case[case['group']==True] #결측치는 NaN인데 -이므로 결측치가 아니다. 그래서 -를 없앨거임
local_infected
local_infected[local_infected['latitude']!='-']
local_infected = local_infected[local_infected['latitude']!='-'] #local_infected 변수로 지정
local_infected = local_infected[local_infected['longitude']!='-'] #혹시 모르니 경도의 -도 없애기
local_infected.isnull().sum() #결측치 파악
local_infected #없어졌나 확인
from folium import plugins #지도에 뭔가를 띄울 때 plugins함수 사용
latitude, longitude = 35.9078, 127.7669 # 대한민국의 좌표
S_korea = folium.Map(location = [latitude, longitude], zoom_start = 8)
S_korea
#add.child()는 어떤 요소를 추가하겠다는 것
S_korea.add_child(plugins.HeatMap(zip(local_infected['latitude'], local_infected['longitude'], local_infected['confirmed']), radius=18))
여기서 오류가 났는데 왜냐?
local_infected.info() ##위도와 경도가 숫자가 아닌 문자열(object)이었기 때문
local_infected['latitude'] = local_infected['latitude'].astype('float')
local_infected['longitude'] = local_infected['longitude'].astype('float')
그래서 실수float로 바꿔줌
그리고 다시 히트맵을 띄우면 성공