소연의_개발일지
article thumbnail

오늘날 여전히 사용되는 가장 오래된 개발 언어는 1957년에 개발된 포트란이다.

이후로 그 외 많은 개발 언어가 발전 해왔다. 그런데 가장 인기있는 개발 언어는 무었일까?

이 질문에 대한 답은 스택오버플로우(Stack Overflow)에서 찾을 수 있다. 스택 오버플로우의 각 게시물은 태그가 함께 제시된다. 그리고 개발 언어 이름이 태그될 수 있다.

 

공부 소스 출처: 유데미 안젤라 Python 강의 

 

개발환경
  • 운영체제: Window OS, Window 10
  • 개발언어: Python 3.11
  • 개발 툴: Google Colab
  • 추가 패키지: Matplotlib, pandas

사용 자료

QueryResults.csv
0.07MB

 

 

 

데이터 분석

데이터 임포트

import pandas as pd

자료 가져오기

헤더 행을 0으로 설정하면 열 자체의 이름으로 대체할 수 있다.

df = pd.read_csv('QueryResults.csv', names=['DATE', 'TAG', 'POSTS'], header=0)

자료 확인

 

데이터 상위 5개

df.head(5)

데이터 하위 5개

df.tail(5)

데이터 크기 확인하기 

df.shape

(1991, 3)

→ 1991개의 행과 3개의 열이 있다는 것을 확인할 수 있다.

 

 

데이터 수

count()는 실제로 각 열에 있는 NaN이 아닌 값의 개수를 알려준다.

df.count()
DATE     1991
TAG      1991
POSTS    1991
dtype: int64

 

언어별 태그된 데이터 수

TAG는 개발 언어의 이름이다.

개발 언어별 항목 수와 게시물 수를 보려면 .groupby() 메소드를 사용해야 한다. 

게시물 수를 .sum()하면 스택 오버플로우가 생긴 이후 각 개발 언어에 몇 개의 게시물이 있었는지 알 수 있다.

df.groupby('TAG').sum()

각 열의 항목을 .count()하면 개발 언어당 항목이 몇 개월 존재했는지 알 수 있다.

df.groupby('TAG').count()

 

데이터 전처리: 타임스탬프 추가하기

DATE열 데이터 확인

df['DATE'][1]

2008-08-01 00:00:00

df.DATE[1]

2008-08-01 00:00:00

동일한 결과가 나온다.

 

to_datetime() 메소드를 사용하여 문자열을 타임스탬프로 변환해 보자.

판다스에서 to_datetime()을 사용하여 전체 df['DATE'] 열을 변환한다.

# 전체 컬럼을 데이터타입으로 변경
df.DATE = pd.to_datetime(df.DATE)
df.head()

 

데이터프레임 피벗하기: pivot() 메서드

reshaped_df = df.pivot(index='DATE', columns='TAG', values='POSTS')
reshaped_df

새로운 데이터프레임에 145 행과 14 열이 있다.

각 개발 언어가 열이 되었고, 날짜 열이 새로운 인덱스(예를 들어 레이블 행)가 되었다.

각 열의 항목 수를 계산할 때 모든 언어가 같지 않다는 것을 알 수 있다.

이유는 .count() 메소드가 NaN 값을 제외하기 때문이다. 데이터프레임을 피벗할 때, 그 달에 해당 언어에 대한 게시물이 없다면 NaN 값이 삽입된다.

 

변환한 데이터 수 확인

reshaped_df.shape

(145, 14)

 

컬럼 확인

reshaped_df.columns
Index(['assembly', 'c', 'c#', 'c++', 'delphi', 'go', 'java', 'javascript',
       'perl', 'php', 'python', 'r', 'ruby', 'swift'],
      dtype='object', name='TAG')

 

데이터 수 확인

reshaped_df.count()

 

빈 값 채우기

데이터 프레임에 있는 NaN값을 숫자 0으로 바꿔준다.

.fillna() 메소드를 사용하여 이 작업을 수행한다.

