1. 程式人生 > 其它 >用R語言對城管事件資料分析

用R語言對城管事件資料分析

作者:夏爾康

https://ask.hellobi.com/blog/xiaerkang/3975

這次使用主成分分析主要目的並不是降維,而是分析城管資料中的事件類別之間是否存在關係,當然,城管事件型別有好幾百,這裡就只選取從去年九月到目前發生量前十的事件類別;如下圖,排名前十的事件類別依次為,車輛亂停放,亂堆物料堆,非法張貼小廣告,店鋪出店經營,自備容器外放,違規標語宣傳品,機動車亂停放,暴露垃圾,地面不潔,道路不潔。

確定好這十個類別後就是資料的提取了,這時候我們要注意一下資料結構,和資料樣本量,為什麼呢?因為在主成分分析的時候事件類別只能是屬性,也就是說事件類別是一列;這時候看看一下城管資料裡面存在的資料結構,資料記錄數必須是屬性的6~10倍,這時候觀察城管資料結構,明顯不是我們想要的。

於是寫個SQL轉換一下資料結構,起的別名沒有按照規則來,這是個失誤;

這時候就要使用R語言去做分析了,首先是讓我們能從資料庫裡拿資料,所以建立一個數據庫連結,安裝包RODBC

R語言程式碼

install.packages("RODBC")
library(RODBC)
jixiao_connect <- odbcConnect("jixiao",uid="jixiao",pwd = "*****",believeNRows=FALSE)

這時候我們就建立了一個數據庫連線jixiao_connect,這時候我們就要提取資料

R語言程式碼

jixiao_data <- sqlQuery(jixiao_connect,"
select 
                        sum(case when t.kind_code_thd='車輛亂停放' then 1 else 0 end) kind_one
                        ,sum(case when t.kind_code_thd='亂堆物堆料' then 1 else 0 end) kind_two
                        ,sum(case when t.kind_code_thd='非法張貼小廣告' then 1 else 0 end) kind_three
                        ,sum(case when t.kind_code_thd='店鋪出店經營' then 1 else 0 end) kind_code_4
                        ,sum(case when t.kind_code_thd='自備容器外放' then 1 else 0 end) kind_code_5
                        ,sum(case when t.kind_code_thd='違規標語宣傳品' then 1 else 0 end) kind_code_6
                        ,sum(case when t.kind_code_thd='機動車亂停放' then 1 else 0 end) kind_code_7
                        ,sum(case when t.kind_code_thd='地面不潔' then 1 else 0 end) kind_code_8
                        ,sum(case when t.kind_code_thd='暴露垃圾' then 1 else 0 end) kind_code_9
                        ,sum(case when t.kind_code_thd='無照經營遊商' then 1 else 0 end) kind_code_10  
                        from test_erkang t
                        where t.district_name in ('美蘭區','龍華區','秀英區','瓊山區')
                        GROUP BY T.DISTRICT_NAME,TO_CHAR(T.REVIEW_FIRST_DATE,'YYYYMM')")
jixiao_data

驗證資料是否被提取,說明資料已經提取成功

我們在安裝主成分需要用的包

R程式碼

install.packages("psych")
library(psych)

首先我們要做的是需要確定主成分需要幾個,這時候我們就需要cattell碎石檢驗來確定主成分個數,也就是保留特徵值大於1的主成分,因為特徵值大於1的主成分能解釋較多的方差;

R程式碼

fa.parallel(jixiao_date,fa='pc',n.iter = 100,show.legend=FALSE)

上圖中我們應該選取3個主成分

R程式碼

pc <- principal(jixiao_date,nfactors=3,rotate = 'varimax')
pc

後面那個是我們選擇的主成分旋轉的方法,為了主成分之間能更容易的解釋,結果如下

PC1列下的係數是和各個事件類別的相關係數,h2列表示成分能夠解釋方差的多少,u2列表示沒法解釋解釋方差的比例,事件KIND_ONE也就是車輛亂停放,主要相關聯的是主成分PC1,相關係數為0.97,PC2和PC3的相關係數分別為0.05,0.07,主成分能夠解釋車輛亂停放95%的方差,無法被解釋的比例為0.055;proportion var 表示解釋整個資料集的解釋程度,PC2解釋變數30%方差,PC1解釋變數26%方差,PC3解釋變數21%方差,主成分能夠解釋整個變數77%的方差;

對主成分進行視覺化

R程式碼

fa.diagram(pc)

又上圖我們可以知道主成分組成,大致歸類為

PC1:無照經營遊商,暴露垃圾,車輛亂停放

PC2:亂堆物堆料,非法張貼小廣告,自備容器外放,機動車亂停放,地面不潔

PC3:店鋪出店經營,違規標語宣傳品;

根據業務和個人的推測

我推測PC1所表示的繁華的步行街道成分,PC2表示的是城中村成分,PC3表示的是主幹道成分。

建議和小結

1、可以認為亂堆物堆料,非法張貼小廣告,自備容器外放,機動車亂停放和地面不潔是一類相關聯事件類別,無照經營遊商,暴露垃圾和車輛亂停放是一類相關聯事件類別,店鋪出店經營,違規標語宣傳品可以認為是一類相關聯的一類事件型別

2、可以認定主要事件來源是來自城中村,主幹道,和步行街道;

3、步行街道給的相應的措施可以增加相應的非機動的停車位,劃分小販經營點,增加環衛人員的清掃頻率

4、城中村:提高相應的停車規劃,集中整治城中村環境衛生

5:、主幹道:相應的增加巡查員的巡查頻率即可