오늘은 'tips'라는 데이터셋을 가지고 다양하게 시각화하하는 실습을 진행했다.

우선 히스토그램으로 'total_bill'과 'tip'의 분포를 살펴볼 수 있다.
fig = plt.figure(figsize=(12,5))
axes1 = fig.add_subplot(1,2,1) #total_bill
axes2 = fig.add_subplot(1,2,2) #tips
axes1.hist(data=tips_df, x='total_bill', bins=20)
axes2.hist(data=tips_df, x='tip', bins=20)
plt.tight_layout()
plt.show()

히스토그램 말고도 박스 플롯(box plot)과 산포도(scatter plot)와 원형(pie)차트를
fig = plt.figure(figsize=(12,5))
axes = fig.add_subplot(1,1,1)
axes.boxplot(
x=[
tips_df[tips_df['day'] == 'Thur']['tip'],
tips_df[tips_df['day'] == 'Fri']['tip'],
tips_df[tips_df['day'] == 'Sat']['tip'],
tips_df[tips_df['day'] == 'Sun']['tip']
],
labels=['Thur', 'Fri', 'Sat', 'Sun']
)
plt.show()

요일과 팁의 관계를 나타내는 박스 플롯을 그릴 수 있다. 중앙값(Q2)은 크게 다르지 않고 최댓값은 일요일이 가장 높으며 이상치는 토요일이 가장 많음을 알 수 있다.
colors = {'Female' : 'red', 'Male': 'blue'}
fig = plt.figure()
axes = fig.add_subplot(1,1,1)
axes.scatter(
tips_df['total_bill'], tips_df['tip'],
s=tips_df['size']**2*10, #점이 클수록 size가 큰 것
c=tips_df['sex'].map(colors)
)
plt.show()

총 금액와 팁의 관계를 나타내는 산포도 차트를 그려보았다. 점의 크기가 클수록 인원(size)수가 크고 총 금액은 10~30사이, 팁은 2~6사이에 많음을 알 수 있다. 컬러를 지정하여 성별도 구분할 수 있다.
day_counts = tips_df['day'].value_counts() #axes10
smoker_counts = tips_df['smoker'].value_counts() #axes11
fig = plt.figure()
axes10 = fig.add_subplot(1,2,1)
axes10.pie(
day_counts,
colors=["#ff1818", "#f17d0f", "#29d61a", "#4314ee"],
labels=day_counts.index,
autopct='%.2f%%'
)
axes11 = fig.add_subplot(1,2,2)
axes11.pie(
smoker_counts,
colors=["#2ada12", "#2782f8"],
labels=smoker_counts.index,
autopct='%.2f%%'
)
plt.show()
요일별과 흡연 유무별의 비율이 전체에서 얼마나 차지하는 지를 나타내기 위해 파이 차트도 그려보았다. 평일보다 주말 방문객이 많음은 물론, 목요일에 비해 금요일 방문객이 더 적음을 알 수 있었다.

시각화할 때 중요한 건 데이터를 탐색할 때 어떤 차트가 유용할지, 결과물로 보여주고 설득할 때 어떤 차트가 유용할지, 직관적으로 보여주기 위해서 필요한 변수 개수, 변수의 점 크기, 어떤 색상을 적용할지 등을 잘 고려해 보는 게 좋겠다.
오후에는 드디어 1차 프로젝트 팀이 완성되었고 초안 문제 정의와 주제를 정하였다. 이번 프로젝트 역할 분담에서 팀장을 맡게 되었는데 내가 잘할 수 있을지 너무 걱정된다. 😂
내가 원하는 유형의 차트로, 막대 개수나 점의 크기, 색상을 내 마음대로 지정해가며 여러 그림을 그려보는 것은 나름 흥미로웠다. 오늘 실습한 데이터셋보다 변수가 더 많았다면 다양한 변수들을 조합해 보며 여러 차트를 그려가면서 변수 간 관계를 더 잘 이해할 수 있었을 것 같다. 시각화 부분이 문법적으로 어렵지 않은데 나중에 프로젝트 결과물이나 보고서에서는 직관적으로 한눈에 볼 수 있게 차트를 그리는 것이 중요할 것 같다.
오늘 오전에는 <항공사 지연 요인 분석 보고서>를 작성하는 것으로 많은 시간을 보냈다. 데이터를 가지고 전처리도 해보고 여러 차트를 그려보며 분석 보고서를 작성하였다. 파일을 불러와 df로 저장하고 해당 데이터를 살펴본다. 데이터 출처 : https://www.kaggle.com/datasets/pitterman/airline-stats