# 빈값 채우기
reshaped_df.fillna(0, inplace=True)

inplace 인자가 의미하는 것은 reshaped_df에 변경이 있다는 것입니다. 이 인자가 없으면 다음과 같이 작성해야 한다.

reshaped_df = reshaped_df.fillna(0)

 

빈값 있는지 확인

reshaped_df.isna().values.any()

False

→ 빈값이 있으면 True가 출력된다.

 

Matplotlib로 데이터 시각화

matplotlib import하기

import matplotlib.pyplot as plt

 

자바 언어의 인기도 표시

  • .figure() - 차트 사이즈 조정(차트 가로/세로길이)
  • .xticks() - x축 구성(글씨체 변경 가능)
  • .yticks() - y축 구성
  • .xlabel() - x축에 텍스트 추가
  • .ylabel() - y축에 텍스트 추가
  • .ylim() - 상한 및 하한 설정
plt.figure(figsize=(16, 10))
plt.xlabel('Date', fontsize=14)
plt.ylabel('Number of Posts', fontsize=14)
plt.ylim(0, 35000)
plt.plot(reshaped_df.index, reshaped_df.java)
# plt.plot(reshaped_Df.index, reshaped_df['java'])

 

자바와 파이썬 그래프 표시

plt.figure(figsize=(16, 10))
plt.xlabel('Date', fontsize=14)
plt.ylabel('Number of Posts', fontsize=14)
plt.ylim(0, 35000)
plt.plot(reshaped_df.index, reshaped_df.java)
plt.plot(reshaped_df.index, reshaped_df.python)

 

 

for루프를 사용하여 모든 개발 언어 표시하기

plt.figure(figsize=(16, 10))
plt.xlabel('Date', fontsize=14)
plt.ylabel('Number of Posts', fontsize=14)
plt.ylim(0, 35000)
for column in reshaped_df.columns:
    plt.plot(reshaped_df.index, reshaped_df[column])

 

범례 표시하여 다시 그래프 그리기

  • linewidth: 선그래프 굵기
plt.figure(figsize=(16, 10))
plt.xlabel('Date', fontsize=14)
plt.ylabel('Number of Posts', fontsize=14)
plt.ylim(0, 35000)
for column in reshaped_df.columns:
    plt.plot(reshaped_df.index, reshaped_df[column],
             linewidth=3, label=reshaped_df[column].name)
plt.legend(fontsize=16)

스택 오버플로우에 있는 게시물 수로 보면 파이썬이 가장 인기 있는 개발 언어처럼 보인다.

 

시계열 데이터 다듬기

차트를 보면 시계열 데이터가 꽤 심하게 오르락 내리락하는 것을 알 수 있다.

이렇게 되면 어떤 흐름인지 알기 힘들 수 있다.

추세를 명확하게 보여주는 유용한 기술은 평균을 취하여 관측치를 평균화하는 것이다. 6개 또는 12개의 관측값을 평균화하여 이동평균이라고 하는 것을 구성할 수 있다. 기본적으로 시간 단위로 평균을 계산하고 한번에 한 관측값씩 앞으로 이동한다.

이것은 매우 일반적인 기술이기 때문에 실제로 판다스는 실제로 편리한 이 두가지 rolling()와 mean() 메소드를 내장하고 있다. 이 두 가지 메소드를 연결하여 평균 관측값으로 구성된 데이터프레임을 만들 수 있다.

 

roll_df = reshaped_df.rolling(window=6).mean()
 
plt.figure(figsize=(16,10))
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
plt.xlabel('Date', fontsize=14)
plt.ylabel('Number of Posts', fontsize=14)
plt.ylim(0, 35000)
 
# plot the roll_df instead
for column in roll_df.columns:
    plt.plot(roll_df.index, roll_df[column], 
             linewidth=3, label=roll_df[column].name)

변경된 차트의 형태

 

여기서 window의 값을 변경하면 그래프의 모양이 달라진다.

windowr 3일때 / window 12일 때

 

profile

소연의_개발일지

@ssoyxon

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!