파이썬으로 히스토그램 그리기

hans mj
5 min readMar 20, 2018

--

데이터 분석을 하기 위해서는 먼저 데이터의 패턴을 찾아야 한다. 그중에 가장 기본적인 작업은 히스토그램을 그려 보는것이다.

히스토그램을 그리기 위해서는 도수분포표를 만들고 계급구간을 정하는 등의 작업을 해야 하지만… 파이썬의 Pandas를 이용하면 쉽게(?) 그려볼수 있다.

엑셀을 이용해서 해보는것은 매우 의미있고, 중요한 일이다. 그리고 엑셀로 하는게 더 쉽다…

우선 데이터가 필요해서 캐글 사이트에서 chicago Crimes 다운로드 받았다. 그리고 데이터 분석도구인 Pandas를 설치했다.

pip install pandas

pandas는 dataframe이라는 데이터 구조체를 제공한다. 굉장히 기능이 많고 복잡하지만 이번 글에서는 필요한 기능만 찾아서 사용한다.(히스토그램을 그리는게 목적)

일단 시카고의 범죄 정보를 dataframe으로 만든다.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("{your-path}chicago_crime/Chicago_Crimes_2001_to_2004.csv")
df["Date"] = pd.to_datetime(df["Date"], format="%m/%d/%Y %I:%M:%S %p") # errors='ignore'
df["Day"] = df["Date"].dt.date
df["Year"] = df["Date"].dt.year
df["Month"] = df["Date"].dt.month

그리고 어떤 히스토그램을 만들지 생각한다. 위의 경우는 날짜별로 범죄 발생빈도를 보기 위해서 Day정보를 Date항목(문자열 형태)을 이용해서 만들었다.

csv에서 dataframe을 만들때 콤마가 안맞아서 에러가 난다. 그 행을 잘 찾아서 수정해주어야 한다.

dataframe을 만들어서 sample함수를 호출해 보면 필요하지 않는 컬럼도 많이 보인다. 현재 나한테 필요한 컬럼만 추출하여 dataframe을 다시 만든다.

newDf = df.filter(['Year', 'Month','Day','Primary Type'], axis=1)
newDf["Primary Type"].unique()

newDf 라는 연,월,일 범죄타입만 있는 새로운 dataframe을 만들었고, unique함수로 어떤 종류의 범죄목록이 있는지 확인해본다. 나는 그중에 THEFT 목록만 선택해서 다시 dataframe을 만들었다.

theft_df = df[df["Primary Type"] == "THEFT"]

pandas의 groupby와 agg함수를 이용해서 연도-일별 count를 구하면 히스토그램을 그리기 위한 Raw데이터가 완성된다.

histDF = theft_df.groupby(["Year", "Day"], as_index=False).agg("count").filter(["Year", "Primary Type"])

이렇게 그려진 DataFrame으로 연도별 히스토그램을 그린다.

n_bins = 50
fig, axs = plt.subplots(2, 2, figsize=(15, 15))

histData = histDF[histDF["Year"] == 2001].filter(["Primary Type"])
axs[0,0].hist(histData.values, bins=n_bins, color="green")
axs[0,0].set_title("2001")

histData = histDF[histDF["Year"] == 2002].filter(["Primary Type"])
axs[0,1].hist(histData.values, bins=n_bins, color="green")
axs[0,1].set_title("2002")

histData = histDF[histDF["Year"] == 2003].filter(["Primary Type"])
axs[1,0].hist(histData.values, bins=n_bins, color="green")
axs[1,0].set_title("2003")

histData = histDF[histDF["Year"] == 2004].filter(["Primary Type"])
axs[1,1].hist(histData.values, bins=n_bins, color="green")
axs[1,1].set_title("2004")


fig.suptitle('Theft', fontsize=20, color="red")
for ax in axs.flat:
ax.set_xlim([100, 500])
ax.label_outer()

x 축이 범위를 일정하게 맞추기 위해서 set_xlim 함수를 사용했다. 범위를 맞춰야 각 연도별 데이터를 비교해볼수 있다.

위의 그림과 같이 히스토그램이 나온다. 2003년과 2004년데이터와 나머지 데이터의 형태가 다른것을 볼수 있다. 왜 그럴까? 이 궁금증을 해결하기 위해서 전체 범죄에 대한 히스토그램을 그려본다

히스토그램을 보면 전체 범죄수는 증가했지만 Theft의 수는 줄어들었다. (왜지???)

--

--