총 데이터수는 33468개이고, 컬럼은 항공사 지연, 관제 지연, 날씨 지연 그리고 항공사들이 저장되어있다. describe()함수로 항공사별 각각의 지연 요인 기술 통계를 비교하면서 어떤 지연 요인이 항공사에 영향이 큰지 비교하면서 데이터를 관찰하고 파악한다.
전처리로는 지연 요인들에 28개씩 결측값이 있어서 결측값 행을 제거하는 df_dropna와 전체 평균으로 결측값을 채우는 df_filled중 고민하였는데 나는 df_filled로 여러 시각화 차트를 그려보았다.
항공사별 pct_carrier_delay, pct_atc_delay, pct_weather_delay 박스플롯을 그려보면 데이터에 이상치가 많음을 알 수 있다. 이상치가 많이 넓게 분포되어 있으면 분석의 신뢰도가 떨어질 수 있어서 이에 해결 방안은 더 고민을 해봐야 할 것 같다.
박스플롯, 산포도, 히트맵 등 여러 차트를 그려보았지만 가장 설명하기 좋은 차트는 아래와 같다.
#항공사별 평균 내부 지연률 구하기
carrier_delay_airline = df_filled.groupby('airline')['pct_carrier_delay'].mean()
#항공사별 평균 관제 지연률 구하기
atc_delay_airline = df_filled.groupby('airline')['pct_atc_delay'].mean()
#항공사별 평균 날씨 지연률 구하기
weather_delay_airline = df_filled.groupby('airline')['pct_weather_delay'].mean()
#항공사별 평균 지연률을 하나의 데이터 프레임으로 합치기
delay_df = pd.DataFrame({
'carrier_delay': carrier_delay_airline,
'atc_delay': atc_delay_airline,
'weather_delay': weather_delay_airline
})

- 'Alask'를 제외한 모든 항공사의 평균 지연률은 carrier > atc > weather 순이고,
'Alask' 항공사는 atc > carrier > weather로 유일하게 항공사 내부 지연률보다 관제 지연률이 더 많다.- 평균적으로 항공사 내부 지연률이 가장 높은 곳은 'American', 관제 지연률이 가장 높은 곳은 'Jet Blue', 날씨 지연률이 가장 높은 곳은 'American'이다.
- 날씨 지연률은 다른 지연률보다 현저히 적게 나타난다.
확실히 시각화하여 분석하고자 하는 컬럼별로 차트를 그리니 여러 줄의 코드나 많은 글자보다 직관적으로 보기 편하다는 장점이 있다. 해당 차트를 봄으로써 나중에 내가 무엇을 고려하며 어디 항공사 비행기를 타야할까 하는 결론에도 도달할 수 있다. 처음 보고서를 작성하다보니 시간이 부족해서 마지막 결론부분을 채우지 못했는데 추후에 채워나갈 것이고 데이터 분석의 과정을 직접 정리해보는 좋은 경험이 되었다. 😊
https://github.com/jiyoung1634/hipython_rep/blob/main/01_data_anal_proj/%EB%B6%84%EC%84%9D%EB%B3%B4%EA%B3%A0%EC%84%9C.ipynb
내 분석보고서 깃허브 링크이며 앞으로 조금씩 업데이트해 나갈 예정이다.
오늘부터 3일간 1차 팀 프로젝트를 시작하게 되었다. 사실 본격적인 프로젝트 시작은 오늘부터가 맞지만 앞선 이틀 간 오후수업 때 팀별로 모여 주제와 문제정의, 페르소나 작성을 했었다.
우리팀의 주제는 도로 위 야생동물 실시간 인식 및 대응 시스템으로 어떤 아이디어를 주제로 삼을까 고민하다가 여러 키워드를 던져보며 "자율주행"과 "로드킬"에 초점을 두어 주제로 선정하였다.
문제정의로는 주행 중 도로에 갑자기 나타나는 “야생동물”을 효과적으로 감지하여 사고 예방과 충돌 이후 신속하게 대응할 수 있는 체계 부재 -> 이는 차량 손상 및 동물 생명 보호 측면에서 안전/윤리적 문제 제기로 삼았다. 나는 이번 프로젝트에서 팀장을 맡게 되었다. 😆
데이터도 미리 찾아놔서 다행히 오늘은 조금 수월하게 진행된 것 같다. 데이터는 '2019~2023 5개년 로드킬 통계국립생태원동물 찻길 사고 현황 자료', '2019~2023 도로교통공단_사고유형별 교통사고', '2019~2023 보험사 민원건수', 로드킬 관련 뉴스 스크랩, 국내 관련 서비스 조사 등을 찾아서 팀 노션으로 공유하였다.
우리팀 프로젝트를 WhyNot캠프의 깃허브 레포지토리에 올리도록 한다.
(맨 아래 32일차에 주소 달았음!)
역할 분담을 잘 나누었고, 그에 따라 원활히 진행되었으며 우리가 가진 데이터가 어떠한지 보는 정도까지 진행하였다.

로드킬이 어디에서, 몇 년도에 많이 일어나고 어느 정도 심각한지 경각심을 보여줄 수 있는 차트이다. 배운 내용을 토대로 예쁘게 차트를 그렸고 이를 프레젠테이션에 적극 활용할 예정이다. 앞으로 남은 이틀간은 프로젝트 준비로 바쁠 예정이고 벨로그에 작성할 내용이 적을 것 같지만 최대한 많이 기록해 보겠다. 🤗
오늘은 프로젝트 기획서로 서비스 흐름도와 시스템 흐름도, 구성도를 루시드차트를 이용하여 그려보는 작업을 하였다. 어제 초안으로 간단하게 그렸지만 오늘 구체적으로 어떤 서비스를 어떻게 할지, 어떤 모델과 프로그램을 쓸지 등을 토론하여 선정한 후 구체화된 흐름도를 그렸다.



((!!우리 팀이 보유한 아이디어임!!))
새로 깃허브 레포지토리에 업데이트하고 계속 회의하는 것이 생각보다 쉽지 않은 것 같다.
오늘은 1차 프로젝트 마지막 날로, 오전에는 WBS를 작성했다.

아직 세세한 작업을 어떤 식으로 분류할 지 확정짓지 않아서 우리팀은 2차, 3차에도 WBS를 매 회차마다 다르게 올릴 계획이다. 이외에도 요구사항 정의서도 마무리짓고, 예상 문제 및 해결 방안도 마무리를 지었다. 우리 팀의 깃허브 주소를 들어가면 자세하게 볼 수 있다.
👉 https://github.com/whynotsw-camp/wh07-1st-autocarZ 😊
1차 프로젝트 마무리로 프레젠테이션까지 마무리했고 시간 관계상 발표는 다음 주 월요일로 미뤄졌다. 3일간 열심히 프로젝트를 준비했지만 아직 미흡하다는 것을 느꼈고 아직 1차이기에 완벽함보다는 잘 마무리하고 해냈다는 것에 의미를 두고 싶다. 2차부터는 본격적으로 코딩 들어가기 시작할 것이고 우리 팀은 아두이노와 라즈베리파이로 자율주행버스를 대체해 실습할 예정이다. 잘 되었으면 좋겠고 우리 팀은 물론이고 7기 기수 모두가 다 수고했다 🤗
👏👏